diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 19f864f13d0..00000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,25 +0,0 @@ -**Arma 3 Version:** `x.xx` (stable / rc / dev) -**CBA Version:** `3.x.x` (stable / dev + commit hash) -**ACE3 Version:** `3.x.x` (stable / dev + commit hash) - -**Mods:** -``` -- CBA_A3 -- ace -``` - -**Description:** -- Add a detailed description of the error. This makes it easier for us to fix the issue. - -**Steps to reproduce:** -- Add the steps needed to reproduce the issue. - -**Where did the issue occur?** -- Dedicated / Self-Hosted Multiplayer / Singleplayer / Editor (Singleplayer) / Editor (Multiplayer) / Virtual Arsenal - -**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). -- If possible at the time the bug is encountered, go to Options and select "ACE Debug To Clipboard", this will print extensive debug information to the RPT file and copy it to clipboard. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..0ed30391a54 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: kind/bug +assignees: '' + +--- + +**Mods (complete and add to the following information):** +- **Arma 3:** `x.xx` [e.g. 1.00 stable, rc, dev] +- **CBA:** `3.x.x` [e.g. 3.0.0 stable, commit hash] +- **ACE3:** `3.x.x` [eg. 3.0.0 stable, commit hash] +_Make sure to reproduce the issue with only CBA and ACE3 on a newly created mission!_ + +**Description:** +A clear and concise description of what the bug is. + +**Steps to reproduce:** +- _Follow [https://ace3mod.com/img/wiki/user/issue_flowchart.png](this flowchart)!_ +- Go to ... +- Click ... +- See ... + +**Expected behavior:** +A clear and concise description of what you expected to happen. + +**Where did the issue occur?** +- Dedicated / Self-Hosted Multiplayer / Singleplayer / Editor (Singleplayer) / Editor (Multiplayer) / Virtual Arsenal + +**Log Files:** +- Link to ([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). + +**Additional context:** +Add any other context about the problem here. + +**Screenshots:** +If applicable, add screenshots to help explain your problem. diff --git a/.github/ISSUE_TEMPLATE/enhancement-request.md b/.github/ISSUE_TEMPLATE/enhancement-request.md new file mode 100644 index 00000000000..e4f5abcb54f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement-request.md @@ -0,0 +1,20 @@ +--- +name: Enhancement request +about: Suggest an improvement for this project +title: '' +labels: kind/enhancement +assignees: '' + +--- + +**Is your enhancement related to a problem?** +A clear and concise description of what the enhancement entails. Ex. [...] would improve user experience. + +**Solution you'd like:** +A clear and concise description of what you want to happen. + +**Alternatives you've considered:** +A clear and concise description of any alternative solutions or ideas you've considered. + +**Additional context:** +Add any other context or screenshots about the enhancement here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..45e10cf0cb0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,12 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: kind/feature request, status/invalid +assignees: '' + +--- + +### Do not post feature requests here! + +Learn how to make a feature request [here](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html). diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 69565c700ea..ea83a609e38 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,3 +3,4 @@ - Each change in a separate line - Include documentation if applicable - Respect the [Development Guidelines](https://ace3mod.com/wiki/development/) +- Follow title standard `Component - Add|Fix|Improve|Change|Make|Remove bananas` diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000000..dbcdbfec52b --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,42 @@ +branches: + - master + - release-drafter # for testing edits to this configuration + +name-template: 'Version $NEXT_PATCH_VERSION' +tag-template: 'v$NEXT_PATCH_VERSION' + +categories: + - title: '**ADDED:**' + labels: + - 'kind/feature request' + - 'kind/added feature' + - title: '**FIXED:**' + labels: + - 'kind/bug fix' + - title: '**IMPROVED:**' + labels: + - 'kind/enhancement' + - 'kind/optimization' + - title: '**CHANGED:**' + labels: + - 'kind/cleanup' + - 'area/compatibility' + - title: '**TRANSLATIONS:**' + labels: + - 'area/translations' + +exclude-labels: + - 'ignore changelog' + +change-template: '- $TITLE (#$NUMBER)' +template: | + _Requires CBA version X.Y.Z or later and Arma 3 version X.Y or later._ + + ## Change Log Summary + + $CHANGES + +replacers: + # Category titles + - search: '/\#\# (\*\*(ADDED|FIXED|IMPROVED|CHANGED|TRANSLATIONS):\*\*)/g' + replace: '$1' diff --git a/.github/stale.yml b/.github/stale.yml index a129b592ada..c9e0bf2f9ef 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -14,6 +14,7 @@ exemptLabels: - status/cherrypick - status/merge on release - sticky + - help wanted # Label to use when marking an issue as stale staleLabel: status/stale diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml new file mode 100644 index 00000000000..bc294377f36 --- /dev/null +++ b/.github/workflows/arma.yml @@ -0,0 +1,48 @@ +name: Arma + +on: + push: + branches: + - master + pull_request: + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Validate SQF + run: python3 tools/sqf_validator.py + - name: Validate Config + run: python3 tools/config_style_checker.py + - name: Validate Stringtables + run: python3 tools/stringtable_validator.py + - name: Check Strings + run: python3 tools/check_strings.py + - name: Check for BOM + uses: arma-actions/bom-check@master + + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Lint (sqflint) + uses: arma-actions/sqflint@master + continue-on-error: true # No failure due to many false-positives + + build: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Build using HEMTT + uses: arma-actions/hemtt@master + with: + command: build --release --ci + - name: Upload Artifact + uses: actions/upload-artifact@v2-preview + with: + name: ace3-${{ github.sha }}-nobin + path: releases/ace3_*.zip diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 00000000000..b0263abf8c7 --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,24 @@ +name: Documentation + +on: + push: + branches: + - master + +jobs: + update: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Install Python packages + run: | + pip3 install wheel + pip3 install setuptools + pip3 install pygithub + pip3 install pygithub3 + - name: Deploy + if: github.repository == 'acemod/ACE3' && ! contains(github.event.head_commit.message, '[ci skip]') + env: + GH_TOKEN: ${{ secrets.DOCS_TOKEN }} + run: python3 tools/deploy.py diff --git a/.github/workflows/extensions.yml b/.github/workflows/extensions.yml new file mode 100644 index 00000000000..65f0a29eb94 --- /dev/null +++ b/.github/workflows/extensions.yml @@ -0,0 +1,31 @@ +name: Extensions + +on: + pull_request: + paths: + - 'extensions/*' + - 'extensions/*/*' + - 'extensions/*/*/*' + - 'extensions/*/*/*/*' + - 'extensions/*/*/*/*/*' + +jobs: + build: + runs-on: ${{ matrix. os }} + strategy: + matrix: + os: [windows-latest] + + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Build + shell: cmd + run: | + cd extensions/build + cmake .. && cmake --build . + - name: Upload Artifact + uses: actions/upload-artifact@master + with: + name: ace3_extensions-${{ matrix.os }}-debug + path: extensions/build diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 00000000000..fa0dbe292a9 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,16 @@ +name: Release Drafter + +on: + push: + branches: + - master + +jobs: + draft: + runs-on: ubuntu-latest + steps: + - name: Release Drafter + if: github.repository == 'acemod/ACE3' + uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github_changelog_generator b/.github_changelog_generator deleted file mode 100644 index 6d1d741bbd0..00000000000 --- a/.github_changelog_generator +++ /dev/null @@ -1,20 +0,0 @@ -# No issues and PRs without labels -issues=false -pr-wo-labels=false - -# Issues are disabled, don't fetch them -max-issues=0 - -# Label filters -exclude-labels=by design,can't reproduce,duplicate,question,invalid,wontfix,ignore changelog - -# Tag is created before generating changelog for release candidates -unreleased=false - -# No section labels, we only want a list of merged PRs (label separation only works for Issues) -simple-list=true - -# Misc -author=false -compare-link=false -header-label=## Change Log Summary diff --git a/.gitignore b/.gitignore index 6a37c85d53d..a8f6a13221f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ @* *.zip release/* +releases/* +hemtt +hemtt.exe tools/temp -tools/armake.exe *.cache *.pbo texHeaders.bin diff --git a/AUTHORS.txt b/AUTHORS.txt index 2cb4488680b..418140dda30 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -6,6 +6,7 @@ # request, preferably including an email address. # CORE TEAM +Brandon (TCVM) bux578 commy2 esteldunedain @@ -17,6 +18,7 @@ Janus jokoho482 Jonpas Kieran +mharis001 NouberNou PabstMirror Ruthberg @@ -40,11 +42,13 @@ Aleksey EpMAK Yermakov Alganthe Andrea "AtixNeon" Verano Anthariel +Arcanum417 Anton Arkhir Asgar Serran BaerMitUmlaut Bamse +Barman75 Bla1337 BlackPixxel BlackQwar @@ -58,6 +62,8 @@ Clon1998 Codingboy Coren Crusty +C0kkie +dgibso29 Dharma Bellamkonda Dimaslg diwako @@ -72,11 +78,13 @@ eRazeri evromalarkey F3 Project Falke75 +Fatal Ferenczi Ferenzi FFAAMOD Filip Basara fr89k +Fragment FreeZbe geraldbolso1899 Ghost @@ -97,6 +105,7 @@ Karneck Kavinsky Keithen Kllrt +KokaKolaA3 legman Legolasindar "Viper" licht-im-Norden87 @@ -106,7 +115,6 @@ Luigi "Luigium" Myrini Macusercom MarcBook meat -mharis001 Michail Nikolaev MikeMatrix nic547 @@ -115,10 +123,13 @@ nomisum OnkelDisMaster Orbis2358 oscarmolinadev +Panisher (Tushino Serious Games) PaxJaromeMalues +PiZZADOX <509thParachuteInfantry@gmail.com> Phyma pokertour Professor +Pterolatypus QuickDagger rakowozz ramius86 @@ -126,8 +137,12 @@ Raspu86 Riccardo Petricca Robert Boklahánics ruPaladin +Rutger "RedBery" Meijering +Schwaggot +shukari simon84 Skengman2 +Smith Sniperwolf572 System98 SzwedzikPL @@ -139,8 +154,11 @@ Tonic Tourorist Tuupertunut Valentin Torikian +veteran29 voiper VyMajoris(W-Cephei) Winter xrufix +Zakant zGuba +Fyuran diff --git a/Makefile b/Makefile deleted file mode 100644 index 736994ecb4c..00000000000 --- a/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -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 .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 diff --git a/README.md b/README.md index 2fcce1d1fd9..d542a2fd8f9 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues @@ -19,7 +19,7 @@ ACE3 License - ACE3 Slack + ACE3 Slack ACE3 Build Status diff --git a/VERSION b/VERSION deleted file mode 100644 index 69499073cf2..00000000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -3.12.5.40 diff --git a/ace_artillerytables.dll b/ace_artillerytables.dll new file mode 100644 index 00000000000..2f5855c81a3 Binary files /dev/null and b/ace_artillerytables.dll differ diff --git a/ace_artillerytables_x64.dll b/ace_artillerytables_x64.dll new file mode 100644 index 00000000000..97a061c2570 Binary files /dev/null and b/ace_artillerytables_x64.dll differ diff --git a/ace_medical.dll b/ace_medical.dll deleted file mode 100644 index f85f1bc974b..00000000000 Binary files a/ace_medical.dll and /dev/null differ diff --git a/ace_medical_x64.dll b/ace_medical_x64.dll deleted file mode 100644 index a903cddfe94..00000000000 Binary files a/ace_medical_x64.dll and /dev/null differ diff --git a/addons/advanced_ballistics/CfgEventHandlers.hpp b/addons/advanced_ballistics/CfgEventHandlers.hpp index 5da5fd0dc24..becf3950523 100644 --- a/addons/advanced_ballistics/CfgEventHandlers.hpp +++ b/addons/advanced_ballistics/CfgEventHandlers.hpp @@ -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)); }; }; diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index 1e0e6860da9..bef679cd15d 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -22,6 +22,9 @@ if (!hasInterface) exitWith {}; ["ace_firedPlayer", DFUNC(handleFired)] call CBA_fnc_addEventHandler; ["ace_firedPlayerNonLocal", DFUNC(handleFired)] call CBA_fnc_addEventHandler; + // Register Perframe Handler + [FUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler; + //Add warnings for missing compat PBOs (only if AB is on) { _x params ["_modPBO", "_compatPBO"]; diff --git a/addons/advanced_ballistics/config.cpp b/addons/advanced_ballistics/config.cpp index 488b812fc63..17647d0647d 100644 --- a/addons/advanced_ballistics/config.cpp +++ b/addons/advanced_ballistics/config.cpp @@ -20,5 +20,8 @@ class CfgPatches { #include "ACE_Settings.hpp" class ACE_Extensions { - extensions[] += {"ace_advanced_ballistics"}; + class ace_advanced_ballistics { + windows = 1; + client = 1; + }; }; diff --git a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf index 791fdb5040f..2ead82fa123 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf @@ -12,7 +12,7 @@ * muzzle velocity shift - m/s * * Example: - * [[], 5] call ace_advanced_ballistics_fnc_calcilateAmmoTemperatureVelocityShift + * [[], 5] call ace_advanced_ballistics_fnc_calculateAmmoTemperatureVelocityShift * * Public: No */ diff --git a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf index 0c18ae539e9..12199db1546 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf @@ -15,12 +15,11 @@ * Public: No */ +private _deleted = false; { _x params ["_bullet","_caliber","_bulletTraceVisible","_index"]; - if (!alive _bullet) then { - GVAR(allBullets) deleteAt (GVAR(allBullets) find _x); - } else { + if (alive _bullet) then { private _bulletVelocity = velocity _bullet; private _bulletPosition = getPosASL _bullet; @@ -29,11 +28,12 @@ }; _bullet setVelocity (_bulletVelocity vectorAdd (parseSimpleArray ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6", _index, _bulletVelocity, _bulletPosition, wind, ASLToATL(_bulletPosition) select 2, CBA_missionTime toFixed 6]))); + } else { + GVAR(allBullets) set [_forEachIndex, objNull]; + _deleted = true; }; - nil -} count +GVAR(allBullets); +} forEach GVAR(allBullets); -if (GVAR(allBullets) isEqualTo []) then { - [_this select 1] call CBA_fnc_removePerFrameHandler; - GVAR(BulletPFH) = nil; +if (_deleted) then { + GVAR(allBullets) = GVAR(allBullets) - [objNull]; }; diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index b1f9898b6db..ec1d37c42a5 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -27,7 +27,7 @@ private _abort = !local _unit; if (_abort) then { private _bulletVelocity = velocity _projectile; private _muzzleVelocity = vectorMagnitude _bulletVelocity; - + private _maxRange = uiNamespace getVariable format[QGVAR(maxRange_%1), _ammo]; if (isNil "_maxRange") then { private _airFriction = getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction"); @@ -40,12 +40,12 @@ if (_abort) then { uiNamespace setVariable [format[QGVAR(maxRange_%1), _ammo], _maxRange]; }; if (ACE_player distance _unit > _maxRange && {ACE_player distance ((getPosASL _unit) vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply _maxRange)) > _maxRange}) exitWith {}; - + private _ammoCount = (_unit ammo _muzzle) + 1; private _tracersEvery = getNumber(configFile >> "CfgMagazines" >> _magazine >> "tracersEvery"); private _lastRoundsTracer = getNumber(configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer"); if (_ammoCount <= _lastRoundsTracer || {_tracersEvery > 0 && {(_ammoCount - _lastRoundsTracer) % _tracersEvery == 0}}) exitWith { _abort = false }; - + if (GVAR(bulletTraceEnabled) && {_muzzleVelocity > BULLET_TRACE_MIN_VELOCITY} && {cameraView == "GUNNER"}) then { if (currentWeapon ACE_player == binocular ACE_player) exitWith { _abort = false }; if (currentWeapon ACE_player == primaryWeapon ACE_player && {count primaryWeaponItems ACE_player > 2}) then { @@ -89,7 +89,7 @@ if (GVAR(muzzleVelocityVariationEnabled)) then { private _seed = 0.5 * (_time + _ammoCount) * (_time + _ammoCount + 1) + _ammoCount; // Generate normally distributed random number (via Box–Muller transform) private _z = sqrt(-2.0 * ln(0.00000001 max (-_seed random 1))) * cos(_seed random 360); - + _muzzleVelocity = _muzzleVelocity * (_z * _muzzleVelocityVariationSD + 1); }; @@ -123,7 +123,3 @@ GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; "ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _ammoCount, _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _transonicStabilityCoef, getPosASL _projectile, _bulletVelocity, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), EGVAR(weather,currentOvercast), CBA_missionTime toFixed 6]; GVAR(allBullets) pushBack [_projectile, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]; - -if (isNil QGVAR(BulletPFH)) then { - GVAR(BulletPFH) = [FUNC(handleFirePFH), GVAR(simulationInterval), []] call CBA_fnc_addPerFrameHandler; -}; diff --git a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf index 5c634cadff4..8ff80527452 100644 --- a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf +++ b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ruthberg - * Initializes the advanced ballistics dll extension with terrain data + * Initializes the advanced ballistics extension with terrain data * * Arguments: * None diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 09d992a7694..b9a53f3dc77 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -6,7 +6,7 @@ Pokaż inf. o wietrze Mostra indicazioni del vento Показать информацию о ветре - Afficher les info sur le vent + Afficher les infos sur le vent Mostrar información del viento Windinformationen anzeigen Széladatok mutatása @@ -16,10 +16,11 @@ 바람의 정보를 표시 顯示風況 显示风况 + Rüzgar bilgilerini göster Show Protractor - Pokaż kątomierz + Pokaż protraktor Mostra il rapportatore Показать транспортир Afficher le rapporteur @@ -32,6 +33,7 @@ 각도기 표시 顯示量角器 显示量角器 + Açı Ölçeri Göster Advanced Ballistics @@ -48,6 +50,7 @@ 고급 탄도학 先進彈道系統 先进弹道系统 + Gelişmiş Balistik Advanced Ballistics @@ -60,10 +63,11 @@ Fejlett ballisztika Продвинутая баллистика Balistica Avanzata - アドバンスド バリスティックス + アドバンスド バリスティックスを有効化 고급 탄도학 先進彈道系統 先进弹道系统 + Gelişmiş Balistik Enables advanced ballistics @@ -71,8 +75,8 @@ Activa la balística avanzada Aktiviert die erweiterte Ballistik Aktivuje pokročilou balistiku - Ativa balística avançada - Activer la balistique avancée + Ativa a balística avançada + Active la balistique avancée. Engedélyezi a fejlett ballisztikát Включает продвинутую баллистику Abilita Balistica Avanzata @@ -80,28 +84,38 @@ 고급 탄도학을 적용합니다 啟用先進彈道系統 启用先进弹道系统 + Gelişmiş balistiği etkinleştir Enable Muzzle Velocity Variation + Activar variación de velocidad inicial Variation der Mündungsgeschwindigkeit aktivieren - 銃口初速の変動を有効化する + 銃口初速の変動を有効化 Abilita Variazione Velocità Volata 총구속도 변화적용 啟用槍口初速變化 启用枪口初速变化 - Activer les variations de la vitesse initiale + Activer la variation de vitesse initiale Aktywuj wariację prędkości wylotowej + Вкл. вариацию начальной скорости + Ativar Variação de Velocidade no Freio de boca + Povoluje variantu rychlosti ústí + Namlu Hızı Değişimini Etkinleştir Simulates slight variations in muzzle velocity between each shot + Simula variaciones ligeras de velocidad entre cada disparo Simuliert leichte Variationen der Mündungsgeschwindigkeit zwischen jedem Schuss. 発射毎の銃口初速の変動をシミュレートします。 Simula lievi variazioni della velocità della volata tra un colpo e l'altro 각 사격 사이에 총구속도 변화를 시뮬레이션 합니다. 模擬每發子彈的槍口初速都略有不同 模拟每发子弹的枪口初速都略有不同 - Simule les légères variations + Simule de légères variations de vitesse initiale entre chaque tir. Symuluje lekkie zmiany w prędkości wylotowej między każdym strzałem + Имитирует небольшие изменения начальной скорости при каждом выстреле + Simula pequenas variações na velocidade do Freio de Boca entre cada tiro + Simuluje malé odchylky v úsťové rychlosti mezi jednotlivými výstřely Enable Ammo Temperature Simulation @@ -110,14 +124,15 @@ Simulation der Munitionstemperatur aktivieren Povolit simulaci teploty munice Ativar simulação de temperatura de munição - Active la simulation de la température + Activer la simulation de la température Lőszer-hő szimuláció engedélyezése Симуляция температуры для боеприпасов Abilita simulazione della temperatura delle munizioni - 弾薬温度のシミュレーションを有効化する + 弾薬温度のシミュレーションを有効化 탄약 온도 구현 적용 啟用彈藥溫度模擬系統 启用弹药温度模拟系统 + Cephane Sıcaklık Simülasyonunu Etkinleştir Muzzle velocity varies with ammo temperature @@ -126,7 +141,7 @@ Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit Úsťová rychlost je závislá na teplotě munice A velocidade de saída varia com a temperatura da munição - La température de la munition influe sur la vélocité intiale + La vitesse initiale varie en fonction de la température des munitions. A kezdősebesség a lőszer hőmérsékletétől függően változó Начальная скорость пули зависит от температуры La velocità dello sparo varia a seconda della temperatura delle munizioni @@ -146,7 +161,7 @@ Csőhossz-szimuláció engedélyezése Симуляция длины ствола Abilita simulazione della lunghezza della canna - 銃身長のシミュレーションを有効化する + 銃身長のシミュレーションを有効化 총열 길이 구현 적용 啟用槍管長度模擬系統 启用枪管长度模拟系统 @@ -158,7 +173,7 @@ Lauflänge beeinflusst Mündungsgeschwindigkeit Úsťová rychlost je závislá na délce hlavně A velocidade de saída caria com o comprimento do cano - La longueur du canon influe sur la vélocité initale + La vitesse initiale varie en fonction de la longueur du canon. A kezdősebesség a cső hosszától függően változó Начальная скорость пули зависит от длины ствола La velocità di sparo varia a seconda della lunghezza della canna @@ -174,11 +189,11 @@ Geschossspureffekt aktivieren Povolit efekt trasírek Ativa efeito traçante de projétil - Activer l'effet balle traçante + Activer l'effet de balle traçante Nyomkövető-effekt engedélyezése Следы пуль Abilita effetto dei Proiettili Traccianti - 弾丸の軌跡エフェクトを有効化する + 弾丸の軌跡エフェクトを有効化 예광탄 효과 적용 啟用曳光彈效果 启用曳光弹效果 @@ -190,7 +205,7 @@ Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) - Active une tracante pour les munitions de gros calibre (seulement visible en utilisant des optiques avancées) + Active un effet de balle traçante pour les munitions de gros calibre (seulement visible en utilisant une optique à fort grossissement). Engedélyezi a nagy kaliberű lövedékek nyomának vizuális követését (csak nagy teljesítményű optikán keresztül látható) Включает эффект следов пуль для больших калибров (видны только через мощную оптику) Abilita effetto dei proiettili traccianti di alto calibro (visibile solo attraverso ottiche ad alto potenziale) @@ -210,7 +225,7 @@ Szimuláció intervalluma Интервал симуляции Intervallo Simulazione - シミュレーションの間隔 + シミュレーション間隔 구현 간격 模擬間隔 模拟间隔 @@ -222,11 +237,11 @@ Definiert das Intervall zwischen den einzelnen Simulationsschritten Určuje interval mezi každým výpočtem Define o intervalo entre cada cálculo - Définit un intervalle de calcul entre deux simulations + Définit l'intervalle entre chacune des étapes de calcul. Meghatározza a számítási lépések közötti időintervallumot Определяет временной интервал между вычислениями Definisce l'intervallo tra ogni step di calcolo - 各計算毎の間隔を定義します。 + 各シミュレーション毎の間隔を定義します。 각 계산 단위의 간격을 정의합니다 定義每個模擬計算之間的時間間隔 定义每个模拟计算之间的时间间隔 @@ -237,7 +252,7 @@ Radio de simulación Simulationsradius Rozsah simulace - Raio de simulação + Raio da simulação Rayon de simulation Szimuláció hatóköre Радиус симуляции @@ -246,6 +261,7 @@ 구현 범위 模擬半徑 模拟半径 + Similasyon Yarıçapı Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles @@ -254,7 +270,7 @@ Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis - Définit le rayon autour du joueur (en mètres) d'application de la balistique avancée + Définit le rayon autour du joueur (en mètres), dans lequel la balistique avancée est appliquée aux projectiles. Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékek fejlett ballisztikát használnak Определяет радиус вокруг игрока (в метрах), в котором продвинутая баллистика применяется к снарядам Definisce il raggio attorno al giocatore (in metri) per cui la Balistica Avanzata è applicata ai proiettili @@ -268,8 +284,8 @@ Dieses Modul aktiviert die Erweiterte Ballisitk. Die Flugbahn eines Geschosses wird nun von Einflüssen wie z.B Temperatur, Luftdruck, Luftfeuchtigkeit, Schwerkraft, Geschossart sowie der Waffe aus dem es gefeuert wird, beeinflusst. Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. - Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. - Ce module active la simulation de balistique avancée - les projectiles sont influencés par des variables comme le vent, la température, la pression atmosphérique, l'humidité, la gravité, le type de munition et l'arme avec laquelles ils sont tirés. + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, a gravidade, a arma no qual o disparo é realizado e o tipo de munição. + Ce module permet une simulation balistique avancée ; c'est à dire que la trajectoire des projectiles est influencée par des facteurs tels que la température de l'air, la pression atmosphérique, l'humidité, la gravité, le type de munition et l'arme depuis laquelle elle est tirée. Ez a modul engedélyezi a fejlett ballisztikai szimulációt - a lövedékek röppályáját befolyásolni fogja a levegő hőmérséklete, légnyomás, páratartalom, gravitáció, a lövedék fajtája, valamint a fegyver, amiből kilőtték a lövedéket. Этот модуль включает симуляцию продвинутой баллистики - при этом на траекторию полета снаряда влияют различные параметры, такие как температура воздуха, атмосферное давление, влажность, гравитация, тип боеприпаса и оружия, из которого произвели выстрел. Este módulo permite la simulación balística avanzada - es decir, la trayectoria de los proyectiles está influenciada por variables como la temperatura del aire, la presión atmosférica, la humedad, la gravedad, el tipo de municiones y el arma desde el que fue disparada. @@ -278,6 +294,7 @@ 이 모듈은 고급 탄도학을 적용시킵니다 - 이는 발사체의 궤적이 기온, 대기압, 습도, 중력, 탄환의 종류와 어느 무기에서 발사되는지에 따라 영향을 받습니다. 該模塊實現先進的彈道仿真 - 這意味著子彈的軌跡是由空氣溫度、大氣壓力、濕度、重力、彈藥類型以及射擊的武器所影響 该模块实现先进的弹道仿真 - 这意味着子弹的轨迹是由空气温度、大气压力、湿度、重力、弹药类型以及射击的武器所影响 + Bu modül gelişmiş balistik simülasyonunu etkinleştirir - yani mermilerin gidişatını hava sıcaklığı, atmosfer basıncı, nem, yerçekimi, mühimmat türü ve ateşlendiği silah gibi durumlar etkiler. diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index fba0de9052b..9a45c1f2803 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -1,6 +1,24 @@ #include "script_component.hpp" + if (!hasInterface) exitWith {}; +[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { + private _unit = ACE_player; + private _fatigue = _unit getVariable [QGVAR(aimFatigue), 0]; + + switch (stance _unit) do { + case ("CROUCH"): { + (1.0 + _fatigue ^ 2 * 0.1) * GVAR(swayFactor) + }; + case ("PRONE"): { + (1.0 + _fatigue ^ 2 * 2.0) * GVAR(swayFactor) + }; + default { + (1.5 + _fatigue ^ 2 * 3.0) * GVAR(swayFactor) + }; + }; +}] call EFUNC(common,arithmeticSetSource); + ["ace_settingsInitialized", { if (!GVAR(enabled)) exitWith {}; @@ -29,8 +47,8 @@ if (!hasInterface) exitWith {}; [QEGVAR(medical,pain), { // 0->1.0, 0.5->1.05, 1->1.1 linearConversion [0, 1, (_this getVariable [QEGVAR(medical,pain), 0]), 1, 1.1, true]; }] call FUNC(addDutyFactor); - [QEGVAR(medical,bloodVolume), { // 100->1.0, 90->1.1, 80->1.2 - linearConversion [100, 0, (_this getVariable [QEGVAR(medical,bloodVolume), 100]), 1, 2, true]; + [QEGVAR(medical,bloodVolume), { // 6->1.0, 5->1.167, 4->1.33 + linearConversion [6, 0, (_this getVariable [QEGVAR(medical,bloodVolume), 6]), 1, 2, true]; }] call FUNC(addDutyFactor); }; if (["ACE_Dragging"] call EFUNC(common,isModLoaded)) then { diff --git a/addons/advanced_fatigue/XEH_preInit.sqf b/addons/advanced_fatigue/XEH_preInit.sqf index 1cb60db9173..12f007ccf66 100644 --- a/addons/advanced_fatigue/XEH_preInit.sqf +++ b/addons/advanced_fatigue/XEH_preInit.sqf @@ -10,5 +10,6 @@ PREP_RECOMPILE_END; GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40); GVAR(dutyList) = [[], []]; +GVAR(setAnimExclusions) = []; ADDON = true; diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index 3733517f362..e9452c8c2cd 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -27,6 +27,7 @@ params ["_unit", "_fatigue", "_speed", "_overexhausted"]; // - Audible effects ---------------------------------------------------------- GVAR(lastBreath) = GVAR(lastBreath) + 1; if (_fatigue > 0.4 && {GVAR(lastBreath) > (_fatigue * -10 + 9)} && {!underwater _unit}) then { + if (!isGameFocused) exitWith {}; switch (true) do { case (_fatigue < 0.6): { playSound (QGVAR(breathLow) + str(floor random 6)); @@ -58,8 +59,9 @@ if (GVAR(ppeBlackoutLast) == 1) then { // - Physical effects --------------------------------------------------------- if (GVAR(isSwimming)) exitWith { - _unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true]; - + if (GVAR(setAnimExclusions) isEqualTo []) then { + _unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true]; + }; if ((isSprintAllowed _unit) && {_fatigue > 0.7}) then { [_unit, "blockSprint", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); } else { @@ -69,7 +71,10 @@ if (GVAR(isSwimming)) exitWith { }; }; if ((getAnimSpeedCoef _unit) != 1) then { - _unit setAnimSpeedCoef 1; + if (GVAR(setAnimExclusions) isEqualTo []) then { + TRACE_1("reset",getAnimSpeedCoef _unit); + _unit setAnimSpeedCoef 1; + }; }; if (_overexhausted) then { @@ -88,14 +93,7 @@ if (_overexhausted) then { }; }; -switch (stance _unit) do { - case ("CROUCH"): { - [_unit, QUOTE(ADDON), (1.0 + _fatigue ^ 2 * 0.1) * GVAR(swayFactor)] call EFUNC(common,setAimCoef); - }; - case ("PRONE"): { - [_unit, QUOTE(ADDON), (1.0 + _fatigue ^ 2 * 2.0) * GVAR(swayFactor)] call EFUNC(common,setAimCoef); - }; - default { - [_unit, QUOTE(ADDON), (1.5 + _fatigue ^ 2 * 3.0) * GVAR(swayFactor)] call EFUNC(common,setAimCoef); - }; -}; +_unit setVariable [QGVAR(aimFatigue), _fatigue]; + +private _aimCoef = [missionNamespace, "ACE_setCustomAimCoef", "max"] call EFUNC(common,arithmeticGetResult); +_unit setCustomAimCoef _aimCoef; diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index 73ba6179a99..d73a6deb0dc 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -25,10 +25,12 @@ _posAndSize set [2, _stamina * GVAR(staminaBarWidth)]; _staminaBarContainer ctrlSetPosition _posAndSize; // - Opacity ------------------------------------------------------------------ -if (_stamina >= 0.8) then { - _staminaBarContainer ctrlSetFade (0.9 + 0.1 * (_stamina - 0.8) / 0.2); -} else { - _staminaBarContainer ctrlSetFade (0.9 * _stamina / 0.8); +if (GVAR(fadeStaminaBar)) then { + if (_stamina >= 0.8) then { + _staminaBarContainer ctrlSetFade (0.9 + 0.1 * (_stamina - 0.8) / 0.2); + } else { + _staminaBarContainer ctrlSetFade (0.9 * _stamina / 0.8); + }; }; // - Color -------------------------------------------------------------------- diff --git a/addons/advanced_fatigue/initSettings.sqf b/addons/advanced_fatigue/initSettings.sqf index 4e44d751324..fa90aa9a4bb 100644 --- a/addons/advanced_fatigue/initSettings.sqf +++ b/addons/advanced_fatigue/initSettings.sqf @@ -4,8 +4,14 @@ [LSTRING(Enabled), LSTRING(Enabled_Description)], LSTRING(DisplayName), true, - true, - {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true, { + if (!_this) then { + private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; + _staminaBarContainer ctrlSetFade 1; + _staminaBarContainer ctrlCommit 0; + }; + [QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged) + }, true // Needs mission restart ] call CBA_Settings_fnc_init; @@ -24,6 +30,21 @@ } ] call CBA_Settings_fnc_init; +[ + QGVAR(fadeStaminaBar), + "CHECKBOX", + [LSTRING(FadeStaminaBar), LSTRING(FadeStaminaBar_Description)], + LSTRING(DisplayName), + true, + false, { + if (!_this && GVAR(enabled) && GVAR(enableStaminaBar)) then { + private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; + _staminaBarContainer ctrlSetFade 0; + _staminaBarContainer ctrlCommit 0; + }; + } +] call CBA_Settings_fnc_init; + [ QGVAR(performanceFactor), "SLIDER", diff --git a/addons/advanced_fatigue/stringtable.xml b/addons/advanced_fatigue/stringtable.xml index 8fb6bc7e5ec..d93490ae85c 100644 --- a/addons/advanced_fatigue/stringtable.xml +++ b/addons/advanced_fatigue/stringtable.xml @@ -3,17 +3,23 @@ ACE Advanced Fatigue + ACE Fatiga Avanzada ACE Erweiterte Ausdauer ACE 進階疲勞 ACE 进阶疲劳 ACE アドバンスド ファティーグ ACE Fatica Avanzata ACE 고급 피로도 - ACE Fatigue Avancée + ACE Fatigue avancée ACE Zaawansowane Zmęczenie + ACE Продвинутая усталость + ACE Fadiga Avançada + ACE Pokročilá únava + ACE Gelişmiş Yorgunluk Performance Factor + Factor de rendimiento Leistungsfaktor パフォーマンス因数 Współczynnik wydolności @@ -22,31 +28,44 @@ Fattore Prestazione 體力值 体力值 + Фактор производительности + Fator de Performance + Faktor výkonu + Performans Faktörü Influences the overall performance of all players with no custom factor. Higher means better. + Afecta al rendimiento general de todos los jugadores sin opciones personalizadas. Más alto significa mejor Beinflusst die Leistungsfähigkeit aller Spieler ohne eigenen Leistungsfaktor. Ein höherer Wert bedeutet bessere Leistung. 個別の因数を設定されていない、全てのプレイヤーのあらゆるパフォーマンスに影響を与えます。 値が高ければ高いほど、良い効果が得られます。 Wpływa na ogólną wydolność organizmu u wszystkich graczy bez ustawionego niestandardowego współczynnika. Więcej znaczy lepiej. 모든 성능이 임의로 설정된 값 없이 영향받습니다. 값이 클수록 더 나은 성능을 발휘합니다 - Influence les performances générales de tous les joueurs sans facteurs personalisés. Une valeur plus élevée implique de meilleures performances. + Impacte la performance globale de tous les joueurs n'ayant pas de facteur personnalisé.\nPlus la valeur est élevée, plus le joueur est performant. Influenza qualsiasi prestazione di tutti i giocatori smuniti di un fattore personalizzato. Maggiore significa migliore. 影響所有玩家的體力表現,值越高代表體力越好 影响所有玩家的体力表现,值越高代表体力越好 + Влияет на общую производительность игроков, у которых не задано персональное значение. + Influencia na performance geral de todos os jogadores sem nenhum fator personalizado. Quanto maior, melhor. + Ovlivňuje celkový výkon všech hráčů bez vlastního faktoru. Vyšší znamená lépe. Influences the overall performance of this unit. Higher means better. + Afecta al rendimiento de esta unidad. Más alto significa mejor Beinflusst die Leistungsfähigkeit dieser Einheit. Ein höherer Wert bedeutet bessere Leistung. このユニットのあらゆるパフォーマンスに影響を与えます。 値が高ければ高いほど、良い効果が得られます。 Wpływa na ogólną wydolność tej jednostki. Więcej znaczy lepiej. 모든 성능이 이 단위로 영향을 받습니다. 값이 클수록 더 나은 성능을 발휘합니다 - Influence les performances générales de cette unité. Une valeur plus élevée implique de meilleures performances. + Impacte la performance globale de cette unité.\nPlus la valeur est élevée, plus l'unité est performante. Influenza qualsiasi prestazione di questa unità. Maggiore significa migliore. 影響這個單位的體力表現,值越高代表體力越好 影响这个单位的体力表现,值越高代表体力越好 + Влияет на общую производительность юнита. + Influencia na performance geral dessa unidade. Quanto maior, melhor. + Ovlivňuje celkový výkon této jednotky. Vyšší znamená lépe. Recovery Factor + Factor de recuperación Erholungsfaktor 回復因数 Współczynnik regeneracji @@ -55,42 +74,59 @@ Fattore Recupero 回復值 回复值 + Фактор восстановления + Fator de Recuperação + Faktor zotavení + Kurtarma Faktörü Changes how fast the player recovers when resting. Higher is faster. + Modifica cómo de rápido se recupera el jugador cuando descansa. Más alto significa mejor Ändert, wie schnell ein Spieler Ausdauer regeneriert. Ein höherer Wert bedeutet eine schnellere Regeneration. プレイヤーが休憩をとる際に、どのくらいの速度でスタミナ回復するかを設定します。 値が高ければ高いほど、早くなります。 Wpływa na czas regeneracji podczas postoju. Więcej znaczy szybciej. 얼마나 빨리 회복하는지를 바꿉니다. 값이 클수록 더 나은 성능을 발휘합니다 - Change la vitesse à laquelle les joueurs récupèrent leur endurance lorsqu'ils se reposent. Une valeur plus élevée implique une récupération plus rapide. + Modifie la vitesse à laquelle le joueur récupère lorsqu'il se repose.\nPlus la valeur est élevée, plus la récupération est rapide. Determina in quanto tempo il giocatore recupera quando rilassato. Maggiore significa migliore. 決定玩家休息多久就能回復體力,值越高恢復越快 决定玩家休息多久就能回复体力,值越高恢复越快 + Изменяет скорость восстановления игрока во время отдыха. Чем выше, тем быстрее. + Altera o quão rápido um jogador recupera quando descansando. Quanto maior, mais rápido. + Mění, jak rychle se hráč zotaví, když odpočívá. Vyšší je rychlejší. Load Factor + Factor de carga Gewichtsfaktor 重量因数 Współczynnik masy ekwipunku 부담 요인 - Facteur d'encombrement + Facteur de charge Fattore Caricamento 負重量 负重量 + Фактор нагрузки + Fator de Carga + Faktor zatížení Increases or decreases how much weight influences the players performance. Zero means equipment weight has no performance influence. + Aumenta o disminuye cuanto influye el peso en el rendimiento del jugador. Cero significa que el peso no influye en el rendimiento Erhöht oder verringert, wie viel Einfluss das Ausrüstungsgewicht auf die Leistung hat. Null heißt, dass es keinen Einfluss hat. 装備重量がプレイヤーのパフォーマンスにもたらす影響を増減させます。 値をゼロに設定した場合、装備重量はパフォーマンスに影響を与えません。 Zmniejsza lub zwiększa wpływ ciężaru ekwipunku na wydolność gracza. Zero oznacza kompletny brak wpływu na wydolność. 플레이어가 무게에 따라 얼마나 영향받는지를 증가시키거나 감소시킵니다. 0의 경우 플레이어가 장비 무게에 영향받지 않습니다. - Augmente ou réduit l'influence que le poids à sur les performances des joueurs. Zéro implique que le poids de l'équipement n'a pas d'influence sur les performances. + Augmente ou diminue l'influence du poids sur les performances du joueur.\nUne valeur nulle indique que le poids de l'équipement n'a aucun impact sur les performances. Incrementa o decrementa quanto il peso influenza le prestazioni dei giocatori. Zero significa che il peso dell'equipaggiamento non ha alcuna influenza nelle prestazioni. 增加或降低玩家所能承受的負重量. 如設定值為0, 代表裝備的重量將不會影響到玩家的體力表現 增加或降低玩家所能承受的负重量. 如设定值为0, 代表装备的重量将不会影响到玩家的体力表现 + Увеличивает или уменьшает вес, влияющий на производительность игроков. Ноль означает, что вес снаряжения не влияет на производительность + Aumenta ou diminui o quanto o peso influencia a performance do jogador. Zero significa que o peso não tem impacto algum na performance. + Zvyšuje nebo snižuje, jak velká váha ovlivňuje výkon hráče. Nulová hodnota znamená, že hmotnost zařízení nemá žádný vliv na výkon. Terrain Gradient Factor + Factor de inclinación del terreno Terrainsteigungsfaktor 地形勾配因数 Współczynnik terenu @@ -99,71 +135,101 @@ Fattore Pendenza Terreno 地形陡峭影響值 地形陡峭影响值 + Фактор местности + Fator de Inclinação do Terreno + Faktor stoupání terénu Sets how much steep terrain increases stamina loss. Higher means higher stamina loss. + Modifica cuanto afecta la inclinación al cansansio. Más alto significa más cansancio Beeinflusst, wie stark Steigungen den Ausdauerverbrauch erhöhen. Ein höherer Wert erhöht den Ausdauerverbrauch. 急勾配の地形がどれだけスタミナ消費を増大させるかを設定します。 値が高ければ高いほど、スタミナ消費が大きくなります。 Wpływa na to w jakim stopniu stromy teren wpływa na utratę wytrzymałości. Więcej oznacza szybszą utratę wytrzymałości. 경사도에 따라 얼마나 피로해지는지를 정합니다. 값이 클수록 더 많은 피로를 유발합니다. - Configure l'influence de l'inclinaison du terrain sur la perte d'endurance. Une valeur plus élevée implique une perte d'endurance plus importante. + Définit à quel point un terrain escarpé réduit l'endurance du joueur.\nPlus la valeur est élevée, moins le joueur est endurant. Stabilisce quanto la pendenza del terreno incrementa la perdita della stamina. Maggiore significa più stamina persa. 設定陡峭的地形將會影響多少體力的流失,值越高代表體力流失越快 设定陡峭的地形将会影响多少体力的流,失值越高代表体力流失越快 + Устанавливает, насколько крутая местность увеличивает потерю выносливости. Чем выше, тем быстрее теряется выносливость. + Define o quanto que um terreno íngrime aumenta na perda de estamina. Quanto maior, maior a perda de estamina. + Nastavuje, o kolik strmý terén zvyšuje ztrátu výdrže. Vyšší znamená vyšší ztrátu výdrže. Sway factor + Factor de balanceo de mira + Verwacklungsfaktor 手ぶれ因数 抖动因数 抖動因素 - Facteur de stabilisation + Facteur de tremblement Fattore di oscillazione Czynnik kołysania + Фактор колебания прицела + Fator de Balanço de Mira + Faktor kývání Influences the amount of weapon sway. Higher means more sway. + Afecta al la estabilidad de la mira. Más alto significa más balanceo + Beeinflusst den Faktor, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung 武器を持つ手のぶれ度合いを設定します。 値が高ければ高いほど、手ぶれが強くなります。 影响手持武器的晃动程度,数值越高,抖动的越厉害. 影響手持武器晃動程度,數值越高抖動越厲害 - Influence les mouvements de l'arme, une valeur plus élevée signifie plus de mouvements + Influe sur l'amplitude du tremblement de l'arme. Une valeur plus élevée signifie plus de tremblement. Influenza l'ammontare di oscillazione dell'arma. Maggiore significa più oscillazione. Wpływa na poziom kołysania broni. Większa ilość znaczy większe kołysanie. + Влияет на колебания прицела оружия. Чем выше - тем больше. + Influencia a quantidade de balanço da mira da arma. Quanto maior, mais balanço. + Ovlivňuje množství kývání zbraní. Vyšší znamená více kývání. Enabled + Activada Aktiv - アドバンスド ファティーグを有効化する + アドバンスド ファティーグを有効化 Włączone 활성화 Activé Abilitato 啟用 启用 + Включена + Ativado + Povoleno Enables/disables Advanced Fatigue. + Activa/desactiva la fatiga avanzada Aktiviert/deaktiviert Advanced Fatigue. アドバンスド ファティーグを有効化します。 Włącza/wyłącza zaawansowaną wytrzymałość 고급 피로도 활성화/비활성화 - Active/désactive la fatigue avancée. + Active/Désactive la fatigue avancée. Abilita/disabilita la Fatica Avanzata. 啟用/關閉進階體力. 启用/关闭进阶体力. + Включает / Отключает Продвинутую усталость + Ativa/Desativa Fadiga Avançada. + Aktivuje / deaktivuje Pokročilou únavu. Show stamina bar + Mostrar barra de cansancio Zeige Ausdauerleiste - スタミナバーを表示する + スタミナバーを表示 Pokaż pasek wytrzymałości 피로도 막대 Afficher la barre d'endurance Mostra barra stamina 顯示體力條 显示体力条 + Показать шкалу усталости + Exibir barra de estamina + Zobrazit lištu výdrže Shows the stamina bar. + Muestra la barra de cansancio Zeigt die Ausdauerleiste an. スタミナバーを表示します。 Pokazuje pasek wytrzymałości. @@ -172,6 +238,36 @@ Mostra la barra della stamina. 顯示體力條 显示体力条 + Показывает шкалу усталости. + Exibe a barra de estamina. + Zobrazuje lištu výdrže + + + Fade Stamina bar automatically + Desvanecer la barra de cansancio + Скрыть шкалу усталости автоматически + Blende Ausdauerleiste automatisch aus + 體力條自動淡去 + Dissolvenza automatica della barra della stamina + Automaticky schovat lištu výdrže + Fondu automatique de la barre d'endurance + 自動的にスタミナバーを非表示 + Chowaj pasek wytrzymałości automatycznie + Barra de stamina some automaticamente + Dayanıklılık çubuğunu otomatik olarak soldur + + + Adjusts transparency of the bar based on stamina status. + Ajusta la ocultación progresiva de la barra de cansancio + Регулирует прозрачность шкалы в зависимости от статуса выносливости. + Passt die Transparenz der Ausdauerleiste abhängig vom Ausdauerstatus an. + 依照目前的體力程度調整體力條之透明度 + Regola la trasparenza della barra in base allo stato di affaticamento. + Upravuje průhlednost lišty v závislosti na současném stavu výdrže + Règle la transparence de la barre en fonction de l'état d'endurance. + スタミナの状態に応じて、自動的にバーの透明度を調整します。 + Dostosowuje przezroczystość paska na podstawie stanu wytrzymałości. + Ajusta a transparência da barra baseado no status da stamina diff --git a/addons/advanced_throwing/functions/fnc_drawArc.sqf b/addons/advanced_throwing/functions/fnc_drawArc.sqf index 906650627fa..bd7bc7a661e 100644 --- a/addons/advanced_throwing/functions/fnc_drawArc.sqf +++ b/addons/advanced_throwing/functions/fnc_drawArc.sqf @@ -53,7 +53,7 @@ for "_i" from 0.05 to 1.45 step 0.1 do { if (lineIntersects [_prevTrajASL, _newTrajASL]) then { // Checks the "VIEW" LOD _cross = 2; // 2: View LOD Block (Red) } else { - if (!((lineIntersectsSurfaces [_prevTrajASL, _newTrajASL, _activeThrowable, ACE_player, true, 1, "GEOM", "FIRE"]) isEqualTo [])) then { + if !((lineIntersectsSurfaces [_prevTrajASL, _newTrajASL, _activeThrowable, ACE_player, true, 1, "GEOM", "FIRE"]) isEqualTo []) then { _cross = 3; // 3: GEOM/FIRE LOD Block (Yellow) - pass a3 bulding glass, but blocked on some CUP glass }; }; diff --git a/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf b/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf index 80dbc2f973d..5461d5d010f 100644 --- a/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf +++ b/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf @@ -26,3 +26,8 @@ TRACE_1("Fired",_this); { _this call _x; } forEach ((_this select 0) getVariable "cba_xeh_fired"); + +// Call muzzle fired EH +{ + _this call compile getText (_x >> "fired"); +} forEach (configProperties [configFile >> "CfgWeapons" >> "Throw" >> (_this select 2) >> "EventHandlers", "isClass _x", true]); diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index a0609270767..faa9451cc46 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -3,6 +3,7 @@ Advanced Throwing + Lanzamiento Avanzado Улучшенный бросок гранат アドバンスド スローイング Zaawansowane rzucanie @@ -12,9 +13,13 @@ Lancio Avanzato 進階投擲 进阶投掷 + Arremesso Avançado + Pokročilé házení + Gelişmiş Fırlatma Allows changing advanced throwing behaviour. + Permite modificar el comportamiento del lanzamiento avanzado Позволяет настраивать поведение улучшенного броска гранат. アドバンスド スローイングの動作挙動を変更します。 Zezwala na zmianę zachowania zaawansowanego trybu rzucania. @@ -24,21 +29,28 @@ Permette il cambiamento della modalità di tiro. 允許使用更多不同的投擲方式 允许使用更多不同的投掷方式 + Permite mudar o comportamento do arremesso avançado. + Umožňuje změnit pokročilé chování při házení. Enable Advanced Throwing + Activar Lanzamiento Avanzado Включить улучшенный бросок - アドバンスド スローイングを有効化する + アドバンスド スローイングを有効化 Aktywuj zaawansowane rzucanie Aktiviere erweitertes Wurfsystem 고급 투척 활성화 - Active le lancé amélioré + Activer le lancé amélioré Abilita Lancio Avanzato 啟用進階投擲 启用进阶投掷 + Ativa o Arremesso Avançado + Povolit pokročilé házení + Gelişmiş Fırlatmayı Etkinleştir Enables advanced throwing system. + Activa el Lanzamiento Avanzado Включает систему улучшенного броска. アドバンスド スローイングを有効化します。 Aktywuje system zaawansowanego rzucania. @@ -48,11 +60,15 @@ Abilita il sistema di lancio avanzato. 啟用進階投擲系統 启用进阶投掷系统 + Ativa o sistema de Arremesso Avançado. + Umožňuje pokročilý systém házení. + Gelişmiş fırlatma sistemini etkinleştirir. Show Throw Arc + Mostrar Arco de Lanzamiento Показать траекторию броска - 投てき軌道を表示する + 投てき軌道を表示 Pokaż trasę lotu Zeige Wurfbogen 투척 궤적 표시 @@ -60,23 +76,30 @@ Mostra Arco di Tiro 顯示投擲軌道 显示投掷轨道 + Mostrar o Arco de Arremesso + Zobrazit oblouk vrhu + Atış Yayını Göster Enables visualization of the throw arc (where throwable will fly). + Activa la visualización del arco de lanzamiento (donde irá el objeto lanzado) Включает визуализацию траектории броска (как полетит граната). 投てき軌道 (投てき物がどこに飛ぶか) の表示を有効化します。 Wyświetla wizualizację trasy przelotu granatu. Aktiviert die Visualisierung des Wurfbogens (wohin das Objekt geworfen werden wird). 투척 궤도를 시각화 합니다(투척물이 어디로 갈지) - Active la visualisation de l'arc de lancé (où l'objet lancé va atterrir). + Active la visualisation de l'arc de lancé (la trajectoire de vol de l'objet). Abilita la visualizzazione dell'arco del tiro (dove l'oggetto lanciabile volerà). 顯示投擲軌道幫助投擲 显示投掷轨道帮助投掷 + Permite a visualização do Arco de Arremesso por onde o objeto será jogado. + Zapíná vizualizaci oblouku vrhu (kam bude předmět hozen). Show Throwing Mouse Controls + Mostrar controles de ratón de lanzamiento Показывать управление мышью - 投てきのマウス操作を表示する + 投てきのマウス操作を表示 Pokaż podpowiedzi sterowania myszą Zeige Maussteuerung beim Werfen 마우스 조작 표시 @@ -84,81 +107,102 @@ Mostra Comandi Mouse Lancio 顯示滑鼠投擲控制提示 显示滑鼠投掷控制提示 + Mostrar os controles de mouse para Arremesso + Zobrazit ovládání házení myší Enables visual cues for mouse controls when throwable is prepared. + Activa muestras visuales para los controles del ratón cuando el objeto lanzable está preparado Включает отображение подсказок по управлению мышью, когда граната подготовлена. 投てき物を構える時、マウス操作の説明表示を有効化します。 Wyświetla podpowiedzi sterowania myszą kiedy obiekt miotany jest w ręku. Aktiviert visuelle Hinweise zur Maussteuerung, wenn ein Objekt zum Werfen vorbereitet wird. 투척물을 준비시 마우스 조작을 시각화해서 보여줍니다 - Active les aides visuels pour les controles à la souris lorsqu'un lancé est préparé. + Active les aides visuelles pour les contrôles à la souris lorsqu'un lancé est préparé. Abilita la visualizzazione dei controlli del mouse quando l'oggetto lanciabile è pronto. 開啟後會在準備投擲時, 顯示滑鼠相關操作 开启后会在准备投掷时, 显示滑鼠相关操作 + Ativa as dicas visuais dos controles do mouse quando um arremessável é preparado. + Zapíná popisky pro ovládání myší, když je házený předmět připraven. Enable Throwables Pick Up + Habilitar recoger objetos lanzados Включить подбор гранат - 投てき物の拾い上げを有効化する + 投てき物の拾い上げを有効化 Zezwól na podnoszenie obiektów miotanych Aktiviere Aufheben von Wurfobjekten 투척물 줍기 활성화 - Active la récupération des objets lancés + Permettre le ramassage d'objets lançables Abilita Raccogli Oggetti 啟用可撿取地面投擲物 启用可捡取地面投掷物 + Permitir pegar arremessáveis + Zapnout zdvihání házených předmětů Enables ability to pick up throwables from the ground. + Activa la habilidad de coger objetos lanzados del suelo Включает возможность подбирать гранаты с земли. 地面に落ちている投てき物を拾い上げる機能を有効化します。 Umożliwia podnoszenie obiektów miotanych z ziemi. Aktiviert die Möglichkeit, geworfene Objekte wieder vom Boden aufzuheben. 땅에 떨어진 투척물을 주울 수 있게 해줍니다. - Active la capacité de récupérer les objets lancés sur le sol. + Active la possibilité de ramasser des objets lançables du sol. Abilita la possibilità di raccogliere un oggetto lanciabile da terra. 啟用後, 可撿取地面上的投擲物 启用后, 可捡取地面上的投掷物 + Permite que objetos arremessados sejam pegos do chão. (ACE Menu de Interação) + Zapíná schopnost zvednutí házených předmětů ze země. Enable Attached Throwables Pick Up + Activar coger objetos lanzables que se enganchan Включить подбор прикрепленных гранат - 取り付けられた投てき物の拾い上げを有効化する + 取り付けられた投てき物の拾い上げを有効化 Zezwól na podnoszenie przyczepionych obiektów miotanych Aktiviere erneute Aufnahme befestigter Wurfobjekte 부착 투척물 줍기 활성화 - Active le ramassage d'objets lançables attachés + Activer le ramassage d'objets lançables attachés Abilita Raccogli Oggetti Lanciabili da altri Oggetti 啟用可撿取附著投擲物 启用可捡取附着投掷物 + Permitir pegar arremessáveis fixados + Zapnout zdvihání připnutých předmětů. Enables ability to pick up throwables from attached objects. + Activa la habilidad de lanzar objetos enganchados Включает возможность подбирать гранаты, прикрепленные к объектам. - 取り付けられた投てき物を、取り付け先から拾い上げる機能を有効化します。 + 取り付けられた投てき物を拾い上げる機能を有効化します。 Umożliwia podnoszenie obiektów miotanych przyczepionych do innych obiektów. Aktiviert die Möglichkeit, befestigte Wurfobjekte erneut aufzunehmen. 부착된 투척물을 주울 수 있게 해줍니다. - Active la capacité à ramasser les objets lançables attaché à d'autres objets. + Active la possibilité de ramasser des objets lançables attachés à d'autres objets. Abilita la possibilità di raccogliere gli oggetti lanciabili dagli altri oggetti. 啟用後, 可撿取附著在物件上的投擲物 启用后, 可捡取附着在物件上的投掷物 + Permite que arremessáveis fixados em objetos sejam pegos. + Zapíná schopnost zvednutí předmětů z objektů ke kterým jsou připnuté. Prepare/Change Throwable + Preparar/Cambiar objetos lanzables Подготовить/заменить гранату 投てき物の準備/変更 Przygotuj/zmień ob. miotany Wurfobjekt vorbereiten/wechseln 투척물 준비/변경 - Préparer/changer d'objet + Préparer/Changer d'objet lançable Prepara/Cambia Oggetto lanciabile 準備/變更投擲物 准备/变更投掷物 + Preparar/Mudar Arremessável + Připravit/změnit házený předmět Throwable Drop Mode (Hold) + Modo soltar objeto lanzable (Mantener pulsado) Режим броска гранаты (удерживать) 投てきモード (押している間) Tryb upuszczania ob. miotanego (przytrzymaj) @@ -168,9 +212,12 @@ Modalità Oggetto Gettabile (Mantenere) 投擲模式 (按住) 投掷模式 (按住) + Modo de Arremesso (Segurar) + Mód puštění (Držet) Throwable Drop Mode (Toggle) + Modo soltar objeto lanzable (interruptor) Режим броска гранаты (переключить) 投てきモード (切り替え) Tryb upuszczania ob. miotanego (przełącz) @@ -180,9 +227,12 @@ Modalità Oggetto lanciabile Gettabile (Interruttore) 投擲模式 (切換) 投掷模式 (切换) + Modo de Arremesso (Alternar) + Mód puštění (Přepnout) Primed + Preparado Подготовлена 点火 Odbezpieczony @@ -192,9 +242,12 @@ Armato 引信開始燃燒 引信开始燃烧 + Preparado + Odjištěný Throw + Lanzar Бросить 投げる Rzuć @@ -204,9 +257,13 @@ Lanciare 投擲 投掷 + Arremessar + Hodit + At (Scroll) Change Mode + (Scroll) Cambiar Modo (Скролл) Изменить режим (スクロール) モード変更 (Kółko m.) zmień tryb @@ -216,21 +273,29 @@ (Scorrere) Cambio Modalità (滾輪) 變更模式 (滚轮) 变更模式 + (Roda do Mouse) Alternar modo + (Scrollovat) Změnit mód + (Tekerlek) Modu Değiştir (Scroll) Extend + (Scroll) Extender (Скролл) Увеличить (スクロール) 腕を伸ばす (Kółko m.) przedłuż (Scrollen) Erweitern (마우스 휠) 연장 - (Molette souris) Etendre + (Molette souris) Étendre (Scorrere) Estendere (滾輪) 延長 (滚轮) 延长 + (Roda do Mouse) Extender + (Scrollovat) Oddálit + (Tekerlek) Uzat (Click) Cook + (Click) Cebar (Клик) Подготовить (クリック) 点火する (Kliknięcie) Odbezpiecz @@ -240,9 +305,13 @@ (Click) Arma (點擊) 提早拉開引信 (点击) 提早拉开引信 + (Clique) Cozinhar + (Klik) Odjistit + (Tıkla) Cook Pick Up + Coger Подобрать 拾い上げる Podnieś @@ -252,6 +321,9 @@ Raccogli 撿取 捡取 + Pegar + Zvednout + Al diff --git a/addons/ai/CfgEventHandlers.hpp b/addons/ai/CfgEventHandlers.hpp index 9e715077f38..45d472cd21e 100644 --- a/addons/ai/CfgEventHandlers.hpp +++ b/addons/ai/CfgEventHandlers.hpp @@ -19,6 +19,6 @@ class Extended_PostInit_EventHandlers { class Extended_DisplayLoad_EventHandlers { class RscDisplayCurator { - ADDON = QUOTE(call FUNC(drawCuratorGarrisonPathing)); + ADDON = QUOTE(call FUNC(initDisplayCurator)); }; }; diff --git a/addons/ai/XEH_PREP.hpp b/addons/ai/XEH_PREP.hpp index 9596af32868..97f2b64e9d7 100644 --- a/addons/ai/XEH_PREP.hpp +++ b/addons/ai/XEH_PREP.hpp @@ -1,4 +1,5 @@ PREP(drawCuratorGarrisonPathing); PREP(garrison); -PREP(unGarrison); PREP(garrisonMove); +PREP(initDisplayCurator); +PREP(unGarrison); diff --git a/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf b/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf index de9a5b4dc7a..ca0d8ccfa7f 100644 --- a/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf +++ b/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf @@ -1,54 +1,56 @@ #include "script_component.hpp" /* * Author: alganthe - * Add draw3D eh to the curator interface. + * Draws AI garrison pathing while the Zeus display is open. * * Arguments: * None * - * Return value: + * Return Value: * None * + * Example: + * [] call ace_ai_fnc_drawCuratorGarrisonPathing + * * Public: No -*/ + */ -addMissionEventHandler ["Draw3D", { - if (findDisplay 312 isEqualTo displayNull) exitWith { - removeMissionEventHandler ["Draw3D", _thisEventHandler]; - }; +if (isNull findDisplay 312) exitWith { + removeMissionEventHandler ["Draw3D", _thisEventHandler]; +}; - private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; - { - _x params ["_unit", "_pos"]; +private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; - 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]; +{ + _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], _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 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]; + 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; -}]; + }; +} forEach _unitMoveList; diff --git a/addons/ai/functions/fnc_initDisplayCurator.sqf b/addons/ai/functions/fnc_initDisplayCurator.sqf new file mode 100644 index 00000000000..1ab54086b4a --- /dev/null +++ b/addons/ai/functions/fnc_initDisplayCurator.sqf @@ -0,0 +1,18 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Initializes the Zeus display. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_ai_fnc_initDisplayCurator + * + * Public: No + */ + +addMissionEventHandler ["Draw3D", {call FUNC(drawCuratorGarrisonPathing)}]; diff --git a/addons/ai/stringtable.xml b/addons/ai/stringtable.xml index 59dca33cb46..b8c7887aced 100644 --- a/addons/ai/stringtable.xml +++ b/addons/ai/stringtable.xml @@ -1,45 +1,69 @@ - - + + Invalid position provided. - Position invalide fourni + Ungültige Position + Position invalide fournie. 位置が無効です。 Posizione invalida fornita. 提供的位置無效 提供的位置无效。 위치가 잘못되었습니다. Podano błędną pozycję. + Указана неверная позиция + Posição inválida fornecida. + Posición inválida proporcionada + Pozice není validní. + Geçersiz Konum - + No units provided. - Aucune unité fourni + Keine Einheit ausgewählt + Aucune unité fournie. ユニットがありません。 Nessuna unità fornita. 找不到可用的單位 找不到可用的单位。 병력이 없습니다. Nie podano żadnych jednostek. + Не указаны юниты + Nenhuma unidade fornecida. + No hay unidades proporcionadas. + Nejsou k dispozici žádné jednotky. + Hiçbir Birim Bulunamadı - + There aren't enough positions to place all units. - Il n'y a pas assez de positions pour placer toutes les unités + Es gibt nicht genug Positionen, um alle Einheiten zu platzieren + Il n'y a pas assez de positions pour placer toutes les unités. 全ユニットを置くために十分な位置がありません。 Non ci sono abbastanza posizioni per piazzare tutte le unità. 沒有足夠的位置能擺放所有單位 没有足够的位置能摆放所有单位。 모든 병력을 배치 할 공간이 없습니다. Nie ma wystarczającej ilości pozycji, aby umieścić wszystkie jednostki. + Недостаточно позиций для размещения всех юнитов + Não há posições suficientes para colocar todas as unidades. + No hay suficientes posiciones para colocar todas las unidades. + Není dostatek pozic pro všechny jednotky. + Tüm birimleri yerleştirmek için yeterli konum yok. - + No building found. - Aucun bâtiment trouvé + Kein Gebäude gefunden + Aucun bâtiment trouvé. 建物がありません。 Nessun edificio trovato. 沒找到建築物 没找到建筑物。 건물이 없습니다. Nie znaleziono budynku. + Здание не найдено + Nenhuma construção encontrada. + No se ha encontrado ningún edificio. + Nenalezena žádná budova. + Bir yapı bulunamadı diff --git a/addons/aircraft/CfgAmmo.hpp b/addons/aircraft/CfgAmmo.hpp index 0da9c7760fa..99f80d5d722 100644 --- a/addons/aircraft/CfgAmmo.hpp +++ b/addons/aircraft/CfgAmmo.hpp @@ -1,6 +1,6 @@ class CfgAmmo { class BulletBase; - class B_20mm : BulletBase { + class B_20mm: BulletBase { hit = 80; indirectHit = 12; indirectHitRange = 2; //2; @@ -15,8 +15,8 @@ class CfgAmmo { model = "\A3\Weapons_f\Data\bullettracer\tracer_red"; }; - class ACE_20mm_HE : B_20mm {}; - class ACE_20mm_AP : B_20mm { + class ACE_20mm_HE: B_20mm {}; + class ACE_20mm_AP: B_20mm { hit = 50; indirectHit = 12; indirectHitRange = 0.3; //2; @@ -39,9 +39,9 @@ class CfgAmmo { // also adjust tracer, "muh lightshow"; also adjust splash damage radius class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase { - hit = 80; // default: 180 + hit = 70; // default: 180 indirectHit = 12; // default: 4 - indirectHitRange = 3; // default: 3 + indirectHitRange = 4; // default: 3 caliber = 1.4; // default: 5 deflecting = 3; // default: 5 fuseDistance = 3; // default: 10 @@ -49,6 +49,44 @@ class CfgAmmo { timeToLive = 40; // default: 6 }; + // adjust damage and splash damage, AP Rounds + class ACE_Gatling_30mm_AP_Plane_CAS_01_F: Gatling_30mm_HE_Plane_CAS_01_F { + explosive = 0.05; // default: 0.4 + caliber = 5; // default: 5 + deflecting = 8; // default: 5 + hit = 110; // default: 180 + indirectHit = 2.5; // default: 4 + indirectHitRange = 1; // default: 3 + fuseDistance = 0.2; // default: 10 + }; + + // adds submunition logic, enabling multiple rounds per frame + class ACE_Gatling_30mm_Sub_HEI: SubmunitionBullet { + submunitionAmmo = "Gatling_30mm_HE_Plane_CAS_01_F"; + weaponType = "cannon"; + submunitionConeType[] = {"poissondisccenter", 3}; + submunitionConeAngle = 0.056; // in degrees, 0.055 ~= 0.001 mils minute, but present + model = "\A3\Weapons_f\Data\bullettracer\tracer_red.p3d"; + triggerTime = 0.005; + ACE_caliber = 1.4; + }; + + class ACE_Gatling_30mm_Sub_AP: ACE_Gatling_30mm_Sub_HEI { + submunitionAmmo = "ACE_Gatling_30mm_AP_Plane_CAS_01_F"; + ACE_caliber = 1.4; + }; + + class ACE_Gatling_30mm_Sub_CM41: ACE_Gatling_30mm_Sub_HEI { + submunitionAmmo[] = {"ACE_Gatling_30mm_AP_Plane_CAS_01_F",0.8,"Gatling_30mm_HE_Plane_CAS_01_F",0.2}; + ACE_caliber = 1.4; + }; + + class ACE_Gatling_30mm_Sub_CM51: ACE_Gatling_30mm_Sub_HEI { + submunitionAmmo[] = {"ACE_Gatling_30mm_AP_Plane_CAS_01_F",0.83,"Gatling_30mm_HE_Plane_CAS_01_F",0.17}; + ACE_caliber = 1.4; + }; + + // adjust damage and splash damage, closer to bluefor gatling with same caliber class Cannon_30mm_HE_Plane_CAS_02_F: Gatling_30mm_HE_Plane_CAS_01_F { hit = 70; // default: 150 diff --git a/addons/aircraft/CfgEventHandlers.hpp b/addons/aircraft/CfgEventHandlers.hpp index 9426fa861ec..93e3311cf2b 100644 --- a/addons/aircraft/CfgEventHandlers.hpp +++ b/addons/aircraft/CfgEventHandlers.hpp @@ -9,9 +9,3 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; - -class Extended_PostInit_EventHandlers { - class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient)); - }; -}; diff --git a/addons/aircraft/CfgMagazines.hpp b/addons/aircraft/CfgMagazines.hpp index 19797b53d87..d08a460bb83 100644 --- a/addons/aircraft/CfgMagazines.hpp +++ b/addons/aircraft/CfgMagazines.hpp @@ -2,9 +2,36 @@ class CfgMagazines { // shoot helper object to tripple rof class VehicleMagazine; class 1000Rnd_Gatling_30mm_Plane_CAS_01_F: VehicleMagazine { + ammo = "ACE_Gatling_30mm_Sub_CM51"; + displayName = CSTRING(GatlingDescriptionCM51); + displayNameShort = CSTRING(GatlingDescriptionShortCM51); count = 1170; }; + class ACE_1000Rnd_Gatling_30mm_Plane_CAS_HEI: 1000Rnd_Gatling_30mm_Plane_CAS_01_F { + ammo = "ACE_Gatling_30mm_Sub_HEI"; + displayName = CSTRING(GatlingDescriptionHEI); + displayNameShort = CSTRING(GatlingDescriptionShortHEI); + }; + + class ACE_1000Rnd_Gatling_30mm_Plane_CAS_AP: 1000Rnd_Gatling_30mm_Plane_CAS_01_F { + ammo = "ACE_Gatling_30mm_Sub_AP"; + displayName = CSTRING(GatlingDescriptionAP); + displayNameShort = CSTRING(GatlingDescriptionShortAP); + }; + + class ACE_1000Rnd_Gatling_30mm_Plane_CAS_CM41: 1000Rnd_Gatling_30mm_Plane_CAS_01_F { + ammo = "ACE_Gatling_30mm_Sub_CM41"; + displayName = CSTRING(GatlingDescriptionCM41); + displayNameShort = CSTRING(GatlingDescriptionShortCM41); + }; + + class ACE_1000Rnd_Gatling_30mm_Plane_CAS_CM51: 1000Rnd_Gatling_30mm_Plane_CAS_01_F { + ammo = "ACE_Gatling_30mm_Sub_CM51"; + displayName = CSTRING(GatlingDescriptionCM51); + displayNameShort = CSTRING(GatlingDescriptionShortCM51); + }; + // an extended magazine for the comanche class 300Rnd_20mm_shells; class ACE_500Rnd_20mm_shells_Comanche: 300Rnd_20mm_shells { diff --git a/addons/aircraft/CfgWeapons.hpp b/addons/aircraft/CfgWeapons.hpp index 5543925b5b0..7c1a87e2fc8 100644 --- a/addons/aircraft/CfgWeapons.hpp +++ b/addons/aircraft/CfgWeapons.hpp @@ -2,7 +2,7 @@ class Mode_FullAuto; class CfgWeapons { class RocketPods; - class ACE_AIR_SAFETY : RocketPods { + class ACE_AIR_SAFETY: RocketPods { CanLock = 0; displayName = "SAFE"; displayNameMagazine = "SAFE"; @@ -16,8 +16,21 @@ class CfgWeapons { magazineReloadTime = 0.1; }; - // bigger mag for comanche class CannonCore; + // Fix attrocious A-10 Cannon Dispersion; Add high ROF capability + class Gatling_30mm_Plane_CAS_01_F: CannonCore { + magazines[] += {"ACE_1000Rnd_Gatling_30mm_Plane_CAS_HEI","ACE_1000Rnd_Gatling_30mm_Plane_CAS_AP","ACE_1000Rnd_Gatling_30mm_Plane_CAS_CM41","ACE_1000Rnd_Gatling_30mm_Plane_CAS_CM51"}; + class LowROF: Mode_FullAuto { + multiplier = 3; + burst = 1; + burstRangeMax = 1; + reloadtime = 0.046; + dispersion = 0.0046; //0.279508497 = 0.25 * sqrt(0.8^-1); (80%, 5mil. https://en.wikipedia.org/wiki/GAU-8_Avenger#Accuracy) - Luke + magazines[] = {"1000Rnd_Gatling_30mm_Plane_CAS_01_F", "ACE_1000Rnd_Gatling_30mm_Plane_CAS_CM"}; + + }; + }; + // bigger mag for comanche class gatling_20mm: CannonCore { magazines[] += {"ACE_500Rnd_20mm_shells_Comanche"}; diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index 7e59abad489..37d1871c6d8 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -3,8 +3,8 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { class Turrets: Turrets { class MainTurret: MainTurret { - weapons[] = {"ACE_gatling_20mm_Comanche", "missiles_DAGR", "missiles_ASRAAM"}; - magazines[] = {"ACE_500Rnd_20mm_shells_Comanche", "4Rnd_AAA_missiles", "24Rnd_PG_missiles"}; + weapons[] = {"ACE_gatling_20mm_Comanche", "missiles_DAGR", "missiles_ASRAAM", "Laserdesignator_mounted"}; + magazines[] = {"ACE_500Rnd_20mm_shells_Comanche", "4Rnd_AAA_missiles", "24Rnd_PG_missiles", "Laserbatteries"}; turretInfoType = "Rsc_ACE_Helo_UI_Turret"; @@ -119,9 +119,8 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { class Heli_Attack_01_dynamicLoadout_base_F: Heli_Attack_01_base_F { class Turrets: Turrets { class MainTurret: MainTurret { - weapons[] = {"ACE_gatling_20mm_Comanche"}; - magazines[] = {"ACE_500Rnd_20mm_shells_Comanche"}; + weapons[] = {"ACE_gatling_20mm_Comanche", "Laserdesignator_mounted"}; + magazines[] = {"ACE_500Rnd_20mm_shells_Comanche", "Laserbatteries"}; }; }; }; - diff --git a/addons/aircraft/XEH_postInitClient.sqf b/addons/aircraft/XEH_postInitClient.sqf deleted file mode 100644 index e468602dbc2..00000000000 --- a/addons/aircraft/XEH_postInitClient.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" - -if (!hasInterface) exitWith {}; - -private _cfgAction = configFile >> "CfgActions" >> "Eject"; -GVAR(ejectActionParams) = [ - [ - "", // will be set with setUserActionText - { - params ["_vehicle", "_unit"]; - private _preserveEngineOn = (_unit == driver _vehicle) && {isEngineOn _vehicle}; - moveOut _unit; - if (_preserveEngineOn) then { - // vehicle is local to last driver, no need to care - _vehicle engineOn true; - }; - }, - nil, - getNumber (_cfgAction >> "priority"), - false, - true, - getText (_cfgAction >> "shortcut"), - '[_this, _target] call DFUNC(canShowEject)' - ], - getText (_cfgAction >> "text"), - getText (_cfgAction >> "textDefault") -]; - -["Helicopter", "initPost", LINKFUNC(initEjectAction)] call CBA_fnc_addClassEventHandler; diff --git a/addons/aircraft/XEH_preInit.sqf b/addons/aircraft/XEH_preInit.sqf index b47cf6628db..ef3f9f52bfe 100644 --- a/addons/aircraft/XEH_preInit.sqf +++ b/addons/aircraft/XEH_preInit.sqf @@ -6,4 +6,41 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +if (hasInterface) then { + ["CBA_settingsInitialized", { + private _ejectAction = configFile >> "CfgActions" >> "Eject"; + private _hideEjectAction = missionNamespace getVariable [QEGVAR(vehicles,hideEjectAction), false]; + + private _text = getText (_ejectAction >> "text"); + if (_hideEjectAction) then { + _text = format ["%1", _text]; + }; + + GVAR(ejectActionParams) = [ + [ + "", // will be set with setUserActionText + { + params ["_vehicle", "_unit"]; + private _preserveEngineOn = (_unit == driver _vehicle) && {isEngineOn _vehicle}; + moveOut _unit; + if (_preserveEngineOn) then { + // vehicle is local to last driver, no need to care + _vehicle engineOn true; + }; + }, + nil, + [getNumber (_ejectAction >> "priority"), -999] select _hideEjectAction, + false, + true, + getText (_ejectAction >> "shortcut"), + '[_this, _target] call DFUNC(canShowEject)' + ], + _text, + getText (_ejectAction >> "textDefault") + ]; + + ["Helicopter", "InitPost", LINKFUNC(initEjectAction), nil, nil, true] call CBA_fnc_addClassEventHandler; + }] call CBA_fnc_addEventHandler; +}; + ADDON = true; diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index 0c523972428..668d71963f6 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -16,6 +16,7 @@ XM301 XM301 XM301 + XM301 Open Cargo Door @@ -32,6 +33,7 @@ 화물칸 개방 開啟貨艙門 开启货舱门 + Kargo kapısını aç Close Cargo Door @@ -48,6 +50,103 @@ 화물칸 폐쇄 關閉貨艙門 关闭货舱门 + Kargo kapısını kapat + + + 30mm High-Explosive Incendiary + 30mm Alto Explosivo Incendiaria + 30毫米高爆燃燒彈 + 30 mm High-Explosive Incendiary + 30mm Odłamkowo-Burzące - Zapalające + 30mm Yüksek Patlayıcı + 30mm Hochexplosiv/Brandladung + 30mm 焼夷りゅう弾 + 30mm Tříštivo-trhavá zápalná střela + 30мм Осколочно-Фугасный Зажигательный + + + 30mm HEI + 30mm AEI + 30毫米高爆燃燒 + 30 mm HEI + 30mm OB-Z + 30mm HEI + 30mm HEB + 30mm HEI + 30mm HEI + 30мм ОФЗ + + + 30mm DU Armor Piercing + 30mm UE Perforante de Blindaje + 30毫米貧化鈾穿甲彈 + 30 mm UA Armor Piercing + 30mm Zubożony Uran - Przebijające + 30mm DU Zırh Delici + 30mm abgereichertes panzerbrechendes Uraniumgeschoss + 30mm DU 徹甲弾 + 30mm Protipancéřová střela z ochuzeného Uranu + 30мм ОУ Бронебойный Снаряд + + + 30mm DU AP + 30mm UE AP + 30毫米貧鈾穿甲 + 30 mm UA AP + 30mm ZU-P + 30mm DU AP + 30mm DU-PB + 30mm DU AP + 30 mm DU AP + 30мм ОУ БС + + + 30mm Combat Mix 4:1 DU:HEI + 30mm Mezcla de Combate 4:1 UE:AEI + 30毫米戰鬥混合彈4:1 穿甲:高爆 + 30 mm Mix de Combat 4:1 UA:HEI + 30mm Mieszanka bojowa 4:1 ZU:OB-Z + 30mm Combat Mix 4:1 DU:HEI + 30mm Kampfmischung 4:1 DU:HEB + 30mm コンバット ミックス 4:1 DU:HEI + 30mm Bojový Mix 4:1 DU:HEI + 30мм Смешанное боепитание 4:1 ОУ:ОФЗ + + + 30mm CM 4:1 + 30mm MC 4:1 + 30毫米 穿高混合 4:1 + 30 mm MdC 4:1 + 30mm MB 4:1 + 30mm CM 4:1 + 30mm KM 4:1 + 30mm CM 4:1 + 30mm BM 4:1 + 30мм СБ 4:1 + + + 30mm Combat Mix 5:1 DU:HEI + 30mm Mezcla de Combate 5:1 UE:AEI + 30毫米戰鬥混合彈5:1 穿甲:高爆 + 30 mm Mix de Combat 5:1 UA:HEI + 30mm Mieszanka bojowa 5:1 ZU:OB-Z + 30mm Combat Mix 5:1 DU:HEI + 30mm Kampfmischung 5:1 DU:HEB + 30mm コンバット ミックス 5:1 DU:HEI + 30mm Bojový Mix 5:1 DU:HEI + 30мм Смешанное боепитание 5:1 ОУ:ОФЗ + + + 30mm CM 5:1 + 30mm MC 5:1 + 30毫米 穿高混合 5:1 + 30 mm MdC 5:1 + 30mm MB 5:1 + 30mm CM 5:1 + 30mm KM 5:1 + 30mm CM 5:1 + 30mm BM 5:1 + 30мм СБ 5:1 diff --git a/addons/apl/ACE_CSW_Bag.p3d b/addons/apl/ACE_CSW_Bag.p3d new file mode 100644 index 00000000000..d80bde086db Binary files /dev/null and b/addons/apl/ACE_CSW_Bag.p3d differ diff --git a/addons/apl/ACE_CSW_m3_tripod.p3d b/addons/apl/ACE_CSW_m3_tripod.p3d new file mode 100644 index 00000000000..0ad274ad9cb Binary files /dev/null and b/addons/apl/ACE_CSW_m3_tripod.p3d differ diff --git a/addons/apl/ACE_CSW_mortarBaseplate.p3d b/addons/apl/ACE_CSW_mortarBaseplate.p3d new file mode 100644 index 00000000000..1dfee12c2a7 Binary files /dev/null and b/addons/apl/ACE_CSW_mortarBaseplate.p3d differ diff --git a/addons/apl/ace_csw_tripod_ags30.p3d b/addons/apl/ace_csw_tripod_ags30.p3d new file mode 100644 index 00000000000..11dd8fc0f2c Binary files /dev/null and b/addons/apl/ace_csw_tripod_ags30.p3d differ diff --git a/addons/apl/ace_csw_tripod_kord.p3d b/addons/apl/ace_csw_tripod_kord.p3d new file mode 100644 index 00000000000..f2c1d674109 Binary files /dev/null and b/addons/apl/ace_csw_tripod_kord.p3d differ diff --git a/addons/apl/ace_csw_tripod_m122.p3d b/addons/apl/ace_csw_tripod_m122.p3d new file mode 100644 index 00000000000..90cf2157ab0 Binary files /dev/null and b/addons/apl/ace_csw_tripod_m122.p3d differ diff --git a/addons/apl/ace_csw_tripod_m220.p3d b/addons/apl/ace_csw_tripod_m220.p3d new file mode 100644 index 00000000000..c3632b12c34 Binary files /dev/null and b/addons/apl/ace_csw_tripod_m220.p3d differ diff --git a/addons/apl/ace_csw_tripod_spg9.p3d b/addons/apl/ace_csw_tripod_spg9.p3d new file mode 100644 index 00000000000..1b5ede50fd6 Binary files /dev/null and b/addons/apl/ace_csw_tripod_spg9.p3d differ diff --git a/addons/apl/data/csw_nsv.rvmat b/addons/apl/data/csw_nsv.rvmat new file mode 100644 index 00000000000..46ea387b232 --- /dev/null +++ b/addons/apl/data/csw_nsv.rvmat @@ -0,0 +1,95 @@ +ambient[]={1,1,1,1.000000}; +diffuse[]={1,1,1,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={1,1,1,1.000000}; +specularPower=40.000000; +PixelShaderID="super"; +VertexShaderID="super"; +class Stage1 +{ + texture = "z\ace\addons\apl\data\csw_nsv_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 +{ + texture="a3\weapons_f\Data\DetailMaps\metal_detail_dt.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={8.0000,0.000000,0.000000}; + up[]={0.000000,8.0000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 +{ + texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 +{ + texture = "z\ace\addons\apl\data\csw_nsv_smdi.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 +{ + texture = "#(ai,32,128,1)fresnel(3.38,5.33)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage7 +{ + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class StageTI { + texture = "a3\data_f\default_vehicle_ti_ca.paa"; +}; diff --git a/addons/apl/data/csw_nsv_co.paa b/addons/apl/data/csw_nsv_co.paa new file mode 100644 index 00000000000..f7af35c0b85 Binary files /dev/null and b/addons/apl/data/csw_nsv_co.paa differ diff --git a/addons/apl/data/csw_nsv_nohq.paa b/addons/apl/data/csw_nsv_nohq.paa new file mode 100644 index 00000000000..299de50ad77 Binary files /dev/null and b/addons/apl/data/csw_nsv_nohq.paa differ diff --git a/addons/apl/data/csw_nsv_smdi.paa b/addons/apl/data/csw_nsv_smdi.paa new file mode 100644 index 00000000000..09f7758e758 Binary files /dev/null and b/addons/apl/data/csw_nsv_smdi.paa differ diff --git a/addons/apl/data/csw_spg9.rvmat b/addons/apl/data/csw_spg9.rvmat new file mode 100644 index 00000000000..21de1208fda --- /dev/null +++ b/addons/apl/data/csw_spg9.rvmat @@ -0,0 +1,92 @@ +ambient[] = {1.0,1.0,1.0,1.0}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {0.0,0.0,0.0,1.0}; +specular[] = {0.545,0.545,0.545,1.0}; +specularPower = 100.0; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 +{ + texture = "z\ace\addons\apl\data\csw_spg9_nohq.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage2 +{ + texture = "a3\weapons_f\Data\DetailMaps\metal_detail_dt.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {8.0,0.0,0.0}; + up[] = {0.0,2.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage3 +{ + texture = "#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage4 +{ + texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage5 +{ + texture = "z\ace\addons\apl\data\csw_spg9_smdi.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage6 +{ + texture = "#(ai,32,128,1)fresnel(1.89,1.02)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage7 +{ + texture="a3\data_f\env_land_co.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,1.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; diff --git a/addons/apl/data/csw_spg9_co.paa b/addons/apl/data/csw_spg9_co.paa new file mode 100644 index 00000000000..c7b6694e9b7 Binary files /dev/null and b/addons/apl/data/csw_spg9_co.paa differ diff --git a/addons/apl/data/csw_spg9_nohq.paa b/addons/apl/data/csw_spg9_nohq.paa new file mode 100644 index 00000000000..718e5364926 Binary files /dev/null and b/addons/apl/data/csw_spg9_nohq.paa differ diff --git a/addons/apl/data/csw_spg9_smdi.paa b/addons/apl/data/csw_spg9_smdi.paa new file mode 100644 index 00000000000..345a664a12d Binary files /dev/null and b/addons/apl/data/csw_spg9_smdi.paa differ diff --git a/addons/apl/data/csw_tow_merge.rvmat b/addons/apl/data/csw_tow_merge.rvmat new file mode 100644 index 00000000000..55db8aba2a7 --- /dev/null +++ b/addons/apl/data/csw_tow_merge.rvmat @@ -0,0 +1,32 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.3000000,0.3000000,0.3000000,1.000000}; +specularPower=100.000000; +PixelShaderID="NormalMapSpecularDIMap"; +VertexShaderID="NormalMap"; +class Stage1 +{ + texture="z\ace\addons\apl\data\csw_tow_merge_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 +{ + texture="z\ace\addons\apl\data\csw_tow_merge_smdi.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; \ No newline at end of file diff --git a/addons/apl/data/csw_tow_merge_co.paa b/addons/apl/data/csw_tow_merge_co.paa new file mode 100644 index 00000000000..5d16cd54d48 Binary files /dev/null and b/addons/apl/data/csw_tow_merge_co.paa differ diff --git a/addons/apl/data/csw_tow_merge_nohq.paa b/addons/apl/data/csw_tow_merge_nohq.paa new file mode 100644 index 00000000000..a02ec97769b Binary files /dev/null and b/addons/apl/data/csw_tow_merge_nohq.paa differ diff --git a/addons/apl/data/csw_tow_merge_smdi.paa b/addons/apl/data/csw_tow_merge_smdi.paa new file mode 100644 index 00000000000..91090de9b48 Binary files /dev/null and b/addons/apl/data/csw_tow_merge_smdi.paa differ diff --git a/addons/apl/data/csw_tripod_ags.rvmat b/addons/apl/data/csw_tripod_ags.rvmat new file mode 100644 index 00000000000..3e435eb6db0 --- /dev/null +++ b/addons/apl/data/csw_tripod_ags.rvmat @@ -0,0 +1,32 @@ +ambient[] = {1.0,1.0,1.0,1.0}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {0.0,0.0,0.0,0.0}; +specular[] = {0.3,0.3,0.3,1.0}; +specularPower = 256.0; +PixelShaderID = "NormalMapSpecularDIMap"; +VertexShaderID = "NormalMap"; +class Stage1 +{ + texture = "z\ace\addons\apl\data\csw_tripod_ags_nohq.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage2 +{ + texture = "z\ace\addons\apl\data\csw_tripod_ags_smdi.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; diff --git a/addons/apl/data/csw_tripod_ags_co.paa b/addons/apl/data/csw_tripod_ags_co.paa new file mode 100644 index 00000000000..93e2367188e Binary files /dev/null and b/addons/apl/data/csw_tripod_ags_co.paa differ diff --git a/addons/apl/data/csw_tripod_ags_nohq.paa b/addons/apl/data/csw_tripod_ags_nohq.paa new file mode 100644 index 00000000000..ddad36a44ab Binary files /dev/null and b/addons/apl/data/csw_tripod_ags_nohq.paa differ diff --git a/addons/apl/data/csw_tripod_ags_smdi.paa b/addons/apl/data/csw_tripod_ags_smdi.paa new file mode 100644 index 00000000000..561bcc81781 Binary files /dev/null and b/addons/apl/data/csw_tripod_ags_smdi.paa differ diff --git a/addons/apl/data/m3tripod.rvmat b/addons/apl/data/m3tripod.rvmat new file mode 100644 index 00000000000..1739f485506 --- /dev/null +++ b/addons/apl/data/m3tripod.rvmat @@ -0,0 +1,98 @@ +#define _ARMA_ + +ambient[] = {1,1,1,1.0}; +diffuse[] = {1,1,1,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {0.0,0.0,0.0,1.0}; +specular[] = {1,1,1,1.0}; +specularPower = 40.0; +PixelShaderID = "super"; +VertexShaderID = "super"; +class Stage1 +{ + texture = "z\ace\addons\apl\data\m3tripod_nohq.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage2 +{ + texture = "a3\weapons_f\Data\DetailMaps\metal_detail_dt.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {8.0,0.0,0.0}; + up[] = {0.0,8.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage3 +{ + texture = "#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage4 +{ + texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage5 +{ + texture = "z\ace\addons\apl\data\m3tripod_SMDI.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage6 +{ + texture = "#(ai,32,128,1)fresnel(3.38,5.33)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage7 +{ + texture = "a3\data_f\env_land_co.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class StageTI +{ + texture = "a3\data_f\default_vehicle_ti_ca.paa"; +}; diff --git a/addons/apl/data/m3tripod_co.paa b/addons/apl/data/m3tripod_co.paa new file mode 100644 index 00000000000..994bf342cc2 Binary files /dev/null and b/addons/apl/data/m3tripod_co.paa differ diff --git a/addons/apl/data/m3tripod_nohq.paa b/addons/apl/data/m3tripod_nohq.paa new file mode 100644 index 00000000000..46c64a4f48f Binary files /dev/null and b/addons/apl/data/m3tripod_nohq.paa differ diff --git a/addons/apl/data/m3tripod_smdi.paa b/addons/apl/data/m3tripod_smdi.paa new file mode 100644 index 00000000000..0c430021329 Binary files /dev/null and b/addons/apl/data/m3tripod_smdi.paa differ diff --git a/addons/apl/data/mortarBaseplate.rvmat b/addons/apl/data/mortarBaseplate.rvmat new file mode 100644 index 00000000000..13739500c6c --- /dev/null +++ b/addons/apl/data/mortarBaseplate.rvmat @@ -0,0 +1,95 @@ +ambient[]={1,1,1,1.000000}; +diffuse[]={1,1,1,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={1,1,1,1.000000}; +specularPower=40.000000; +PixelShaderID="super"; +VertexShaderID="super"; +class Stage1 +{ + texture="z\ace\addons\apl\data\mortarBaseplate_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 +{ + texture="a3\weapons_f\Data\DetailMaps\metal_detail_dt.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={8.0000,0.000000,0.000000}; + up[]={0.000000,8.0000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 +{ + texture="z\ace\addons\apl\data\mortarBaseplate_as.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 +{ + texture="z\ace\addons\apl\data\mortarBaseplate_smdi.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 +{ + texture = "#(ai,32,128,1)fresnel(3.38,5.33)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage7 +{ + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class StageTI { + texture = "a3\data_f\default_vehicle_ti_ca.paa"; +}; diff --git a/addons/apl/data/mortarBaseplate_as.paa b/addons/apl/data/mortarBaseplate_as.paa new file mode 100644 index 00000000000..7cafb83c0d4 Binary files /dev/null and b/addons/apl/data/mortarBaseplate_as.paa differ diff --git a/addons/apl/data/mortarBaseplate_co.paa b/addons/apl/data/mortarBaseplate_co.paa new file mode 100644 index 00000000000..3dfe27f12c8 Binary files /dev/null and b/addons/apl/data/mortarBaseplate_co.paa differ diff --git a/addons/apl/data/mortarBaseplate_nohq.paa b/addons/apl/data/mortarBaseplate_nohq.paa new file mode 100644 index 00000000000..f177b8d5c22 Binary files /dev/null and b/addons/apl/data/mortarBaseplate_nohq.paa differ diff --git a/addons/apl/data/mortarBaseplate_smdi.paa b/addons/apl/data/mortarBaseplate_smdi.paa new file mode 100644 index 00000000000..9b71d965ec4 Binary files /dev/null and b/addons/apl/data/mortarBaseplate_smdi.paa differ diff --git a/addons/apl/data/static.rvmat b/addons/apl/data/static.rvmat new file mode 100644 index 00000000000..88c9f8e6296 --- /dev/null +++ b/addons/apl/data/static.rvmat @@ -0,0 +1,98 @@ +#define _ARMA_ + +class StageTI +{ + texture = "a3\weapons_f\ammoboxes\bags\data\backpacks_ti_ca.paa"; +}; +ambient[] = {1.0,1.0,1.0,1.0}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {0.0,0.0,0.0,1.0}; +specular[] = {0.0,0.0,0.0,1.0}; +specularPower = 0.0; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 +{ + texture = "z\ace\addons\apl\data\static_nohq.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage2 +{ + texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage3 +{ + texture = "#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage4 +{ + texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage5 +{ + texture = "#(argb,8,8,3)color(0,0,1,1,SMDI)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage6 +{ + texture = "#(ai,32,128,1)fresnel(1.58,0.71)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; +class Stage7 +{ + texture = "a3\data\env2_co.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1.0,0.0,0.0}; + up[] = {0.0,1.0,0.0}; + dir[] = {0.0,0.0,0.0}; + pos[] = {0.0,0.0,0.0}; + }; +}; diff --git a/addons/apl/data/static_co.paa b/addons/apl/data/static_co.paa new file mode 100644 index 00000000000..4130790f241 Binary files /dev/null and b/addons/apl/data/static_co.paa differ diff --git a/addons/apl/data/static_nohq.paa b/addons/apl/data/static_nohq.paa new file mode 100644 index 00000000000..5d22d896f32 Binary files /dev/null and b/addons/apl/data/static_nohq.paa differ diff --git a/addons/arsenal/ACE_Arsenal_Stats.hpp b/addons/arsenal/ACE_Arsenal_Stats.hpp index 1dd400856ae..a69b0545fb0 100644 --- a/addons/arsenal/ACE_Arsenal_Stats.hpp +++ b/addons/arsenal/ACE_Arsenal_Stats.hpp @@ -115,8 +115,17 @@ class GVAR(stats) { stats[] = {"ammo"}; displayName = CSTRING(statTTL); showText = 1; - textStatement= QUOTE(call FUNC(statTextStatement_smokeChemTTL)); + textStatement = QUOTE(call FUNC(statTextStatement_smokeChemTTL)); condition = QUOTE((configName (_this select 1)) isKindOf [ARR_2('smokeShell', configFile >> 'CfgMagazines')]); tabs[] = {{}, {5}}; }; + class ACE_explosionTime: statBase { + scope = 2; + priority = 3; + displayName = CSTRING(StatExplosionTime); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_explosionTime)); + condition = QUOTE(true); + tabs[] = {{}, {5}}; + }; }; diff --git a/addons/arsenal/Cfg3DEN.hpp b/addons/arsenal/Cfg3DEN.hpp index 8e79b726b44..8b40f77bfed 100644 --- a/addons/arsenal/Cfg3DEN.hpp +++ b/addons/arsenal/Cfg3DEN.hpp @@ -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); @@ -129,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); @@ -140,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 { @@ -162,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}; + }; }; }; }; diff --git a/addons/arsenal/Display3DEN.hpp b/addons/arsenal/Display3DEN.hpp index 0a693a2189a..b1b78b9f928 100644 --- a/addons/arsenal/Display3DEN.hpp +++ b/addons/arsenal/Display3DEN.hpp @@ -13,7 +13,7 @@ class Display3DEN { }; class aceArsenal: virtualArsenal { text = "ACE Arsenal"; - action = QUOTE(call FUNC(open3DEN)); + action = QUOTE(call DFUNC(open3DEN)); }; }; }; @@ -21,12 +21,12 @@ class Display3DEN { class MenuStrip: ctrlMenuStrip { class Items { class Tools { - items[] += {"ACE_arsenal_portVALoadouts"}; + items[] += {QGVAR(portVALoadouts)}; }; - class ACE_arsenal_portVALoadouts { + class GVAR(portVALoadouts) { text = CSTRING(portLoadoutsText); picture = QPATHTOEF(common,data\logo_ace3_ca.paa); - action = "call ace_arsenal_fnc_portVALoadouts;"; + action = QUOTE(call DFUNC(portVALoadouts);); }; }; }; diff --git a/addons/arsenal/RscDisplayMain.hpp b/addons/arsenal/RscDisplayMain.hpp index b20b99e31ea..50b7c285051 100644 --- a/addons/arsenal/RscDisplayMain.hpp +++ b/addons/arsenal/RscDisplayMain.hpp @@ -9,7 +9,6 @@ class RscDisplayMain: RscStandardDisplay { class Controls: Controls { class Bootcamp; - class VRTraining; class Arsenal; class GVAR(mission): Arsenal { idc = -1; diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index 3e64d3654e1..30117d5d817 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -1,10 +1,14 @@ PREP(addDefaultLoadout); PREP(addListBoxItem); +PREP(addRightPanelButton); PREP(addStat); PREP(addVirtualItems); +PREP(attributeAddCompatible); PREP(attributeAddItems); +PREP(attributeCategory); PREP(attributeClear); PREP(attributeDblClick); +PREP(attributeImport); PREP(attributeInit); PREP(attributeKeyDown); PREP(attributeLoad); @@ -61,6 +65,7 @@ PREP(statBarStatement_default); PREP(statBarStatement_impact); PREP(statBarStatement_rateOfFIre); PREP(statTextStatement_accuracy); +PREP(statTextStatement_explosionTime); PREP(statTextStatement_mass); PREP(statTextStatement_rateOfFire); PREP(statTextStatement_scopeMag); diff --git a/addons/arsenal/XEH_postInit.sqf b/addons/arsenal/XEH_postInit.sqf index dcc5c7c7b5c..5623439cda6 100644 --- a/addons/arsenal/XEH_postInit.sqf +++ b/addons/arsenal/XEH_postInit.sqf @@ -24,7 +24,7 @@ GVAR(lastSearchTextLoadouts) = ""; [QGVAR(loadoutUnshared), { params ["_contentPanelCtrl" , "_playerName", "_loadoutName"]; - if (!(isNil QGVAR(currentLoadoutsTab)) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { + if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { private _dataToCheck = _playerName + _loadoutName; @@ -52,7 +52,7 @@ GVAR(lastSearchTextLoadouts) = ""; params ["_contentPanelCtrl" ,"_loadoutArgs"]; _loadoutArgs params ["_playerName", "_loadoutName", "_loadoutData"]; - if (!(isNil QGVAR(currentLoadoutsTab)) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { + if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { private _curSelData =_contentPanelCtrl lnbData [(lnbCurSelRow _contentPanelCtrl), 1]; ([_loadoutData] call FUNC(verifyLoadout)) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount"]; diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 41f5f4cf882..1e37d369d71 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -8,14 +8,13 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; // Arsenal -GVAR(modList) = ["","curator","kart","heli","mark","expansion","expansionpremium"]; +GVAR(modList) = ["", "curator", "kart", "heli", "mark", "expansion", "expansionpremium"]; [QGVAR(camInverted), "CHECKBOX", localize LSTRING(invertCameraSetting), localize LSTRING(settingCategory), false] call CBA_Settings_fnc_init; [QGVAR(enableModIcons), "CHECKBOX", [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], localize LSTRING(settingCategory), true] call CBA_Settings_fnc_init; [QGVAR(fontHeight), "SLIDER", [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], localize LSTRING(settingCategory), [1, 10, 4.5, 1]] call CBA_Settings_fnc_init; [QGVAR(enableIdentityTabs), "CHECKBOX", localize LSTRING(enableIdentityTabsSettings), localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init; - // Arsenal loadouts [QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init; [QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init; @@ -60,4 +59,17 @@ GVAR(modList) = ["","curator","kart","heli","mark","expansion","expansionpremium call FUNC(compileStats); +[QUOTE(ADDON), {!isNil QGVAR(camera)}] call CBA_fnc_registerFeatureCamera; + +// Compatibility with CBA scripted optics and dispoable framework +[QGVAR(displayOpened), { + "cba_optics_arsenalOpened" call CBA_fnc_localEvent; + "cba_disposable_arsenalOpened" call CBA_fnc_localEvent; +}] call CBA_fnc_addEventHandler; + +[QGVAR(displayClosed), { + "cba_optics_arsenalClosed" call CBA_fnc_localEvent; + "cba_disposable_arsenalClosed" call CBA_fnc_localEvent; +}] call CBA_fnc_addEventHandler; + ADDON = true; diff --git a/addons/arsenal/config.cpp b/addons/arsenal/config.cpp index 6eb4c895ce4..0bc1ba37d67 100644 --- a/addons/arsenal/config.cpp +++ b/addons/arsenal/config.cpp @@ -15,6 +15,7 @@ class CfgPatches { }; #include "ui\RscAttributes.hpp" +#include "ui\RscCustomArsenalButton.hpp" #include "Display3DEN.hpp" #include "Cfg3DEN.hpp" #include "CfgEventHandlers.hpp" diff --git a/addons/arsenal/data/iconCustom.paa b/addons/arsenal/data/iconCustom.paa new file mode 100644 index 00000000000..8c0c6ff94f9 Binary files /dev/null and b/addons/arsenal/data/iconCustom.paa differ diff --git a/addons/arsenal/defines.hpp b/addons/arsenal/defines.hpp index 6bc200b32fd..f0ce0bc8942 100644 --- a/addons/arsenal/defines.hpp +++ b/addons/arsenal/defines.hpp @@ -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 "×" @@ -170,10 +172,12 @@ #define FADE_DELAY 0.15 #define CAM_DIS_MAX 5 +#define RIGHT_PANEL_CUSTOM_BUTTONS 61, 63, 65, 67, 69, 71, 73, 75, 77, 79 +#define RIGHT_PANEL_CUSTOM_BACKGROUND 60, 62, 64, 66, 68, 70, 72, 74, 76, 78 #define RIGHT_PANEL_ACC_IDCS IDC_buttonOptic, IDC_buttonItemAcc, IDC_buttonMuzzle, IDC_buttonBipod #define RIGHT_PANEL_ACC_BACKGROUND_IDCS IDC_iconBackgroundOptic, IDC_iconBackgroundItemAcc, IDC_iconBackgroundMuzzle, IDC_iconBackgroundBipod -#define RIGHT_PANEL_ITEMS_IDCS IDC_buttonMag, IDC_buttonMagALL, IDC_buttonThrow, IDC_buttonPut, IDC_buttonMisc -#define RIGHT_PANEL_ITEMS_BACKGROUND_IDCS IDC_iconBackgroundMag, IDC_iconBackgroundMagALL, IDC_iconBackgroundThrow, IDC_iconBackgroundPut, IDC_iconBackgroundMisc +#define RIGHT_PANEL_ITEMS_IDCS IDC_buttonMag, IDC_buttonMagALL, IDC_buttonThrow, IDC_buttonPut, IDC_buttonMisc, RIGHT_PANEL_CUSTOM_BUTTONS +#define RIGHT_PANEL_ITEMS_BACKGROUND_IDCS IDC_iconBackgroundMag, IDC_iconBackgroundMagALL, IDC_iconBackgroundThrow, IDC_iconBackgroundPut, IDC_iconBackgroundMisc, RIGHT_PANEL_CUSTOM_BACKGROUND #define ARROWS_IDCS IDC_arrowMinus, IDC_arrowPlus #define GETDLC\ @@ -302,7 +306,38 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ } foreach [\ IDC_blockRightFrame,\ IDC_blockRighttBackground\ -]; +];\ +if (!isNil QGVAR(customRightPanelButtons)) then {\ + private _miscOffset = 0;\ + {\ + if (!isNil "_x") then {\ + _x params ["", "_picture", "_tooltip"];\ + _miscOffset = _forEachIndex + 1;\ + private _ctrl = _display ctrlCreate [QGVAR(customArsenalButton_Background), 60 + (_forEachIndex * 2)];\ + _ctrl ctrlSetPosition [\ + safezoneW + safezoneX - 13 * GRID_W,\ + safezoneY + (88 + (10 * _forEachIndex)) * GRID_H\ + ];\ + _ctrl ctrlCommit 0;\ + _ctrl = _display ctrlCreate [QGVAR(customArsenalButton_Button), 61 + (_forEachIndex * 2)];\ + _ctrl ctrlSetPosition [\ + safezoneW + safezoneX - 10 * GRID_W,\ + safezoneY + (88 + (10 * _forEachIndex)) * GRID_H\ + ];\ + _ctrl ctrlSetText _picture;\ + _ctrl ctrlSetTooltip _tooltip;\ + _ctrl ctrlCommit 0;\ + };\ + } forEach GVAR(customRightPanelButtons);\ + {\ + _x = _display displayCtrl _x;\ + _x ctrlSetPosition [\ + safezoneW + safezoneX - (10 + (3 * _forEachIndex)) * GRID_W,\ + safezoneY + (88 + (10 * _miscOffset)) * GRID_H\ + ];\ + _x ctrlCommit 0;\ + } forEach [IDC_buttonMisc, IDC_iconBackgroundMisc];\ +}; #define TOGGLE_RIGHT_PANEL_HIDE\ {\ @@ -362,7 +397,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 +406,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 +417,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} ||\ diff --git a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf index 2c18a38ca61..2ec3b9c80dd 100644 --- a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf +++ b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf @@ -23,6 +23,81 @@ if (isNil QGVAR(defaultLoadoutsList)) then { GVAR(defaultLoadoutsList) = []; }; +for "_dataIndex" from 0 to 10 do { + switch (_dataIndex) do { + + case 0; + case 1; + case 2; + case 8: { + if (count (_loadout select _dataIndex) > 0) then { + + private _weapon = (_loadout select _dataIndex) select 0; + if (_weapon != "") then { + + private _baseWeapon = _weapon call BIS_fnc_baseWeapon; + if (_weapon != _baseWeapon) then { + (_loadout select _dataIndex) set [0, _baseWeapon]; + }; + }; + }; + }; + + case 3; + case 4; + case 5: { + if (count (_loadout select _dataIndex) > 0) then { + private _containerContents = (_loadout select _dataIndex) select 1; + + if (count _containerContents > 0) then { + + { + if (count _x == 2) then { + + if ((_x select 0) isEqualType "") then { + + private _item = (_x select 0); + if (_item != "") then { + + private _uniqueBaseCfgText = getText (configFile >> "CfgWeapons" >> _item >> "ace_arsenal_uniqueBase"); + if (_uniqueBaseCfgText != "") then { + + _x set [0, _uniqueBaseCfgText]; + }; + }; + } else { + private _weapon = (_x select 0) select 0; + if (_weapon != "") then { + + private _baseWeapon = _weapon call BIS_fnc_baseWeapon; + if (_weapon != _baseWeapon) then { + (_x select 0)set [0, _baseWeapon]; + }; + }; + }; + }; + } foreach _containerContents; + }; + }; + }; + + case 9: { + for "_subIndex" from 0 to 4 do { + private _item = (_loadout select _dataIndex) select _subIndex; + + if (_item != "") then { + + private _uniqueBaseCfgText = getText (configFile >> "CfgWeapons" >> _item >> "ace_arsenal_uniqueBase"); + if (_uniqueBaseCfgText != "") then { + + (_loadout select _dataIndex) set [_subIndex, _uniqueBaseCfgText]; + }; + }; + }; + }; + }; +}; + private _loadoutIndex = (+(GVAR(defaultLoadoutsList))) findIf {(_x select 0) == _name}; if (_loadoutIndex == -1) then { GVAR(defaultLoadoutsList) pushBack [_name, _loadout]; diff --git a/addons/arsenal/functions/fnc_addRightPanelButton.sqf b/addons/arsenal/functions/fnc_addRightPanelButton.sqf new file mode 100644 index 00000000000..b906c13c4f4 --- /dev/null +++ b/addons/arsenal/functions/fnc_addRightPanelButton.sqf @@ -0,0 +1,55 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +/* + * Author: shukari, Schwaggot + * Adds a right panel button for uniforms, vests and backpacks with + * defined misc items. + * + * Arguments: + * 0: items only misc items + * 1: tooltip (Optional) + * 2: picture path (Optional) + * 3: override a spezific button (0-9) (Optional) + * + * Return Value: + * successful: number of the slot; error: -1 + * + * Example: + * [["ACE_bloodIV_500", "ACE_Banana"], "MedicalStuff", "\z\ace\addons\arsenal\data\iconCustom.paa", 5] call ace_arsenal_fnc_addRightPanelButton + * + * Public: Yes +*/ + +params [["_items", [], [[]]], ["_tooltip", "", [""]], ["_picture", QPATHTOF(data\iconCustom.paa), [""]], ["_override", -1, [0]]]; + +if (isNil QGVAR(customRightPanelButtons)) then { + GVAR(customRightPanelButtons) = []; +}; + +private _position = count GVAR(customRightPanelButtons); + +if (_override != -1 && {_override >= 0} && {_override <= 9}) then { + _position = _override; +} else { + private _emptyPos = GVAR(customRightPanelButtons) findIf {isNil "_x"}; + if (_emptyPos != -1) then { + _position = _emptyPos; + }; +}; + +private _return = -1; +if (_position >= 0 && _position <= 9) then { + private _cfgWeapons = configFile >> "CfgWeapons"; + _items = _items select { + private _configItemInfo = _cfgWeapons >> _x >> "ItemInfo"; + + _x isKindOf ["CBA_MiscItem", _cfgWeapons] && {getNumber (_configItemInfo >> "type") in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD]} || + {getNumber (_configItemInfo >> "type") in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} || + {getText (_cfgWeapons >> _x >> "simulation") == "ItemMineDetector"} + }; + + _return = _position; + GVAR(customRightPanelButtons) set [_position, [_items apply {toLower _x}, _picture, _tooltip]]; +}; + +_return diff --git a/addons/arsenal/functions/fnc_attributeAddCompatible.sqf b/addons/arsenal/functions/fnc_attributeAddCompatible.sqf new file mode 100644 index 00000000000..4f84f9624ca --- /dev/null +++ b/addons/arsenal/functions/fnc_attributeAddCompatible.sqf @@ -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 + * + * 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); diff --git a/addons/arsenal/functions/fnc_attributeCategory.sqf b/addons/arsenal/functions/fnc_attributeCategory.sqf new file mode 100644 index 00000000000..e0c0468f8ab --- /dev/null +++ b/addons/arsenal/functions/fnc_attributeCategory.sqf @@ -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 + * 1: Category + * + * 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); diff --git a/addons/arsenal/functions/fnc_attributeImport.sqf b/addons/arsenal/functions/fnc_attributeImport.sqf new file mode 100644 index 00000000000..ec56df4b569 --- /dev/null +++ b/addons/arsenal/functions/fnc_attributeImport.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles importing items list from clipboard into 3DEN attribute. + * + * Arguments: + * 0: Attribute controls group + * + * 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); diff --git a/addons/arsenal/functions/fnc_attributeLoad.sqf b/addons/arsenal/functions/fnc_attributeLoad.sqf index 439ec2ff365..355d5e113a8 100644 --- a/addons/arsenal/functions/fnc_attributeLoad.sqf +++ b/addons/arsenal/functions/fnc_attributeLoad.sqf @@ -34,4 +34,8 @@ if (_value select 1 > 0) then { (_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); diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf index 78e02431a43..17c89b5f363 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf @@ -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]]; diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf index 5009f46e3ad..a662b91eb18 100644 --- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf +++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf @@ -18,7 +18,7 @@ params ["_display", "_control"]; private _ctrlIDC = ctrlIDC _control; -if !(isNil QGVAR(currentLeftPanel)) then { +if (!isNil QGVAR(currentLeftPanel)) then { private _previousCtrlBackground = _display displayCtrl (GVAR(currentLeftPanel) - 1); _previousCtrlBackground ctrlSetFade 1; _previousCtrlBackground ctrlCommit FADE_DELAY; diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index a5f60c593c4..8cd64c73f21 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -19,7 +19,7 @@ params ["_display", "_control"]; private _ctrlIDC = ctrlIDC _control; // Fade old control background -if !(isNil QGVAR(currentRightPanel)) then { +if (!isNil QGVAR(currentRightPanel)) then { private _previousCtrlBackground = _display displayCtrl (GVAR(currentRightPanel) - 1); _previousCtrlBackground ctrlSetFade 1; _previousCtrlBackground ctrlCommit FADE_DELAY; @@ -78,7 +78,7 @@ private _compatibleMagazines = [[[], []], [[], []], [[], []]]; private _index = _forEachIndex; { - private _subIndex = _forEachIndex; + private _subIndex = _forEachIndex min 1; { ((_compatibleMagazines select _index) select _subIndex) pushBackUnique (configName (configFile >> "CfgMagazines" >> _x)) } foreach ([getArray (_weaponConfig >> _x >> "magazines"), getArray (_weaponConfig >> "magazines")] select (_x == "this")); @@ -273,9 +273,20 @@ switch (_ctrlIDC) do { }; case IDC_buttonMisc : { + // hide custom button items + private _blockItems = []; + if (!isNil QGVAR(customRightPanelButtons)) then { + { + if (!isNil "_x") then { + _blockItems append (_x select 0); + }; + } forEach GVAR(customRightPanelButtons); + }; + { ["CfgWeapons", _x, false] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 17); + } forEach ((GVAR(virtualItems) select 17) select {!((toLower _x) in _blockItems)}); + { ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; } foreach (GVAR(virtualItems) select 18); @@ -286,6 +297,20 @@ switch (_ctrlIDC) do { ["CfgGlasses", _x, false, true] call _fnc_fill_right_Container; } foreach (GVAR(virtualItems) select 24); }; + + default { + private _index = [RIGHT_PANEL_CUSTOM_BUTTONS] find _ctrlIDC; + if (_index != -1) then { + private _data = GVAR(customRightPanelButtons) param [_index]; + + if (!isNil "_data") then { + private _items = _data select 0; + { + ["CfgWeapons", _x, true] call _fnc_fill_right_Container; + } foreach ((GVAR(virtualItems) select 17) select {(toLower _x) in _items}); + }; + }; + }; }; (_display displayCtrl IDC_rightSearchbar) ctrlSetText ""; diff --git a/addons/arsenal/functions/fnc_handleStats.sqf b/addons/arsenal/functions/fnc_handleStats.sqf index 0c57f6c7211..26597716ea8 100644 --- a/addons/arsenal/functions/fnc_handleStats.sqf +++ b/addons/arsenal/functions/fnc_handleStats.sqf @@ -46,7 +46,7 @@ private _hideUnusedFnc = { } forEach _numbers; }; -if !(isNil "_itemCfg") then { +if (!isNil "_itemCfg") then { private _handleStatsFnc = { params ["_statsIndex", "_leftPanel"]; diff --git a/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf b/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf index df5d8a58044..220cb697f27 100644 --- a/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf +++ b/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf @@ -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; }; diff --git a/addons/arsenal/functions/fnc_message.sqf b/addons/arsenal/functions/fnc_message.sqf index 8fbd48748f9..f3e6abb3e6c 100644 --- a/addons/arsenal/functions/fnc_message.sqf +++ b/addons/arsenal/functions/fnc_message.sqf @@ -19,7 +19,7 @@ params ["_display", "_message"]; private _messageBoxCtrl = _display displayCtrl IDC_message; private _handle = _messageBoxCtrl getVariable QGVAR(messageBoxHandle); -if !(isNil "_handle") then { +if (!isNil "_handle") then { terminate _handle; }; diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index f4ad7dfed8c..554947df854 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -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; diff --git a/addons/arsenal/functions/fnc_onKeyDown.sqf b/addons/arsenal/functions/fnc_onKeyDown.sqf index a66ab3784d4..0c265873eb6 100644 --- a/addons/arsenal/functions/fnc_onKeyDown.sqf +++ b/addons/arsenal/functions/fnc_onKeyDown.sqf @@ -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. diff --git a/addons/arsenal/functions/fnc_onLoadoutsClose.sqf b/addons/arsenal/functions/fnc_onLoadoutsClose.sqf index 1b25ad49452..07af50139da 100644 --- a/addons/arsenal/functions/fnc_onLoadoutsClose.sqf +++ b/addons/arsenal/functions/fnc_onLoadoutsClose.sqf @@ -18,8 +18,6 @@ GVAR(currentLoadoutsTab) = nil; private _arsenalDisplay = findDisplay IDD_ace_arsenal; private _mouseBlockCtrl = _arsenalDisplay displayCtrl IDC_mouseBlock; -GVAR(cameraPosition) = GVAR(previousCameraPos); -GVAR(previousCameraPos) = nil; GVAR(loadoutsSearchbarFocus) = nil; GVAR(loadoutsPanelFocus) = nil; diff --git a/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf b/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf index d22124359d0..eb72087f897 100644 --- a/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf +++ b/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf @@ -30,9 +30,6 @@ GVAR(currentLoadoutsTab) = -1; GVAR(loadoutsSearchbarFocus) = false; GVAR(loadoutsPanelFocus) = false; -GVAR(previousCameraPos) = GVAR(cameraPosition); -GVAR(cameraPosition) = [5,0,20,[-0.85,0,0.85]]; - private _panelContentCtrl = _display displayCtrl IDC_contentPanel; _panelContentCtrl ctrlSetFontHeight (4.5 * GRID_H); _panelContentCtrl ctrlCommit 0; diff --git a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf index acc1d127416..375406930c7 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf @@ -23,10 +23,10 @@ private _display = ctrlParent _control; private _item = [_control lnbData [_curSel, 0], _control lbData _curSel] select !(ctrlType _control == 102); private _weaponDefaultRightPanel = _display displayCtrl IDC_buttonOptic; -private _selectCorrectPanelWeapon = [_weaponDefaultRightPanel, _display displayCtrl GVAR(currentRightPanel)] select (!(isNil QGVAR(currentRightPanel)) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2]}); +private _selectCorrectPanelWeapon = [_weaponDefaultRightPanel, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2]}); private _containerDefaultRightPanel = _display displayCtrl IDC_buttonMisc; -private _selectCorrectPanelContainer = [_containerDefaultRightPanel, _display displayCtrl GVAR(currentRightPanel)] select (!(isNil QGVAR(currentRightPanel)) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]}); +private _selectCorrectPanelContainer = [_containerDefaultRightPanel, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]}); private _fnc_clearPreviousWepMags = { private _compatibleMags = getArray (configfile >> "cfgweapons" >> _baseWeapon >> "magazines"); @@ -57,8 +57,12 @@ switch (GVAR(currentLeftPanel)) do { call _fnc_clearPreviousWepMags; private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; - GVAR(center) addWeaponGlobal _item; - GVAR(center) addWeaponItem [_item, [(getArray (configfile >> "cfgweapons" >> _item >> "magazines")) select 0]]; + private _cfgMags = configFile >> "CfgMagazines"; + private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; + GVAR(center) addWeapon _item; + if !(_compatibleMags isEqualTo []) then { + GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + }; { if (tolower _x in _compatibleItems || {_x in _compatibleMags}) then { @@ -95,8 +99,12 @@ switch (GVAR(currentLeftPanel)) do { call _fnc_clearPreviousWepMags; private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; - GVAR(center) addWeaponGlobal _item; - GVAR(center) addWeaponItem [_item, [(getArray (configfile >> "cfgweapons" >> _item >> "magazines")) select 0]]; + private _cfgMags = configFile >> "CfgMagazines"; + private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; + GVAR(center) addWeapon _item; + if !(_compatibleMags isEqualTo []) then { + GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + }; { if (tolower _x in _compatibleItems || {_x in _compatibleMags}) then { @@ -132,8 +140,12 @@ switch (GVAR(currentLeftPanel)) do { call _fnc_clearPreviousWepMags; private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; - GVAR(center) addWeaponGlobal _item; - GVAR(center) addWeaponItem [_item, [(getArray (configfile >> "cfgweapons" >> _item >> "magazines")) select 0]]; + private _cfgMags = configFile >> "CfgMagazines"; + private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; + GVAR(center) addWeapon _item; + if !(_compatibleMags isEqualTo []) then { + GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + }; { if (tolower _x in _compatibleItems || {_x in _compatibleMags}) then { @@ -295,7 +307,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 diff --git a/addons/arsenal/functions/fnc_onSelChangedRight.sqf b/addons/arsenal/functions/fnc_onSelChangedRight.sqf index a2d83dceba3..38e051b4e21 100644 --- a/addons/arsenal/functions/fnc_onSelChangedRight.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedRight.sqf @@ -42,6 +42,7 @@ private _fnc_selectItem = { case 19: { if (_item == "") then { + if (cba_disposable_replaceDisposableLauncher && !isNil {cba_disposable_LoadedLaunchers getVariable secondaryWeapon GVAR(center)}) exitWith { TRACE_1("ignoring unload of disposable",secondaryWeapon GVAR(center)); }; GVAR(center) removeSecondaryWeaponItem ((GVAR(currentItems) select 19) select _itemIndex); private _secondaryMags = secondaryWeaponMagazine GVAR(center); GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + ([_secondaryMags + [""], _secondaryMags] select (count _secondaryMags > 1))]; @@ -70,7 +71,7 @@ private _fnc_selectItem = { [ _item, - 18 + ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find GVAR(currentLeftPanel)), + 18 + ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find GVAR(currentLeftPanel)), [IDC_buttonMuzzle, IDC_buttonItemAcc, IDC_buttonOptic, IDC_buttonBipod, IDC_buttonCurrentMag, IDC_buttonCurrentMag2] find GVAR(currentRightPanel) ] call _fnc_selectItem; diff --git a/addons/arsenal/functions/fnc_removeBox.sqf b/addons/arsenal/functions/fnc_removeBox.sqf index ed4ec7de4d5..7620529ef3e 100644 --- a/addons/arsenal/functions/fnc_removeBox.sqf +++ b/addons/arsenal/functions/fnc_removeBox.sqf @@ -23,7 +23,7 @@ if (isNull _object || {isNil QGVAR(EHIDArray)}) exitWith {}; if (_global && {isMultiplayer}) then { private _ID = (GVAR(EHIDArray) select {_x select 1 == _object}) select 0; - if !(isNil "_ID") then { + if (!isNil "_ID") then { [_ID select 0] call CBA_fnc_removeGlobalEventJIP; GVAR(EHIDArray) deleteAt (GVAR(EHIDArray) find _ID); publicVariable QGVAR(EHIDArray); diff --git a/addons/arsenal/functions/fnc_scanConfig.sqf b/addons/arsenal/functions/fnc_scanConfig.sqf index fdb73c72ef6..2bddbf4c5c9 100644 --- a/addons/arsenal/functions/fnc_scanConfig.sqf +++ b/addons/arsenal/functions/fnc_scanConfig.sqf @@ -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; }; diff --git a/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf b/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf index 141cc262ad7..1cd3f149c35 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf @@ -23,7 +23,12 @@ private _fireModes = getArray (_config >> "modes"); private _dispersion = []; { - _dispersion pushBackUnique log (getNumber (_config >> _x >> "dispersion")); + if (getNumber (_config >> _x >> "showToPlayer") != 0) then { + private _n = log (getNumber (_config >> _x >> "dispersion")); + + if (!finite _n) then {_n = 0;}; + _dispersion pushBackUnique _n; + }; } foreach _fireModes; _dispersion sort true; diff --git a/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf b/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf index 8e2bd5fef81..6b268a3e56c 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf @@ -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; diff --git a/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf b/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf new file mode 100644 index 00000000000..feaec392762 --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Text statement for the explosion time stat. + * + * Arguments: + * 0: Stats Array (not used) + * 1: Item Config + * + * Return Value: + * Stat Text + * + * Example: + * [_stats, _config] call ace_arsenal_fnc_statTextStatement_explosionTime + * + * Public: No + */ + +params ["", "_config"]; + +private _ammoConfig = configFile >> "CfgAmmo" >> getText (_config >> "ammo"); +private _timeToLive = getNumber (_ammoConfig >> "timeToLive"); +private _explosionTime = getNumber (_ammoConfig >> "explosionTime"); + +if (_explosionTime > _timeToLive) exitWith { + "-" // Handle IR grenades +}; + +if (_explosionTime == -1) exitWith { + localize LSTRING(DetonatesOnImpact) +}; + +format ["%1s", _explosionTime] diff --git a/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf b/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf index 46f66fd52ad..edc6fafc9b2 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf @@ -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)] diff --git a/addons/arsenal/functions/fnc_verifyLoadout.sqf b/addons/arsenal/functions/fnc_verifyLoadout.sqf index e7ce4fe0a67..12509333bb8 100644 --- a/addons/arsenal/functions/fnc_verifyLoadout.sqf +++ b/addons/arsenal/functions/fnc_verifyLoadout.sqf @@ -211,7 +211,7 @@ for "_dataIndex" from 0 to 9 do { }; case 9: { - for "_subIndex" from 0 to 4 do { + for "_subIndex" from 0 to 5 do { private _item = (_loadout select _dataIndex) select _subIndex; if (_item != "") then { diff --git a/addons/arsenal/missions/Arsenal.VR/CfgEventHandlers.hpp b/addons/arsenal/missions/Arsenal.VR/CfgEventHandlers.hpp index 0f36260026c..6e90665ffc8 100644 --- a/addons/arsenal/missions/Arsenal.VR/CfgEventHandlers.hpp +++ b/addons/arsenal/missions/Arsenal.VR/CfgEventHandlers.hpp @@ -1,3 +1,4 @@ +// These files are from the VR mission, not the base addon folder class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call compile preprocessFileLineNumbers 'XEH_preInit.sqf'); diff --git a/addons/arsenal/missions/Arsenal.VR/XEH_preInit.sqf b/addons/arsenal/missions/Arsenal.VR/XEH_preInit.sqf index 329d5fd1a5f..6d6acca865c 100644 --- a/addons/arsenal/missions/Arsenal.VR/XEH_preInit.sqf +++ b/addons/arsenal/missions/Arsenal.VR/XEH_preInit.sqf @@ -1,4 +1,6 @@ #include "script_component.hpp" +INFO("Loading VR Mission"); + PREP(onPause); PREP(createTarget); diff --git a/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf b/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf index 7ff1ea58e6e..30eac04a7f3 100644 --- a/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf +++ b/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf @@ -52,6 +52,10 @@ _target setVariable ["origin", _position]; _target addEventHandler ["killed", { params ["_target"]; + + // Killed may fire twice, 2nd will be null - https://github.com/acemod/ACE3/pull/7561 + if (isNull _target) exitWith { TRACE_1("Ignoring null death",_target); }; + private _position = _target getVariable ["origin", position _target]; private _varName = vehicleVarName _target; diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index 55860165f27..f92d10b8791 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -3,18 +3,24 @@ Hide + Ocultar Cacher Verstecken Ukryj - 非表示 + 隠す Nascondere 숨김 隱藏 隐藏 + Спрятать + Ocultar + Skrýt + Gizle Hide interface - Cache l'interface + Ocultar interfaz + Masque l'interface Oberfläche verstecken Ukryj interfejs インターフェイスを隠す @@ -22,10 +28,15 @@ 인터페이스 숨기기 隱藏介面 隐藏介面 + Скрыть интерфейс + Oculta a Interface + Skrýt rozhraní + Arayüzü gizle Loadouts - Équipements + Equipamiento + Sets d'équipement Ausrüstungen Zestawy wyposażenia 装備 @@ -33,31 +44,46 @@ 로드아웃 裝備 装备 + Комплекты + Loadouts + Sady vybavení + Kıyafetler Export + Exportar Exporter Exportieren Eksportuj - 出力 + エクスポート Esporta 내보내기 匯出 汇出 + Экспорт + Exportar + Export + Dışa Aktar Import + Importar Importer Importieren Importuj - 取込 + インポート Importa 가져오기 匯入 汇入 + Импорт + Importar + Import + Içe Aktar Close + Cerrar Fermer Schließen Zamknij @@ -66,21 +92,30 @@ 닫기 關閉 关闭 + Закрыть + Fechar + Zavřít + Kapat No virtual item available - Aucun objet virtuel disponible + Ningún objeto virtual disponible + Aucun objet virtuel disponible. Kein virtuelles Objekt verfügbar Brak dostępnych przedmiotów wirtualnych - 利用可能なバーチャル アイテムは無し + 利用可能なバーチャル アイテムはありません Nessun oggetto virtuale disponibile 가상장비 사용 불가 沒有可用的虛擬物品 没有可用的虚拟物品 + Виртуальный предмет недоступен + Nenhum item virtual disponível + Není dostupný žádný virtuální předmět Save - Enregister + Guardar + Enregistrer Speichern Zapisz 保存 @@ -88,10 +123,15 @@ 저장 保存 保存 + Сохранить + Salvar + Uložit + Kaydet Save the current loadout - Enregistre l'équipement actuel + Guardar el equipamiento actual + Enregistre l'équipement actuel. Ausgewählte Ausrüstung speichern Zapisz obecny zestaw 現在の装備を保存します @@ -99,9 +139,27 @@ 현재 로드아웃 저장 保存當前的裝備 保存当前的装备 + Сохранить текущий комплект экипировки + Salva o loadout atual + Uložit současnou sadu vybavení + Geçerli kıyafetleri kaydet + + + [Shift+Click to save to mission defaults] + [Shift+Click para guardar equipamiento predefinido + [Umschalt+Linksklick um als Standard-Missionsausrüstung zu speichern] + [Shift + クリック] でミッション標準として保存します + Shift + Klik aby zapisac jako domyślne dla misji + [Shift+Клик, чтобы сохранить в настройках по умолчанию] + [Shift+Clique para salvar nos padrões da missão] + [Shift+Clic pour enregistrer en tant qu'équipement prédéfini.] + [Shift+左鍵來保存至任務預設] + [Shift+Click per salvare la missione con gli equipaggiamenti predefiniti] + [Shift+Klik pro uložení jako standardního vybavení pro misi] Rename + Renombrar Renommer Umbenennen Zmień nazwę @@ -110,10 +168,15 @@ 이름바꾸기 重新命名 重新命名 + Переименовать + Renomear + Přejmenovat + Yeniden adlandır Rename the selected loadout - Renomme l'équipement sélectionné + Renombrar el equipamiento seleccionado + Renomme le set d'équipement sélectionné. Ausgewählte Ausrüstung umbenennen Zmień nazwę wybranego zestawu 選択中の装備を改名します @@ -121,9 +184,14 @@ 선택한 로드아웃의 이름 바꾸기 重新命名當前選擇的裝備 重新命名当前选择的装备 + Переименовать выбранный комплект экипировки + Renomeia o loadout selecionado + Přejmenovat vybranou sadu vybavení + Seçili kıyafetleri yeniden adlandır Load + Cargar Charger Laden Wczytaj @@ -132,10 +200,15 @@ 불러오기 載入 载入 + Загрузить + Carregar + Nahrát + Yükle Load the selected loadout - Charger l'équipement sélectionné + Cargar el equipamiento seleccionado + Charge le set d'équipement sélectionné. Ausgewählte Ausrüstung laden Wczytaj wybrany zestaw 選択中の装備を読み込みます @@ -143,9 +216,14 @@ 선택한 로드아웃 불러오기 載入當前選擇的裝備 载入当前选择的装备 + Загрузить выбранный комплект экипировки + Carrega o loadout selecionado + Nahrát vybranou sadu vybavení + Seçili kıyafetleri yükle Delete + Eliminar Supprimer Entfernen Skasuj @@ -154,10 +232,15 @@ 삭제 刪除 删除 + Удалить + Apagar + Smazat + Sil Delete the selected loadout - Supprimer l'équipement sélectionné + Eliminar el equipamiento seleccionado + Supprime le set d'équipement sélectionné. Ausgewählte Ausrüstung entfernen Skasuj wybrany zestaw 選択中の装備を削除します @@ -165,9 +248,14 @@ 선택한 로드아웃 삭제하기 刪除當前選擇的裝備 删除当前选择的装备 + Удалить выбранный комплект экипировки + Apaga o loadout selecionado + Smazat vybranou sadu vybavení + Seçili kıyafetleri sil My loadouts + Mis equipamientos Mes équipements Meine Ausrüstungen Moje zestawy @@ -176,10 +264,15 @@ 내 로드아웃 我的裝備 我的装备 + Мои комплекты + Meus loadouts + Moje sady vybavení + Benim kıyafetlerim Loadouts saved in your profile - Équipements enregistrés dans votre profil + Equipamientos guardados en el perfil + Sets d'équipement enregistrés dans votre profil. Ausrüstungen, die in deinem Profil gespeichert sind Zestawy zapisane w Twoim profilu プロフィールに保存された装備です @@ -187,10 +280,15 @@ 프로필에 저장된 로드아웃 裝備已保存到你的設定檔中 装备已保存到你的设定档中 + Комплекты экипировки, сохраненные в вашем профиле + Loadouts salvos em seu perfil + Sadz vybavení uložené ve vašem profilu + Profiline kaydedilmiş kıyafetlerin Default loadouts - Équipements de base + Equipamientos por defecto + Équipements prédéfinis Standard-Ausrüstungen Domyślne zestawy 標準の装備 @@ -198,10 +296,15 @@ 기본 로드아웃 預設裝備 预设装备 + По умолчанию + Loadouts padrões + Standardní sady vybavení + Varsayılan Kıyafetler Loadouts made available by the mission maker - Équipements faits par l'auteur de la mission + Equipamientos disponibles del editor de la misión + Sets d'équipement mis à disposition par le créateur de mission. Ausrüstungen, die durch den Missionsersteller zur Verfügung gestellt worden sind Zestawy udostępnione przez twórcę misji 装備はミッション著者によって利用できます @@ -209,9 +312,13 @@ 미션메이커가 허용한 로드아웃 任務作者提供的預設裝備 任务作者提供的预设装备 + Комплекты экипировки, предоставляемые создателем миссии + Loadouts definidos pelo criador da missão + Sady vybavení od autora mise Public loadouts + Equipamientos públicos Équipements publics Veröffentlichte Ausrüstungen Publiczne zestawy @@ -220,10 +327,15 @@ 공용 로드아웃 公用裝備 公用装备 + Публичные комплекты + Loadouts públicos + Veřejné sady vybavení + Herkese Açık Kıyafetler Loadouts shared by you and other players - Équipements mis à disposition par vous ou les autres joueurs + Equipamientos compartidos por ti y otros jugadores + Sets d'équipement partagés par vous-même ou par d'autres joueurs. Ausrüstungen, die von dir und anderen Spielern geteilt wurden Zestawy udostępnione przez Ciebie i innych graczy 自分か他人によって共有された装備です @@ -231,9 +343,14 @@ 플레이어들이 공유하는 로드아웃 由你與其他玩家分享的裝備配置 由你与其他玩家分享的装备配置 + Комплекты экипировки, опубликованные вами и другими игроками + Loadouts compartilhados por você ou outros jogadores + Sady vybavení sdílené vámi a ostatními hráči + Senin veya diğer kişiler tarafından paylaşılan kıyafetler Sort by weight + Ordenar por peso Trier par poids Nach Gewicht sortieren Sortuj wg wagi @@ -242,9 +359,14 @@ 무게로 정렬 以重量排序 以重量排序 + Сортировка по весу + Ordenar por peso + Seřadit podle váhy + Kiloya göre sırala Sort by amount + Ordenar por cantidad Trier par quantité Nach Menge sortieren Sortuj wg ilości @@ -253,10 +375,15 @@ 갯수로 정렬 以數量排序 以数量排序 + Сортировка по количеству + Ordenar por quantidade + Seřadit podle množství + Miktara göre sırala Share or stop sharing the selected loadout - Partager ou arrêter de partager cet équipement + Compartir o dejar de compartir el equipamiento seleccionado + Partager ou cesser de partager le set d'équipement sélectionné. Ausgewählte Ausrüstung teilen oder nicht mehr teilen Udostępnij lub przestań udostępniać wybrany zestaw 選択した装備の共有設定 @@ -264,9 +391,14 @@ 선택한 로드아웃 공유 혹은 공유중지 開始/停止分享當前選擇的裝備 开始/停止分享当前选择的装备 + Открыть или закрыть общий доступ к комплекту экипировки + Compartilhar ou parar de compartilhar o loadout selecionado + Sdílet nebo přestat sdílet vybranou sadu vybavení + Seçili kıyafeti paylaş ya da paylaşmayı durdur. Private + Privado Privé Privat Prywatny @@ -275,9 +407,14 @@ 개인 私用 私用 + Приватный + Privado + Soukromé + Özel Public + Público Public Öffentlich Publiczny @@ -286,10 +423,15 @@ 공용 公用 公用 + Публичный + Público + Veřejné + Herkese Açık The default loadouts list is empty! - La liste d'équipements de base est vide ! + La lista de equipamientos por defecto está vacía! + La liste des équipements prédéfinis est vide ! Die Standard-Ausrüstungen-Liste ist leer! Lista domyślnych zestawów jest pusta! 標準の装備一欄が空です! @@ -297,21 +439,30 @@ 기본 로드아웃 목록이 비어있습니다! 沒有預設的裝備清單! 没有预设的装备清单! + Список комплекта экипировки пуст! + A lista de loadouts padrões está vazia! + Seznam standardních sad vybavení je prázdný! + Varsayılan kıyafetler listesi boş ! Default loadouts list exported to clipboard - Liste d'équipements de base exportée dans le presse papier + Lista de equipamientos por defecto exportada al portapapeles + Liste des équipements prédéfinis exportée dans le presse-papier. Standard-Ausrüstungen-Liste in die Zwischenablage exportiert Lista domyślnych zestawów została eksportowana do schowka - 標準の装備一欄はクリップボードへ出力されました + 標準の装備一欄はクリップボードへエクスポートされました La lista degli equipaggiamenti standard è stata esportata negli appunti 클립보드에 기본 로드아웃 목록 내보내기 預設的裝備清單已匯出到剪貼簿中 预设的装备清单已汇出到剪贴簿中 + Список комплекта экипировки по умолчанию экспортирован в буфер + A lista de loadouts padrões foi exportada pra área de transferência + Seznam standardních sad vybavení byl exportován do schránky Current loadout exported to clipboard - Équipement actuel exporté dans le presse papier + Equipamiento actual exportado al portapapeles + Équipement actuel exporté dans le presse-papier. Derzeitige Ausrüstung in die Zwischenablage exportiert Obecny zestaw został eksportowany do schowka 現在の装備はクリップボードへ出力されました @@ -319,10 +470,14 @@ 현재 로드아웃을 클립보드로 내보냈습니다. 當前的裝備已匯出到剪貼簿中 当前的装备已汇出到剪贴簿中 + Текущий список комплекта экипировки экспортирован в буфер + Loadout atual foi exportado pra área de transferência + Současná sada vybavení byla exportována do schránky Wrong format provided - Mauvais format fourni + Formato incorrecto proporcionado + Mauvais format fourni. Falsches Format verwendet Podano zły format 間違ったフォーマットが入力されました @@ -330,32 +485,44 @@ 잘못된 형식 입력됨 提供的格式錯誤 提供的格式错误 + Неверный формат импорта + Format incorreto fornecido + Byl dodán špatný formát Default loadouts list imported from clipboard - Liste d'équipements de base importée depuis le presse papier + Lista de equipamientos importada desde el portapapeles + Liste des équipements prédéfinis importée depuis le presse-papier. Standard-Ausrüstungen-Liste aus der Zwischenablage importiert Lista domyślnych zestawów została importowana ze schowka - 標準の装備一欄はクリップボードから取込されました + 標準の装備一欄はクリップボードからインポートされました La lista degli equipaggiamenti standard è stata importata dagli appunti 클립보드에서 기본 로드아웃 가져오기 預設的裝備清單已從剪貼簿中匯入 预设的装备清单已从剪贴簿中汇入 + Список комплекта экипировки по умолчанию импортирован из буфера + A lista de loadouts padrões foi importada da área de transferência + Seznam standardních sad vybavení byl importován ze schránky Loadout imported from clipboard - Équipement importé depuis le presse papier + Equipamiento importado del portapapeles + Set d'équipement importé depuis le presse-papier. Ausrüstung aus der Zwischenablage importiert Zestaw został importowany ze schowka - 装備はクリップボードから取込されました + 装備はクリップボードからインポートされました Equipaggiamento importato dagli appunti 클립보드에서 로드아웃을 가져왔습니다. 裝備已從剪貼簿中匯入 装备已从剪贴簿中汇入 + Список комплекта экипировки импортирован из буфера + Loadout importado da área de transferência + Sada vybavení byla importována ze schránky The following loadout was deleted: - L'équipement suivant fut supprimé: + El siguiente equipamiento ha sido eliminado: + Le set d'équipement suivant a été supprimé : Folgende Ausrüstung wurde entfernt: Następujący zestaw został skasowany: 次の装備は削除されました: @@ -363,10 +530,15 @@ 다음 로드아웃이 삭제됨 : 以下的裝備已被刪除: 以下的装备已被删除: + Удален комплект экипировки: + O seguinte loadout foi apagado: + Tato sada vybavení byla smazána: + Bu kıyafet silindi: The following loadout is not public anymore: - L'équipement suivant n'est plus public: + El siguiente equipamiento ha dejado de ser público: + Le set d'équipement suivant n'est plus public : Folgende Ausrüstung ist nicht mehr öffentlich: Następujący zestaw nie jest już publiczny: 次の装備は非公開になりました: @@ -374,21 +546,31 @@ 다음 로드아웃이 더이상 공용이 아님: 以下的裝備已不再被分享: 以下的装备已不再被分享: + Этот комплект экипировки больше не публичный: + O seguinte loadout não é mais público: + Tato sada vybavení již není veřejná: + Bu kıyafet artık herkese açık değil : The name field is empty! - Le champ nom est vide ! + El campo de nombre está vacío! + Le champ "nom" est vide ! Das Feld "Name" ist leer! Pole nazwy jest puste! - 名前欄が空白です! + 名前が空白です! Il campo del nome è vuoto! 이름칸이 비었습니다! 名稱欄位為空! 名称栏位为空! + Поле имени пустое! + O nome não pode estar vazio! + Pole "Jméno" je prázdné! + Isim alanı boş! You are the author of this loadout - Vous êtes l'auteur de cet équipement + Tú eres el autor de este equipamiento + Vous êtes l'auteur de ce set d'équipement. Du bist der Ersteller dieser Ausrüstung Jesteś autorem tego zestawu あなたはこの装備の作者です @@ -396,10 +578,15 @@ 이 로드아웃의 제작자입니다. 你是這個裝備的作者 你是这个装备的作者 + Вы автор этого комплекта экипировки + Você é o autor desse loadout + Jste autorem této sady vybavení + Bu kıyafetin sahibi sensin A loadout of yours with the same name is public - Un de vos équipements avec le même nom est public + Un equipamiento tuyo con el mismo nombre ya es público + Un de vos sets d'équipement ayant le même nom est public. Eine deiner Ausrüstungen mit dem gleichen Namen ist öffentlich Jeden z Twoich zestawów nazwany tak samo jest już publiczny あなたの装備は既に公開されているものと同名です @@ -407,10 +594,15 @@ 같은 이름의 로드아웃이 공용에 있습니다. 已有相同名稱的裝備在公用分享區 已有相同名称的装备在公用分享区 + Ваш комплект экипировки с таким же именем является публичным + Um loadout seu com o mesmo nome é público + Vaše sada vybavení se stejným jménem je veřejná + Bu kıyafetler zaten aynı isim de paylaşılmış. The following loadout was saved: - L'équipement suivant fut enregistré: + El siguiente equipamiento ha sido guardado: + Le set d'équipement suivant a été enregistré : Folgende Ausrüstung wurde gespeichert: Następujący zestaw został zapisany: 次の装備は保存されました: @@ -418,10 +610,15 @@ 다음 로드아웃이 저장됨: 以下的裝備已被保存: 以下的装备已被保存: + Сохранен комплект экипировки: + O seguinte loadout foi salvo: + Tato sada vybavení byla uložena: + Bu kıyafet kaydedildi: The following loadout was loaded: - L'équipement suivant fut chargé: + El siguiente equipamiento ha sido cargado: + Le set d'équipement suivant a été chargé : Folgene Ausrüstung wurde geladen: Następujący zestaw został wczytany: 次の装備が読み込みされました: @@ -429,10 +626,15 @@ 다음 로드아웃을 불러옴: 以下的裝備已被載入: 以下的装备已被载入: + Загружен комплект экипировки: + O seguinte loadout foi carregado: + Tato sada vybavení byla načtena: + Bu kıyafet yüklendi: A loadout with the same name already exist! - Un équipement avec le même nom existe déjà ! + Ya existe un equipamiento con el mismo nombre! + Un set d'équipement ayant le même nom existe déjà ! Eine Ausrüstung mit dem gleichen Namen existiert bereits! Zestaw z tą nazwą już istnieje! 既にその名前は装備に使われています! @@ -440,20 +642,30 @@ 같은 이름의 로드아웃이 이미 존재합니다! 已有相同名稱的裝備! 已有相同名称的装备! + Комплект с таким именем уже существует! + Um loadout com o mesmo nome já existe! + Již existuje sada vybavení se stejným jménem! + Aynı isim de başka kıyafetler var! was renamed to - fut renommé en + ha sido renombrado a + a été renommé en wurde umbenannt in zmienił nazwę na - 次の名前に改名されました + 次の名前に変更されました E' stato rinominato in 이름이 다음과 같이 변경됨: 已被改名為 已被改名为 + был переименован в + foi renameado para + bylo přejmenováno na + değişti, yeni isim Invert camera controls + Invertir controles de cámara Inverser les contrôles de la caméra Kamerasteuerung invertieren Odwróć sterowanie kamerą @@ -462,9 +674,14 @@ 카메라 조종 반전 反轉攝影機控制 反转摄影机控制 + Инвертировать управление камерой + Inverter controles da câmera + Obrátit ovládání kamery + Kamera kontrollerini ters çevir Enable mod icons + Habilitar iconos de mods Afficher les icônes de mod Aktiviert Mod-Icons Włącz ikony modów @@ -473,10 +690,15 @@ 모드 아이콘 허가 啟用模組圖示 启用模组图示 + Включить иконки модов + Ativar ícones de mods + Zapnout ikony modů + Mod simgelerini etkinleştir Panel font height - taille de police des panneaux + Tamaño de fuente del panel + Taille de police des panneaux Schrifthöhe für die linke und rechte Liste Wysokość czcionki パネルにあるフォントの高さ @@ -484,10 +706,15 @@ 패널 폰트 높이 面板字體高度 面板字体高度 + Размер шрифта панели + Altura da fonte do painel + Výška fontu panelů + Panel yazı tipi büyüklüğü Allow default loadouts - Activer l'onglet équipement de base + Permitir equipamientos por defecto + Autoriser les équipements prédéfinis Erlaubt die Benutzung der Standardausrüstungen Zezwól na użycie domyślnych zestawów 標準の装備を許可 @@ -495,10 +722,14 @@ 기본 로드아웃 허용 允許預設裝備 允许预设装备 + Разрешить комплекты по умолчанию + Permitir loadouts padrões + Povolit standardní sady vybavení Allow loadout sharing - Autoriser le partage d'équipement + Permitir compartir equipamientos + Autoriser le partage des sets d'équipement Erlaubt das Teilen von Ausrüstungen Zezwól na udostępnianie zestawów 装備の共有を許可 @@ -506,10 +737,14 @@ 로드아웃 공유 허용 允許分享裝備 允许分享装备 + Разрешить публикацию комплектов + Permitir compartilhar loadouts + Povolit sdílení sad vybavení Log missing / unavailable items - Enregistrer les objets manquants + Registrar los objetos no encontrados o no disponibles + Consigner les objets manquants ou indisponibles Aktiviert die Aufzeichnung fehlender Gegenstände in der RPT Rejestruj brakujące / niedostępne przedmioty 欠落 / 利用不可アイテムを記録 @@ -517,9 +752,14 @@ 누락 된 항목 / 사용 할 수 없는 항목 기록 記錄遺失/無法使用的項目 记录遗失/无法使用的项目 + Вести журнал недоступных предметов + Registrar em log itens indisponíveis/não encontrados + Zalogovat chybějící/nedostupné předměty + Kayıp / mevcut olmayan öğeleri günlüğe kaydet Primary magazine + Cargador principal Chargeur principal Główny magazynek プライマリ弾倉 @@ -528,9 +768,14 @@ Primärmagazin 主要武器彈匣 主要武器弹匣 + Основной магазин + Carregador Primário + Hlavní zásobník + Birinci Cephane Secondary magazine + Cargador secundario Chargeur secondaire Dodatkowy magazynek セカンダリ弾倉 @@ -539,9 +784,14 @@ Sekundärmagazin 次要武器彈匣 次要武器弹匣 + Вторичный магазин + Carregador Secundário + Vedlejší zásobník + Ikinci Cephane ACE Arsenal + ACE Arsenal ACE Arsenal ACE-Arsenal ACE Arsenał @@ -550,10 +800,15 @@ ACE 아스날 ACE虛擬軍火庫 ACE虚拟军火库 + ACE Арсенал + ACE Arsenal + ACE Arzenál + ACE Arsenal Allow the use of the default loadouts tab - Autorise l'usage de l'onglet équipements de base + Permitir el uso de la pestaña de equipamientos por defecto + Active l'onglet "Équipements prédéfinis". Zezwól na użycie zakładki domyślnych zestawów 標準の装備タブの使用を許可します Consenti l'uso della sezione per gli equipaggiamenti standard @@ -561,10 +816,14 @@ Erlaube die Nutzung des Standardausrüstungsreiters 允許使用預設的裝備 允许使用预设的装备 + Разрешить использование вкладки комплектов экипировки по умолчанию + Permite o uso da aba de loadouts padrões + Povolit používání záložky standardních sad vybavení Show / hide mod icons for the left panel - Montrer / cacher les icones de mod pour le panneau de gauche + Mostrar / ocultar iconos de mods en el panel izquierdo + Affiche/masque les icônes de mod du panneau gauche. Pokaż / ukryj ikony modów w lewym panelu 左パネルにある MOD アイコンの表示 / 非表示をします Mostra / nascondi le icone delle mod dal pannello sinistro @@ -572,10 +831,15 @@ Zeigt/Versteckt Mod-Symbole in der linken Leiste 在左面板中顯示/隱藏模組圖示 在左面板中显示/隐藏模组图示 + Показать / скрыть значки модов в левой панели + Mostra / Esconde os ícones de mods no painel esquerdo + Ukázat/Skrýt ikony modů v levém panelu + Sol panel de mod ikonlarını göster/gizle Change the font height for text in the left / right panels - Change la taille de police du texte des panneaux gauche / droite + Cambiar el tamaño de fuente para el texto de los paneles izquierdo y derecho + Change la taille de police des panneaux latéraux. Zmień wysokość czcionki dla tekstu lewego i prawego panelu 右か左パネルにあるフォントの高さを変更します。 Cambia l'altezza del font per il testo sul pannello sinistro / destro @@ -583,10 +847,15 @@ Ändert die Schriftgröße für die linke/rechte Leiste 變更左/右面板中的字體高度 变更左/右面板中的字体高度 + Изменить размер шрифта для текста в левой / правой панелях + Muda o tamanho da fonte para os textos nos painéis esquerdo e direito + Změnit výšku fontu pro text v levém/pravém panelu + Sağ ve sol panel de ki yazıların boyutunu değiştir. Log missing / unavailable items in the RPT - Enregistre les objets manquants / indisponibles dans le RPT + Registrar elementos no encontrados o no disponibles en el RPT + Consigne les objets manquants ou indisponibles dans le RPT. Rejestruj brakujące / niedostępne przedmioty do pliku RPT PRT で欠落 / 利用不可アイテムを記録します Log mancante / oggetto non disponibile nell' RPT @@ -594,10 +863,15 @@ Fehlende Gegenstände werden in der RPT aufgezeichnet 記錄遺失/無法使用的項目到RPT檔案中 记录遗失/无法使用的项目到RPT档案中 + Вести журнал отсутствующих / недоступных предметов в RPT + Registrar em log itens indisponíveis no RPT + Zalogovat chybějící/nedostupné předměty do RPT logu + Kayıp / mevcut olmayan öğeleri RPT'nin içine kaydet. Unable to open ACE arsenal - Impossible d'ouvrir ACE arsenal + No es posible abrir el arsenal de ACE + Impossible d'ouvrir l'arsenal ACE. Kann ACE-Arsenal nicht anzeigen Impossibile aprire l'arsenale ACE ACE 武器庫を開けません @@ -605,10 +879,15 @@ 無法開啟ACE虛擬軍火庫 无法开启ACE虚拟军火库 Nie można otworzyć arsenału ACE + Невозможно открыть ACE Арсенал + Não foi possível abrir o ACE Arsenal + Nepodařilo se otevřít ACE Arzenál + ACE Arsenal açılamıyor Import BI VA loadouts to ACE Arsenal - Importe les loadouts de BI VA dans ACE Arsenal + Importar equipamientos de BI Arsenal hacia el arsenal de ACE + Importer les sets BI VA dans l'arsenal ACE Importiert die BI-VA-Ausrüstungen in das ACE-Arsenal 標準の VA 装備から ACE 武器庫へ取り込み 바닐라 로드아웃을 ace 아스날로 가져오기 @@ -616,10 +895,14 @@ 汇入BI原厂虚拟军火库的装备到ACE虚拟军火库中 Importa l'arsenale virtuale BI nell'arsenale ACE Importuj zestawy wyposażenia z wirtualnego arsenału BI do arsenału ACE + Импорт комплектов из Арсенала BI в Арсенал ACE + Importar loadouts do BIS Arsenal para o ACE Arsenal + Importovat sady vybavení z BI VA do ACE Arzenálu No player unit available! Place a unit and mark it as "Player". - Aucune unité joueur disponible ! Placez une unité et marquez la en tant que "joueur". + Ninguna unidad de jugador disponible! Coloca una unidad y márcala como "Jugador". + Aucune unité joueur disponible ! Placez une unité et marquez-la en tant que "joueur". Keine Spielereinheit verfügbar. Setze eine Einheit und markiere sie als "Spieler". プレイヤー ユニットがありません!ユニットを設置し"Player"と名付けてください。 플레이어 유닛을 사용할 수 없습니다! 유닛을 놓고 "플레이어"라고 표시하십시오. @@ -627,20 +910,28 @@ 没有可用的玩家单位!请摆放一个单位并设定成"玩家"。 Non ci sono giocatori! Poisziona una unità e impostala come "Giocatore". Brak dostępnych jednostek gracza! Postaw jednostkę i oznacz ją jako "Gracz". + Нет доступных игроков! Разместите юнит и отметьте его как «Игрок» + Nenhuma unidade de jogador disponível! Coloque uma unidade e marque como "Player". + Žádná jednotka hráče není dostupná! Umístěte jednotku a nastavte ji jako "Hráč". No loadouts to import. - Aucun loadout à importer. + No hay equipamientos para importar. + Aucun équipement à importer. Keine Ausrüstungen zum Importieren - 取り込みする装備がありません。 + インポートする装備がありません。 가져올 로드 아웃이 없습니다. 沒有裝備被匯入 没有装备被汇入。 Non ci sono equipaggiamenti da importare. Brak zestawów wyposażenia do zaimportowania. + Нет комплектов для импорта + Nenhum loadout para importar. + Žádné sadz vybavení k importu. ACE Arsenal + ACE Arsenal ACE-Arsenal ACE 武器庫 ACE 아스날 @@ -648,9 +939,15 @@ ACE虚拟军火库 Arsenale ACE Arsenał ACE + ACE Арсенал + ACE Arsenal + Arsenal ACE + ACE Arzenál + ACE Arsenal Return to ACE Arsenal. + Volver al arsenal de ACE Zurück zum ACE-Arsenal. ACE 武器庫へ戻ります。 ACE 아스날로 돌아가기 @@ -658,9 +955,15 @@ 返回到ACE虚拟军火库。 Torna all'arsenale ACE Wróć do arsenału ACE. + Вернуться в ACE Арсенал + Voltar para o ACE Arsenal + Retour à l'arsenal ACE + Vrátit se do ACE Arzenálu + ACE Arsenal'e dön. Use ACE Arsenal to try out different weapons and equipment. + Usar el arsenal de ACE para probar diferentes armas y equipamiento. Verwende ACE-Arsenal und sieh dir verschiedene Waffen und Ausrüstung an und probiere sie aus. 様々な武器と装備を試せるよう ACE 武器庫を使用します。 ACE Arsenal을 사용하여 다른 무기와 장비를 시험해보십시오. @@ -668,9 +971,14 @@ 使用ACE虚拟军火库来尝试不同的武器与装备。 Usa l'arsenale ACE per provare armi ed equipaggiamenti vari. Skorzystaj z arsenału ACE by wypróbować broń i ekwipunek. + Используйте ACE Arsenal, чтобы опробовать различное оружие и снаряжение. + Use o ACE Arsenal para experimentar diferentes armas e equipamentos. + Utilisez l'arsenal ACE pour essayer différentes armes ou équipements. + Použijte ACE Arzenál k vyzkoušní různých zbraní a výbavy. Try weapons and equipment and create your own loadouts. + Probar armas y equipo y crear tus propios equipamientos. Probiere verschiedene Waffen und Ausrüstung aus und stelle dir eigene Ausrüstungsprofile zusammen. 様々な武器と装備を試して、あなただけの装備を作成してください。 무기와 장비를 사용해보고 자신의 로드아웃을 만듭니다. @@ -678,42 +986,68 @@ 尝试不同的武器与装备来组合你个人的装备配置。 Prova armi ed equipaggiamenti e creai i tuoi equipaggiamenti personalizzati. Wypróbuj broń i ekwipunek i stwórz swoje własne zestawy wyposażenia. + Опробуйте оружие и снаряжение, создавайте собственные комплекты экипировки. + Experimente armas e equipamentos e crie seus próprios loadouts. + Essayez des armes et du matériel et créez vos propres sets d'équipement. + Vyzkoušejte zbraně a výbavu a vytvořte si vlastní sady vybavení. Open the loadouts screen - Affiche la page des équipements + Abrir la pantalla de equipamientos + Öffnet das Ausrüstungsmenü + Affiche les sets d'équipement. 開啟裝備選單 开启装备选单 装備画面を開く Apri la pagina degli equipaggiamenti Otwórz ekran zestawów + Открыть окно комплектов экипировки + Abre a tela de loadouts + Otevřít obrazovku se sadami vybavení + Kıyafetler ekranını aç Export current / default loadouts - Exporte l'équipement actuel ou la liste d'équipements de base + Exportar el equipamiento actual / predefinido + Exportiert aktuelles / standard Loadout + Exporte le set d'équipement actuel/les sets prédéfinis. 匯出當前/預設的裝備 汇出当前/预设的装备 - 現在 / 標準装備を出力 + 現在/標準装備をエクスポートします Esporta l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base Eksportuj obecne / domyślne zestawy wyposażenia + Экспорт комплектов экипировки + Exporta loadout atual / loadouts padrões + Exportovat současný/standardní sady vybavení Import current / default loadouts - Importer l'équipement actuel ou la liste d'équipements de base + Importar el equipamiento actual / predefinido + Importiert aktuelles / standard Loadout + Importe le set d'équipement actuel/les sets prédéfinis. 匯入當前/預設的裝備 汇入当前/预设的装备 - 現在 / 標準装備を取込 + 現在/標準装備をインポートします Importa l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base Importuj obecne / domyślne zestawy wyposażenia + Импорт комплектов экипировки + Importa loadout atual / loadouts padrões + Importovat současný/standardní sady vybavení Potassium levels + Niveles de potasio + Kaliumspiegel Taux de potassium カリウム レベル 钾水平 鉀水平 Ilvello di potassio Poziomy potasu + Уровень Калия + Níveis de Potássio + Úrovně draslíku + Potasyum seviyeleri Magnification @@ -725,7 +1059,7 @@ Увеличение Vergrößerung Zvětšení - Aumentox + Aumento 배율 放大倍数 拡大倍率 @@ -733,74 +1067,128 @@ Nightvision Support + Soporte de visión nocturna Nachtsicht Unterstützung - 暗視装置に対応 + 暗視装置への対応有無 Wsparcie noktowizyjne Supporto visore notturno + Поддержка ночного видения + Suporte de Visão Noturna + Support JVN + 夜視鏡支援 + Podpora nočního vidění + Gece Görüş Desteği Primary supported + Primaria soportada Primär unterstützt プライマリが対応 Wspierane przez broń główną Primario supportato + Поддерживается осн. прицелом + Primária suportada + Primaire supportée + 主武器支援 + Hlavní část hledí podporuje Secondary supported + Secundaria soportada Sekundär unterstützt セカンダリが対応 Wspierane przez broń drugorzędną Secondario supportato + Поддерживается доп. прицелом + Secundária suportada + Secondaire supportée + 次要武器支援 + Vedlejší část hledí podporuje Primary integrated + Primaria integrada Primär Integriert プライマリに内蔵 Zintegrowane z bronią główną Primario integrato + Интегрирован в осн. прицел + Primária integrada + Primaire intégrée + 整合主武器 + Integrováno do hlavní části hledí Not Supported + No soportada Nicht unterstützt セカンダリに内蔵 Nie wspierane Non supportato + Не поддерживается + Não suportado + Non supporté + 不支援 + Není podporováno + Desteklenmiyor Page + Página + Seite Page ページ 页面 頁面 Pagina Strona + Стр. + Página + Stránka + Sayfa Enable the faces / voices / insignias tabs - Activer les onglets faces / voix / insignes + Habilitar las pestañas de caras / voces / insignias + Aktiviere die Gesichter-, Stimmen- und Abzeichenübersicht + Activer les onglets visages/voix/insignes 顔 / 声 / 記章タブを有効化 启用脸谱/声音/徽章/选项 啟用臉譜/聲音/徽章選項 Abilita volti, voci e insegne Aktywuj zakładki twarz / głos / insygnia + Включить вкладки Лиц / Голосов / Знаков различия + Ativar as abas de rostos / vozes / insígnias + Povolit záložky s tvářemi, hlasy a insigniemi + Yüzler/sesler/peçler bölmelerini etkinleştir Empty the selected container + Vaciar el contenedor seleccionado + Aktuellen Container leeren Vider le conteneur selectionné 選択されたコンテナは空です 选择的箱子是空的 清空選擇的箱子 Svuota il contenitore selezionato Opróżnij wybrany pojemnik + Очистить контейнер + Esvaziar o cointâiner selecionado + Vyprázdnit vybraný nosič Exported class name to clipboard - Nom de classe exporté dans le presse papier - クリップボードへクラスネームを出力 + Exportar el nombre de clase al portapapeles + Der Klassenname wurde in die Zwischenablage exportiert + Nom de classe exporté dans le presse papier. + クリップボードへクラスネームをエクスポート 将种类复制到剪贴板 輸出 class name 到剪貼簿上 Copiato il nome della classe negli appunti Wyeksportowano nazwę klasy do schowka + Имя класса, экспортированного в буфер + O nome da classe foi exportado para a área de transferência + Jméno třídy exportováno do schránky Mode @@ -820,11 +1208,11 @@ Whitelist - Biała lista + Biała lista (lista wybranych) Lista blanca Whitelist Seznam povolených - Lista branca + Lista Branca Liste blanche Fehérlista Вайтлист @@ -833,12 +1221,21 @@ 화이트리스트 白名單 白名单 + Beyaz Liste Blacklist + Lista negra + Blacklist 禁止リスト Lista Nera - Czarna lista + Czarna lista (lista wykluczeń) + Чёрный список + Lista Negra + Liste noire + 黑名單 + Seznam zakázaných + Kara Liste Items @@ -858,16 +1255,82 @@ Export current items list as an array for use in scripts - スクリプト用に現在のアイテム リストをアレイで出力します + Exportar la lista actual de objetos como una tabla para su uso en scripts + Exportiert aktuelle Gegenstände als Array, um es in Scripten zu verwenden + スクリプト用に現在のアイテム リストをアレイでエクスポートします Esporta l'attuale lista di elementi come un array, per essere usati negli script Eksportuj obecną listę przedmiotów jako tablicę do wykorzystania w skryptach + Exportar a lista atual de itens como uma matriz para usar em scripts + Экспорт текущего списка предметов в виде массива для использования в скриптах + Exporte l'équipement actuel dans le presse-papier, sous la forme d'un tableau à utiliser dans les scripts. + 匯出目前的物品列表為陣列用於腳本編寫 + Exportovat současný seznam předmětů jako pole pro použití ve skriptech + + + Import items list array from clipboard (should be the same format as export) + Importar tabla de lista de objetos desde el portapapeles (debe ser el mismo formato que la lista exportada) + Importiert alles aus der Zwischenablage (Sollte im gleichen Format sein, wie beim Exportieren) + Zaimportuj listę przedmiotów ze schowka (lista musi być w tym samym formacie jak przy exporcie) + クリップボードからアイテムリストをアレイでインポートします (エクスポートと同じフォーマットである必要があります) + Импорт массива списка предметов из буфера (должен иметь тот же формат, что при экспорте) + Importar lista de itens da área de transferência (deve estar no mesmo formato que uma lista exportada) + Importe un tableau d'équipements depuis le presse-papier (le format doit être identique à celui de l'exportation). + 從剪貼簿匯入物品列表之陣列(應該與匯出的格式一樣) + Importa elenco appunti (deve essere nello stesso formato di un elenco esportato) + Importovat pole se seznamem předmětů ze schránky (měl by být ve stejném formátu jako export) + + + Add Compatible Items + Añadir objetos compatibles + Füge kompatible Gegenstände hinzu + Dodaj kompatybilne przedmioty + 対応アイテムを追加 + Добавить совместимые предметы + Adicionar itens compatíveis + Ajouter des objets compatibles + 增加相容的物品 + Aggiungi Oggetti Compatibili + Přidat kompatibilní předměty + + + Will automatically add compatible attachments or magazines (based on selected category) for all weapons in current items list + Añade automáticamente accesorios o cargadores (de la categoría seleccionada) a todas las armas de la lista de objetos + Es werden automatisch kompatible Aufsätze oder Magazine für alle ausgewählten Waffen hinzugefügt + Automatycznie doda kompatybilne dodatki oraz magazynki (odpowiednio do każdej kategorii) dla wszystkich broni na liście + 現在のアイテム リスト内にある全武器に対応するアタッチメントと弾倉 (選択したカテゴリに基づき) を自動的に追加します + Добавляет совместимые приспособления или магазины (в зависимости от выбранной категории) для всего оружия в текущем списке предметов + Irá automaticamente adicionar acessórios ou carregadores (baseado na categoria selecionada) para todas as armas na lista de itens atual + Ajoute automatiquement des accessoires ou des chargeurs compatibles (en fonction de la catégorie sélectionnée), pour toutes les armes de la liste actuelle. + 將會自動增加相容的配件以及彈匣(基於選擇的類型)至妳目前物品列表中的全部武器 + Aggiungerà automaticamente accessori o caricatori (in base alla categoria selezionata) per tutte le armi nell'elenco degli oggetti correnti + Automaticky přídá kompatibilní zásobníky (na základě vybrané kategorie) ro všechny zbraně v současném seznamu předmětů Time to live - Durée de vie - 生存時間 + Tiempo de vida + Lebenszeit + Durée d'expiration + 有効時間 Czas by żyć Scadenza (TTL) + Время действия + Time to live + 有效時間 + Time to live + Bitme Süresi + + + Fuse Time + Retard avant détonation + Задержка детонации + Opoźnienie zapalnika + + + Detonates on impact + Aufschlagzünder + Détonation à l'impact + Детонация от удара + Detonuj przy uderzeniu diff --git a/addons/arsenal/ui/RscAttributes.hpp b/addons/arsenal/ui/RscAttributes.hpp index 2794e42119f..7f452a55eb7 100644 --- a/addons/arsenal/ui/RscAttributes.hpp +++ b/addons/arsenal/ui/RscAttributes.hpp @@ -787,7 +787,7 @@ class GVAR(display) { colorBackground[]={0,0,0,1}; fade=1; enable=0; - x = QUOTE(safezoneW + safezoneX - 13 * GRID_W); + x = QUOTE(safezoneW + safezoneX - 13 * GRID_W); y = QUOTE(safezoneY + 8 * GRID_H); w = QUOTE(12 * GRID_W); h = QUOTE(9 * GRID_H); @@ -798,7 +798,7 @@ class GVAR(display) { text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemOptic_ca.paa"; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillRightPanel)); colorBackground[]={0,0,0,0.5}; - x = QUOTE(safezoneW + safezoneX - 10 * GRID_W); + x = QUOTE(safezoneW + safezoneX - 10 * GRID_W); y = QUOTE(safezoneY + 8 * GRID_H); w = QUOTE(9 * GRID_W); h = QUOTE(9 * GRID_H); @@ -903,6 +903,7 @@ class GVAR(display) { tooltip="$STR_A3_RscDisplayArsenal_tab_CargoMisc"; y = QUOTE(safezoneY + 88 * GRID_H); }; + class buttonRemoveAll: ctrlButtonPicture { idc = IDC_buttonRemoveAll; text = QPATHTOF(data\iconClearContainer.paa); @@ -911,7 +912,7 @@ class GVAR(display) { onButtonClick = QUOTE(ctrlParent (_this select 0) call FUNC(buttonClearAll)); fade=1; enable=0; - x = QUOTE(safezoneW + safezoneX - 11 * GRID_W); + x = QUOTE(safezoneW + safezoneX - 11 * GRID_W); y = QUOTE(safeZoneH + safezoneY - 29 * GRID_H); w = QUOTE(9 * GRID_W); h = QUOTE(9 * GRID_H); @@ -926,7 +927,7 @@ class GVAR(loadoutsDisplay) { class controls { class centerBox: ctrlControlsGroupNoScrollbars { idc = IDC_centerBox; - x = QUOTE(safezoneW + safezoneX - (180 * GRID_W)); + x = QUOTE(safezoneW + safezoneX - (180 * GRID_W)); y = QUOTE(safezoneY + (5 * GRID_H)); w = QUOTE(160 * GRID_W); h = QUOTE(safezoneH - (34 * GRID_H)); @@ -1056,7 +1057,7 @@ class GVAR(loadoutsDisplay) { }; class buttonClose: ctrlButton { idc = -1; - x = QUOTE(safezoneW + safezoneX - 32 * GRID_W); + x = QUOTE(safezoneW + safezoneX - 32 * GRID_W); y = QUOTE(safezoneH + safezoneY - 9 * GRID_H); w = QUOTE(30 * GRID_W); h = QUOTE(7 * GRID_H); diff --git a/addons/arsenal/ui/RscCustomArsenalButton.hpp b/addons/arsenal/ui/RscCustomArsenalButton.hpp new file mode 100644 index 00000000000..7f0a1393748 --- /dev/null +++ b/addons/arsenal/ui/RscCustomArsenalButton.hpp @@ -0,0 +1,22 @@ +class GVAR(customArsenalButton_Button) : RscButtonArsenal { + x = QUOTE(safezoneW + safezoneX - 10 * GRID_W); + y = QUOTE(safezoneY + 88 * GRID_H); + w = QUOTE(9 * GRID_W); + h = QUOTE(9 * GRID_H); + + text = QPATHTOF(data\iconCustom.paa); + tooltip = ""; + onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillRightPanel)); + colorBackground[] = {0,0,0,0.5}; +}; + +class GVAR(customArsenalButton_Background) : ctrlStaticBackground { + x = QUOTE(safezoneW + safezoneX - 13 * GRID_W); + y = QUOTE(safezoneY + 88 * GRID_H); + w = QUOTE(12 * GRID_W); + h = QUOTE(9 * GRID_H); + + colorBackground[] = {0,0,0,1}; + fade = 1; + enable = 0; +}; diff --git a/addons/artillerytables/$PBOPREFIX$ b/addons/artillerytables/$PBOPREFIX$ new file mode 100644 index 00000000000..090539769ec --- /dev/null +++ b/addons/artillerytables/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\artillerytables diff --git a/addons/artillerytables/CfgEventHandlers.hpp b/addons/artillerytables/CfgEventHandlers.hpp new file mode 100644 index 00000000000..e90bed419e7 --- /dev/null +++ b/addons/artillerytables/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/artillerytables/CfgMagazines.hpp b/addons/artillerytables/CfgMagazines.hpp new file mode 100644 index 00000000000..e6abdcf06e1 --- /dev/null +++ b/addons/artillerytables/CfgMagazines.hpp @@ -0,0 +1,6 @@ +class CfgMagazines { + class 32Rnd_155mm_Mo_shells; + class 8Rnd_82mm_Mo_shells: 32Rnd_155mm_Mo_shells { + GVAR(airFriction) = -0.0001; + }; +}; diff --git a/addons/artillerytables/CfgVehicles.hpp b/addons/artillerytables/CfgVehicles.hpp new file mode 100644 index 00000000000..04424e6079f --- /dev/null +++ b/addons/artillerytables/CfgVehicles.hpp @@ -0,0 +1,7 @@ +class CfgVehicles { + class StaticWeapon; + class StaticMortar: StaticWeapon { + // Small mortars seem to need the alternate elevation calculations, + GVAR(showGunLaying) = 2; + }; +}; diff --git a/addons/artillerytables/CfgWeapons.hpp b/addons/artillerytables/CfgWeapons.hpp new file mode 100644 index 00000000000..7c4d408673a --- /dev/null +++ b/addons/artillerytables/CfgWeapons.hpp @@ -0,0 +1,15 @@ +class CfgWeapons { + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + + class ACE_artilleryTable: ACE_ItemCore { + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(rangetable_displayName); + descriptionShort = CSTRING(rangetable_description); + picture = QPATHTOF(UI\icon_rangeTable.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 0.5; + }; + }; +}; diff --git a/addons/artillerytables/README.md b/addons/artillerytables/README.md new file mode 100644 index 00000000000..3e52ba9946b --- /dev/null +++ b/addons/artillerytables/README.md @@ -0,0 +1,14 @@ +ace_artillerytables +========== + +Universal artillery rangetables. + +#### Items Added: +`ACE_artilleryTable` + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/artillerytables/RscRangeTable.hpp b/addons/artillerytables/RscRangeTable.hpp new file mode 100644 index 00000000000..8c673537d60 --- /dev/null +++ b/addons/artillerytables/RscRangeTable.hpp @@ -0,0 +1,96 @@ +class GVAR(rangeTableDialog) { + idd = -1; + movingEnable = 1; + onLoad = QUOTE(with uiNameSpace do { GVAR(rangeTableDialog) = _this select 0 };); + objects[] = {}; + + class ControlsBackground { + class TableBackground: RscPicture { + idc = -1; + text = QPATHTOF(UI\RangeTable_background.paa); + x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "16.2634559672906 * (safeZoneH / 40)"; + h = "23 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {1,1,1,1}; + }; + class LeftSideBackground: RscText { + idc = -1; + x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "5 * (safeZoneH / 40)"; + h = "23 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.8}; + }; + }; + class controls { + class TheTable: RscListNBox { + idc = IDC_TABLE; + x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "16.2634559672906 * (safeZoneH / 40)"; + h = "20.24 * ((safeZoneH / 1.2) / 25)"; + columns[] = {(10/867),(86/867),(171/867),(238/867),(320/867),(405/867),(485/867),(546/867),(607/867),(668/867),(729/867),(790/867)}; + rowHeight = 0.015 * safeZoneH; + sizeEx = "0.014 * safeZoneH"; + font = "EtelkaMonospacePro"; + drawSideArrows = 1; + idcLeft = -1; + idcRight = -1; + colorText[] = {0, 0, 0, 1}; + shadow = "0"; + colorSelectBackground[] = {0, 0, 0, 0.025}; + colorSelectBackground2[] = {0, 0, 0, 0.025}; + colorScrollbar[] = {0.95,0,0.95,1}; + class ListScrollBar: ScrollBar{ + color[] = {0,0,0,0.6}; + }; + }; + class ChargeListBox: RscListbox { + idc = IDC_CHARGELIST; + style = ST_RIGHT; + x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "2 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "5 * (safeZoneH / 40)"; + h = "22 * ((safeZoneH / 1.2) / 25)"; + onLBSelChanged = QUOTE([] call FUNC(rangeTableUpdate)); + }; + class elevationHigh: ctrlButton { + idc = IDC_BUTTON_ELEV_HIGH; + text = "High"; + onButtonClick = QUOTE([true] call FUNC(rangeTableUpdate)); + x = "13.1 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "1.1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "2.3 * (safeZoneH / 40)"; + h = "0.8 * ((safeZoneH / 1.2) / 25)"; + }; + class elevationLow: elevationHigh { + idc = IDC_BUTTON_ELEV_LOW; + text = "Low"; + onButtonClick = QUOTE([false] call FUNC(rangeTableUpdate)); + x = "15.6 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + }; + class CloseBackground: RscText { + idc = -1; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "0.5 * (safeZoneH / 40)"; + h = "0.5 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.5}; + }; + class CloseActiveText: RscActiveText { + idc = -1; + style = 48; + color[] = {1,1,1,0.7}; + text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)"; + w = "0.5 * (safeZoneH / 40)"; + h = "0.5 * ((safeZoneH / 1.2) / 25)"; + colorText[] = {1,1,1,0.7}; + colorActive[] = {1,1,1,1}; + tooltip = "Close"; + onButtonClick = "closeDialog 0"; + }; + }; +}; diff --git a/addons/artillerytables/RscTitles.hpp b/addons/artillerytables/RscTitles.hpp new file mode 100644 index 00000000000..0da1131bc89 --- /dev/null +++ b/addons/artillerytables/RscTitles.hpp @@ -0,0 +1,42 @@ +class RscTitles { + class GVAR(modeDisplay) { + idd = -1; + onLoad = QUOTE(with uiNameSpace do { GVAR(display) = _this select 0 };); + movingEnable = 0; + duration = 60; + fadeIn = "false"; + fadeOut = "false"; + class controls { + class ModeControlGroup: RscControlsGroupNoScrollbars { + idc = IDC_MODECONTROLGROUP; + x = "3.8 * (((safezoneW / safezoneH) min 1.2) / 40) + (profilenamespace getvariable ['IGUI_GRID_WEAPON_X',((safezoneX + safezoneW) - (10 * (((safezoneW / safezoneH) min 1.2) / 40)) - 4.3 * (((safezoneW / safezoneH) min 1.2) / 40))])"; + y = "2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safezoneY + 0.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))])"; + w = "10 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + + class controls { + class Charge: RscText { + idc = IDC_CHARGE; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0, 0, 0, 0}; + x = "0"; + y = "0"; + w = "(2) * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + sizeEx = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + class Azimuth: Charge { + idc = IDC_AZIMUTH; + x = "(2) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "(3) * (((safezoneW / safezoneH) min 1.2) / 40)"; + }; + class Elevation: Azimuth { + idc = IDC_ELEVATION; + x = "(5) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + }; + }; + + }; + }; +}; diff --git a/addons/artillerytables/UI/RangeTable_background.paa b/addons/artillerytables/UI/RangeTable_background.paa new file mode 100644 index 00000000000..bf4b5ee0440 Binary files /dev/null and b/addons/artillerytables/UI/RangeTable_background.paa differ diff --git a/addons/artillerytables/UI/icon_rangeTable.paa b/addons/artillerytables/UI/icon_rangeTable.paa new file mode 100644 index 00000000000..9273b849d73 Binary files /dev/null and b/addons/artillerytables/UI/icon_rangeTable.paa differ diff --git a/addons/artillerytables/XEH_PREP.hpp b/addons/artillerytables/XEH_PREP.hpp new file mode 100644 index 00000000000..7ef48b61dd8 --- /dev/null +++ b/addons/artillerytables/XEH_PREP.hpp @@ -0,0 +1,8 @@ +TRACE_1("prep",_this); + +PREP(firedEH); +PREP(interactMenuOpened); +PREP(rangeTableOpen); +PREP(rangeTableUpdate); +PREP(turretChanged); +PREP(turretPFEH); diff --git a/addons/artillerytables/XEH_postInit.sqf b/addons/artillerytables/XEH_postInit.sqf new file mode 100644 index 00000000000..2f31655814f --- /dev/null +++ b/addons/artillerytables/XEH_postInit.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" + +["ace_settingsInitialized", { + TRACE_2("ace_settingsInitialized",GVAR(advancedCorrections),GVAR(disableArtilleryComputer)); + + if (hasInterface) then { + // Add hud overlay for actuall azimuth and elevation: + GVAR(pfID) = -1; + ["turret", LINKFUNC(turretChanged), true] call CBA_fnc_addPlayerEventHandler; + + // Add ability to dynamically open rangetables: + ["ace_interactMenuOpened", LINKFUNC(interactMenuOpened)] call CBA_fnc_addEventHandler; + }; + + if (GVAR(advancedCorrections)) then { + ["LandVehicle", "init", { + params ["_vehicle"]; + private _vehicleCfg = configFile >> "CfgVehicles" >> typeOf _vehicle; + // config "ace_artillerytables_applyCorrections" [0 disabled, 1 enabled] falls back to artilleryScanner + private _applyCorrections = if (isNumber (_vehicleCfg >> QGVAR(applyCorrections))) then { + getNumber (_vehicleCfg >> QGVAR(applyCorrections)) + } else { + getNumber (_vehicleCfg >> "artilleryScanner") + }; + if (_applyCorrections == 1) then { + TRACE_2("adding firedEH",_vehicle,configName _vehicleCfg); + _vehicle addEventHandler ["Fired", {call FUNC(firedEH)}]; + }; + }, true, [], true] call CBA_fnc_addClassEventHandler; + }; +}] call CBA_fnc_addEventHandler; + +#ifdef DEBUG_MODE_FULL +#include "dev\showShotInfo.sqf" +#include "dev\checkConfigs.sqf" +#endif diff --git a/addons/artillerytables/XEH_preInit.sqf b/addons/artillerytables/XEH_preInit.sqf new file mode 100644 index 00000000000..9361d05015e --- /dev/null +++ b/addons/artillerytables/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/disposable/XEH_preStart.sqf b/addons/artillerytables/XEH_preStart.sqf similarity index 100% rename from addons/disposable/XEH_preStart.sqf rename to addons/artillerytables/XEH_preStart.sqf diff --git a/addons/artillerytables/config.cpp b/addons/artillerytables/config.cpp new file mode 100644 index 00000000000..4f5048e5ae3 --- /dev/null +++ b/addons/artillerytables/config.cpp @@ -0,0 +1,44 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +class ACE_Extensions { + class ace_artillerytables { + windows = 1; + client = 1; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" + + +// Common UI Stuff: +class RscText; +class RscListbox; +class RscListNBox; +class RscPicture; +class RscControlsGroup; +class RscControlsGroupNoScrollbars; +class ScrollBar; +class RscActiveText; +class RscStructuredText; +class ctrlButton; + +#include "RscTitles.hpp" +#include "RscRangeTable.hpp" + diff --git a/addons/artillerytables/dev/checkConfigs.sqf b/addons/artillerytables/dev/checkConfigs.sqf new file mode 100644 index 00000000000..91627edbf62 --- /dev/null +++ b/addons/artillerytables/dev/checkConfigs.sqf @@ -0,0 +1,20 @@ +diag_log text "-------------------------------------------"; +INFO("Showing entries with custom configs"); +diag_log text "-------------------------------------------"; + + +private _fnc_showPropertyDefined = { + params ["_configBase", "_configProperty"]; + + private _customAll = configProperties [_configBase, 'isClass _x && {isNumber (_x >> _configProperty)}', true]; + private _customExplicit = _customAll select {!([] isEqualTo configProperties [_x, 'configName _x == _configProperty', false])}; + diag_log text format ["%1 with custom %2: %3 Explicit, %4 Total]", configName _configBase, _configProperty, count _customExplicit, count _customAll]; + diag_log text format [" - Defined: %1", _customExplicit apply {configName _x}]; + diag_log text format [" - Inherited: %1", _customAll apply {[configName _x, getNumber (_x >> _configProperty)]}]; +}; + +[configFile >> "CfgMagazines", QGVAR(airFriction)] call _fnc_showPropertyDefined; +[configFile >> "CfgVehicles", QGVAR(showGunLaying)] call _fnc_showPropertyDefined; +[configFile >> "CfgVehicles", QGVAR(applyCorrections)] call _fnc_showPropertyDefined; + +diag_log text "-------------------------------------------"; diff --git a/addons/artillerytables/dev/showShotInfo.sqf b/addons/artillerytables/dev/showShotInfo.sqf new file mode 100644 index 00000000000..81a29dca22c --- /dev/null +++ b/addons/artillerytables/dev/showShotInfo.sqf @@ -0,0 +1,47 @@ +// #include "\z\ace\addons\artillerytables\script_component.hpp" + +INFO("showing shot info"); + +["LandVehicle", "fired", { + params ["_shooter", "", "", "", "_ammo", "", "_proj"]; + ((velocity _proj) call CBA_fnc_vect2Polar) params ["_mag", "_dir", "_elev"]; + private _shootPos = getPosASL _shooter; + if (_dir < 0) then {_dir = _dir + 360;}; + + private _offsetElev = _elev - (missionNamespace getVariable [QGVAR(predictedElevation), -999]); + private _offsetAz = _dir - (missionNamespace getVariable [QGVAR(predictedAzimuth), -999]); + + hintSilent format ["%1 m/s\nAz: %2 [%3]\nEl: %4 [%5]\nError Az: %6\nError EL: %7",_mag toFixed 1, _dir toFixed 2, ((6400 / 360) * _dir) toFixed 0, _elev toFixed 2, ((6400 / 360) * _elev) toFixed 0, + _offsetAz toFixed 3, _offsetElev toFixed 3]; + TRACE_2("",_offsetAz,_offsetElev); + private _submunitionAmmo = getText (configFile >> "CfgAmmo" >> _ammo >> "submunitionAmmo"); + + [{ + params ["_proj", "_shootPos", "_lastPos", "_submunitionAmmo"]; + if ((isNull _proj) && {_submunitionAmmo != ""}) then { + _proj = nearestObject [_lastPos, _submunitionAmmo]; + _this set [0, _proj]; + }; + if (isNull _proj) exitWith {true}; + _this set [2, getPosASL _proj]; + false + }, { + params ["", "_shootPos", "_lastPos"]; + private _mkrB = createMarker [format ["shotInfo-%1-%2",_shootPos,_lastPos], _lastPos]; + _mkrB setMarkerType "mil_dot"; + _mkrB setMarkerColor "ColorGreen"; + _mkrB setMarkerSize [0.5,0.5]; + private _diff = _lastPos vectorDiff _shootPos; + _mkrB setMarkerText format ["%1", _diff apply {round _x}]; + + private _dist2d = _shootPos distance2d _lastPos; + private _dir = _shootPos getDir _lastPos; + private _height = (_lastPos select 2) - (_shootPos select 2); + _mkrB setMarkerText format ["Dist: %1m Az: %2[%3] Height:%4", _dist2d toFixed 0, _dir toFixed 2, ((6400 / 360) * _dir) toFixed 0, _height toFixed 0]; + }, [_proj, _shootPos, [0,0,0], _submunitionAmmo]] call CBA_fnc_waitUntilAndExecute; + + private _mkrA = createMarker [format ["shotInfo-%1",_shootPos], _shootPos]; + _mkrA setMarkerType "mil_dot"; + _mkrA setMarkerColor "ColorRed"; + _mkrA setMarkerSize [0.5,0.5]; +}] call CBA_fnc_addClassEventHandler; diff --git a/addons/artillerytables/functions/fnc_firedEH.sqf b/addons/artillerytables/functions/fnc_firedEH.sqf new file mode 100644 index 00000000000..b2053136e89 --- /dev/null +++ b/addons/artillerytables/functions/fnc_firedEH.sqf @@ -0,0 +1,88 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Called when the mortar is fired. + * + * Arguments: + * 0: mortar - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * 7: gunner - Gunner + * + * Return Value: + * None + * + * Example: + * [bisFiredEH] call ace_artillerytables_fnc_firedEH + * + * Public: No + */ + +params ["_vehicle", "", "", "", "", "_magazine", "_projectile", "_gunner"]; +TRACE_4("firedEH",_vehicle,_magazine,_projectile,_gunner); + +if (!([_gunner] call EFUNC(common,isPlayer))) exitWith {}; // AI don't know how to use (this does give them more range than a player) +if ((gunner _vehicle) != _gunner) exitWith {}; // check if primaryGunner + + +// Get airFriction +private _airFriction = DEFAULT_AIR_FRICTION; +if (isNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(airFriction))) then { + _airFriction = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(airFriction)); +}; +TRACE_1("",_airFriction); +if (_airFriction >= 0) exitWith {}; // 0 disables everything, >0 makes no sense + +BEGIN_COUNTER(adjustmentsCalc); + +// Calculate air density +private _altitude = (getPosASL _vehicle) select 2; +private _temperature = _altitude call EFUNC(weather,calculateTemperatureAtHeight); +private _pressure = _altitude call EFUNC(weather,calculateBarometricPressure); +private _relativeHumidity = EGVAR(weather,currentHumidity); +private _airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); +private _relativeDensity = _airDensity / 1.225; +TRACE_5("Weather",_temperature,_pressure,_relativeHumidity,_airDensity,_relativeDensity); + +private _kFactor = _airFriction * _relativeDensity; +private _newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); +TRACE_2("",_kFactor,_newMuzzleVelocityCoefficent); + +// Apply powder effects +if (_newMuzzleVelocityCoefficent != 1) then { + private _bulletVelocity = velocity _projectile; + private _bulletSpeed = vectorMagnitude _bulletVelocity; + _bulletVelocity = (vectorNormalized _bulletVelocity) vectorMultiply (_bulletSpeed * _newMuzzleVelocityCoefficent); + _projectile setVelocity _bulletVelocity; +}; + + +[{ + params ["_projectile", "_kFactor", "_time"]; + + if (isNull _projectile) exitWith {true}; + + private _deltaT = CBA_missionTime - _time; + _this set[2, CBA_missionTime]; + + private _bulletVelocity = velocity _projectile; + private _trueVelocity = _bulletVelocity vectorDiff wind; + private _trueSpeed = vectorMagnitude _trueVelocity; + + private _drag = _deltaT * _kFactor * _trueSpeed; + private _accel = _trueVelocity vectorMultiply _drag; + // TRACE_3("",_bulletVelocity,_trueSpeed,_accel); + _bulletVelocity = _bulletVelocity vectorAdd _accel; + + _projectile setVelocity _bulletVelocity; + + false +}, { + // TRACE_1("done",_this); +}, [_projectile, _kFactor, CBA_missionTime]] call CBA_fnc_waitUntilAndExecute; + +END_COUNTER(adjustmentsCalc); diff --git a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf new file mode 100644 index 00000000000..849be932ce9 --- /dev/null +++ b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf @@ -0,0 +1,108 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Interaction menu opened, search for nearby artillery vehicles. + * + * Arguments: + * 0: Menu Type (1 is self interaction) + * + * Return Value: + * Can Open + * + * Example: + * [1] call ace_artillerytables_fnc_interactMenuOpened + * + * Public: No + */ + +params ["_menuType"]; +TRACE_1("interactMenuOpened",_menuType); + +if (_menuType != 1) exitWith {}; +if (!("ACE_artilleryTable" in (ace_player call EFUNC(common,uniqueItems)))) exitWith {}; + +private _vehicleAdded = ace_player getVariable [QGVAR(vehiclesAdded), []]; +private _rangeTablesShown = ace_player getVariable [QGVAR(rangeTablesShown), []]; +TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown); + +{ + private _vehicleCfg = configFile >> "CfgVehicles" >> typeOf _x; + // config "ace_artillerytables_showRangetable" [0 disabled, 1 enabled] falls back to artilleryScanner + private _showRangetable = if (isNumber (_vehicleCfg >> QGVAR(showRangetable))) then { + getNumber (_vehicleCfg >> QGVAR(showRangetable)) + } else { + getNumber (_vehicleCfg >> "artilleryScanner") + }; + if ((_showRangetable == 1) && {!(_x in _vehicleAdded)}) then { + private _vehicle = _x; + private _turret = []; + private _turretCfg = configNull; // find turret with artillery, will be one with primaryGunner = 1 (e.g. RHS PRP-3) + { + private _xTurretCfg = [_vehicleCfg, _x] call CBA_fnc_getTurret; + if ((getNumber (_xTurretCfg >> "primaryGunner")) == 1) exitWith { + _turret = _x; + _turretCfg = _xTurretCfg; + }; + } forEach allTurrets _vehicle; + TRACE_3("",_vehicle,configName _vehicleCfg,_turret); + if (isNull _turretCfg) exitWith { ERROR_1("no primaryGunner %1",configName _vehicleCfg); }; + if ((count _turret) != 1) then { WARNING_2("sub turret %1-%2",_typeOf,_turret); }; + + private _weaponsTurret = _vehicle weaponsTurret _turret; + if ((count _weaponsTurret) != 1) exitWith { WARNING_1("multiple weapons - %1",_typeOf); }; + private _weapon = _weaponsTurret select 0; + + private _turretAnimBody = getText (_turretCfg >> "animationSourceBody"); + private _turretAnimGun = getText (_turretCfg >> "animationSourceGun"); + + // For artillery with detached camera (I_Truck_02_MRL_F) need to use animationSourcePhase + // But that command won't always work, so fallback to animationPhase + private _currentElevRad = _vehicle animationSourcePhase _turretAnimGun; + if (isNil "_currentElevRad") then { _currentElevRad = _vehicle animationPhase _turretAnimGun; }; + private _currentTraverseRad = _vehicle animationSourcePhase _turretAnimBody; + if (isNil "_currentTraverseRad") then { _currentTraverseRad = _vehicle animationPhase _turretAnimBody; }; + + // Some turrets (MK6) have a neutralX rotation that we need to add to min/max config elevation to get actual limits + private _weaponDir = _vehicle weaponDirection _weapon; + private _turretRot = [vectorDir _vehicle, vectorUp _vehicle, deg _currentTraverseRad] call CBA_fnc_vectRotate3D; + private _neutralX = (acos ((_turretRot vectorCos _weaponDir) min 1)) - (deg _currentElevRad); // vectorCos can return values outside of -1..1 + _neutralX = (round (_neutralX * 10)) / 10; // minimize floating point errors + private _minElev = _neutralX + getNumber (_turretCfg >> "minElev"); + private _maxElev = _neutralX + getNumber (_turretCfg >> "maxElev"); + + private _applyCorrections = if (isNumber (_vehicleCfg >> QGVAR(applyCorrections))) then { + getNumber (_vehicleCfg >> QGVAR(applyCorrections)) + } else { + getNumber (_vehicleCfg >> "artilleryScanner") + }; + private _advCorrection = GVAR(advancedCorrections) && {_applyCorrections == 1}; + if ((missionNamespace getVariable [QEGVAR(mk6Mortar,airResistanceEnabled), false]) && {_vehicle isKindOf "Mortar_01_base_F"}) then { + _advCorrection = true; + }; + + // check weapon and limits in case different vehicles use the same weapon (cammo variants should still produce the same array) + private _info = [_weapon, _minElev, _maxElev, _advCorrection]; + + _vehicleAdded pushBack _vehicle; + ace_player setVariable [QGVAR(vehiclesAdded), _vehicleAdded]; + + private _index = _rangeTablesShown pushBackUnique _info; + TRACE_2("",_info,_index); + if (_index != -1) then { + private _statement = { + params ["", "", "_info"]; + TRACE_1("interaction statement",_info); + [FUNC(rangeTableOpen), _info] call CBA_fnc_execNextFrame; // delay a frame because of interaction menu closing dialogs + }; + private _condition = { + //IGNORE_PRIVATE_WARNING ["_player"]; + ("ACE_artilleryTable" in (_player call EFUNC(common,uniqueItems))) && {[_player, objNull, ["notOnMap", "isNotSitting", "isNotInside"]] call EFUNC(common,canInteractWith)} + }; + private _displayName = format ["%1%2", getText (_vehicleCfg >> "displayName"),["","*"] select _advCorrection]; + private _action = [format ['QGVAR(%1)',_index], _displayName, QPATHTOF(UI\icon_rangeTable.paa), _statement, _condition, {}, _info] call EFUNC(interact_menu,createAction); + [ace_player, 1, ["ACE_SelfActions", "ACE_Equipment"], _action] call EFUNC(interact_menu,addActionToObject); + TRACE_1("added action",_displayName); + ace_player setVariable [QGVAR(rangeTablesShown), _rangeTablesShown]; + }; + }; +} forEach (nearestObjects [ace_player, ["LandVehicle"], 25]); diff --git a/addons/artillerytables/functions/fnc_rangeTableOpen.sqf b/addons/artillerytables/functions/fnc_rangeTableOpen.sqf new file mode 100644 index 00000000000..754c10356c9 --- /dev/null +++ b/addons/artillerytables/functions/fnc_rangeTableOpen.sqf @@ -0,0 +1,87 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Opens the rangetable and fills the charge listbox. + * + * Arguments: + * 0: Weapon configname + * 1: Elevation Min (Deg) + * 2: Elevation Max (Deg) + * 3: Advanced Corrections Enabled + * + * Return Value: + * None + * + * Example: + * ["mortar_155mm_AMOS", -5, 80, true] call ace_artillerytables_fnc_rangeTableOpen + * + * Public: No + */ + +params ["_weaponName", "_elevMin", "_elevMax", "_advCorrection"]; +TRACE_4("rangeTableOpen",_weaponName,_elevMin,_elevMax,_advCorrection); + +BEGIN_COUNTER(rangeTableOpen); + +createDialog QGVAR(rangeTableDialog); +private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull]; +if (isNull _dialog) exitWith{ERROR("Dialog failed to open");}; +private _ctrlChargeList = _dialog displayCtrl IDC_CHARGELIST; +_dialog setVariable [QGVAR(elevMin),_elevMin]; +_dialog setVariable [QGVAR(elevMax),_elevMax]; +_dialog setVariable [QGVAR(advCorrection),_advCorrection]; +TRACE_2("created dialog",_dialog,_ctrlChargeList); + +// Get Mags: +private _mags = [_weaponName] call CBA_fnc_compatibleMagazines; +if (_mags isEqualTo []) exitWith {WARNING_1("No Mags",_weaponName);}; +private _magCfg = configFile >> "CfgMagazines"; +private _magParamsArray = []; +_mags = _mags apply { + private _initSpeed = getNumber (_magCfg >> _x >> "initSpeed"); + _magParamsArray pushBackUnique _initSpeed; + private _airFriction = 0; + if (_advCorrection) then { + _airFriction = if (isNumber (_magCfg >> _x >> QGVAR(airFriction))) then { getNumber (_magCfg >> _x >> QGVAR(airFriction)) } else { DEFAULT_AIR_FRICTION }; + }; + _magParamsArray pushBackUnique _airFriction; + [getText (_magCfg >> _x >> "displayNameShort"), getText (_magCfg >> _x >> "displayName"), _initSpeed, _airFriction] +}; +TRACE_2("",_magParamsArray,_mags); +if ((count _magParamsArray) == 2) then { // test if all magazines share the parameters + _mags = [["", "All Magazines", (_mags select 0) select 2, (_mags select 0) select 3]]; // simplify +}; + +// Get Firemodes: +private _fireModes = getArray (configFile >> "CfgWeapons" >> _weaponName >> "modes"); +_fireModes = (_fireModes apply {configFile >> "CfgWeapons" >> _weaponName >> _x}) select {1 == getNumber (_x >> "showToPlayer")}; +_fireModes = _fireModes apply {[getNumber (_x >> "artilleryCharge"), configName _x]}; +_fireModes sort true; +private _allSameCharge = ((count _fireModes) == 1) && {((_fireModes select 0) select 0) == 1}; +TRACE_2("",_allSameCharge,_fireModes); + +GVAR(magModeData) = []; +{ + _x params ["_xDisplayNameShort", "_xDisplayName", "_xInitSpeed", "_xAirFriction"]; + if (_allSameCharge) then { + _ctrlChargeList lbAdd format ["%1", _xDisplayNameShort]; + _ctrlChargeList lbSetTooltip [count GVAR(magModeData), format ["%1\n%2 m/s\n%3", _xDisplayName, _xInitSpeed toFixed 1, _xAirFriction]]; + GVAR(magModeData) pushBack [_xInitSpeed, _xAirFriction]; + } else { + { + _x params ["_xModeCharge"]; + _ctrlChargeList lbAdd format ["[Charge %1] %2", _forEachIndex, _xDisplayNameShort]; // forEachIndex is from firemodes + _ctrlChargeList lbSetTooltip [count GVAR(magModeData), format ["%1\n%2 m/s\n%3", _xDisplayName, (_xInitSpeed * _xModeCharge) toFixed 1, _xAirFriction]]; + GVAR(magModeData) pushBack [_xInitSpeed * _xModeCharge, _xAirFriction]; + } forEach _fireModes; + }; +} forEach _mags; + + +if (isNil QGVAR(lastElevationMode)) then {GVAR(lastElevationMode) = true;}; +if (isNil QGVAR(lastTablePage)) then {GVAR(lastTablePage) = 0;}; +if ((GVAR(lastTablePage) >= (count GVAR(magModeData))) || {GVAR(lastTablePage) < 0}) then { GVAR(lastTablePage) = 0; }; + +END_COUNTER(rangeTableOpen); +TRACE_2("trigger update",GVAR(lastElevationMode),GVAR(lastTablePage)); +_ctrlChargeList lbSetCurSel GVAR(lastTablePage); // triggers call to FUNC(rangeTableUpdate) diff --git a/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf b/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf new file mode 100644 index 00000000000..4f0a3d61565 --- /dev/null +++ b/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf @@ -0,0 +1,64 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Called when listbox selection changes. Updates the rangetable with new values. + * + * Arguments: + * 0: Elevation Mode (true = high,false=low) + * + * Return Value: + * None + * + * Example: + * [] call ace_artillerytables_fnc_rangeTableUpdate + * + * Public: No + */ + +private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull]; +private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE; +private _ctrlChargeList = _dialog displayCtrl IDC_CHARGELIST; +private _ctrlElevationHigh = _dialog displayCtrl IDC_BUTTON_ELEV_HIGH; +private _ctrlElevationLow = _dialog displayCtrl IDC_BUTTON_ELEV_LOW; + +GVAR(lastElevationMode) = param [0, GVAR(lastElevationMode)]; // update if passed a new value +GVAR(lastCharge) = lbCurSel _ctrlChargeList; + +// get data for currently selected mag/mode combo: +(GVAR(magModeData) select GVAR(lastCharge)) params [["_muzzleVelocity", -1], ["_airFriction", 0]]; +private _elevMin = _dialog getVariable [QGVAR(elevMin), 0]; +private _elevMax = _dialog getVariable [QGVAR(elevMax), 0]; +_ctrlElevationHigh ctrlSetTextColor ([[0.25,0.25,0.25,1],[1,1,1,1]] select GVAR(lastElevationMode)); +_ctrlElevationLow ctrlSetTextColor ([[1,1,1,1],[0.25,0.25,0.25,1]] select GVAR(lastElevationMode)); + + +lnbClear _ctrlRangeTable; +// Call extension with current data and start workers +TRACE_5("callExtension:start",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)); +private _ret = "ace_artillerytables" callExtension ["start", [_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)]]; +TRACE_1("",_ret); + +// Non-blocking read data out of extension as it becomes availiable +[{ + private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull]; + private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE; + if (isNull _dialog) exitWith {true}; + + private _status = 1; // 1 = data on line, 2 - data not ready, 3 - done + while {_status == 1} do { + private _ret = ("ace_artillerytables" callExtension ["getline", []]); + // TRACE_1("callExtension:getline",_ret); + _status = _ret select 1; + if (_status == 1) then { _ctrlRangeTable lnbAddRow parseSimpleArray (_ret select 0) }; + }; + + (_status == 3) // exit loop when all data read +}, { + // put dummy line at end because scrolling is problematic and can't see last line + private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull]; + private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE; + if (isNull _dialog) exitWith {TRACE_1("dialog closed",_this);}; + + _ctrlRangeTable lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""]; + TRACE_1("table filled",_ctrlRangeTable); +}, []] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/artillerytables/functions/fnc_turretChanged.sqf b/addons/artillerytables/functions/fnc_turretChanged.sqf new file mode 100644 index 00000000000..1975f65c73a --- /dev/null +++ b/addons/artillerytables/functions/fnc_turretChanged.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Turret changed, determine if we are in the gunner seat of an artillery vehicle. + * + * Arguments: + * 0: Player + * 1: Turret + * + * Return Value: + * Nothing + * + * Example: + * [player, [0]] call ace_artillerytables_fnc_turretChanged + * + * Public: No + */ + +params ["_player", "_turret"]; +private _vehicle = vehicle _player; +private _typeOf = typeOf _vehicle; +private _vehicleCfg = configFile >> "CfgVehicles" >> _typeOf; + +// config "ace_artillerytables_showGunLaying" [0 disabled, 1 enabled, 2 enabled w/ alt elevationMode] falls back to artilleryScanner +private _showGunLaying = if (isNumber (_vehicleCfg >> QGVAR(showGunLaying))) then { + getNumber (_vehicleCfg >> QGVAR(showGunLaying)) +} else { + getNumber (_vehicleCfg >> "artilleryScanner") +}; +TRACE_4("turretChanged",_player,_typeOf,_turret,_showGunLaying); + +if (GVAR(pfID) >= 0) then { + TRACE_1("removing pfEH and display",GVAR(pfID)); + [GVAR(pfID)] call CBA_fnc_removePerFrameHandler; + GVAR(pfID) = -1; + if (!isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then { + ([QGVAR(modeDisplay)] call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; + }; +}; + +if ((alive _player) && {_showGunLaying > 0} && {_player == gunner _vehicle}) then { + private _turretCfg = [_typeOf, _turret] call CBA_fnc_getTurret; + private _turretAnimBody = getText (_turretCfg >> "animationSourceBody"); + private _useAltElevation = (_showGunLaying == 2); // StaticMortars need elevation calculated differently, see FUNC(turretPFEH) + + // If the memory point is invalid, then the turret will always use real weapon dir (e.g. CUP BM21) + private _memoryPointGunnerOptics = getText (_turretCfg >> "memoryPointGunnerOptics"); + private _invalidGunnerMem = (_vehicle selectionPosition [_memoryPointGunnerOptics, "Memory"]) isEqualTo [0,0,0]; + if (_invalidGunnerMem) then { INFO_3("[%1-%2] turret's memoryPointGunnerOptics invalid [%3]",typeOf _vehicle,_turret,_memoryPointGunnerOptics); }; + + private _weaponsTurret = _vehicle weaponsTurret _turret; + if ((count _weaponsTurret) != 1) then { WARNING_2("not singular weapon in turret - %1 - %2",_typeOf,_turret); }; + private _weapon = _weaponsTurret param [0, ""]; + + private _fireModes = getArray (configFile >> "CfgWeapons" >> _weapon >> "modes"); + _fireModes = (_fireModes apply {configFile >> "CfgWeapons" >> _weapon >> _x}) select {1 == getNumber (_x >> "showToPlayer")}; + _fireModes = _fireModes apply {[getNumber (_x >> "artilleryCharge"), configName _x]}; + _fireModes sort true; + _fireModes = _fireModes apply {_x select 1}; + + GVAR(pfID) = [LINKFUNC(turretPFEH), 0, [_vehicle, _turret, _fireModes, _useAltElevation, _turretAnimBody, _invalidGunnerMem]] call CBA_fnc_addPerFrameHandler; + TRACE_4("added pfEH",GVAR(pfID),_useAltElevation,_turretAnimBody,_invalidGunnerMem); + + #ifdef DEBUG_MODE_FULL + private _ballisticsComputer = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ballisticsComputer"); + private _elevationMode = getNumber (_turretCfg >> "elevationMode"); + private _discreteDistance = getArray (_turretCfg >> "discreteDistance"); + TRACE_4("",_weapon,_ballisticsComputer,_elevationMode,_discreteDistance); + #endif +}; diff --git a/addons/artillerytables/functions/fnc_turretPFEH.sqf b/addons/artillerytables/functions/fnc_turretPFEH.sqf new file mode 100644 index 00000000000..5ab7c499b04 --- /dev/null +++ b/addons/artillerytables/functions/fnc_turretPFEH.sqf @@ -0,0 +1,92 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Shows real azimuth and elevation on hud + * + * Arguments: + * 0: PFEH Args + * + * Return Value: + * Nothing + * + * Example: + * [[...]] call ace_artillerytables_fnc_turretPFEH + * + * Public: No + */ + +(_this select 0) params ["_vehicle", "_turret", "_fireModes", "_useAltElevation", "_turretAnimBody", "_invalidGunnerMem"]; + +if (shownArtilleryComputer && {GVAR(disableArtilleryComputer)}) then { + // Still Don't like this solution, but it works + closeDialog 0; + [localize LSTRING(disableArtilleryComputer_displayName)] call EFUNC(common,displayTextStructured); +}; + +// Restart display if null (not just at start, this will happen periodicly) +if (isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then { + TRACE_1("creating display",_this); + ([QGVAR(modeDisplay)] call BIS_fnc_rscLayer) cutRsc [QGVAR(modeDisplay), "PLAIN", 1, false]; +}; + +private _ctrlGroup = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl 1000; +if (cameraView != "GUNNER") exitWith { // need to be in gunner mode, so we can check where the optics are aiming at + _ctrlGroup ctrlShow false; +}; +_ctrlGroup ctrlShow true; + +BEGIN_COUNTER(pfeh); + +private _currentFireMode = (weaponState [_vehicle, _turret]) select 2; +private _currentChargeMode = _fireModes find _currentFireMode; + +private _lookVector = (AGLtoASL (positionCameraToWorld [0,0,0])) vectorFromTo (AGLtoASL (positionCameraToWorld [0,0,1])); +private _weaponDir = _vehicle weaponDirection (currentWeapon _vehicle); + +// Calc real azimuth/elevation +// (looking at the sky VS looking at ground will radicaly change fire direction because BIS) +private _display = uiNamespace getVariable ["ACE_dlgArtillery", displayNull]; +private _useRealWeaponDir = if ((isNull (_display displayCtrl 173)) || {(_vehicle ammo (currentWeapon _vehicle)) == 0}) then { + // With no ammo, distance display will be empty, but gun will still fire at wonky angle if aimed at ground + private _testSeekerPosASL = AGLtoASL (positionCameraToWorld [0,0,0]); + private _testPoint = _testSeekerPosASL vectorAdd (_lookVector vectorMultiply viewDistance); + !((terrainIntersectASL [_testSeekerPosASL, _testPoint]) || {lineIntersects [_testSeekerPosASL, _testPoint, _vehicle]}); +} else { + ((ctrlText (_display displayCtrl 173)) == "--") +}; + +private _realElevation = asin (_weaponDir select 2); +private _realAzimuth = 0; +if (_useRealWeaponDir || _invalidGunnerMem) then { + // No range (looking at sky), it will follow weaponDir: + _realAzimuth = (_weaponDir select 0) atan2 (_weaponDir select 1) +} else { + // Valid range, will fire at camera dir + // Azimuth will still be look dir EVEN IF elevation has flipped over 90! (on steep hills) + _realAzimuth = ((_lookVector select 0) atan2 (_lookVector select 1)); + if (_useAltElevation) then { + // Some small mortars have odd launch angles (I think due to the addition of neutral elevation constant with the manual elevation) + // This gets very close, (should be less than 0.5deg deviation on a 20deg slope) + private _currentTraverseRad = _vehicle animationSourcePhase _turretAnimBody; + if (isNil "_currentTraverseRad") then { _currentTraverseRad = _vehicle animationPhase _turretAnimBody; }; + // Get turret roatation around it's z axis, then calc weapon elev in it's projection + private _turretRot = [vectorDir _vehicle, vectorUp _vehicle, deg _currentTraverseRad] call CBA_fnc_vectRotate3D; + _realElevation = (acos ((_turretRot vectorCos _weaponDir) min 1)) + ((_turretRot call CBA_fnc_vect2polar) select 2); + if (_realElevation > 90) then { _realElevation = 180 - _realElevation; }; // does not flip azimuth! + }; +}; +if (_realAzimuth < 0) then { _realAzimuth = _realAzimuth + 360; }; // mils will be 0-6400 + +private _ctrlCharge = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_CHARGE; +private _ctrlAzimuth = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_AZIMUTH; +private _ctrlElevation = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_ELEVATION; + +_ctrlAzimuth ctrlSetText Format ["AZ: %1", [DEGTOMILS * _realAzimuth, 4, 0] call CBA_fnc_formatNumber]; +_ctrlElevation ctrlSetText Format ["EL: %1", [DEGTOMILS * _realElevation, 4, 0] call CBA_fnc_formatNumber]; +_ctrlCharge ctrlSetText format ["CH: %1", _currentChargeMode]; + +// avalible for other addons (mk6) +GVAR(predictedAzimuth) = _realAzimuth; +GVAR(predictedElevation) = _realElevation; + +END_COUNTER(pfeh); diff --git a/addons/artillerytables/functions/script_component.hpp b/addons/artillerytables/functions/script_component.hpp new file mode 100644 index 00000000000..d85f88930ab --- /dev/null +++ b/addons/artillerytables/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\artillerytables\script_component.hpp" diff --git a/addons/artillerytables/initSettings.sqf b/addons/artillerytables/initSettings.sqf new file mode 100644 index 00000000000..c578901e2ee --- /dev/null +++ b/addons/artillerytables/initSettings.sqf @@ -0,0 +1,23 @@ +// CBA Settings [ADDON: ace_artillerytables]: + +private _categoryName = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], LLSTRING(rangetable_displayName)]; + +[ + QGVAR(advancedCorrections), "CHECKBOX", + [LSTRING(advancedCorrections_displayName), LSTRING(advancedCorrections_description)], + _categoryName, + false, // default value + true, // isGlobal + {[QGVAR(advancedCorrections), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(disableArtilleryComputer), "CHECKBOX", + [LSTRING(disableArtilleryComputer_displayName), LSTRING(disableArtilleryComputer_description)], + _categoryName, + false, // default value + true, // isGlobal + {[QGVAR(disableArtilleryComputer), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/artillerytables/script_component.hpp b/addons/artillerytables/script_component.hpp new file mode 100644 index 00000000000..128c3c17ff1 --- /dev/null +++ b/addons/artillerytables/script_component.hpp @@ -0,0 +1,25 @@ +#define COMPONENT artillerytables +#define COMPONENT_BEAUTIFIED ArtilleryTables +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\z\ace\addons\main\script_macros.hpp" + + +// This is a good fit for most large artillery, but a little low for lighter mortars +#define DEFAULT_AIR_FRICTION -0.00006 + +#define DEGTOMILS 17.7777778 + +#define IDC_MODECONTROLGROUP 1000 +#define IDC_CHARGE 1001 +#define IDC_AZIMUTH 1002 +#define IDC_ELEVATION 1003 + +#define IDC_TABLE 2001 +#define IDC_CHARGELIST 2002 +#define IDC_BUTTON_ELEV_HIGH 2003 +#define IDC_BUTTON_ELEV_LOW 2004 diff --git a/addons/artillerytables/stringtable.xml b/addons/artillerytables/stringtable.xml new file mode 100644 index 00000000000..d1d4ab23ef3 --- /dev/null +++ b/addons/artillerytables/stringtable.xml @@ -0,0 +1,95 @@ + + + + + Artillery Rangetable + Artillerieschusstafel + 火炮射程表 + Tavola balistica per artigliria + Dělostřelecké tabulky střelby + 火砲射表 + Tabela Strzelnicza + Table de tir d'artillerie + Tabela de Artilharia + Tabla de distancias de artillería + Topçu Menzil Tablosu + Артиллерийская баллистическая таблица + + + Universal Artillery Rangetable + Universale Artillerieschusstafel + 通用的火炮射程表 + Tavola balistica universale per artiglieria + Univerzální dělostřelecká tabulka střelby + 汎用の火砲用射程表 + Uniwersalna Tabela Strzelnicza + Table de tir universelle pour l'artillerie. + Tabela de Artilharia Universal + Tabla de distancias universal de artillería + Uluslar arası Topçu Menzil Tablosu + Универсальная артиллерийская баллистическая таблица + + + Air Resistance + Opór powietrza + Resistencia al aire + Luftwiderstand + Odpor vzduchu + Resistência do Ar + Résistance de l'air + Légellenállás + Сопротивление воздуха + Resistenza dell'Aria + 空気抵抗 + 공기저항 + 空气阻力 + 空氣阻力 + Hava Direnci + + + For player shots, model air resistance and wind effects + Modeluj opór powietrza oraz wpływ wiatru na tor lotu pocisku dla strzałów z moździerza Mk6 przez graczy + Para disparos del jugador, modelar la resistencia del aire y los efectos de viento + Für Spielerschüsse, Luftwiderstand und Windeffekte + Pro střelbu hráče používat odpor vzduchu a vliv větru + Para disparos do jogador, modelo de resistência de ar e efeitos de vento + Pour les tirs des joueurs, simule la résistance de l'air et les effets du vent. + Játékos általi lövésekhez, legyen-e számított légellenállás és szélhatás + Для выстрелов игрока. Моделирует сопротивление воздуха и эффект ветра + Per Proiettili dei Giocatori, simula la Resistenza dell'Aria e gli Effetti del Vento + プレイヤが射撃すると、空気抵抗モデルと風による影響を与えます。 + 플레이어 사격시 공기저항과 바람에 영향을 받습니다 + 设定由玩家射击的迫击炮,将会受到空气阻力与风力的影响 + 設定由玩家射擊的迫擊砲,將會受到空氣阻力與風力的影響 + Oyuncu atışları, hava direnci ve rüzgar efektleri için + + + Artillery Computer Disabled + Artilleriecomputer ausgeschaltet + 停用火炮電腦 + Computer artiglieria disattivato + Zakázat používání dělostřeleckého počítače + 砲撃コンピュータ無効化 + Wyłączony Komputer Artyleryjski + Désactiver l'ordinateur de tir + Computador de Artilharia Desabilitado + Computadora de artillería deshabilitada + Topçu Bilgisayarı Devre Dışı + Артиллерийский Компьютер Отключён + + + Disable the vanilla artillery computers + Deaktiviert die Vanilla-Artilleriecomputer + 停用原本的火炮控制電腦 + Disattiva il computer artiglieria vanilla + Zakázat používání dělostřeleckého počítače základní hry + ゲームの砲撃コンピュータを無効化します。 + Wyłącza komputer artyleryjski wprowadzony w vanili + Désactive l'ordinateur de tir vanilla. + Desabilitar o computador de artilharia padrão + Deshabilita la computadora de artillería por defecto de Arma 3 + Topçu bilgisayarını devre dışı bırak + Отключить ванильный артиллерийский компьютер + + + diff --git a/addons/atragmx/CfgEventHandlers.hpp b/addons/atragmx/CfgEventHandlers.hpp index 1bd535a305e..becf3950523 100644 --- a/addons/atragmx/CfgEventHandlers.hpp +++ b/addons/atragmx/CfgEventHandlers.hpp @@ -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)); }; -}; \ No newline at end of file +}; diff --git a/addons/atragmx/functions/fnc_can_show.sqf b/addons/atragmx/functions/fnc_can_show.sqf index 6d3ed1f6ec4..fff2a937022 100644 --- a/addons/atragmx/functions/fnc_can_show.sqf +++ b/addons/atragmx/functions/fnc_can_show.sqf @@ -15,4 +15,5 @@ * Public: No */ -(("ACE_ATragMX" in (uniformItems ACE_player)) || ("ACE_ATragMX" in (vestItems ACE_player))) && !(underwater ACE_player); +!underwater ACE_player && +{"ACE_ATragMX" in ([ACE_player] call EFUNC(common,uniqueItems))} diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 2b1975b567c..6930bf67860 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -28,9 +28,7 @@ if (!GVAR(initialised)) then { TRACE_1("",GVAR(initialised)); }; -if (GVAR(active)) exitWith { false }; -if (underwater ACE_player) exitWith { false }; -if (!("ACE_ATragMX" in (uniformItems ACE_player)) && !("ACE_ATragMX" in (vestItems ACE_player))) exitWith { false }; +if (GVAR(active) || {!(call FUNC(can_show))}) exitWith {false}; createDialog 'ATragMX_Display'; diff --git a/addons/atragmx/functions/fnc_cycle_gun_list.sqf b/addons/atragmx/functions/fnc_cycle_gun_list.sqf index 7d0c6b5ab4d..5487ac71cba 100644 --- a/addons/atragmx/functions/fnc_cycle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_cycle_gun_list.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_atragmx_fnc_cycle_scope_unit + * call ace_atragmx_fnc_cycle_gun_list * * Public: No */ diff --git a/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf b/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf index 42d3232d542..7a2fade7e60 100644 --- a/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf +++ b/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_atragmx_fnc_cycle_target_direction + * call ace_atragmx_fnc_cycle_target_speed_direction * * Public: No */ diff --git a/addons/atragmx/functions/fnc_initGunList.sqf b/addons/atragmx/functions/fnc_initGunList.sqf index 3ffcaf976c7..ff14b1f3d33 100644 --- a/addons/atragmx/functions/fnc_initGunList.sqf +++ b/addons/atragmx/functions/fnc_initGunList.sqf @@ -39,12 +39,12 @@ if (_resetGunList) then { ["12.7x54mm" , 299, 100, 0.3567550, -0.00019568, 6.60, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".50 Beowulf" , 562, 100, 0.1425100, -0.00205896, 6.60, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".50 Beowulf" , 549, 100, 0.1468500, -0.00209809, 6.60, 0, 2, 10, 120, 0, 0, 21.64, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,547],[0,548],[10,549],[15,549],[25,551],[30,552],[35,553]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], [".408 CheyTac 305gr", 1059, 100, 0.0686329, -0.00065414, 7.37, 0, 2, 10, 120, 0, 0, 19.76, 10.4, 33.02, 0.569, 1, "ICAO", [[-15,1040],[0,1047],[10,1054],[15,1059],[25,1073],[30,1082],[35,1093]], [[0, 0.605], [1110, 0.569], [1500, 0.560], [1790, 0.551], [1990, 0.547], [2140, 0.545], [2300, 0.544]], true], [".408 CheyTac 419gr", 859, 100, 0.0816039, -0.00046249, 7.37, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.866, 1, "ICAO", [[-15,840],[0,847],[10,854],[15,859],[25,873],[30,882],[35,893]] , [[0, 0.872], [1440, 0.862], [1630, 0.859], [1870, 0.852], [2090, 0.843], [2230, 0.838], [2420, 0.833]], true], - ["9.3×64mm" , 862, 100, 0.0875873, -0.00110727, 8.13, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["9.3×64mm" , 780, 100, 0.0953568, -0.00080801, 8.13, 0, 2, 10, 120, 0, 0, 17.00, 9.48, 36.00, 0.515, 1, "ICAO", [[-15,761],[0,768],[10,775],[15,780],[25,794],[30,803],[35,814]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], [".338LM 250gr" , 872, 100, 0.0809096, -0.00060841, 7.37, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0, 0.656], [1300, 0.64], [1460, 0.636], [1770, 0.625], [1920, 0.621], [2030, 0.619], [2190, 0.618]], true], [".338LM 300gr" , 792, 100, 0.0890193, -0.00055706, 7.37, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0, 0.734], [1300, 0.726], [1500, 0.720], [1770, 0.708], [1880, 0.705], [2000, 0.702], [2110, 0.700]], true], @@ -52,7 +52,7 @@ if (_resetGunList) then { [".300WM Mk248 Mod0" , 857, 100, 0.0825862, -0.00072468, 7.37, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]] , [[0, 0.546], [1210, 0.529], [1470, 0.520], [1570, 0.518], [1730, 0.515], [1880, 0.513], [1970, 0.513]], true], [".300WM Mk248 Mod1" , 839, 100, 0.0841417, -0.00063027, 7.37, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]] , [[0, 0.623], [1150, 0.614], [1330, 0.609], [1620, 0.598], [1770, 0.595], [1970, 0.592], [2030, 0.591]], true], - [".300WM Berger OTM" , 792, 100, 0.0891300, -0.00055262, 7.37, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0, 0.721], [1400, 0.708], [1570, 0.703], [1860, 0.692], [1990, 0.689], [2140, 0.686], [2220, 0.685]], true], + [".300WM Berger OTM" , 792, 100, 0.0891300, -0.00054587, 7.37, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0, 0.721], [1400, 0.708], [1570, 0.703], [1860, 0.692], [1990, 0.689], [2140, 0.686], [2220, 0.685]], true], ["7.62x54mmR" , 828, 100, 0.0853677, -0.00103739, 7.11, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,809],[0,816],[10,823],[15,828],[25,842],[30,851],[35,862]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], @@ -63,7 +63,7 @@ if (_resetGunList) then { ["7.62x51mm M993" , 912, 100, 0.0803840, -0.00109390, 7.62, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["7.62x51mm Subsonic", 314, 100, 0.3344490, -0.00060194, 6.86, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]] , [[0, 0.303], [250, 0.409], [320, 0.427], [420, 0.445], [550, 0.460], [650, 0.467], [730, 0.470]], true], - ["7.62x39mm" , 708, 100, 0.1066160, -0.00154815, 7.62, 0, 2, 10, 120, 0, 0, 7.970, 7.82, 25.40, 0.275, 1, "ICAO", [[-15,689],[0,696],[10,703],[15,708],[25,722],[30,731],[35,742]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x39mm" , 715, 100, 0.1047820, -0.00154815, 7.62, 0, 2, 10, 120, 0, 0, 7.970, 7.92, 24.00, 0.275, 1, "ICAO", [[-15,696],[0,703],[10,710],[15,715],[25,729],[30,738],[35,749]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["6.5x39mm" , 766, 100, 0.0872025, -0.00077363, 6.35, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]] , [[0, 0.525], [910, 0.520], [1050, 0.515], [1270, 0.506], [1390, 0.503], [1570, 0.500], [1770, 0.498]], true], ["6.5x47mm Lapua" , 767, 100, 0.0868248, -0.00069003, 6.35, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]] , [[0, 0.578], [970, 0.574], [1140, 0.569], [1430, 0.557], [1610, 0.553], [1750, 0.551], [1860, 0.550]], true], @@ -76,7 +76,7 @@ if (_resetGunList) then { ["5.56x45mm Mk318" , 872, 100, 0.0814490, -0.00125880, 7.11, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["5.56x45mm M995" , 861, 100, 0.0825279, -0.00126182, 7.11, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.45x39mm 7N6M" , 727, 100, 0.0802286, -0.00119458, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0, 0.339], [730, 0.331], [960, 0.323], [1100, 0.321], [1220, 0.320], [1380, 0.320], [1480, 0.320]], true]]; + ["5.45x39mm 7N6M" , 735, 100, 0.0784916, -0.00119458, 3.81, 0, 2, 10, 120, 0, 0, 3.430, 5.60, 16.00, 0.336, 1, "ICAO", [[-15,716],[0,723],[10,730],[15,735],[25,749],[30,758],[35,769]] , [[0, 0.339], [730, 0.331], [960, 0.323], [1100, 0.321], [1220, 0.320], [1380, 0.320], [1480, 0.320]], true]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/functions/fnc_sord.sqf b/addons/atragmx/functions/fnc_sord.sqf index a6c3d2b5b8e..327db0f1178 100644 --- a/addons/atragmx/functions/fnc_sord.sqf +++ b/addons/atragmx/functions/fnc_sord.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [1000, 45, 1] call ace_microdagr_fnc_recieveRangefinderData + * [1000, 45, 1] call ace_atragmx_fnc_sord * * Public: No */ diff --git a/addons/atragmx/functions/fnc_store_gun_list.sqf b/addons/atragmx/functions/fnc_store_gun_list.sqf index d5c3d7657d4..14fb0f8350a 100644 --- a/addons/atragmx/functions/fnc_store_gun_list.sqf +++ b/addons/atragmx/functions/fnc_store_gun_list.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_atragmx_fnc_store_user_data + * call ace_atragmx_fnc_store_gun_list * * Public: No */ diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf index ce4b5cb9247..a93dc1347f5 100644 --- a/addons/atragmx/functions/fnc_update_target_data.sqf +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_atragmx_fnc_update_target + * call ace_atragmx_fnc_update_target_data * * Public: No */ diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index 4c11ea8add1..d76ccec0879 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -16,6 +16,7 @@ ATragMX ATragMX ATragMX + ATragMX Open ATragMX @@ -32,6 +33,7 @@ ATragMX 열기 開啟ATragMX 开启ATragMX + ATragMX'i aç Rugged PDA with ATragMX @@ -48,6 +50,7 @@ ATragMX가 달린 PDA 裝有軍用PDA的ATragMX 装有军用PDA的ATragMX + Rugged PDA with ATragMX Open ATragMX @@ -64,6 +67,7 @@ ATragMX 열기 開啟ATragMX 开启ATragMX + ATragMX'i aç diff --git a/addons/attach/CfgEventHandlers.hpp b/addons/attach/CfgEventHandlers.hpp index 73b85538396..7bb7a9bae57 100644 --- a/addons/attach/CfgEventHandlers.hpp +++ b/addons/attach/CfgEventHandlers.hpp @@ -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 { diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index 21652f296d5..4d43cf47e95 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -74,7 +74,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment _virtualPosASL = _virtualPosASL vectorAdd ((positionCameraToWorld [0.3,0,0]) vectorDiff (positionCameraToWorld [0,0,0])); }; private _virtualPos = _virtualPosASL call EFUNC(common,ASLToPosition); - private _lineInterection = lineIntersects [eyePos ACE_player, _virtualPosASL, ACE_player]; + private _lineInterection = !((lineIntersectsSurfaces [eyePos ACE_player, _virtualPosASL, ACE_player]) isEqualTo []); //Don't allow placing in a bad position: if (_lineInterection && {GVAR(placeAction) == PLACE_APPROVE}) then {GVAR(placeAction) = PLACE_WAITING;}; diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index d0101695b4f..2ae6f84b748 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -3,7 +3,7 @@ * Author: Pabst Mirror (based on Explosive attach by Garth de Wet (LH)) * Approves placement of the lightObject, scans for an appropriate location and attaches * A player can release the attachObject with it floating in mid-air. - * This will use lineIntersectsWith to scan towards the center of the vehicle to find a collision + * This will use lineIntersectsSurfaces to scan towards the center of the vehicle to find a collision * ArmA's collision detection is of couse terrible and often misses collisions (difference between what we see and collision LOD) * So it does multiple scans at slighly different angles * This is VERY computationaly intensive, but doesn't happen that often. diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 252f25e4edc..44af6990176 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -16,6 +16,7 @@ 물건 부착 附掛裝備>> 附挂装备>> + Eşyayı bağla Attach @@ -32,6 +33,7 @@ 부착 附掛 附挂 + Bağla Detach item @@ -40,7 +42,7 @@ Odczep przedmiot Détacher l'objet Odepnout předmět - Separar item + Desprender item Stacca l'oggetto Tárgy lecsatolása Отсоединить @@ -48,6 +50,7 @@ 분리 取下裝備 取下装备 + Eşyayı sök IR Strobe Attached @@ -64,6 +67,7 @@ 적외선 스트로브 부착됨 已附掛紅外線頻閃器 已附挂红外线频闪器 + IR Strobe Bağlandı IR Strobe Detached @@ -80,6 +84,7 @@ 적외선 스트로브 분리됨 已取下紅外線頻閃器 已取下红外线频闪器 + IR Strobe Söküldü IR Grenade Attached @@ -96,6 +101,7 @@ 적외선 수류탄 부착됨 已附掛紅外線手榴彈 已附挂红外线手榴弹 + IR Bombası Bağlandı IR Grenade Detached @@ -112,6 +118,7 @@ 적외선 수류탄 분리됨 已取下紅外線手榴彈 已取下红外线手榴弹 + IR Bombası Söküldü Chemlight Attached @@ -128,6 +135,7 @@ 켐라이트 부착됨 已附掛螢光棒 已附挂萤光棒 + Işık Çubuğu Bağlandı Chemlight Detached @@ -144,6 +152,7 @@ 켐라이트 분리됨 已取下螢光棒 已取下萤光棒 + Işık Çubuğu Söküldü No inventory space @@ -160,6 +169,7 @@ 넣을 공간이 없음 無可用空間 无可用空间 + Envanter de alan yok IR Strobe @@ -176,6 +186,7 @@ 적외선 스트로브 紅外線頻閃器 红外线频闪器 + IR Stroboskop IR Strobe allows you to signal your position through a pulsating beacon only visible with NVGs. @@ -192,6 +203,7 @@ 적외선 스트로브는 자신의 위치를 반짝이면서 표시합니다. 이는 야간투시경으로 밖에 보지 못합니다. 紅外線閃頻器,藉由紅外線閃頻信號來辨識你的位置,僅能使用夜視系統來辨識紅外線信號 红外线闪频器,藉由红外线闪频信号来辨识你的位置,仅能使用夜视系统来辨识红外线信号 + IR Stroboskop, yalnızca gece görüşlerinden gözükebilen titreşimli bir ışık aracılığıyla konumunuzu gösterir. Place @@ -200,7 +212,7 @@ Umieść Placer Položit - Colocar + Fixar Posiziona Elhelyez Установить @@ -208,6 +220,7 @@ 두기 放置 放置 + Yerleştir Cancel @@ -224,6 +237,7 @@ 취소 取消 取消 + Iptal Attach Failed @@ -240,6 +254,7 @@ 부착 실패 附掛失敗 附挂失败 + Bağlama başarısız %1<br/>Attached @@ -256,6 +271,7 @@ %1<br/>부착됨 %1<br/>已附掛 %1<br/>已附挂 + %1<br/>Bağlandı %1<br/>Detached @@ -272,6 +288,7 @@ %1<br/>분리됨 %1<br/>已取下 %1<br/>已取下 + %1<br/>Söküldü diff --git a/addons/ballistics/ACE_Arsenal_Stats.hpp b/addons/ballistics/ACE_Arsenal_Stats.hpp index 620c0fb2bc4..34a8b561e5a 100644 --- a/addons/ballistics/ACE_Arsenal_Stats.hpp +++ b/addons/ballistics/ACE_Arsenal_Stats.hpp @@ -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}}; }; diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index b6ad5d8832a..ec273e2c308 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -6,6 +6,114 @@ class CfgAmmo { timeToLive=6; }; + class ShotgunBase; + + class B_12Gauge_Pellets_Submunition: BulletBase { //#00 Buckshot + //vanilla values have been left as comments for reference purposes + caliber = 0.525; //penetration of ~3mm RHA, ~9.6mm metal + //caliber = 1; //too high, ~5.7mm of RHA (380*1*15/1000=5.7), ~18.25 metal + //cost = 1; + //hit = 20; + //simulationStep = 0.0001; + //cartridge = ""; + //submunitionAmmo = "B_12Gauge_Pellets_Submunition_Deploy"; + submunitionConeType[] = {"poissondisc", 9}; //#00 Buckshot generally has 9 pellets per shell + //submunitionConeType[] = {"poissondisc", 18}; + //submunitionConeAngle = 0.8; + //triggerSpeedCoef[] = {0.85, 1}; + triggerTime = 0.008; // Shot takes ~5-15 feet to start spreading out and the vanilla triggerTime is too short to allow that + //triggerTime = 0.001; + }; + class B_12Gauge_Pellets_Submunition_Deploy: BulletBase { + airFriction = -0.0030; + //airFriction = -0.0067; + caliber = 0.525; + hit = 2.55; //vanilla hit is way too high + //hit = 6; + //indirectHit = 0; + //indirectHitRange = 0; + //typicalSpeed = 360; + //deflecting = 35; + }; + + class B_12Gauge_Pellets: ShotgunBase { //This doesn't seem to be used for anything, but I want to standardize the caliber with the other pellet classes. + caliber = 0.525; //3mm RHA, probably still too high though as RHA is hardened. + }; + + class ACE_12Gauge_Pellets_Submunition_No0_Buck: B_12Gauge_Pellets_Submunition { + caliber = 0.5; + submunitionAmmo = "ACE_12Gauge_Pellets_Submunition_No0_Buck_Deploy"; + submunitionConeType[] = {"poissondisc", 9}; + submunitionConeAngle = 0.81; + }; + class ACE_12Gauge_Pellets_Submunition_No0_Buck_Deploy: B_12Gauge_Pellets_Submunition_Deploy { + airFriction = -0.0033; + caliber = 0.5; + hit = 2.27; + }; + class ACE_12Gauge_Pellets_Submunition_No1_Buck: B_12Gauge_Pellets_Submunition { + caliber = 0.475; + submunitionAmmo = "ACE_12Gauge_Pellets_Submunition_No1_Buck_Deploy"; + submunitionConeType[] = {"poissondisc", 11}; + submunitionConeAngle = 0.83; + }; + class ACE_12Gauge_Pellets_Submunition_No1_Buck_Deploy: B_12Gauge_Pellets_Submunition_Deploy { + airFriction = -0.0038; + caliber = 0.475; + hit = 1.86; + }; + class ACE_12Gauge_Pellets_Submunition_No2_Buck: B_12Gauge_Pellets_Submunition { + caliber = 0.45; + submunitionAmmo = "ACE_12Gauge_Pellets_Submunition_No2_Buck_Deploy"; + submunitionConeType[] = {"poissondisc", 14}; + submunitionConeAngle = 0.85; + }; + class ACE_12Gauge_Pellets_Submunition_No2_Buck_Deploy: B_12Gauge_Pellets_Submunition_Deploy { + airFriction = -0.0048; + caliber = 0.45; + hit = 1.46; + }; + class ACE_12Gauge_Pellets_Submunition_No3_Buck: B_12Gauge_Pellets_Submunition { + caliber = 0.425; + submunitionAmmo = "ACE_12Gauge_Pellets_Submunition_No3_Buck_Deploy"; + submunitionConeType[] = {"poissondisc", 18}; + submunitionConeAngle = 0.87; + }; + class ACE_12Gauge_Pellets_Submunition_No3_Buck_Deploy: B_12Gauge_Pellets_Submunition_Deploy { + airFriction = -0.0067; + caliber = 0.425; + hit = 1.13; + }; + class ACE_12Gauge_Pellets_Submunition_No4_Buck: B_12Gauge_Pellets_Submunition { + caliber = 0.4; + submunitionAmmo = "ACE_12Gauge_Pellets_Submunition_No4_Buck_Deploy"; + submunitionConeType[] = {"poissondisc", 21}; + submunitionConeAngle = 0.89; + }; + class ACE_12Gauge_Pellets_Submunition_No4_Buck_Deploy: B_12Gauge_Pellets_Submunition_Deploy { + airFriction = -0.0085; + caliber = 0.4; + hit = 0.97; + }; + class ACE_12Gauge_Pellets_Submunition_No4_Bird: B_12Gauge_Pellets_Submunition { + caliber = 0.2; + hit = 3; + submunitionAmmo = "ACE_12Gauge_Pellets_Submunition_No4_Bird_Deploy"; + submunitionConeType[] = {"poissondisc", 135}; + submunitionConeAngle = 1.1; + triggerSpeedCoef[] = {0.8, 1}; + }; + class ACE_12Gauge_Pellets_Submunition_No4_Bird_Deploy: B_12Gauge_Pellets_Submunition_Deploy { + caliber = 0.2; + airFriction = -0.0800; + hit = 0.15; + }; + + class B_12Gauge_Slug: BulletBase { + //caliber = 3; //too high, ~20mm of RHA (450*3*15/1000=20), ~64mm metal + caliber = 1.037; //~7mm RHA, ~22.4mm metal, probably still too high though as RHA is hardened. + }; + class B_556x45_Ball : BulletBase { airFriction=-0.00130094; tracerScale = 1; @@ -67,18 +175,18 @@ class CfgAmmo { class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { nvgOnly = 1; }; - class B_545x39_Ball_F : BulletBase { - airFriction=-0.00119458; - ACE_caliber=5.588; - ACE_bulletLength=21.59; - ACE_bulletMass=3.42792; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.168}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={735, 883, 892}; - ACE_barrelLengths[]={206.5, 414.02, 508.0}; + class B_545x39_Ball_F: BulletBase { + airFriction = -0.001195; + ACE_caliber = 5.6; // https://bobp.cip-bobp.org/uploads/tdcc/tab-i/5-45-x-39-en.pdf + ACE_bulletLength = 21.59; + ACE_bulletMass = 3.43; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {0.168}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {743, 848, 891, 900}; // at 21°C, at 15°C {735, 840, 883, 892} according with the AKS initSpeed + ACE_barrelLengths[] = {210, 314, 415, 508.0}; // respectively {AKS74U / AK105,AK12K / AK74 / default} }; class B_56x15_dual: BulletBase { tracerScale = 0.5; @@ -290,7 +398,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball { - airFriction=-0.00055262; + airFriction=-0.000546; caliber=2.0; hit=19; typicalSpeed=853; @@ -337,18 +445,18 @@ class CfgAmmo { ACE_muzzleVelocities[]={735, 770, 809, 838}; ACE_barrelLengths[]={406.4, 508.0, 604.5, 736.6}; }; - class B_762x39_Ball_F : BulletBase { - airFriction=-0.00154815; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=7.9704; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.275}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={650, 716, 750}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; + class B_762x39_Ball_F: BulletBase { + airFriction = -0.001548; + ACE_caliber = 7.92; // https://bobp.cip-bobp.org/uploads/tdcc/tab-i/7-62-x-39-en.pdf + ACE_bulletLength = 28.956; + ACE_bulletMass = 7.97; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {0.275}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {658, 678, 723, 743, 753}; // at 21°C, at 15°C {650, 670, 715, 735, 745} according with the AKM,AK12,AK12U,RPK initSpeed + ACE_barrelLengths[] = {254, 314, 415, 520, 590}; // respectively {default / AK104,AK15K / AK47,AKM,AK103,AK15 / SKS / RPK} }; class B_9x21_Ball : BulletBase { airFriction=-0.00211064; @@ -381,18 +489,18 @@ class CfgAmmo { ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; class B_93x64_Ball : BulletBase { - airFriction=-0.00110727; - ACE_caliber=9.296; - ACE_bulletLength=34.29; - ACE_bulletMass=14.904; - ACE_muzzleVelocityVariationSD=0.4; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.368}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={850, 870, 880}; - ACE_barrelLengths[]={508.0, 620.014, 660.4}; + airFriction = -0.000808; // According with the G1 BC 0.515 and the SVDK muzzle velocity 780 m/s https://www.kalashnikov.ru/medialibrary/bd9/72_77.pdf#page=3 + ACE_caliber = 9.28; // https://www.kalashnikov.ru/medialibrary/bd9/72_77.pdf#page=3 + ACE_bulletLength = 35.56; // Average length from bullets with similar mass and BC + ACE_bulletMass = 17; // https://www.kalashnikov.ru/medialibrary/bd9/72_77.pdf#page=3 + ACE_muzzleVelocityVariationSD = 0.4; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {0.515}; // Compromise as close as possible to these velocities and times of flight from this table (unknown measurement conditions) https://www.kalashnikov.ru/medialibrary/bd9/72_77.pdf#page=5 + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; // Better result with ICAO (15°C, 1013,25 hPa, 0%) than ASM conditions (15°C, 999,916 hPa, 78%) + ACE_dragModel = 1; // Better result than an equivalent G7 BC + ACE_muzzleVelocities[] = {768, 788, 798}; // Default values - 82 m/s at 21°C, at 15°C {760, 780, 790} according with the 10Rnd_93x64_DMR_05_Mag and the 150Rnd_93x64_Mag initSpeed + ACE_barrelLengths[] = {508.0, 620.0, 660.4}; }; class B_408_Ball : BulletBase { timeToLive=10; @@ -590,29 +698,33 @@ class CfgAmmo { ACE_muzzleVelocities[]={230, 250, 285}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; - class B_50BW_Ball_F : BulletBase { - airFriction=-0.00205896; - ACE_caliber=12.7; - ACE_bulletLength=24.13; - ACE_bulletMass=21.7076; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.21}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={510, 550, 596}; - ACE_barrelLengths[]={304.8, 406.4, 609.6}; + + class B_50BW_Ball_F: BulletBase { // http://www.alexanderarms.com/images/pdfs/beowulf_ballistics.pdf#page=2 + airFriction = -0.002098; // According with the G1 BC 0.21 and the muzzle velocity 1800 ft/s: 549 m/s + ACE_caliber = 4.55; // instead 12.7 to match with the .50BW adv. ballistics (twist rate 20") overwritten by the Katiba rifle twist 8" until a BI fix + ACE_bulletLength = 24.13; + ACE_bulletMass = 21.64; // 334 grains + ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[] = {0.21}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {550}; // at 21°C, at 15°C 549 m/s according with the 10Rnd_50BW_Mag_F initSpeep + ACE_barrelLengths[] = {304.8}; // 12" }; + class B_570x28_Ball: BulletBase { - ACE_caliber = 5.7; + ACE_caliber = 5.7; // https://bobp.cip-bobp.org/uploads/tdcc/tab-i/tabical-en-page7.pdf 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_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[] = {0.084}; // https://www.thefirearmblog.com/blog/2016/10/24/modern-personal-defense-weapon-calibers-4-6x30mm-hk/ ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; // 50/50 chance to get it right + ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 7; - ACE_muzzleVelocities[] = {716,776}; - ACE_barrelLengths[] = {264,407}; + ACE_muzzleVelocities[] = {716, 776}; // at 21°C, 715-775 m/s at 15°C according with the 50Rnd_570x28_SMG_03 initSpeed + ACE_barrelLengths[] = {264, 407}; + airFriction = -0.002619; // default BI value -0.001412 }; class B_19mm_HE: BulletBase { tracerScale = 1; diff --git a/addons/ballistics/CfgMagazineWells.hpp b/addons/ballistics/CfgMagazineWells.hpp index 39098f4c284..258b619e14f 100644 --- a/addons/ballistics/CfgMagazineWells.hpp +++ b/addons/ballistics/CfgMagazineWells.hpp @@ -1,16 +1,57 @@ class CfgMagazineWells { + class CBA_12g_2rnds { + ADDON[] = { + "ACE_2Rnd_12Gauge_Pellets_No0_Buck", + "ACE_2Rnd_12Gauge_Pellets_No1_Buck", + "ACE_2Rnd_12Gauge_Pellets_No2_Buck", + "ACE_2Rnd_12Gauge_Pellets_No3_Buck", + "ACE_2Rnd_12Gauge_Pellets_No4_Buck", + "ACE_2Rnd_12Gauge_Pellets_No4_Bird" + }; + }; + + class HunterShotgun_01_12GA { //Vanilla magwell + ADDON[] = { + "ACE_2Rnd_12Gauge_Pellets_No0_Buck", + "ACE_2Rnd_12Gauge_Pellets_No1_Buck", + "ACE_2Rnd_12Gauge_Pellets_No2_Buck", + "ACE_2Rnd_12Gauge_Pellets_No3_Buck", + "ACE_2Rnd_12Gauge_Pellets_No4_Buck", + "ACE_2Rnd_12Gauge_Pellets_No4_Bird" + }; + }; - class CBA_65x39_MX { + class UBS_12GA { //Vanilla magwell + ADDON[] = { + "ACE_6Rnd_12Gauge_Pellets_No0_Buck", + "ACE_6Rnd_12Gauge_Pellets_No1_Buck", + "ACE_6Rnd_12Gauge_Pellets_No2_Buck", + "ACE_6Rnd_12Gauge_Pellets_No3_Buck", + "ACE_6Rnd_12Gauge_Pellets_No4_Buck", + "ACE_6Rnd_12Gauge_Pellets_No4_Bird" + }; + }; + + class MX_65x39 { //Vanilla magwell ADDON[] = { "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim", - "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" + "ACE_30Rnd_65x47_Scenar_mag", + "ACE_30Rnd_65_Creedmor_mag" }; }; - class CBA_65x39_MX_XL { + + class MX_65x39_Large { //Vanilla magwell ADDON[] = { "ACE_100Rnd_65x39_caseless_mag_Tracer_Dim" }; }; + + class Katiba_65x39 { + ADDON[] = { + "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" + }; + }; + class CBA_65x39_Mk200 { ADDON[] = { "ACE_200Rnd_65x39_cased_Box_Tracer_Dim" @@ -25,12 +66,13 @@ class CfgMagazineWells { "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" + "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" }; }; @@ -49,6 +91,7 @@ class CfgMagazineWells { "ACE_20Rnd_762x51_M993_AP_Mag" }; }; + class CBA_762x51_HK417 { ADDON[] = { "ACE_20Rnd_762x51_Mag_Tracer", @@ -64,6 +107,7 @@ class CfgMagazineWells { "ACE_20Rnd_762x51_M993_AP_Mag" }; }; + class CBA_762x51_SR25 { ADDON[] = { "ACE_20Rnd_762x51_Mag_Tracer", @@ -79,6 +123,7 @@ class CfgMagazineWells { "ACE_20Rnd_762x51_M993_AP_Mag" }; }; + class CBA_762x51_G3 { ADDON[] = { "ACE_20Rnd_762x51_Mag_Tracer", @@ -95,10 +140,15 @@ class CfgMagazineWells { }; }; -//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 MAR10_338 { //Vanilla magwell + ADDON[] = { + "ACE_10Rnd_338_300gr_HPBT_Mag", + "ACE_10Rnd_338_API526_Mag", + "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[] = { @@ -107,14 +157,14 @@ class CfgMagazineWells { "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[] = { @@ -122,29 +172,32 @@ class CfgMagazineWells { }; }; - class CBA_50BMG_M107 { + 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" @@ -156,35 +209,10 @@ class CfgMagazineWells { "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" - }; - }; - }; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index a89cf7022d6..861fd2f0566 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -3,22 +3,131 @@ class CfgMagazines { class CA_Magazine; class VehicleMagazine; - + + class 2Rnd_12Gauge_Pellets: CA_Magazine { + displayName = CSTRING(2Rnd_12Gauge_Pellets_No00_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No00_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No00_Buck_Description); + }; + + class ACE_2Rnd_12Gauge_Pellets_No0_Buck: 2Rnd_12Gauge_Pellets { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(2Rnd_12Gauge_Pellets_No0_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No0_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No0_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No0_Buck"; + }; + + class ACE_2Rnd_12Gauge_Pellets_No1_Buck: ACE_2Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(2Rnd_12Gauge_Pellets_No1_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No1_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No1_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No1_Buck"; + }; + + class ACE_2Rnd_12Gauge_Pellets_No2_Buck: ACE_2Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(2Rnd_12Gauge_Pellets_No2_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No2_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No2_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No2_Buck"; + }; + + class ACE_2Rnd_12Gauge_Pellets_No3_Buck: ACE_2Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(2Rnd_12Gauge_Pellets_No3_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No3_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No3_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No3_Buck"; + }; + + class ACE_2Rnd_12Gauge_Pellets_No4_Buck: ACE_2Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(2Rnd_12Gauge_Pellets_No4_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No4_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No4_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No4_Buck"; + }; + + class ACE_2Rnd_12Gauge_Pellets_No4_Bird: ACE_2Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(2Rnd_12Gauge_Pellets_No4_Bird_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No4_Bird_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No4_Bird_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No4_Bird"; + }; + + class 6Rnd_12Gauge_Pellets: 2Rnd_12Gauge_Pellets { + displayName = CSTRING(6Rnd_12Gauge_Pellets_No00_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No00_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No00_Buck_Description); + }; + + class ACE_6Rnd_12Gauge_Pellets_No0_Buck: 6Rnd_12Gauge_Pellets { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(6Rnd_12Gauge_Pellets_No0_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No0_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No0_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No0_Buck"; + }; + + class ACE_6Rnd_12Gauge_Pellets_No1_Buck: ACE_6Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(6Rnd_12Gauge_Pellets_No1_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No1_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No1_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No1_Buck"; + }; + + class ACE_6Rnd_12Gauge_Pellets_No2_Buck: ACE_6Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(6Rnd_12Gauge_Pellets_No2_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No2_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No2_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No2_Buck"; + }; + + class ACE_6Rnd_12Gauge_Pellets_No3_Buck: ACE_6Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(6Rnd_12Gauge_Pellets_No3_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No3_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No3_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No3_Buck"; + }; + + class ACE_6Rnd_12Gauge_Pellets_No4_Buck: ACE_6Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(6Rnd_12Gauge_Pellets_No4_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No4_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No4_Buck_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No4_Buck"; + }; + + class ACE_6Rnd_12Gauge_Pellets_No4_Bird: ACE_6Rnd_12Gauge_Pellets_No0_Buck { + displayName = CSTRING(6Rnd_12Gauge_Pellets_No4_Bird_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No4_Bird_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No4_Bird_Description); + ammo = "ACE_12Gauge_Pellets_Submunition_No4_Bird"; + }; + + class 15Rnd_12Gauge_Pellets: 6Rnd_12Gauge_Pellets { + displayName = CSTRING(15Rnd_12Gauge_Pellets_No00_Buck_Name); + displayNameShort = CSTRING(12Gauge_Pellets_No00_Buck_NameShort); + descriptionShort = CSTRING(12Gauge_Pellets_No00_Buck_Description); + }; + class 30Rnd_580x42_Mag_F: CA_Magazine { initSpeed = 950; }; + class 20Rnd_650x39_Cased_Mag_F: CA_Magazine { initSpeed = 806; }; + class 30Rnd_65x39_caseless_mag: CA_Magazine { initSpeed = 774; }; + class 30Rnd_65x39_caseless_green: 30Rnd_65x39_caseless_mag { initSpeed = 788; }; + class 100Rnd_65x39_caseless_mag: CA_Magazine { initSpeed = 774; }; + class 100Rnd_65x39_caseless_mag_Tracer; class ACE_100Rnd_65x39_caseless_mag_Tracer_Dim: 100Rnd_65x39_caseless_mag_Tracer { author = ECSTRING(common,ACETeam); @@ -28,9 +137,11 @@ class CfgMagazines { descriptionShort = CSTRING(100Rnd_65x39_caseless_mag_Tracer_DimDescription); picture = "\A3\weapons_f\data\ui\m_100rnd_65x39_yellow_ca.paa"; }; + class 200Rnd_65x39_cased_Box: 100Rnd_65x39_caseless_mag { initSpeed = 743; }; + class ACE_200Rnd_65x39_cased_Box_Tracer_Dim: 200Rnd_65x39_cased_Box { author = ECSTRING(common,ACETeam); ammo = "ACE_65x39_Caseless_Tracer_Dim"; @@ -40,6 +151,7 @@ class CfgMagazines { picture = "\A3\weapons_f\data\ui\m_200rnd_65x39_yellow_ca.paa"; initSpeed = 774; }; + class 30Rnd_65x39_caseless_mag_Tracer; class ACE_30Rnd_65x39_caseless_mag_Tracer_Dim: 30Rnd_65x39_caseless_mag_Tracer { author = ECSTRING(common,ACETeam); @@ -48,6 +160,7 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65x39_caseless_mag_Tracer_DimNameShort); descriptionShort = CSTRING(30Rnd_65x39_caseless_mag_Tracer_DimDescription); }; + class 30Rnd_65x39_caseless_green_mag_Tracer; class ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim: 30Rnd_65x39_caseless_green_mag_Tracer { author = ECSTRING(common,ACETeam); @@ -58,27 +171,33 @@ class CfgMagazines { }; class 30Rnd_545x39_Mag_F: CA_Magazine { - initSpeed = 735; + initSpeed = 735; // default BI value according with the ACE_muzzleVelocities at 15°C }; - + class 30Rnd_556x45_Stanag: CA_Magazine { initSpeed = 909; }; + class 30Rnd_556x45_Stanag_green: 30Rnd_556x45_Stanag { initSpeed = 869; }; + class 30Rnd_556x45_Stanag_red: 30Rnd_556x45_Stanag { initSpeed = 869; }; + class 30Rnd_556x45_Stanag_Tracer_Red: 30Rnd_556x45_Stanag { initSpeed = 869; }; + class 30Rnd_556x45_Stanag_Tracer_Green: 30Rnd_556x45_Stanag { initSpeed = 869; }; + class 30Rnd_556x45_Stanag_Tracer_Yellow: 30Rnd_556x45_Stanag { initSpeed = 889; }; + class ACE_30Rnd_556x45_Stanag_M995_AP_mag: 30Rnd_556x45_Stanag { author = ECSTRING(common,ACETeam); ammo = "ACE_556x45_Ball_M995_AP"; @@ -87,6 +206,7 @@ class CfgMagazines { descriptionShort = CSTRING(30Rnd_556x45_Stanag_M995_AP_mag_Description); initSpeed = 875; }; + class ACE_30Rnd_556x45_Stanag_Mk262_mag: 30Rnd_556x45_Stanag { author = ECSTRING(common,ACETeam); ammo = "ACE_556x45_Ball_Mk262"; @@ -95,6 +215,7 @@ class CfgMagazines { descriptionShort = CSTRING(30Rnd_556x45_Stanag_Mk262_mag_Description); initSpeed = 832; }; + class ACE_30Rnd_556x45_Stanag_Mk318_mag: 30Rnd_556x45_Stanag { author = ECSTRING(common,ACETeam); ammo = "ACE_556x45_Ball_Mk318"; @@ -103,38 +224,43 @@ class CfgMagazines { descriptionShort = CSTRING(30Rnd_556x45_Stanag_Mk318_mag_Description); initSpeed = 923; }; + class ACE_30Rnd_556x45_Stanag_Tracer_Dim: 30Rnd_556x45_Stanag_Tracer_Red { author = ECSTRING(common,ACETeam); ammo = "ACE_B_556x45_Ball_Tracer_Dim"; displayName = CSTRING(30Rnd_556x45_mag_Tracer_DimName); displayNameShort = CSTRING(30Rnd_556x45_mag_Tracer_DimNameShort); descriptionShort = CSTRING(30Rnd_556x45_mag_Tracer_DimDescription); - picture = "\A3\weapons_f\data\ui\m_20stanag_red_ca.paa"; }; class 200Rnd_556x45_Box_F: CA_Magazine { initSpeed = 889; }; + class 200Rnd_556x45_Box_Red_F: 200Rnd_556x45_Box_F { initSpeed = 869; }; - + class 30Rnd_762x39_Mag_F: CA_Magazine { - initSpeed = 716; + initSpeed = 715; // default BI value according with the ACE_muzzleVelocities at 15°C }; - + class 20Rnd_762x51_Mag: CA_Magazine { initSpeed = 827; }; + class 10Rnd_762x51_Mag: 20Rnd_762x51_Mag { initSpeed = 833; }; + class 150Rnd_762x51_Box: CA_Magazine { initSpeed = 833; }; + class 150Rnd_762x51_Box_Tracer: 150Rnd_762x51_Box { initSpeed = 833; }; + class ACE_20Rnd_762x51_Mag_Tracer: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "B_762x51_Tracer_Red"; @@ -170,6 +296,7 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_762x51_M118LR_Mag_Description); initSpeed = 780; }; + class ACE_10Rnd_762x51_Mk316_Mod_0_Mag: 10Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk316_Mod_0"; @@ -179,6 +306,7 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_762x51_Mk316_Mod_0_Mag_Description); initSpeed = 790; }; + class ACE_10Rnd_762x51_Mk319_Mod_0_Mag: 10Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk319_Mod_0"; @@ -188,6 +316,7 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_762x51_Mk319_Mod_0_Mag_Description); initSpeed = 900; }; + class ACE_10Rnd_762x51_M993_AP_Mag: 10Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M993_AP"; @@ -197,6 +326,7 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_762x51_M993_AP_Mag_Description); initSpeed = 920; }; + class ACE_20Rnd_762x51_M118LR_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M118LR"; @@ -205,6 +335,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x51_M118LR_Mag_Description); initSpeed = 785; }; + class ACE_20Rnd_762x51_Mk316_Mod_0_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk316_Mod_0"; @@ -214,6 +345,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x51_Mk316_Mod_0_Mag_Description); initSpeed = 798; }; + class ACE_20Rnd_762x51_Mk319_Mod_0_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk319_Mod_0"; @@ -222,6 +354,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x51_Mk319_Mod_0_Mag_Description); initSpeed = 910; }; + class ACE_20Rnd_762x51_M993_AP_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M993_AP"; @@ -231,6 +364,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x51_M993_AP_Mag_Description); initSpeed = 930; }; + class ACE_20Rnd_762x67_Mk248_Mod_0_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x67_Ball_Mk248_Mod_0"; @@ -239,6 +373,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x67_Mk248_Mod_0_Mag_Description); initSpeed = 865; }; + class ACE_20Rnd_762x67_Mk248_Mod_1_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x67_Ball_Mk248_Mod_1"; @@ -247,6 +382,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x67_Mk248_Mod_1_Mag_Description); initSpeed = 847; }; + class ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag: 20Rnd_762x51_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x67_Ball_Berger_Hybrid_OTM"; @@ -255,6 +391,7 @@ class CfgMagazines { descriptionShort = CSTRING(20Rnd_762x67_Berger_Hybrid_OTM_Mag_Description); initSpeed = 800; }; + class ACE_30Rnd_65x47_Scenar_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; @@ -263,6 +400,7 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(30Rnd_65x47_Scenar_mag_Description); }; + class ACE_20Rnd_65x47_Scenar_mag: 20Rnd_650x39_Cased_Mag_F { author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; @@ -271,6 +409,7 @@ class CfgMagazines { displayNameShort = CSTRING(20Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(20Rnd_65x47_Scenar_mag_Description); }; + class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; @@ -279,6 +418,7 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(30Rnd_65_Creedmor_mag_Description); }; + class ACE_20Rnd_65_Creedmor_mag: 20Rnd_650x39_Cased_Mag_F { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; @@ -287,9 +427,11 @@ class CfgMagazines { displayNameShort = CSTRING(20Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(20Rnd_65_Creedmor_mag_Description); }; + class 10Rnd_338_Mag: CA_Magazine { initSpeed = 880; }; + class ACE_10Rnd_338_300gr_HPBT_Mag: 10Rnd_338_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_338_Ball"; @@ -298,6 +440,7 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_338_300gr_HPBT_Mag_Description); initSpeed = 800; }; + class ACE_10Rnd_338_API526_Mag: 10Rnd_338_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_338_Ball_API526"; @@ -306,10 +449,11 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_338_API526_Mag_Description); initSpeed = 880; }; - + class 7Rnd_408_Mag: CA_Magazine { initSpeed = 867; }; + class ACE_7Rnd_408_305gr_Mag: 7Rnd_408_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_408_Ball"; @@ -323,6 +467,7 @@ class CfgMagazines { class 5Rnd_127x108_APDS_Mag: 5Rnd_127x108_Mag { initSpeed = 820; }; + class ACE_5Rnd_127x99_Mag: 5Rnd_127x108_Mag { author = ECSTRING(common,ACETeam); ammo = "B_127x99_Ball"; @@ -331,6 +476,7 @@ class CfgMagazines { descriptionShort = CSTRING(5Rnd_127x99_Mag_Description); initSpeed = 900; }; + class ACE_5Rnd_127x99_API_Mag: 5Rnd_127x108_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_127x99_API"; @@ -339,6 +485,7 @@ class CfgMagazines { descriptionShort = CSTRING(5Rnd_127x99_API_Mag_Description); initSpeed = 900; }; + class ACE_5Rnd_127x99_AMAX_Mag: 5Rnd_127x108_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_127x99_Ball_AMAX"; @@ -348,22 +495,24 @@ class CfgMagazines { initSpeed = 860; }; - class 30Rnd_9x21_Mag: CA_Magazine { initSpeed = 430; }; + class 30Rnd_9x21_Green_Mag: 30Rnd_9x21_Mag { initSpeed = 402; }; + class 30Rnd_9x21_Mag_SMG_02: 30Rnd_9x21_Mag { initSpeed = 430; }; + class 30Rnd_9x21_Mag_SMG_02_Tracer_Green: 30Rnd_9x21_Mag_SMG_02 { initSpeed = 402; }; class 10Rnd_50BW_Mag_F: CA_Magazine { - initSpeed = 552; + initSpeed = 549; // according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C) }; class 11Rnd_45ACP_Mag: CA_Magazine { @@ -389,9 +538,11 @@ class CfgMagazines { class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { initSpeed = 430; }; + class 10Rnd_9x21_Mag: 16Rnd_9x21_Mag { initSpeed = 430; }; + class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_9x19_Ball"; @@ -404,6 +555,7 @@ class CfgMagazines { class 10Rnd_762x54_Mag: 10Rnd_762x51_Mag { initSpeed = 836; }; + class ACE_10Rnd_762x54_Tracer_mag: 10Rnd_762x54_Mag { author = ECSTRING(common,ACETeam); ammo = "ACE_762x54_Ball_7T2"; @@ -421,27 +573,28 @@ class CfgMagazines { class 10Rnd_127x54_Mag: CA_Magazine { initSpeed = 300; }; - + class 150Rnd_556x45_Drum_Mag_F: CA_Magazine { initSpeed = 869; }; - + class 130Rnd_338_Mag: CA_Magazine { initSpeed = 807; }; - + class 200Rnd_65x39_Belt: VehicleMagazine { initSpeed = 806; }; - + class 20Rnd_556x45_UW_mag: 30Rnd_556x45_Stanag { initSpeed = 267; }; - + class 150Rnd_93x64_Mag: CA_Magazine { - initSpeed = 870; + initSpeed = 768; // according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C) }; + class 10Rnd_93x64_DMR_05_Mag: 150Rnd_93x64_Mag { - initSpeed = 870; + initSpeed = 780; // according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C) }; }; diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index c6a40301f26..94f9c7c8633 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -211,6 +211,7 @@ class CfgVehicles { accuracy = 1000; displayName = CSTRING(AmmoSupplyCrate_DisplayName); model = "\A3\weapons_F\AmmoBoxes\AmmoBox_F"; + editorPreview = "\A3\EditorPreviews_F\Data\CfgVehicles\Box_NATO_Ammo_F.jpg"; author = ECSTRING(common,ACETeam); class TransportMagazines { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,4); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index f88fd8e59a3..8385676c255 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -1,833 +1,442 @@ -class Mode_SemiAuto; -class Mode_Burst; -class Mode_FullAuto; - class CfgWeapons { - class LMG_RCWS; - class MGun; - class MGunCore; - class MMG_01_base_F; - class MMG_02_base_F; + class HMG_01; + class Pistol_Base_F; class Rifle_Base_F; class Rifle_Short_Base_F: Rifle_Base_F {}; class Rifle_Long_Base_F: Rifle_Base_F {}; + // Rifle_Long_Base_F Sniper Marksman // GM6 Lynx - class GM6_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.45); - }; + class GM6_base_F: Rifle_Long_Base_F {}; + class srifle_GM6_F: GM6_base_F { + ACE_barrelLength = 730; + ACE_barrelTwist = 381.0; + initSpeed = -1.0; + magazineWell[] += { + "CBA_50BMG_M107" + }; // empty in vanilla }; // M200 Intervention - class LRR_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.50); - }; + class LRR_base_F: Rifle_Long_Base_F {}; + class srifle_LRR_F: LRR_base_F { + ACE_barrelLength = 736.6; + ACE_barrelTwist = 330.2; + initSpeed = -1.0; + magazineWell[] += { + "CBA_408CT_Inter" + }; // vanilla magazineWell[] = {"M320_408"}; }; - // MX - class arifle_MX_Base_F: Rifle_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.90); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; + // Mk14 Mod 1 EBR + class EBR_base_F: Rifle_Long_Base_F {}; + class srifle_EBR_F: EBR_base_F { + ACE_barrelLength = 457.2; + ACE_barrelTwist = 304.8; + initSpeed = -0.979444; }; - // KH2002 Sama - class arifle_katiba_Base_F: Rifle_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.90); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; + // VS-121 + class DMR_01_base_F: Rifle_Long_Base_F {}; + class srifle_DMR_01_F: DMR_01_base_F { + ACE_barrelLength = 609.6; + ACE_barrelTwist = 241.3; + initSpeed = -1.00019; }; - // CTAR-21 - class Tavor_base_F: Rifle_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.12); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; + // Noreen "Bad News" ULR + class DMR_02_base_F: Rifle_Long_Base_F {}; + class srifle_DMR_02_F: DMR_02_base_F { + ACE_barrelLength = 508.0; + ACE_barrelTwist = 254.0; + initSpeed = -1.0; }; - - // F2000 - class mk20_base_F: Rifle_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.12); - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; + // SIG 556 + class DMR_03_base_F: Rifle_Long_Base_F {}; + class srifle_DMR_03_F: DMR_03_base_F { + ACE_barrelLength = 508.0; + ACE_barrelTwist = 254.0; + initSpeed = -0.991536; + magazineWell[] += { + "CBA_762x51_M14" + }; // vanilla magazineWell[] = {"M14_762x51"}; }; - // 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 { - dispersion = MOA_TO_RAD(0.61); - }; + // ASP-1 Kir + class DMR_04_base_F: Rifle_Long_Base_F {}; + class srifle_DMR_04_F: DMR_04_base_F { + ACE_barrelLength = 450.088; + ACE_barrelTwist = 203.2; + initSpeed = -1.0; }; - // VS-121 - class DMR_01_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.81); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // Cyrus + class DMR_05_base_F: Rifle_Long_Base_F {}; + class srifle_DMR_05_blk_F: DMR_05_base_F { + ACE_barrelLength = 620.0; + ACE_barrelTwist = 360.0; + initSpeed = -1.0; // 780 m/s according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C) }; - // Mk14 Mod 1 EBR - class EBR_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.81); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // M14 + class DMR_06_base_F: Rifle_Long_Base_F {}; + class srifle_DMR_06_camo_F: DMR_06_base_F { + ACE_barrelLength = 558.8; + ACE_barrelTwist = 304.8; + initSpeed = -0.999395; }; - // SIG 556 - class DMR_03_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.81); + // QBU-88 + class DMR_07_base_F: Rifle_Long_Base_F { + ACE_barrelLength = 640.0; + ACE_barrelTwist = 228.6; + initSpeed = -0.99998; + magazines[] += { //No Vanilla magwell + "ACE_20Rnd_65x47_Scenar_mag", + "ACE_20Rnd_65_Creedmor_mag" }; + }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // Rifle_Long_Base_F MG + // Stoner 99 LMG + class LMG_Mk200_F: Rifle_Long_Base_F { + ACE_barrelLength = 317.5; + ACE_barrelTwist = 177.8; + initSpeed = -0.999327; }; - // ASP-1 Kir - class DMR_04_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.0); - }; + // Negev NG7 + class LMG_Zafir_F: Rifle_Long_Base_F { + ACE_barrelLength = 459.74; + ACE_barrelTwist = 304.8; + initSpeed = -1.00048; }; - - // Cyrus - class DMR_05_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.67); - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.67); - }; + // M249 SPW + class LMG_03_base_F: Rifle_Long_Base_F { + ACE_barrelLength = 414.02; + ACE_barrelTwist = 177.8; + initSpeed = -1.00051; }; - // M14 - class DMR_06_base_F: Rifle_Long_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // HK121 + class MMG_01_base_F: Rifle_Long_Base_F {}; // https://www.heckler-koch.com/en/products/military/machine-guns/mg5/mg5/technical-data.html + class MMG_01_hex_F: MMG_01_base_F { + ACE_barrelLength = 550.0; + ACE_barrelTwist = 360.0; + initSpeed = -1.0; // 768 m/s according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C) + }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // LWMMG + class MMG_02_base_F: Rifle_Long_Base_F {}; + class MMG_02_camo_F: MMG_02_base_F { + ACE_barrelLength = 609.6; + ACE_barrelTwist = 234.95; + initSpeed = -1.0; }; + // Rifle_Base_F + // MX variants + class arifle_MX_Base_F: Rifle_Base_F {}; + // MX LSW class arifle_MX_SW_F: arifle_MX_Base_F { - magazines[] = { - "100Rnd_65x39_caseless_mag_Tracer", - "100Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer", - "ACE_100Rnd_65x39_caseless_mag_Tracer_Dim", - "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" - }; - initSpeed = -0.981912; - ACE_barrelTwist = 228.6; ACE_barrelLength = 406.4; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.90); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; + ACE_barrelTwist = 228.6; + initSpeed = -0.981912; }; // MXM class arifle_MXM_F: arifle_MX_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer", - "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim", - "ACE_30Rnd_65x47_Scenar_mag", - "ACE_30Rnd_65_Creedmor_mag" - }; - initSpeed = -1.0; - ACE_barrelTwist = 228.6; ACE_barrelLength = 457.2; - class Single: Single { - dispersion = MOA_TO_RAD(0.90); - }; + ACE_barrelTwist = 228.6; + initSpeed = -1.0; + }; - class FullAuto: FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; + // MX + class arifle_MX_F: arifle_MX_Base_F { + ACE_barrelLength = 368.3; + ACE_barrelTwist = 228.6; + initSpeed = -0.972222; }; - // HK416A5 11" - class arifle_SPAR_01_base_F: Rifle_Base_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_green", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "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" - }; - initSpeed = -0.869636; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 264.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.12); - }; + // MX 3GL + class arifle_MX_GL_F: arifle_MX_Base_F { + ACE_barrelLength = 368.3; + ACE_barrelTwist = 228.6; + initSpeed = -0.972222; + }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; + // MXC + class arifle_MXC_F: arifle_MX_Base_F { + ACE_barrelLength = 266.7; + ACE_barrelTwist = 203.2; + initSpeed = -0.946382; }; - // HK416A5 14.5" - class arifle_SPAR_02_base_F: Rifle_Base_F { - initSpeed = -0.999864; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 368.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.12); - }; + // KH2002 Sama variants + class arifle_katiba_Base_F: Rifle_Base_F {}; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; + // KH2002 Sama + class arifle_Katiba_F: arifle_katiba_Base_F { + ACE_barrelLength = 508.0; + ACE_barrelTwist = 203.2; + initSpeed = -1.0; }; - // HK417A2 20" - class arifle_SPAR_03_base_F: Rifle_Base_F { - magazines[] = { - "20Rnd_762x51_Mag", - "ACE_20Rnd_762x51_Mag_Tracer", - "ACE_20Rnd_762x51_Mag_Tracer_Dim", - "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", - "ACE_20Rnd_762x51_M118LR_Mag", - "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", - "ACE_20Rnd_762x51_M993_AP_Mag", - "ACE_20Rnd_762x51_Mag_SD" - }; - initSpeed = -0.991536; - ACE_barrelTwist = 279.4; - ACE_barrelLength = 508.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // KH2002C Sama + class arifle_Katiba_C_F: arifle_katiba_Base_F { + ACE_barrelLength = 393.7; + ACE_barrelTwist = 203.2; + initSpeed = -0.961294; + }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.81); - }; + // KH2002 Sama KGL + class arifle_Katiba_GL_F: arifle_katiba_Base_F { + ACE_barrelLength = 508.0; + ACE_barrelTwist = 203.2; + initSpeed = -1.0; }; - // Stoner 99 LMG - class LMG_Mk200_F: Rifle_Long_Base_F { - magazines[] = { - "200Rnd_65x39_cased_Box", - "200Rnd_65x39_cased_Box_Tracer", - "ACE_200Rnd_65x39_cased_Box_Tracer_Dim" - }; - initSpeed = -0.999327; + // CTAR-21 variants + class Tavor_base_F: Rifle_Base_F {}; + + // CTAR-21 + class arifle_TRG20_F: Tavor_base_F { + ACE_barrelLength = 381.0; ACE_barrelTwist = 177.8; - ACE_barrelLength = 317.5; + initSpeed = -0.961496; }; - // Negev NG7 - class LMG_Zafir_F: Rifle_Long_Base_F { - initSpeed = -1.00048; - ACE_barrelTwist = 304.8; + // TAR-21 + class arifle_TRG21_F: Tavor_base_F { ACE_barrelLength = 459.74; - }; - - // M249 SPW - class LMG_03_base_F: Rifle_Long_Base_F { - initSpeed = -1.00051; ACE_barrelTwist = 177.8; - ACE_barrelLength = 414.02; + initSpeed = -1.0; }; - // RFB SDAR - class SDAR_base_F: Rifle_Base_F { - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(3.0); - }; + // TAR-21 EGLM + class arifle_TRG21_GL_F: arifle_TRG21_F { + initSpeed = -1.0; + }; - class Burst: Mode_Burst { - dispersion = MOA_TO_RAD(3.0); - }; + // F2000 variants + class mk20_base_F: Rifle_Base_F {}; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(3.0); - }; + // F2000 + class arifle_Mk20_F: mk20_base_F { + ACE_barrelLength = 441.96; + ACE_barrelTwist = 177.8; + initSpeed = -0.992849; }; - class Pistol; - class Pistol_Base_F: Pistol {}; - - // P99 - class hgun_P07_F: Pistol_Base_F { - initSpeed = -0.906977; - ACE_barrelTwist = 254.0; - ACE_barrelLength = 101.6; + // F2000 Tactical + class arifle_Mk20C_F: mk20_base_F { + ACE_barrelLength = 406.4; + ACE_barrelTwist = 177.8; + initSpeed = -0.974297; }; - // MP-443 Grach - class hgun_Rook40_F: Pistol_Base_F { - initSpeed = -0.934884; - ACE_barrelTwist = 254.0; - ACE_barrelLength = 111.76; + // F2000 EGLM + class arifle_Mk20_GL_F: mk20_base_F { + ACE_barrelLength = 406.4; + ACE_barrelTwist = 177.8; + initSpeed = -0.974297; }; - // Custom Covert II - class hgun_ACPC2_F: Pistol_Base_F { - initSpeed = -0.984252; - ACE_barrelTwist = 406.4; - ACE_barrelLength = 127.0; + // P90 (1.86) variants + class SMG_03_TR_BASE: Rifle_Base_F { + ACE_barrelLength = 407; + ACE_barrelTwist = 228.6; // 1:9 inch twist + initSpeed = -1.083916; // 775 m/s according with the ACE_muzzleVelocities at 15°C, default BI value -1.1 (786 m/s) + modes[] = {"Single"}; }; - // FNX-45 Tactical - class hgun_Pistol_heavy_01_F: Pistol_Base_F { - initSpeed = -0.944882; - ACE_barrelTwist = 406.4; - ACE_barrelLength = 114.3; + class SMG_03C_BASE: SMG_03_TR_BASE { + ACE_barrelLength = 264; + modes[] = {"Single", "FullAuto"}; }; - // Chiappa Rhino 60DS - class hgun_Pistol_heavy_02_F: Pistol_Base_F { - initSpeed = -0.905512; - ACE_barrelTwist = 406.4; - ACE_barrelLength = 76.2; + // HK416 variants + // HK416A5 11" + class arifle_SPAR_01_base_F: Rifle_Base_F { + ACE_barrelLength = 264.0; + ACE_barrelTwist = 177.8; + initSpeed = -0.869636; }; - // Makarov PM - class hgun_Pistol_01_F: Pistol_Base_F { - initSpeed = -0.883721; - ACE_barrelTwist = 254.0; - ACE_barrelLength = 93.5; + // HK416A5 14.5" + class arifle_SPAR_02_base_F: Rifle_Base_F { + ACE_barrelLength = 368.0; + ACE_barrelTwist = 177.8; + initSpeed = -0.999864; }; - class pdw2000_base_F: Rifle_Short_Base_F {}; + // HK417A2 20" + class arifle_SPAR_03_base_F: Rifle_Base_F { + ACE_barrelLength = 508.0; + ACE_barrelTwist = 279.4; + initSpeed = -0.991536; + }; - // CPW - class hgun_PDW2000_F: pdw2000_base_F { - initSpeed = -0.994186; - ACE_barrelTwist = 228.6; - ACE_barrelLength = 177.8; + // RFB SDAR + class SDAR_base_F: Rifle_Base_F {}; + class arifle_SDAR_F: SDAR_base_F { + ACE_barrelLength = 457.2; + ACE_barrelTwist = 285.75; + initSpeed = -0.998321; }; // AKS class arifle_AKS_base_F: Rifle_Base_F { - initSpeed = -1.0; - ACE_barrelTwist = 160.02; - ACE_barrelLength = 206.5; + ACE_barrelLength = 210; + ACE_barrelTwist = 160; + initSpeed = -1; // 735 m/s according with the ACE_muzzleVelocities at 15°C }; // AKM class arifle_AKM_base_F: Rifle_Base_F { - initSpeed = -1.0; - ACE_barrelTwist = 199.898; - ACE_barrelLength = 414.02; + ACE_barrelLength = 415; + ACE_barrelTwist = 240; + initSpeed = -1; // 715 m/s according with the ACE_muzzleVelocities at 15°C }; - // AK12 + // AK15,AK15K,RPK (AK12) class arifle_AK12_base_F: Rifle_Base_F { - initSpeed = -1.0; - ACE_barrelTwist = 199.898; - ACE_barrelLength = 414.02; + ACE_barrelLength = 415; + ACE_barrelTwist = 240; + initSpeed = -1; // 715 m/s according with the ACE_muzzleVelocities at 15°C }; - // QBZ-95-1 - class arifle_CTAR_base_F: Rifle_Base_F { - initSpeed = -0.978947; - ACE_barrelTwist = 244.0; - ACE_barrelLength = 463.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.12); - }; + class arifle_AK12U_base_F: arifle_AK12_base_F { + ACE_barrelLength = 314; + initSpeed = -0.937063; // 715*0.937063= 670 m/s according with the ACE_muzzleVelocities at 15°C + }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; + class arifle_RPK12_base_F: arifle_AK12_base_F { + ACE_barrelLength = 590; + initSpeed = -1.041958; // 715*1.041958= 745 m/s according with the ACE_muzzleVelocities at 15°C }; - // QBU-88 - class DMR_07_base_F: Rifle_Long_Base_F { - initSpeed = -0.99998; + // MSBS GROT (Promet) + class arifle_MSBS65_base_F: Rifle_Base_F { + ACE_barrelLength = 406.4; // 16" ACE_barrelTwist = 228.6; - ACE_barrelLength = 640.0; - magazines[] = { - "20Rnd_650x39_Cased_Mag_F", - "ACE_20Rnd_65x47_Scenar_mag", - "ACE_20Rnd_65_Creedmor_mag" - }; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.01); - }; + initSpeed = -0.971576; // 774*0.971576= 752 m/s according with the ACE_muzzleVelocities at 15°C }; - // QBZ-95-1 LSW - class arifle_CTARS_base_F: Rifle_Base_F { - initSpeed = -1.0; - ACE_barrelTwist = 244.0; - ACE_barrelLength = 600.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.12); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; + class arifle_MSBS65_Mark_base_F: arifle_MSBS65_base_F { + ACE_barrelLength = 508; // 20" + initSpeed = -1.007752; // 774*1.007752= 780 m/s according with the ACE_muzzleVelocities at 15°C }; - // Type 115 - class arifle_ARX_base_F: Rifle_Base_F { - initSpeed = -0.984262; - ACE_barrelTwist = 228.6; + // QBZ-95-1 + class arifle_CTAR_base_F: Rifle_Base_F { ACE_barrelLength = 463.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.90); - }; - - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; + ACE_barrelTwist = 244.0; + initSpeed = -0.978947; }; - // KH2002 Sama - class arifle_Katiba_F: arifle_katiba_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_green", - "30Rnd_65x39_caseless_green_mag_Tracer", - "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" - }; + // QBZ-95-1 LSW + class arifle_CTARS_base_F: Rifle_Base_F { + ACE_barrelLength = 600.0; + ACE_barrelTwist = 244.0; initSpeed = -1.0; - ACE_barrelTwist = 203.2; - ACE_barrelLength = 508.0; }; - // KH2002C Sama - class arifle_Katiba_C_F: arifle_katiba_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_green", - "30Rnd_65x39_caseless_green_mag_Tracer", - "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" - }; - initSpeed = -0.961294; + // Type 115 + class arifle_ARX_base_F: Rifle_Base_F { + ACE_barrelLength = 508.0; ACE_barrelTwist = 203.2; - ACE_barrelLength = 393.7; - class Single: Single { - dispersion = MOA_TO_RAD(0.90); - }; - - class FullAuto: FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; - }; - - // KH2002 Sama KGL - class arifle_Katiba_GL_F: arifle_katiba_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_green", - "30Rnd_65x39_caseless_green_mag_Tracer", - "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" - }; initSpeed = -1.0; - ACE_barrelTwist = 203.2; - ACE_barrelLength = 508.0; - }; - - // MX - class arifle_MX_F: arifle_MX_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer", - "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" + class Secondary: Rifle_Base_F { + ACE_barrelLength = 304.8; + ACE_barrelTwist = 508.0; + initSpeed = -1.0; }; - initSpeed = -0.972222; - ACE_barrelTwist = 228.6; - ACE_barrelLength = 368.3; }; - // MX 3GL - class arifle_MX_GL_F: arifle_MX_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer", - "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" - }; - initSpeed = -0.972222; + // Rifle_Short_Base_F + // CPW + class pdw2000_base_F: Rifle_Short_Base_F {}; + class hgun_PDW2000_F: pdw2000_base_F { + ACE_barrelLength = 177.8; ACE_barrelTwist = 228.6; - ACE_barrelLength = 368.3; - }; - - // MXC - class arifle_MXC_F: arifle_MX_Base_F { - magazines[] = { - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer", - "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" - }; - initSpeed = -0.946382; - ACE_barrelTwist = 203.2; - ACE_barrelLength = 266.7; - class Single: Single { - dispersion = MOA_TO_RAD(0.90); - }; - - class FullAuto: FullAuto { - dispersion = MOA_TO_RAD(0.90); - }; + initSpeed = -0.994186; }; - // RFB SDAR - class arifle_SDAR_F: SDAR_base_F { - magazines[] = { - "20Rnd_556x45_UW_mag", - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -0.998321; - ACE_barrelTwist = 285.75; - ACE_barrelLength = 457.2; + // Vector SMG + class SMG_01_Base: Rifle_Short_Base_F {}; + class SMG_01_F: SMG_01_Base { + ACE_barrelLength = 139.7; + ACE_barrelTwist = 406.4; + initSpeed = -1.00148; }; - class SMG_02_base_F: Rifle_Short_Base_F {}; - // Scorpion Evo 3 A1 + class SMG_02_base_F: Rifle_Short_Base_F {}; class SMG_02_F: SMG_02_base_F { - initSpeed = -1.00029; - ACE_barrelTwist = 254.0; ACE_barrelLength = 195.58; + ACE_barrelTwist = 254.0; + initSpeed = -1.00029; }; // MP5K class SMG_05_base_F: Rifle_Short_Base_F { - initSpeed = -0.943783; - ACE_barrelTwist = 254.0; ACE_barrelLength = 115.0; - }; - - // CTAR-21 - class arifle_TRG20_F: Tavor_base_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -0.961496; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 381.0; - }; - - // TAR-21 - class arifle_TRG21_F: Tavor_base_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -1.0; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 459.74; - class Single: Single { - dispersion = MOA_TO_RAD(1.12); - }; - - class FullAuto: FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; - }; - - // TAR-21 EGLM - class arifle_TRG21_GL_F: arifle_TRG21_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -1.0; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 459.74; - }; - - // F2000 - class arifle_Mk20_F: mk20_base_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -0.992849; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 441.96; - }; - - // F2000 Tactical - class arifle_Mk20C_F: mk20_base_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -0.974297; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 406.4; - class Single: Single { - dispersion = MOA_TO_RAD(1.12); - }; - - class FullAuto: FullAuto { - dispersion = MOA_TO_RAD(1.12); - }; - }; - - // F2000 EGLM - class arifle_Mk20_GL_F: mk20_base_F { - magazines[] = { - "30Rnd_556x45_Stanag", - "30Rnd_556x45_Stanag_Tracer_Red", - "30Rnd_556x45_Stanag_Tracer_Green", - "30Rnd_556x45_Stanag_Tracer_Yellow", - "30Rnd_556x45_Stanag_red", - "30Rnd_556x45_Stanag_green", - "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" - }; - initSpeed = -0.974297; - ACE_barrelTwist = 177.8; - ACE_barrelLength = 406.4; - }; - - class SMG_01_Base: Rifle_Short_Base_F {}; - - // Vector SMG - class SMG_01_F: SMG_01_Base { - initSpeed = -1.00148; - ACE_barrelTwist = 406.4; - ACE_barrelLength = 139.7; - }; - - // VS-121 - class srifle_DMR_01_F: DMR_01_base_F { - magazines[] = { - "10Rnd_762x54_Mag", - "ACE_10Rnd_762x54_Tracer_mag" - }; - initSpeed = -1.00019; - ACE_barrelTwist = 241.3; - ACE_barrelLength = 609.6; - }; - - // Mk14 Mod 1 EBR - class srifle_EBR_F: EBR_base_F { - magazines[] = { - "20Rnd_762x51_Mag", - "ACE_20Rnd_762x51_Mag_Tracer", - "ACE_20Rnd_762x51_Mag_Tracer_Dim", - "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", - "ACE_20Rnd_762x51_M118LR_Mag", - "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", - "ACE_20Rnd_762x51_M993_AP_Mag", - "ACE_20Rnd_762x51_Mag_SD" - }; - initSpeed = -0.979444; - ACE_barrelTwist = 304.8; - ACE_barrelLength = 457.2; - }; - - // M200 Intervention - class srifle_LRR_F: LRR_base_F { - magazines[] = { - "7Rnd_408_Mag", - "ACE_7Rnd_408_305gr_Mag" - }; - initSpeed = -1.0; - ACE_barrelTwist = 330.2; - ACE_barrelLength = 736.6; - }; - - // GM6 Lynx - class srifle_GM6_F: GM6_base_F { - magazines[] = { - "5Rnd_127x108_Mag", - "5Rnd_127x108_APDS_Mag", - "ACE_5Rnd_127x99_Mag", - "ACE_5Rnd_127x99_API_Mag", - "ACE_5Rnd_127x99_AMAX_Mag" - }; - initSpeed = -1.0; - ACE_barrelTwist = 381.0; - ACE_barrelLength = 730; - }; - - // Noreen "Bad News" ULR - class srifle_DMR_02_F: DMR_02_base_F { - magazines[] = { - "10Rnd_338_Mag", - "ACE_10Rnd_338_300gr_HPBT_Mag", - "ACE_10Rnd_338_API526_Mag", - "ACE_20Rnd_762x67_Mk248_Mod_0_Mag", - "ACE_20Rnd_762x67_Mk248_Mod_1_Mag", - "ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag" - }; - initSpeed = -1.0; ACE_barrelTwist = 254.0; - ACE_barrelLength = 508.0; + initSpeed = -0.943783; }; - // SIG 556 - class srifle_DMR_03_F: DMR_03_base_F { - magazines[] = { - "20Rnd_762x51_Mag", - "ACE_20Rnd_762x51_Mag_Tracer", - "ACE_20Rnd_762x51_Mag_Tracer_Dim", - "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", - "ACE_20Rnd_762x51_M118LR_Mag", - "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", - "ACE_20Rnd_762x51_M993_AP_Mag", - "ACE_20Rnd_762x51_Mag_SD" - }; - initSpeed = -0.991536; + // Pistol_Base_F + // P99 + class hgun_P07_F: Pistol_Base_F { + ACE_barrelLength = 101.6; ACE_barrelTwist = 254.0; - ACE_barrelLength = 508.0; + initSpeed = -0.906977; }; - // ASP-1 Kir - class srifle_DMR_04_F: DMR_04_base_F { - initSpeed = -1.0; - ACE_barrelTwist = 203.2; - ACE_barrelLength = 450.088; + // MP-443 Grach + class hgun_Rook40_F: Pistol_Base_F { + ACE_barrelLength = 111.76; + ACE_barrelTwist = 254.0; + initSpeed = -0.934884; }; - // Cyrus - class srifle_DMR_05_blk_F: DMR_05_base_F { - initSpeed = -1.0; - ACE_barrelTwist = 359.918; - ACE_barrelLength = 620.014; + // Custom Covert II + class hgun_ACPC2_F: Pistol_Base_F { + ACE_barrelLength = 127.0; + ACE_barrelTwist = 406.4; + initSpeed = -0.984252; }; - // M14 - class srifle_DMR_06_camo_F: DMR_06_base_F { - magazines[] = { - "20Rnd_762x51_Mag", - "ACE_20Rnd_762x51_Mag_Tracer", - "ACE_20Rnd_762x51_Mag_Tracer_Dim", - "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", - "ACE_20Rnd_762x51_M118LR_Mag", - "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", - "ACE_20Rnd_762x51_M993_AP_Mag", - "ACE_20Rnd_762x51_Mag_SD" - }; - initSpeed = -0.999395; - ACE_barrelTwist = 304.8; - ACE_barrelLength = 558.8; + // FNX-45 Tactical + class hgun_Pistol_heavy_01_F: Pistol_Base_F { + ACE_barrelLength = 114.3; + ACE_barrelTwist = 406.4; + initSpeed = -0.944882; }; - // HK121 - class MMG_01_hex_F: MMG_01_base_F { - initSpeed = -0.985613; - ACE_barrelTwist = 359.918; - ACE_barrelLength = 549.91; + // Chiappa Rhino 60DS + class hgun_Pistol_heavy_02_F: Pistol_Base_F { + ACE_barrelLength = 76.2; + ACE_barrelTwist = 406.4; + initSpeed = -0.905512; }; - // LWMMG - class MMG_02_camo_F: MMG_02_base_F { - initSpeed = -1.0; - ACE_barrelTwist = 234.95; - ACE_barrelLength = 609.6; + // Makarov PM + class hgun_Pistol_01_F: Pistol_Base_F { + ACE_barrelLength = 93.5; + ACE_barrelTwist = 254.0; + initSpeed = -0.883721; }; - class HMG_127 : LMG_RCWS { - }; - class HMG_01: HMG_127 { - }; + // M2_Turret class HMG_M2: HMG_01 { - initSpeed = -1.0; - ACE_barrelTwist = 304.8; ACE_barrelLength = 1143.0; + ACE_barrelTwist = 304.8; + initSpeed = -1.0; }; /* Silencers */ diff --git a/addons/ballistics/XEH_PREP.hpp b/addons/ballistics/XEH_PREP.hpp index 812a51e6f67..c370b5fe1fd 100644 --- a/addons/ballistics/XEH_PREP.hpp +++ b/addons/ballistics/XEH_PREP.hpp @@ -1 +1,2 @@ PREP(statTextStatement_weaponMuzzleVelocity); +PREP(statTextStatement_magazineMuzzleVelocity); diff --git a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf new file mode 100644 index 00000000000..73f671343a3 --- /dev/null +++ b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf @@ -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 (unused) + * 1: Item config path + * + * Return Value: + * Display text + * + * 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"; + }; +}; diff --git a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf index 4d0f04b209a..227af9158d8 100644 --- a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf +++ b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf @@ -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 (unused) + * 1: Item config path * * Return Value: - * String to display + * Display text * * 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 { diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index bbd6e4ddd96..c10bb84e0c8 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1,6 +1,395 @@ + + + #00 Buckshot + Postas #00 + #00 Schrotmunition + #00 鹿彈 + #00 Buckshot + #00 バックショット + Chevrotine #00 + #00 Broky velké + #00 Śrut + #00 Chumbo + #00 Irisaçma + #00 Картечь + + + #00 Buckshot + Postas #00 + #00 Schrotmunition + #00 鹿彈 + #00 Buckshot + #00 バックショット + Chevrotine #00 + #00 Broky velké - kalibr 8.38 mm + #00 Śrut + #00 Chumbo + #00 Irisaçma + #00 Картечь + + + #0 Buckshot + Postas #0 + #0 Schrotmunition + #0 鹿彈 + #0 Buckshot + #0 バックショット + Chevrotine #0 + #0 Broky velké + #0 Śrut + #0 Chumbo + #0 Irisaçma + #0 Картечь + + + #0 Buckshot + Postas #0 + #0 Schrotmunition + #0 鹿彈 + #0 Buckshot + #0 バックショット + Chevrotine #0 + #0 Broky velké - kalibr 8.1 mm + #0 Śrut + #0 Chumbo + #0 Irisaçma + #0 Картечь + + + #1 Buckshot + Postas #1 + #1 Schrotmunition + #1 鹿彈 + #1 Buckshot + #1 バックショット + Chevrotine #1 + #1 Broky velké + #1 Śrut + #1 Chumbo + #1 Irisaçma + #1 Картечь + + + #1 Buckshot + Postas #1 + #1 Schrotmunition + #1 鹿彈 + #1 Buckshot + #1 バックショット + Chevrotine #1 + #1 Broky velké - kalibr 7.6 mm + #1 Śrut + #1 Chumbo + #1 Irisaçma + #1 Картечь + + + #2 Buckshot + Postas #2 + #2 Schrotmunition + #2 鹿彈 + #2 Buckshot + #2 バックショット + Chevrotine #2 + #2 Broky velké + #2 Śrut + #2 Chumbo + #2 Irisaçma + #2 Картечь + + + #2 Buckshot + Postas #2 + #2 Schrotmunition + #2 鹿彈 + #2 Buckshot + #2 バックショット + Chevrotine #2 + #2 Broky velké - kalibr 6.9 mm + #2 Śrut + #2 Chumbo + #2 Irisaçma + #2 Картечь + + + #3 Buckshot + Postas #3 + #3 Schrotmunition + #3 鹿彈 + #3 Buckshot + #3 バックショット + Chevrotine #3 + #3 Broky velké + #3 Śrut + #3 Chumbo + #3 Irisaçma + #3 Картечь + + + #3 Buckshot + Postas #3 + #3 Schrotmunition + #3 鹿彈 + #3 Buckshot + #3 バックショット + Chevrotine #3 + #3 Broky velké - kalibr 6.4 mm + #3 Śrut + #3 Chumbo + #3 Irisaçma + #3 Картечь + + + #4 Buckshot + Postas #4 + #4 Schrotmunition + #4 鹿彈 + #4 Buckshot + #4 バックショット + Chevrotine #4 + #4 Broky velké + #4 Śrut + #4 Chumbo + #4 Irisaçma + #4 Картечь + + + #4 Buckshot + Postas #4 + #4 Schrotmunition + #4 鹿彈 + #4 Buckshot + #4 バックショット + Chevrotine #4 + #4 Broky velké - kalibr 6.1 mm + #4 Śrut + #4 Chumbo + #4 Irisaçma + #4 Картечь + + + #7 Birdshot + Perdigones #7 + #7 Vogelschrot + #7 鹿彈 + #7 Birdshot + #7 バックショット + Grenaille No.4 + #7 Broky malé + #7 Śrut Drobny + #7 Küçük saçma + #7 Дробь + + + #7 Birdshot + Perdigones #7 + #7 Vogelschrot + #7 鹿彈 + #7 Birdshot + #7 バックショット + Grenaille No.4 + #7 Broky malé - kalibr 2.54 mm + #7 Śrut Drobny (Birdshot) + #7 Küçük saçma + #7 Дробь + + + 12 Gauge 2Rnd #00 Buckshot + 2 Cartuchos de Postas Calibre 12 #00 + 12 Gauge 2Schuss #00 Schrotmunition + 12鉛徑 2發 #00 鹿彈 + 12 Gauge 2Rnd #00 Buckshot + 12 ゲージ 2 発入り #00 バックショット + 2 balles cal. 12 Chevrotine #00 + 2x #00 Broky velké (kalibr 8.38 mm) + 12 Gauge 2 naboje #00 Śrut + Chumbo #00 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #00 Картечь + + + 12 Gauge 2Rnd #0 Buckshot + 2 Cartuchos de Postas Calibre 12 #0 + 12 Gauge 2Schuss #0 Schrotmunition + 12鉛徑 2發 #0 鹿彈 + 12 Gauge 2Rnd #0 Buckshot + 12 ゲージ 2 発入り #0 バックショット + 2 balles cal. 12 Chevrotine #0 + 2x #0 Broky velké (kalibr 8.1 mm) + 12 Gauge 2 naboje #0 Śrut + Chumbo #0 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #0 Картечь + + + 12 Gauge 2Rnd #1 Buckshot + 2 Cartuchos de Postas Calibre 12 #1 + 12 Gauge 2Schuss #1 Schrotmunition + 12鉛徑 2發 #1 鹿彈 + 12 Gauge 2Rnd #1 Buckshot + 12 ゲージ 2 発入り #1 バックショット + 2 balles cal. 12 Chevrotine #1 + 2x #1 Broky velké (kalibr 7.6 mm) + 12 Gauge 2 naboje #1 Śrut + Chumbo #1 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #1 Картечь + + + 12 Gauge 2Rnd #2 Buckshot + 2 Cartuchos de Postas Calibre 12 #2 + 12 Gauge 2Schuss #2 Schrotmunition + 12鉛徑 2發 #2 鹿彈 + 12 Gauge 2Rnd #2 Buckshot + 12 ゲージ 2 発入り #2 バックショット + 2 balles cal. 12 Chevrotine #2 + 2x #2 Broky velké (kalibr 6.9 mm) + 12 Gauge 2 naboje #2 Śrut + Chumbo #2 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #2 Картечь + + + 12 Gauge 2Rnd #3 Buckshot + 2 Cartuchos de Postas Calibre 12 #3 + 12 Gauge 2Schuss #3 Schrotmunition + 12鉛徑 2發 #3 鹿彈 + 12 Gauge 2Rnd #3 Buckshot + 12 ゲージ 2 発入り #3 バックショット + 2 balles cal. 12 Chevrotine #3 + 2x #3 Broky velké (kalibr 6.4 mm) + 12 Gauge 2 naboje #3 Śrut + Chumbo #3 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #3 Картечь + + + 12 Gauge 2Rnd #4 Buckshot + 2 Cartuchos de Postas Calibre 12 #4 + 12 Gauge 2Schuss #4 Schrotmunition + 12鉛徑 2發 #4 鹿彈 + 12 Gauge 2Rnd #4 Buckshot + 12 ゲージ 2 発入り #4 バックショット + 2 balles cal. 12 Chevrotine #4 + 2x #4 Broky velké (kalibr 6.1 mm) + 12 Gauge 2 naboje #4 Śrut + Chumbo #4 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #4 Картечь + + + 12 Gauge 2Rnd #7 Birdshot + 2 Cartuchos de Perdigones Calibre 12 #7 + 12 Gauge 2Schuss #7 Schrotmunition + 12鉛徑 2發 #7 鹿彈 + 12 Gauge 2Rnd #7 Birdshot + 12 ゲージ 2 発入り #7 バックショット + 2 balles cal. 12 Grenaille No.4 + 2x #7 Broky malé (kalibr 2.54 mm) + 12 Gauge 2 naboje #7 Śrut + Chumbo #7 Calibre Doze 2 Tiros + 12 Калибр 2 патр. #7 Дробь + + + 12 Gauge 6Rnd #00 Buckshot + 6 Cartuchos de Postas Calibre 12 #00 + 12 Gauge 6Schuss #00 Schrotmunition + 12鉛徑 6發 #00 鹿彈 + 12 Gauge 6Rnd #00 Buckshot + 12 ゲージ 6 発入り #00 バックショット + 6 balles cal. 12 Chevrotine #00 + 6x #00 Broky velké (kalibr 8.38 mm) + 12 Gauge 6 naboi #00 Śrut + Chumbo #00 Calibre Doze 6 Tiros + 12 Калибр 6 патр. #00 Картечь + + + 12 Gauge 6Rnd #0 Buckshot + 6 Cartuchos de Postas Calibre 12 #0 + 12 Gauge 6Schuss #0 Schrotmunition + 12鉛徑 6發 #0 鹿彈 + 12 Gauge 6Rnd #0 Buckshot + 12 ゲージ 6 発入り #0 バックショット + 6 balles cal. 12 Chevrotine #0 + 6x #0 Broky velké (kalibr 8.1 mm) + 12 Gauge 6 naboi #0 Śrut + Chumbo #0 Calibre Doze 6 Tiros + 12 Калибр 6 патр. #0 Картечь + + + 12 Gauge 6Rnd #1 Buckshot + 6 Cartuchos de Postas Calibre 12 #1 + 12 Gauge 6Schuss #1 Schrotmunition + 12鉛徑 6發 #1 鹿彈 + 12 Gauge 6Rnd #1 Buckshot + 12 ゲージ 6 発入り #1 バックショット + 6 balles cal. 12 Chevrotine #1 + 6x #1 Broky velké (kalibr 7.6 mm) + 12 Gauge 6 naboi #1 Śrut + Chumbo #1 Calibre Doze 6 Tiros + 12 Калибр 6 патр. #1 Картечь + + + 12 Gauge 6Rnd #2 Buckshot + 6 Cartuchos de Postas Calibre 12 #2 + 12 Gauge 6Schuss #2 Schrotmunition + 12鉛徑 6發 #2 鹿彈 + 12 Gauge 6Rnd #2 Buckshot + 12 ゲージ 6 発入り #2 バックショット + 6 balles cal. 12 Chevrotine #2 + 6x #2 Broky velké (kalibr 6.9 mm) + 12 Gauge 6 naboi #2 Śrut + Chumbo #2 Calibre Doze 6 Tiros + 12 Калибр 6 патр. #2 Картечь + + + 12 Gauge 6Rnd #3 Buckshot + 6 Cartuchos de Postas Calibre 12 #3 + 12 Gauge 6Schuss #3 Schrotmunition + 12鉛徑 6發 #3 鹿彈 + 12 Gauge 6Rnd #3 Buckshot + 12 ゲージ 6 発入り #3 バックショット + 6 balles cal. 12 Chevrotine #3 + 6x #3 Broky velké (kalibr 6.4 mm) + 12 Gauge 6 naboi #3 Śrut + Chumbo #3 Calibre Doze 6 Tiros + 12 Калибр 6 патр. #3 Картечь + + + 12 Gauge 6Rnd #4 Buckshot + 6 Cartuchos de Postas Calibre 12 #4 + 12 Gauge 6Schuss #4 Schrotmunition + 12鉛徑 6發 #4 鹿彈 + 12 Gauge 6Rnd #4 Buckshot + 12 ゲージ 6 発入り #4 バックショット + 6 balles cal. 12 Chevrotine #4 + 6x #4 Broky velké (kalibr 6.1 mm) + 12 Gauge 6 naboi #4 Śrut + Chumbo #4 Calibre Doze 6 Tiros + 12 Калибр 6 патр. #4 Картечь + + + 12 Gauge 6Rnd #7 Birdshot + 6 Cartuchos de Perdigones Calibre 12 #7 + 12 Gauge 6Schuss #7 Schrotmunition + 12鉛徑 6發 #7 鹿彈 + 12 Gauge 6Rnd #7 Birdshot + 12 ゲージ 6 発入り #7 バックショット + 6 balles cal. 12 Grenaille No.4 + 6x #7 Broky malé (kalibr 2.54 mm) + 12 Gauge 6 naboi #7 Śrut + 12 Калибр 6 патр. #7 Дробь + + + 12 Gauge 15Rnd #00 Buckshot + 15 Cartuchos de Postas Calibre 12 #00 + 12 Gauge 15Schuss #00 Schrotmunition + 12鉛徑 15發 #00 鹿彈 + 12 Gauge 15Rnd #00 Buckshot + 12 ゲージ 15 発入り #00 バックショット + 15 balles cal. 12 Chevrotine #00 + 15x #00 Broky velké (kalibr 8.38 mm) + 12 Gauge 15 naboi #00 Śrut + Chumbo #00 Calibre Doze 15 Tiros + 12 Калибр 15 патр. #00 Картечь + 6.5x47mm 20Rnd Mag (HPBT Scenar) @@ -15,7 +404,7 @@ 6,5x47mm 20-lövedékes tár (HPBT Scenar) 6.5x47mm 20発入り 弾倉 (HPBT Scenar) 20발들이 6.5x47mm (HPBT Scenar) - 6.5x47mm 20發 彈匣 (Lapua 空尖艇尾狙擊專用彈) + 6.5x47毫米 20發 彈匣 (拉普 空尖艇尾狙擊專用彈) 6.5x47mm 20发 弹匣 (Lapua 空尖艇尾狙击专用弹) @@ -31,12 +420,12 @@ 6,5mm Lapua 6.5mm Lapua 6.5mm Lapua - 6.5mm Lapua 空尖艇尾狙擊專用彈 + 6.5毫米 拉普 空尖艇尾狙擊專用彈 6.5mm Lapua 空尖艇尾狙击专用弹 Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 20<br />Used in: QBU-88 - Calibre: 6,5x47mm (HPBT Scenar)<br />Cartouches: 20 + Calibre: 6,5x47mm (HPBT Scenar)<br />Cartouches: 20<br />Utilisé avec: QBU-88 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 20<br />Se usa en: QBU-88 Kaliber: 6,5x47mm (HPBT Scenar)<br />Pociski: 20 Калибр: 6,5x47 мм (экспансивные Scenar)<br />Патронов: 20<br />Используются с: QBU-88 @@ -47,7 +436,7 @@ Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 20<br />Használható: QBU-88 口径: 6.5x47mm (HPBT Scenar)<br />装填数: 20<br />次で使用: QBU-88 구경: 6.5x47mm (HPBT Scenar)<br />장탄수: 20<br />사용처: QBU-88 - 口徑: 6.5x47mm (Lapua 空尖艇尾狙擊專用彈)<br />發數: 20<br />使用於: QBU-88 + 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 20<br />使用於: QBU-88 口径: 6.5x47mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 20<br />使用于: QBU-88 @@ -63,7 +452,7 @@ 6,5mm Creedmor 20-lövedékes tár 6.5mm Creedmor 20発入り 弾倉 20발들이 6.5mm Creedmor 탄창 - 6.5mm 20發 彈匣 (Creedmor 狙擊專用彈) + 6.5毫米 20發 彈匣 (克里德莫爾(CM) 狙擊專用彈) 6.5mm 20发 弹匣 (Creedmor 狙击专用弹) @@ -79,7 +468,7 @@ 6,5mm CM 6.5mm CM 6.5mm CM - 6.5mm CM 狙擊專用彈 + 6.5毫米 CM 狙擊專用彈 6.5mm CM 狙击专用弹 @@ -95,7 +484,7 @@ Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 20<br />Használható: QBU-88 口径: 6.5x47mm Creedmor<br />装填数: 20<br />次で使用: QBU-88 구경: 6.5x47mm Creedmor<br />장탄수: 20<br />사용처: QBU-88 - 口徑: 6.5x47mm Creedmor 狙擊專用彈<br />發數: 20<br />使用於: QBU-88 + 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 20<br />使用於: QBU-88 口径: 6.5x47mm Creedmor 狙击专用弹<br />发数: 20<br />使用于: QBU-88 @@ -112,7 +501,7 @@ Магазин из 30-ти 6,5 мм ИК-трассирующих 6.5mm 30発入り IR-DIM曳光弾 弾倉 30발들이 6.5mm IR-DIM 예광탄 탄창 - 6.5mm 30發 低視度紅外線曳光彈 彈匣 + 6.5毫米 30發 低視度紅外線曳光彈 彈匣 6.5mm 30发 低视度红外线曳光弹 弹匣 @@ -128,7 +517,7 @@ 6,5 мм ИК-трассирующие 6.5mm IR-DIM曳光弾 6.5mm IR-DIM 예광탄 - 6.5mm 低視紅外曳光彈 + 6.5毫米 低視紅外曳光彈 6.5mm 低视红外曳光弹 @@ -144,7 +533,7 @@ Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 口径: 6.5x39mm 曳光弾 IR-DIM<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 구경: 6.5x39mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL - 口徑: 6.5x39mm 低視度紅外線曳光彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL + 口徑: 6.5x39毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL 口径: 6.5x39mm 低视度红外线曳光弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL @@ -160,7 +549,7 @@ Магазин из 30-ти 6,5 мм дозвуковых 6.5mm 30発入り 亜音速弾 弾倉 30발들이 6.5mm 아음속탄 탄창 - 6.5mm 30發 消音彈 彈匣 + 6.5毫米 30發 消音彈 彈匣 6.5mm 30发 消音弹 弹匣 @@ -176,7 +565,7 @@ 6,5 мм дозвуковые 6.5mm 亜音速弾 6.5mm 아음속탄 - 6.5mm 消音彈 + 6.5毫米 消音彈 6.5mm 消音弹 @@ -192,7 +581,7 @@ Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 口径: 6.5x39mm 亜音速弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 구경: 6.5x39mm SD<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL - 口徑: 6.5x39mm 消音彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL + 口徑: 6.5x39毫米 消音彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL 口径: 6.5x39mm 消音弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL @@ -208,7 +597,7 @@ Магазин из 30-ти 6,5 мм бронебойных 6.5mm 30 発入り徹甲弾 弾倉 30발들이 6.5mm 철갑탄 탄창 - 6.5mm 30發 穿甲彈 彈匣 + 6.5毫米30發 穿甲彈 彈匣 6.5mm 30发 穿甲弹 弹匣 @@ -224,7 +613,7 @@ 6,5 мм бронебойные 6.5mm 徹甲弾 6.5mm 철갑탄 - 6.5mm 穿甲彈 + 6.5毫米 穿甲彈 6.5mm 穿甲弹 @@ -240,7 +629,7 @@ Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 口径: 6.5x39mm 徹甲弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 구경: 6.5x39mm 철갑탄<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL - 口徑: 6.5x39mm 穿甲彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL + 口徑: 6.5x39毫米 穿甲彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL 口径: 6.5x39mm 穿甲弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL @@ -257,7 +646,7 @@ Магазин из 30-ти 6,5 мм ИК-трассирующих 6.5mm 30発入り IR-DIM曳光弾 弾倉 30발들이 6.5mm IR-DIM 예광탄 탄창 - 6.5mm 30發 低視度紅外線曳光彈 彈匣 + 6.5毫米 30發 低視度紅外線曳光彈 彈匣 6.5mm 30发 低视度红外线曳光弹 弹匣 @@ -273,7 +662,7 @@ 6,5 мм ИК-трассирующие 6.5mm IR-DIM曳光弾 6.5mm IR-DIM 예광탄 - 6.5mm 低視紅外曳光彈 + 6.5毫米 低視紅外曳光彈 6.5mm 低视红外曳光弹 @@ -289,7 +678,7 @@ Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: Katiba 口径: 6.5x39mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: Katiba 구경: 6.5x39mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: Katiba - 口徑: 6.5x39mm 低視度紅外線曳光彈<br />發數: 30<br />使用於: Katiba + 口徑: 6.5x39毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: Katiba 口径: 6.5x39mm 低视度红外线曳光弹<br />发数: 30<br />使用于: Katiba @@ -305,7 +694,7 @@ Магазин из 30-ти 6,5 мм дозвуковых 6.5mm 30発入り 亜音速弾 弾倉 30발들이 6.5mm 아음속탄 탄창 - 6.5mm 30發 消音彈 彈匣 + 6.5毫米 30發 消音彈 彈匣 6.5mm 30发 消音弹 弹匣 @@ -321,7 +710,7 @@ 6,5 мм дозвуковые 6.5mm 亜音速弾 6.5mm 아음속탄 - 6.5mm 消音彈 + 6.5毫米 消音彈 6.5mm 消音弹 @@ -337,7 +726,7 @@ Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: Katiba 口径: 6.5x39mm 亜音速弾<br />装填数: 30<br />次で使用: Katiba 구경: 6.5x39mm 아음속탄<br />장탄수: 30<br />사용처: Katiba - 口徑: 6.5x39mm 消音彈<br />發數: 30<br />使用於: Katiba + 口徑: 6.5x39毫米 消音彈<br />發數: 30<br />使用於: Katiba 口径: 6.5x39mm 消音弹<br />发数: 30<br />使用于: Katiba @@ -353,7 +742,7 @@ Магазин из 30-ти 6,5 мм бронебойных 6.5mm 30 発入り徹甲弾 弾倉 30발들이 6.5mm 철갑탄 탄창 - 6.5mm 30發 穿甲彈 彈匣 + 6.5毫米 30發 穿甲彈 彈匣 6.5mm 30发 穿甲弹 弹匣 @@ -369,7 +758,7 @@ 6,5 мм бронебойные 6.5mm 徹甲弾 6.5mm 철갑탄 - 6.5mm 穿甲彈 + 6.5毫米 穿甲彈 6.5mm 穿甲弹 @@ -385,7 +774,7 @@ Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: Katiba 口径: 6.5x39mm 徹甲弾<br />装填数: 30<br />次で使用: Katiba 구경: 6.5x39mm 철갑탄<br />장탄수: 30<br />사용처: Katiba - 口徑: 6.5x39mm 穿甲彈<br />發數: 30<br />使用於: Katiba + 口徑: 6.5x39m毫米 穿甲彈<br />發數: 30<br />使用於: Katiba 口径: 6.5x39mm 穿甲弹<br />发数: 30<br />使用于: Katiba @@ -402,7 +791,7 @@ Магазин из 30-ти 5,56 мм ИК-трассирующих 5.56mm 30発入り IR-DIM曳光弾 弾倉 30발 들이 5.56mm IR-DIM 예광탄 탄창 - 5.56mm 30發 低視度紅外線曳光彈 彈匣 + 5.56毫米 30發 低視度紅外線曳光彈 彈匣 5.56mm 30发 低视度红外线曳光弹 弹匣 @@ -418,7 +807,7 @@ 5,56 мм ИК-трассирующие 5.56mm IR-DIM曳光弾 5.56mm IR-DIM 예광탄 - 5.56mm 低視紅外曳光彈 + 5.56毫米 低視紅外曳光彈 5.56mm 低视红外曳光弹 @@ -434,7 +823,7 @@ Калибр: 5,56x45 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 口径: 5.56x45mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 구경: 5.56x45mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 口徑: 5.56x45mm 低視度紅外線曳光彈<br />發數: 30<br />使用於: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 口徑: 5.56x45毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 口径: 5.56x45mm 低视度红外线曳光弹<br />发数: 30<br />使用于: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -451,7 +840,7 @@ Магазин из 20-ти 7,62 мм трассирующих 7.62mm 20発入り 曳光弾 20발들이 7.62mm 예광탄 탄창 - 7.62mm 20發 曳光彈 彈匣 + 7.62毫米 20發 曳光彈 彈匣 7.62mm 20发 曳光弹 弹匣 @@ -459,7 +848,7 @@ 7,62mm Nyomjelző 7,62mm Leuchtspur 7,62mm Trazadora - 7,62mm Traçantes + 7,62mm Traçante 7,62mm Smugacz 7.62mm Svítící 7,62mm Traçante @@ -467,7 +856,7 @@ 7,62 мм трассирущие 7.62mm 曳光弾 7.62mm 예광탄 - 7.62mm 曳光彈 + 7.62毫米 曳光彈 7.62mm 曳光弹 @@ -475,7 +864,7 @@ Kaliber: 7,62x51mm Nyomjelző<br />Lövedékek: 20<br />Használható: Mk18 ABR Kaliber: 7,62x51mm Leuchtspur<br />Patronen: 20<br />Eingesetzt von: EBR Calibre: 7,62x51mm Trazadora<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51mm Traçantes<br />Cartouches: 20<br />Utilisé avec: EBR + Calibre: 7,62x51mm Traçante<br />Cartouches: 20<br />Utilisé avec: Mk18 ABR Kaliber: 7,62x51mm Smugacz<br />Pociski: 20<br />Używane w: Mk18 ABR Ráže: 7.62x51mm Svítící<br />Nábojů: 20<br />Použití u: Mk14 Mod 1 EBR Calibre: 7,62x51mm Traçante<br />Projéteis: 20<br />Usado em: Mk18 ABR @@ -483,7 +872,7 @@ Калибр: 7,62x51 мм трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 口径: 7.62x51mm 曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR 구경: 7.62x51mm 예광탄<br />장탄수: 20<br />사용처: Mk18 ABR - 口徑: 7.62x51mm 曳光彈<br />發數: 20<br />使用於: Mk18 ABR + 口徑: 7.62x51毫米 曳光彈<br />發數: 20<br />使用於: Mk18 ABR 口径: 7.62x51mm 曳光弹<br />发数: 20<br />使用于: Mk18 ABR @@ -499,7 +888,7 @@ Магазин из 20-ти 7,62 мм ИК-трассирующих 7.62mm 20発入り IR-DIM曳光弾 20발들이 7.62mm IR-DIM 예광탄 탄창 - 7.62mm 20發 低視度紅外線曳光彈 彈匣 + 7.62毫米 20發 低視度紅外線曳光彈 彈匣 7.62mm 20发 低视度红外线曳光弹 弹匣 @@ -515,7 +904,7 @@ 7,62 мм ИК-трассирующие 7.62mm IR-DIM曳光弾 7.62mm IR-DIM 예광탄 - 7.62mm 低視紅外曳光彈 + 7.62毫米 低視紅外曳光彈 7.62mm 低视红外曳光弹 @@ -523,7 +912,7 @@ Kaliber: 7,62x51mm Nyomjelző IR-DIM<br />Lövedékek: 20<br />Használható: Mk18 ABR Kaliber: 7,62x51mm Leuchtspur IR-DIM<br />Patronen: 20<br />Eingesetzt von: EBR Calibre: 7,62x51mm Trazadoras IR-DIM<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51mm Traçantes IR-DIM<br />Cartouches: 20<br />Utilisé avec: EBR + Calibre: 7,62x51mm Traçante IR-DIM<br />Cartouches: 20<br />Utilisé avec: Mk18 ABR Kaliber: 7,62x51mm Smugacz IR-DIM<br />Pociski: 20<br />Używane w: Mk18 ABR Ráže: 7.62x51mm Svítící IR-DIM<br />Nábojů: 20<br />Použití u: Mk14 Mod 1 EBR Calibre: 7,62x51mm Traçante IR-DIM<br />Projéteis: 20<br />Usado em: Mk18 ABR @@ -531,7 +920,7 @@ Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 口径: 7.62x51mm IR-DIM曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR 구경: 7.62x51mm IR-DIM 예광탄<br />장탄수: 20<br />사용처: Mk18 ABR - 口徑: 7.62x51mm 低視度紅外線曳光彈<br />發數: 20<br />使用於: Mk18 ABR + 口徑: 7.62x51毫米 低視度紅外線曳光彈<br />發數: 20<br />使用於: Mk18 ABR 口径: 7.62x51mm 低视度红外线曳光弹<br />发数: 20<br />使用于: Mk18 ABR @@ -547,7 +936,7 @@ Магазин из 20-ти 7,62 мм дозвуковых 7.62mm 20発入り 亜音速弾 弾倉 20발들이 7.62mm 아음속탄 탄창 - 7.62mm 20發 消音彈 彈匣 + 7.62毫米 20發 消音彈 彈匣 7.62mm 20发 消音弹 弹匣 @@ -563,7 +952,7 @@ 7,62 мм дозвуковые 7.62mm 亜音速弾 7.62mm 아음속탄 - 7.62mm 消音彈 + 7.62毫米 消音彈 7.62mm 消音弹 @@ -571,7 +960,7 @@ Kaliber: 7,62x51mm Halk<br />Lövedékek: 20<br />Használható: Mk18 ABR Kaliber: 7,62x51mm SD<br />Patronen: 20<br />Eingesetzt von: EBR Calibre: 7,62x51mm SD<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51mm SD<br />Cartouches: 20<br />Utilisé avec: EBR + Calibre: 7,62x51mm SD<br />Cartouches: 20<br />Utilisé avec: Mk18 ABR Kaliber: 7,62x51mm SD<br />Pociski: 20<br />Używane w: Mk18 ABR Ráže: 7.62x51mm SD<br />Nábojů: 20<br />Použití u: Mk14 Mod 1 EBR Calibre: 7,62x51mm SD<br />Projéteis: 20<br />Usado em: Mk18 ABR @@ -579,7 +968,7 @@ Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR 口径: 7.62x51mm 亜音速弾<br />装填数: 20<br />次で使用: Mk18 ABR 구경: 7.62x51mm SD<br />장탄수: 20<br />사용처: Mk18 ABR - 口徑: 7.62x51mm 消音彈<br />發數: 20<br />使用於: Mk18 ABR + 口徑: 7.62x51毫米 消音彈<br />發數: 20<br />使用於: Mk18 ABR 口径: 7.62x51mm 消音弹<br />发数: 20<br />使用于: Mk18 ABR @@ -587,7 +976,7 @@ .338 NM 130Rnd Tracer Belt .338 NM 130-Patronen-Gurt Leuchtspur Taśma .338 NM 130rd Smugacz - Bande .338 NM 130Cps Traçante + Bande .338 NM 130Cps Traçantes Cinta de 130 balas trazadoras de .338 NM Лента из 130-ти .338 NM трассирующих .338 NM 130Rnd Tracciante Belt @@ -596,7 +985,7 @@ .338 NM 130-lövedékes nyomkövető heveder .338 NM 130発入り 曳光弾ベルト 130발들이 .338 NM 예광탄 벨트 - .338 NM 130發 曳光彈 彈鏈 + .338 拉普麥格農(NM) 130發 曳光彈 彈鏈 .338 NM 130发 曳光弹 弹链 @@ -614,6 +1003,7 @@ .338 NM 예광탄 .338 NM 曳光彈 .338 NM 曳光弹 + .338 NM Tracer Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG @@ -628,7 +1018,7 @@ Kaliber: .338 Norma Magnum nyomkövető<br />Lövedékek: 130<br />Használható: SPMG 口径: .338 Norma Magnum 曳光弾<br />装填数: 130<br />次で使用: SPMG 구경: .338 Norma 매그넘 예광탄<br />장탄수: 130<br />사용처: SPMG - 口徑: .338 Norma Magnum 曳光彈<br />發數: 130<br />使用於: SPMG + 口徑: .338 拉普麥格農 曳光彈<br />發數: 130<br />使用於: SPMG 口径: .338 Norma Magnum 曳光弹<br />发数: 130<br />使用于: SPMG @@ -644,7 +1034,7 @@ .338 NM 130-lövedékes infravörös nyomkövető heveder .338 NM 130発入り IR-DIM曳光弾ベルト 130발들이 .338 NM IR-DIM 예광탄 벨트 - .338 NM 130發 低視度紅外線曳光彈 彈鏈 + .338 拉普麥格農(NM) 130發 低視度紅外線曳光彈 彈鏈 .338 NM 130发 低视度红外线曳光弹 弹链 @@ -662,6 +1052,7 @@ .338 NM IR-DIM 예광탄 .338 NM 低視紅外曳光彈 .338 NM 低视红外曳光弹 + .338 NM IR-DIM Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG @@ -676,7 +1067,7 @@ Kaliber: .338 Norma Magnum infravörös nyomkövető<br />Lövedékek: 130<br />Használható: SPMG 口径: .338 Norma Magnum IR-DIM曳光弾<br />装填数: 130<br />次で使用: SPMG 구경: .338 Norma 매그넘 IR-DIM 예광탄<br />장탄수: 130<br />사용처: SPMG - 口徑: .338 Norma Magnum 低視度紅外線曳光彈<br />發數: 130<br />使用於: SPMG + 口徑: .338 拉普麥格農 低視度紅外線曳光彈<br />發數: 130<br />使用於: SPMG 口径: .338 Norma Magnum 低视度红外线曳光弹<br />发数: 130<br />使用于: SPMG @@ -692,7 +1083,7 @@ .338 NM 130-lövedékes páncéltörő heveder .338 NM 130発入り 徹甲弾ベルト 130발들이 .338 NM 철갑탄 벨트 - .338 NM 130發 穿甲彈 彈鏈 + .338 拉普麥格農(NM) 130發 穿甲彈 彈鏈 .338 NM 130发 穿甲弹 弹链 @@ -710,6 +1101,7 @@ .338 NM 철갑탄 .338 NM 穿甲彈 .338 NM 穿甲弹 + .338 NM AP Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG @@ -724,7 +1116,7 @@ Kaliber: .338 Norma Magnum páncéltörő<br />Lövedékek: 130<br />Használható: SPMG 口径: .338 Norma Magnum 徹甲弾<br />装填数: 130<br />次で使用: SPMG 구경: .338 Norma 매그넘 철갑탄<br />장탄수: 130<br />사용처: SPMG - 口徑: .338 Norma Magnum 穿甲彈<br />發數: 130<br />使用於: SPMG + 口徑: .338 拉普麥格農 穿甲彈<br />發數: 130<br />使用於: SPMG 口径: .338 Norma Magnum 穿甲弹<br />发数: 130<br />使用于: SPMG @@ -732,7 +1124,7 @@ 9.3mm 10Rnd Tracer Mag 9,3mm 10-Patronen-Magazin Leuchtspur Magazynek 9.3mm 10rd Smugacz - Ch. 9,3mm 10Cps Traçante + Ch. 9,3mm 10Cps Traçantes Cargador de 10 balas trazadoras de 9.3mm Магазин из 10-ти 9,3 мм трассирующих 9.3mm 10Rnd Tracer Mag @@ -741,7 +1133,7 @@ 9,3mm 10-lövedékes nyomkövető tár 9.3mm 10発入り 曳光弾 弾倉 10발들이 9.3mm 예광탄 탄창 - 9.3mm 10發 曳光彈 彈匣 + 9.3毫米 10發 曳光彈 彈匣 9.3mm 10发 曳光弹 弹匣 @@ -757,8 +1149,9 @@ 9,3mm nyomkövető 9.3mm 曳光弾 9.3mm 예광탄 - 9.3mm 曳光彈 + 9.3毫米 曳光彈 9.3mm 曳光弹 + 9.3mm Tracer Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus @@ -773,14 +1166,14 @@ Kaliber: 9,3x64mm nyomkövető<br />Lövedékek: 10<br />Használható: Cyrus 口径: 9.3x64mm 曳光弾<br />装填数: 10<br />次で使用: Cyrus 구경: 9.3x64mm 예광탄<br />장탄수: 10<br />사용처: Cyrus - 口徑: 9.3x64mm 曳光彈<br />發數: 10<br />使用於: Cyrus + 口徑: 9.3x64毫米 曳光彈<br />發數: 10<br />使用於: Cyrus 口径: 9.3x64mm 曳光弹<br />发数: 10<br />使用于: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag 9,3mm 10-Patronen-Magazin Leuchtspur IR-DIM Magazynek 9,3mm 10rd Smugacz IR-DIM - Ch. 9,3mm 10Cps Traçante IR-DIM + Ch. 9,3mm 10Cps Traçantes IR-DIM Cargador de 10 balas trazadoras IR-DIM de 9.3mm Магазин из 10-ти 9,3 мм ИК-трассирующих 9.3mm 10Rnd Tracciante IR-DIM Mag @@ -789,7 +1182,7 @@ 9,3mm 10-lövedékes infravörös nyomkövető tár 9.3mm 10発入り IR-DIM曳光弾 弾倉 10발들이 9.3mm IR-DIM 예광탄 탄창 - 9.3mm 10發 低視度紅外線曳光彈 彈匣 + 9.3毫米 10發 低視度紅外線曳光彈 彈匣 9.3mm 10发 低视度红外线曳光弹 弹匣 @@ -805,8 +1198,9 @@ 9,3mm infravörös nyomkövető 9.3mm IR-DIM曳光弾 9.3mm IR-DIM 예광탄 - 9.3mm 低視紅外曳光彈 + 9.3毫米 低視紅外曳光彈 9.3mm 低视红外曳光弹 + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus @@ -821,7 +1215,7 @@ Kaliber: 9,3x64mm infravörös nyomkövető<br />Lövedékek: 10<br /> Használható: Cyrus 口径: 9.3x64mm IR-DIM曳光弾<br />装填数: 10<br />次で使用: Cyrus 구경: 9.3x64mm IR-DIM 예광탄<br />장탄수: 10<br />사용처: Cyrus - 口徑: 9.3x64mm 低視度紅外線曳光彈<br />發數: 10<br />使用於: Cyrus + 口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 10<br />使用於: Cyrus 口径: 9.3x64mm 低视度红外线曳光弹<br />发数: 10<br />使用于: Cyrus @@ -829,7 +1223,7 @@ 9.3mm 150Rnd Tracer Belt 9,3mm 150-Patronen-Gurt Leuchtspur Taśma 9,3mm 150rd Smugacz - Bande 9,3mm 150Cps Traçante + Bande 9,3mm 150Cps Traçantes Cinta de 150 balas trazadoras de 9.3mm Лента из 150-ти 9,3 мм трассирующих 9.3mm 150Rnd Tracer Belt @@ -838,7 +1232,7 @@ 9,3mm 150-lövedékes nyomkövető heveder 9.3mm 150発入り 曳光弾ベルト 150발들이 9.3mm 예광탄 벨트 - 9.3mm 150發 曳光彈 彈鏈 + 9.3毫米 150發 曳光彈 彈鏈 9.3mm 150发 曳光弹 弹链 @@ -854,14 +1248,15 @@ 9,3mm nyomkövető 9.3mm 曳光弾 9.3mm 예광탄 - 9.3mm 曳光彈 + 9.3毫米 曳光彈 9.3mm 曳光弹 + 9.3mm Tracer Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur<br />Patronen: 150<br />Eingesetzt von: Navid Kaliber: 9,3x64mm Smugacz<br />Pociski: 150<br />Używane w: Navid - Calibre: 9,3x64mm Traçante<br />Cartouches: 150<br />Utilisé avec: Navid + Calibre: 9,3x64mm Traçantes<br />Cartouches: 150<br />Utilisé avec: Navid Calibre: 9.3x64mm trazadora<br />Balas: 150<br />Se usa en: Navid Калибр: 9,3x64 мм трассирующие<br />Патронов: 150<br />Используются с: Навид Calibro: 9.3x64mm Tracciante<br />Munizioni: 150<br />In uso su: Navid @@ -870,14 +1265,14 @@ Kaliber: 9,3x64mm nyomkövető<br />Lövedékek: 150<br />Használható: Navid 口径: 9.3x64mm 曳光弾<br />装填数: 150<br />次で使用: Navid 구경: 9.3x64mm 예광탄<br />장탄수: 150<br />사용처: Navid - 口徑: 9.3x64mm 曳光彈<br />發數: 150<br />使用於: Navid + 口徑: 9.3x64m毫米 曳光彈<br />發數: 150<br />使用於: Navid 口径: 9.3x64mm 曳光弹<br />发数: 150<br />使用于: Navid 9.3mm 150Rnd Tracer IR-DIM Belt 9,3mm 150-Patronen-Gurt Leuchtspur IR-DIM Taśma 9,3mm 150rd Smugacz IR-DIM - Bande 9,3mm 150Cps Traçante IR-DIM + Bande 9,3mm 150Cps Traçantes IR-DIM Cinta de 150 balas trazadoras IR-DIM de 9.3mm Лента из 150-ти 9,3 мм ИК-трассирующих 9.3mm 150Rnd Tracciante IR-DIM Belt @@ -886,7 +1281,7 @@ 9,3mm 150-lövedékes infravörös nyomkövető heveder 9.3mm 150発入り IR-DIM曳光弾ベルト 150발들이 9.3mm IR-DIM 예광탄 벨트 - 9.3mm 150發 低視度紅外線曳光彈 彈鏈 + 9.3毫米 150發 低視度紅外線曳光彈 彈鏈 9.3mm 150发 低视度红外线曳光弹 弹链 @@ -902,8 +1297,9 @@ 9,3mm infravörös nyomkövető 9.3mm IR-DIM曳光弾 9.3mm IR-DIM 예광탄 - 9.3mm 低視紅外曳光彈 + 9.3毫米 低視紅外曳光彈 9.3mm 低视红外曳光弹 + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid @@ -918,7 +1314,7 @@ Kaliber: 9,3x64mm infravörös nyomkövető<br />Lövedékek: 150<br />Használható: Navid 口径: 9.3x64mm IR-DIM曳光弾<br />装填数: 150<br />次で使用: Navid 구경: 9.3x64mm IR-DIM 예광탄<br />장탄수: 150<br />사용처: Navid - 口徑: 9.3x64mm 低視度紅外線曳光彈<br />發數: 150<br />使用於: Navid + 口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 150<br />使用於: Navid 口径: 9.3x64mm 低视度红外线曳光弹<br />发数: 150<br />使用于: Navid @@ -934,7 +1330,7 @@ 9,3mm 150-lövedékes páncéltörő heveder 9.3mm 150発入り 徹甲弾ベルト 150발들이 9.3mm 철갑탄 벨트 - 9.3mm 150發 穿甲彈 彈鏈 + 9.3毫米 150發 穿甲彈 彈鏈 9.3mm 150发 穿甲弹 弹链 @@ -950,8 +1346,9 @@ 9,3mm páncéltörő 9.3mm 徹甲弾 9.3mm 철갑탄 - 9.3mm 穿甲彈 + 9.3毫米 穿甲彈 9.3mm 穿甲弹 + 9.3mm AP Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid @@ -966,7 +1363,7 @@ Kaliber: 9,3x64mm páncéltörő<br />Lövedékek: 150<br />Használható: Navid 口径: 9.3x64mm 徹甲弾<br />装填数: 150<br />次で使用: Navid 구경: 9.3x64mm 철갑탄<br />장탄수: 150<br />사용처: Navid - 口徑: 9.3x64mm 穿甲彈<br />發數: 150<br />使用於: Navid + 口徑: 9.3x64毫米 穿甲彈<br />發數: 150<br />使用於: Navid 口径: 9.3x64mm 穿甲弹<br />发数: 150<br />使用于: Navid @@ -982,7 +1379,7 @@ 9x19mm 16-lövedékes tár 9x19mm 16発入り 弾倉 16발들이 9x19mm 탄창 - 9x19mm 16發 彈匣 + 9x19毫米 16發 彈匣 9x19mm 16发 弹匣 @@ -998,8 +1395,9 @@ 9x19mm 9x19mm 9x19mm - 9x19mm + 9x19毫米 9x19mm + 9x19mm 9x19mm 30Rnd Mag @@ -1014,7 +1412,7 @@ 9x19mm 16-lövedékes tár 9x19mm 30発入り 弾倉 30발들이 9x19mm 탄창 - 9x19mm 30發 彈匣 + 9x19毫米 30發 彈匣 9x19mm 30发 弹匣 @@ -1030,7 +1428,7 @@ 9x19mm 30-lövedékes tár 9x19mm 30発入り 弾倉 30발들이 9x19mm 탄창 - 9x19mm 30發 彈匣 + 9x19毫米 30發 彈匣 9x19mm 30发 弹匣 @@ -1046,8 +1444,9 @@ 9x19mm 9x19mm 9x19mm - 9x19mm + 9x19毫米 9x19mm + 9x19mm 9x19mm 30Rnd Mag @@ -1062,13 +1461,13 @@ 9x19mm 30-lövedékes tár 9x19mm 30発入り 弾倉 30발들이 9x19mm 탄창 - 9x19mm 30發 彈匣 + 9x19毫米 30發 彈匣 9x19mm 30发 弹匣 7.62x54mm 10Rnd Tracer Mag Magazynek 7,62x54mm 10rd Smugacz - Ch. 7,62x54mm 10Cps Traçante + Ch. 7,62x54mm 10Cps Traçantes Cargador de 10 balas trazadoras de 7.62x54mm Магазин из 10-ти 7,62 мм ИК-трассирующих 7,62x54mm 10-Patronen-Magazin Leuchtspur @@ -1078,7 +1477,7 @@ 7,62x54mm 10-lövedékes nyomkövető tár 7.62x54mm 10発入り 曳光弾 弾倉 10발들이 7.62x54mm 예광탄 탄창 - 7.62x54mm 10發 曳光彈 彈匣 + 7.62x54毫米 10發 曳光彈 彈匣 7.62x54mm 10发 曳光弹 弹匣 @@ -1094,13 +1493,14 @@ 7,62mm 7.62mm 7.62mm - 7.62mm + 7.62毫米 7.62mm + 7.62mm 7.62x54mm 10Rnd Tracer Mag Magazynek 7,62x54mm 10rd Smugacz - Ch. 7,62x54mm 10Cps Traçante + Ch. 7,62x54mm 10Cps Traçantes Cargador de 10 balas trazadoras de 7.62x54mm Магазин из 10-ти 7,62 мм ИК-трассирующих 7,62x54mm 10-Patronen-Magazin Leuchtspur @@ -1110,13 +1510,13 @@ 7,62x54mm 10-lövedékes nyomkövető tár 7.62x54mm 10発入り 曳光弾 弾倉 10발들이 7.62x54mm 예광탄 탄창 - 7.62x54mm 10發 曳光彈 彈匣 + 7.62x54毫米 10發 曳光彈 彈匣 7.62x54mm 10发 曳光弹 弹匣 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM - Ch. 6,5mm 100Cps Traçante IR-DIM + Ch. 6,5mm 100Cps Traçantes IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm Магазин из 100 6,5 мм ИК-трассирующих 6,5mm 100-Patronen-Magazin IR-DIM Leuchtspur @@ -1126,7 +1526,7 @@ 6,5mm 100-lövedékes infravörös nyomkövető tár 6.5mm 100発入り IR-DIM曳光弾 弾倉 100발들이 6.5mm IR-DIM 예광탄 탄창 - 6.5mm 100發 低視度紅外線曳光彈 彈匣 + 6.5毫米 100發 低視度紅外線曳光彈 彈匣 6.5mm 100发 低视度红外线曳光弹 弹匣 @@ -1142,13 +1542,14 @@ 6,5mm infravörös nyomkövető 6.5mm IR-DIM曳光弾 6.5mm IR-DIM 예광탄 - 6.5mm 低視紅外曳光彈 + 6.5毫米 低視紅外曳光彈 6.5mm 低视红外曳光弹 + 6.5mm IR-DIM 6.5mm 100Rnd Tracer IR-DIM Mag<br />Rounds: 100<br />Used in: MX LSW Magazynek 6,5mm 100rd Smugacz IR-DIM - Ch. 6,5mm 100Cps Traçante IR-DIM<br />Cartouches: 100<br />Utilisé avec: MX LSW + Ch. 6,5mm 100Cps Traçantes IR-DIM<br />Cartouches: 100<br />Utilisé avec: MX LSW Cargador de 100 balas trazadoras IR-DIM de 6.5mm Магазин из 100 6,5 мм ИК-трассирующих 6,5mm 100-Patronen-Magazin IR-DIM Leuchtspur<br />Patronen: 100<br />Eingesetzt von: MXLSW @@ -1158,13 +1559,13 @@ 6.5mm 100-lövedékes infravörös nyomkövető tár<br />Lövedékek: 100<br />Használható: MX LSW 6.5mm 100発入り IR-DIM曳光弾 弾倉<br />装填数: 100<br />次で使用: MX LSW 100발들이 6.5mm IR-DIM 예광탄 탄창<br />장탄수: 100<br />사용처: MX LSW - 6.5mm 100發 低視度紅外線曳光彈<br />發數: 100<br />使用於: MX LSW + 6.5毫米 100發 低視度紅外線曳光彈<br />發數: 100<br />使用於: MX LSW 6.5mm 100发 低视度红外线曳光弹<br />发数: 100<br />使用于: MX LSW 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM - Bande 6,5mm 200Cps Traçante IR-DIM + Bande 6,5mm 200Cps Traçantes IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm Магазин из 200-т 6,5 мм ИК-трассирующих 6,5mm 200-Patronen-Gurt IR-DIM Leuchtspur @@ -1174,7 +1575,7 @@ 6,5mm 200-lövedékes infravörös nyomkövető heveder 6.5mm 200発入り IR-DIM曳光弾ベルト 200발들이 6.5mm IR-DIM 예광탄 탄창 - 6.5mm 200發 低視度紅外線曳光彈 彈鏈 + 6.5毫米 200發 低視度紅外線曳光彈 彈鏈 6.5mm 200发 低视度红外线曳光弹 弹链 @@ -1190,13 +1591,14 @@ 6,5mm infravörös nyomkövető 6.5mm IR-DIM曳光弾 6.5mm IR-DIM 예광탄 - 6.5mm 低視紅外曳光彈 + 6.5毫米 低視紅外曳光彈 6.5mm 低视红外曳光弹 + 6.5mm IR-DIM 6.5mm 200Rnd Tracer IR-DIM Belt<br />Rounds: 200<br />Used in: Stoner 99 LMG Magazynek 6,5mm 200rd Smugacz IR-DIM - Bande 6.5mm 200Cps Traçante IR-DIM<br />Cartouches: 200<br />Utilisé avec: Stoner 99 LMG + Bande 6,5mm 200Cps Traçantes IR-DIM<br />Cartouches: 200<br />Utilisé avec: Stoner 99 LMG Cinta de 200 balas trazadoras IR-DIM de 6.5mm Магазин из 200-т 6,5 мм ИК-трассирующих 6,5mm 200-Patronen-Gurt IR-DIM Leuchtspur<br />Patronen: 200<br />Eingesetzt von: Stoner 99 LMG @@ -1206,7 +1608,7 @@ 6.5mm 200-lövedékes infravörös nyomkövető heveder<br />Lövedékek: 200<br />Használható: Stoner 99 LMG 6.5mm 200発入り IR-DIM曳光弾ベルト<br />装填数: 200<br />次で使用: Stoner 99 LMG 200발들이 6.5mm IR-DIM 예광탄 벨트<br />장탄수: 200<br />사용처: Stoner 99 LMG - 6.5mm 200發 低視度紅外線曳光彈<br />發數: 200<br />使用於: Stoner 99 LMG + 6.5毫米 200發 低視度紅外線曳光彈<br />發數: 200<br />使用於: Stoner 99 重機槍 6.5mm 200发 低视度红外线曳光弹<br />发数: 200<br />使用于: Stoner 99 LMG @@ -1222,7 +1624,7 @@ 5,56mm 30-lövedékes tár (Mk262) 5.56mm 30発入り 弾倉 (Mk262) 30발들이 5.56mm 탄창 (Mk262) - 5.56mm 30發 彈匣 (Mk262 狙擊專用彈) + 5.56毫米 30發 彈匣 (Mk262 狙擊專用彈) 5.56mm 30发 弹匣 (Mk262 狙击专用弹) @@ -1238,8 +1640,9 @@ 5,56mm Mk262 5.56mm Mk262 5.56mm Mk262 - 5.56mm Mk262 狙擊專用彈 + 5.56毫米 Mk262 狙擊專用彈 5.56mm Mk262 狙击专用弹 + 5.56mm Mk262 Caliber: 5.56x45mm NATO (Mk262)<br />Rounds: 30 @@ -1254,7 +1657,7 @@ Kaliber: 5,56x45mm NATO (Mk262)<br />Lövedékek: 30 口径: 5.56x45mm NATO (Mk262)<br />装填数: 30 구경: 5.56x45mm NATO (Mk262)<br />장탄수: 30 - 口徑: 5.56x45mm NATO標準 (Mk262 狙擊專用彈)<br />發數: 30 + 口徑: 5.56x45毫米 NATO標準 (Mk262 狙擊專用彈)<br />發數: 30 口径: 5.56x45mm NATO标准 (Mk262 狙击专用弹)<br />发数: 30 @@ -1270,7 +1673,7 @@ 5,56mm 30-lövedékes tár (Mk318) 5.56mm 30発入り 弾倉 (Mk318) 30발들이 5.56mm 탄창 (Mk318) - 5.56mm 30發 彈匣 (Mk318 特戰專用彈) + 5.56毫米 30發 彈匣 (Mk318 特戰專用彈) 5.56mm 30发 弹匣 (Mk318 特战专用弹) @@ -1286,8 +1689,9 @@ 5,56mm Mk318 5.56mm Mk318 5.56mm Mk318 - 5.56mm Mk318 特戰專用彈 + 5.56毫米 Mk318 特戰專用彈 5.56mm Mk318 特战专用弹 + 5.56mm Mk318 Caliber: 5.56x45mm NATO (Mk318)<br />Rounds: 30 @@ -1302,7 +1706,7 @@ Kaliber: 5,56x45mm NATO (Mk318)<br />Lövedékek: 30 口径: 5.56x45mm NATO (Mk318)<br />装填数: 30 구경: 5.56x45mm NATO (Mk318)<br />장탄수: 30 - 口徑: 5.56x45mm NATO標準 (Mk318 特戰專用彈)<br />發數: 30 + 口徑: 5.56x45毫米 NATO標準 (Mk318 特戰專用彈)<br />發數: 30 口径: 5.56x45mm NATO标准 (Mk318 特战专用弹)<br />发数: 30 @@ -1318,7 +1722,7 @@ 5,56mm 30-lövedékes tár (M995 páncéltörő) 5.56mm 30発入り 弾倉 (M995 徹甲弾) 30발들이 5.56mm 탄창 (Mk995 철갑탄) - 5.56mm 30發 彈匣 (M995 穿甲彈) + 5.56毫米 30發 彈匣 (M995 穿甲彈) 5.56mm 30发 弹匣 (M995 穿甲弹) @@ -1334,8 +1738,9 @@ 5,56mm páncéltörő 5.56mm 徹甲弾 5.56mm 철갑탄 - 5.56mm M995 穿甲彈 + 5.56毫米 M995 穿甲彈 5.56mm M995 穿甲弹 + 5.56mm AP Caliber: 5.56x45mm NATO (M995 AP)<br />Rounds: 30 @@ -1350,7 +1755,7 @@ Kaliber: 5,56x45mm NATO (M995 páncéltörő)<br />Lövedékek: 30 口径: 5.56x45mm NATO (M995 徹甲弾)<br />装填数: 30 구경: 5.56x45mm NATO (Mk995 철갑탄)<br />장탄수: 30 - 口徑: 5.56x45mm NATO標準 (M995 穿甲彈)<br />發數: 30 + 口徑: 5.56x45毫米 NATO標準 (M995 穿甲彈)<br />發數: 30 口径: 5.56x45mm NATO标准 (M995 穿甲弹)<br />发数: 30 @@ -1366,7 +1771,7 @@ 7,62mm 10-lövedékes tár (M118LR) 7.62mm 10発入り 弾倉 (M118LR) 10발들이 7.62mm 탄창 (M118LR) - 7.62mm 10發 彈匣 (M118LR 狙擊專用彈) + 7.62毫米 10發 彈匣 (M118LR 狙擊專用彈) 7.62mm 10发 弹匣 (M118LR 狙击专用弹) @@ -1382,8 +1787,9 @@ 7,62mm M118LR 7.62mm M118LR 7.62mm M118LR - 7.62mm M118LR 狙擊專用彈 + 7.62m毫米 M118LR 狙擊專用彈 7.62mm M118LR 狙击专用弹 + 7.62mm M118LR Caliber: 7.62x51mm NATO (M118LR)<br />Rounds: 10 @@ -1398,7 +1804,7 @@ Kaliber: 7,62x51mm NATO (M118LR)<br />Lövedékek: 10 口径: 7.62x51mm NATO (M118LR)<br />装填数: 10 구경: 7.62x51mm NATO (M118LR)<br />장탄수: 10 - 口徑: 7.62x51mm NATO標準 (M118LR 狙擊專用彈)<br />發數: 10 + 口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 10 口径: 7.62x51mm NATO标准 (M118LR 狙击专用弹)<br />发数: 10 @@ -1414,7 +1820,7 @@ 7,62mm 20-lövedékes tár (M118LR) 7.62mm 20発入り 弾倉 (M118LR) 20발들이 7.62mm 탄창 (M118LR) - 7.62mm 20發 彈匣 (M118LR 狙擊專用彈) + 7.62毫米 20發 彈匣 (M118LR 狙擊專用彈) 7.62mm 20发 弹匣 (M118LR 狙击专用弹) @@ -1430,13 +1836,14 @@ 7,62mm M118LR 7.62mm M118LR 7.62mm M118LR - 7.62mm M118LR 狙擊專用彈 + 7.62毫米 M118LR 狙擊專用彈 7.62mm M118LR 狙击专用弹 + 7.62mm M118LR Caliber: 7.62x51mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51mm NATO (M118LR)<br />Pociski: 20 - Calibre: 7.62x51mm NATO (M118LR)<br />Cartouches: 20 + Calibre: 7,62x51mm NATO (M118LR)<br />Cartouches: 20 Calibre: 7.62x51mm NATO (M118LR)<br />Balas: 20 Калибр: 7,62x51 мм NATO (M118LR)<br />Патронов: 20 Kaliber: 7,62x51mm NATO (M118LR)<br />Patronen: 20 @@ -1446,7 +1853,7 @@ Kaliber: 7,62x51mm NATO (M118LR)<br />Lövedékek: 20 口径: 7.62x51mm NATO (M118LR)<br />装填数: 20 구경: 7.62x51mm NATO (M118LR)<br />장탄수: 20 - 口徑: 7.62x51mm NATO標準 (M118LR 狙擊專用彈)<br />發數: 20 + 口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 20 口径: 7.62x51mm NATO标准 (M118LR 狙击专用弹)<br />发数: 20 @@ -1462,7 +1869,7 @@ 7,62mm 10-lövedékes tár (Mk316 Mod 0) 7.62mm 10発入り 弾倉 (Mk316 Mod 0) 10발들이 7.62mm 탄창 (Mk316 Mod 0) - 7.62mm 10發 彈匣 (Mk316 Mod 0 狙擊專用彈) + 7.62毫米 10發 彈匣 (Mk316 Mod 0 狙擊專用彈) 7.62mm 10发 弹匣 (Mk316 Mod 0 狙击专用弹) @@ -1478,8 +1885,9 @@ 7,62mm Mk316 7.62mm Mk316 7.62mm Mk316 - 7.62mm Mk316 狙擊專用彈 + 7.62毫米 Mk316 狙擊專用彈 7.62mm Mk316 狙击专用弹 + 7.62mm Mk316 Caliber: 7.62x51mm NATO (Mk316 Mod 0)<br />Rounds: 10 @@ -1494,7 +1902,7 @@ Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Lövedékek: 10 口径: 7.62x51mm NATO (Mk316 Mod 0)<br />装填数: 10 구경: 7.62x51mm NATO (Mk316 Mod 0)<br />장탄수: 10 - 口徑: 7.62x51mm NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 10 + 口徑: 7.62x51毫米 NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 10 口径: 7.62x51mm NATO标准 (Mk316 Mod 0 狙击专用弹)<br />发数: 10 @@ -1510,7 +1918,7 @@ 7,62mm 20-lövedékes tár (Mk316 Mod 0) 7.62mm 20発入り 弾倉 (Mk316 Mod 0) 20발들이 7.62mm 탄창 (Mk316 Mod 0) - 7.62mm 20發 彈匣 (Mk316 Mod 0 狙擊專用彈) + 7.62毫米 20發 彈匣 (Mk316 Mod 0 狙擊專用彈) 7.62mm 20发 弹匣 (Mk316 Mod 0 狙击专用弹) @@ -1526,8 +1934,9 @@ 7,62mm Mk316 7.62mm Mk316 7.62mm Mk316 - 7.62mm Mk316 狙擊專用彈 + 7.62毫米 Mk316 狙擊專用彈 7.62mm Mk316 狙击专用弹 + 7.62mm Mk316 Caliber: 7.62x51mm NATO (Mk316 Mod 0)<br />Rounds: 20 @@ -1542,7 +1951,7 @@ Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Lövedékek: 20 口径: 7.62x51mm NATO (Mk316 Mod 0)<br />装填数: 20 구경: 7.62x51mm NATO (Mk316 Mod 0)<br />장탄수: 20 - 口徑: 7.62x51mm NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 20 + 口徑: 7.62x51毫米 NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 20 口径: 7.62x51mm NATO标准 (Mk316 Mod 0 狙击专用弹)<br />发数: 20 @@ -1558,7 +1967,7 @@ 7,62mm 10-lövedékes tár (Mk319 Mod 0) 7.62mm 10発入り 弾倉 (Mk319 Mod 0) 10발들이 7.62mm 탄창 (Mk319 Mod 0) - 7.62mm 10發 彈匣 (Mk319 Mod 0 特戰專用彈) + 7.62毫米 10發 彈匣 (Mk319 Mod 0 特戰專用彈) 7.62mm 10发 弹匣 (Mk319 Mod 0 特战专用弹) @@ -1574,8 +1983,9 @@ 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 - 7.62mm Mk319 特戰專用彈 + 7.62毫米 Mk319 特戰專用彈 7.62mm Mk319 特战专用弹 + 7.62mm Mk319 Caliber: 7.62x51mm NATO (Mk319 Mod 0)<br />Rounds: 10 @@ -1590,7 +2000,7 @@ Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Lövedékek: 10 口径: 7.62x51mm NATO (Mk319 Mod 0)<br />装填数: 10 구경: 7.62x51mm NATO (Mk319 Mod 0)<br />장탄수: 10 - 口徑: 7.62x51mm NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 10 + 口徑: 7.62x51毫米 NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 10 口径: 7.62x51mm NATO标准 (Mk319 Mod 0 特战专用弹)<br />发数: 10 @@ -1606,7 +2016,7 @@ 7,62mm 20-lövedékes tár (Mk319 Mod 0) 7.62mm 20発入り 弾倉 (Mk319 Mod 0) 20발들이 7.62mm 탄창 (Mk319 Mod 0) - 7.62mm 20發 彈匣 (Mk319 Mod 0 特戰專用彈) + 7.62毫米 20發 彈匣 (Mk319 Mod 0 特戰專用彈) 7.62mm 20发 弹匣 (Mk319 Mod 0 特战专用弹) @@ -1622,8 +2032,9 @@ 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 - 7.62mm Mk319 特戰專用彈 + 7.62毫米 Mk319 特戰專用彈 7.62mm Mk319 特战专用弹 + 7.62mm Mk319 Caliber: 7.62x51mm NATO (Mk319 Mod 0)<br />Rounds: 20 @@ -1638,7 +2049,7 @@ Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Lövedékek: 20 口径: 7.62x51mm NATO (Mk319 Mod 0)<br />装填数: 20 구경: 7.62x51mm NATO (Mk319 Mod 0)<br />장탄수: 20 - 口徑: 7.62x51mm NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 20 + 口徑: 7.62x51毫米 NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 20 口径: 7.62x51mm NATO标准 (Mk319 Mod 0 特战专用弹)<br />发数: 20 @@ -1654,7 +2065,7 @@ 7,62mm 10-lövedékes tár (M993 páncéltörő) 7.62mm 10発入り 弾倉 (M993 徹甲弾) 10발들이 7.62mm 탄창 (M993 철갑탄) - 7.62mm 10發 彈匣 (M993 穿甲專用彈) + 7.62毫米 10發 彈匣 (M993 穿甲專用彈) 7.62mm 10发 弹匣 (M993 穿甲专用弹) @@ -1670,8 +2081,9 @@ 7,62mm páncéltörő 7.62mm 徹甲弾 7.62mm 철갑탄 - 7.62mm M993 穿甲專用彈 + 7.62毫米 M993 穿甲專用彈 7.62mm M993 穿甲专用弹 + 7.62mm AP Caliber: 7.62x51mm NATO (M993 AP)<br />Rounds: 10 @@ -1686,7 +2098,7 @@ Kaliber: 7,62x51mm NATO (M993 páncéltörő)<br />Lövedékek: 10 口径: 7.62x51mm NATO (Mk319 Mod 0)<br />装填数: 10 구경: 7.62x51mm NATO (M993 철갑탄)<br />장탄수: 10 - 口徑: 7.62x51mm NATO標準 (M993 穿甲專用彈)<br />發數: 10 + 口徑: 7.62x51毫米 NATO標準 (M993 穿甲專用彈)<br />發數: 10 口径: 7.62x51mm NATO标准 (M993 穿甲专用弹)<br />发数: 10 @@ -1702,7 +2114,7 @@ 7,62mm 20-lövedékes tár (M993 páncéltörő) 7.62mm 20発入り 弾倉 (M993 徹甲弾) 20발들이 7.62mm 탄창 (M993 철갑탄) - 7.62mm 20發 彈匣 (M993 穿甲專用彈) + 7.62毫米 20發 彈匣 (M993 穿甲專用彈) 7.62mm 20发 弹匣 (M993 穿甲专用弹) @@ -1718,8 +2130,9 @@ 7,62mm páncéltörő 7.62mm 徹甲弾 7.62mm 철갑탄 - 7.62mm M993 穿甲專用彈 + 7.62毫米 M993 穿甲專用彈 7.62mm M993 穿甲专用弹 + 7.62mm AP Caliber: 7.62x51mm NATO (M993 AP)<br />Rounds: 20 @@ -1734,7 +2147,7 @@ Kaliber: 7,62x51mm NATO (M993 páncéltörő)<br />Lövedékek: 20 口径: 7.62x51mm NATO (M993 徹甲弾)<br />装填数: 20 구경: 7.62x51mm NATO (M993 철갑탄)<br />장탄수: 20 - 口徑: 7.62x51mm NATO標準 (M993 穿甲專用彈)<br />發數: 20 + 口徑: 7.62x51毫米 NATO標準 (M993 穿甲專用彈)<br />發數: 20 口径: 7.62x51mm NATO标准 (M993 穿甲专用弹)<br />发数: 20 @@ -1750,7 +2163,7 @@ 7,62mm 20-lövedékes tár (Mk248 Mod 0) 7.62mm 20発入り 弾倉 (Mk248 Mod 0) 20발들이 7.62mm 탄창 (Mk248 Mod 0) - 7.62mm 20發 彈匣 (Mk248 Mod 0 狙擊專用彈) + 7.62毫米 20發 彈匣 (Mk248 Mod 0 狙擊專用彈) 7.62mm 20发 弹匣 (Mk248 Mod 0 狙击专用弹) @@ -1766,8 +2179,9 @@ 7,62mm Mk248 7.62mm Mk248 7.62mm Mk248 - 7.62mm Mk248 狙擊專用彈 + 7.62毫米 Mk248 狙擊專用彈 7.62mm Mk248 狙击专用弹 + 7.62mm Mk248 Caliber: 7.62x67mm NATO (Mk248 Mod 0)<br />Rounds: 20 @@ -1782,7 +2196,7 @@ Kaliber: 7,62x51mm NATO (Mk248 Mod 0)<br />Lövedékek: 20 口径: 7.62x67mm NATO (Mk248 Mod 0)<br />装填数: 20 구경: 7.62x51mm NATO (Mk248 Mod 0)<br />장탄수: 20 - 口徑: 7.62x67mm NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 20 + 口徑: 7.62x67毫米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 20 口径: 7.62x67mm NATO标准 (Mk248 Mod 0 狙击专用弹)<br />发数: 20 @@ -1798,7 +2212,7 @@ 7,62mm 20-lövedékes tár (Mk248 Mod 1) 7.62mm 20発入り 弾倉 (Mk248 Mod 1) 20발들이 7.62mm 탄창 (Mk248 Mod 1) - 7.62mm 20發 彈匣 (Mk248 Mod 1 狙擊專用彈) + 7.62毫米 20發 彈匣 (Mk248 Mod 1 狙擊專用彈) 7.62mm 20发 弹匣 (Mk248 Mod 1 狙击专用弹) @@ -1814,8 +2228,9 @@ 7,62mm Mk248 7.62mm Mk248 7.62mm Mk248 - 7.62mm Mk248 狙擊專用彈 + 7.62毫米 Mk248 狙擊專用彈 7.62mm Mk248 狙击专用弹 + 7.62mm Mk248 Caliber: 7.62x67mm NATO (Mk248 Mod 1)<br />Rounds: 20 @@ -1830,7 +2245,7 @@ Kaliber: 7,62x51mm NATO (Mk248 Mod 1)<br />Lövedékek: 20 口径: 7.62x67mm NATO (Mk248 Mod 1)<br />装填数: 20 구경: 7.62x51mm NATO (Mk248 Mod 1)<br />장탄수: 20 - 口徑: 7.62x67mm NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 20 + 口徑: 7.62x67毫米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 20 口径: 7.62x67mm NATO标准 (Mk248 Mod 1 狙击专用弹)<br />发数: 20 @@ -1846,7 +2261,7 @@ 7,62mm 20-lövedékes tár (Berger Hybrid OTM) 7.62mm 20発入り 弾倉 (Berger Hybrid OTM) 20발들이 7.62mm 탄창 (Berger Hybrid OTM) - 7.62mm 20發 彈匣 (Berger Hybrid 空尖比賽專用彈) + 7.62毫米 20發 彈匣 (Berger Hybrid 空尖比賽專用彈) 7.62mm 20发 弹匣 (Berger Hybrid 空尖比赛专用弹) @@ -1862,8 +2277,9 @@ 7,62mm OTM 7.62mm OTM 7.62mm OTM - 7.62mm 空尖比賽專用彈 + 7.62毫米 空尖比賽專用彈 7.62mm 空尖比赛专用弹 + 7.62mm OTM Caliber: 7.62x67mm NATO (Berger Hybrid OTM)<br />Rounds: 20 @@ -1878,7 +2294,7 @@ Kaliber: 7,62x67mm NATO (Berger Hybrid OTM)<br />Lövedékek: 20 口径: 7.62x67mm NATO (Berger Hybrid OTM)<br />装填数: 20 구경: 7.62x51mm NATO (Berger Hybrid OTM)<br />장탄수: 20 - 口徑: 7.62x67mm NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 20 + 口徑: 7.62x67毫米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 20 口径: 7.62x67mm NATO标准 (Berger Hybrid 空尖比赛专用弹)<br />发数: 20 @@ -1894,7 +2310,7 @@ 6,5x47mm 30-lövedékes tár (HPBT Scenar) 6.5x47mm 30発入り 弾倉 (HPBT Scenar) 30발들이 6.5x47mm 탄창 (HPBT Scenar) - 6.5x47mm 30發 彈匣 (Lapua 空尖艇尾狙擊專用彈) + 6.5x47毫米 30發 彈匣 (拉普 空尖艇尾狙擊專用彈) 6.5x47mm 30发 弹匣 (Lapua 空尖艇尾狙击专用弹) @@ -1910,12 +2326,13 @@ 6,5mm Lapua 6.5mm Lapua 6.5mm Lapua - 6.5mm Lapua 空尖艇尾狙擊專用彈 + 6.5毫米 拉普 空尖艇尾狙擊專用彈 6.5mm Lapua 空尖艇尾狙击专用弹 + 6.5mm Lapua Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30<br />Used in: MXM - Calibre: 6,5x47mm (HPBT Scenar)<br />Cartouches: 30 + Calibre: 6,5x47mm (HPBT Scenar)<br />Cartouches: 30<br />Utilisé avec: MXM Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30<br />Se usa en: MXM Kaliber: 6,5x47mm (HPBT Scenar)<br />Pociski: 30 Калибр: 6,5x47 мм (экспансивные Scenar)<br />Патронов: 30<br />Используются с: MXM @@ -1926,7 +2343,7 @@ Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 30<br />Használható: MXM 口径: 6.5x47mm (HPBT Scenar)<br />装填数: 30<br />次で使用: MXM 구경: 6.5x47mm (HPBT Scenar)<br />장탄수: 30<br />사용처: MXM - 口徑: 6.5x47mm (Lapua 空尖艇尾狙擊專用彈)<br />發數: 30<br />使用於: MXM + 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 30<br />使用於: MXM 口径: 6.5x47mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 30<br />使用于: MXM @@ -1942,7 +2359,7 @@ 6,5mm Creedmor 30-lövedékes tár 6.5mm Creedmor 30発入り 弾倉 30발들이 6.5mm Creedmor 탄창 - 6.5mm 30發 彈匣 (Creedmor 狙擊專用彈) + 6.5毫米 30發 彈匣 (克里德莫爾(CM) 狙擊專用彈) 6.5mm 30发 弹匣 (Creedmor 狙击专用弹) @@ -1958,8 +2375,9 @@ 6,5mm CM 6.5mm CM 6.5mm CM - 6.5mm CM 狙擊專用彈 + 6.5毫米 CM狙擊專用彈 6.5mm CM 狙击专用弹 + 6.5mm CM Caliber: 6.5x47mm Creedmor<br />Rounds: 30<br />Used in: MXM @@ -1974,7 +2392,7 @@ Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 30<br />Használható: MXM 口径: 6.5x47mm Creedmor<br />装填数: 30<br />次で使用: MXM 구경: 6.5x47mm Creedmor<br />장탄수: 30<br />사용처: MXM - 口徑: 6.5x47mm Creedmor 狙擊專用彈<br />發數: 30<br />使用於: MXM + 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 30<br />使用於: MXM 口径: 6.5x47mm Creedmor 狙击专用弹<br />发数: 30<br />使用于: MXM @@ -2008,6 +2426,7 @@ .338 Scenar .338 Scenar .338 Scenar + .338 Scenar Caliber: 8.6x70mm (300gr Lapua Scenar)<br />Rounds: 10 @@ -2022,7 +2441,7 @@ Kaliber: 8,6x70mm (300gr Lapua Scenar)<br />Lövedékek: 10 口径: 8.6x70mm (300gr Lapua Scenar)<br />装填数: 10 구경: 8.6x70mm (300gr Lapua Scenar)<br />장탄수: 10 - 口徑: 8.6x70mm (300公克 Lapua Scenar)<br />發數: 10 + 口徑: 8.6x70毫米 (300公克 Lapua Scenar)<br />發數: 10 口径: 8.6x70mm (300公克 Lapua Scenar)<br />发数: 10 @@ -2056,6 +2475,7 @@ .338 철갑탄 .338 API526 穿甲燃燒彈 .338 API526 穿甲燃烧弹 + .338 AP Caliber: 8.6x70mm (API526)<br />Rounds: 10 @@ -2070,7 +2490,7 @@ Kaliber: 8,6x70mm (API526)<br />Lövedékek: 10 口径: 8.6x70mm (API526)<br />装填数: 10 구경: 8.6x70mm (API526)<br />장탄수: 10 - 口徑: 8.6x70mm (API526 穿甲燃燒彈)<br />發數: 10 + 口徑: 8.6x70毫米 (API526 穿甲燃燒彈)<br />發數: 10 口径: 8.6x70mm (API526 穿甲燃烧弹)<br />发数: 10 @@ -2104,6 +2524,7 @@ .408 .408 .408 + .408 Caliber: .408 CheyTac (305gr)<br />Rounds: 7 @@ -2134,7 +2555,7 @@ 12,7x99mm 5-lövedékes tár 12.7x99mm 5発入り 弾倉 5발들이 12.7x99mm 탄창 - 12.7x99mm 5發 彈匣 + 12.7x99毫米 5發 彈匣 12.7x99mm 5发 弹匣 @@ -2150,12 +2571,13 @@ 12,7mm 12.7mm 12.7mm - 12.7mm + 12.7毫米 12.7mm + 12.7mm Caliber: 12.7x99mm<br />Rounds: 5 - Calibre: 12.7x99mm<br />Cartouches: 5 + Calibre: 12,7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 Kaliber: 12,7x99mm<br />Pociski: 5 Калибр: 12,7x99 мм<br />Патронов: 5 @@ -2166,7 +2588,7 @@ Kaliber: 12,7x99mm<br />Lövedékek: 5 口径: 12.7x99mm<br />装填数: 5 구경: 12.7x99mm<br />장탄수: 5 - 口徑: 12.7x99mm<br />發數: 5 + 口徑: 12.7x99毫米<br />發數: 5 口径: 12.7x99mm<br />发数: 5 @@ -2182,7 +2604,7 @@ 12,7x99mm 5-lövedékes tár (páncéltörő-gyújtó) 12.7x99mm 5発入り焼夷徹甲弾 弾倉 5발들이 12.7x99mm 철갑소이탄 탄창 - 12.7x99mm 穿甲燃燒彈 5發 彈匣 + 12.7x99毫米 穿甲燃燒彈 5發 彈匣 12.7x99mm 穿甲燃烧弹 5发 弹匣 @@ -2198,8 +2620,9 @@ 12,7mm páncéltörő-gyújtó 12.7mm 焼夷徹甲弾 12.7mm 철갑소이탄 - 12.7mm 穿甲燃燒彈 + 12.7毫米 穿甲燃燒彈 12.7mm 穿甲燃烧弹 + 12.7mm API Caliber: 12.7x99mm API<br />Rounds: 5 @@ -2214,7 +2637,7 @@ Kaliber: 12,7x99mm API<br />Lövedékek: 5 口径: 12.7x99mm 焼夷徹甲弾<br />装填数: 5 구경: 12.7x99mm 철갑소이탄<br />장탄수: 5 - 口徑: 12.7x99mm 穿甲燃燒彈<br />發數: 5 + 口徑: 12.7x99毫米 穿甲燃燒彈<br />發數: 5 口径: 12.7x99mm 穿甲燃烧弹<br />发数: 5 @@ -2230,8 +2653,9 @@ 12,7x99mm 5-lövedékes tár (AMAX) 12.7x99mm 5発入り 弾倉 (AMAX) 5발들이 12.7x99mm 탄창 (AMAX) - 12.7x99mm 5發 彈匣 (AMAX 比賽專用彈) + 12.7x99毫米 5發 彈匣 (AMAX 比賽專用彈) 12.7x99mm 5发 弹匣 (AMAX 比赛专用弹) + 12.7x99mm 5Rnd Şarjör (AMAX) 12.7mm @@ -2246,8 +2670,9 @@ 12,7mm 12.7mm 12.7mm - 12.7mm AMAX 比賽專用彈 + 12.7毫米 AMAX 比賽專用彈 12.7mm AMAX 比赛专用弹 + 12.7mm Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 @@ -2262,8 +2687,9 @@ Kaliber: 12,7x99mm (AMAX)<br />Lövedékek: 5 口径: 12.7x99mm (AMAX)<br />装填数: 5 구경: 12.7x99mm (AMAX)<br />장탄수: 5 - 口徑: 12.7x99mm (AMAX 比賽專用彈)<br />發數: 5 + 口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 5 口径: 12.7x99mm (AMAX 比赛专用弹)<br />发数: 5 + Kalibre: 12.7x99mm (AMAX)<br />Mermi: 5 [ACE] Ammo Supply Crate @@ -2280,50 +2706,81 @@ [ACE] 탄약 보급 상자 [ACE] 彈藥補給箱 [ACE] 弹药补给箱 + [ACE] Cephane Ikmal Kutusu Barrel twist + Dralllänge 銃身の転度 膛线缠距 膛線扭度 Rigatura della canna Gwintowanie lufy + Нарезы ствола + Barrel Twist + Pas du canon + Stoupání vývrtu hlavně + Estriado del cañón Barrel length + Lauflänge Longueur du canon 銃身長 身管长度 槍管長度 Lunghezza della canna Długość lufy + Длина ствола + Comprimento do cano + Délka hlavně + Longitud del cañón + Namlu Uzunluğu Ballistic coefficient - Coefficient ballistique + Ballistischer Koeffizient + Coefficient balistique 弾道係数 弹道系数 彈道係數 Coefficente balistico Współczynnik balistyczny + Баллистический коэффициент + Coeficiente balístico + Balistický koeficient + Coheficiente de balística + Balistik Katsayısı Bullet mass + Projektilgewicht Masse d'une balle 弾丸重量 弹头重量 彈頭重量 Massa del proiettile Masa pocisku + Масса пули + Massa do projétil + Váha projektilu + Masa de la bala + Mermi Ağırlığı Muzzle velocity - Vitesse à la bouche + Mündungsgeschwindigkeit + Vitesse initiale 銃口初速 枪口初速 槍口初速 Velocità iniziale Prędkość wylotowa + Начальная скорость + Velocidade de Saída + Úsťová rychlost + Velocidad inicial + Namlu çıkış hızı diff --git a/addons/captives/XEH_PREP.hpp b/addons/captives/XEH_PREP.hpp index bf0b06a1db4..6157a1e33e9 100644 --- a/addons/captives/XEH_PREP.hpp +++ b/addons/captives/XEH_PREP.hpp @@ -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); diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 70d708ced26..6adfef9deaf 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -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 diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index e9055e896a8..0b8dae014a3 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -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); diff --git a/addons/captives/functions/fnc_addLoadCaptiveActions.sqf b/addons/captives/functions/fnc_addLoadCaptiveActions.sqf index 81710f161d8..d1ad8f603db 100644 --- a/addons/captives/functions/fnc_addLoadCaptiveActions.sqf +++ b/addons/captives/functions/fnc_addLoadCaptiveActions.sqf @@ -10,7 +10,7 @@ * Child actions * * Example: - * [kevin] call ace_medical_fnc_addLoadCaptiveActions + * [kevin] call ace_captives_fnc_addLoadCaptiveActions * * Public: No */ diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf deleted file mode 100644 index c086afa0c73..00000000000 --- a/addons/captives/functions/fnc_canFriskPerson.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: bux578 - * Checks the conditions for being able to frisk a unit - * - * Arguments: - * 0: caller (player) - * 1: target - * - * Return Value: - * The return value - * - * 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]} diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf deleted file mode 100644 index 58e7131e725..00000000000 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ /dev/null @@ -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 - * 1: unit - * - * 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]; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 3b517654a7d..c0c03d1e31c 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -10,22 +10,29 @@ 捕虜 포로설정 Jeńcy + Пленные + Prisioneiros + Prisonniers + Zajatci + Tutsaklar + Prisioneros Take Prisoner Gefangen nehmen Tomar prisionero - Prendre le prisonnier + Capturer le prisonnier Aresztuj Zajmout osobu Arresta il prigioniero Tomar Prisioneiro Foglyul ejtés - Взять в плен + Арестовать 捕虜にする 포박하기 逮捕俘虜 逮捕俘虏 + Kelepçele Free Prisoner @@ -37,11 +44,12 @@ Libera il prigioniero Libertar Prisioneiro Fogoly szabadon engedése - Освободить пленника + Освободить пленного 捕虜を解放する 풀어주기 釋放俘虜 释放俘虏 + Serbest bırak Escort Prisoner @@ -53,18 +61,19 @@ Scorta il Prigioniero Escoltar Prisioneiro Fogoly kísérése - Конвоировать пленника + Конвоировать пленного 捕虜を移動させる 포로 호송하기 護送俘虜 护送俘虏 + Tutsağı Taşı Release Prisoner Gefangenen loslassen Soltar prisionero Anuluj eskortowanie - Relâcher le prisonnier + Lâcher le prisonnier Uvolnit zajatce Rilascia il Prigioniero Largar Prisioneiro @@ -74,6 +83,7 @@ 포로 풀어주기 停止護送俘虜 停止护送俘虏 + Taşımayı bırak You need to take him as prisoner first! @@ -85,11 +95,12 @@ Prima devi arrestarlo! Você deve tomá-lo como prisioneiro primeiro! Először foglyul kell ejtened őt! - Вы должны сначала взять его в плен! + Вы должны сначала арестовать его! 捕虜を取っている必要があります! 먼저 포로로 만들어야합니다! 你必須先逮捕他! 你必须先逮捕他! + Önce onu tutuklamalısın! Load Captive @@ -106,6 +117,7 @@ 포로 태우기 將俘虜放入載具 将俘虏放入载具 + Tutukluyu bindir Unload Captive @@ -122,6 +134,7 @@ 포로 내리기 將俘虜帶出載具 将俘虏带出载具 + Tutukluyu indir Cable Tie @@ -138,6 +151,7 @@ 케이블 타이 束線帶 束线带 + Kelepçe Cable ties that allow you to restrain prisoners. @@ -149,43 +163,12 @@ A algema plástica permite que você contenha prisioneiros. Fascetta per arrestare i prigionieri Gyorskötöző, emberek foglyulejtéséhez használható. - Кабельные стяжки позволяют связывать пленников. + Кабельные стяжки используются для связывания рук при аресте ケーブル タイは捕虜を制圧できます。 케이블 타이는 포로를 구류시킬때 씁니다. 束線帶可以綁住俘虜 束线带可以绑住俘虏 - - - Inventory of frisked person - Inventar der durchsuchten Person - Inventaire de la personne fouillé - Inventario de la persona cacheada - Motozott személy felszerelése - Inventář prohledávané osoby - Ekwipunek rewidowanej osoby - Инвентарь обысканного человека - Inventário da pessoa revistada - Inventario della persona perquisita - 捕虜の持ち物を確認する - 검문당한 사람의 소지품 - 搜身選單 - 搜身选单 - - - Frisk person - Person durchsuchen - Fouiller la personne - Cachear - Prohledávaná osoba - Rewiduj osobę - Motozás - Обыскать человека - Revistar - Perquisisci la persona - 捕虜の持ち物 - 검문당한사람 - 搜身 - 搜身 + Kişilerin ellerini bağlamanız için kablo sağlar. Surrender @@ -202,6 +185,7 @@ 투항 投降 投降 + Teslim ol Stop Surrendering @@ -211,13 +195,14 @@ Parar de se render Přestat se vzdávat Podejmij walkę ponownie - Прекратить сдачу в плен + Прекратить сдаваться Megadás abbahagyása Smetti di arrenderti 投降をやめる 투항하는것을 멈춤 停止投降 停止投降 + Teslim olmayı durdur Make Unit Surrender @@ -226,7 +211,7 @@ Einheit kapitulieren lassen Vzdávající se jednotka Fazer unidade se render - Faire capituler l'unité + Se rend Egység kapitulálása Заставить юнита сдаться Fai arrendere l'unità @@ -242,9 +227,9 @@ Einheit synchronisieren, um sie kapitulieren zu lassen. Synchronizuj s jednotkou, která se má vzdát. Sincroniza uma unidade para fazer com que ela se renda. - Synchronise une unité pour la rendre captive. + Synchronise l'unité pour qu'elle se rende. Egység szinkronizálása, hogy kapituláljon. - Синхронизируйте с юнитами, чтобы заставить их сдаться в плен. + Синхронизируйте с юнитами, чтобы заставить их сдаться. Sincronizza una unità per farla arrendere. 同期されたユニットを投降させます。 투항시키기 위해 동기화합니다. @@ -256,30 +241,32 @@ Einheit in Handschellen legen Skuj jednostkę Fazer unidade algemada - Связать юнита + Связать юниту руки Spoutat jednotku Metti manette all'unità Hacer que la unidad esté esposada - Rendre une unité captive + Est menottée ユニットを拘束する 포박하기 使單位戴上手銬 使单位戴上手铐 + Birimi Kelepçele Sync a unit to make them handcuffed. Synchronisiere eine Einheit, um sie in Handschellen zu legen. Zsynchronizuj z jednostką, aby została skuta. Sincronizar uma unidade para deixá-la algemada. - Синхронизируйте с юнитами, чтобы сделать их связанными. + Синхронизируйте с юнитами, чтобы связать им руки. Synchronizovat s jednotkou, která má být v poutech. Sincronizza un'unità per metterle le manette. Sincroniza una unidad para hacer que esté esposada. - Synchronisez une unité pour la rendre captive. + Synchronise l'unité pour qu'elle soit menottée. 同期されたユニットを拘束させます。 수갑을 채우기 위해 동기화합니다. 使單位戴上手銬 使单位戴上手铐 + Birim kelepçelendi Captives Settings @@ -296,6 +283,7 @@ 포박 설정 俘虜設定 俘虏设定 + Tutsak Ayarları Controls settings for surrender and cable ties @@ -304,9 +292,9 @@ Toto kontroluje nastavení kapitulace a pout Einstellungen zur Kapitulation und Kabelbindern Controla as configurações de rendição e abraçadeiras - Contrôle les paramètres de la reddition et des Serflex + Contrôle les paramètres de la reddition et des Serflex. Szabályozza a kapituláció és bilincselés beállításait - Управляет настройками сдачи в плен и связывания + Управляет настройками ареста и сдачи в плен Controlla le impostazioni per la resa e le manette 投降したユニットや拘束されたユニットの扱いを設定します。 투항과 케이블 타이에 관련한 설정 @@ -320,9 +308,9 @@ Může spoutat spolubojovníky Kann Kameraden fesseln Pode algemar o próprio lado - Peut capturer sa propre faction + Permission de capturer son propre camp Saját oldal megbilincselhető - Связать союзника + Можно связывать руки союзникам Puoi ammanettare unità alleate 拘束ユニットを自陣営へ 자기편을 포박 할 수 있습니다. @@ -336,53 +324,21 @@ Mohou hráči spoutat jednotky na své straně Spieler können eigene Einheiten fesseln Os jogadores podem algemar unidades do seu lado - Les joueurs peuvent utiliser les Serflex sur leur propre camp + Les joueurs peuvent menotter les unités de leur propre camp. A játékosok megkötözhetik-e a saját oldalukon lévő egységeket - Разрешить игрокам связывать юнитов своей стороны + Разрешить игрокам арестовывать юнитов своей стороны I giocatori possono ammanettare unità alleate プレイヤーが拘束したユニットの陣営を自陣営に変更させます。 자기편에게 케이블타이를 사용할 수 있게합니다 玩家可以使用束線帶銬住同陣營隊友 玩家可以使用束线带铐住同阵营队友 - - Allow surrendering - Pozwól kapitulować - Permitir rendición - Povolit vzdávání - Kapitulation erlauben - Permite rendição - Permettre la reddition - Kapituláció engedélyezése - Сдаться в плен - Permetti Resa - 投降を許可 - 투항 활성화 - 允許投降 - 允许投降 - - - Players can surrender after holstering their weapon - Gracze mogą skapitulować po schowaniu swojej broni do kabury - Los jugadores pueden rendirse después de enfundar su arma - Hráč se může vzdát poté, co si skryje zbraň - Spieler können kapitulieren, nachdem sie ihre Waffe geholstert haben. - Jogadores podem se render depois de guardar sua arma - Les joueurs peuvent se rendre après avoir rangé leur arme - A játékosok megadhatják magukat a fegyverük elrakása után - Игроки могут сдаться в плен после того, как уберут оружие - I giocatori possono arrendersi dopo aver messo via le proprie armi - プレイヤーは武器を収めたあと投降できるようにします。 - 비무장한 플레이어가 투항할 수 있게 합니다 - 玩家能在收起自己武器後投降 - 玩家能在收起自己武器后投降 - Require surrendering Benötigt Kapitulation Wymagaj kapitulacji Requer rendição - Требовать пленения + Требовать сдаться для ареста Requiere rendición Vzdávání vyžadováno Richiedi Resa @@ -397,11 +353,11 @@ Spieler müssen sich erst ergeben, bevor sie gefangen genommen werden können Wymagaj od graczy kapitulacji zanim będzie można ich zaaresztować Requer que jogadores se rendam antes de poderem ser presos - Требуется, чтобы игрок сдался в плен прежде, чем его можно будет связать + Требовать для ареста, чтобы игроки вначале сдавались Requiere que los Jugadores se rindan antes de arrestarlos Vyžaduje, aby se hráč nejdříve vzdal, poté může být spoután I giocatori devono arrendersi prima che possano essere arrestati - Requiert la capitulation des joueurs avant qu'ils ne puissent être arrêtés + Définit si les joueurs doivent d'abord s'être rendus avant qu'on ne puisse les arrêter. プレイヤーは拘束される前に、投降する必要があります。 체포하기 전에 먼저 플레이어가 투항을 해야만 합니다 玩家須先要求目標投降,才可以進行逮捕 @@ -412,7 +368,7 @@ Nur Ergeben Tylko kapitulacja Somente rendição - Только сдавшийся в плен + Только сдавшийся Solo rendición Pouze vzdávání Solo Resa @@ -431,21 +387,43 @@ Rendición o desarme Vzdávání nebo beze zbraně Resa o senza armi - Capitulation ou desarmé + Reddition ou désarmé 投降中か非武装時 투항 중 혹은 비무장 投降或無武器狀態 投降或无武器状态 - - Sets the unit under the cursor captive. - Nimmt die Einheit unter dem Cursor fest. - カーソル先のユニットを拘束 - Imposta l'unità nello stato di prigioniero. - 設置在游標下的單位成俘虜狀態 - 设置在游标下的单位成俘虏状态。 - 커서의 병력을 포박합니다. - Ustawia jednostkę pod kursorem jako jeniec. + + Allow surrendering + Pozwól kapitulować + Permitir rendición + Povolit vzdávání + Kapitulation erlauben + Permitir Rendição + Permettre la reddition + Kapituláció engedélyezése + Разрешить сдаваться + Permetti Resa + 投降を許可 + 투항 활성화 + 允許投降 + 允许投降 + + + Players can surrender after holstering their weapon + Gracze mogą skapitulować po schowaniu swojej broni do kabury + Los jugadores pueden rendirse después de enfundar su arma + Hráč se může vzdát poté, co si skryje zbraň + Spieler können kapitulieren, nachdem sie ihre Waffe geholstert haben. + Jogadores podem se render depois de guardar sua arma + Les joueurs peuvent se rendre après avoir rengainé leur arme. + A játékosok megadhatják magukat a fegyverük elrakása után + Игроки могут сдаваться после того, как уберут оружие + I giocatori possono arrendersi dopo aver messo via le proprie armi + プレイヤーは武器を収めたあと投降できるようにします。 + 비무장한 플레이어가 투항할 수 있게 합니다 + 玩家能在收起自己武器後投降 + 玩家能在收起自己武器后投降 Require AI surrendering @@ -456,6 +434,11 @@ 需要AI先行投降 AI 항복 필요 Wymaga poddania się przez SI + Требовать ИИ сдаться для ареста + Requer rendição da IA + Requiert la reddition de l'IA + Vyžadovat, aby se AI prvně vzdala + Requiere la rendición de la IA Require AI to surrender before they can be arrested @@ -466,6 +449,26 @@ 在逮捕AI之前该AI必须先进入投降状态。 포박하기 전에 먼저 AI가 투항해야만 합니다. Wymaga poddania się przez SI zanim aresztowanie będzie możliwe + Требовать для ареста, чтобы ИИ вначале сдавались + Requer que a IA se renda antes que seja presa + Requiert la capitulation des unités IA avant qu'elles ne puissent être arrêtées. + Vyžadovat, aby se AI prvně vzdala před umožněním zajetí + Requiere la rendición de la IA antes de poder arrestarlas + + + Sets the unit under the cursor captive. + Nimmt die Einheit unter dem Cursor fest. + カーソル先のユニットを拘束 + Imposta l'unità nello stato di prigioniero. + 設置在游標下的單位成俘虜狀態 + 设置在游标下的单位成俘虏状态。 + 커서의 병력을 포박합니다. + Ustawia jednostkę pod kursorem jako jeniec. + Арестовывает указанный курсором юнит + Torna a unidade sob o cursor um prisioneiro + Capture l'unité sous le curseur. + Nastaví jednotku pod kurzorem jako zajatce. + Establece a la unidad bajo el cursor como prisionera diff --git a/addons/cargo/CfgVehicles.hpp b/addons/cargo/CfgVehicles.hpp index d3a800040e7..ab41cac4db6 100644 --- a/addons/cargo/CfgVehicles.hpp +++ b/addons/cargo/CfgVehicles.hpp @@ -63,6 +63,11 @@ class CfgVehicles { GVAR(space) = 4; GVAR(hasCargo) = 1; }; + class Tank_F: Tank {}; + class UGV_02_Base_F: Tank_F { + GVAR(space) = 0; + GVAR(hasCargo) = 0; + }; class Car_F; class Truck_F: Car_F { diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf index 829991ee879..decaf1637c9 100644 --- a/addons/cargo/XEH_postInit.sqf +++ b/addons/cargo/XEH_postInit.sqf @@ -51,8 +51,9 @@ _item hideObjectGlobal false; _item setPosASL (AGLtoASL _emptyPosAGL); - if ((getText (configFile >> "CfgVehicles" >> (typeOf _item) >> "simulation")) == "carx") then { - TRACE_1("re-enabling car damage",_item); + private _simulationType = toLower getText (configFile >> "CfgVehicles" >> typeOf _item >> "simulation"); + if (_simulationType in ["carx", "tankx"]) then { + TRACE_1("re-enabling vehicle damage",_item); [_item, "blockDamage", "ACE_cargo", false] call EFUNC(common,statusEffect_set); }; }] call CBA_fnc_addEventHandler; @@ -94,58 +95,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, "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler; -} forEach _initVehicleClasses; + [_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(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler; -} forEach _initObjectClasses; + [_x, "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler; +} forEach _vehicleClassesAddClassEH; -// find all remaining configured classes and init them +private _objectClassesAddClassEH = call (uiNamespace getVariable [QGVAR(objectClasses_classEH), {[]}]); { - 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")); + [_x, "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler; +} forEach _objectClassesAddClassEH; diff --git a/addons/cargo/XEH_preInit.sqf b/addons/cargo/XEH_preInit.sqf index 3d7ac380c2f..1b0894b77e3 100644 --- a/addons/cargo/XEH_preInit.sqf +++ b/addons/cargo/XEH_preInit.sqf @@ -11,5 +11,6 @@ PREP_RECOMPILE_END; GVAR(initializedItemClasses) = []; GVAR(initializedVehicleClasses) = []; GVAR(cargoHolderTypes) = ["Car", "Air", "Tank", "Ship", "Cargo_base_F", "Land_PaperBox_closed_F"]; +GVAR(disableParadropEffectsClasstypes) = ["Car_F"]; ADDON = true; diff --git a/addons/cargo/XEH_preStart.sqf b/addons/cargo/XEH_preStart.sqf index 022888575ed..e7b3f5c59b2 100644 --- a/addons/cargo/XEH_preStart.sqf +++ b/addons/cargo/XEH_preStart.sqf @@ -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); diff --git a/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf b/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf index ab362e63f4f..d3a66794db3 100644 --- a/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf +++ b/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf @@ -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} }; diff --git a/addons/cargo/functions/fnc_loadItem.sqf b/addons/cargo/functions/fnc_loadItem.sqf index 73056ef43f7..96dcaf87f13 100644 --- a/addons/cargo/functions/fnc_loadItem.sqf +++ b/addons/cargo/functions/fnc_loadItem.sqf @@ -39,8 +39,9 @@ if (_item isEqualType objNull) then { [QEGVAR(common,hideObjectGlobal), [_item, true]] call CBA_fnc_serverEvent; // Cars below water will take engine damage over time and eventualy become "water logged" and unfixable (because of negative z attach) - if ((getText (configFile >> "CfgVehicles" >> (typeOf _item) >> "simulation")) == "carx") then { - TRACE_1("disabling car damage",_item); + private _simulationType = toLower getText (configFile >> "CfgVehicles" >> typeOf _item >> "simulation"); + if (_simulationType in ["carx", "tankx"]) then { + TRACE_1("disabling vehicle damage",_item); [_item, "blockDamage", "ACE_cargo", true] call EFUNC(common,statusEffect_set); }; }; diff --git a/addons/cargo/functions/fnc_moduleSettings.sqf b/addons/cargo/functions/fnc_moduleSettings.sqf index ce73678e9e0..54a2d72e5c8 100644 --- a/addons/cargo/functions/fnc_moduleSettings.sqf +++ b/addons/cargo/functions/fnc_moduleSettings.sqf @@ -12,7 +12,7 @@ * None * * Example: - * function = "ace_cargo_fnc_loadItem" + * [] call ace_cargo_fnc_moduleSettings * * Public: No */ diff --git a/addons/cargo/functions/fnc_paradropItem.sqf b/addons/cargo/functions/fnc_paradropItem.sqf index 961b2f7c36f..4c873d189e6 100644 --- a/addons/cargo/functions/fnc_paradropItem.sqf +++ b/addons/cargo/functions/fnc_paradropItem.sqf @@ -6,6 +6,7 @@ * Arguments: * 0: Object * 1: Vehicle + * 2: Show Hint (default: true) * * Return Value: * Object unloaded @@ -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), []]; @@ -68,8 +69,10 @@ _itemObject setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vecto _item attachTo [_parachute, [0,0,1]]; _parachute setVelocity _velocity; - private _light = "Chemlight_yellow" createVehicle [0,0,0]; - _light attachTo [_item, [0,0,0]]; + if ((GVAR(disableParadropEffectsClasstypes) findIf {_item isKindOf _x}) == -1) then { + private _light = "Chemlight_yellow" createVehicle [0,0,0]; + _light attachTo [_item, [0,0,0]]; + }; }, [_itemObject], 0.7] call CBA_fnc_waitAndExecute; @@ -82,22 +85,26 @@ _itemObject setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vecto }; if (getPos _item select 2 < 1) then { - private _smoke = "SmokeshellYellow" createVehicle [0,0,0]; - _smoke attachTo [_item, [0,0,0]]; + if ((GVAR(disableParadropEffectsClasstypes) findIf {_item isKindOf _x}) == -1) then { + private _smoke = "SmokeshellYellow" createVehicle [0,0,0]; + _smoke attachTo [_item, [0,0,0]]; + }; [_this select 1] call CBA_fnc_removePerFrameHandler; }; }, 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; diff --git a/addons/cargo/functions/fnc_removeCargoItem.sqf b/addons/cargo/functions/fnc_removeCargoItem.sqf index ede9c68c941..ee6de29cabd 100644 --- a/addons/cargo/functions/fnc_removeCargoItem.sqf +++ b/addons/cargo/functions/fnc_removeCargoItem.sqf @@ -53,7 +53,7 @@ private _continue = if (_item isEqualType objNull) then { }; } forEach _loaded; - FILTER(_loaded,_x != nil); + FILTER(_loaded,!isNil "_x"); true }; diff --git a/addons/cargo/functions/fnc_setSpace.sqf b/addons/cargo/functions/fnc_setSpace.sqf index 1b3743cf9f8..ed34914fdc3 100644 --- a/addons/cargo/functions/fnc_setSpace.sqf +++ b/addons/cargo/functions/fnc_setSpace.sqf @@ -31,14 +31,23 @@ TRACE_2("setSpace",_vehicle,_size); // Nothing to do here if ( (isNil "_space") || - {isNull _vehicle} || - {_space == _vehicle getVariable [QGVAR(space), CARGO_SPACE(typeOf _vehicle)]} + {isNull _vehicle} ) exitWith {}; +// Account for cargo already in the vehicle +private _loaded = _vehicle getVariable [QGVAR(loaded), []]; +private _newSpace = _space; +{ + _newSpace = _newSpace - ([_x] call FUNC(getSizeItem)); +} forEach _loaded; + +// If the new value is the same as the old, do nothing +if (_newSpace == (_vehicle getVariable [QGVAR(space), CARGO_SPACE(typeOf _vehicle)])) exitwith {}; + // Apply new space globally +_vehicle setVariable [QGVAR(space), _newSpace, true]; // Necessary to update value, even if no space, as API could be used again _vehicle setVariable [QGVAR(hasCargo), _space > 0, true]; -_vehicle setVariable [QGVAR(space), _space, true]; // If no cargo space no need for cargo menu if (_space <= 0) exitWith {}; diff --git a/addons/cargo/functions/fnc_startLoadIn.sqf b/addons/cargo/functions/fnc_startLoadIn.sqf index d7b034f1312..7cc79236963 100644 --- a/addons/cargo/functions/fnc_startLoadIn.sqf +++ b/addons/cargo/functions/fnc_startLoadIn.sqf @@ -42,12 +42,20 @@ if ([_object, _vehicle] call FUNC(canLoadItemIn)) then { 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; diff --git a/addons/cargo/functions/fnc_startUnload.sqf b/addons/cargo/functions/fnc_startUnload.sqf index f0edaf34f7e..5e7ada82c5a 100644 --- a/addons/cargo/functions/fnc_startUnload.sqf +++ b/addons/cargo/functions/fnc_startUnload.sqf @@ -72,10 +72,17 @@ if ([_item, GVAR(interactionVehicle), ACE_player] call FUNC(canUnloadItem)) then [ 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 { diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index 86e0106a93e..0b48037f832 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -15,6 +15,7 @@ 싣기 裝載 装载 + Yükle Unload @@ -30,6 +31,7 @@ 내리기 卸載 卸载 + Boşalt Cargo @@ -45,6 +47,7 @@ 화물 貨物 货物 + Kargo Cargo Menu @@ -60,6 +63,7 @@ 화물 메뉴 貨物選單 货物选单 + Kargo Menüsü Cargo space left: %1 @@ -70,11 +74,12 @@ Zbývající prostor: %1 Espacio de carga restante: %1 Spazio cargo rimanente: %1 - Espace de cargaison restant : %1 + Espace de chargement restant : %1 カーゴの空き容量: %1 선적 공간 남음: %1 貨物剩餘空間: %1 货物剩余空间: %1 + Kargo Alanı Kaldı: %1 Enable Cargo @@ -85,11 +90,12 @@ Povolit náklad Habilitar carga Abilita Cargo - Activer la mise en cargaison + Activer la cargaison カーゴを有効化 화물 활성화 啟用貨物裝載 启用货物装载 + Kargoyu Etkinleştir Enable the load in cargo module @@ -100,7 +106,7 @@ Habilitar la carga en el módulo de carga Umožňuje naložit předměty do nákladového prostoru vozidla Abilita il modulo di caricamento in cargo - Active le chargement de cargaison dans un vehicule + Active la possibilité de charger du matériel dans un module de fret (véhicule/container). カーゴ モジュールで積み込みを有効化 화물 모듈에 싣기를 활성화합니다 啟用貨物裝載功能 @@ -120,6 +126,7 @@ 화물 설정 貨物設定 货物设定 + Kargo Ayarları Configure the cargo module settings @@ -130,7 +137,7 @@ Configure los ajustes del módulo de carga Konfigurace nákladního modulu Configura le impostazioni del modulo cargo - Configure les paramètres du module de cargaison + Configure les paramètres du module de cargaison. カーゴ モジュールの設定を構成 화물 모듈의 환경 설정을 바꿉니다 配置貨物模塊設定 @@ -156,7 +163,7 @@ Unloaded<br/>%1 from<br/>%2 %1<br/>von<br/>%2 abgeladen Descargado/a<br/>%1 de<br/>%2 - Déchargé<br/>%1 de<br/>%2 + %1<br/>déchargé de<br/>%2 %1<br/>rozładowano z<br/>%2 %1<br/>vyloženo z<br/>%2 %1<br/>descarregado de<br/>%2 @@ -182,6 +189,7 @@ 화물 싣기 裝載貨物中 装载货物中 + Kargo Yükleniyor Unloading Cargo @@ -197,6 +205,7 @@ 화물 내리기 卸載貨物中 卸载货物中 + Kargo Boşaltılıyor %1<br/>could not be loaded @@ -207,11 +216,12 @@ %1<br/>не может быть погружен %1<br/>non può essere caricato %1<br/>no pudo ser cargado - %1<br /> n'a pas pu être chargé + %1<br />n'a pas pu être chargé %1<br/>は積み込めませんでした %1<br/>이 실릴 수가 없습니다 %1<br/>無法被裝載 %1<br/>无法被装载 + %1<br/> kargo yüklenemedi %1<br/>could not be unloaded @@ -222,11 +232,12 @@ %1<br/>не может быть выгружен %1<br/>non può essere scaricato %1<br/>no pudo ser descargado - %1<br /> n'a pas pu être déchargé + %1<br />n'a pas pu être déchargé %1<br/>は降ろせませんでした %1<br/>이 내려질 수가 없습니다 %1<br/>無法被卸載 %1<br/>无法被卸载 + %1<br/> kargo boşaltılamadı Cargo Space @@ -237,6 +248,12 @@ 货物空间 Przestrzeń ładunkowa 화물 공간 + Грузовое пространство + Espaço de Carga + Espace de stockage + Nákladový prostor + Espacio de carga + Kargo Alanı The cargo space available in this vehicle/container @@ -247,6 +264,11 @@ 设定此载具/集装箱可装载多少货物 Dostępna przestrzeń ładunkowa w tym pojeździe/kontenerze 이 차량/컨테이너에서 사용가능한 화물 공간 + Грузовое пространство, доступное в этом транспортном средстве / контейнере + O espaço de carga disponível nesse veículo/contâiner + L'espace de stockage disponible dans ce véhicule/container. + Nákladový prostor dostupný v tomto vozidle/kontejneru + El espacio de carga disponible en este vehículo/contenedor Cargo Size @@ -257,6 +279,12 @@ 货物的大小 Wielkość ładunku 화물 크기 + Размер груза + Tamanho da Carga + Encombrement fret + Velikost nákladu + Tamaño de carga + Kargo Boyutu The cargo space required to hold this object (-1 for unloadable) @@ -267,6 +295,11 @@ 此货物会占掉多少空间(设定-1的话此货物就不能被装载) Wymagana przestrzeń ładunkowa dla tego obiektu (-1 dla niemożliwych do załadowania) 이 화물을 적재하는데 필요한 공간 (-1=무조건 적재가능) + Грузовое пространство, необходимое для размещения этого объекта (-1 для незагружаемого) + O Espaço de carga necessário para carregar esse objeto (-1 para que não seja carregável) + Définit l'espace de stockage nécessaire à l'embarquement de cet objet (-1 pour le rendre non transportable). + Nákladový prostor požadovný pro naložení tohoto objektu (-1 pro nenaložitelné) + Espacio de carga requerido para guardar este objeto (-1 para no descargable) Airdrop @@ -274,10 +307,14 @@ 空中投下 Zrzut zaopatrzenia 공중 투하 - Largage aérien + Largage Lancio Aereo 空投 空投 + Десантирование груза + Lançamento Aéreo + Výsadek + Lanzamiento aéreo Unlevel Flight @@ -285,44 +322,70 @@ 機体が水平ではありません Nierówny lot 기체가 수평이 아닙니다 - Rétablir l'assiette + Vol en dénivelé Volo non Livellato 此架飛機並無保持水平飛行 此架飞机并无保持水平飞行 + Неподходящее положение + Desnivelar Vôo + Let není vyrovnaný + Vuelo no nivelado Paradrop Time Coefficient Türlast Zeitfaktor 空中投下までの時間係数 Coefficente Tempo Lancio Paracadute - Coefficient Temps de largage de cargaison + Coefficient du temps de paralargage 空投時間係數 空投时间系数 Współczynnik czasu zrzutu 공중 투하 시간 계수 + Коэффициент времени десантирования + Fator de Tempo para soltar a carga + Koeficient času nákladního výsadku + Coeficiente de tiempo para lanzamiento Modifier for how long it takes to paradrop a cargo item. Beeinflusst die zusätzliche Zeit für Türlastabwürfe. カーゴ アイテムを空中投下するまでの時間を変更します。 Modificato per quanto tempo ci impiega a paracadutare un oggetto cargo. - Modifier le temps qu'il faut pour larguer la cargaison. + Modifie le temps nécessaire au paralargage d'une cargaison. 設定空投所需消耗的時間 设定空投所需消耗的时间. Modyfikator wskazujący jak dużo czasu potrzeba by zrzucić przedmiot na spadochronie. 화물을 공중 투하 하는데 얼마나 걸리는 시간 설정 + Модификатор времени, необходимого для десантирования груза + Coeficiente de quanto tempo leva para soltar uma carga de paraquedas + Upravuje jak dlouho výsadek trvá pro náklad. + Modificador de tiempo de lanzamiento en paracaídas de un objeto cargado Load Time Coefficient + Ladezeitmultiplikator 積載時間の係数 Współczynnik czasu załadowania Coefficente Tempo Caricamento + Коэффициент времени погрузки + Fator de tempo para carregar + Coefficient du temps de chargement + 裝載時間係數 + Koeficient času nákládání + Coeficiente de tiempo para cargar Modifies how long it takes to load/unload items.\nTime, in seconds, is the size of the item multiplied by this value. + Gibt an, wie lange das Laden / Entladen von Gegenständen dauern soll.\nZeit in Sekunden, die mit der Größe des Gegenstandes multipliziert wird. アイテムの積み下ろし作業にかかる時間を編集できます。\nアイテムの大きさにこの値が乗法され、時間 (秒) を変更できます。 Modyfikuje, jak długo zajmuje załadowywanie/wyładowywanie przedmiotów. \nCzasem, w sekundach, jest wielkość przedmiotu razy jego wartość. Modifica quanto tempo ci impiega a caricare o scaricare gli oggetti.\n Tempo, in secondi, è la dimensione dell'oggetto moltiplicata per questo valore + Изменяет время для загрузки/выгрузки предметов. \n Время (сек) - это размер предмета, умноженный на это значение. + Coeficiente de quanto tempo leva para carregar/descarregar itens.\nTempo, em segundos, é o tamanho do objeto multiplicado por esse valor. + Modifie le temps nécessaire pour charger/décharger des objets.\nLe temps, en secondes, est calculé en multipliant la taille de l'élément par ce coefficient. + 修改要花多長時間來裝載/卸載物品。\n時間,以秒為單位,而物品的大小數值與這個係數成比。 + Upravuje jak dlouho nakládají/vykládání trvá.\nVýsledkem je čas v sekundách - velikost objektu vynásobená touto hodnotou. + Modifica el tiempo de carga/descarga de objetos.\n El Tiempo en segundos, es el tamño del objeto multiplicado por este valor. diff --git a/addons/chemlights/CfgVehicles.hpp b/addons/chemlights/CfgVehicles.hpp index f22b03a7fea..02856b99e72 100644 --- a/addons/chemlights/CfgVehicles.hpp +++ b/addons/chemlights/CfgVehicles.hpp @@ -246,6 +246,7 @@ class CfgVehicles { transportMaxItems = 9002; maximumload = 9002; model = "\A3\weapons_F\AmmoBoxes\WpnsBox_large_F"; + editorPreview = "\A3\EditorPreviews_F\Data\CfgVehicles\Box_NATO_WpsSpecial_F.jpg"; class TransportItems { MACRO_ADDITEM(ACE_Chemlight_Shield,20); diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index 4fc7cc4e8be..b3894107a32 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -11,6 +11,11 @@ Luce chimica 螢光棒 萤光棒 + Химсвет + Bastões de Luz + Chemická světla + Luces químicas + Işık Çubukları Prepare %1 @@ -18,10 +23,15 @@ Przygotuj %1 %1 vorbereiten %1 준비 - Prépare %1 + Préparer un %1 Prepara %1 使用%1 使用%1 + Приготовить %1 + Preparar %1 + Připravit %1 + Preparar %1 + Hazırlanıyor %1 %1<br/>Prepared @@ -33,13 +43,18 @@ %1 <br/> Preparata %1<br/>已使用 %1<br/>已使用 + %1<br/>Приготовлен + %1<br/>Preparado + %1<br/>Připraveno + %1<br/>Preparado + %1<br/> Hazırlandı No inventory space Kein Platz im Inventar Sin espacio en inventario Brak miejsca w ekwipunku - Pas de place + Pas de place dans l'inventaire Nedostatek místa v inventáři Sem espaço no inventário Nessuno spazio nell'inventario @@ -49,6 +64,7 @@ 소지품 공간이 없음 已無存放空間 已无存放空间 + Envanter de alan yok [ACE] Chemlights @@ -56,10 +72,15 @@ [ACE] Świetliki [ACE] Knicklichter [ACE] 켐라이트 - [ACE] Cyalume + [ACE] Cyalumes [ACE] Luci chimiche [ACE] 螢光棒 [ACE] 萤光棒 + [ACE] Химсвет + [ACE] Bastões de Luz + [ACE] Chemická světla + [ACE] Luces químicas + [ACE] Işık Çubukları Chemlight (Orange) @@ -71,6 +92,11 @@ Luce chimica (Arancione) 螢光棒 (橘色) 萤光棒 (橘色) + Химсвет (Оранжевый) + Bastão de Luz (Laranja) + Chemické světlo (Oranžové) + Luz química (naranja) + Işık Çubuğu (Turuncu) Orange Light @@ -82,6 +108,11 @@ Luce Arancione 橘色光 橘色光 + Оранжевый свет + Luz Laranja + Oranžové světlo + Luz naranja + Turuncu Işık Type: Light - Orange<br />Rounds: 1<br />Used in: Hand @@ -89,10 +120,14 @@ Typ: Światło - pomarańczowe<br/>Pociski: 1<br/>Używany w: ręce Typ: Licht - orange<br />Anzahl: 1<br />Benutzt in: Hand 종류:밝은 오렌지<br />수량: 1<br />사용처: 손 - Type: Lumière - orange<br />Nbre: 1<br /> À main + Type : lumière - Orange<br />Munitions : 1<br />Application : main Tipo: Luce - Arancione<br/>Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 橘色<br />發數: 1<br />使用於: 手 类型: 光 - 橘色<br />发数: 1<br />使用于: 手 + Тип: Свет - Оранжевый<br />1 штука<br />В руках + Tipo: Luz - Laranja<br/>Usos: 1<br/>Usado em: Mão + Typ: Světlo - Oranžové<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Naranja<br />Cantidad: 1<br />Usado en: Mano Chemlight (White) @@ -104,6 +139,11 @@ Luce chimica (Bianca) 螢光棒 (白色) 萤光棒 (白色) + Химсвет (Белый) + Bastão de Luz (Branco) + Chemické světlo (Bílé) + Luz química (Blanca) + Işık Çubuğu (Beyaz) White Light @@ -115,6 +155,11 @@ Luce Bianca 白色光 白色光 + Белый свет + Luz Branca + Bílé světlo + Luz blanca + Beyaz Işık Type: Light - White<br />Rounds: 1<br />Used in: Hand @@ -122,10 +167,14 @@ Typ: Światło - białe<br/>Pociski: 1<br/>Używany w: ręce Typ: Licht - weiß<br />Anzahl: 1<br />Benutzt in: Hand 종류:하얀색<br />수량: 1<br />사용처: 손 - Type: Lumière - blanche<br />Nbre: 1<br /> À main + Type : lumière - Blanche<br />Munitions : 1<br />Application : main Tipo: Luce - Bianca<br/>Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 白色<br />發數: 1<br />使用於: 手 类型: 光 - 白色<br />发数: 1<br />使用于: 手 + Тип: Свет - Белый<br />1 штука<br />В руках + Tipo: Luz - Branco<br/>Usos: 1<br/>Usado em: Mão + Typ: Světlo - Bílé<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Blanca<br />Cantidad: 1<br />Usado en: Mano Chemlight (Hi Red) @@ -133,10 +182,15 @@ Świetlik (jaskrawy czerwony) Knicklicht (rot, hell) 켐라이트 (밝은 빨간색) - Cyalume (Hi rouge) + Cyalume HL (rouge) Luce chimica (Hi Rossa) 螢光棒 (超亮紅色) 萤光棒 (超亮红色) + Химсвет (Ярко-Красный) + Bastão de Luz (Vermelho Forte) + Chemické světlo (Červené jasné) + Luz química (Roja Hi) + Işık Çubuğu (Kırmızı) Red Hi Light @@ -144,10 +198,15 @@ Jaskrawe czerwone światło Helles, rotes Knicklicht 밝은 빨간색 - Lum. rouge haute intensité + Lum. rouge HL Luce Hi Rossa 超亮紅色光 超亮红色光 + Яркий Красный свет + Luz forte vermelha + Červené jasné světlo + Luz roja Hi + Kırmızı Işık Type: Light - Red Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -155,10 +214,14 @@ Typ: Światło - jaskrawe czerwone (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Typ: Licht - rot, hell (30 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand 종류: 밝은 빨간색 (30분)<br />수량: 1<br />사용처: 손 - Type: Lumière - rouge Hi (30 minutes)<br />Nbre: 1<br /> À main + Type : lumière HL (30 minutes) - Rouge<br />Munitions : 1<br />Application : main Tipo: Luce - Rossa Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮紅色 (30分鐘)<br />發數: 1<br />使用於: 手 类型: 光 - 超亮红色 (30分钟)<br />发数: 1<br />使用于: 手 + Тип: Свет - Ярко-Красный (30 минут)<br />1 штука<br />В руках + Tipo: Luz - Vermelho Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão + Typ: Světlo - Červené jasné<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Roja Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Chemlight (Hi Yellow) @@ -166,10 +229,15 @@ Świetlik (jaskrawy żółty) Knicklicht (gelb, hell) 켐라이트 (밝은 노란색) - Cyalume (Hi jaune) + Cyalume HL (jaune) Luce chimica (Hi Gialla) 螢光棒 (超亮黃色) 萤光棒 (超亮黄色) + Химсвет (Ярко-Желтый) + Bastão de Luz (Amarelo Forte) + Chemické světlo (Žluté jasné) + Luz química (Amarilla Hi) + Işık Çubuğu (Sarı) Yellow Hi Light @@ -177,10 +245,15 @@ Jaskrawe żółte światło Helles, gelbes Knicklicht 밝은 노란색 - Lum. jaune haute intensité + Lum. jaune HL Luce Hi Gialla 超亮黃色光 超亮黄色光 + Яркий Желтый свет + Luz forte amarela + Žluté jasné světlo + Luz amarilla Hi + Sarı Işık Type: Light - Yellow Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -188,10 +261,14 @@ Typ: Światło - jaskrawe żółte (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Typ: Licht - gelb, hell (30 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand 종류:밝은 노란색 (30분)<br />수량: 1<br />사용처: Hand - Type: Lumière - Jaune Hi (30 minutes)Nbre: 1<br /> À main + Type : lumière HL (30 minutes) - Jaune<br />Munitions : 1<br />Application : main Tipo: Luce - Gialla Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮黃色 (30分鐘)<br />發數: 1<br />使用於: 手 类型: 光 - 超亮黄色 (30分钟)<br />发数: 1<br />使用于: 手 + Тип: Свет - Ярко-Желтый (30 минут)<br />1 штука<br />В руках + Tipo: Luz - Amarelo Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão + Typ: Světlo - Žluté jasné<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Amarilla Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Chemlight (Hi White) @@ -199,10 +276,14 @@ Świetlik (jaskrawy biały) Knicklicht (weiß, hell) 켐라이트 (밝은 하얀색) - Cyalume (Hi blanc) + Cyalume HL (blanc) Luce chimica (Hi Bianca) 螢光棒 (超亮白色) 萤光棒 (超亮白色) + Химсвет (Ярко-Белый) + Bastão de Luz (Branco Forte) + Chemické světlo (Bílé jasné) + Luz química (Blanca Hi) White Hi Light @@ -210,10 +291,14 @@ Jaskrawe białe światło Helles, weißes Knicklicht 밝은 하얀색 - Lum. blanche haute intensité + Lum. blanche HL Luce Hi Bianca 超亮白色光 超亮白色光 + Яркий Белый свет + Luz forte branca + Bílé jasné světlo + Luz blanca Hi Type: Light - White Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -221,73 +306,131 @@ Typ: Światło - jaskrawe białe (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Typ: Licht - weiß, hell (30 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand 종류: 밝은 하얀색 (30분)<br />수량: 1<br />사용처: 손 - Type: Lumière - blanche Hi (30 minutes)<br />Nbre: 1<br /> À main + Type : lumière HL (30 minutes) - Blanche<br />Munitions : 1<br />Application : main Tipo: Luce - Bianca Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮白色 (30分鐘)<br />發數: 1<br />使用於: 手 类型: 光 - 超亮白色 (30分钟)<br />发数: 1<br />使用于: 手 + Тип: Свет - Ярко-Белый (30 минут)<br />1 штука<br />В руках + Tipo: Luz - Branco Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão + Typ: Světlo - Bílé jasné<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Blanca Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Chemlight (Hi Blue) - Cyalume (Hi Bleu) + Cyalume HL (bleu) ケミライト (高輝度 青) Świetlik (jaskrawy niebieski) + Knicklicht (Blau, Hell) Luce chimica (Hi Blu) + Химсвет (Ярко-Синий) + Bastão de Luz (Azul Forte) + 螢光棒(超亮藍色) + Chemické světlo (Modré jasné) + Luz química (Azul Hi) Blue Hi Light - Lum. bleue haute intensité + Lum. bleue HL + Helles, blaues Knicklicht 高輝度の青色 Jaskrawe niebieskie światło Luce Hi Blu + Яркий Синий свет + Luz forte azul + 超亮藍色光 + Modré jasné světlo + Luz azul Hi Type: Light - Blue Hi (30 minute)<br />Rounds: 1<br />Used in: Hand - Type: Lumière - bleue Hi (30 minutes)<br />Nbre: 1<br /> À main + Type : lumière HL (30 minutes) - Bleue<br />Munitions : 1<br />Application : main + Typ: Licht - blau, hell (30 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand 種類: 照明 - 高輝度 青 (30分間)<br />装填数: 1<br />次で使用: 携帯 Typ: Światło - jaskrawe niebieskie (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Tipo: Luce - Hi blu (30 minuti)<br/>Rimanenti:1 <br/>Usata in: Mano + Тип: Свет - Ярко-Синий (30 минут)<br />1 штука<br />В руках + Tipo: Luz - Azul Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão + 類型: 光 - 超亮藍色 (30分鐘)<br />發數: 1<br />使用於: 手 + Typ: Světlo - Modré jasné<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Azul Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Chemlight (Hi Green) - Cyalume (Hi Vert) + Cyalume HL (vert) + Knicklicht (Grün, Hell) ケミライト (高輝度 緑) Świetlik (jaskrawy zielony) Luce chimica (Hi Verde) + Химсвет (Ярко-Зеленый) + Bastão de Luz (Verde Forte) + 螢光棒(超亮綠色) + Chemické světlo (Zelené jasné) + Luz química (Verde Hi) Green Hi Light - Lum. verte haute intensité + Lum. verte HL + Helles, grünes Knicklicht 高輝度の青色 Jaskrawe zielone światło Luce Hi Verde + Яркий Зеленый свет + Luz forte verde + 超亮綠色光 + Zelené jasné světlo + Luz verde Hi Type: Light - Green Hi (30 minute)<br />Rounds: 1<br />Used in: Hand - Type: Lumière - verte Hi (30 minutes)<br />Nbre: 1<br /> À main + Type : lumière HL (30 minutes) - Verte<br />Munitions : 1<br />Application : main + Typ: Licht - grün, hell (30 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand 種類: 照明 - 高輝度 緑 (30分間)<br />装填数: 1<br />次で使用: 携帯 Typ: Światło - jaskrawe zielone (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Tipo: Luce - Hi verde (30 minuti)<br/>Rimanenti: 1<br/>Usata in: Mano + Тип: Свет - Ярко-Зеленый (30 минут)<br />1 штука<br />В руках + Tipo: Luz - Verde Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão + 類型: 光 - 超亮綠色 (30分鐘)<br />發數: 1<br />使用於: 手 + Typ: Světlo - Zelené jasné<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Verde Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Chemlight (Ultra-Hi Orange) - Cyalume (Ultra-Hi orange) + Cyalume UHL (orange) + Knicklicht (Orange, Hell) ケミライト (高輝度 オレンジ) Świetlik (ultra-jaskrawy pomarańczowy) Luce chimica (Ultra-Hi Arancione) + Химсвет (Ультраяркий Оранжевый) + Bastão de Luz (Laranja Ultra Forte) + 螢光棒(極亮橘色) + Chemické světlo (Oranžové velmi jasné) + Luz química (Naranja Ultra-Hi) Orange Ultra-Hi Light - Lum. orange ultra haute intensité + Lum. orange UHL + Helles, orangenes Knicklicht ウルトラ高輝度のオレンジ色 Ultra-jaskrawe pomarańczowe światło Luce Ultra-Hi Arancione + Ультраяркий Оранжевый свет + Luz ultra forte laranja + 極亮橘色光 + Oranžové velmi jasné světlo + Luz naranja Ultra-Hi Type: Light - Orange Ultra-Hi (5 minute)<br />Rounds: 1<br />Used in: Hand - Type: Lumière - Orange Ultra-Hi (5 minutes)<br />Nbre: 1<br /> À main + Type : lumière UHL (5 minutes) - Orange<br />Munitions : 1<br />Application : main + Typ: Licht - orange, hell (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand 種類: 照明 - ウルトラ高輝度 オレンジ (5分間)<br />装填数: 1<br />次で使用: 携帯 - Typ: Światło - ultra-jaskrawe pomarańczowe (30 minut)<br/>Pociski: 1<br/>Używany w: ręce + Typ: Światło - ultra-jaskrawe pomarańczowe (5 minut)<br/>Pociski: 1<br/>Używany w: ręce Tipo: Luce - Ultra-Hi (5 minuti)<br/>Rimanenti: 1<br/>Usata in: Mano + Тип: Свет - Ультраяркий Оранжевый (5 минут)<br />1 штука<br />В руках + Tipo: Luz - Laranja Ultra Forte (5 minutos)<br/>Usos: 1<br/>Usado em: Mão + 類型: 光 - 極亮橘色 (5分鐘)<br />發數: 1<br />使用於: 手 + Typ: Světlo - Oranžové velmi jasné<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz - Naranja Ultra-Hi (5 minutos)<br />Cantidad: 1<br />Usado en: Mano Chemlight (IR) @@ -299,6 +442,10 @@ Luce chimica (IR) 螢光棒 (紅外線) 萤光棒 (红外线) + Химсвет (Инфракрасный) + Bastão de Luz (IV) + Chemické světlo (Infračervené) + Luz química (IR) IR Light @@ -306,10 +453,14 @@ Światło podczerwone IR-Knicklicht 적외선 켐라이트 - Lumière IR + Lum. IR Luce IR 紅外線光 红外线光 + Инфракрасный свет + Bastão de luz infravermelho + Infračervené světlo + Luz IR Type: Light - Infrared<br />Rounds: 1<br />Used in: Hand @@ -317,10 +468,14 @@ Typ: Światło - podczerwone<br/>Pociski: 1<br/>Używany w: ręce Typ: Licht - infrarot<br />Anzahl: 1<br />Benutzt in: Hand 종류: 적외선<br />수량: 1<br />사용처: 손 - Type: Lumière - infrarouge<br />Nbre: 1<br /> À main + Type: lumière - Infrarouge<br />Munitions : 1<br />Application : main Tipo: Luce - Infrarossi<br />Usata in: Mano 類型: 光 - 紅外線<br />發數: 1<br />使用於: 手 类型: 光 - 红外线<br />发数: 1<br />使用于: 手 + Тип: Свет - Инфракрасный<br />1 штука<br />В руках + Tipo: Luz - Infravermelho<br/>Usos: 1<br/>Usado em: Mão + Typ: Světlo - Infračervené<br/>Počet použití: 1<br/>Použít v ruce + Tipo: Luz infra-roja<br />Cantidad: 1<br />Usado en: Mano Chemlight Shield (Empty) @@ -328,10 +483,14 @@ Osłona na świetlik (pusta) Knicklicht-Abschirmung (leer) 켐라이트 쉴드 (비어있음) - Étui cyalume (vide) + Etui cyalume (vide) Scudo Luce chimica (Vuoto) 螢光棒保護殼 (空) 萤光棒保护壳 (空) + Контейнер для Химсвета (Пуст) + Estojo de Luz (Vazio) + Clona na chemické světlo + Protector de luz química (Vacía) Shield for chemlights. Combine with chemlight to prepare reading light. @@ -339,10 +498,14 @@ Osłona na świetliki. Połącz ją ze świetlikiem by stworzyć lampkę do czytania. Abschirmung für Knicklichter. Mit Knicklicht kombinieren, um Leselicht zu erhalten. 켐라이트를 위한 가림막입니다. 켐라이트와 같이 사용하여 읽을 때 씁니다. - Étui pour cyalume. Combiné avec un cyalume pour obtennir un lampe de lecture. + Étui pour cyalume. Le combiner avec un cyalume pour obtenir une lampe de lecture. Scudo per luci chimiche. Combina con una luce chimica per una luce da lettura. 螢光棒的保護殼. 與螢光棒結合後可充當閱讀燈 萤光棒的保护壳. 与萤光棒结合后可充当阅读灯. + Защитный контейнер для Химсвета. Объедините с Химсветом, чтобы подготовить Свет для чтения + Estojo para os bastões de luz. Combine com o bastão de luz para preparar luz de leitura. + Clona na chemické světlo. Při vložení chemického světla vznikne praktické světlo na čtení. + Protector para luz química. Combina con luz química para preparar una luz de lectura Chemlight Shield (Green) @@ -350,10 +513,14 @@ Osłona na świetlik (zielona) Knicklicht-Abschirmung (grün) 켐라이트 쉴드 (초록) - Étui cyalume (vert) + Etui avec cyalume (vert) Scudo Luce Chimica (Verde) 螢光棒保護殼 (綠色) 萤光棒保护壳 (绿色) + Контейнер для Химсвета (Зел) + Estojo de Luz (Verde) + Clona s vloženým chemickým světlem (Zelené) + Protector de luz química (Verde) Green reading light. @@ -361,10 +528,14 @@ Zielona lampka. Grünes Leselicht. 초록빛 조명 - Lampe d'orientation verte. + Lampe de lecture verte. Luce da lettura Verde. 綠色閱讀燈 绿色阅读灯。 + Ночник из Химсвета (Зеленый) + Luz de leitura verde. + Zelené světlo na čtení. + Luz de lectura verde Chemlight Shield (Red) @@ -372,10 +543,14 @@ Osłona na świetlik (czerwona) Knicklicht-Abschirmung (rot) 켐라이트 쉴드 (빨강) - Étui cyalume (rouge) + Etui avec cyalume (rouge) Scudo Luce Chimica (Rossa) 螢光棒保護殼 (紅色) 萤光棒保护壳 (红色) + Контейнер для Химсвета (Красн) + Estojo de Luz (Vermelho) + Clona s vloženým chemickým světlem (Červené) + Protector de luz química (Roja) Red reading light. @@ -383,10 +558,14 @@ Czerwona lampka. Rotes Leselicht. 빨간색 조명 - Lampe d'orientation rouge. + Lampe de lecture rouge. Luce da lettura Rossa. 紅色閱讀燈 红色阅读灯。 + Ночник из Химсвета (Красный) + Luz de leitura vermelha. + Červené světlo na čtení. + Luz de lectura roja Chemlight Shield (Blue) @@ -394,10 +573,14 @@ Osłona na świetlik (niebieska) Knicklicht-Abschirmung (blau) 켐라이트 쉴드 (파랑) - Étui cyalume (bleu) + Etui avec cyalume (bleu) Scudo Luce Chimica (Blu) 螢光棒保護殼 (藍色) 萤光棒保护壳 (蓝色) + Контейнер для Химсвета (Син) + Estojo de Luz (Azul) + Clona s vloženým chemickým světlem (Modré) + Protector de luz química (Azul) Blue reading light. @@ -405,10 +588,14 @@ Niebieska lampka. Blaues Leselicht. 파란색 조명 - Lampe d'orientation bleue. + Lampe de lecture bleue. Luce da lettura Blu. 藍色閱讀燈 蓝色阅读灯。 + Ночник из Химсвета (Синий) + Luz de leitura azul. + Modré světlo na čtení. + Luz de lectura azul Chemlight Shield (Yellow) @@ -416,10 +603,14 @@ Osłona na świetlik (żółta) Knicklicht-Abschirmung (gelb) 켐라이트 쉴드 (노랑) - Étui cyalume (jaune) + Etui avec cyalume (jaune) Scudo Luce Chimica (Gialla) 螢光棒保護殼 (黃色) 萤光棒保护壳 (黄色) + Контейнер для Химсвета (Желт) + Estojo de Luz (Amarelo) + Clona s vloženým chemickým světlem (Žluté) + Protector de luz química (Amarilla) Yellow reading light. @@ -427,10 +618,14 @@ Żółta lampka. Gelbes Leselicht. 노란색 조명 - Lampe d'orientation jaune. + Lampe de lecture jaune. Luce da lettura Gialla. 黃色閱讀燈 黄色阅读灯。 + Ночник из Химсвета (Желтый) + Luz de leitura amarela. + Žluté světlo na čtení. + Luz de lectura amarilla Chemlight Shield (Orange) @@ -438,10 +633,14 @@ Osłona na świetlik (pomarańczowa) Knicklicht-Abschirmung (orange) 켐라이트 쉴드 (주황) - Étui cyalume (orange) + Etui avec cyalume (orange) Scudo Luce Chimica (Arancione) 螢光棒保護殼 (橘色) 萤光棒保护壳 (橘色) + Контейнер для Химсвета (Оранж) + Estojo de Luz (Laranja) + Clona s vloženým chemickým světlem (Oranžové) + Protector de luz química (Naranja) Orange reading light. @@ -449,10 +648,14 @@ Pomarańczowa lampka. Oranges Leselicht. 주황색 조명 - Lampe d'orientation orange. + Lampe de lecture orange. Luce da lettura Arancione. 橘色閱讀燈 橘色阅读灯。 + Ночник из Химсвета (Оранжевый) + Luz de leitura laranja. + Oranžové světlo na čtení. + Luz de lectura naranja Chemlight Shield (White) @@ -460,10 +663,14 @@ Osłona na świetlik (biała) Knicklicht-Abschirmung (weiß) 켐라이트 쉴드 (하양) - Étui cyalume (blanc) + Etui avec cyalume (blanc) Scudo Luce Chimica (Bianca) 螢光棒保護殼 (白色) 萤光棒保护壳 (白色) + Контейнер для Химсвета (Белый) + Estojo de Luz (Branco) + Clona s vloženým chemickým světlem (Bílé) + Protector de luz química (Blanca) White reading light. @@ -471,10 +678,14 @@ Biała lampka. Weißes Leselicht. 주황색 조명 - Lampe d'orientation blanche. + Lampe de lecture blanche. Luce da lettura Bianca. 白色閱讀燈 白色阅读灯。 + Ночник из Химсвета (Белый) + Luz de leitura branca. + Bílé světlo na čtení. + Luz de lectura blanca diff --git a/addons/common/ACE_Settings.hpp b/addons/common/ACE_Settings.hpp index eeee9c2f377..06cf6678e64 100644 --- a/addons/common/ACE_Settings.hpp +++ b/addons/common/ACE_Settings.hpp @@ -1,4 +1,6 @@ class ACE_Settings { + //IGNORE_STRING_WARNING(STR_ACE_Common_SettingName); + //IGNORE_STRING_WARNING(STR_ACE_Common_SettingDescription); /* * class GVAR(sampleSetting) { * value = 1; // Value @@ -20,6 +22,7 @@ class ACE_Settings { typeName = "SCALAR"; isClientSettable = 0; displayName = CSTRING(CheckPBOsAction); + description = CSTRING(CheckPBOsActionDesc); values[] = {CSTRING(CheckPBO_Action_WarnOnce), CSTRING(CheckPBO_Action_WarnPerm), CSTRING(CheckPBO_Action_Kick)}; }; class GVAR(checkPBOsCheckAll) { @@ -28,6 +31,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 0; displayName = CSTRING(CheckPBOsCheckAll); + description = CSTRING(CheckPBOsCheckAllDesc); }; class GVAR(checkPBOsWhitelist) { category = CSTRING(DisplayName); @@ -35,6 +39,7 @@ class ACE_Settings { typeName = "STRING"; isClientSettable = 0; displayName = CSTRING(CheckPBOsWhitelist); + description = CSTRING(CheckPBOsWhitelistDesc); }; /*class GVAR(enableNumberHotkeys) { value = 1; diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index c0706238938..4b547655394 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -27,6 +27,7 @@ PREP(changeProjectileDirection); PREP(checkFiles); PREP(checkPBOs); PREP(claim); +PREP(claimSafeServer); PREP(codeToString); PREP(createOrthonormalReference); PREP(currentChannel); @@ -56,6 +57,8 @@ PREP(fixFloating); PREP(fixLoweredRifleAnimation); PREP(fixPosition); PREP(getAllDefinedSetVariables); +PREP(getAwakeAnim); +PREP(getCountOfItem); PREP(getDeathAnim); PREP(getDefaultAnim); PREP(getDefinedVariable); @@ -65,6 +68,7 @@ PREP(getFirstObjectIntersection); PREP(getFirstTerrainIntersection); PREP(getGunner); PREP(getInPosition); +PREP(getLocalUnits); PREP(getMapData); PREP(getMapGridData); PREP(getMapGridFromPos); @@ -135,6 +139,7 @@ PREP(positionToASL); PREP(progressBar); PREP(readSettingFromModule); PREP(receiveRequest); +PREP(registerItemReplacement); PREP(removeCanInteractWithCondition); PREP(removeSpecificMagazine); PREP(requestCallback); @@ -156,6 +161,7 @@ PREP(setPitchBankYaw); PREP(setPlayerOwner); PREP(setProne); PREP(setSetting); +PREP(setupLocalUnitsHandler); PREP(setVariableJIP); PREP(setVariablePublic); PREP(setVolume); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 2ced174f306..974e8b8c415 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -19,8 +19,8 @@ //Status Effect EHs: [QGVAR(setStatusEffect), {_this call FUNC(statusEffect_set)}] call CBA_fnc_addEventHandler; -["forceWalk", false, ["ACE_SwitchUnits", "ACE_Attach", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches"]] call FUNC(statusEffect_addType); -["blockSprint", false, []] call FUNC(statusEffect_addType); +["forceWalk", false, ["ace_advanced_fatigue", "ACE_SwitchUnits", "ACE_Attach", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches"]] call FUNC(statusEffect_addType); +["blockSprint", false, ["ace_advanced_fatigue", "ace_medical_fracture"]] call FUNC(statusEffect_addType); ["setCaptive", true, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered)]] call FUNC(statusEffect_addType); ["blockDamage", false, ["fixCollision", "ACE_cargo"]] call FUNC(statusEffect_addType); ["blockEngine", false, ["ACE_Refuel"]] call FUNC(statusEffect_addType); @@ -39,6 +39,11 @@ _object allowSprint (_set == 0); }] call CBA_fnc_addEventHandler; +[QGVAR(setAnimSpeedCoef), { + params ["_object", "_set"]; + _object setAnimSpeedCoef _set; +}] call CBA_fnc_addEventHandler; + [QGVAR(setCaptive), { params ["_object", "_set"]; TRACE_2("setCaptive EH",_object,_set); @@ -83,6 +88,11 @@ _vehicle engineOn false; }] call CBA_fnc_addEventHandler; +[QGVAR(setMass), { + params ["_object", "_mass"]; + _object setMass _mass; +}] call CBA_fnc_addEventHandler; + //Add a fix for BIS's zeus remoteControl module not reseting variables on DC when RC a unit //This variable is used for isPlayer checks if (isServer) then { @@ -111,8 +121,8 @@ if (isServer) then { [QGVAR(fixFloating), FUNC(fixFloating)] call CBA_fnc_addEventHandler; [QGVAR(fixPosition), FUNC(fixPosition)] call CBA_fnc_addEventHandler; -["ace_loadPersonEvent", FUNC(loadPersonLocal)] call CBA_fnc_addEventHandler; -["ace_unloadPersonEvent", FUNC(unloadPersonLocal)] call CBA_fnc_addEventHandler; +["ace_loadPersonEvent", LINKFUNC(loadPersonLocal)] call CBA_fnc_addEventHandler; +["ace_unloadPersonEvent", LINKFUNC(unloadPersonLocal)] call CBA_fnc_addEventHandler; [QGVAR(lockVehicle), { _this setVariable [QGVAR(lockStatus), locked _this]; @@ -135,9 +145,23 @@ if (isServer) then { [QGVAR(playActionNow), {(_this select 0) playActionNow (_this select 1)}] call CBA_fnc_addEventHandler; [QGVAR(switchMove), {(_this select 0) switchMove (_this select 1)}] call CBA_fnc_addEventHandler; [QGVAR(setVectorDirAndUp), {(_this select 0) setVectorDirAndUp (_this select 1)}] call CBA_fnc_addEventHandler; -[QGVAR(setVanillaHitPointDamage), {(_this select 0) setHitPointDamage (_this select 1)}] call CBA_fnc_addEventHandler; [QGVAR(addWeaponItem), {(_this select 0) addWeaponItem [(_this select 1), (_this select 2)]}] call CBA_fnc_addEventHandler; +[QGVAR(setVanillaHitPointDamage), { + params ["_object", "_hitPointAnddamage"]; + private _damageDisabled = !isDamageAllowed _object; + + if (_damageDisabled) then { + _object allowDamage true; + }; + + _object setHitPointDamage _hitPointAnddamage; + + if (_damageDisabled) then { + _object allowDamage false; + }; +}] call CBA_fnc_addEventHandler; + // Request framework [QGVAR(requestCallback), FUNC(requestCallback)] call CBA_fnc_addEventHandler; [QGVAR(receiveRequest), FUNC(receiveRequest)] call CBA_fnc_addEventHandler; @@ -150,6 +174,7 @@ if (isServer) then { [QGVAR(setShotParents), {(_this select 0) setShotParents [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler; ["ace_setOwner", {(_this select 0) setOwner (_this select 1)}] call CBA_fnc_addEventHandler; [QGVAR(serverLog), FUNC(serverLog)] call CBA_fnc_addEventHandler; + [QGVAR(claimSafe), LINKFUNC(claimSafeServer)] call CBA_fnc_addEventHandler; }; @@ -180,7 +205,7 @@ if (isServer) then { // Check files, previous installed version etc. ////////////////////////////////////////////////// -private _currentVersion = getText (configFile >> "CfgPatches" >> QUOTE(ADDON) >> "version"); +private _currentVersion = getText (configFile >> "CfgPatches" >> QUOTE(ADDON) >> "versionStr"); private _previousVersion = profileNamespace getVariable ["ACE_VersionNumberString", ""]; // check previous version number from profile @@ -249,7 +274,7 @@ enableCamShake true; if (alive _oldPlayer) then { [FUNC(setName), [_oldPlayer]] call CBA_fnc_execNextFrame; }; -}] call CBA_fnc_addPlayerEventHandler; +}, true] call CBA_fnc_addPlayerEventHandler; ////////////////////////////////////////////////// @@ -288,7 +313,7 @@ addMissionEventHandler ["PlayerViewChanged", { if (isNull player) exitWith {true}; private _UAV = getConnectedUAV player; if (!alive player) then {_UAV = objNull;}; - private _position = (UAVControl _UAV) param [1, ""]; + private _position = [player] call FUNC(getUavControlPosition); private _seatAI = objNull; private _turret = []; switch (toLower _position) do { @@ -362,6 +387,11 @@ addMissionEventHandler ["PlayerViewChanged", { ["isNotInZeus", {isNull curatorCamera}] call FUNC(addCanInteractWithCondition); +["isNotUnconscious", { + params ["_unit"]; + lifeState _unit != "INCAPACITATED" +}] call FUNC(addCanInteractWithCondition); + ////////////////////////////////////////////////// // Set up reload mutex ////////////////////////////////////////////////// @@ -434,14 +464,14 @@ GVAR(deviceKeyHandlingArray) = []; GVAR(deviceKeyCurrentIndex) = -1; // Register localizations for the Keybinding categories -["ACE3 Equipment", localize LSTRING(ACEKeybindCategoryEquipment)] call CBA_fnc_registerKeybindModPrettyName; -["ACE3 Common", localize LSTRING(ACEKeybindCategoryCommon)] call CBA_fnc_registerKeybindModPrettyName; -["ACE3 Weapons", localize LSTRING(ACEKeybindCategoryWeapons)] call CBA_fnc_registerKeybindModPrettyName; -["ACE3 Movement", localize LSTRING(ACEKeybindCategoryMovement)] call CBA_fnc_registerKeybindModPrettyName; -["ACE3 Scope Adjustment", localize LSTRING(ACEKeybindCategoryScopeAdjustment)] call CBA_fnc_registerKeybindModPrettyName; -["ACE3 Vehicles", localize LSTRING(ACEKeybindCategoryVehicles)] call CBA_fnc_registerKeybindModPrettyName; - -["ACE3 Equipment", QGVAR(openDevice), (localize "STR_ACE_Common_toggleHandheldDevice"), { +["ACE3 Equipment", LLSTRING(ACEKeybindCategoryEquipment)] call CBA_fnc_registerKeybindModPrettyName; +["ACE3 Common", LLSTRING(ACEKeybindCategoryCommon)] call CBA_fnc_registerKeybindModPrettyName; +["ACE3 Weapons", LLSTRING(ACEKeybindCategoryWeapons)] call CBA_fnc_registerKeybindModPrettyName; +["ACE3 Movement", LLSTRING(ACEKeybindCategoryMovement)] call CBA_fnc_registerKeybindModPrettyName; +["ACE3 Scope Adjustment", LLSTRING(ACEKeybindCategoryScopeAdjustment)] call CBA_fnc_registerKeybindModPrettyName; +["ACE3 Vehicles", LLSTRING(ACEKeybindCategoryVehicles)] call CBA_fnc_registerKeybindModPrettyName; + +["ACE3 Equipment", QGVAR(openDevice), LLSTRING(toggleHandheldDevice), { [] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 3); @@ -450,7 +480,7 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [false, false, false]], false] call CBA_fnc_addKeybind; //Home Key -["ACE3 Equipment", QGVAR(closeDevice), (localize "STR_ACE_Common_closeHandheldDevice"), { +["ACE3 Equipment", QGVAR(closeDevice), LLSTRING(closeHandheldDevice), { [] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 4); @@ -459,7 +489,7 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [false, true, false]], false] call CBA_fnc_addKeybind; //CTRL + Home Key -["ACE3 Equipment", QGVAR(cycleDevice), (localize "STR_ACE_Common_cycleHandheldDevices"), { +["ACE3 Equipment", QGVAR(cycleDevice), LLSTRING(cycleHandheldDevices), { [1] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; private _displayName = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 0); diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index c29a0b5df4d..7713ce07ee5 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -27,6 +27,8 @@ GVAR(statusEffect_isGlobal) = []; GVAR(setHearingCapabilityMap) = []; +[] call FUNC(setupLocalUnitsHandler); // Add local units event handlers (ace_common_localUnits) + ////////////////////////////////////////////////// // Set up PlayerChanged eventhandler for pre init (EH is installed in postInit) ////////////////////////////////////////////////// @@ -35,7 +37,24 @@ ACE_player = objNull; uiNamespace setVariable ["ACE_player", objNull]; // Init toHex -[0] call FUNC(toHex); +GVAR(hexArray) = [ +"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F", +"10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F", +"20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F", +"30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F", +"40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F", +"50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F", +"60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F", +"70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F", +"80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F", +"90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F", +"A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF", +"B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF", +"C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF", +"D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF", +"E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF", +"F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF" +]; isHC = !hasInterface && !isDedicated; // deprecated because no tag missionNamespace setVariable ["ACE_isHC", ACE_isHC]; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 44af1ee7ceb..557b45b7329 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -10,7 +10,7 @@ class CfgPatches { author = CSTRING(ACETeam); authors[] = {"KoffeinFlummi"}; url = ECSTRING(main,URL); - VERSION_CONFIG_COMMON; + VERSION_CONFIG; }; }; @@ -67,9 +67,7 @@ class ACE_Rsc_Control_Base { #include "CompassControl.hpp" #include "CfgUIGrids.hpp" -class ACE_Extensions { - extensions[] = {}; -}; +class ACE_Extensions {}; class ACE_Tests { vehicleTransportInventory = QPATHTOF(dev\test_vehicleInventory.sqf); diff --git a/addons/common/functions/fnc_arithmeticGetResult.sqf b/addons/common/functions/fnc_arithmeticGetResult.sqf index 418d510d66e..ea5c2f3897a 100644 --- a/addons/common/functions/fnc_arithmeticGetResult.sqf +++ b/addons/common/functions/fnc_arithmeticGetResult.sqf @@ -1,12 +1,12 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Gets arithmetic result from a set. + * Returns the arithmetic result of performing the given operation on a set. * * Arguments: - * 0: Namespace + * 0: Namespace * 1: Number Set ID - * 2: Operation (sum, product, min, max, avg) + * 2: Operation (max, min, sum, product, avg) (Case Sensitive) * * Return Value: * Value @@ -18,51 +18,44 @@ * Public: Yes */ -params ["_namespace", "_setID", "_op"]; -TRACE_3("params",_namespace,_setID,_op); +params ["_namespace", "_setID", "_operation"]; +TRACE_3("arithmeticGetResult",_namespace,_setID,_operation); -private _data = (_namespace getVariable _setID) param [2, []]; +private _data = (_namespace getVariable _setID) param [2, [{0}]]; -switch (_op) do { - case ("sum"): { - private _result = 0; - { - _result = _result + (call _x); - nil - } count _data; - _result // return +switch (_operation) do { + case "max": { + selectMax (_data apply {call _x}) }; - case ("product"): { - private _result = 1; - { - _result = _result * (call _x); - nil - } count _data; - _result // return + case "min": { + selectMin (_data apply {call _x}) }; - case ("min"): { - private _result = 1e99; + case "sum": { + private _result = 0; + { - _result = _result min (call _x); - nil - } count _data; - _result // return + _result = _result + call _x; + } forEach _data; + + _result }; - case ("max"): { - private _result = -1e99; + case "product": { + private _result = 1; + { - _result = _result max (call _x); - nil - } count _data; - _result // return + _result = _result * call _x; + } forEach _data; + + _result }; - case ("avg"): { + case "avg": { private _result = 0; + { - _result = _result + (call _x); - nil - } count _data; - _result / (count _data); // return + _result = _result + call _x; + } forEach _data; + + _result / count _data }; default {3735928559}; }; diff --git a/addons/common/functions/fnc_arithmeticSetSource.sqf b/addons/common/functions/fnc_arithmeticSetSource.sqf index 0d7503aa90e..ce24c408efe 100644 --- a/addons/common/functions/fnc_arithmeticSetSource.sqf +++ b/addons/common/functions/fnc_arithmeticSetSource.sqf @@ -4,7 +4,7 @@ * Adds or removes a source to an arithmetic set. * * Arguments: - * 0: Namespace + * 0: Namespace * 1: Number Set ID * 2: Source * 3: Code that returns a number (can access var _namespace) [use {} to remove] @@ -20,13 +20,15 @@ */ params ["_namespace", "_setID", "_source", "_variable"]; -TRACE_4("params",_namespace,_setID,_source,_variable); +TRACE_4("arithmeticSetSource",_namespace,_setID,_source,_variable); private _hash = _namespace getVariable _setID; + if (isNil "_hash") then { _hash = [] call CBA_fnc_hashCreate; _namespace setVariable [_setID, _hash]; }; + if (_variable isEqualTo {}) then { TRACE_1("removing",_source); [_hash, _source] call CBA_fnc_hashRem; diff --git a/addons/common/functions/fnc_canDig.sqf b/addons/common/functions/fnc_canDig.sqf index e96b44a478c..a75f32b5d43 100644 --- a/addons/common/functions/fnc_canDig.sqf +++ b/addons/common/functions/fnc_canDig.sqf @@ -31,7 +31,7 @@ private _surfaceDust = getNumber (_config >> "dust"); TRACE_2("Surface",_surfaceType,_surfaceDust); if (isNumber (_config >> "ACE_canDig")) then { - getNumber (_config >> "ACE_canDig") // return + (getNumber (_config >> "ACE_canDig")) == 1 // return } else { !(_surfaceType in DIG_SURFACE_BLACKLIST) && {(_surfaceDust >= 0.1) || {_surfaceType in DIG_SURFACE_WHITELIST}} // return }; diff --git a/addons/common/functions/fnc_cbaSettings.sqf b/addons/common/functions/fnc_cbaSettings.sqf index 4eb84d54daf..273c72323ee 100644 --- a/addons/common/functions/fnc_cbaSettings.sqf +++ b/addons/common/functions/fnc_cbaSettings.sqf @@ -21,6 +21,9 @@ LOG("Adding ACE_Settings to CBA_settings"); GVAR(cbaSettings_forcedSettings) = []; GVAR(cbaSettings_missionSettings) = []; GVAR(settings) = []; // will stay empty - for BWC? +#ifdef DEBUG_MODE_FULL +GVAR(settingsMovedToSQF) = []; +#endif // Add Event Handlers: [QGVAR(setSetting), { @@ -66,6 +69,13 @@ GVAR(settings) = []; // will stay empty - for BWC? false } count GVAR(runAtSettingsInitialized); GVAR(runAtSettingsInitialized) = nil; //cleanup + + #ifdef DEBUG_MODE_FULL + INFO_1("checking settingsMovedToSQF [%1]",count GVAR(settingsMovedToSQF)); + { + if (isNil _x) then { WARNING_1("setting [%1] NOT moved to sqf",_x); }; + } forEach GVAR(settingsMovedToSQF); + #endif }] call CBA_fnc_addEventHandler; private _start = diag_tickTime; @@ -81,6 +91,10 @@ for "_index" from 0 to (_countOptions - 1) do { } else { WARNING_1("Setting [%1] - Already defined from somewhere else??",_varName); }; + #ifdef DEBUG_MODE_FULL + } else { + GVAR(settingsMovedToSQF) pushBack configName _optionEntry; + #endif }; }; diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index 4c64da8f0fd..8c892bcf13b 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -113,7 +113,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x _output pushBack ""; _output pushBack format ["["]; _output pushBack format [" QGVAR(%1), ""%2"",", _gvarName, _cbaSettingType]; - _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; + _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; //IGNORE_STRING_WARNING(str_ace_common_); _output pushBack format [" ""%1"", // %2", ["localize LSTRING()", _category] select _uncat, _category]; _output pushBack format [" %1, // %2", _cbaValueInfo, _cbaValueInfoHint]; _output pushBack format [" %1, // isGlobal", _cbaIsGlobal]; diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 62a344952f5..3b6a02f33fd 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -20,8 +20,6 @@ /////////////// private _version = getText (configFile >> "CfgPatches" >> "ace_main" >> "versionStr"); -INFO_1("ACE is version %1.",_version); - //CBA Versioning check - close main display if using incompatible version private _cbaVersionAr = getArray (configFile >> "CfgPatches" >> "cba_main" >> "versionAr"); private _cbaRequiredAr = getArray (configFile >> "CfgSettings" >> "CBA" >> "Versioning" >> "ACE" >> "dependencies" >> "CBA") select 1; @@ -29,7 +27,7 @@ private _cbaRequiredAr = getArray (configFile >> "CfgSettings" >> "CBA" >> "Vers private _cbaVersionStr = _cbaVersionAr joinString "."; private _cbaRequiredStr = _cbaRequiredAr joinString "."; -INFO_2("CBA is version %1 (min required %2)",_cbaVersionStr,_cbaRequiredStr); +INFO_3("ACE is version %1 - CBA is version %2 (min required %3)",_version,_cbaVersionStr,_cbaRequiredStr); if ([_cbaRequiredAr, _cbaVersionAr] call cba_versioning_fnc_version_compare) then { private _errorMsg = format ["CBA version %1 is outdated (required %2)", _cbaVersionStr, _cbaRequiredStr]; @@ -40,9 +38,7 @@ if ([_cbaRequiredAr, _cbaVersionAr] call cba_versioning_fnc_version_compare) the }; //private _addons = activatedAddons; // broken with High-Command module, see #2134 -private _addons = "true" configClasses (configFile >> "CfgPatches");// -_addons = _addons apply {toLower configName _x};// -_addons = _addons select {_x find "ace_" == 0}; +private _addons = (cba_common_addons select {(_x select [0,4]) == "ace_"}) apply {toLower _x}; private _oldCompats = []; { @@ -69,38 +65,46 @@ if (!(_oldCompats isEqualTo [])) then { }; /////////////// -// check dlls +// check extensions /////////////// -if (toLower (productVersion select 6) in ["linux", "osx"]) then { - INFO_2("Operating system does not support DLL file format"); +private _platform = toLower (productVersion select 6); +if (!isServer && {_platform in ["linux", "osx"]}) then { + // Linux and OSX client ports do not support extensions at all + INFO("Operating system does not support extensions"); } else { { - private _versionEx = _x callExtension "version"; - - if (_versionEx == "") then { - private _extension = ".dll"; - - if (productVersion select 7 == "x64") then { - _extension = "_x64.dll"; - }; - - if (productVersion select 6 == "Linux") then { - _extension = ".so"; - }; + private _extension = configName _x; + private _isWindows = _platform == "windows" && {getNumber (_x >> "windows") == 1}; + private _isLinux = _platform == "linux" && {getNumber (_x >> "linux") == 1}; + private _isClient = hasInterface && {getNumber (_x >> "client") == 1}; + private _isServer = !hasInterface && {getNumber (_x >> "server") == 1}; + + if ((_isWindows || _isLinux) && {_isClient || _isServer}) then { + private _versionEx = _extension callExtension "version"; + if (_versionEx == "") then { + private _extensionFile = _extension; + if (productVersion select 7 == "x64") then { + _extensionFile = format ["%1_x64", _extensionFile]; + }; - private _errorMsg = format ["Extension %1%2 not found.", _x, _extension]; + private _platformExt = [".dll", ".so"] select (_platform == "linux"); + _extensionFile = format ["%1%2", _extensionFile, _platformExt]; - ERROR(_errorMsg); + private _errorMsg = format ["Extension %1 not found.", _extensionFile]; + ERROR(_errorMsg); - if (hasInterface) then { - ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); + if (hasInterface) then { + ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); + }; + } else { + // Print the current extension version + INFO_2("Extension version: %1: %2",_extension,_versionEx); }; - } else { - // Print the current extension version - INFO_2("Extension version: %1: %2",_x,_versionEx); }; - false - } count getArray (configFile >> "ACE_Extensions" >> "extensions"); + } forEach ("true" configClasses (configFile >> "ACE_Extensions")); +}; +if (isArray (configFile >> "ACE_Extensions" >> "extensions")) then { + WARNING("extensions[] array no longer supported"); }; /////////////// diff --git a/addons/common/functions/fnc_claim.sqf b/addons/common/functions/fnc_claim.sqf index 5c291c78da7..3c30b8f28ff 100644 --- a/addons/common/functions/fnc_claim.sqf +++ b/addons/common/functions/fnc_claim.sqf @@ -30,7 +30,7 @@ _target setVariable [QGVAR(owner), _unit, true]; // lock target object if (_lockTarget) then { - private _canBeDisassembled = !([] isEqualTo getArray (_target call CBA_fnc_getObjectConfig >> "assembleInfo" >> "dissasembleTo")); + private _canBeDisassembled = !([] isEqualTo getArray (_target call CBA_fnc_getObjectConfig >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; if (!isNull _unit) then { [QGVAR(lockVehicle), _target, _target] call CBA_fnc_targetEvent; if (_canBeDisassembled) then { diff --git a/addons/common/functions/fnc_claimSafeServer.sqf b/addons/common/functions/fnc_claimSafeServer.sqf new file mode 100644 index 00000000000..f3017f5beda --- /dev/null +++ b/addons/common/functions/fnc_claimSafeServer.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: commy2, PabstMirror + * Unit claims the ownership over an object. This is used to prevent multiple players from draging the same ammo box or using up the same wheel when repairing etc. + * This function only runs on the server and handles the "ace_common_claimSafe" event. It provides a network safe way claiming objects as all claims are run on server. + * Return event is passed [_unit, _target, _success] for new claims, no event on claim release + * + * Arguments: + * 0: Unit that claims another object. ObjNull to remove claim. + * 1: The object that gets claimed. + * 2: Lock the claimed object aswell? (optional: false) + * 3: Target event to trigger for calling machine (called where _unit is local) + * + * Return Value: + * None + * + * Example: + * [bob, flag, true, "claimReturn"] call ace_common_fnc_claimSafeServer + * + * Public: Yes + */ + +params ["_unit", "_target", ["_lockTarget", false], ["_returnEvent", ""]]; + +private _owner = _target getVariable [QGVAR(owner), objNull]; +TRACE_4("claimSafeServer",_unit,_target,_returnEvent,_owner); + +if (!isNull _owner && {!isNull _unit} && {_unit != _owner}) exitWith { + WARNING_1("Claiming already owned object. - %1",_this); + if (_returnEvent == "") exitWith {}; + [_returnEvent, [_unit, _target, false], _unit] call CBA_fnc_targetEvent; +}; + +// transfer this immediately +_target setVariable [QGVAR(owner), _unit, true]; + +// lock target object +if (_lockTarget) then { + private _canBeDisassembled = !([] isEqualTo getArray (_target call CBA_fnc_getObjectConfig >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; + if (!isNull _unit) then { + [QGVAR(lockVehicle), _target, _target] call CBA_fnc_targetEvent; + if (_canBeDisassembled) then { + _target enableWeaponDisassembly false; + }; + } else { + [QGVAR(unlockVehicle), _target, _target] call CBA_fnc_targetEvent; + if (_canBeDisassembled) then { + _target enableWeaponDisassembly true; + }; + }; +}; + +if (!isNull _unit) then { + TRACE_2("claim success",_unit,_target); + if (_returnEvent == "") exitWith {}; + [_returnEvent, [_unit, _target, true], _unit] call CBA_fnc_targetEvent; +}; diff --git a/addons/common/functions/fnc_disableUserInput.sqf b/addons/common/functions/fnc_disableUserInput.sqf index 44468641f3f..379c1d63121 100644 --- a/addons/common/functions/fnc_disableUserInput.sqf +++ b/addons/common/functions/fnc_disableUserInput.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\a3\ui_f_curator\ui\defineresincldesign.inc" /* * Author: commy2 * Disables key input. ESC can still be pressed to open the menu. @@ -15,7 +16,10 @@ * Public: No */ +#define IDD_TEAMSWITCH 632 + params ["_state"]; +TRACE_1("disableUserInput",_state); if (_state) then { disableSerialization; @@ -31,69 +35,71 @@ if (_state) then { openMap false; }; - closeDialog 0; - createDialog QGVAR(DisableMouse_Dialog); + if (isNull findDisplay IDD_INTERRUPT && {isNull findDisplay IDD_RSCDISPLAYCURATOR} && {isNull findDisplay IDD_TEAMSWITCH}) then { + closeDialog 0; + createDialog QGVAR(DisableMouse_Dialog); - private _dlg = uiNamespace getVariable QGVAR(dlgDisableMouse); + private _display = uiNamespace getVariable QGVAR(dlgDisableMouse); - _dlg displayAddEventHandler ["KeyDown", { - params ["", "_key"]; + _display displayAddEventHandler ["KeyDown", { + params ["", "_key"]; - if (_key == 1 && {alive player}) then { - createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); + if (_key == 1 && {alive player}) then { + createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); - disableSerialization; + disableSerialization; - private _dlg = findDisplay 49; + private _dlg = findDisplay 49; - for "_index" from 100 to 2000 do { - (_dlg displayCtrl _index) ctrlEnable false; - }; + for "_index" from 100 to 2000 do { + (_dlg displayCtrl _index) ctrlEnable false; + }; - private _ctrl = _dlg displayctrl 103; - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)]; - _ctrl ctrlEnable true; - _ctrl ctrlSetText "ABORT"; - _ctrl ctrlSetTooltip "Abort."; - - _ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer); - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; - _ctrl ctrlEnable (call {private _config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}}); - _ctrl ctrlSetText "RESPAWN"; - _ctrl ctrlSetTooltip "Respawn."; - }; + private _ctrl = _dlg displayctrl 103; + _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)]; + _ctrl ctrlEnable true; + _ctrl ctrlSetText "ABORT"; + _ctrl ctrlSetTooltip "Abort."; - if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then { - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + _ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer); + _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; + _ctrl ctrlEnable (call {private _config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}}); + _ctrl ctrlSetText "RESPAWN"; + _ctrl ctrlSetTooltip "Respawn."; + }; - private _acc = accTime; - teamSwitch; - setAccTime _acc; - }; + if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then { + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; - if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then { - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; - openCuratorInterface; - }; + private _acc = accTime; + teamSwitch; + setAccTime _acc; + }; - if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then { - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; - openMap true; - }; + if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then { + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + openCuratorInterface; + }; - if (isServer || {serverCommandAvailable "#kick"} || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { - if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then { - _key = 0; + if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then { + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + openMap true; }; - }; - _key > 0 - }]; + if (isServer || {serverCommandAvailable "#kick"}) then { + if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then { + _key = 0; + }; + }; + + _key > 0 + }]; - _dlg displayAddEventHandler ["KeyUp", {true}]; + _display displayAddEventHandler ["KeyUp", {true}]; + }; GVAR(disableInputPFH) = [{ - if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then { + if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && {isNull findDisplay IDD_INTERRUPT} && {isNull findDisplay IDD_RSCDISPLAYCURATOR} && {isNull findDisplay IDD_TEAMSWITCH}}) then { [GVAR(disableInputPFH)] call CBA_fnc_removePerFrameHandler; GVAR(disableInputPFH) = nil; [true] call FUNC(disableUserInput); diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf index 11e9f5d6e76..96572bffc1d 100644 --- a/addons/common/functions/fnc_displayIcon.sqf +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -15,7 +15,7 @@ * None * * Example: - * ["myID", true, QPATHTOF(data\icon_group.paa), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; + * ["myID", true, QPATHTOF(data\icon_group.paa), [1,1,1,1], 0] call ace_common_fnc_displayIcon; * * Public: Yes */ diff --git a/addons/common/functions/fnc_doAnimation.sqf b/addons/common/functions/fnc_doAnimation.sqf index 678f4d4ef7d..667ab792c11 100644 --- a/addons/common/functions/fnc_doAnimation.sqf +++ b/addons/common/functions/fnc_doAnimation.sqf @@ -10,7 +10,6 @@ * 0 = PlayMove * 1 = PlayMoveNow * 2 = SwitchMove (no transitional animation, doesn't overwrite priority 1) - * 3: Force overwritting unconscious (default: false) * * Return Value: * None @@ -21,14 +20,8 @@ * Public: Yes */ -params ["_unit", "_animation", ["_priority", 0], ["_force", false]]; -TRACE_4("params",_unit,_animation,_priority,_force); - -// don't overwrite more important animations -if (_unit getVariable ["ACE_isUnconscious", false] && {(_animation != "Unconscious")} && {!_force}) exitWith {}; - -// don't go unconscious if the unit isn't unconscious -if (_animation == "Unconscious" && {!((_unit getVariable ["ACE_isUnconscious", false]) || (_unit getVariable ["ACE_isDead", false]))}) exitWith {}; +params ["_unit", "_animation", ["_priority", 0]]; +TRACE_3("params",_unit,_animation,_priority); // switchMove "" no longer works in dev 1.37 if (_animation == "") then { @@ -43,7 +36,7 @@ switch (_priority) do { if (_unit == vehicle _unit) then { [QGVAR(playMove), [_unit, _animation], _unit] call CBA_fnc_targetEvent; } else { - // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles. + // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles. [QGVAR(playMove), [_unit, _animation]] call CBA_fnc_globalEvent; }; }; @@ -51,7 +44,7 @@ switch (_priority) do { if (_unit == vehicle _unit) then { [QGVAR(playMoveNow), [_unit, _animation], _unit] call CBA_fnc_targetEvent; } else { - // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles. + // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles. [QGVAR(playMoveNow), [_unit, _animation]] call CBA_fnc_globalEvent; }; }; @@ -60,7 +53,7 @@ switch (_priority) do { if (_unit == vehicle _unit) then { [QGVAR(playMoveNow), [_unit, _animation], _unit] call CBA_fnc_targetEvent; } else { - // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles. + // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles. [QGVAR(playMoveNow), [_unit, _animation]] call CBA_fnc_globalEvent; }; diff --git a/addons/common/functions/fnc_getAwakeAnim.sqf b/addons/common/functions/fnc_getAwakeAnim.sqf new file mode 100644 index 00000000000..7da28377599 --- /dev/null +++ b/addons/common/functions/fnc_getAwakeAnim.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Report awake animation of unit inside vehicle. + * + * Arguments: + * 0: The unit + * + * ReturnValue: + * The animtaion + * + * Example: + * player call ace_common_fnc_getAwakeAnim + * + * Public: no + */ + +params ["_unit"]; + +private _vehicle = vehicle _unit; + +// --- on foot +if (_vehicle isEqualTo _unit) exitWith {""}; + +// --- driver +private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; + +if (_unit == driver _vehicle) exitWith { + getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_config >> "driverAction")) // return +}; + +// --- turret +private _turret = _unit call CBA_fnc_turretPath; + +if !(_turret isEqualTo []) exitWith { + private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret; + + getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_turretConfig >> "gunnerAction")) // return +}; + +// --- cargo +private _cargoIndex = _vehicle getCargoIndex _unit; + +if (_cargoIndex != -1) exitWith { + getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getArray (_config >> "cargoAction") select _cargoIndex) // return +}; + +// --- default +"" diff --git a/addons/common/functions/fnc_getCountOfItem.sqf b/addons/common/functions/fnc_getCountOfItem.sqf new file mode 100644 index 00000000000..a6cf3b92335 --- /dev/null +++ b/addons/common/functions/fnc_getCountOfItem.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Dedmen + * Return how many items of type _itemType the player has in his containers (Uniform, Vest, Backpack) + * Doesn't count assignedItems, weapons, weapon attachments, magazines in weapons + * + * Arguments: + * 0: Unit + * 1: Classname of item (Case-Sensitive) + * + * Return Value: + * Item Count + * + * Example: + * [bob, "FirstAidKit"] call ace_common_fnc_getCountOfItem + * + * Public: Yes + */ + +params ["_unit", "_itemType"]; + +private _countItemsInContainer = { + (getItemCargo _this) params ["_itemTypes", "_itemCounts"]; + + private _index = _itemTypes find _itemType; + _itemCounts param [_index, 0] +}; + +((uniformContainer _unit) call _countItemsInContainer) + +((vestContainer _unit) call _countItemsInContainer) + +((backpackContainer _unit) call _countItemsInContainer) diff --git a/addons/common/functions/fnc_getFirstObjectIntersection.sqf b/addons/common/functions/fnc_getFirstObjectIntersection.sqf index 1120707b2b3..0cebf6232f2 100644 --- a/addons/common/functions/fnc_getFirstObjectIntersection.sqf +++ b/addons/common/functions/fnc_getFirstObjectIntersection.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ruthberg - * Returns the the first intersection with terrain between two positions. @todo rewrite using lineIntersectsSurfaces? + * Returns the the first intersection with terrain between two positions. * * Arguments: * 0: PositionASL @@ -18,31 +18,14 @@ * Public: Yes */ -params ["_source", "_destination", "_accuracy"]; +params ["_source", "_destination"]; private _result = [false, [0, 0, 0]]; - -private _distance = _source vectorDistance _destination; - -if !(lineIntersectsWith [_source, _destination] isEqualTo []) then { - private _lower = 0; - private _upper = 1; - private _mid = 0.5; - - private _dir = _source vectorFromTo _destination; - - while {(_upper - _lower) * _distance > _accuracy} do { - _mid = _lower + (_upper - _lower) / 2; - - if !(lineIntersectsWith [_source, _source vectorAdd (_dir vectorMultiply (_mid * _distance))] isEqualTo []) then { - _upper = _mid; - } else { - _lower = _mid; - }; +private _hits = lineIntersectsSurfaces [_source, _destination, objNull, objNull, true, -1]; +{ + _x params ["_pos", "", "_obj"]; + if (!isNull _obj) exitWith { + _result = [true, _pos]; }; - - _mid = _lower + (_upper - _lower) / 2; - _result = [true, _source vectorAdd (_dir vectorMultiply (_mid * _distance))]; -}; - +} forEach _hits; _result diff --git a/addons/common/functions/fnc_getLocalUnits.sqf b/addons/common/functions/fnc_getLocalUnits.sqf new file mode 100644 index 00000000000..17163d0e775 --- /dev/null +++ b/addons/common/functions/fnc_getLocalUnits.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: dedmen + * Gets localUnits array filtering out nullObjects. + * If you can handle null objects you can use the array `ace_common_localUnits` directly. + * Should be equivalent to `allUnits select {local _x}` + * + * Arguments: + * Nothing + * + * Return Value: + * Array of local Units + * + * Example: + * [] call ace_common_fnc_getLocalUnits + * + * Public: Yes + */ + +// Remove null objects +GVAR(localUnits) = GVAR(localUnits) - [objNull]; + +GVAR(localUnits) diff --git a/addons/common/functions/fnc_getMapGridData.sqf b/addons/common/functions/fnc_getMapGridData.sqf index c329c0b3f94..f5e91e427e2 100644 --- a/addons/common/functions/fnc_getMapGridData.sqf +++ b/addons/common/functions/fnc_getMapGridData.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [] call ace_map_fnc_getMapGridData + * [] call ace_common_fnc_getMapGridData * * Public: No */ diff --git a/addons/common/functions/fnc_getMarkerType.sqf b/addons/common/functions/fnc_getMarkerType.sqf index ed551e4c1b6..1541074a07d 100644 --- a/addons/common/functions/fnc_getMarkerType.sqf +++ b/addons/common/functions/fnc_getMarkerType.sqf @@ -10,7 +10,7 @@ * Marker Type * * Example: - * ["GROUP"] call ace_common_fnc_getmarkerType + * ["GROUP"] call ace_common_fnc_getMarkerType * * Public: No */ diff --git a/addons/common/functions/fnc_getVersion.sqf b/addons/common/functions/fnc_getVersion.sqf index 8f9e39e3604..ccf49667156 100644 --- a/addons/common/functions/fnc_getVersion.sqf +++ b/addons/common/functions/fnc_getVersion.sqf @@ -15,4 +15,4 @@ * Public: Yes */ -getText (configFile >> "CfgPatches" >> "ACE_main" >> "version") // return +getText (configFile >> "CfgPatches" >> "ACE_main" >> "versionStr") // return diff --git a/addons/common/functions/fnc_isAwake.sqf b/addons/common/functions/fnc_isAwake.sqf index 916f5456854..5a59a3cb69d 100644 --- a/addons/common/functions/fnc_isAwake.sqf +++ b/addons/common/functions/fnc_isAwake.sqf @@ -17,4 +17,4 @@ params ["_unit"]; -!(_unit getVariable ["ACE_isUnconscious", false]) && alive _unit && !(_unit getVariable ["ACE_isDead", false]) // return +alive _unit && {!(_unit getVariable ["ACE_isUnconscious", false])} diff --git a/addons/common/functions/fnc_isEOD.sqf b/addons/common/functions/fnc_isEOD.sqf index 226d315e36f..303b258cb59 100644 --- a/addons/common/functions/fnc_isEOD.sqf +++ b/addons/common/functions/fnc_isEOD.sqf @@ -13,11 +13,11 @@ * is the unit an EOD * * Example: - * isSpecialist = [player] call FUNC(isEOD); + * [player] call ace_common_fnc_isEOD * * Public: Yes */ params ["_unit"]; -_unit getVariable ["ACE_isEOD", _unit getUnitTrait "explosiveSpecialist"] // return +(_unit getVariable ["ACE_isEOD", _unit getUnitTrait "explosiveSpecialist"]) in [1, true] diff --git a/addons/common/functions/fnc_loadPerson.sqf b/addons/common/functions/fnc_loadPerson.sqf index 466387cc72a..a2d810444d2 100644 --- a/addons/common/functions/fnc_loadPerson.sqf +++ b/addons/common/functions/fnc_loadPerson.sqf @@ -20,8 +20,9 @@ #define GROUP_SWITCH_ID QFUNC(loadPerson) params ["_caller", "_unit", ["_vehicle", objNull]]; +TRACE_3("loadPerson",_caller,_unit,_vehicle); -if (!([_caller, _unit, ["isNotDragging", "isNotCarrying", "isNotSwimming"]] call FUNC(canInteractWith)) || {_caller == _unit}) exitWith {_vehicle}; +if (!([_caller, _unit, ["isNotDragging", "isNotCarrying", "isNotSwimming"]] call FUNC(canInteractWith)) || {_caller == _unit}) exitWith { objNull }; // Try to use nearest vehicle if a vehicle hasn't been supplied if (isNull _vehicle) then { @@ -30,6 +31,7 @@ if (isNull _vehicle) then { if (!isNull _vehicle) then { [_unit, true, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide); + TRACE_3("sending ace_loadPersonEvent",_unit,_vehicle,_caller); ["ace_loadPersonEvent", [_unit, _vehicle, _caller], _unit] call CBA_fnc_targetEvent; }; diff --git a/addons/common/functions/fnc_loadPersonLocal.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf index 109e7e8e77d..0426a945829 100644 --- a/addons/common/functions/fnc_loadPersonLocal.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -17,15 +17,11 @@ * Public: Yes */ -params ["_unit", "_vehicle", "_caller"]; - -// if (!alive _unit) then { -// _unit = [_unit, _caller] call makeCopyOfBody; //func does not exist -// }; +params ["_unit", "_vehicle", ["_caller", objNull]]; +TRACE_3("loadPersonLocal",_unit,_vehicle,_caller); private _slotsOpen = false; - -if (_vehicle emptyPositions "cargo" > 0) then { +if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false])} || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "ejectDeadCargo")) == 0}) then { _unit moveInCargo _vehicle; _slotsOpen = true; } else { @@ -35,29 +31,16 @@ if (_vehicle emptyPositions "cargo" > 0) then { }; }; -if (_slotsOpen) then { - private _loaded = _vehicle getVariable [QGVAR(loaded_persons),[]]; - _loaded pushBack _unit; - - _vehicle setVariable [QGVAR(loaded_persons), _loaded, true]; - - if !([_unit] call FUNC(isAwake)) then { - [{ - (_this select 0) params ["_unit", "_vehicle"]; - - // wait until the unit is in the vehicle - if (vehicle _unit != _vehicle) exitWith { - // kill this pfh if either one is deleted - if (isNull _unit || isNull _vehicle) then { - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - }; - - _unit setVariable [QEGVAR(medical,vehicleAwakeAnim), [_vehicle, animationState _unit]]; - - [_unit, [_unit] call FUNC(getDeathAnim), 1, true] call FUNC(doAnimation); - - [_this select 1] call CBA_fnc_removePerFrameHandler; - }, 0.5, [_unit, _vehicle]] call CBA_fnc_addPerFrameHandler; - }; -}; +if (!_slotsOpen) exitWith { WARNING_2("no open seats %1->%2",_unit,_vehicle); }; + +[{ // just for error reporting + params ["_unit", "_vehicle"]; + (alive _unit) && {alive _vehicle} && {(vehicle _unit) == _vehicle} +}, { + params ["_unit", "_vehicle"]; + TRACE_2("success",_unit,_vehicle); +}, [_unit, _vehicle], 2, { + params ["_unit", "_vehicle"]; + if (!alive _unit) exitWith {}; + WARNING_2("timeout %1->%2",_unit,_vehicle); +}] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf index 30b0594b30b..aba75ff60f8 100644 --- a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf +++ b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf @@ -19,4 +19,8 @@ params ["_unit", ["_distance", 10]]; private _nearVehicles = nearestObjects [_unit, ["Car", "Air", "Tank", "Ship_F", "Pod_Heli_Transport_04_crewed_base_F"], _distance]; -_nearVehicles select {(_x emptyPositions "cargo" > 0) || {_x emptyPositions "gunner" > 0}} +_nearVehicles select { + // Filter cargo seats that will eject unconscious units (e.g. quad bike) + ((_x emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false])} || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "ejectDeadCargo")) == 0}) + || {_x emptyPositions "gunner" > 0} +} diff --git a/addons/common/functions/fnc_parseList.sqf b/addons/common/functions/fnc_parseList.sqf index d3e2871f447..7f5bb592948 100644 --- a/addons/common/functions/fnc_parseList.sqf +++ b/addons/common/functions/fnc_parseList.sqf @@ -43,7 +43,7 @@ if (_checkNil) then { private _nilCheckedList = []; { - if !(isNil _x) then { + if (!isNil _x) then { _nilCheckedList pushBack (missionNamespace getVariable _x); }; false diff --git a/addons/common/functions/fnc_player.sqf b/addons/common/functions/fnc_player.sqf index d691741e53c..382db0bced8 100644 --- a/addons/common/functions/fnc_player.sqf +++ b/addons/common/functions/fnc_player.sqf @@ -5,7 +5,7 @@ * Use this in INIT and RESPAWN eh scripts, because ACE_player isn't reset yet. * * Arguments: - * NONE. + * None * * Return Value: * Player controlled unit diff --git a/addons/common/functions/fnc_readSettingsFromParamsArray.sqf b/addons/common/functions/fnc_readSettingsFromParamsArray.sqf index 277ba23a5dc..e205fb15bfa 100644 --- a/addons/common/functions/fnc_readSettingsFromParamsArray.sqf +++ b/addons/common/functions/fnc_readSettingsFromParamsArray.sqf @@ -1,4 +1,3 @@ -#define DEBUG_MODE_FULL #include "script_component.hpp" /* * Author: PabstMirror diff --git a/addons/common/functions/fnc_receiveRequest.sqf b/addons/common/functions/fnc_receiveRequest.sqf index e2f25ed7348..30adf7af584 100644 --- a/addons/common/functions/fnc_receiveRequest.sqf +++ b/addons/common/functions/fnc_receiveRequest.sqf @@ -14,7 +14,7 @@ * None * * Example: - * [bob, kevin, "ID", "Message", {Callback}] call ace_common_fnc_recieveRequest + * [bob, kevin, "ID", "Message", {Callback}] call ace_common_fnc_receiveRequest * * Public: No */ @@ -33,7 +33,7 @@ if (isLocalized _requestMessage) then { hint format ["%1", _requestMessage]; // @todo ? -if !(isNil QGVAR(RECIEVE_REQUEST_TIME_OUT_SCRIPT)) then { +if (!isNil QGVAR(RECIEVE_REQUEST_TIME_OUT_SCRIPT)) then { terminate GVAR(RECIEVE_REQUEST_TIME_OUT_SCRIPT); }; diff --git a/addons/common/functions/fnc_registerItemReplacement.sqf b/addons/common/functions/fnc_registerItemReplacement.sqf new file mode 100644 index 00000000000..d70a7181930 --- /dev/null +++ b/addons/common/functions/fnc_registerItemReplacement.sqf @@ -0,0 +1,112 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Registers an event handler that replaces an item or item type with one or + * more other items. + * + * Arguments: + * 0: Item or item type ID to replace + * 1: Item or list of items + * 2: Replace items that inherit from original item (only if 0 is STRING) (Optional) + * + * Return Value: + * None + * + * Example: + * ["FirstAidKit", "ACE_fieldDressing"] call ace_common_fnc_registerItemReplacement + * + * Public: Yes + */ +params [["_oldItem", "", [0,""]], ["_newItems", "", ["", []]], ["_replaceInherited", false, [false]]]; +TRACE_3("registerItemReplacement",_oldItem,_newItems,_replaceInherited); + +// CBA player event handler function +private _fnc_replaceItems = { + params ["_unit"]; + + private _items = items _unit; + if (_items isEqualTo GVAR(oldItems)) exitWith {}; + + private _newItems = _items - GVAR(oldItems); + if (_newItems isEqualTo []) exitWith { + GVAR(oldItems) = _items; + }; + + _newItems sort true; // Sort so all items of current class can be replaced at once + private _cfgWeapons = configFile >> "CfgWeapons"; // Microoptimization + + for "_i" from 0 to count _newItems - 1 do { + private _item = _newItems#_i; + + // Determine replacement items: direct replacements, ... + private _replacements = GVAR(itemReplacements) getVariable [_item, []]; + + // ... item type replacements ... + private _type = getNumber (_cfgWeapons >> _item >> "ItemInfo" >> "type"); + private _typeReplacements = GVAR(itemReplacements) getVariable ["$" + str _type, []]; + _replacements append _typeReplacements; + + // ... and inherited replacements + { + if (_item isKindOf [_x, _cfgWeapons]) then { + private _inheritedReplacements = GVAR(itemReplacements) getVariable [_x, []]; + _replacements append _inheritedReplacements; + }; + } forEach GVAR(inheritedReplacements); + + // Skip lookup for all following items of this class + private _count = 1; + while {_newItems#(_i + 1) == _item} do { // (i+1) can be out of bounds, but should fail safely + _count = _count + 1; + _i = _i + 1; + }; + + // Replace all items of current class in list + if !(_replacements isEqualTo []) then { + TRACE_3("replace",_item,_count,_replacements); + _unit removeItems _item; + + for "_j" from 1 to _count do { + { [_unit, _x] call FUNC(addToInventory) } forEach _replacements; + }; + }; + }; + + GVAR(oldItems) = items _unit; +}; + +// Setup on first run +if (isNil QGVAR(itemReplacements)) then { + GVAR(itemReplacements) = [] call CBA_fnc_createNamespace; + GVAR(inheritedReplacements) = []; + GVAR(oldItems) = []; + ["loadout", _fnc_replaceItems] call CBA_fnc_addPlayerEventHandler; +}; + +// Save item replacement +// $ prefix is used for types (numbers) and replacements with inheritance +if (_replaceInherited) then { + _oldItem = "$" + _oldItem; + GVAR(inheritedReplacements) pushBack _oldItem; +}; +if (_oldItem isEqualType 0) then { + _oldItem = "$" + str _oldItem; +}; +if (_newItems isEqualType "") then { + _newItems = [_newItems]; +}; + +private _oldReplacements = GVAR(itemReplacements) getVariable [_oldItem, []]; +_oldReplacements append _newItems; +GVAR(itemReplacements) setVariable [_oldItem, _newItems]; + +// Force item scan when new replacement was registered in PostInit +if (!isNull ACE_player) then { + GVAR(oldItems) = []; + + // Exec next frame to ensure full scan only runs once per frame + // For example, if item replacements are registred in PostInit (due to CBA + // settings) by different addons, the inventory is only scanned once in the + // next frame, not once per addon. + [_fnc_replaceItems, [ACE_player]] call CBA_fnc_execNextFrame; +}; diff --git a/addons/common/functions/fnc_resetAllDefaults.sqf b/addons/common/functions/fnc_resetAllDefaults.sqf index dc638e49478..be2b5a6cc8a 100644 --- a/addons/common/functions/fnc_resetAllDefaults.sqf +++ b/addons/common/functions/fnc_resetAllDefaults.sqf @@ -23,7 +23,7 @@ _unit setVariable ["ACE_isUnconscious", nil, true]; if (isPlayer _unit) then { [true] call FUNC(setVolume); - if !(isNil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { + if (!isNil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { // clear all disable user input { [_x, false] call FUNC(setDisableUserInputStatus); diff --git a/addons/common/functions/fnc_setDisableUserInputStatus.sqf b/addons/common/functions/fnc_setDisableUserInputStatus.sqf index 3fdc185325f..843837caba9 100644 --- a/addons/common/functions/fnc_setDisableUserInputStatus.sqf +++ b/addons/common/functions/fnc_setDisableUserInputStatus.sqf @@ -16,7 +16,8 @@ * Public: Yes */ -params ["_id", "_disable"]; +params [["_id", "#", [""]], ["_disable", false, [false]]]; +TRACE_2("setDisableUserInputStatus",_id,_disable); if (isNil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { GVAR(DISABLE_USER_INPUT_COLLECTION) = []; diff --git a/addons/common/functions/fnc_setVolume.sqf b/addons/common/functions/fnc_setVolume.sqf index 0ab00e26bec..01de0b2802c 100644 --- a/addons/common/functions/fnc_setVolume.sqf +++ b/addons/common/functions/fnc_setVolume.sqf @@ -17,36 +17,38 @@ * Note: Uses player */ -#define MUTED_LEVEL 0.2 +#define MUTED_LEVEL 0.2 #define NORMAL_LEVEL 1 -#define NO_SOUND 0 +#define NO_SOUND 0 -params [["_setVolume", false]]; +params [ + ["_setVolume", false], + ["_unit", player] +]; if (_setVolume) then { // Vanilla Game 2 fadeSound NORMAL_LEVEL; // TFAR - player setVariable ["tf_voiceVolume", NORMAL_LEVEL, true]; - player setVariable ["tf_globalVolume", NORMAL_LEVEL]; - player setVariable ["tf_unable_to_use_radio", false]; + _unit setVariable ["tf_voiceVolume", NORMAL_LEVEL, true]; + _unit setVariable ["tf_globalVolume", NORMAL_LEVEL]; + _unit setVariable ["tf_unable_to_use_radio", false]; // ACRE2 if (!isNil "acre_api_fnc_setGlobalVolume") then { [NORMAL_LEVEL^0.33] call acre_api_fnc_setGlobalVolume; }; - player setVariable ["acre_sys_core_isDisabled", false, true]; + _unit setVariable ["acre_sys_core_isDisabled", false, true]; } else { // Vanilla Game 2 fadeSound MUTED_LEVEL; // TFAR - player setVariable ["tf_voiceVolume", NO_SOUND, true]; - player setVariable ["tf_globalVolume", MUTED_LEVEL]; - player setVariable ["tf_unable_to_use_radio", true]; + _unit setVariable ["tf_voiceVolume", NO_SOUND, true]; + _unit setVariable ["tf_globalVolume", MUTED_LEVEL]; + _unit setVariable ["tf_unable_to_use_radio", true]; // ACRE2 if (!isNil "acre_api_fnc_setGlobalVolume") then { [MUTED_LEVEL^0.33] call acre_api_fnc_setGlobalVolume; }; - player setVariable ["acre_sys_core_isDisabled", true, true]; - + _unit setVariable ["acre_sys_core_isDisabled", true, true]; }; diff --git a/addons/common/functions/fnc_setupLocalUnitsHandler.sqf b/addons/common/functions/fnc_setupLocalUnitsHandler.sqf new file mode 100644 index 00000000000..75f696e324e --- /dev/null +++ b/addons/common/functions/fnc_setupLocalUnitsHandler.sqf @@ -0,0 +1,78 @@ +#include "script_component.hpp" +/* + * Author: dedmen + * Adds the local unit event handlers. + * Access with function `ace_common_fnc_getLocalUnits` or array `ace_common_localUnits` + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_common_fnc_setupLocalUnitsHandler + * + * Public: No + */ +// Ignore UAV/Drone AI +#define IGNORE_BASE_UAVPILOTS "B_UAV_AI", "O_UAV_AI", "UAV_AI_base_F" + +GVAR(localUnits) = []; + +// Eventhandlers to maintain array of localUnits +["CAManBase", "init", { + params ["_unit"]; + TRACE_2("unit init",_unit,local _unit); + + if (local _unit) then { + if (!alive _unit) exitWith {}; + GVAR(localUnits) pushBack _unit; + }; +}, true, [IGNORE_BASE_UAVPILOTS]] call CBA_fnc_addClassEventHandler; + +["CAManBase", "respawn", { + params ["_unit"]; + TRACE_2("unit respawn",_unit,local _unit); + + if (local _unit) then { + if (!alive _unit) exitWith {}; + GVAR(localUnits) pushBack _unit; + }; +}, true, [IGNORE_BASE_UAVPILOTS]] call CBA_fnc_addClassEventHandler; + +["CAManBase", "local", { + params ["_unit", "_local"]; + TRACE_2("unit local",_unit,_local); + + if (_local) then { + if (!alive _unit) exitWith {}; + GVAR(localUnits) pushBack _unit; + } else { + GVAR(localUnits) deleteAt (GVAR(localUnits) find _unit); + }; +}, true, [IGNORE_BASE_UAVPILOTS]] call CBA_fnc_addClassEventHandler; + +["CAManBase", "deleted", { + params ["_unit"]; + TRACE_2("unit deleted",_unit,local _unit); + + if (local _unit) then { + [{ + params ["_unit"]; + TRACE_3("unit deleted nextFrame",_unit,local _unit,isNull _unit); + if (isNull _unit) then { // If it is not null then the deleted EH was Fake. + GVAR(localUnits) = GVAR(localUnits) - [objNull]; + }; + }, [_unit]] call CBA_fnc_execNextFrame; + }; +}, true, [IGNORE_BASE_UAVPILOTS]] call CBA_fnc_addClassEventHandler; + +["CAManBase", "killed", { + params ["_unit"]; + TRACE_2("unit killed",_unit,local _unit); + + if (local _unit) then { + GVAR(localUnits) deleteAt (GVAR(localUnits) find _unit); + }; +}, true, [IGNORE_BASE_UAVPILOTS]] call CBA_fnc_addClassEventHandler; diff --git a/addons/common/functions/fnc_toHex.sqf b/addons/common/functions/fnc_toHex.sqf index f9c82be373e..697fbb9b6d0 100644 --- a/addons/common/functions/fnc_toHex.sqf +++ b/addons/common/functions/fnc_toHex.sqf @@ -19,36 +19,4 @@ params ["_number"]; _number = ((round abs _number) max 0) min 255; -if (isNil QGVAR(hexArray)) then { - GVAR(hexArray) = []; - - private _minLength = 2; - - for [{_i = 0;}, {_i < 256}, {_i = _i + 1}] do { - private _num = _i; - private _hex = ["", "0"] select (_i == 0); - - while {_num > 0} do { - private _rest = _num mod 16; - _rest = switch _rest do { - case 10 : {"A"}; - case 11 : {"B"}; - case 12 : {"C"}; - case 13 : {"D"}; - case 14 : {"E"}; - case 15 : {"F"}; - default {str _rest}; - }; - _num = floor (_num / 16); - _hex = _rest + _hex; - }; - - while {count toArray _hex < _minLength} do { - _hex = "0" + _hex; - }; - - GVAR(hexArray) pushBack _hex; - }; -}; - GVAR(hexArray) select _number // return diff --git a/addons/common/functions/fnc_uniqueItems.sqf b/addons/common/functions/fnc_uniqueItems.sqf index 48f91831b90..5d7e5e86334 100644 --- a/addons/common/functions/fnc_uniqueItems.sqf +++ b/addons/common/functions/fnc_uniqueItems.sqf @@ -11,7 +11,7 @@ * Items * * Example: - * [_player] call ace_common_fnc_uniqueItems + * [player] call ace_common_fnc_uniqueItems * * Public: No */ @@ -28,12 +28,10 @@ private _fnc_getItems = { // Use cached items list if unit is ACE_player if (_unit isEqualTo ACE_player) then { - private _items = GVAR(uniqueItemsCache); - if (isNil "_items") then { - _items = call _fnc_getItems; - GVAR(uniqueItemsCache) = _items; + if (isNil QGVAR(uniqueItemsCache)) then { + GVAR(uniqueItemsCache) = call _fnc_getItems; }; - +_items + +GVAR(uniqueItemsCache) } else { call _fnc_getItems; }; diff --git a/addons/common/functions/fnc_unloadPerson.sqf b/addons/common/functions/fnc_unloadPerson.sqf index b744cbc2722..5f435a1455c 100644 --- a/addons/common/functions/fnc_unloadPerson.sqf +++ b/addons/common/functions/fnc_unloadPerson.sqf @@ -15,18 +15,16 @@ * Public: No */ -#define GROUP_SWITCH_ID QFUNC(loadPerson) - params ["_unit"]; +TRACE_1("unloadPerson",_unit); private _vehicle = vehicle _unit; +if (isNull _vehicle) exitWith {false}; if (_vehicle == _unit) exitWith {false}; if (speed _vehicle > 1 || {((getPos _vehicle) select 2) > 2}) exitWith {false}; -if (!isNull _vehicle) then { - ["ace_unloadPersonEvent", [_unit, _vehicle], [_unit]] call CBA_fnc_targetEvent; -}; +["ace_unloadPersonEvent", [_unit, _vehicle], [_unit]] call CBA_fnc_targetEvent; true diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index 74b8b8c39ef..d51f911eaf0 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -12,7 +12,7 @@ * Succesfully unloaded person * * Example: - * [bob, car, bob] call ace_common_fnc_unloadpersonLocal + * [bob, car, bob] call ace_common_fnc_unloadPersonLocal * * Public: No */ @@ -20,11 +20,19 @@ #define GROUP_SWITCH_ID QFUNC(loadPerson) params ["_unit", "_vehicle", ["_unloader", objNull]]; -TRACE_3("params",_unit,_vehicle,_unloader); +TRACE_3("unloadpersonLocal",_unit,_vehicle,_unloader); //This covers testing vehicle stability and finding a safe position private _emptyPos = [_vehicle, (typeOf _unit), _unloader] call EFUNC(common,findUnloadPosition); TRACE_1("findUnloadPosition",_emptyPos); +if (_emptyPos isEqualTo []) then { + _emptyPos = [_vehicle, (typeOf _unit), _unloader] call EFUNC(common,findUnloadPosition); + TRACE_1("findUnloadPosition 2nd attempt",_emptyPos); + if (_emptyPos isEqualTo []) then { + _emptyPos = [_vehicle, (typeOf _unit), _unloader] call EFUNC(common,findUnloadPosition); + TRACE_1("findUnloadPosition 3rd attempt",_emptyPos); + }; +}; if (count _emptyPos != 3) exitwith { WARNING_4("Could not find unload pos %1-ASL: %2 isTouchingGround: %3 Speed: %4",_vehicle, getPosASL _vehicle, isTouchingGround _vehicle, speed _vehicle); @@ -39,37 +47,21 @@ unassignVehicle _unit; [_unit] orderGetIn false; TRACE_1("Ejecting", alive _unit); - _unit action ["Eject", vehicle _unit]; [{ params ["_unit", "_emptyPos"]; - + (alive _unit) && {(vehicle _unit) != _unit} +}, { + params ["_unit", "_emptyPos"]; + TRACE_2("success",_unit,_emptyPos); _unit setPosASL AGLToASL _emptyPos; - - if !([_unit] call FUNC(isAwake)) then { - TRACE_1("Check if isAwake", [_unit] call FUNC(isAwake)); - - if (driver _unit == _unit) then { - private _anim = [_unit] call FUNC(getDeathAnim); - - [_unit, _anim, 1, true] call FUNC(doAnimation); - - [{ - params ["_unit", "_anim"]; - if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { - [_unit, _anim, 2, true] call FUNC(doAnimation); - }; - }, [_unit, _anim], 0.5] call CBA_fnc_waitAndExecute; - }; - }; -}, [_unit, _emptyPos], 0.5] call CBA_fnc_waitAndExecute; +}, [_unit, _emptyPos], 2, { + params ["_unit", "_emptyPos"]; + if (!alive _unit) exitWith {}; + WARNING_2("timeout %1->%2",_unit,vehicle _unit); +}] call CBA_fnc_waitUntilAndExecute; [_unit, false, GROUP_SWITCH_ID, side group _unit] call FUNC(switchToGroupSide); -private _loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; -_loaded deleteAt (_loaded find _unit); - -_vehicle setvariable [QGVAR(loaded_persons), _loaded, true]; - true diff --git a/addons/common/functions/fnc_watchVariable.sqf b/addons/common/functions/fnc_watchVariable.sqf index 6fa86dc9bc8..b3ec33bddcb 100644 --- a/addons/common/functions/fnc_watchVariable.sqf +++ b/addons/common/functions/fnc_watchVariable.sqf @@ -20,7 +20,7 @@ * Example: * ["CBA_missionTime"] call ace_common_fnc_watchVariable // Uses title as code * ["diag_frameNo", {diag_frameNo}, [false]] call ace_common_fnc_watchVariable // Won't show delta - * ["blood", {player getVariable "ace_medical_bloodVolume"}, [true, 0, 100]] call ace_common_fnc_watchVariable // Shows slider + * ["blood", {player getVariable "ace_medical_bloodVolume"}, [true, 0, 6]] call ace_common_fnc_watchVariable // Shows slider * ["multiLine text", {"Line 1
Line 2"}, [2]] call ace_common_fnc_watchVariable * ["player names", {allPlayers apply {name _x}}, [5]] call ace_common_fnc_watchVariable // handles any data types * diff --git a/addons/common/init_versionTooltip.sqf b/addons/common/init_versionTooltip.sqf deleted file mode 100644 index ce0d005a14b..00000000000 --- a/addons/common/init_versionTooltip.sqf +++ /dev/null @@ -1,59 +0,0 @@ -#include "script_component.hpp" - -#define MAX_COUNT 30 -#define ANIM_TIME 10 - -private _display = findDisplay 0; - -if (!scriptDone (_display getVariable [QGVAR(versionTooltip), scriptNull])) exitWith {}; - -_display setVariable [QGVAR(versionTooltip), [_display] spawn { - disableSerialization; - - params ["_display"]; - - private _allControls = []; - - private _fnc_create = { - private _ctrl = _display ctrlCreate ["RscPicture", -1]; - - // randomize size - private _size = selectRandom [safezoneW / 30, safezoneW / 20, safezoneW / 15]; - private _position = [ - random safezoneW + safezoneX - _size / 2, - - random (safezoneH / 5) + safezoneY - _size, - _size, - _size - ]; - - _ctrl ctrlSetPosition _position; - _ctrl ctrlCommit 0; - - // pls ignore - _ctrl ctrlSetText QPATHTOF(data\icon_banana_ca.paa); - - // animate with random speed - _position set [1, 1 - safezoneY]; - _ctrl ctrlSetPosition _position; - _ctrl ctrlCommit (ANIM_TIME * random [0.5, 1, 1.5]); - - _allControls pushBack _ctrl; - }; - - while {!isNull _display} do { - _allControls = _allControls select { - if (ctrlCommitted _x) then { - ctrlDelete _x; - false - } else { - true - }; - }; - - while {count _allControls < MAX_COUNT} do { - call _fnc_create; - }; - - uiSleep 3; - }; -}]; diff --git a/addons/common/script_component.hpp b/addons/common/script_component.hpp index 9eb8af601f1..5eb318a9bf7 100644 --- a/addons/common/script_component.hpp +++ b/addons/common/script_component.hpp @@ -16,10 +16,6 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define VERSION_CONFIG_COMMON VERSION_CONFIG;\ - versionDesc = "ACE 3";\ - versionAct = QUOTE(call COMPILE_FILE(init_versionTooltip)) - #define DIG_SURFACE_BLACKLIST [ \ "concrete", "concrete_exp", "concrete_int", "int_concrete", "int_concrete_exp", \ diff --git a/addons/common/scripts/checkVersionNumber.sqf b/addons/common/scripts/checkVersionNumber.sqf index b4858d38bf3..15832ed2bd7 100644 --- a/addons/common/scripts/checkVersionNumber.sqf +++ b/addons/common/scripts/checkVersionNumber.sqf @@ -1,17 +1,17 @@ // by commy2 #include "script_component.hpp" -private _files = []; - -{ - if (_x find "a3_" != 0 && {_x find "ace_" != 0} && {!(toLower _x in (missionNamespace getVariable ["ACE_Version_Whitelist", []]))}) then { - _files pushBack _x; - }; -} forEach activatedAddons; +private _aceWhitelist = missionNamespace getVariable ["ACE_Version_Whitelist", []]; +private _files = CBA_common_addons select { + (_x select [0,3] != "a3_") && + {_x select [0,4] != "ace_"} && + {!((toLower _x) in _aceWhitelist)} +}; private _versions = []; { - private _version = parseNumber getText (configFile >> "CfgPatches" >> _x >> "version"); + getText (configFile >> "CfgPatches" >> _x >> "version") splitString "." params [["_major", "0"], ["_minor", "0"]]; + private _version = parseNumber _major + parseNumber _minor/100; _versions set [_forEachIndex, _version]; } forEach _files; @@ -88,51 +88,54 @@ if (!isServer) then { if (count _missingAddons > 0) then { _missingAddon = true; - private _error = format ["[ACE] %1: ERROR missing addon(s): ", _client]; + private _error = format ["[ACE] %1: ERROR client missing addon(s): ", _client]; { _error = _error + format ["%1, ", _x]; - if (_forEachIndex > 9) exitWith {};// + if (_forEachIndex > 9) exitWith {}; } forEach _missingAddons; _error = _error call _fnc_cutComma; diag_log text _error; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; + [QGVAR(serverLog), _error] call CBA_fnc_serverEvent; }; private _missingAddonServer = false; if (count _missingAddonsServer > 0) then { _missingAddonServer = true; - private _error = format ["[ACE] %1: ERROR missing server addon(s): ", _client]; + private _error = format ["[ACE] %1: ERROR server missing addon(s): ", _client]; { _error = _error + format ["%1, ", _x]; - if (_forEachIndex > 9) exitWith {};// + if (_forEachIndex > 9) exitWith {}; } forEach _missingAddonsServer; _error = _error call _fnc_cutComma; diag_log text _error; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; + [QGVAR(serverLog), _error] call CBA_fnc_serverEvent; }; private _oldVersionClient = false; if (count _oldVersionsClient > 0) then { _oldVersionClient = true; - private _error = format ["[ACE] %1: ERROR outdated addon(s): ", _client]; + private _error = format ["[ACE] %1: ERROR outdated client addon(s): ", _client]; { _error = _error + format ["%1 (client: %2, server: %3), ", _x select 0, _x select 1, _x select 2]; - if (_forEachIndex > 9) exitWith {};// + if (_forEachIndex > 9) exitWith {}; } forEach _oldVersionsClient; _error = _error call _fnc_cutComma; diag_log text _error; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; + [QGVAR(serverLog), _error] call CBA_fnc_serverEvent; }; private _oldVersionServer = false; @@ -143,13 +146,14 @@ if (!isServer) then { { _error = _error + format ["%1 (client: %2, server: %3), ", _x select 0, _x select 1, _x select 2]; - if (_forEachIndex > 9) exitWith {};// + if (_forEachIndex > 9) exitWith {}; } forEach _oldVersionsServer; _error = _error call _fnc_cutComma; diag_log text _error; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; + [QGVAR(serverLog), _error] call CBA_fnc_serverEvent; }; ACE_Version_ClientErrors = [_missingAddon, _missingAddonServer, _oldVersionClient, _oldVersionServer]; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 4206a6adad5..23d42b6fabc 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -10,6 +10,11 @@ 通用 일반 Ogólny + Общий + Comum + Común + Obecné + Commun ACE-Team @@ -26,6 +31,23 @@ ACE-Team ACE-製作團隊 ACE-制作团队 + ACE-Takımı + + + Advanced + Усложненный + Zaawansowany + Avanzado + Erweitert + Pokročilé + Avançada + Avancé + Fejlett + Avanzato + アドバンスド + 고급 + 進階 + Gelişmiş Save @@ -42,6 +64,7 @@ 저장 儲存 储存 + Kaydet Cancel @@ -58,6 +81,7 @@ 취소 取消 取消 + Iptal ACE Options @@ -74,6 +98,7 @@ ACE 옵션 ACE設定選項 ACE设定选项 + ACE Ayarları @@ -91,6 +116,7 @@ + K NNE @@ -123,6 +149,7 @@ 북동 東北 东北 + KD ENE @@ -155,6 +182,7 @@ + D ESE @@ -187,6 +215,7 @@ 남동 東南 东南 + GD SSE @@ -219,6 +248,7 @@ + G SSW @@ -251,6 +281,7 @@ 남서 西南 西南 + GB WSW @@ -283,6 +314,7 @@ 西 西 + B WNW @@ -315,6 +347,7 @@ 북서 西北 西北 + KB NNW @@ -338,7 +371,7 @@ Acción cancelada. Przerwano czynność Akce přerušena - Action annulée. + Action annulée Действие отменено. Ação cancelada. Művelet megszakítva. @@ -347,6 +380,7 @@ 행동 취소됨. 動作已被取消 动作已被取消 + Işlem iptal edildi. [ACE] Miscellaneous Items @@ -363,6 +397,7 @@ [ACE] 기타 물품. [ACE] 雜項 [ACE] 杂项 + [ACE] Çeşitli Nesneler Disable Command Menu @@ -379,6 +414,7 @@ 지휘 메뉴 종료 關閉命令選單 关闭命令选单 + Komut Menüsünü Devre Dışı Bırak Unknown @@ -395,6 +431,23 @@ 알 수 없음 未知的 未知的 + Bilinmeyen + + + Normal + Normal + Normale + Нормальное + Normal + Normalne + Normal + Normális + Normální + Normal + 通常 + 보통 + 普通 + Normal No Voice @@ -409,99 +462,84 @@ Sem voz 音声なし 무음 - 沒聲音 + 無語音 没声音 - - - Accept Requests - Anfrage akzeptieren - Aceptar peticiones - Akceptuj prośby - Přijmout žádost - Accepter requête - Принять запросы - Kérések elfogadása - Aceitar Pedido - Accetta la richiesta - 要求を受け入れ - 요청 수락 - 接受請求 - 接受请求 - - - Decline Requests - Anfrage ablehnen - Rechazar peticiones - Ignoruj prośby - Zamítnout žádost - Отклонить запросы - Rejeter requête - Kérések elutasítása - Rejeitar pedido - Rifiuta la richiesta - 要求を拒否 - 요청 거부 - 拒絕請求 - 拒绝请求 - - - Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions. - Anfragen werden von anderen Mitspielen gestellt. Diese können Anfragen u.a. zum Teilen/Verwenden von Ausrüstungsgegenständen, oder auch zum Ausführen von Handlungen sein. - Acepta peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. - Akceptuj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. - Accetta le richieste degli altri giocatori. Queste possono riguardare l'uso o la condivisione dell'equipaggiamento, o di determinate azioni. - Přijimutí žádosti poslané jinými hráči. Mohou to být žádosti k použítí/sdílení vybavení nebo k vykonání určité činnosti. - Принять запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий - Accepter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions. - Más játékosok általi kérések elfogadása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre. - Aceitar pedidos enviados por outros jogadores. Podem ser pedidos para usar/ compartilhar equipamento, realizar certas ações. - 他プレイヤからの要求を許可します。他プレイヤは装備を共有し、使うなど特定の動作を行えます。 - 다른 플레이어가 보내온 요청을 수락합니다. 이것은 장비 사용 / 공유 요청, 특정 작업 수행 등이 될 수 있습니다. - 接受由其他玩家送出的請求。包含使用/共享裝備與執行特定動作 - 接受由其他玩家送出的请求。包含使用/共享装备与执行特定动作。 - - - Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions. - Anfragen werden von anderen Mitspielen gestellt. Diese können Anfragen u.a. zum Teilen/Verwenden von Ausrüstungsgegenständen, oder auch zum Ausführen von Handlungen sein. - Rechazar peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. - Ignoruj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. - Rifiuta le richieste degli altri giocatori. Queste possono riguardare l'uso o la condivisione dell'equipaggiamento, o di determinate azioni. - Zamítnutí žádostii poslané jinými hráči. Mohou to být žádosti k použítí/sdílení vybavení nebo k vykonání určité činnosti. - Отклонить запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий - Rejeter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions. - Más játékosok általi kérések elutasítása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre. - Rejeita pedidos enviados por outros jogadores. Podem ser pedidos para usar/ compartilhar equipamento, realizar certas ações. - 他プレイヤからの要求を拒否します。他プレイヤは装備を共有し、使うなど特定の動作をできません。 - 다른 플레이어가 보내온 요청을 거부합니다. 이것은 장비 사용 / 공유 요청, 특정 작업 수행 등이 될 수 있습니다. - 拒絕由其他玩家送出的請求。包含使用/共享裝備與執行特定動作 - 拒绝由其他玩家送出的请求。包含使用/共享装备与执行特定动作。 + Ses yok Check PBO Action + PBO Überprüfung Controlla Azioni PBO 檢查PBO動作 检查PBO动作 PBO 検査の挙動 PBO 검사 Sprawdź akcję PBO + Действие при проверке PBO + Ação de Checar PBO + Comprobar PBO + Action à la vérification des PBOs + Zkontrolovat PBO + + + Defines the action to be taken if a player does not have the correct PBOs. + Définit l'action à effectuer si un joueur n'a pas les bons PBOs. + 設定當玩家有錯誤的PBO檔案時要如何處置。 + Nastavuje jakou akci provést pokud hráč nemá správné PBO. + Określa akcję, która ma być podjęta, jeśli gracz nie ma właściwych PBO. + プレイヤーが不正規の PBO を所持している場合の動作を決定します。 + Define la accion a tomar si un jugador no tiene el PBO correcto + Определяет, какое действие будет предпринято, если игрок не имеет корректные PBO. Check PBO All + Alle PBOs überprüfen Controlla Tutti i PBO 檢查所有PBO 检查所有PBO PBO 全てを検査 모든 PBO 검사 Sprawdź wszystkie PBO + Проверять все PBO + Checar Todos os PBOs + Comprobar todos los PBO + Vérifier tous les PBOs + Zkontrolovat všechny PBO + + + Check all addons, not only those of ACE. + Vérifie tous les addons, même ceux qui ne sont pas liés à ACE. + 檢查全部的插件而非只有ACE。 + Zkontrolovat všechny addony a ne jenom ACE. + Sprawdź wszystkie dodatki, nie tylko ACE. + ACE のみならず、全てのアドオンを検査します。 + Comprueba todos los complementos, no sólo los de ACE + Проверять все аддоны, а не только ACE. Check PBO Whitelist + PBO Whitelist Controlla Whitelist PBO 檢查PBO白名單 检查PBO白名单 許可リスト内の PBO を検査 검사 제외 PBO Sprawdź białą listę PBO + Белый список для проверки PBO + Lista Branca de PBO + Comprobar lista blanca de PBOs + Vérifier les PBOs en liste blanche + Zkontrolovat PBO proti whitelistu + + + Define a list of regardless allowed addons. + Permet de définir une liste d'addons autorisés systématiquement. + 定義哪些插件是允許使用的。 + Nastavte seznam addonů, které jsou povolené. + Zdefiniuj listę niezależnie od dozwolonych dodatków. + 許可するアドオンを定義します。 + Comprueba la lista de PBOs permitidos + Задать список непроверяемых аддонов. Feedback icons @@ -510,7 +548,7 @@ Icone informative Иконки состояний Ikony pomocnicze - Icones d'information + Icônes d'information Pomocné ikony Visszajelző ikonok Ícones de Feedback @@ -526,7 +564,7 @@ Seleziona la posizione o disabilita le icone informative sul tuo schermo. Queste saranno mostrate per fornire informazioni aggiuntive sullo stato o sulle azioni del giocatore. Выберите положение или или отключите отображение иконок состояний на Вашем экране. Эти иконки предоставят дополнительную информацию о состоянии персонажа и выполняемых действиях. Ustaw pozycję lub wyłącz całkowicie ikony pomocnicze na ekranie. Te ikony dostarczają dodatkowych informacji na temat statusu Twojej postaci i wykonywanych przez nią akcji. - Sélection de la position ou la désactivation des icones de feedback. Ces icones vous apportent des informations complémentaires sur votre status et sur les actions en cours. + Permet de sélectionner la position des icônes de feedback sur l'écran, ou de les désactiver.\nCes icônes vous apportent des informations supplémentaires sur votre personnage et sur les actions effectuées. Nastavuje pozici nebo vypíná pomocné ikony. Tyto ikony ukazují extra informace ke stavu postavy a vykonávaných činností. Itt beállítható a visszajelző ikonok képernyőn lévő helyzete és jelenléte. Ezek az ikonok extra visszajelzést biztosítanak a karaktered állapotán és végrehajtott cselekvésein. Selecione a posição ou disabilite a posição dos ícones de feedback na sua tela. Esses ícones irão aparecer para mostrar feedback extra do status do seu personagem e ações realizadas. @@ -558,7 +596,7 @@ Modifica la posizione della barra di avanzamernto sullo schermo Установите желаемое положение строки состояния на экране. Ustaw pożądaną lokalizację paska postępu na ekranie - Appliquer la position de la barre de progression sur l'écran + Définit la position de la barre de progression sur l'écran. Nastavuje pozici ukazetele průběhu činnosti na vaší obrazovce. Itt beállítható az állapotjelző sáv képernyődön lévő helyzete. Define o local desejado da barra de progresso na sua tela. @@ -574,7 +612,7 @@ Colore di sfondo dei suggerimenti Цвет фона всплывающих подсказок Kolor tła powiadomień - Notification: couleur de l'arrière plan + Notifications - couleur de l'arrière-plan Barva pozadí nápovědy Súgó háttérszíne Cor do fundo da hint @@ -590,7 +628,7 @@ Il colore di sfondo dei suggerimenti di ACE. Цвет фона всплывающих подсказок АСЕ. Kolor tła dla powiadomień ACE - Notification ACE: couleur de l'arrière plan + Définit la couleur d'arrière-plan des notifications ACE. Barva pozadí ACE nápovědy. Az ACE-súgók hátterének színe. A cor de fundo das hints do ACE. @@ -606,7 +644,7 @@ Il colore del testo dei suggerimenti Цвет шрифта всплывающих подсказок Kolor tekstu powiadomień - Notification: couleur du texte + Notifications - couleur du texte Barva fontu nápovědy. Súgószöveg betűinek színe Cor do do texto da hint @@ -622,7 +660,7 @@ Il colore del testo dei suggerimenti di ACE. Questo è il colore predefinito per tutto il testo mostrato dal sistema di suggerimenti di ACE quando il colore del testo non ha altro colore specificato. Цвет шрифта текста всплывающих подсказок АСЕ. Этот цвет является стандартным для всего текста, транслирующегося через систему подсказок АСЕ, если не установлено другого цвета для текста подсказок. Kolor tekstu dla powiadomień ACE. Ten kolor jest domyślnym dla wszystkich tekstów wyświetlanych poprzez System Powiadomień ACE, jeżeli dla powiadomienia nie określono innego koloru. - Notification ACE: couleur du texte. C'est la couleur par défaut de tout texte affiché dans les notifications ACE, si aucune couleur n'est spécifiée pour les notifications + Définit la couleur du texte des notifications ACE.\nCette couleur est la couleur par défaut pour tout texte affiché par le système de notifications ACE, si aucune autre couleur n'est spécifiée. Barva fontu ACE nápověd. Toto je standardní barva pro všechen text zobrazovaný ACE nápovědami, pokud nemá nápověda žádnou specifikanou barvu. Az ACE-súgók betűkészletének színek. Ez a szín alapértelmezett az összes szövegre az ACE-súgórendszerben, ha a súgószöveg maga nem ad meg más színt. A cor do texto das hints do ACE. Essa cor é a cor default para todos os texos exibidos pelo sistema de hints do ACE , caso o texto da hint não tem outra cor especificada. @@ -641,6 +679,10 @@ 保持武器雷射/手電筒的狀態 保持武器雷射/手电筒的状态 Trwały znacznik laserowy/latarka + Luz da lanterna/laser da arma persistente + Rémanence du pointeur laser/de la lampe torche + Perzistentní laser/baterka na zbrani + Punto láser/Linterna persistente en arma Enable gunlight after weapon switch or vehicle enter/exit if it was previously enabled. @@ -652,6 +694,10 @@ 保存武器雷射/手電筒的開關狀態,使玩家切換武器或進出載具時能保持之前的的狀態 保存武器雷射/手电筒的开关状态,使玩家切换武器或进出载具时能保持之前的的状态。 Aktywuj znacznik laserowy/latarkę po zmianie broni lub wejściu/wyjściu z pojazdu, jeśli był on poprzednio włączony. + Ativa a luz da arma ao trocar de arma, entrar/sair de um veículo. Caso tenha sido acesa anteriormente. + Si le pointeur laser/la lampe torche est allumé(e), cette option permet de le/la réallumer automatiquement après un changement d'arme, ou après une entrée/sortie d'un véhicule. + Pokud jsou zaplé, zapíná laser/baterku po přepnutí zbraně nebo po nástupu/výstupu z vozidla. + Habilita la luz en el arma después de cambiarla o tras la entrada/salida de un vehículo si estaba préviamente habilitada Banana @@ -678,7 +724,7 @@ Банан - это съедобный фрукт, ягода с ботанической точки зрения, произрастающий на нескольких видах травянистых растениях рода Банан (Musa). A banán egy ehető gyümölcs, technikai szempontból bogyótermés, melyet több fürtvirágzatú növény termel a Musa rendszertani nemzetségben. Rodzaj roślin z rodziny bananowatych, obejmujący około 80 gatunków.<br />Przedstawiciele są typowymi przedstawicielami flory międzyzwrotnikowej Azji, Afryki i Australii.<br />Część gatunków dostarcza jadalnych owoców. Słowo banan pochodzi prawdopodobnie od arabskiego słowa banan, co oznacza palec, lub afrykańskiego języka wolof, w którym rośliny te określa się mianem banaana. - Une banane est un fruit qui, d'un point de vue botanique, fait partie du groupe des baies. Produite par plusieurs sortes de grandes plantes à fleurs herbacées du type Musa. + Une banane est un fruit comestible qui, d'un point de vue botanique, fait partie du groupe des baies.\nProduite par plusieurs espèces de grandes plantes à fleurs herbacées du genre Musa. A banana é uma fruta comestível, botanicamente uma baga, produzida por vários tipos de plantas herbáceas grandes do genero Musa. 甘蕉は食べられる果物でバショウ科バショウ属のうち、果実を食用とする品種群の総称。また、その果実のこと。いくつかの原種から育種された多年草。種によっては熟すまでは毒を持つものもある。 바나나는 식용 과일로써 식물학적으로 열매류이며 여러 종류의 개화가능한 초본의 파초과로 부터 생산됩니다. @@ -692,7 +738,7 @@ Überprüfe PBOs Zkontrolovat soubory PBO Verificar PBOs - Vérifier les PBOs + /!\ Module obsolète /!\ - Vérifier les PBOs PBO-k ellenőrzése Проверка аддонов Controlla PBO @@ -709,7 +755,7 @@ Zjistit addon který je v souladu se serverem Este módulo verifica a integridade dos addons quando iniciamos a simulação Выполняет проверку версий аддонов ACE у подключаемых игроков - Ce module contrôle si les PBOs de chaque joueur sont corrects + /!\ Module obsolète /!\ - Vérifie l'intégrité des addons avec le serveur, et effectue l'action sélectionnée si un addon est manquant. Controlla l'integrità degli addon con il server ed esegui l'azione selezionata se un addon è mancante サーバがアドオンの整合性を検査し、もし不備があれば実行する動作を選択できます。 서버 에드온의 무결성을 검사하고 사라진 에드온이 있을경우 행동을 선택합니다. @@ -723,7 +769,7 @@ Aktion Akce Ação - Action + /!\ Module obsolète /!\ - Action Cselekvés Действие Azione @@ -739,7 +785,7 @@ Was soll mit Leuten geschehen, die nicht die richtigen PBO-Dateien geladen haben? Co udělat s lidmi, co nemají správné addony? O que fazer com pessoas que não tem os PBOs corretos? - Que faire avec les personnes n'ayant pas les bons PBO ? + /!\ Module obsolète /!\ - Définit l'action à effectuer si un joueur n'a pas les bons PBOs. Mi legyen azokkal a személyekkel, akiknek nincsenek meg a helyes PBO-k? Что делать с игроками с неправильными аддонами? Cosa fare con giocatori che non hanno i PBO corretti? @@ -771,7 +817,7 @@ Verwarnen (permanent) Upozornit (permanentně) Avisar (permanente) - Avertir (permanent) + Avertir (systématiquement) Figyelmeztetés (tartós) Предупреждать (постоянно) Avverti (permanente) @@ -787,7 +833,7 @@ Kicken Vyhodit Chutar - Ejecter + Éjecter Kirúgás Кикнуть Kick @@ -803,7 +849,7 @@ Alle Addons überprüfen Zkontrolovat všechny addony Verificar todos addons - Vérifier tous les addons + /!\ Module obsolète /!\ - Vérifier tous les addons Összes bővítmény ellenőrzése Проверять все аддоны Controlla tutti gli addon @@ -819,7 +865,7 @@ Alle Addons anstatt nur ACE überprüfen? Zkontrolovat všechny addony namísto jen těch od ACE? Verificar todos addons invés de só os do ACE? - Vérifie tous les addons, même ceux qui ne sont pas liés à ACE + /!\ Module obsolète /!\ - Vérifie tous les addons, même ceux qui ne sont pas liés à ACE. Az összes bővítmény ellenőrzése, csak az ACE helyett? Проверять все аддоны, а не только ACE? Controlla tutti gli addon invece dei soli addon ACE? @@ -835,7 +881,7 @@ Whitelist Seznam povolených Lista branca - Liste blanche + /!\ Module obsolète /!\ - Liste blanche Fehérlista Вайтлист доп. аддонов Lista Bianca @@ -851,7 +897,7 @@ Welche Addons werden dennoch erlaubt? Jaké addony jsou povoleny? Quais addons são permitidos de qualquer maneira? - Quels addons sont tolérés ? + /!\ Module obsolète /!\ - Permet de définir une liste d'addons autorisés systématiquement. Milyen bővítmények vannak feltétlenül engedélyezve? Какие аддоны дополнительно разрешены? Quali addon sono permessi in ogni caso? @@ -883,7 +929,7 @@ Fügt einen LSD-Effekt zum synchronisierten Fahrzeug hinzu Přidá LSD efekt pro synchronizované vozidla Adiciona efeito LSD ao veículo sincronizado - Ajoute l'effet LSD aux véhicules synchronisés + Ajoute l'effet LSD aux véhicules synchronisés. LSD-effekt hozzáadása a szinkronizált járművekhez Добавляет эффект LSD (мигание всеми цветами радуги) синхронизированным транспортным средствам Aggiunge effetti LSD ai veicoli sincronizzati @@ -899,7 +945,7 @@ Ativa dispositivo de mão Przełącz urządzenie podręczne Přepnout ruční zařízení - Allumer l'ordinateur de poche + Allumer l'appareil portatif Kézi eszköz kapcsolása Включить портативное устройство Apri dispositivo palmare @@ -915,7 +961,7 @@ Fecha dispositivo de mão Zamknij urządzenie podręczne Zavřít ruční zařízení - Fermer l'ordinateur de poche + Éteindre l'appareil portatif Kézi eszköz bezárása Закрыть портативное устройство Chiudi dispositivo palmare @@ -931,7 +977,7 @@ Troca dispositivos de mão Następne urządzenie podręczne Procházet ruční zařízení - Changer (cycle) d'ordinateur de poche + Changer d'appareil portatif Kézi eszköz váltása Следующее портативное устройство Cicla tra dispositivi palmari @@ -943,7 +989,7 @@ Disabled Zakázáno - Désactiver + Désactivé Deaktiviert Disattivato Wyłączone @@ -958,7 +1004,7 @@ Enabled Povoleno - Activer + Activé Aktiviert Attivato Włączone @@ -970,6 +1016,64 @@ 啟用 启用 + + Always + Immer + 常に + Всегда + Sempre + Siempre + Toujours + 一直 + Sempre + Vždy + Zawsze + + + Anywhere + Где угодно + Wszędzie + Donde sea + Überall + Kdekoliv + Qualquer lugar + Partout + Akárhol + Ovunque + どこでも + 어디서나 + 任何地方 + + + Basic + Базовый + Podstawowy + Básico + Standard + Základní + Básica + Basique + Alap + Basico + ベーシック + 기본 + 基礎 + + + Medical Vehicles + В медицинском транспорте + Pojazdy medyczne + Vehiculos médicos + Sanitätsfahrzeuge + Zdravotnická vozidla + Veículos médcos + Dans les véhicules médicaux + Orvosi járművek + Veicoli medici + 医療車両のみ + 의료차량 + 醫療載具 + Yes Ja @@ -1002,6 +1106,32 @@ + + Confirm + 確認 + Bestätigen + Подтвердить + Confirmar + Confirmar + Confirmer + 確認 + Conferma + Potvrdit + Potwierdź + + + Never + 行わない + Nie + Никогда + Nunca + Nunca + Jamais + 從不 + Mai + Nikdy + Nigdy + Vehicles only Nur Fahrzeuge @@ -1041,11 +1171,12 @@ ACE Vybavení ACE Equipo ACE Equipaggiamento - ACE Equipement + ACE Équipement ACE 装備 ACE 장비 ACE 裝備按鍵 ACE 装备按键 + ACE Ekipmanlar ACE Common @@ -1076,6 +1207,7 @@ ACE 무기 ACE 武器按鍵 ACE 武器按键 + ACE Silahlar ACE Movement @@ -1101,7 +1233,7 @@ ACE Nastavení optiky ACE Ajuste de miras ACE Regolazione Ottiche - ACE Ajustement de la lunette + ACE Réglage des lunettes ACE スコープ調節 ACE 조준경 조정 ACE 瞄準鏡調節按鍵 @@ -1116,11 +1248,12 @@ ACE Vozidla ACE Vehículos ACE Veicoli - ACE Vehicules + ACE Véhicules ACE 車両 ACE 차량 ACE 載具按鍵 ACE 载具按键 + ACE Araçlar No Room to unload @@ -1178,6 +1311,11 @@ 音楽の音量低下を許可 Permesso di abbassare la musica Zezwól na przyciszanie muzyki + Разрешить приглушение музыки + Permite diminuir volume da música + Permission d'abaisser la musique + Povolit snížení hlasitosti hudby + Permitir reducir el volumen de la música Allow ACE scripts to turn down the music. @@ -1188,22 +1326,87 @@ ACE スプリントへ音量低下を許可します。 Permetti agli script di ACEdi abbassare la musica. Zezwól skrypty ACE na przyciszanie muzyki. + Позволить скриптам ACE приглушать музыку + Permite que Scripts do ACE diminuam o volume da música. + Autorise les scripts ACE à baisser le volume de la musique. + Povolit ACE skriptům snížit hlasitost hudby + Permitir a los scripts de ACE reducir el volumen la música Flag (ACE - Black) + Flagge (Ace - Schwarz) 旗帜(ACE-黑色): 旗幟(ACE-黑色) Bandiera (ACE - Nera) 旗 (ACE - 黒) Flaga (ACE - Czarna) + Флаг (ACE - Черный) + Bandeira (ACE - Preto) + Drapeau (ACE - Noir) + Vlajka (ACE - Černá) + Bayrak (ACE- Siyah) + Bandera (ACE - Negra) Flag (ACE - White) + Flagge (Ace - Weiß) 旗帜(ACE-白色): 旗幟(ACE-白色) Bandiera (ACE - Bianca) 旗 (ACE - 白) Flaga (ACE - Biała) + Флаг (ACE - Белый) + Bandeira (ACE - Branco) + Drapeau (ACE - Blanc) + Vlajka (ACE - Bílá) + Bayrak (ACE - Beyaz) + Bandera (ACE - Blanca) + + + Players only + Игроков + Tylko dla graczy + Solo jugadores + Nur Spieler + Pouze hráči + Somente jogadores + Joueurs uniquement + Csak játékosok + Solo giocatori + プレイヤーのみ + 플레이어만 + 只限玩家 + 只限玩家 + Sadece oyuncular + + + Players and AI + Игроков и ботов + Gracze oraz AI + Jugadores e IA + Spieler und KI + Hráči a AI + Jogadores e IA + Joueurs et IA + Játékosok és AI + Giocatori ed IA + プレイヤーと AI + 플레이어 및 인공지능 + 玩家与AI + 玩家與AI + Oyuncular ve AI + + + Show the action in the self-interaction menu + Affiche l'action dans le menu d'interaction personnel. + 在自我互動選單內顯示動作 + Pokaż akcje w menu interakcji własnej + Mostra a ação no menu de auto-interação + セルフ インタラクションに動作を表示 + Mostra le azioni nel menu di interazione con se stessi + Mostrar la acción en el menú de interacción propio + Zobrazit akci v menu vlastních interakcí + Показывать действие в меню взаимодействия с собой. diff --git a/addons/concertina_wire/CfgEventHandlers.hpp b/addons/concertina_wire/CfgEventHandlers.hpp index b0ff603096c..18883ae839d 100644 --- a/addons/concertina_wire/CfgEventHandlers.hpp +++ b/addons/concertina_wire/CfgEventHandlers.hpp @@ -7,13 +7,13 @@ 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)); }; }; diff --git a/addons/concertina_wire/CfgVehicles.hpp b/addons/concertina_wire/CfgVehicles.hpp index 0bc5a31e598..77b2c97d185 100644 --- a/addons/concertina_wire/CfgVehicles.hpp +++ b/addons/concertina_wire/CfgVehicles.hpp @@ -74,7 +74,7 @@ class CfgVehicles { }; class ACE_ConcertinaWire: ACE_ConcertinaWireNoGeo { scope = 2; - displayName = $STR_ACE_CONCERTINA_WIRE; + displayName = CSTRING(DisplayName); model = QPATHTOF(data\ACE_ConcertinaWire.p3d); EGVAR(logistics_wirecutter,isFence) = 1; class ACE_Actions { @@ -84,7 +84,7 @@ class CfgVehicles { condition = "true"; class ACE_Dismount { selection = ""; - displayName = "$STR_ACE_UNROLLWIRE"; + displayName = CSTRING(UnrollWire); distance = 5; condition = "alive _target"; statement = QUOTE([ARR_2(_target,_player)] call FUNC(dismount)); @@ -103,7 +103,7 @@ class CfgVehicles { }; scope = 2; - displayName = $STR_ACE_CONCERTINA_WIRECOIL; + displayName = CSTRING(Coil_DisplayName); model = QPATHTOF(data\ACE_ConcertinaWireCoil.p3d); mapsize = 0.5; animated = 0; @@ -129,7 +129,7 @@ class CfgVehicles { condition = "true"; class ACE_Deploy { selection = ""; - displayName = "$STR_ACE_ROLLWIRE"; + displayName = CSTRING(RollWire); distance = 4; condition = "true"; //wait a frame to handle "Do When releasing action menu key" option: diff --git a/addons/concertina_wire/functions/fnc_deploy.sqf b/addons/concertina_wire/functions/fnc_deploy.sqf index 6ff782fb8e6..85f78c65f93 100644 --- a/addons/concertina_wire/functions/fnc_deploy.sqf +++ b/addons/concertina_wire/functions/fnc_deploy.sqf @@ -77,7 +77,7 @@ GVAR(deployPFH) = [{ } count WIRE_FAST; }, 0, [_wireNoGeo, _wireNoGeoPos, _unit]] call CBA_fnc_addPerFrameHandler; -[localize "STR_ACE_ROLLWIRE", "", ""] call EFUNC(interaction,showMouseHint); +[LLSTRING(RollWire), "", ""] call EFUNC(interaction,showMouseHint); [_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); diff --git a/addons/concertina_wire/functions/fnc_dismount.sqf b/addons/concertina_wire/functions/fnc_dismount.sqf index 487c5685a43..b8beeb6a9e7 100644 --- a/addons/concertina_wire/functions/fnc_dismount.sqf +++ b/addons/concertina_wire/functions/fnc_dismount.sqf @@ -34,7 +34,7 @@ private _delay = [45, 30] select ([_unit] call EFUNC(common,isEngineer) || {[_un [_wire], {(_this select 0) call FUNC(dismountSuccess)}, {}, - localize "STR_ACE_UNROLLWIRE", + LLSTRING(UnrollWire), {true}, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml index 78170d90b64..d427cf85413 100644 --- a/addons/concertina_wire/stringtable.xml +++ b/addons/concertina_wire/stringtable.xml @@ -1,13 +1,13 @@ - - + + Concertina Wire NATO-Draht Колючая проволока Koncentrina Alambre de espino - Fill barbelé + Fil barbelé Ostnatý drát Filo a concertina Concertina wire @@ -16,8 +16,9 @@ 철조망 鐵絲網 铁丝网 + Bıçaklı Tel - + Concertina Wire Coil NATO-Draht Rolle Колючая проволока (моток) @@ -32,14 +33,15 @@ 윤형 철조망 鐵絲網捲 铁丝网卷 + Bıçaklı Tel Rulo - + Dismount Concertina Wire NATO-Draht abbauen Демонтировать колючую проволоку Zwiń koncentrinę Desmontar alambre de espino - Démonter le fil barbelé + Démontage du fil barbelé... Svinout ostnatý drát Smonta il filo a concertina Dismount Concertina wire @@ -48,8 +50,9 @@ 철조망 해체 卸下鐵絲網 卸下铁丝网 + Bıçaklı Telleri Sök - + Deploy Concertina Wire NATO-Draht verlegen Монтировать колючую проволоку @@ -64,6 +67,7 @@ 철조망 배치 佈署鐵絲網 布署铁丝网 + Bıçaklı Telleri Yerleştir diff --git a/addons/cookoff/ACE_Settings.hpp b/addons/cookoff/ACE_Settings.hpp index 304aaf48e03..ba4447dba99 100644 --- a/addons/cookoff/ACE_Settings.hpp +++ b/addons/cookoff/ACE_Settings.hpp @@ -1,40 +1,18 @@ class ACE_Settings { class GVAR(enable) { - category = CSTRING(displayName); - displayName = CSTRING(enable_name); - description = CSTRING(enable_tooltip); - value = 0; - typeName = "BOOL"; + movedToSqf = 1; }; class GVAR(enableAmmobox) { - category = CSTRING(displayName); - displayName = CSTRING(enableBoxCookoff_name); - description = CSTRING(enableBoxCookoff_tooltip); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(enableAmmoCookoff) { // For CBA Setting Switch: we can eliminate and just use (ammoCookoffDuration == 0) - category = CSTRING(displayName); - displayName = CSTRING(enableAmmoCookoff_name); - description = CSTRING(enableAmmoCookoff_tooltip); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(ammoCookoffDuration) { - category = CSTRING(displayName); - displayName = CSTRING(ammoCookoffDuration_name); - description = CSTRING(ammoCookoffDuration_tooltip); - value = 1; - typeName = "SCALAR"; - sliderSettings[] = {0, 5, 1, 1}; + movedToSQF = 1; }; class GVAR(probabilityCoef) { - category = CSTRING(displayName); - displayName = CSTRING(probabilityCoef_name); - description = CSTRING(probabilityCoef_tooltip); - value = 1; - typeName = "SCALAR"; - sliderSettings[] = {0, 5, 1, 1}; + movedToSQF = 1; }; }; diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 04e7762a415..2b58daa3043 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -7,12 +7,12 @@ class Cfg3DEN { class GVAR(enable) { property = QGVAR(enable); control = "Checkbox"; - displayName = CSTRING(enable_name); - tooltip = CSTRING(enable_tooltip); + displayName = CSTRING(enable_hd_name); + tooltip = CSTRING(enable_hd_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; condition = "objectVehicle"; - defaultValue = QUOTE(GETMVAR(QGVAR(enable),true)); + defaultValue = QUOTE((GETMVAR(QGVAR(enable),0)) in [ARR_2(1,2)]); }; class GVAR(enableAmmoCookoff) { property = QGVAR(enableAmmoCookoff); diff --git a/addons/cookoff/XEH_PREP.hpp b/addons/cookoff/XEH_PREP.hpp index f1deb8eaed2..d2b63ac65dd 100644 --- a/addons/cookoff/XEH_PREP.hpp +++ b/addons/cookoff/XEH_PREP.hpp @@ -6,3 +6,4 @@ PREP(cookOffBox); PREP(blowOffTurret); PREP(detonateAmmunition); PREP(getVehicleAmmo); +PREP(handleDamageEjectIfDestroyed); diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index fad901982d9..94fe8899de8 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -27,9 +27,7 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; }; _vehicle addEventHandler ["HandleDamage", { - if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)]) then { - ["tank", _this] call FUNC(handleDamage); - }; + ["tank", _this] call FUNC(handleDamage); }]; }, nil, nil, true] call CBA_fnc_addClassEventHandler; @@ -53,9 +51,7 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; }; _vehicle addEventHandler ["HandleDamage", { - if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)]) then { - ["tank", _this] call FUNC(handleDamage); - }; + ["tank", _this] call FUNC(handleDamage); }]; }, nil, nil, true] call CBA_fnc_addClassEventHandler; @@ -63,9 +59,7 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; params ["_vehicle"]; _vehicle addEventHandler ["HandleDamage", { - if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)]) then { - ["car", _this] call FUNC(handleDamage); - }; + ["car", _this] call FUNC(handleDamage); }]; }, nil, ["Wheeled_APC_F"], true] call CBA_fnc_addClassEventHandler; @@ -89,7 +83,7 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; // blow off turret effect ["Tank", "killed", { - if ((_this select 0) getVariable [QGVAR(enable),GVAR(enable)]) then { + if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)] in [1, 2, true]) then { if (random 1 < 0.15) then { (_this select 0) call FUNC(blowOffTurret); }; @@ -108,3 +102,13 @@ if (isServer) then { } forEach allCurators; }] call CBA_fnc_addEventHandler; }; + +// init eject from destroyed vehicle +{ + [_x, "init", { + params ["_vehicle"]; + if (!alive _vehicle) exitWith {}; + TRACE_2("ejectIfDestroyed init",_vehicle,typeOf _vehicle); + _vehicle addEventHandler ["HandleDamage", {call FUNC(handleDamageEjectIfDestroyed)}]; + }, true, [], true] call CBA_fnc_addClassEventHandler; +} forEach EJECT_IF_DESTROYED_VEHICLES; diff --git a/addons/cookoff/XEH_preInit.sqf b/addons/cookoff/XEH_preInit.sqf index b47cf6628db..9361d05015e 100644 --- a/addons/cookoff/XEH_preInit.sqf +++ b/addons/cookoff/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index c19f968c47c..51f35ea8133 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -21,7 +21,7 @@ if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {}; _vehicle setVariable [QGVAR(isCookingOff), true]; if (local _vehicle) then { - [QGVAR(cookOff), _vehicle] call CBA_fnc_remoteEvent; + [QGVAR(cookOff), _vehicle] call CBA_fnc_globalEvent; }; [{ diff --git a/addons/cookoff/functions/fnc_cookOffBox.sqf b/addons/cookoff/functions/fnc_cookOffBox.sqf index 8f6ef7f2f06..28e3a911088 100644 --- a/addons/cookoff/functions/fnc_cookOffBox.sqf +++ b/addons/cookoff/functions/fnc_cookOffBox.sqf @@ -21,7 +21,7 @@ if (_box getVariable [QGVAR(isCookingOff), false]) exitWith {}; _box setVariable [QGVAR(isCookingOff), true]; if (local _box) then { - [QGVAR(cookOffBox), _box] call CBA_fnc_remoteEvent; + [QGVAR(cookOffBox), _box] call CBA_fnc_globalEvent; }; [{ diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index f77a2755fd4..0d944958d24 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -87,7 +87,7 @@ if (_amountOfMagazines > 0) exitWith { playSound3D [_sound, objNull, false, (getPosASL _vehicle), 2, 1, 1300]; if (random 1 < 0.15) then { - [_vehicle, _ammo, _speed, random 1 < 0.15] call _spawnProjectile; + [_vehicle, _ammo, _speed, true] call _spawnProjectile; }; }; if (toLower _simType == "shotgrenade") then { diff --git a/addons/cookoff/functions/fnc_engineFire.sqf b/addons/cookoff/functions/fnc_engineFire.sqf index 6ed6920b7c2..f5ad3e1cf9f 100644 --- a/addons/cookoff/functions/fnc_engineFire.sqf +++ b/addons/cookoff/functions/fnc_engineFire.sqf @@ -21,7 +21,7 @@ if (_vehicle getVariable [QGVAR(isEngineSmoking), false]) exitWith {}; _vehicle setVariable [QGVAR(isEngineSmoking), true]; if (local _vehicle) then { - [QGVAR(engineFire), _vehicle] call CBA_fnc_remoteEvent; + [QGVAR(engineFire), _vehicle] call CBA_fnc_globalEvent; }; private _offset = getArray (_vehicle call CBA_fnc_getObjectConfig >> QGVAR(engineSmokeOffset)); diff --git a/addons/cookoff/functions/fnc_handleDamage.sqf b/addons/cookoff/functions/fnc_handleDamage.sqf index e9765805cbe..88ea717d908 100644 --- a/addons/cookoff/functions/fnc_handleDamage.sqf +++ b/addons/cookoff/functions/fnc_handleDamage.sqf @@ -21,6 +21,12 @@ _thisHandleDamage params ["_vehicle", "", "_damage", "_source", "_ammo", "_hitIn // it's already dead, who cares? if (damage _vehicle >= 1) exitWith {}; +// If cookoff is disabled exit +if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith {}; + +// Check for players and exit if none found and the enable for players only setting is true +if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1}) exitWith {}; + // get hitpoint name private _hitpoint = "#structural"; diff --git a/addons/cookoff/functions/fnc_handleDamageEjectIfDestroyed.sqf b/addons/cookoff/functions/fnc_handleDamageEjectIfDestroyed.sqf new file mode 100644 index 00000000000..05fa73415e9 --- /dev/null +++ b/addons/cookoff/functions/fnc_handleDamageEjectIfDestroyed.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Dystopian + * Ejects crew from destroyed vehicle. + * Should be called from HandleDamage EH. + * + * Arguments: + * HandleDamage EH + * + * Return Value: + * None + * + * Example: + * _this call ace_cookoff_fnc_handleDamageEjectIfDestroyed + * + * Public: No + */ + +params ["_vehicle", "", "", "", "_ammo"]; + +if (alive _vehicle) exitWith {}; + +TRACE_2("ejectIfDestroyed HDEH",typeOf _vehicle,_this); + +if (!IS_EXPLOSIVE_AMMO(_ammo)) then { + { + if (alive _x) then { + moveOut _x; + }; + } forEach crew _vehicle; +}; + +_vehicle removeEventHandler ["HandleDamage", _thisEventHandler]; diff --git a/addons/cookoff/initSettings.sqf b/addons/cookoff/initSettings.sqf new file mode 100644 index 00000000000..ce510a299d5 --- /dev/null +++ b/addons/cookoff/initSettings.sqf @@ -0,0 +1,51 @@ +// CBA Settings [ADDON: ace_cookoff]: + +[ + QGVAR(enable), "LIST", + [LSTRING(enable_hd_name), LSTRING(enable_hd_tooltip)], + LSTRING(category_displayName), + [[0, 1, 2], ["STR_A3_OPTIONS_DISABLED", ELSTRING(common,playerOnly), ELSTRING(common,playersAndAI)], 0], + true, // isGlobal + {[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(enableAmmobox), "CHECKBOX", + [LSTRING(enableBoxCookoff_name), LSTRING(enableBoxCookoff_tooltip)], + LSTRING(category_displayName), + true, // default value + true, // isGlobal + {[QGVAR(enableAmmobox), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(enableAmmoCookoff), "CHECKBOX", + [LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)], + LSTRING(category_displayName), + true, // default value + true, // isGlobal + {[QGVAR(enableAmmoCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(ammoCookoffDuration), "SLIDER", + [LSTRING(ammoCookoffDuration_name), LSTRING(ammoCookoffDuration_tooltip)], + LSTRING(category_displayName), + [0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(ammoCookoffDuration), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(probabilityCoef), "SLIDER", + [LSTRING(probabilityCoef_name), LSTRING(probabilityCoef_tooltip)], + LSTRING(category_displayName), + [0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(probabilityCoef), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/cookoff/script_component.hpp b/addons/cookoff/script_component.hpp index 5daa0e83305..3c28864932b 100644 --- a/addons/cookoff/script_component.hpp +++ b/addons/cookoff/script_component.hpp @@ -27,3 +27,5 @@ // Delay between flame effect for players in a cooking off vehicle #define FLAME_EFFECT_DELAY 0.4 + +#define EJECT_IF_DESTROYED_VEHICLES ["Boat_Transport_02_base_F", "Rubber_duck_base_F"] diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 0a55bec54fb..2db0e9cd9ab 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -1,45 +1,49 @@ - - Cook off - Esplosione - 殉爆效果 - 殉爆效果 - 誘爆 - 쿡오프 - Durchzündung - Cook off - Samozapłon + + ACE Cook off + ACE Detonación inducida por calor + ACE Esplosione + ACE 殉爆效果 + ACE 殉爆效果 + ACE 誘爆 + ACE 쿡오프 + ACE Durchzündung + ACE Auto-inflammation + ACE Samozapłon + ACE Возгорание + ACE Cook off + ACE Vznícení munice - - Enable cook off - Durchzündung ermöglichen - Povolit explozi munice - Включить воспламенение - 誘爆を有効化 - 쿡오프 현상 활성화 - Aktywuj efekty samozapłonu amunicji - Activer le cook off - Abilita Esplosione - 開啟殉爆效果 - 开启殉爆效果 + + Damage handling and turret effects + Daño y efectos de torreta + Schadensberechnung und Geschützturmeffekte + 損傷処理と砲塔の効果 + Обработка урона и эффектов срыва башни + Manipulação de dano e efeitos de torre + Dégâts et effets de tourelle + 傷害控制及炮塔效果 + Manovrabilità danneggiata ed effetti torretta + Poškodit ovládání a efekty věže + Obsługa obrażeń i efekty wieży - - Enables cook off and related vehicle destruction effects. - Ermöglicht Durchzündung und zugehörige Fahrzeug-Zerstörungseffekte. - Povolí explozi munice a její následné ničivé efekty. - Включает воспламенение и сопутствующие эффекты повреждения техники. - 誘爆を有効化し、車両が誘爆によって破壊されていきます。 - 쿡오프 현상을 활성화 하고 관련된 차량에 폭발 이펙트를 적용합니다. - Aktywuje efekt samozapłonu amunicji na zniszczonych pojazdach. - Active le cook-off (autocombustion des munitions) et les effets de destruction liés. - Abilita l'esplosione e i relativi effetti di distruzione del veicolo. - 開啟此功能後,將使有關載具在損毀時有殉爆的效果 - 开启此功能后,将使有关载具在损毁时有殉爆的效果。 + + Changes damage handling for cook off and turret explosion effects + Cambia el daño de la detonación inducida por calor y los efectos de la explosión de la torreta + Ändert die Schadensberechnung für die Durchzündung und die Explosionseffekte des Geschützturmes + 誘爆の損傷処理と砲塔の爆発効果を変更します。 + Изменяет обработку урона для возгорания и эффекта срыва башни + Modifica a manipulação de dano para o cozinhamento de munição e efeitos de explosão da torre + Modifie la gestion des dégâts pour l'auto-inflammation et les effets d'explosion de tourelle. + 更改殉爆以及炮塔爆炸之傷害控制 + Modifica la gestione dei danni per gli effetti di esplosione della torretta e danneggiamenti + Změní poškození ovládání a efekty výbuchu veže + Zmienia obsługę obrażeń podczas samozapłonu i eksplozji wieży - Wreck (Turret) + Wreck (Turret) Épave (tourelle) Restos (torreta) Rottami (torretta) @@ -47,7 +51,6 @@ Обломки (башня) Wrack (Geschützturm) Vrak (věž) - Wreck (Turret) Ruínas (torre) 잔해(포탑) 残骸 (砲塔) @@ -56,89 +59,121 @@ Enable ammo box cook off + Habilitar detonación inducida por calor en las cajas de munición 弾薬箱に誘爆を有効化 Durchzündung für Munitionskisten ermöglichen 탄약 상자 쿡오프 현상 활성화 Aktywuj samozapłon skrzyń z amunicją - Cook off de caisses de munitions + Auto-inflammation des caisses de munitions Abilita esplosione cassa munizioni 開啟彈藥箱殉爆效果 开启弹药箱殉爆效果 + Разрешить возгорание ящиков с боеприпасами + Permitir cozinhar caixas de munição + Povolit vynícení munice v krabicích Enables cooking off of ammo boxes. + Habilita la detonación inducida por calor en las cajas de munición 弾薬箱が誘爆するようになります。 Ermöglicht Durchzündung von Munitionskisten. 탄약 상자에 쿡오프 현상을 적용합니다. Aktywuje samozapłon skrzyń z amunicją - Active le cook off sur toutes les caisses de munitions. + Permet l'auto-inflammation des caisses de munitions. Abilita l'esplosione della cassa di munizioni. 開啟彈藥箱殉爆效果 开启弹药箱殉爆效果 + Активирует возгорание ящиков с боеприпасами + Permitir que caixas de munição cozinhem. + Zapíná vznícení munice v krabicích. Enable Ammunition cook off + Habilitar la detonación inducida por calor en la munición 弾薬の誘爆を有効化 Durchzündung für Munition ermöglichen 탄약 쿡오프 현상 활성화 Aktywuj samozapłon amunicji - Activer le cook off des munitions + Auto-inflammation des munitions Abilita Esplosione munizioni 開啟彈藥殉爆效果 开启弹药殉爆效果 + Разрешить детонацию боекомплекта + Permitir cozinhar munição + Povolit vznícení munice Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition. + Habilita la detonación inducida por calor en la munición. Dispara proyectiles de munición mientras el vehículo está ardiendo y tiene munición 弾薬が誘爆します。車両が燃えると、搭載している弾薬が激しく燃え上がります。 Ermöglicht Durchzündung von Munition. Feuert Projektile der Munition ab, solange das Fahrzeug brennt und Munition besitzt. Aktywuje samozapłon amunicji. Wystrzeliwuje pociski podczas gdy pojazd płonie i posiada amunicję. - Mets à feu les munitions lorsqu'un véhicule est en feu et contient des munitions. + Permet l'auto-inflammation des munitions. Tire des projectiles tant que le véhicule est en feu et contient des munitions. Abilita l'esplosione delle munizioni. Spara munizioni di proiettili quando il veicolo va a fuoco e contiene munizioni. 開啟彈藥殉爆效果。當一台載有彈藥的載具起火時, 將會有殉爆的效果 开启弹药殉爆效果。当一台载有弹药的载具起火时, 将会有殉爆的效果。 쿡오프 현상을 활성화 합니다. 이것은 탄약에 불이 붙어있는 동안 주변에 발사체를 발사합니다. + Активирует возгорание и детонацию боекомплекта в горящей технике + Permite que a munição cozinhe. Dispara projéteis de munição enquanto o veículo está em chamas e tem munição. + Zapíná vznícení munice. Vystřeluje projektily po dobu kdy vozidlo hoří a má munici. Ammunition cook off duration + Duración de la detonación inducida por calor de la munición Munitionsdurchzündungsdauer Czas trwania samozapłonu amunicji 弾薬の誘爆持続時間 - Durée de cook off des munitions + Durée d'auto-inflammation des munitions Durata esplosione munizioni 彈藥殉爆效果持續時間 弹药殉爆效果持续时间 쿡오프 지속 시간 + Длительность возгорания боеприпасов + Duração do cozinhamento de munição + Doba trvání vznícení munice Multiplier for how long cook off lasts [Setting to 0 will disable ammo cookoff] + Multiplicador de cuanto dura la detonación inducida por calor [Ponerlo a cero la deshabilita] Faktor für die Munitionsdurchzündungsdauer [0 zum Deaktivieren] - Multiplicateur de la durée du cook off des munitions [Une valeur de 0 désactive l'effet] + Multiplicateur permettant de régler la durée durant laquelle les munitions continuent d'exploser [Une valeur de 0 désactive l'auto-inflammation]. Mnożnik decydujący jak długo ma trwać samozapłon amunicji [Ustawienie na 0 spowoduje wyłącznie samozapłonu] 誘爆の持続時間を乗数で設定します。[0 に設定で誘爆を無効化] Moltiplicatore della durata dell'esplosione [Impostare 0 disabiliterà l'esplosione delle munizioni] 設定彈藥殉爆效果會持續多久時間 [輸入0來關閉殉爆效果] 设定弹药殉爆效果会持续多久时间 [输入0来关闭殉爆效果] 쿡오프 지속 시간의 배수 [0 이면 비활성] + Множитель длительности возгорания [0 - отключает возгорание боеприпасов] + Multiplicação da duração do cozinhamento [0 faz com que o cozinhamento seja desativado] + Multiplikátor doby trvání vznícení munice [Nastavte 0 pro vypnutí vznícení munice] Cook-off probability coefficient + Coeficiente de probabilidad de detonación inducida por calor 誘爆の可能性係数 Coefficiente probabilità esplosione Faktor für Wahrscheinlichkeit der Durchzündung 殉爆發生機率係數 殉爆发生机率系数 - Coefficient de probabilité du cook off + Coefficient de probabilité d'auto-inflammation Współczynnik prawdopodobieństwa samozapłonu + Коэффициент вероятности возгорания + Probabilidade de Cozinhar + Koeficient pravděpodobnosti vznícení munice Multiplier for cook-off probability. Higher value results in higher cook-off probability + Multiplicador de probabilidad de detonación inducida por calor. Valores más altos producen mayor probabilidad 誘爆する可能性の乗数。高い値では誘爆する可能性が高まります。 Moltiplicatore per la probabilità dell'esplosione. Un valore più alto aumenta la probabilità dell'esplosione Faktor für Wahrscheinlichkeit der Durchzündung. Ein höherer Wert führt zu höherer Durchzündungswahrscheinlichkeit. 調整殉爆發生機率係數。值越高代表越容易發生殉爆 调整殉爆发生机率系数。值越高代表越容易发生殉爆。 - Multiplicateur pour la probabilité du cook off. Plus la valeur est élevée, plus la probabilité de cook off est haute. + Multiplicateur de probabilité de l'auto-inflammation. Plus la valeur est élevée, plus la probabilité de combustion est grande. Mnożnik prawdopodobieństwa samozapłonu. Większa wartość oznacza większe prawdopodobieństwo samozapłonu + Множитель коэффициента вероятности возгорания. Чем выше значение, тем выше вероятность. + Multiplicador para a chance de cozinhamento. Valores mais altos aumentam as chances de ocorrer. + Multiplikátor pro pravděpodobnost vznícení munice. Vyšší hodnota znamená vyšší šanci vznícení munice. diff --git a/addons/csw/$PBOPREFIX$ b/addons/csw/$PBOPREFIX$ new file mode 100644 index 00000000000..366f3a56486 --- /dev/null +++ b/addons/csw/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\csw \ No newline at end of file diff --git a/addons/csw/Cfg3den.hpp b/addons/csw/Cfg3den.hpp new file mode 100644 index 00000000000..a72c585fded --- /dev/null +++ b/addons/csw/Cfg3den.hpp @@ -0,0 +1,43 @@ +class ctrlCombo; +class Cfg3DEN { + class Attributes { + class Default; + class Title: Default { + class Controls { + class Title; + }; + }; + class Combo: Title { + class Controls: Controls { + class Title: Title{}; + class Value; + }; + }; + class GVAR(assemblyModeControl): Combo { + class Controls: Controls { + class Title: Title {}; + class Value: Value { + class Items { + class Disable { + text = "$STR_DISABLED"; + value = 0; + }; + class Enable { + text = "$STR_CONFIG_JOYSTICK_ENABLED"; + value = 1; + }; + class EnableAndEmpty { + text = CSTRING(eden_enableAndEmpty); + value = 2; + }; + class Default { + text = "$STR_VEHICLE_DEFAULT"; + value = 3; + default = 1; + }; + }; + }; + }; + }; + }; +}; diff --git a/addons/csw/CfgEventHandlers.hpp b/addons/csw/CfgEventHandlers.hpp new file mode 100644 index 00000000000..afe6392a7c1 --- /dev/null +++ b/addons/csw/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; diff --git a/addons/csw/CfgMagazineGroups.hpp b/addons/csw/CfgMagazineGroups.hpp new file mode 100644 index 00000000000..2093253d042 --- /dev/null +++ b/addons/csw/CfgMagazineGroups.hpp @@ -0,0 +1,85 @@ +class GVAR(groups) { + // A3 .50 BMG (12.7x99mm) + class GVAR(100Rnd_127x99_mag) { + 500Rnd_127x99_mag = 1; + 200Rnd_127x99_mag = 1; + 100Rnd_127x99_mag = 1; + rhs_mag_100rnd_127x99_mag = 1; + rhs_mag_200rnd_127x99_mag = 1; + CUP_100Rnd_127x99_M = 1; + }; + class GVAR(100Rnd_127x99_mag_red) { + 500Rnd_127x99_mag_Tracer_Red = 1; + 200Rnd_127x99_mag_Tracer_Red = 1; + 100Rnd_127x99_mag_Tracer_Red = 1; + rhs_mag_100rnd_127x99_mag_Tracer_Red = 1; + rhs_mag_200rnd_127x99_mag_Tracer_Red = 1; + CUP_100Rnd_TE4_Red_Tracer_127x99_M = 1; + }; + class GVAR(100Rnd_127x99_mag_green) { + 500Rnd_127x99_mag_Tracer_Green = 1; + 200Rnd_127x99_mag_Tracer_Green = 1; + 100Rnd_127x99_mag_Tracer_Green = 1; + rhs_mag_100rnd_127x99_mag_Tracer_Green = 1; + CUP_100Rnd_TE4_Green_Tracer_127x99_M = 1; + }; + class GVAR(100Rnd_127x99_mag_yellow) { + 500Rnd_127x99_mag_Tracer_Yellow = 1; + 200Rnd_127x99_mag_Tracer_Yellow = 1; + 100Rnd_127x99_mag_Tracer_Yellow = 1; + rhs_mag_100rnd_127x99_mag_Tracer_Yellow = 1; + CUP_100Rnd_TE4_Yellow_Tracer_127x99_M = 1; + }; + + // Soviet HMG (12.7x108mm) + class GVAR(50Rnd_127x108_mag) { + rhs_mag_127x108mm_50 = 1; + rhs_mag_127x108mm_100 = 1; + rhs_mag_127x108mm_150 = 1; + rhs_mag_127x108mm_300 = 1; + CUP_150Rnd_127x108_KORD_M = 1; + CUP_50Rnd_127x108_KORD_M = 1; + CUP_50Rnd_TE3_LRT5_127x107_DSHKM_M = 1; // not sure why cup uses 107 for the DSHKM? + CUP_150Rnd_TE3_LRT5_127x107_DSHKM_M = 1; + }; + + // A3 20mm GMG + class GVAR(20Rnd_20mm_G_belt) { + 40Rnd_20mm_G_belt = 1; + 200Rnd_20mm_G_belt = 1; + }; + + // A3 82mm mortar shells (Allows the normal mk6 to be reloaded from the mk6 ammo handling mags) + class ACE_1Rnd_82mm_Mo_HE { + ACE_1Rnd_82mm_Mo_HE = 1; + 8Rnd_82mm_Mo_shells = 1; + rhs_12Rnd_m821_HE = 1; + rhs_mag_3vo18_10 = 1; + }; + class ACE_1Rnd_82mm_Mo_Smoke { + ACE_1Rnd_82mm_Mo_Smoke = 1; + 8Rnd_82mm_Mo_Smoke_white = 1; + rhs_mag_d832du_10 = 1; + }; + class ACE_1Rnd_82mm_Mo_Illum { + ACE_1Rnd_82mm_Mo_Illum = 1; + 8Rnd_82mm_Mo_Flare_white = 1; + rhs_mag_3vs25m_10 = 1; + }; + class ACE_1Rnd_82mm_Mo_HE_Guided { + ACE_1Rnd_82mm_Mo_HE_Guided = 1; + 8Rnd_82mm_Mo_guided = 1; + }; + class ACE_1Rnd_82mm_Mo_HE_LaserGuided { + ACE_1Rnd_82mm_Mo_HE_LaserGuided = 1; + 8Rnd_82mm_Mo_LG = 1; + }; + + // A3 Titans (Spike) - just use handheld magazines + class Titan_AT { + 1Rnd_GAT_missiles = 1; + }; + class Titan_AA { + 1Rnd_GAA_missiles = 1; + }; +}; diff --git a/addons/csw/CfgMagazines.hpp b/addons/csw/CfgMagazines.hpp new file mode 100644 index 00000000000..dc972a5a92a --- /dev/null +++ b/addons/csw/CfgMagazines.hpp @@ -0,0 +1,68 @@ +class CfgMagazines { + class 100Rnd_127x99_mag; + class GVAR(100Rnd_127x99_mag): 100Rnd_127x99_mag { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(127x99_displayName); + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa); + type = 256; + mass = 96; + ACE_isBelt = 1; + }; + + class 100Rnd_127x99_mag_Tracer_Red; + class GVAR(100Rnd_127x99_mag_red): 100Rnd_127x99_mag_Tracer_Red { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(127x99_red_displayName); + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa); + type = 256; + mass = 96; + ACE_isBelt = 1; + }; + + class 100Rnd_127x99_mag_Tracer_Green; + class GVAR(100Rnd_127x99_mag_green): 100Rnd_127x99_mag_Tracer_Green { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(127x99_green_displayName); + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa); + type = 256; + mass = 96; + ACE_isBelt = 1; + }; + + class 100Rnd_127x99_mag_Tracer_Yellow; + class GVAR(100Rnd_127x99_mag_yellow): 100Rnd_127x99_mag_Tracer_Yellow { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(127x99_yellow_displayName); + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa); + type = 256; + mass = 96; + ACE_isBelt = 1; + }; + + class 50Rnd_127x108_Ball; + class GVAR(50Rnd_127x108_mag): 50Rnd_127x108_Ball { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(127x108_displayName); + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa); + type = 256; + mass = 50; + ACE_isBelt = 1; + }; + + class 40Rnd_20mm_G_belt; + class GVAR(20Rnd_20mm_G_belt): 40Rnd_20mm_G_belt { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(GMGBelt_displayName); + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa); + type = 256; + count = 20; + mass = 96; + ACE_isBelt = 1; + }; +}; diff --git a/addons/csw/CfgVehicles.hpp b/addons/csw/CfgVehicles.hpp new file mode 100644 index 00000000000..4a1d63eb0c4 --- /dev/null +++ b/addons/csw/CfgVehicles.hpp @@ -0,0 +1,276 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class GVAR(deploy) { + displayName = CSTRING(PlaceTripod_displayName); + condition = QUOTE(call FUNC(assemble_canDeployTripod)); + statement = QUOTE(call FUNC(assemble_deployTripod)); + exceptions[] = {}; + }; + }; + }; + + + // Tripods: + class ThingX; + class GVAR(baseTripod): ThingX { + side = 3; + typicalCargo[] = {}; + armor = 500000; + mapSize = 0.4; + nameSound = "Bunker"; + accuracy = 1000; + destrType = "DestructDefault"; + + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0, 2, 0}; + EGVAR(dragging,canCarry) = 1; + EGVAR(dragging,carryPosition)[] = {0, 2, 0}; + + class ACE_Actions { + class ACE_MainActions { + displayName = CSTRING(genericTripod_displayName); + selection = ""; + distance = 2.5; + condition = "true"; + class GVAR(pickUp) { + displayName = CSTRING(Pickup_displayName); + condition = QUOTE(call FUNC(assemble_canPickupTripod)); + statement = QUOTE(call FUNC(assemble_pickupTripod)); + }; + class GVAR(mountWeapon) { + displayName = CSTRING(MountWeapon_displayName); + condition = QUOTE(call FUNC(assemble_canDeployWeapon)); + statement = QUOTE(call FUNC(assemble_deployWeapon)); + modifierFunction = QUOTE(call FUNC(assemble_deployWeaponModifier)); + }; + }; + }; + }; + class GVAR(m3Tripod): GVAR(baseTripod) { + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_m3_tripod.p3d); + editorPreview = QPATHTOF(data\ace_csw_m3Tripod.jpg); + displayName = CSTRING(m3Tripod_displayName); + class ADDON { + disassembleTo = QGVAR(m3CarryTripod); + }; + }; + class GVAR(m3TripodLow): GVAR(m3Tripod) { + class ADDON { + disassembleTo = QGVAR(m3CarryTripodLow); + }; + }; + class GVAR(kordTripod): GVAR(baseTripod) { + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ace_csw_tripod_kord.p3d); + editorPreview = QPATHTOF(data\ace_csw_kordTripod.jpg); + displayName = CSTRING(kordTripod_displayName); + class ADDON { + disassembleTo = QGVAR(kordCarryTripod); + }; + }; + class GVAR(kordTripodLow): GVAR(kordTripod) { + class ADDON { + disassembleTo = QGVAR(kordCarryTripodLow); + }; + }; + class GVAR(sag30Tripod): GVAR(baseTripod) { + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ace_csw_tripod_ags30.p3d); + editorPreview = QPATHTOF(data\ace_csw_sag30Tripod.jpg); + displayName = CSTRING(sag30Tripod_displayName); + class ADDON { + disassembleTo = QGVAR(sag30CarryTripod); + }; + }; + class GVAR(m220Tripod): GVAR(baseTripod) { + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ace_csw_tripod_m220.p3d); + editorPreview = QPATHTOF(data\ace_csw_m220Tripod.jpg); + displayName = CSTRING(m220Tripod_displayName); + class ADDON { + disassembleTo = QGVAR(m220CarryTripod); + }; + }; + class GVAR(spg9Tripod): GVAR(baseTripod) { + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ace_csw_tripod_spg9.p3d); + editorPreview = QPATHTOF(data\ace_csw_spg9Tripod.jpg); + displayName = CSTRING(spg9_Tripod); + class ADDON { + disassembleTo = QGVAR(spg9CarryTripod); + }; + }; + class GVAR(mortarBaseplate): GVAR(baseTripod) { + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_mortarBaseplate.p3d); + editorPreview = QPATHTOF(data\ace_csw_mortarBaseplate.jpg); + displayName = CSTRING(mortarBaseplate_displayName); + class ADDON { + disassembleTo = QGVAR(carryMortarBaseplate); + }; + }; + + + // Static Weapons: + class LandVehicle; + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions { + class GVAR(getIn) { + displayName = CSTRING(GetIn_displayName); + condition = QUOTE(call FUNC(canGetIn)); + statement = QUOTE(call FUNC(getIn)); + }; + }; + }; + }; + + class StaticMGWeapon: StaticWeapon {}; + + class HMG_01_base_F: StaticMGWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(HMG_Static); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticHMGCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3TripodLow); // turret [CfgVehicles] + desiredAmmo = 100; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + class HMG_01_high_base_F: HMG_01_base_F { + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(HMG_Static); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticHMGCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3Tripod); // turret [CfgVehicles] + desiredAmmo = 100; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + class HMG_01_A_base_F: HMG_01_base_F { + class ADDON { + enabled = 0; + }; + }; + + class HMG_02_base_F: StaticMGWeapon { + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(HMG_M2_Mounted); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticM2ShieldCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3TripodLow); // turret [CfgVehicles] + desiredAmmo = 100; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + class HMG_02_high_base_F: HMG_02_base_F { + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(HMG_M2_Mounted); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticM2ShieldCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3Tripod); // turret [CfgVehicles] + desiredAmmo = 100; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + + class GMG_TriPod; + class GMG_01_base_F: GMG_TriPod { + // ENABLE_CSW_ATTRIBUTE; + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(GMG_20mm); // Weapon Proxy (Shorter Reload Time) [CfgWeapons] + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticGMGCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3TripodLow); // turret [CfgVehicles] + desiredAmmo = 40; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + class GMG_01_high_base_F: GMG_01_base_F { + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(GMG_20mm); // Weapon Proxy (Shorter Reload Time) [CfgWeapons] + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticGMGCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3Tripod); // turret [CfgVehicles] + desiredAmmo = 40; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + class GMG_01_A_base_F: GMG_01_base_F { + class ADDON { + enabled = 0; + }; + }; + + + class AT_01_base_F: StaticMGWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(Titan_AT_Static); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticATCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3Tripod); // turret [CfgVehicles] + desiredAmmo = 40; + ammoLoadTime = 15; // 4 rounds per minute + ammoUnloadTime = 10; + }; + }; + + class AA_01_base_F: StaticMGWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ADDON { + enabled = 1; + proxyWeapon = QGVAR(Titan_AA_Static); // Weapon Proxy (Shorter Reload Time) [CfgWeapons] + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(staticAACarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(m3Tripod); // turret [CfgVehicles] + desiredAmmo = 40; + ammoLoadTime = 15; // 4 rounds per minute + ammoUnloadTime = 10; + }; + }; + + + class StaticMortar: StaticWeapon {}; + class Mortar_01_base_F: StaticMortar { + // ENABLE_CSW_ATTRIBUTE; + class ADDON { + enabled = 1; + magazineLocation = ""; + disassembleWeapon = QGVAR(staticMortarCarry); // carry weapon [CfgWeapons] + disassembleTurret = QGVAR(mortarBaseplate); // turret [CfgVehicles] + desiredAmmo = 1; + ammoLoadTime = 3; + ammoUnloadTime = 3; + }; + }; +}; + diff --git a/addons/csw/CfgWeapons.hpp b/addons/csw/CfgWeapons.hpp new file mode 100644 index 00000000000..5c4e9c8f2f9 --- /dev/null +++ b/addons/csw/CfgWeapons.hpp @@ -0,0 +1,294 @@ +class CfgWeapons { + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + // Tripods: + class GVAR(m3CarryTripod): Launcher_Base_F { + class ADDON { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = QGVAR(m3Tripod); + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 440; + }; + displayName = CSTRING(m3TripodFolded_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\Tripod_Icon.paa); + }; + class GVAR(m3CarryTripodLow): GVAR(m3CarryTripod) { + class ADDON: ADDON { + deploy = QGVAR(m3TripodLow); + }; + displayName = CSTRING(m3TripodLowFolded_displayName); + author = ECSTRING(common,ACETeam); + }; + + class GVAR(kordCarryTripod): Launcher_Base_F { + class ADDON { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = QGVAR(kordTripod); + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 350; + }; + displayName = CSTRING(kordTripodFolded_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\Tripod_Icon.paa); + }; + + class GVAR(kordCarryTripodLow): GVAR(kordCarryTripod) { + class ADDON: ADDON { + deploy = QGVAR(kordTripodLow); + }; + displayName = CSTRING(kordTripodFoldedLow_displayName); + author = ECSTRING(common,ACETeam); + }; + + class GVAR(m220CarryTripod): Launcher_Base_F { + class ADDON { + type = "mount"; + deployTime = 10; + pickupTime = 6; + deploy = QGVAR(m220Tripod); + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 210; + }; + displayName = CSTRING(m220TripodFolded_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\Tripod_Icon.paa); + }; + + class GVAR(spg9CarryTripod): Launcher_Base_F { + class ADDON { + type = "mount"; + deployTime = 5; + pickupTime = 3; + deploy = QGVAR(spg9Tripod); + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 260; + }; + displayName = CSTRING(spg9_TripodFolded); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\Tripod_Icon.paa); + }; + + class GVAR(sag30CarryTripod): Launcher_Base_F { + class ADDON { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = QGVAR(sag30Tripod); + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 260; + }; + displayName = CSTRING(sag30TripodFolded_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\Tripod_Icon.paa); + }; + + class GVAR(carryMortarBaseplate): Launcher_Base_F { + class ADDON { + type = "mount"; + deployTime = 2; + pickupTime = 2; + deploy = QGVAR(mortarBaseplate); + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 290; // M3A1 baseblate weight + }; + displayName = CSTRING(mortarBaseplateBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\Tripod_Icon.paa); // todo + }; + + // Weapons: + class GVAR(staticATCarry): Launcher_Base_F { + class ADDON { + type = "weapon"; + deployTime = 15; + pickupTime = 20; + class assembleTo { + GVAR(m3Tripod) = "B_static_AT_F"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 320; // 9M113 Konkurs Weight + }; + displayName = CSTRING(StaticATBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\StaticAT_Icon.paa); + }; + + class GVAR(staticAACarry): GVAR(staticATCarry) { + class ADDON: ADDON { + class assembleTo { + GVAR(m3Tripod) = "B_static_AA_F"; + }; + }; + displayName = CSTRING(StaticAABag_displayName); + author = ECSTRING(common,ACETeam); + }; + + class GVAR(staticHMGCarry): Launcher_Base_F { + class ADDON { + type = "weapon"; + deployTime = 7; + pickupTime = 10; + class assembleTo { + GVAR(m3Tripod) = "B_HMG_01_high_F"; + GVAR(m3TripodLow) = "B_HMG_01_F"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 840; + }; + displayName = CSTRING(StaticHMGBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\StaticHGMG_Icon.paa); + }; + class GVAR(staticM2ShieldCarry): GVAR(staticHMGCarry) { + class ADDON: ADDON { + class assembleTo { + GVAR(m3Tripod) = "B_HMG_02_high_F"; + GVAR(m3TripodLow) = "B_HMG_02_F"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 1000; + }; + displayName = CSTRING(StaticM2ShieldBag_displayName); + author = ECSTRING(common,ACETeam); + picture = QPATHTOF(UI\StaticM2Shield_Icon_ca.paa); + }; + + class GVAR(staticGMGCarry): Launcher_Base_F { + class ADDON { + type = "weapon"; + deployTime = 5; + pickupTime = 6; + class assembleTo { + GVAR(m3Tripod) = "B_GMG_01_high_F"; + GVAR(m3TripodLow) = "B_GMG_01_F"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 780; + }; + displayName = CSTRING(StaticGMGBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\StaticHGMG_Icon.paa); + }; + + class GVAR(staticMortarCarry): Launcher_Base_F { + class ADDON { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + class assembleTo { + GVAR(mortarBaseplate) = "B_Mortar_01_F"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 620; // M252 Mortar Weight + }; + displayName = CSTRING(mk6MortarBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\StaticMortarTube_Icon.paa); + }; + + // Proxy Weapons + CREATE_CSW_PROXY(HMG_Static); + CREATE_CSW_PROXY(HMG_M2_Mounted); + CREATE_CSW_PROXY(GMG_20mm); + + class missiles_titan_static; + class EGVAR(javelin,Titan_Static): missiles_titan_static {}; // if ace_javelin does not exist, this will just inherit from the base weapon + class GVAR(Titan_AT_Static): EGVAR(javelin,Titan_Static) { + EGVAR(javelin,enabled) = 1; // needs to be explicitly enabled + magazineReloadTime = 0.5; + }; + class GVAR(Titan_AA_Static) : missiles_titan_static { + magazineReloadTime = 0.5; + }; + + /* + class GVAR(staticAutoHMGCarry): Launcher_Base_F { + class ADDON { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + GVAR(m3Tripod) = GVAR(staticAutoHMGWeapon); + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 840; + }; + + displayName = CSTRING(StaticAutoHMGBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\StaticHGMG_Icon.paa); + }; + + class GVAR(staticAutoGMGCarry): Launcher_Base_F { + class GVAR(options) { + assembleTo = QGVAR(staticAutoGMGWeapon); + baseTripod = QGVAR(m3Tripod); + type = "weapon"; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 780; + }; + + displayName = CSTRING(StaticAutoGMGBag_displayName); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\StaticHGMG_Icon.paa); + }; + + */ +}; diff --git a/addons/csw/README.md b/addons/csw/README.md new file mode 100644 index 00000000000..8729a7fa31c --- /dev/null +++ b/addons/csw/README.md @@ -0,0 +1,12 @@ +ace_csw +=============== + +Crew Served Weapons - Static weapons that are served by multiple people + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [TCVM](https://github.com/TheCandianVendingMachine) + diff --git a/addons/csw/UI/StaticAT_Icon.paa b/addons/csw/UI/StaticAT_Icon.paa new file mode 100644 index 00000000000..6dcf90093a1 Binary files /dev/null and b/addons/csw/UI/StaticAT_Icon.paa differ diff --git a/addons/csw/UI/StaticHGMG_Icon.paa b/addons/csw/UI/StaticHGMG_Icon.paa new file mode 100644 index 00000000000..12143ee2e12 Binary files /dev/null and b/addons/csw/UI/StaticHGMG_Icon.paa differ diff --git a/addons/csw/UI/StaticM2Shield_Icon_ca.paa b/addons/csw/UI/StaticM2Shield_Icon_ca.paa new file mode 100644 index 00000000000..ba1788f7879 Binary files /dev/null and b/addons/csw/UI/StaticM2Shield_Icon_ca.paa differ diff --git a/addons/csw/UI/StaticMortarTube_Icon.paa b/addons/csw/UI/StaticMortarTube_Icon.paa new file mode 100644 index 00000000000..2420ce7e4f6 Binary files /dev/null and b/addons/csw/UI/StaticMortarTube_Icon.paa differ diff --git a/addons/csw/UI/Tripod_Icon.paa b/addons/csw/UI/Tripod_Icon.paa new file mode 100644 index 00000000000..02429a0e6da Binary files /dev/null and b/addons/csw/UI/Tripod_Icon.paa differ diff --git a/addons/csw/UI/ammoBox_50bmg_ca.paa b/addons/csw/UI/ammoBox_50bmg_ca.paa new file mode 100644 index 00000000000..6ceaa76fe07 Binary files /dev/null and b/addons/csw/UI/ammoBox_50bmg_ca.paa differ diff --git a/addons/csw/XEH_PREP.hpp b/addons/csw/XEH_PREP.hpp new file mode 100644 index 00000000000..7bde8c3c0fd --- /dev/null +++ b/addons/csw/XEH_PREP.hpp @@ -0,0 +1,34 @@ +TRACE_1("",QUOTE(ADDON)); + +PREP(aceRearmGetCarryMagazines); + +PREP(ai_handleFired); + +PREP(assemble_canDeployTripod); +PREP(assemble_canDeployWeapon); +PREP(assemble_canPickupTripod); +PREP(assemble_canPickupWeapon); +PREP(assemble_deployTripod); +PREP(assemble_deployWeapon); +PREP(assemble_deployWeaponModifier); +PREP(assemble_pickupTripod); +PREP(assemble_pickupWeapon); + +PREP(canGetIn); +PREP(getIn); + +PREP(proxyWeapon); + +PREP(reload_actionsLoad); +PREP(reload_actionsUnload); +PREP(reload_canLoadMagazine); +PREP(reload_canUnloadMagazine); +PREP(reload_getLoadableMagazines); +PREP(reload_getVehicleMagazine); +PREP(reload_handleAddTurretMag); +PREP(reload_handleRemoveTurretMag); +PREP(reload_handleReturnAmmo); +PREP(reload_loadMagazine); + +PREP(staticWeaponInit); +PREP(staticWeaponInit_unloadExtraMags); diff --git a/addons/csw/XEH_postInit.sqf b/addons/csw/XEH_postInit.sqf new file mode 100644 index 00000000000..69137296c5c --- /dev/null +++ b/addons/csw/XEH_postInit.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" + +GVAR(vehicleMagCache) = call CBA_fnc_createNamespace; + +["ace_settingsInitialized", { + TRACE_3("settingsInit",GVAR(defaultAssemblyMode),GVAR(handleExtraMagazines),GVAR(ammoHandling)); + ["StaticWeapon", "init", LINKFUNC(staticWeaponInit), true, [], true] call CBA_fnc_addClassEventHandler; +}] call CBA_fnc_addEventHandler; + + +// Event handlers: +[QGVAR(disableVanillaAssembly), { + params ["_staticWeapon"]; + TRACE_1("disableVanillaAssembly eh",_staticWeapon); + _staticWeapon enableWeaponDisassembly false; +}] call CBA_fnc_addEventHandler; + +[QGVAR(addTurretMag), LINKFUNC(reload_handleAddTurretMag)] call CBA_fnc_addEventHandler; +[QGVAR(removeTurretMag), LINKFUNC(reload_handleRemoveTurretMag)] call CBA_fnc_addEventHandler; +[QGVAR(returnAmmo), LINKFUNC(reload_handleReturnAmmo)] call CBA_fnc_addEventHandler; + + + +#ifdef DEBUG_MODE_FULL +call compile preprocessFileLineNumbers QPATHTOF(dev\checkStaticWeapons.sqf); +#endif diff --git a/addons/csw/XEH_preInit.sqf b/addons/csw/XEH_preInit.sqf new file mode 100644 index 00000000000..6ecb2a0c2fb --- /dev/null +++ b/addons/csw/XEH_preInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +GVAR(initializedStaticTypes) = []; + +ADDON = true; + diff --git a/addons/medical_menu/XEH_preStart.sqf b/addons/csw/XEH_preStart.sqf similarity index 100% rename from addons/medical_menu/XEH_preStart.sqf rename to addons/csw/XEH_preStart.sqf diff --git a/addons/csw/config.cpp b/addons/csw/config.cpp new file mode 100644 index 00000000000..47f8313668c --- /dev/null +++ b/addons/csw/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" +#include "script_config_macros_csw.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {"ace_csw_carryTripod", "ace_csw_staticATWeapon"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author = ECSTRING(common,ACETeam); + authors[] = {"TCVM"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "Cfg3den.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "CfgMagazines.hpp" +#include "CfgMagazineGroups.hpp" diff --git a/addons/csw/data/ace_csw_kordTripod.jpg b/addons/csw/data/ace_csw_kordTripod.jpg new file mode 100644 index 00000000000..3ada21fea99 Binary files /dev/null and b/addons/csw/data/ace_csw_kordTripod.jpg differ diff --git a/addons/csw/data/ace_csw_m220Tripod.jpg b/addons/csw/data/ace_csw_m220Tripod.jpg new file mode 100644 index 00000000000..51bf226c700 Binary files /dev/null and b/addons/csw/data/ace_csw_m220Tripod.jpg differ diff --git a/addons/csw/data/ace_csw_m3Tripod.jpg b/addons/csw/data/ace_csw_m3Tripod.jpg new file mode 100644 index 00000000000..0908470ce64 Binary files /dev/null and b/addons/csw/data/ace_csw_m3Tripod.jpg differ diff --git a/addons/csw/data/ace_csw_mortarBaseplate.jpg b/addons/csw/data/ace_csw_mortarBaseplate.jpg new file mode 100644 index 00000000000..4f5b5797569 Binary files /dev/null and b/addons/csw/data/ace_csw_mortarBaseplate.jpg differ diff --git a/addons/csw/data/ace_csw_sag30Tripod.jpg b/addons/csw/data/ace_csw_sag30Tripod.jpg new file mode 100644 index 00000000000..d8000e57eed Binary files /dev/null and b/addons/csw/data/ace_csw_sag30Tripod.jpg differ diff --git a/addons/csw/data/ace_csw_spg9Tripod.jpg b/addons/csw/data/ace_csw_spg9Tripod.jpg new file mode 100644 index 00000000000..1944c26b735 Binary files /dev/null and b/addons/csw/data/ace_csw_spg9Tripod.jpg differ diff --git a/addons/csw/data/model.cfg b/addons/csw/data/model.cfg new file mode 100644 index 00000000000..7adabdac109 --- /dev/null +++ b/addons/csw/data/model.cfg @@ -0,0 +1,69 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ACE_CSW_Tripod_Skeleton: Default {}; + class ACE_CSW_M3_Tripod_Skeleton: Default {}; + class ace_csw_tripod_ags30_Skeleton: Default {}; + class ace_csw_tripod_kord_Skeleton: Default {}; + class ace_csw_tripod_m122_Skeleton: Default {}; + class ace_csw_tripod_m220_Skeleton: Default {}; + class ace_csw_tripod_spg9_Skeleton: Default {}; + class ACE_CSW_WeaponBag_Skeleton: Default {}; + class ACE_CSW_mortarBaseplate_Skeleton: Default {}; +}; +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = ""; + }; + class ACE_CSW_Tripod : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ACE_CSW_Tripod_Skeleton"; + }; + class ACE_CSW_M3_Tripod : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ACE_CSW_M3_Tripod_Skeleton"; + }; + class ace_csw_tripod_ags30 : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ace_csw_tripod_ags30_Skeleton"; + }; + class ace_csw_tripod_kord : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ace_csw_tripod_kord_Skeleton"; + }; + class ace_csw_tripod_m122 : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ace_csw_tripod_m122_Skeleton"; + }; + class ace_csw_tripod_m220 : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ace_csw_tripod_m220_Skeleton"; + }; + class ace_csw_tripod_spg9 : Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ace_csw_tripod_spg9_Skeleton"; + }; + class ACE_CSW_Bag: Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ACE_CSW_WeaponBag_Skeleton"; + }; + class ACE_CSW_mortarBaseplate: Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = "ACE_CSW_mortarBaseplate_Skeleton"; + }; +}; + diff --git a/addons/csw/dev/checkStaticWeapons.sqf b/addons/csw/dev/checkStaticWeapons.sqf new file mode 100644 index 00000000000..5a6f8d2b903 --- /dev/null +++ b/addons/csw/dev/checkStaticWeapons.sqf @@ -0,0 +1,76 @@ +#define DEBUG_MODE_FULL +#include "\z\ace\addons\csw\script_component.hpp" + +// Dev only function to search for weapons used by static weapons +// and check if their magazinese are compatible +INFO("Checking static weapons"); + +private _staticWeaponConfigs = configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(configName _x) isKindOf 'StaticWeapon'}", true]; +private _staticPublic = _staticWeaponConfigs select {(getNumber (_x >> "scope")) == 2}; +INFO_2("Static Weapons [%1] - CSW Enabled [%2]",count _staticPublic, {(getNumber (_x >> "ace_csw" >> "enabled")) == 1} count _staticPublic); + +INFO("------ Checking static weapons inheritance ------"); +private _explicitBases = []; +private _inherited = []; +{ + private _config = _x; + private _configEnabled = (getNumber (_config >> "ace_csw" >> "enabled")) == 1; + if (_configEnabled) then { + private _configExplicit = (count configProperties [_config, "configName _x == 'ace_csw'", false]) == 1; + if (_configExplicit) then { + _explicitBases pushBack (configName _config); + _inherited pushBack []; + } else { + if ((getNumber (_config >> "scope")) < 2) exitWith {}; + private _parent = inheritsFrom _config; + while {isClass _parent} do { + private _className = configName _parent; + private _index = _explicitBases findIf {_className == _x}; + if (_index > -1) exitWith { + (_inherited select _index) pushBack (configName _config); + }; + _parent = inheritsFrom _parent; + }; + }; + }; +} forEach _staticWeaponConfigs; +{ + INFO_2("%1 inherited by %2",_x,_inherited select _forEachIndex); +} forEach _explicitBases; + + + + +INFO("------ Logging static magazines with no carry version -------"); +private _hash = [] call CBA_fnc_hashCreate; +// private _logAll = true; // logs all possible weapon magazines (even if not used in a static weapon) +private _logAll = false; +{ + private _vehicleType = configName _x; + private _turretConfig = [_vehicleType, [0]] call CBA_fnc_getTurret; + private _weapons = getArray (_turretConfig >> "weapons"); + private _loadedMags = getArray (_turretConfig >> "magazines"); + { + private _weapMags = getArray (configFile >> "CfgWeapons" >> _x >> "magazines"); + { + private _xMag = _x; + private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + private _carryMag = configName (_groups param [0, configNull]); + if ((_carryMag == "") && {_logAll || {_xMag in _loadedMags}}) then { + private _vehs = [_hash, _xMag] call CBA_fnc_hashGet; + if (isNil "_vehs") then {_vehs = [];}; + if (_xMag in _loadedMags) then { + _vehs pushBack _vehicleType; + }; + [_hash, _xMag, _vehs] call CBA_fnc_hashSet; + }; + } forEach _weapMags; + } forEach _weapons; +} forEach _staticWeaponConfigs; + +[_hash, { + //IGNORE_PRIVATE_WARNING ["_key", "_value"]; + INFO_2("[%1] has no carry varient - Used in %2",_key,_value); +}] call CBA_fnc_hashEachPair; + +INFO("------ End -------"); diff --git a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf new file mode 100644 index 00000000000..09ea4be8f8d --- /dev/null +++ b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Helper function for ace_rearm; Gets magazines that should be loaded by csw + * + * Arguments: + * 0: Vehicle + * 1: Specific Turret or pass bool to check all turrets (default: true) + * + * Return Value: + * [0: compatible veh mags, 1: carry mags] + * + * Example: + * [cursorObject, [0]] call ace_csw_fnc_aceRearmGetCarryMagazines + * + * Public: No + */ + +params ["_vehicle", ["_targetTurret", true, [[], true]]]; + +if (!(_vehicle isKindOf "StaticWeapon")) exitWith { [[],[]] }; // limit to statics for now +// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] +if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_vehicle getVariable [QGVAR(assemblyMode), 3]))}) exitWith { [[],[]] }; + +private _turretMagsCSW = []; +private _allCarryMags = []; +{ + private _turretPath = _x; + if ((_targetTurret isEqualTo true) || {_turretPath isEqualTo _targetTurret}) then { + { + private _weapon = _x; + { + private _xMag = _x; + private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; + if (isNil "_carryMag") then { + private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + _carryMag = configName (_groups param [0, configNull]); + GVAR(vehicleMagCache) setVariable [_x, _carryMag]; + TRACE_2("setting cache",_xMag,_carryMag); + }; + if (_carryMag != "") then { + _turretMagsCSW pushBackUnique _xMag; + _allCarryMags pushBackUnique _carryMag; + }; + } forEach ([_weapon] call CBA_fnc_compatibleMagazines); + } forEach (_vehicle weaponsTurret _turretPath); + }; +} forEach (allTurrets _vehicle); + +[_turretMagsCSW, _allCarryMags] diff --git a/addons/csw/functions/fnc_ai_handleFired.sqf b/addons/csw/functions/fnc_ai_handleFired.sqf new file mode 100644 index 00000000000..f85c74fd207 --- /dev/null +++ b/addons/csw/functions/fnc_ai_handleFired.sqf @@ -0,0 +1,96 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Initializes weapon to disable weapon disassembling + * + * Arguments: + * 0: Weapon + * + * Return Value: + * None + * + * Example: + * [weapon] call ace_csw_fnc_ai_handleFired + * + * Public: No + */ + +params ["_staticWeapon", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"]; +TRACE_8("firedEH:",_staticWeapon, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _gunner); + +if ((!local _gunner) || {[_gunner] call EFUNC(common,isPlayer)}) exitWith {}; +if (someAmmo _staticWeapon) exitWith {}; + +TRACE_2("need ammo",someAmmo _staticWeapon,magazinesAllTurrets _staticWeapon); + +private _turretPath = [_gunner] call EFUNC(common,getTurretIndex); +private _reloadSource = objNull; +private _reloadMag = ""; +private _reloadNeededAmmo = -1; + +// Find if there is anything we can reload with +{ + scopeName "findSource"; + private _xSource = _x; + + private _cswMagazines = []; + { + if (isClass (configFile >> QGVAR(groups) >> _x)) then { _cswMagazines pushBackUnique _x; }; + } forEach (if (_xSource isKindOf "CaManBase") then {magazines _x} else {magazineCargo _x}); + TRACE_2("",_xSource,_cswMagazines); + + private _compatibleMags = [_magazine] + ([_weapon] call CBA_fnc_compatibleMagazines); // Check current mag first + + { + private _xWeaponMag = _x; + { + if ((getNumber (configFile >> QGVAR(groups) >> _x >> _xWeaponMag)) == 1) then { + private _loadInfo = [_staticWeapon, _turretPath, _reloadMag, objNull] call FUNC(reload_canLoadMagazine); + if (_loadInfo select 0) then { + _reloadMag = _x; + _reloadSource = _xSource; + _reloadNeededAmmo = _loadInfo select 2; + TRACE_3("found mag",_reloadMag,_reloadSource,_x); + breakOut "findSource"; + }; + }; + } forEach _cswMagazines; + } forEach _compatibleMags; +} forEach ([_gunner] + (_staticWeapon nearEntities [["groundWeaponHolder", "ReammoBox_F"], 10])); +if (_reloadMag == "") exitWith {TRACE_1("could not find mag",_reloadMag);}; + +// Figure out what we can add from the magazines we have +private _bestAmmoToSend = -1; +{ + _x params ["_xMag", "_xAmmo"]; + TRACE_2("",_xMag,_xAmmo); + if (_xMag == _reloadMag) then { + if ((_bestAmmoToSend == -1) || {(_xAmmo > _bestAmmoToSend) && {_xAmmo <= _reloadNeededAmmo}}) then { + _bestAmmoToSend = _xAmmo; + }; + }; +} forEach (if (_reloadSource isKindOf "CaManBase") then {magazinesAmmo _reloadSource} else {magazinesAmmoCargo _reloadSource}); +TRACE_4("",_reloadSource,_reloadMag,_reloadNeededAmmo,_bestAmmoToSend); +if (_bestAmmoToSend == -1) exitWith {ERROR("No ammo");}; + +// Remove the mag from the source +if (_reloadSource isKindOf "CaManBase") then { + [_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); +} else { + [_reloadSource, _reloadMag, 1, _bestAmmoToSend] call CBA_fnc_removeMagazineCargo; +}; + +private _timeToLoad = 1; +if (!isNull(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "ammoLoadTime")) then { + _timeToLoad = getNumber(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "ammoLoadTime"); +}; + +TRACE_1("Reloading in progress",_timeToLoad); +[{ + params ["_staticWeapon", "_turretPath", "_gunner", "_reloadMag", "_bestAmmoToSend"]; + if ((!alive _staticWeapon) || {!alive _gunner} || {(_staticWeapon distance _gunner) > 10}) exitWith {TRACE_1("invalid state",_this);}; + + // Reload the static weapon + TRACE_5("calling addTurretMag event",_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend); + [QGVAR(addTurretMag), _this] call CBA_fnc_globalEvent; +}, [_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend], _timeToLoad] call CBA_fnc_waitAndExecute; diff --git a/addons/csw/functions/fnc_assemble_canDeployTripod.sqf b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf new file mode 100644 index 00000000000..0701d049b26 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Checks if the player can deploy the tripod. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Can deploy + * + * Example: + * [player] call ace_csw_fnc_assemble_canDeployTripod + * + * Public: No + */ + +params ["_player"]; + +(getText(configFile >> "CfgWeapons" >> (secondaryWeapon _player) >> QUOTE(ADDON) >> "type") == "mount") + diff --git a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf new file mode 100644 index 00000000000..b0659e2f010 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Checks if you can deploy a weapon on the tripod + * + * Arguments: + * 0: Target Tripod + * 0: Player + * + * Return Value: + * Wether or not you can deploy the weapon + * + * Example: + * [cursorObject, player] call ace_csw_fnc_assemble_canDeployWeapon + * + * Public: No + */ + +params ["_target", "_player", "", "_carryWeaponClassname"]; +if (isNil "_carryWeaponClassname") then { _carryWeaponClassname = secondaryWeapon _player }; + +// If the current launcher has a config-value that defines the tripod, it is a CSW +(alive _target) && +{(getText(configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "assembleTo" >> (typeOf _target))) != ""} + diff --git a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf new file mode 100644 index 00000000000..a5cd0d5c0c6 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Checks if the player can pick-up the tripod. + * + * Arguments: + * 0: Tripod + * 1: Unit + * + * Return Value: + * Can pickup + * + * Example: + * [tripod, player] call ace_csw_fnc_assemble_canPickupTripod + * + * Public: No + */ + +params ["_tripod", "_player"]; + +((secondaryWeapon _player) isEqualTo "") && {alive _tripod} + diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf new file mode 100644 index 00000000000..ef40e03b3cc --- /dev/null +++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * If the CSW is mounted or in use this will not allow you to dismount the weapon + * + * Arguments: + * 0: Static Weapon + * + * Return Value: + * Can Dismount + * + * Example: + * [cursorObject] call ace_csw_fnc_assemble_canPickupWeapon + * + * Public: No + */ + +params ["_staticWeapon"]; + +// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] +private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 3]); +private _notCrewed = (crew _staticWeapon) isEqualTo []; +private _deadCrew = !(alive (gunner _staticWeapon)); // need to eject body??? + +_assemblyMode && {_notCrewed || _deadCrew} + diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf new file mode 100644 index 00000000000..d1392f5bacc --- /dev/null +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Deploys the tripod + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_csw_fnc_assemble_deployTripod + * + * Public: No + */ + +[{ + params ["_player"]; + TRACE_1("assemble_deployTripod",_player); + + // Remove the tripod from the launcher slot + private _secondaryWeaponClassname = secondaryWeapon _player; + _player removeWeaponGlobal (secondaryWeapon _player); + + private _onFinish = { + params ["_args"]; + _args params ["_player", "_secondaryWeaponClassname"]; + TRACE_2("deployTripod finish",_player,_secondaryWeaponClassname); + + private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy"); + + // Create a tripod + private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"]; + // Because the tripod can be a "full weapon" we disable any data that will allow it to be loaded + _cswTripod setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set enabled&unload assembly mode and broadcast + if (!GVAR(defaultAssemblyMode)) then { + TRACE_1("global disableVanillaAssembly event",_cswTripod); // handles it being assembled when setting is disabled + [QGVAR(disableVanillaAssembly), [_cswTripod]] call CBA_fnc_globalEvent; + }; + + private _posATL = _player getRelPos [2, 0]; + _posATL set [2, ((getPosATL _player) select 2) + 0.5]; + + _cswTripod setDir (direction _player); + _cswTripod setPosATL _posATL; + _cswTripod setVectorUp (surfaceNormal _posATL); + + [_player, "PutDown"] call EFUNC(common,doGesture); + + // drag after deploying + if ((missionNamespace getVariable [QGVAR(dragAfterDeploy), false]) && {["ACE_dragging"] call EFUNC(common,isModLoaded)}) then { + if ([_player, _cswTripod] call EFUNC(dragging,canCarry)) then { + TRACE_1("starting carry",_cswTripod); + [_player, _cswTripod] call EFUNC(dragging,startCarry); + } else { + TRACE_1("cannot carry",_cswTripod); + }; + }; + }; + + private _onFailure = { + params ["_args"]; + _args params ["_player", "_secondaryWeaponClassname"]; + TRACE_2("deployTripod failure",_player,_secondaryWeaponClassname); + + _player addWeaponGlobal _secondaryWeaponClassname; + }; + + private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); + [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); +}, _this] call CBA_fnc_execNextFrame; diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf new file mode 100644 index 00000000000..12091b81ba9 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -0,0 +1,78 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Deploys the current CSW + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_csw_fnc_assemble_deployWeapon + * + * Public: No + */ + +[{ + params ["_tripod", "_player", "", "_carryWeaponClassname"]; + if (isNil "_carryWeaponClassname") then { _carryWeaponClassname = secondaryWeapon _player }; + TRACE_3("assemble_deployWeapon_carryWeaponClassname",_tripod,_player,_carryWeaponClassname); + + private _tripodClassname = typeOf _tripod; + _player removeWeaponGlobal _carryWeaponClassname; + + private _assembledClassname = getText(configfile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname); + private _deployTime = getNumber(configfile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); + if (!isClass (configFile >> "CfgVehicles" >> _assembledClassname)) exitWith {ERROR_1("bad static classname [%1]",_assembledClassname);}; + + TRACE_4("",_carryWeaponClassname,_tripodClassname,_assembledClassname,_deployTime); + + private _onFinish = { + params ["_args"]; + _args params ["_tripod", "_player", "_assembledClassname"]; + TRACE_3("deployWeapon finish",_tripod,_player,_assembledClassname); + + private _tripodPos = getPosATL _tripod; + private _tripodDir = getDir _tripod; + deleteVehicle _tripod; + + _tripodPos set [2, (_tripodPos select 2) + 0.1]; + // Delay a frame so tripod has a chance to be deleted + [{ + params ["_assembledClassname", "_tripodDir", "_tripodPos"]; + private _csw = createVehicle [_assembledClassname, [0, 0, 0], [], 0, "NONE"]; + // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] + _csw setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set advanced assembly mode + unload, and broadcast + if (!GVAR(defaultAssemblyMode)) then { + TRACE_1("global disableVanillaAssembly event",_csw); // handles it being assembled when setting is disabled + [QGVAR(disableVanillaAssembly), [_csw]] call CBA_fnc_globalEvent; + }; + _csw setDir _tripodDir; + _csw setPosATL _tripodPos; + if ((_tripodPos select 2) < 0.5) then { + _csw setVectorUp (surfaceNormal _tripodPos); + }; + [QGVAR(deployWeaponSucceeded), [_csw]] call CBA_fnc_localEvent; + TRACE_2("csw placed",_csw,_assembledClassname); + }, [_assembledClassname, _tripodDir, _tripodPos]] call CBA_fnc_execNextFrame; + }; + + private _onFailure = { + params ["_args"]; + _args params ["", "_player", "", "_carryWeaponClassname"]; + TRACE_2("deployWeapon failure",_player,_carryWeaponClassname); + + _player addWeaponGlobal _carryWeaponClassname; + }; + + private _codeCheck = { + params ["_args"]; + _args params ["_tripod"]; + !isNull _tripod; + }; + + [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname], _onFinish, _onFailure, localize LSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); +}, _this] call CBA_fnc_execNextFrame; + diff --git a/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf b/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf new file mode 100644 index 00000000000..b1b89d8f092 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Modifies interaction for deploying weapon + * + * Arguments: + * 0: Target + * 1: Player + * 2: Args + * 3: Action Data + * + * Return Value: + * None + * + * Example: + * [cursorObject, player, [], []] call ace_csw_fnc_assemble_deployWeaponModifier + * + * Public: No + */ + +params ["_target", "_player", "", "_actionData"]; + +private _carryWeaponClassname = secondaryWeapon _player; +private _assembleTo = (getText(configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "assembleTo" >> (typeOf _target))); +private _icon = getText (configFile >> "CfgVehicles" >> _assembleTo >> "picture"); +TRACE_2("",_assembleTo,_icon); + +_actionData set [2, _icon]; diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf new file mode 100644 index 00000000000..01672547951 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -0,0 +1,47 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Picks up the tripod and adds it to the player launcher slot + * + * Arguments: + * 0: Tripod + * 1: Unit + * + * Return Value: + * None + * + * Example: + * [tripod, player] call ace_csw_fnc_assemble_pickupTripod + * + * Public: No + */ + +[{ + params ["_tripod", "_player"]; + TRACE_2("assemble_pickupTripod",_tripod,_player); + + private _tripodClassname = getText(configFile >> "CfgVehicles" >> (typeof _tripod) >> QUOTE(ADDON) >> "disassembleTo"); + private _pickupTime = getNumber(configFile >> "CfgWeapons" >> _tripodClassname >> QUOTE(ADDON) >> "pickupTime"); + + private _onFinish = { + params ["_args"]; + _args params ["_tripod", "_player", "_tripodClassname"]; + TRACE_3("assemble_pickupTripod finish",_tripod,_player,_tripodClassname); + + deleteVehicle _tripod; + _player addWeaponGlobal _tripodClassname; + [_player, "PutDown"] call EFUNC(common,doGesture); + }; + + private _condition = { + params ["_args"]; + _args params ["_tripod", "_player"]; + + !(isNull _tripod) && { (secondaryWeapon _player) isEqualTo "" } + + }; + + TRACE_3("",_pickupTime,typeOf _tripod,_tripodClassname); + [TIME_PROGRESSBAR(_pickupTime), [_tripod, _player, _tripodClassname], _onFinish, {}, localize LSTRING(PickupTripod_progressBar), _condition] call EFUNC(common,progressBar); +}, _this] call CBA_fnc_execNextFrame; + diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf new file mode 100644 index 00000000000..eb70371b590 --- /dev/null +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -0,0 +1,96 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Dismounts the weapon from the tripod and drops its backpack beside + * + * Arguments: + * 0: Static Weapon + * + * Return Value: + * None + * + * Example: + * [weapon] call ace_csw_fnc_assemble_pickupWeapon + * + * Public: No + */ + +[{ + params ["_staticWeapon", "_player"]; + TRACE_2("assemble_pickupWeapon",_staticWeapon,_player); + + private _onDisassembleFunc = getText(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "disassembleFunc"); + private _carryWeaponClassname = getText(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "disassembleWeapon"); + private _turretClassname = getText(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "disassembleTurret"); + private _pickupTime = getNumber(configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "pickupTime"); + TRACE_4("",typeOf _staticWeapon,_carryWeaponClassname,_turretClassname,_pickupTime); + if (!isClass (configFile >> "CfgWeapons" >> _carryWeaponClassname)) exitWith {ERROR_1("bad weapon classname [%1]",_carryWeaponClassname);}; + // Turret classname can equal nothing if the deploy bag is the "whole" weapon. e.g Kornet, Metis, other ATGMs + if (!(_turretClassname isEqualTo "") && {!isClass (configFile >> "CfgVehicles" >> _turretClassname)}) exitWith {ERROR_1("bad turret classname [%1]",_turretClassname);}; + + private _onFinish = { + params ["_args"]; + _args params ["_staticWeapon", "_player", "_carryWeaponClassname", "_turretClassname", "_onDisassembleFunc"]; + TRACE_4("disassemble finish",_staticWeapon,_player,_carryWeaponClassname,_turretClassname); + + private _weaponPos = getPosATL _staticWeapon; + _weaponPos set [2, (_weaponPos select 2) + 0.1]; + private _weaponDir = getDir _staticWeapon; + + LOG("remove ammo"); + { + _x params ["_xMag", "", "_xAmmo"]; + + private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; + if (isNil "_carryMag") then { + private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + _carryMag = configName (_groups param [0, configNull]); + GVAR(vehicleMagCache) setVariable [_xMag, _carryMag]; + TRACE_2("setting cache",_xMag,_carryMag); + }; + if ((_xAmmo > 0) && {_carryMag != ""}) then { + TRACE_2("Removing ammo",_xMag,_carryMag); + [_player, _carryMag, _xAmmo] call FUNC(reload_handleReturnAmmo); + }; + } forEach (magazinesAllTurrets _staticWeapon); + + if !(_turretClassname isEqualTo "") then { + private _cswTripod = createVehicle [_turretClassname, [0, 0, 0], [], 0, "NONE"]; + // Delay a frame so weapon has a chance to be deleted + [{ + params ["_cswTripod", "_weaponDir", "_weaponPos"]; + _cswTripod setDir _weaponDir; + _cswTripod setPosATL _weaponPos; + _cswTripod setVelocity [0, 0, -0.05]; + _cswTripod setVectorUp (surfaceNormal _weaponPos); + }, [_cswTripod, _weaponDir, _weaponPos]] call CBA_fnc_execNextFrame; + [_cswTripod, _staticWeapon] call (missionNamespace getVariable _onDisassembleFunc); + }; + + [{ + params ["_player", "_weaponPos", "_carryWeaponClassname"]; + if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { + _player addWeapon _carryWeaponClassname; + }; + private _weaponRelPos = _weaponPos getPos RELATIVE_DIRECTION(90); + private _weaponHolder = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"]; + _weaponHolder setDir random [0, 180, 360]; + _weaponHolder setPosATL [_weaponRelPos select 0, _weaponRelPos select 1, _weaponPos select 2]; + _weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1]; + }, [_player, _weaponPos, _carryWeaponClassname]] call CBA_fnc_execNextFrame; + + LOG("delete weapon"); + deleteVehicle _staticWeapon; + + LOG("end"); + }; + + private _condition = { + params ["_args"]; + _args params ["_staticWeapon"]; + ((crew _staticWeapon) isEqualTo []) && (alive _staticWeapon) + }; + + [TIME_PROGRESSBAR(_pickupTime), [_staticWeapon, _player, _carryWeaponClassname, _turretClassname, _onDisassembleFunc], _onFinish, {}, localize LSTRING(DisassembleCSW_progressBar), _condition] call EFUNC(common,progressBar); +}, _this] call CBA_fnc_execNextFrame; + diff --git a/addons/csw/functions/fnc_canGetIn.sqf b/addons/csw/functions/fnc_canGetIn.sqf new file mode 100644 index 00000000000..92b05b1c2cd --- /dev/null +++ b/addons/csw/functions/fnc_canGetIn.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Checks if the player can get in the weapon + * + * Arguments: + * 0: Static Weapon + * + * Return Value: + * None + * + * Example: + * [cursorObject] call ace_csw_fnc_canGetIn + * + * Public: No + */ + +// hide this action if quick mount is enabled +if ((missionNamespace getVariable [QEGVAR(quickmount,enabled), false]) && {(missionNamespace getVariable [QEGVAR(quickmount,enableMenu), -1]) in [1, 3]}) exitWith { + false +}; + +params ["_staticWeapon"]; + +alive _staticWeapon +&& {!(alive (gunner _staticWeapon))} +&& {(locked _staticWeapon) < 2} +&& {0.3 < ((vectorUp _staticWeapon) select 2)} diff --git a/addons/csw/functions/fnc_getIn.sqf b/addons/csw/functions/fnc_getIn.sqf new file mode 100644 index 00000000000..338d17e03e9 --- /dev/null +++ b/addons/csw/functions/fnc_getIn.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * An action for the player to get in the CSW + * Due to the fact that the default static weapons "Get In" memory point is at the front of + * the gun and can't be acssesed from the back, I am implementing this to get around that issue. + * + * Arguments: + * 0: Static Weapon + * 1: Unit + * + * Return Value: + * None + * + * Example: + * [cursorObject, player] call ace_csw_fnc_getIn + * + * Public: No + */ + +params ["_staticWeapon", "_player"]; +TRACE_2("getIn",_staticWeapon,_player); + +_player moveInTurret [_staticWeapon, [0]]; diff --git a/addons/csw/functions/fnc_proxyWeapon.sqf b/addons/csw/functions/fnc_proxyWeapon.sqf new file mode 100644 index 00000000000..3e47fddaddb --- /dev/null +++ b/addons/csw/functions/fnc_proxyWeapon.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM), PabstMirror + * Handles the use of proxy weapons to fix engine-reload times + * + * Arguments: + * 0: Weapon + * 1: Turret + * 2: Proxy weapon needed + * 2: Weapon should be emptied + * + * Return Value: + * None + * + * Example: + * [weapon, [0], true, false] call ace_csw_fnc_proxyWeapon + * + * Public: No + */ + +params ["_staticWeapon", "_turret", "_needed", "_emptyWeapon"]; +TRACE_4("proxyWeapon",_staticWeapon,_turret,_needed,_emptyWeapon); + +if (_staticWeapon getVariable [format [QGVAR(proxyHandled_%1), _turret], false]) exitWith { TRACE_1("already handled",typeOf _staticWeapon); }; + +private _typeOf = typeOf _staticWeapon; +private _proxyWeapon = getText(configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "proxyWeapon"); + +TRACE_2("",_typeOf,_proxyWeapon); +if (_proxyWeapon == "") exitWith {}; + +private _currentWeapon = (_staticWeapon weaponsTurret [0]) param [0, "#none"]; +if ((missionNamespace getVariable [_proxyWeapon, objNull]) isEqualType {}) then { // check if string is a function + TRACE_1("Calling proxyWeapon function",_proxyWeapon); + // This function may replace magazines or do other things to the static weapon + _proxyWeapon = [_staticWeapon, _turret, _currentWeapon, _needed, _emptyWeapon] call (missionNamespace getVariable _proxyWeapon); + _needed = _proxyWeapon != ""; +}; +if (!_needed) exitWith { TRACE_2("not needed",_needed,_proxyWeapon); }; + +TRACE_2("swapping to proxy weapon",_currentWeapon,_proxyWeapon); +_staticWeapon removeWeaponTurret [_currentWeapon, _turret]; +_staticWeapon addWeaponTurret [_proxyWeapon, _turret]; +_staticWeapon setVariable [format [QGVAR(proxyHandled_%1), _turret], true, true]; diff --git a/addons/csw/functions/fnc_reload_actionsLoad.sqf b/addons/csw/functions/fnc_reload_actionsLoad.sqf new file mode 100644 index 00000000000..c5e7a3b574e --- /dev/null +++ b/addons/csw/functions/fnc_reload_actionsLoad.sqf @@ -0,0 +1,56 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Gets sub actions for what the player can load into the static weapon + * + * Arguments: + * 0: Static Weapon + * 1: Player + * + * Return Value: + * Actions + * + * Example: + * [cursorObject, player] call ace_csw_fnc_reload_actionsLoad + * + * Public: No + */ + +params ["_vehicle", "_player"]; + +private _actions = []; +private _loadableMagazines = [_vehicle, _player] call FUNC(reload_getLoadableMagazines); + +private _statement = { + params ["_target", "_player", "_params"]; + _params params ["_carryMag", "_turretPath"]; + + [_target, _turretPath, _carryMag, _player] call FUNC(reload_loadMagazine); +}; + +private _condition = { + params ["_target", "_player", "_params"]; + _params params ["_carryMag", "_turretPath"]; + + ([_target, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine)) select 0 +}; + +{ + _x params ["_carryMag", "_turretPath", "_loadInfo"]; + _loadInfo params ["", "", "", "_isBeltLinking"]; + + private _displayName = getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName"); + private _picture = getText (configFile >> "CfgMagazines" >> _carryMag >> "picture"); + private _text = if (_isBeltLinking) then { + format [localize LSTRING(actionLink), _displayName]; + } else { + format [localize LSTRING(loadX), _displayName]; + }; + + private _action = [format ["load_%1", _forEachIndex], _text, _picture, _statement, _condition, {}, _x] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, [], _vehicle]; +} forEach _loadableMagazines; + +TRACE_1("loadActions",count _actions); +_actions + diff --git a/addons/csw/functions/fnc_reload_actionsUnload.sqf b/addons/csw/functions/fnc_reload_actionsUnload.sqf new file mode 100644 index 00000000000..12d2cd2f9a4 --- /dev/null +++ b/addons/csw/functions/fnc_reload_actionsUnload.sqf @@ -0,0 +1,81 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Gets sub actions for what the player can load into the static weapon + * + * Arguments: + * 0: Target + * 1: Player + * + * Return Value: + * Actions + * + * Example: + * [cursorObject, player] call ace_csw_fnc_reload_actionsUnload + * + * Public: No + */ + +params ["_vehicle", "_player"]; + +private _statement = { + params ["_target", "_player", "_params"]; + _params params ["_vehMag", "_turretPath", "_carryMag"]; + TRACE_5("starting unload",_target,_turretPath,_player,_carryMag,_vehMag); + + private _timeToUnload = 1; + if (!isNull(configFile >> "CfgVehicles" >> (typeOf _target) >> QUOTE(ADDON) >> "ammoUnloadTime")) then { + _timeToUnload = getNumber(configFile >> "CfgVehicles" >> (typeOf _target) >> QUOTE(ADDON) >> "ammoUnloadTime"); + }; + + [ + TIME_PROGRESSBAR(_timeToUnload), + [_target, _turretPath, _player, _carryMag, _vehMag], + { + (_this select 0) params ["_target", "_turretPath", "", "_carryMag", "_vehMag"]; + TRACE_5("unload progressBar finish",_target,_turretPath,_carryMag,_vehMag,_player); + [QGVAR(removeTurretMag), [_target, _turretPath, _carryMag, _vehMag, _player]] call CBA_fnc_globalEvent; + }, + {TRACE_1("unload progressBar fail",_this);}, + format [localize LSTRING(unloadX), getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName")], + {(_this select 0) call FUNC(reload_canUnloadMagazine)}, + ["isNotInside"] + ] call EFUNC(common,progressBar); +}; + +private _condition = { + params ["_target", "_player", "_params"]; + _params params ["_vehMag", "_turretPath", "_carryMag"]; + [_target, _turretPath, _player, _carryMag, _vehMag] call FUNC(reload_canUnloadMagazine) +}; + +private _actions = []; +private _handeledMagTypes = []; + +// Go through magazines on static weapon and check if any are unloadable +{ + _x params ["_xMag", "_xTurret", "_xAmmo"]; + + if ((_xAmmo > 0) && {!(_xMag in _handeledMagTypes)}) then { + _handeledMagTypes pushBack _xMag; + private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; + + if (isNil "_carryMag") then { + private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + _carryMag = configName (_groups param [0, configNull]); + GVAR(vehicleMagCache) setVariable [_xMag, _carryMag]; + TRACE_2("setting cache",_xMag,_carryMag); + }; + if (_carryMag == "") exitWith {}; + + private _displayName = getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName"); + private _text = format [LLSTRING(unloadX), _displayName]; + private _picture = getText (configFile >> "CfgMagazines" >> _carryMag >> "picture"); + private _action = [format ["unload_%1", _forEachIndex], _text, _picture, _statement, _condition, {}, [_xMag, _xTurret, _carryMag]] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, [], _vehicle]; + }; +} forEach (magazinesAllTurrets _vehicle); + +TRACE_1("unloadActions",count _actions); +_actions + diff --git a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf new file mode 100644 index 00000000000..505c9203334 --- /dev/null +++ b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror & TCVM + * Tests if unit can load a magazine into a static weapon. + * + * Arguments: + * 0: Static Weapon + * 1: Turret Path + * 2: Carryable Magazine + * 3: Player + * + * Return Value: + * [CanLoad, LoadedMag, AmmoNeeded, IsBeltLinking] + * + * Example: + * [cursorObject, [0], "ACE_csw_100Rnd_127x99_mag_red", player] call ace_csw_fnc_reload_canLoadMagazine + * + * Public: No + */ + +params ["_vehicle", "_turret", "_carryMag", ["_unit", objNull]]; +// TRACE_4("reload_canLoadMagazine",_vehicle,_turret,_carryMag,_unit); + +// Handle disassembled or deleted +if (!alive _vehicle) exitWith { [false, "", -1, false] }; +// Verify unit has carry magazine +if ((!isNull _unit) && {((_vehicle distance _unit) > 5) || {((magazines _unit) findIf {_x == _carryMag}) == -1}}) exitWith { [false, "", -2, false] }; + +private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "desiredAmmo"); +if (_desiredAmmo == 0) then { _desiredAmmo = 100; }; +private _ammoNeeded = _desiredAmmo min getNumber (configFile >> "CfgMagazines" >> _carryMag >> "count"); // assume it needs full carry mag +private _loadedMag = ""; +private _isBeltLinking = false; + +scopeName "main"; +{ + _x params ["_xMag", "_xTurret", "_xAmmo"]; + if (_xTurret isEqualTo _turret) then { + if (_loadedMag != "") exitWith { [false, _loadedMag, -3, false] breakOut "main"; }; // Exit if static has multiple mags + _loadedMag = _xMag; + if (_xAmmo > 0) then { + // There is a magazine with ammo loaded in the turret (are there any multi-muzzle static weapons??), see if we can add to this mag + if (getNumber (configFile >> QGVAR(groups) >> _carryMag >> _xMag) != 1) exitWith { + [false, _loadedMag, -4, false] breakOut "main"; // Carry mag cannot be added to existing vehicle mag (e.g. red to green tracers) + }; + if (getNumber (configFile >> "CfgMagazines" >> _carryMag >> "ACE_isBelt") == 0) exitWith { + [false, _loadedMag, -5, false] breakOut "main"; // Non-linkable mag loaded, can't add any more + }; + private _maxMagazineAmmo = _desiredAmmo min getNumber (configFile >> "CfgMagazines" >> _xMag >> "count"); + if (_xAmmo >= _maxMagazineAmmo) exitWith { + [false, _loadedMag, -6, false] breakOut "main"; // Already at capicity + }; + _ammoNeeded = _maxMagazineAmmo - _xAmmo; + _isBeltLinking = true; + }; + }; +} forEach (magazinesAllTurrets _vehicle); + +[true, _loadedMag, _ammoNeeded, _isBeltLinking] diff --git a/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf b/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf new file mode 100644 index 00000000000..2ce6b6e591c --- /dev/null +++ b/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Tests if unit can unload a magazine from a static weapon. + * + * Arguments: + * 0: Static Weapon + * 1: Turret Path + * 2: Player + * 3: Carryable Magazine + * 4: Vehicle Magazine + * + * Return Value: + * + * + * Example: + * [cursorTarget, [0], player, "ACE_csw_100Rnd_127x99_mag_red", "200Rnd_127x99_mag_Tracer_Red"] call ace_csw_fnc_reload_canUnloadMagazine + * + * Public: No + */ + +params ["_vehicle", "_turretPath", "_unit", "_carryMag", "_vehMag"]; + +// handle disassembled or deleted +if ((!alive _vehicle) || {(_vehicle distance _unit) > 5}) exitWith {false}; + +private _return = false; +{ + _x params ["_xMag", "_xTurret", "_xAmmo"]; + if ((_xMag == _vehMag) && {_xTurret isEqualTo _turretPath} && {_xAmmo > 0}) exitWith { _return = true }; +} forEach (magazinesAllTurrets _vehicle); + +_return diff --git a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf new file mode 100644 index 00000000000..8e6f3ce5007 --- /dev/null +++ b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf @@ -0,0 +1,52 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Gets magazines that the player is carrying that can be loaded into the static weapon + * + * Arguments: + * 0: Vehicle + * 1: Player + * + * Return Value: + * Mags + * [Carry Magazine , Turret Path , Ammo Needed ] + * + * Example: + * [cursorObject, player] call ace_csw_fnc_reload_getLoadableMagazines + * + * Public: No + */ + +params ["_vehicle", "_player"]; + +private _carriedMagazines = []; + +{ + if (isClass (configFile >> QGVAR(groups) >> _x)) then { + _carriedMagazines pushBackUnique _x; + }; +} forEach (magazines _player); + +if (_carriedMagazines isEqualTo []) exitWith { [] }; // fast exit if no carry mags + +private _loadInfo = []; +private _return = []; +// Go through turrets and find weapons that we could reload +{ + private _turretPath = _x; + { + private _weapon = _x; + { + private _carryMag = _x; + private _carryGroup = configFile >> QGVAR(groups) >> _carryMag; + { + if (((getNumber (_carryGroup >> _x)) == 1) && {_loadInfo = [_vehicle, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine); _loadInfo select 0}) exitWith { + _return pushBack [_carryMag, _turretPath, _loadInfo]; + }; + } forEach ([_weapon] call CBA_fnc_compatibleMagazines); + } forEach _carriedMagazines; + } forEach (_vehicle weaponsTurret _turretPath); +} forEach (allTurrets _vehicle); +// Note: these nested forEach's looks terrible, but most only have one element + +_return diff --git a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf new file mode 100644 index 00000000000..b6265852c9d --- /dev/null +++ b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Finds the best vehicle magazines to create from a carryable magazine for a given weapon. + * + * Arguments: + * 0: Weapon + * 1: Magazine that is carryable + * + * Return Value: + * Vehicle Magazine + * + * Example: + * [cursorObject, [0], "ace_csw_100Rnd_127x99_mag"] call ace_csw_fnc_reload_getVehicleMagazine + * + * Public: No + */ + +params ["_vehicle", "_turret", "_carryMag"]; +TRACE_3("reload_getVehicleMagazine",_vehicle,_turret,_carryMag); + +private _carryGroupCfg = configFile >> QGVAR(groups) >> _carryMag; +private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "desiredAmmo"); +if (_desiredAmmo == 0) then { _desiredAmmo = 100; }; + +private _bestMag = "#"; +private _bestMagCount = -1; + +{ + private _weapon = _x; + { + if ((getNumber (_carryGroupCfg >> _x)) == 1) then { + private _xAmmo = getNumber (configFile >> "CfgMagazines" >> _x >> "ammo"); + if (((_xAmmo >= _bestMagCount) && {_bestMagCount < _desiredAmmo}) || {(_xAmmo >= _desiredAmmo) && {_xAmmo < _bestMagCount}}) then { + _bestMag = _x; + _bestMagCount = _xAmmo; + }; + }; + } forEach (getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines")); +} forEach (_vehicle weaponsTurret _turret); +TRACE_3("best fit",_desiredAmmo,_bestMag,_bestMagCount); + +if (_bestMag == "#") then { ERROR_1("veh mag not found for %1",_carryMag); }; + +_bestMag diff --git a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf new file mode 100644 index 00000000000..841192864a8 --- /dev/null +++ b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf @@ -0,0 +1,66 @@ +#include "script_component.hpp" +/* + * Author: TCVM, PabstMirror + * Handles adding ammo to a turret + * Called from a global event but only runs where turret is local + * + * Arguments: + * 0: Static Weapon + * 1: Turret Path + * 2: Unit doing action + * 3: Vehicle Magazine + * 4: Ammo in magazine + * + * Return Value: + * None + * + * Example: + * [cursorTarget, [0], player, "200Rnd_127x99_mag_Tracer_Red", 70] call ace_csw_fnc_reload_handleAddTurretMag + * + * Public: No + */ + +params ["_vehicle", "_turret", "_unit", "_carryMag" ,"_ammoRecieved"]; +TRACE_5("reload_handleAddTurretMag",_vehicle,_turret,_unit,_carryMag,_ammoRecieved); + +TRACE_2("",local _vehicle, _vehicle turretLocal _turret); +if (!(_vehicle turretLocal _turret)) exitWith {}; + +([_vehicle, _turret, _carryMag] call FUNC(reload_canLoadMagazine)) params ["_canAdd", "_loadedMag", "_neededAmmo", "_isBeltLinking"]; +TRACE_4("canLoad",_canAdd,_loadedMag,_neededAmmo,_isBeltLinking); + +private _ammoRemaining = _ammoRecieved; +if (_canAdd) then { + private _ammoUsed = _neededAmmo min _ammoRecieved; + _ammoRemaining = _ammoRemaining - _ammoUsed; + + if (_isBeltLinking) then { + private _currentAmmo = _vehicle magazineTurretAmmo [_loadedMag, _turret]; + _currentAmmo = _currentAmmo + _ammoUsed; + TRACE_2("Setting mag ammo",_loadedMag,_currentAmmo); + // _vehicle setMagazineTurretAmmo [_loadedMag, _currentAmmo, _turret]; + + // setMagazineTurretAmmo is broken on split locality, use setAmmo for now (this may not work for multi turret vehicles) + private _weapon = (_vehicle weaponsTurret _turret) param [0, ""]; + TRACE_3("setAmmo",_vehicle,_weapon, _currentAmmo); + _vehicle setAmmo [_weapon, _currentAmmo]; + private _currentAmmo = _vehicle magazineTurretAmmo [_loadedMag, _turret]; + if ((_weapon == "") || {_currentAmmo != _currentAmmo}) then { ERROR_1("failed to setAmmo - %1", _this); }; + + } else { + if (_loadedMag != "") then { + TRACE_1("Removing emtpy mag",_loadedMag); + _vehicle removeMagazinesTurret [_loadedMag, _turret]; + }; + [_vehicle, _turret, true, false] call FUNC(proxyWeapon); // Check if we need to add proxy weapon now + private _newMag = [_vehicle, _turret, _carryMag] call FUNC(reload_getVehicleMagazine); + TRACE_2("Adding new mag",_newMag,_ammoUsed); + _vehicle addMagazineTurret [_newMag, _turret, _ammoUsed]; + }; +}; + +if (_ammoRemaining > 0) then { + TRACE_3("Returning ammo",_unit,_carryMag,_ammoRemaining); + [QGVAR(returnAmmo), [_unit, _carryMag, _ammoRemaining], _unit] call CBA_fnc_targetEvent; +}; + diff --git a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf new file mode 100644 index 00000000000..1a88c7f1156 --- /dev/null +++ b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf @@ -0,0 +1,79 @@ +#include "script_component.hpp" +/* + * Author: TCVM + * Handles removing ammo from a turret + * Called from a global event but only runs where turret is local + * + * Arguments: + * 0: Static Weapon + * 1: Turret Path + * 2: Magainze Unit Can Carry + * 3: Magazine To Remove From Static + * 4: Unit to unload to + * + * Return Value: + * None + * + * Example: + * [cursorTarget, [0], "ACE_csw_100Rnd_127x99_mag_red", "500Rnd_127x99_mag_Tracer_Green", player] call ace_csw_fnc_reload_handleRemoveTurretMag + * + * Public: No + */ + +params ["_vehicle", "_turretPath", "_carryMag", "_vehMag", "_unit"]; +TRACE_5("removeTurretMag EH",_vehicle,_turretPath,_carryMag,_vehMag,_unit); + +TRACE_3("",local _vehicle, _vehicle turretLocal _turretPath,local _unit); +if (!(_vehicle turretLocal _turretPath)) exitWith {}; + +private _magsInWeapon = []; // Check how much ammo it has now: +{ + _x params ["_xMag", "_xTurret", "_xAmmo"]; + if ((_xMag == _vehMag) && {_xTurret isEqualTo _turretPath}) then { + _magsInWeapon pushBack _xAmmo; + }; +} forEach (magazinesAllTurrets _vehicle); +TRACE_1("",_magsInWeapon); + +// Remove any empty mags from start: +private _ammoInFirstMag = 0; +while {(!(_magsInWeapon isEqualTo [])) && {_ammoInFirstMag = _magsInWeapon deleteAt 0; (_ammoInFirstMag == 0)}} do { + TRACE_1("Removing empty mag",_ammoInFirstMag); + _vehicle removeMagazineTurret [_vehMag, _turretPath]; +}; +TRACE_2("",_magsInWeapon,_ammoInFirstMag); +if ((_magsInWeapon isEqualTo []) && {_ammoInFirstMag == 0}) exitWith {}; + +private _maxAmmo = getNumber (configFile >> "CfgMagazines" >> _carryMag >> "count"); +private _ammoRemoved = _ammoInFirstMag min _maxAmmo; +private _ammoLeft = _ammoInFirstMag - _ammoRemoved; + +if ((_magsInWeapon isEqualTo []) && {_ammoInFirstMag > _ammoRemoved}) then { + // Only one mag in gun, and we're just taking out a partial ammount (unlinking) + TRACE_2("Setting mag ammo",_ammoRemoved,_ammoLeft); + // _vehicle setMagazineTurretAmmo [_vehMag, _ammoLeft, _turretPath]; + + // setMagazineTurretAmmo is broken on split locality, use setAmmo for now + private _weapon = (_vehicle weaponsTurret _turretPath) param [0, ""]; + TRACE_3("setAmmo",_vehicle,_weapon, _ammoLeft); + _vehicle setAmmo [_weapon, _ammoLeft]; + private _currentAmmo = _vehicle magazineTurretAmmo [_vehMag, _turretPath]; + if ((_weapon == "") || {_currentAmmo != _ammoLeft}) then { ERROR_1("failed to setAmmo - %1", _this); }; + + +} else { + // Because of command limitations, we need to remove mags to change their ammo + // This will cause the gun to need to be reloaded if more than one is loaded (only a problem for non-assembly mode guns) + TRACE_2("Removing magazine",_ammoRemoved,_ammoLeft); + _vehicle removeMagazinesTurret [_vehMag, _turretPath]; + if (_ammoLeft > 0) then { + _magsInWeapon pushBack _ammoLeft; + TRACE_1("Re-adding partial",_ammoLeft); + }; + { + if (_x > 0) then { _vehicle addMagazineTurret [_vehMag, _turretPath, _x]; }; + } forEach _magsInWeapon; +}; + +TRACE_3("Returning ammo",_unit,_carryMag,_ammoRemoved); +[QGVAR(returnAmmo), [_unit, _carryMag, _ammoRemoved], _unit] call CBA_fnc_targetEvent; diff --git a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf new file mode 100644 index 00000000000..1d288b863fc --- /dev/null +++ b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: TCVM and PabstMirror + * Handles returned ammo (either from unloading or leftovers from linking) + * + * Arguments: + * 0: Man or Vehicle + * 1: Carry Magazine + * 2: Ammo in magazine + * + * Return Value: + * None + * + * Example: + * [player, "ace_csw_100Rnd_127x99_mag", 70] call ace_csw_fnc_reload_handleReturnAmmo + * + * Public: No + */ + +params ["_unloadTo", "_carryMag", "_ammo"]; +TRACE_3("reload_handleReturnAmmo",_unloadTo,_carryMag,_ammo); + +private _carryMaxAmmo = getNumber (configFile >> "CfgMagazines" >> _carryMag >> "count"); +private _fullMagazines = floor (_ammo / _carryMaxAmmo); +private _bulletsRemaining = _ammo % _carryMaxAmmo; + +if (_unloadTo isKindOf "CaManBase") then { + while {(_fullMagazines > 0) && {_unloadTo canAdd _carryMag}} do { + _unloadTo addMagazine [_carryMag, _carryMaxAmmo]; + _fullMagazines = _fullMagazines - 1; + }; + if ((_bulletsRemaining > 0) && {_unloadTo canAdd _carryMag}) then { + _unloadTo addMagazine [_carryMag, _bulletsRemaining]; + _bulletsRemaining = 0; + }; +}; + +if ((_fullMagazines == 0) && {_bulletsRemaining == 0}) exitWith {}; + +// Try to use existing container +private _container = _unloadTo getVariable [QGVAR(container), objNull]; +if ((_container distance _unloadTo) > 4) then { _container = objNull; }; +if (isNull _container) then { + _container = (nearestObjects [_unloadTo, ["groundWeaponHolder"], 4]) param [0, objNull]; +}; + + +if (isNull _container) then { + // Create ground weapon holder container + private _weaponRelPos = _unloadTo getRelPos RELATIVE_DIRECTION(270); + _weaponRelPos set [2, ((getPosATL _unloadTo) select 2) + 0.05]; + _container = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"]; + // ToDo: Unload to ammo box?? + _unloadTo setVariable [QGVAR(container), _container, true]; + _container setDir random [0, 180, 360]; + _container setPosATL _weaponRelPos; + if ((_weaponRelPos select 2) < 0.5) then { + _container setVectorUp (surfaceNormal _weaponRelPos); + }; + TRACE_2("Creating NEW Container",_container,_weaponRelPos); +}; + +TRACE_3("adding to container",_container,_fullMagazines,_bulletsRemaining); + +if (_fullMagazines > 0) then { + _container addMagazineAmmoCargo [_carryMag, _fullMagazines, _carryMaxAmmo]; +}; +if (_bulletsRemaining > 0) then { + _container addMagazineAmmoCargo [_carryMag, 1, _bulletsRemaining]; +}; diff --git a/addons/csw/functions/fnc_reload_loadMagazine.sqf b/addons/csw/functions/fnc_reload_loadMagazine.sqf new file mode 100644 index 00000000000..25032a08f4c --- /dev/null +++ b/addons/csw/functions/fnc_reload_loadMagazine.sqf @@ -0,0 +1,66 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Loads a magazine into a static weapon from a magazine carried by the player. + * + * Arguments: + * 0: Vehicle + * 1: Turret + * 2: Unit Carried Magazine + * 3: Player + * + * Return Value: + * None + * + * Example: + * [cursorTarget, [0], "ACE_csw_100Rnd_127x99_mag_red", player] call ace_csw_fnc_reload_loadMagazine + * + * Public: No + */ + +params ["_vehicle", "_turret", "_carryMag", "_unit"]; +TRACE_4("loadMagazine",_vehicle,_turret,_carryMag,_unit); + +private _timeToLoad = 1; +if (!isNull(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "ammoLoadTime")) then { + _timeToLoad = getNumber(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "ammoLoadTime"); +}; + +private _displayName = format [localize LSTRING(loadX), getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName")]; + +private _onFinish = { + (_this select 0) params ["_vehicle", "_turret", "_carryMag", "_unit"]; + TRACE_4("load progressBar finish",_vehicle,_turret,_carryMag,_unit); + + ([_vehicle, _turret, _carryMag, _unit] call FUNC(reload_canLoadMagazine)) params ["", "", "_neededAmmo", ""]; + if (_neededAmmo <= 0) exitWith { ERROR_1("Can't load ammo - %1",_this); }; + + // Figure out what we can add from the magazines we have + private _bestAmmoToSend = -1; + { + _x params ["_xMag", "_xAmmo"]; + if (_xMag == _carryMag) then { + if ((_bestAmmoToSend == -1) || {(_xAmmo > _bestAmmoToSend) && {_xAmmo <= _neededAmmo}}) then { + _bestAmmoToSend = _xAmmo; + }; + }; + } forEach (magazinesAmmo _unit); + + if (_bestAmmoToSend == -1) exitWith {ERROR_2("No ammo [%1 - %2]?",_xMag,_bestAmmoToSend);}; + [_unit, _carryMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); + if (_bestAmmoToSend == 0) exitWith {}; + + TRACE_5("calling addTurretMag event",_vehicle,_turret,_unit,_carryMag,_bestAmmoToSend); + [QGVAR(addTurretMag), [_vehicle, _turret, _unit, _carryMag, _bestAmmoToSend]] call CBA_fnc_globalEvent; +}; + + +[ +TIME_PROGRESSBAR(_timeToLoad), +[_vehicle, _turret, _carryMag, _unit], +_onFinish, +{TRACE_1("load progressBar fail",_this);}, +_displayName, +{((_this select 0) call FUNC(reload_canLoadMagazine)) select 0}, +["isNotInside"] +] call EFUNC(common,progressBar); diff --git a/addons/csw/functions/fnc_staticWeaponInit.sqf b/addons/csw/functions/fnc_staticWeaponInit.sqf new file mode 100644 index 00000000000..4ce86f3c499 --- /dev/null +++ b/addons/csw/functions/fnc_staticWeaponInit.sqf @@ -0,0 +1,95 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Initializes weapon to disable weapon disassembling + * + * Arguments: + * 0: Weapon + * + * Return Value: + * None + * + * Example: + * [weapon] call ace_csw_fnc_staticWeaponInit + * + * Public: No + */ + +params ["_staticWeapon"]; +private _typeOf = typeOf _staticWeapon; +private _configEnabled = (getNumber (configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "enabled")) == 1; +private _assemblyConfig = _configEnabled && {(getText (configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "disassembleWeapon")) != ""}; +TRACE_4("staticWeaponInit",_staticWeapon,_typeOf,_configEnabled,_assemblyConfig); + +if (_configEnabled && {GVAR(ammoHandling) == 2}) then { + TRACE_1("adding AI fired handler",_staticWeapon); + _staticWeapon addEventHandler ["Fired", LINKFUNC(ai_handleFired)]; +}; + +TRACE_2("",local _staticWeapon,_staticWeapon turretLocal [0]); +if (_configEnabled && {_staticWeapon turretLocal [0]}) then { // if turret is local to us, then handle mags/weapon + [{ + params ["_staticWeapon"]; + if (!alive _staticWeapon) exitWith { TRACE_1("dead/deleted",_staticWeapon); }; + // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] + private _assemblyModeIndex = _staticWeapon getVariable [QGVAR(assemblyMode), 3]; + private _emptyWeapon = _assemblyModeIndex isEqualTo 2; + private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select _assemblyModeIndex; + TRACE_2("turretLocal",_staticWeapon,_assemblyMode); + [_staticWeapon, [0], _assemblyMode, _emptyWeapon] call FUNC(proxyWeapon); + [_staticWeapon, _assemblyMode, _emptyWeapon] call FUNC(staticWeaponInit_unloadExtraMags); + }, [_staticWeapon]] call CBA_fnc_execNextFrame; // need to wait a frame to allow setting object vars during assembly +}; + +if (_assemblyConfig) then { + [{ + params ["_staticWeapon"]; + if (!alive _staticWeapon) exitWith { TRACE_1("dead/deleted",_staticWeapon); }; + private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 3]); + TRACE_2("assemblyConfig present",_staticWeapon,_assemblyMode); + if (_assemblyMode) then { // Disable vanilla assembly if assemblyMode eanbled + [QGVAR(disableVanillaAssembly), [_staticWeapon]] call CBA_fnc_localEvent; + }; + }, [_staticWeapon]] call CBA_fnc_execNextFrame; // need to wait a frame to allow setting object vars during assembly +}; + +// Add interactions for players +if (hasInterface && {!(_typeOf in GVAR(initializedStaticTypes))}) then { + GVAR(initializedStaticTypes) pushBack _typeOf; + TRACE_1("Adding Actions",_typeOf); + + if (_assemblyConfig) then { + private _disassembleAction = [QGVAR(disassemble), localize LSTRING(DisassembleCSW_displayName), "", {call FUNC(assemble_pickupWeapon)}, {call FUNC(assemble_canPickupWeapon)}] call EFUNC(interact_menu,createAction); + [_typeOf, 0, ["ACE_MainActions"], _disassembleAction] call EFUNC(interact_menu,addActionToClass); + }; + + + private _ammoActionPath = []; + private _magazineLocation = getText (configFile >> "CfgVehicles" >> _typeOf >> QUOTE(ADDON) >> "magazineLocation"); + private _condition = { //IGNORE_PRIVATE_WARNING ["_target", "_player"]; + // If magazine handling is enabled or weapon assembly/disassembly is enabled we enable ammo handling + if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_target getVariable [QGVAR(assemblyMode), 3]))}) exitWith { false }; + [_player, _target, ["isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith) + }; + private _childenCode = { + BEGIN_COUNTER(getActions); // can remove for final release + private _ret = (call FUNC(reload_actionsLoad)) + (call FUNC(reload_actionsUnload)); + END_COUNTER(getActions); + _ret + }; + if (_configEnabled && {_magazineLocation != ""}) then { + private _positionCode = compile _magazineLocation; + private _ammoAction = [QGVAR(magazine), localize LSTRING(AmmoHandling_displayName), "", {}, _condition, _childenCode, [], _positionCode, 4] call EFUNC(interact_menu,createAction); + _ammoActionPath = [_typeOf, 0, [], _ammoAction] call EFUNC(interact_menu,addActionToClass); + } else { + private _ammoAction = [QGVAR(magazine), localize LSTRING(AmmoHandling_displayName), "", {}, _condition, _childenCode] call EFUNC(interact_menu,createAction); + _ammoActionPath = [_typeOf, 0, ["ACE_MainActions"], _ammoAction] call EFUNC(interact_menu,addActionToClass); + }; + + if (["ACE_reload"] call EFUNC(common,isModLoaded)) then { + // move reload's check ammo action to the ammo handling point (remove and re-add) + [_typeOf, 0, ["ACE_MainActions", QEGVAR(reload,CheckAmmo)]] call EFUNC(interact_menu,removeActionFromClass); + private _checkAmmoAction = [QGVAR(checkAmmo), localize ELSTRING(reload,checkAmmo), "", EFUNC(reload,checkAmmo), EFUNC(reload,canCheckAmmo)] call EFUNC(interact_menu,createAction); + [_typeOf, 0, _ammoActionPath, _checkAmmoAction] call EFUNC(interact_menu,addActionToClass); + }; +}; diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf new file mode 100644 index 00000000000..a1e7ca97151 --- /dev/null +++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf @@ -0,0 +1,83 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM), PabstMirror + * Dumps ammo to container + * + * Arguments: + * 0: Weapon + * 1: Using advanced assembly + * + * Return Value: + * None + * + * Example: + * [cursorObject, false] call ace_csw_fnc_staticWeaponInit_unloadExtraMags + * + * Public: No + */ + +params ["_staticWeapon", "_assemblyMode", "_emptyWeapon"]; +TRACE_3("staticWeaponInit_unloadExtraMags",_staticWeapon,_assemblyMode,_emptyWeapon); +if (!_assemblyMode) exitWith {}; + +private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "desiredAmmo"); +private _storeExtraMagazines = GVAR(handleExtraMagazines); +if (_emptyWeapon) then { + _desiredAmmo = 0; + _storeExtraMagazines = false; +}; +TRACE_3("settings",_emptyWeapon,_desiredAmmo,_storeExtraMagazines); + +private _magsToRemove = []; +private _loadedMagazineInfo = []; +private _containerMagazineClassnames = []; +private _containerMagazineCount = []; + +{ + _x params ["_xMag", "_xTurret", "_xAmmo"]; + + private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; + if (isNil "_carryMag") then { + private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + _carryMag = configName (_groups param [0, configNull]); + GVAR(vehicleMagCache) setVariable [_xMag, _carryMag]; + TRACE_2("setting cache",_xMag,_carryMag); + }; + if (_carryMag != "") then { + if ((_desiredAmmo > 0) && {_loadedMagazineInfo isEqualTo []}) then { + private _loadedMagAmmo = _desiredAmmo min _xAmmo; + _loadedMagazineInfo = [_xMag, _xTurret, _loadedMagAmmo]; + _xAmmo = _xAmmo - _loadedMagAmmo; + TRACE_1("",_loadedMagAmmo); + }; + if (_xAmmo > 0) then { + _magsToRemove pushBackUnique [_xMag, _xTurret]; + private _index = _containerMagazineClassnames find _carryMag; + if (_index < 0) then { + _index = _containerMagazineClassnames pushBack _carryMag; + _containerMagazineCount pushBack 0; + }; + _containerMagazineCount set [_index, (_containerMagazineCount select _index) + _xAmmo]; + }; + } else { + if ((_xMag select [0,4]) != "fake") then { WARNING_1("Unable to unload [%1] - No matching carry mag",_xMag); }; + }; +} forEach (magazinesAllTurrets _staticWeapon); + + +TRACE_1("Remove all loaded magazines",_magsToRemove); +{ + _staticWeapon removeMagazinesTurret _x; + if ((_loadedMagazineInfo select [0,2]) isEqualTo _x) then { + TRACE_1("Re-add the starting mag",_loadedMagazineInfo); + _staticWeapon addMagazineTurret _loadedMagazineInfo; + }; +} forEach _magsToRemove; + + +if (_storeExtraMagazines) then { + TRACE_1("saving extra mags to container",_containerMagazineCount); + { + [_staticWeapon, _x, _containerMagazineCount select _forEachIndex] call FUNC(reload_handleReturnAmmo); + } forEach _containerMagazineClassnames; +}; diff --git a/addons/csw/functions/script_component.hpp b/addons/csw/functions/script_component.hpp new file mode 100644 index 00000000000..7e8eaa8954f --- /dev/null +++ b/addons/csw/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\csw\script_component.hpp" diff --git a/addons/csw/initSettings.sqf b/addons/csw/initSettings.sqf new file mode 100644 index 00000000000..28397a6e9b3 --- /dev/null +++ b/addons/csw/initSettings.sqf @@ -0,0 +1,53 @@ +// CBA Settings [ADDON: ace_csw]: + +private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; + +[ + QGVAR(defaultAssemblyMode), "CHECKBOX", + [LSTRING(defaultAssemblyMode_displayName), LSTRING(defaultAssemblyMode_description)], + _categoryArray, + false, // default value + true, // isGlobal + {[QGVAR(defaultAssemblyMode), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(handleExtraMagazines), "CHECKBOX", + [LSTRING(handleExtraMagazines_displayName), LSTRING(handleExtraMagazines_description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(handleExtraMagazines), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(ammoHandling), "LIST", + [LSTRING(ammoHandling_displayName), LSTRING(ammoHandling_description)], + _categoryArray, + [[0, 1, 2], [LELSTRING(common,Disabled), LELSTRING(common,playerOnly), LELSTRING(common,playersAndAI)], 2], // [_values, _valueTitles, _defaultIndex] + true, // isGlobal + {[QGVAR(ammoHandling), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(progressBarTimeCoefficent), "SLIDER", + [LSTRING(progressBarTimeCoefficent_displayName), LSTRING(progressBarTimeCoefficent_description)], + _categoryArray, + [0,2,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(progressBarTimeCoefficent), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(dragAfterDeploy), "CHECKBOX", + [LSTRING(dragAfterDeploy_displayName), LSTRING(dragAfterDeploy_description)], + _categoryArray, + false, // default value + false, // isGlobal + {[QGVAR(dragAfterDeploy), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/csw/script_component.hpp b/addons/csw/script_component.hpp new file mode 100644 index 00000000000..29521039f24 --- /dev/null +++ b/addons/csw/script_component.hpp @@ -0,0 +1,28 @@ +#define COMPONENT csw +#define COMPONENT_BEAUTIFIED Crew-Served Weapons +#include "\z\ace\addons\main\script_mod.hpp" + +// #define FAST_PROGRESSBARS +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_CSW + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_CSW + #define DEBUG_SETTINGS DEBUG_SETTINGS_CSW +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + + +#define DISTANCE_FROM_GUN 1.5 +#define RELATIVE_DIRECTION(direction) [DISTANCE_FROM_GUN, direction] + +#ifdef FAST_PROGRESSBARS + #define TIME_PROGRESSBAR(X) ((X) * 0.075) +#else + #define TIME_PROGRESSBAR(X) ((X) * GVAR(progressBarTimeCoefficent)) +#endif diff --git a/addons/csw/script_config_macros_csw.hpp b/addons/csw/script_config_macros_csw.hpp new file mode 100644 index 00000000000..1a0e1b3be54 --- /dev/null +++ b/addons/csw/script_config_macros_csw.hpp @@ -0,0 +1,15 @@ +#define CREATE_CSW_PROXY(weapon) class ##weapon; class GVAR(weapon): ##weapon { magazineReloadTime = 0.5; } + +// Need to be careful about breaking Attributes inheritance, doesn't seem to be any standard +#define ENABLE_CSW_ATTRIBUTE class Attributes { \ + class EGVAR(CSW,assemblyMode) { \ + property = QEGVAR(CSW,assemblyMode); \ + control = QEGVAR(CSW,assemblyModeControl); \ + displayName = ECSTRING(CSW,eden_enableCSW); \ + tooltip = ECSTRING(CSW,eden_enableCSW_tooltip); \ + expression = QUOTE( if (_value != 3) then {_this setVariable [ARR_3('%s',_value,true)]} ); \ + typeName = "NUMBER"; \ + condition = "objectVehicle"; \ + defaultValue = 3; \ + }; \ + } diff --git a/addons/csw/stringtable.xml b/addons/csw/stringtable.xml new file mode 100644 index 00000000000..6f409883953 --- /dev/null +++ b/addons/csw/stringtable.xml @@ -0,0 +1,931 @@ + + + + + Crew Served Weapons + Crew Served Weapons + Crew Served Weapons (CSW) + Armes statiques + 共用火器 (CSW) + 班組支援武器 + Armi servite dall'equipaggio + Posádkou obsluhované zbraně (CSW) + Broń ciężka (CSW) + Armas provistas por la tripulación + Групповое вооружение (CSW) + + + Place Tripod + Platziere Dreibein + Montar Tripé + Placer le trépied + 三脚を設置 + 設置三腳架 + Piazza treppiede + Položit trojnožku + Rozłóż Trójnóg + Colocar trípode + Üçayağı Yerleştir + Разложить треногу + + + Disassemble + Rozložit + Démonter + Auseinandernehmen + Disassemblare + Złóż + Desmontar + Разобрать + Desmonta + 解体 + 拆解 + Bin + + + Get In + Nastup + Entrer + Einsteigen + A bordo + Wsiadać + Entrar + Войти + Entrar + 乗る + 進入 + + + Load %1 + Lade %1 + Cargar %1 + Nabít %1 + Charger %1 + Załaduj %1 + Carico %1 + Загрузить %1 + Load %1 + Carregar %1 + %1 を装填 + 裝填 %1 + Yükle %1 + + + Unload %1 + Entlade %1 + Descargar %1 + Vytáhnout zásobník z %1 + Décharger %1 + Rozładuj %1 + Scarica %1 + Разгрузить %1 + Unload %1 + Descarregar %1 + %1 を除去 + 卸載 %1 + Boşalt %1 + + + Link %1 + Verbinde %1 + Conectar %1 + Connecter %1 + %1 を接続 + 聯結至 %1 + Collega %1 + Spojit %1 + Połącz %1 + Conectar %1 + Соединить %1 + + + Advanced assembly + Erweiterter Zusammenbau + Montagem Avançada + Assemblage avancé + アドバンスド設置 + 進階組裝 + Montaggio avanzato + Pokročilé skládání + Zaawansowane składanie + Ensamblado avanzado + Продвинутая сборка + + + Use ace for Assemble/Disassemble of supported static weapons. Loaded ammo is reduced to a single magazine. + Benutze ACE um unterstützte statische Waffen zu montieren/demontieren. Geladene Munition ist auf ein einzelnes Magazin reduziert. + Usar o ACE para Montar/Desmontar armas estáticas suportadas. Munição carregada é reduzida para um único carregador. + Utilise ACE pour l'assemblage/le désassemblage des armes statiques supportées.\nLes munitions chargées sont réduites à un seul chargeur. + 対応している設置型火器に ACE3 の設置と解体を使用します。装填済みの弾倉は 1 つの弾倉に減少します。 + 使用ACE來組裝/拆解固定型武器。上膛的限制為單個彈匣。 + Utilizzare ace per l'Assemblaggio/smontaggio di armi statiche supportate. Le munizioni cariche sono ridotte ad un solo caricatore. + Použít ACE pro složení/rozložení podporovaných statických zbraní. Nabitá munice je snížená na jeden zásobník. + Użyj ACE do składania/rozkładania broni statycznych. Załadowana amunicja zostaje zredukowana do jednego magazynku. + Usar el ACE para el ensamblado/desamblado de armas estáticas soportadas. La munición cargada es reducida a un sólo cargador + Использовать ACE для сборки/разборки поддерживаемого статического оружия. Заряженные боеприпасы будут сокращены в единственный магазин. + + + Save extra ammo + Spare extra Munition + Economizar munição extra + Conserver le surplus de munitions + 過剰弾薬を保持 + 保存額外彈藥 + Risparmiare munizioni extra + Uložit munici navíc. + Zapisz dodatkową amunicje + Guardar munición extra + Сохранить дополнительные боеприпасы + + + Store extra magazines next to static weapon + Lager extra Magazine neben der statischen Waffe + Carregar munições extras próximo à arma estática + Range les chargeurs en surplus auprès de l'arme statique. + 次の設置型火器用に過剰弾薬を保持します。 + 在固定型武器旁存放額外彈匣 + Conservare i caricatori extra accanto all'arma statica + Ukládat munici navíc vedle statické zbraně. + Dodatkowe magazynki przechowuj obok broni statycznej + Almacenar cargadores extra junto al arma estática + Хранить дополнительные магазины рядом со статическим оружием + + + Ammo handling + Munitionsmanagement + Manipulação de Munições + Manipulation des munitions + 弾薬の処理 + 彈藥處理 + Gestione delle munizioni + Manipulace s municí + Obsługa amunicji + Manejo de munición + Обслуживание боеприпасов + + + Allow loading and unloading magazines + Erlaubt es Magazine zu- und entladen. + Permite carregamento e descarregamento de munições + Définit qui peut charger et décharger les chargeurs. + 弾薬の装填と除去を許可します。 + 允許裝填或卸載彈匣 + Permettere il carico e lo scarico dei caricatori + Povolit nabíjení a vybíjení zásobníků. + Zezwalaj na ładowanie i rozładowywanie magazynków + Permitir la carga y descarga de cargadores + Разрешить загрузку и разгрузку магазинов + + + Interaction Time Coefficent + Interaktionsdauerkoeffizient + Coeficiente de tempo para a interação + Coefficient du temps d'interaction + インタラクション時間係数 + 互動時間係數 + Coefficente per il tempo di interazione + Koeficient času interakce + Współczynnik czasu interakcji + Coeficiente de tiempo de interacción + Коэффициент времени взаимодействия + + + Scales time required to assemble and reload static weapons + Skaliert die Zeit die benötigt wird um statische Waffen aufzubauen und nachzuladen. + Escala o tempo requerido para montar e recarregar armas estáticas. + Définit l'échelle de temps nécessaire à l'assemblage et au rechargement des armes statiques. + 設置型火器の設置と再装填時間を管理できます。 + 設置組裝及裝填組裝固定型武器 + Tempo necessario per assemblare e ricaricare le armi statiche + Škáluje čas potřebný ke skládání a přebíjení statických zbraní. + Definiuje czas potrzebny do złożenia i przeładowania broni statycznej + Escala el tiempo requerida para ensamblar y recargar el arma estática + Изменяет время, необходимое для сборки и перезарядки статического оружия + + + Drag tripods after deploying + Ziehe Dreibeine nach Aufbau + Arrastar tripés após montar + Glisser le trépied après déploiement + 設置後に三脚を引きずる + 在佈置三腳架後拖拉 + Trascinare i treppiedi dopo lo schieramento + Tahat trojnožku po položení + Przeciągnij statyw po rozmieszczeniu + Arrastrar trípodes despues de desplegarlos + Тащить треногу после развертывания + + + After deploying a tripod, start dragging it to a precise location + Ziehe das Dreibein zu einer exakten Position nachdem es aufgestellt wurde. + Assim que montar um tripé, automaticamente começa a arrastá-lo para um posicionamento mais preciso + Aussitôt après avoir déployé un trépied, le joueur commence automatiquement à le glisser pour le positionner plus précisément. + 三脚を設置後、動かせるよう三脚を引きずるようにします。 + 在部署三腳架後,開始拖動它使其在你所要的精準位置 + Dopo aver posizionato un treppiede, iniziate a trascinarlo in una posizione precisa + Po položení trojnožky začít automaticky tahání pro lepší polohu. + Po rozłożeniu trójnogu zacznij od przeciągania go w określone miejsce + Después de desplegar un trípode, comenzar a arrastrarlo hacia la ubicación precisa + После развертывания начать тащить треногу на другое место + + + Pickup Tripod + Dreibein aufnehmen + Carregar Tripé + Récupérer le trépied + 三脚を拾う + 撿起三腳架 + Recupero treppiede + Složit trojnožku + Podnieś Trójnóg + Recoger trípode + Подобрать треногу + + + Mount Weapon + Waffe montieren + Montar Arma + Monter l'arme + 火器を乗せる + 裝載武器 + Montare l'arma + Připevnit zbraň + Zamontuj Broń + Montar arma + Установить оружие + + + Disassembling Gun... + Nehme Waffe auseinander... + Desmontando Arma... + Désassemblage de l'arme... + 火器を解体中です・・・ + 拆裝武器中... + Smontaggio arma... + Rozkládám zbraň... + Rozkładanie Broni... + Desensamblando arma... + Разборка оружия... + + + Assembling Gun... + Montiere Waffe... + Montando Arma... + Assemblage de l'arme... + 火器を設置中です・・・ + 組裝武器中... + Montaggio arma... + Skládám zbraň... + Składanie Broni... + Ensamblando arma... + Сборка оружия... + + + Picking Up Tripod... + Nehme Dreibein auf... + Carregando Tripé... + Récupération du trépied... + 三脚を取得中です・・・ + 撿起三腳架... + Recupero treppiede... + Zvedám trojnožku... + Podnoszenie Trójnogu... + Recogiendo trípode... + Поднятие треноги... + + + Placing Tripod... + Platziere Dreibein... + Montando Tripé... + Installation du trépied... + 三脚を設置中です・・・ + 部署三腳架... + Piazzare treppiede... + Pokládám trojnožku... + Rozmieszczanie Trójnogu... + Ubicando trípode... + Размещение треноги... + + + Enable CSW + Aktiviere CSW + Ativar CSW + Activer CSW + CSW 有効化 + 啟用CSW(班用支援武器) + Attiva CSW + Povolit posádkou obsluhované zbraně (CSW) + Włącz CSW + Habilitar CSW + Включить CSW + + + Enables Crew Served ability on this weapon + Ermögliche CSW auf dieser Waffe + Ativar funções de CSW nessa arma + Active les fonctions CSW sur cette arme. + この火器で共用火器を有効化します。 + 對此武器啟用班組支援能力 + Abilita l'abilità dell'equipaggio su quest'arma + Zapne CSW funkce na této zbrani + Włącza opcje systemu CSW na tej broni + Habilitar el manejo de uso colectivo para esta arma + Включает CSW на этом оружии + + + Enabled and Leave Weapon Empty + Aktiviere und lasse diese Waffe leer + Ativado e deixar arma vazia + Activer et laisser l'arme vide + 火器有効化し空を維持 + 啟用並不裝填武器 + Abilitato e lascia l'arma vuota + Povolit a nechat zbraň prázdnou + Włącz i pozostaw broń pustą + Habilitar y dejar el arma vacía + Включено и оставить оружие пустым + + + Tripod + Trépied + Trípode + Treppiede + Trójnóg + Dreibein + Üçayak + Tripé + 三脚 + 三腳架 + Trojnožka + Тренога + + + [CSW] Static Mini-Spike Launcher (AT) + [CSW] Lanzador estático Mini-Spike (AT) + [CSW] Statische Lenkwaffe "Mini-Spike" (AT) + [CSW] Lançador Estático - Mini-Spike (AT) + [CSW] Lanceur statique Mini-Spike (AT) + [CSW] 設置型ミニ スパイク ランチャー (AT) + [CSW] 固定型 "迷你長釘"導彈發射器(對地) + [CSW] Static Mini-Spike Launcher (AT) + [CSW] Statický raketomet Mini-Spike (protitankový) + [CSW] Static Mini-Spike Launcher (AT) + [CSW] Mini-Spike Przeciwpancerny pocisk rakietowy + [CSW] Станковый Mini-Spike ПТРК + + + [CSW] Static Mini-Spike Launcher (AA) + [CSW] Lanzador estático Mini-Spike (AA) + [CSW] Statische Lenkwaffe "Mini-Spike" (AA) + [CSW] Lançador Estático - Mini-Spike (AA) + [CSW] Lanceur statique Mini-Spike (AA) + [CSW] 設置型ミニ スパイク ランチャー (AA) + [CSW] 固定型 "迷你長釘"導彈發射器(對空) + [CSW] Static Mini-Spike Launcher (AA) + [CSW] Statický raketomet Mini-Spike (protiletadlový) + [CSW] Static Mini-Spike Launcher (AA) + [CSW] Mini-Spike Przeciwlotniczy pocisk rakietowy + [CSW] Станковый Mini-Spike ЗРК + + + [CSW] Static XM312 Gun + [CSW] Arma estática XM312 + [CSW] Statische XM312 + [CSW] Arma Estática - XM312 + [CSW] Mitrailleuse statique XM312 + [CSW] 設置型 XM312 + [CSW] 固定型 XM312重機槍 + [CSW] Static XM312 Gun + [CSW] Statická zbraň XM312 + [CSW] Static XM312 Gun + [CSW] Statyczny karabin maszynowy XM312 + [CSW] Станковый XM312 пулемёт + + + [CSW] Static M2 w/ Shield + [CSW] M2 estática con escudo + [CSW] Statická zbraň M2 se štítem + [CSW] Mitrailleuse statique M2 ac. bouclier + [CSW] Statyczny karabin maszynowy M2 z tarczą + [CSW] Станковый M2 со щитом + + + [CSW] Static XM312 Gun (Autonomous) + [CSW] Arma estática XM312 (Autónoma) + [CSW] Statische XM312 (Autonom) + [CSW] Arma Estática - XM312 (Autônoma) + [CSW] Mitrailleuse statique XM312 (Autonome) + [CSW] 設置型 XM312 (自律型) + [CSW] 固定型 XM312重機槍(自主型) + [CSW] Static XM312 Gun (Autonomo) + [CSW] Statická zbraň XM312 (autonomická) + [CSW] Static XM312 Gun (Autonomous) + [CSW] Statyczny karabin maszynowy XM312 (Dron) + [CSW] Станковый XM312 пулемёт (автономный) + + + [CSW] Static XM307 Gun + [CSW] Arma estática XM307 + [CSW] Statische XM307 + [CSW] Arma Estática - XM307 + [CSW] Lance-grenades statique XM307 + [CSW] 設置型 XM307 + [CSW] 固定型XM307榴彈機槍 + [CSW] Static XM307 Gun + [CSW] Statická zbraň XM307 + [CSW] Static XM307 Gun + [CSW] Statyczny granatnik automatyczny XM307 + [CSW] Станковый XM307 гранатомёт + + + [CSW] Static XM307 Gun (Autonomous) + [CSW] Arma estática XM307 (Autónoma) + [CSW] Statische XM307 (Autonom) + [CSW] Arma Estática - XM307 (Autônoma) + [CSW] Lance-grenades statique XM307 (Autonome) + [CSW] 設置型 XM307 (自律型) + [CSW] 固定型 XM307榴彈機槍(自主型) + [CSW] Static XM307 Gun (Autonomo) + [CSW] Statická zbraň XM307 (autonomická) + [CSW] Static XM307 Gun (Autonomous) + [CSW] Statyczny granatnik automatyczny XM307 (Dron) + [CSW] Станковый XM307 гранатомёт (автономный) + + + [CSW] 12.7x108mm HMG Belt + [CSW] Cinta de munición 12.7x108mm HMG + [CSW] 12.7x108mm HMG-Gurt + [CSW] Cinto de Munição - 12.7x108mm HMG + [CSW] Bande 12,7x108 mm HMG + [CSW] 12.7x108 mm HMG ベルト + [CSW]12.7x108毫米 重機槍彈鏈 + [CSW] 12.7x108mm HMG Belt + [CSW] Pás 12.7×108mm pro těžký kulomet + [CSW] 12.7x108mm HMG Belt + [CSW] Taśma 12.7x108mm CKM + [CSW] 12.7x108 мм пулемётная лента + + + [CSW] 12.7x99mm HMG Belt + [CSW] Cinta de munición 12.7x99mm HMG + [CSW] 12.7x99mm HMG-Gurt + [CSW] Cinto de Munição - 12.7x99mm HMG + [CSW] Bande 12,7x99 mm HMG + [CSW] 12.7x99 mm HMG ベルト + [CSW]12.7x99毫米 重機槍彈鏈 + [CSW] 12.7x99mm HMG Belt + [CSW] Pás 12.7×99mm pro těžký kulomet + [CSW] 12.7x99mm HMG Belt + [CSW] Taśma 12.7x99mm CKM + [CSW] 12.7x99 мм пулемётная лента + + + [CSW] 12.7x99mm Tracer HMG Belt (Red) + [CSW] Cinta de munición 12.7x99mm HMG Trazadora (Roja) + [CSW] 12.7x99mm Leuchtspur HMG-Gurt (Rot) + [CSW] Cinto de Munição - 12.7x99mm HMG (Traçante Vermelho) + [CSW] Bande 12,7x99 mm HMG traçantes (Rouges) + [CSW] 12.7x99 mm HMG 曳光弾ベルト (赤) + [CSW] 12.7x99毫米 重機槍曳光彈鏈(紅色) + [CSW] 12.7x99mm Tracer HMG Belt (Red) + [CSW] Pás 12.7×99mm pro těžký kulomet (červená stopovka) + [CSW] 12.7x99mm Tracer HMG Belt (Red) + [CSW] Taśma 12.7x99mm CKM Smugowa (Czerwona) + [CSW] 12.7x99 мм трасс. пулемётная лента (Красный) + + + [CSW] 12.7x99mm Tracer HMG Belt (Green) + [CSW] Cinta de munición 12.7x99mm HMG Trazadora (Verde) + [CSW] 12.7x99mm Leuchtspur HMG-Gurt (Grün) + [CSW] Cinto de Munição - 12.7x99mm HMG (Traçante Verde) + [CSW] Bande 12,7x99 mm HMG traçantes (Vertes) + [CSW] 12.7x99 mm HMG 曳光弾ベルト (緑) + [CSW] 12.7x99毫米 重機槍曳光彈鏈(綠色) + [CSW] 12.7x99mm Tracer HMG Belt (Green) + [CSW] Pás 12.7×99mm pro těžký kulomet (zelená stopovka) + [CSW] 12.7x99mm Tracer HMG Belt (Green) + [CSW] Taśma 12.7x99mm CKM Smugowa (Zielona) + [CSW] 12.7x99 мм трасс. пулемётная лента (Зелёный) + + + [CSW] 12.7x99mm Tracer HMG Belt (Yellow) + [CSW] Cinta de munición 12.7x99mm HMG Trazadora (Amarilla) + [CSW] 12.7x99mm Leuchtspur HMG-Gurt (Gelb) + [CSW] Cinto de Munição - 12.7x99mm HMG (Traçante Amarelo) + [CSW] Bande 12,7x99 mm HMG traçantes (Jaunes) + [CSW] 12.7x99 mm HMG 曳光弾ベルト (黄) + [CSW] 12.7x99毫米 重機槍曳光彈鏈(黃色) + [CSW] 12.7x99mm Tracer HMG Belt (Yellow) + [CSW] Pás 12.7×99mm pro těžký kulomet (žlutá stopovka) + [CSW] 12.7x99mm Tracer HMG Belt (Yellow) + [CSW] Taśma 12.7x99mm CKM Smugowa (Żółta) + [CSW] 12.7x99 мм трасс. пулемётная лента (Жёлтый) + + + [CSW] 20mm Grenade GMG Belt + [CSW] Cinta de munición de granadas 20mm GMG + [CSW] 20mm Granate GMG-Gurt + [CSW] Cinto de Munição - Granada 20mm GMG + [CSW] Bande grenades 20 mm GMG + [CSW] 20 mm てき弾 GMG ベルト + [CSW]20毫米 榴彈 榴彈機槍彈鏈 + [CSW] 20mm Grenade GMG Belt + [CSW] Pás 20mm granátů pro granátomet + [CSW] 20mm Grenade GMG Belt + [CSW] Taśma 20mm do granatnika + [CSW] Лента 20-мм гранат для ст. гранатомёта + + + M3 Tripod + Trípode M3 + M3 Dreibein + M3 Tripé + Trépied M3 + M3 三脚 + M3 三腳架 + M3 Tripod + M3 trojnožka + M3 Tripod + Trójnóg M3 + Станок M3 + + + [CSW] 6P57 Deployable Tripod + [CSW] Trípode desplegable 6P57 + [CSW] 6P57 aufstellbares Dreibein + [CSW] 6P57 Tripé Ajustável + [CSW] 6P57 Trépied déployable + [CSW] 6P57 設置型三脚 + [CSW] 6P57 部署型三腳架 + [CSW] 6P57 Deployable Tripod + [CSW] 6P57 trojnožka + [CSW] 6P57 Deployable Tripod + [CSW] Trójnóg Rozkładany 6P57 + [CSW] 6P67 Развертываемая тренога + + + [CSW] 6P57 Deployable Tripod (Low) + [CSW] Trípode desplegable 6P57 (Bajo) + [CSW] 6P57 aufstellbares Dreibein (Niedrig) + [CSW] 6P57 Tripé Ajustável (Baixo) + [CSW] 6P57 Trépied déployable (Bas) + [CSW] 6P57 設置型三脚 (低座) + [CSW] 6P57 部署型(低位) + [CSW] 6P57 Deployable Tripod (Low) + [CSW] 6P57 trojnožka (nízká) + [CSW] 6P57 Deployable Tripod (Low) + [CSW] Trójnóg Rozkładany 6P57 (Niski) + [CSW] 6P67 Развертываемая тренога (Низкая) + + + [CSW] M220 Deployable Tripod + [CSW] Trípode desplegable M220 + [CSW] M220 aufstellbares Dreibein + [CSW] M220 Tripé Ajustável + [CSW] M220 Trépied déployable + [CSW] M220 設置型三脚 + [CSW] M220 部署型三腳架 + [CSW] M220 Deployable Tripod + [CSW] M220 trojnožka + [CSW] M220 Deployable Tripod + [CSW] Trójnóg Rozkładany M220 + [CSW] M220 Развертываемая тренога + + + [CSW] SAG-30 Deployable Tripod + [CSW] Trípode desplegable SAG-30 + [CSW] SAG-30 aufstellbares Dreibein + [CSW] SAG-30 Tripé Ajustável + [CSW] SAG-30 Trépied déployable + [CSW] SAG-30 設置型三脚 + [CSW] SAG-30 部署型三腳架 + [CSW] SAG-30 Deployable Tripod + [CSW] SAG-30 trojnožka + [CSW] SAG-30 Deployable Tripod + [CSW] Trójnóg Rozkładany SAG-30 + [CSW] SAG-30 Развертываемая тренога + + + 6P57 Tripod + Trípode desplegable 6P57 + 6P57 Dreibein + Tripé 6P57 + Trépied 6P57 + 6P57 三脚 + 6P57 三腳架 + 6P57 Tripod + 6P57 trojnožka + 6P57 Tripod + Trójnóg 6P57 + 6P67 Тренога + + + SAG-30 Tripod + Trípode SAG-30 + SAG-30 Dreibein + Tripe SAG-30 + Trépied SAG-30 + SAG-30 三脚 + SAG-30 三腳架 + SAG-30 Tripod + SAG-30 trojnožka + SAG-30 Tripod + Trójnóg SAG-30 + SAG-30 Тренога + + + M220 Tripod + Trípode M220 + M220 Dreibein + Tripé M220 + Trépied M220 + M220 三脚 + M220 三腳架 + M220 Tripod + M220 trojnožka + M220 Tripod + Trójnóg M220 + M220 Тренога + + + [CSW] M3 Deployable Tripod + [CSW] Trípode desplegable M3 + [CSW] M3 aufstellbares Dreibein + [CSW] M3 Tripe Ajustável + [CSW] M3 Trépied déployable + [CSW] M3 設置型三脚 + [CSW] M3 部屬型三腳架 + [CSW] M3 Deployable Tripod + [CSW] M3 trojnožka + [CSW] M3 Deployable Tripod + [CSW] Trójnóg Rozkładany M3 + [CSW] M3 Развертываемая тренога + + + [CSW] M3 Deployable Tripod (Low) + [CSW] Trípode desplegable M3 (Bajo) + [CSW] M3 aufstellbares Dreibein (Niedrig) + [CSW] M3 Tripe Ajustável (Baixo) + [CSW] M3 Trépied déployable (Bas) + [CSW] M3 設置型三脚 (低座) + [CSW] M3 部署型三腳架(低位) + [CSW] M3 Deployable Tripod (Low) + [CSW] M3 trojnožka (nízká) + [CSW] M3 Deployable Tripod (Low) + [CSW] Trójnóg Rozkładany M3 (Niski) + [CSW] M3 Развертываемая тренога (Низкая) + + + [CSW] Mortar Baseplate + [CSW] Placa base de mortero + [CSW] M3 Mörsergrundplatte + [CSW] Placa base de Morteiro + [CSW] Plaque de base pour mortier + [CSW] 迫撃砲基盤 + [CSW] 迫擊炮基座 + [CSW] Mortar Baseplate + [CSW] Podstavec pro minomet + [CSW] Mortar Baseplate + [CSW] Podstawa Moździerza + [CSW] Миномётная плита + + + Mortar Baseplate + Placa base de mortero + Mörsergrundplatte + Placa base de Morteiro + Plaque de base pour mortier + 迫撃砲基盤 + 迫擊炮基座 + Mortar Baseplate + Podstavec pro minomet + Mortar Baseplate + Podstawa Moździerza + Миномётная плита + + + [CSW] Mk6 Mortar Tube + [CSW] Mk6 Tubo de mortero + [CSW] Mk6 Mörserrohr + [CSW] Tubo de Morteiro - Mk6 + [CSW] Tube mortier Mk6 + [CSW] Mk6 迫撃砲発射筒 + [CSW] Mk6 迫擊炮炮管 + [CSW] Mk6 Mortar Tube + [CSW] Minomet Mk6 hlaveň + [CSW] Mk6 Mortar Tube + [CSW] Rura Moździerza Mk6 + [CSW] Сумка с Mk6 трубой + + + [CSW] M252 Tube Bag + [CSW] M252 Tubo de mortero + [CSW] M252 Mörser Rohr Transporttasche + [CSW] Tubo de Morteiro - M252 + [CSW] Sac tube M252 + [CSW] M252 発射筒バッグ + [CSW] M252 炮管袋 + [CSW] M252 Tube Bag + [CSW] M252 minometná hlaveň v pouzdře + [CSW] M252 Tube Bag + [CSW] Torba na M252 + [CSW] Сумка с M252 орудием + + + [CSW] M2 Gun Bag + [CSW] M2 Bolsa de arma + [CSW] M2 Waffentasche + [CSW] Bolsa de Arma - M2 + [CSW] Sac M2 + [CSW] M2 ガン バッグ + [CSW] M2槍械袋 + [CSW] M2 Gun Bag + [CSW] M2 zbraň v pouzdře + [CSW] M2 Gun Bag + [CSW] Torba na M2 + [CSW] Сумка с M2 орудием + + + [CSW] MK19 Gun Bag + [CSW] MK19 Bolsa de arma + [CSW] MK19 Waffentasche + [CSW] Bolsa de Arma - MK19 + [CSW] Sac MK19 + [CSW] Mk19 ガン バッグ + [CSW] Mk19槍械袋 + [CSW] MK19 Gun Bag + [CSW] MK19 zbraň v pouzdře + [CSW] MK19 Gun Bag + [CSW] Torba na MK19 + [CSW] Сумка с MK19 орудием + + + [CSW] BGM-71 TOW Launcher Bag + [CSW] BGM-71 TOW Bolsa de lanzador + [CSW] BGM-71 TOW Werfer Transporttasche + [CSW] Bolsa de Lançador - BGM-71 TOW + [CSW] Sac lanceur BGM-71 TOW + [CSW] BGM-71 TOW ランチャー バッグ + [CSW] BGM-71 拖式飛彈發射器袋 + [CSW] BGM-71 TOW Launcher Bag + [CSW] BGM-71 TOW raketomet v pouzdře + [CSW] BGM-71 TOW Launcher Bag + [CSW] Torba na BGM-71 TOW + [CSW] Сумка с BGM-71 TOW установкой + + + [CSW] DSHK Gun Bag + [CSW] DSHK Bolsa de arma + [CSW] DSHK Waffentasche + [CSW] Bolsa de Arma - DSHK + [CSW] Sac DSHK + [CSW] DShK ガン バッグ + [CSW]DShK 槍械袋 + [CSW] DSHK Gun Bag + [CSW] DSHK zbraň v pouzdře + [CSW] DSHK Gun Bag + [CSW] Torba na DSzK + [CSW] Сумка с ДШК орудием + + + [CSW] 2B14 Tube Bag + [CSW] 2B14 Tubo de mortero + [CSW] 2B14 Werfer Transporttasche + [CSW] Bolsa de Arma - 2B14 + [CSW] Sac tube 2B14 + [CSW] 2B14 発射筒バッグ + [CSW] 2B14 炮管袋 + [CSW] 2B14 Tube Bag + [CSW] 2B14 minometná hlaveň v pouzdře + [CSW] 2B14 Tube Bag + [CSW] Torba na 2B14 + [CSW] Сумка с 2Б14 трубой + + + [CSW] NSV Gun Bag + [CSW] NSV Bolsa de arma + [CSW] NSV Waffentasche + [CSW] Bolsa de Arma - NSV + [CSW] Sac NSV + [CSW] NSV ガン バッグ + [CSW] NSV 槍械袋 + [CSW] NSV Gun Bag + [CSW] NSV zbraň v pouzdře + [CSW] NSV Gun Bag + [CSW] Torba na NSV + [CSW] Сумка с НСВ орудием + + + [CSW] KORD Gun Bag + [CSW] KORD Bolsa de arma + [CSW] KORD Waffentasche + [CSW] Bolsa de Arma - KORD + [CSW] Sac KORD + [CSW] KORD ガン バッグ + [CSW] KORD 槍械袋 + [CSW] KORD Gun Bag + [CSW] KORD zbraň v pouzdře + [CSW] KORD Gun Bag + [CSW] Torba na KORD + [CSW] Сумка с Корд орудием + + + [CSW] AGS-30 Gun Bag + [CSW] AGS-30 Bolsa de arma + [CSW] AGS-30 Waffentasche + [CSW] Bolsa de Arma - AGS-30 + [CSW] Sac AGS-30 + [CSW] AGS-30 バッグ + [CSW] AGS-30 槍械袋 + [CSW] AGS-30 Gun Bag + [CSW] ASG-30 zbraň v pouzdře + [CSW] AGS-30 Gun Bag + [CSW] Torba na AGS-30 + [CSW] Сумка с АГС-30 орудием + + + [CSW] 9K115 Metis Launcher Bag + [CSW] 9K115 Metis Bolsa de lanzador + [CSW] 9K115 Metis Werfer Transporttasche + [CSW] Bolsa de Arma - 9K115 Metis + [CSW] Sac lanceur 9K115 Metis + [CSW] 9K115 メティス ランチャー バッグ + [CSW] 9K115 麥士蒂索人發射器袋 + [CSW] 9K115 Metis Launcher Bag + [CSW] 9K115 Metis raketomet v pouzdře + [CSW] Torba na 9K115 Metis + [CSW] 9k115 Metis Launcher Bag + [CSW] Сумка с 9К115 Метис установкой + + + [CSW] 9M113 Kornet Launcher + [CSW] 9M113 Kornet Bolsa de lanzador + [CSW] 9M113 Kornet Werfer + [CSW] Bolsa de Arma - 9M113 Kornet + [CSW] Sac lanceur 9M113 Kornet + [CSW] 9M113 コルネット ランチャー バッグ + [CSW] 9M113 短號發射器 + [CSW] 9M113 Kornet Launcher + [CSW] 9M113 Kornet raketomet + [CSW] Wyrzutnia 9M113 Kornet + [CSW] 9m113 Kornet Launcher + [CSW] Сумка с 9К135 Корнет установкой + + + SPG-9 Tripod + SPG-9 Trípode + SPG-9 Dreibein + Tripé SPG-9 + Trépied SPG-9 + SPG-9 三脚 + SPG-9 三腳架 + SPG-9 Tripod + SPG-9 trojnožka + SPG-9 Tripod + Trójnóg SPG-9 + СПГ-9 Тренога + + + [CSW] SPG-9 Deployable Tripod + [CSW] SPG-9 Trípode desplegable + [CSW] SPG-9 aufstellbares Dreibein + [CSW] SPG-9 Tripe Ajustável (Baixo) + [CSW] SPG-9 Trépied déployable + [CSW] SPG-9 設置型三脚 + [CSW] SPG-9 部署型三腳架 + [CSW] SPG-9 Deployable Tripod + [CSW] SPG-9 trojnožka + [CSW] SPG-9 Deployable Tripod + [CSW] Trójnóg rozkładany SPG-9 + [CSW] СПГ-9 Развертываемая тренога + + + [CSW] SPG-9 Launcher Bag + [CSW] SPG-9 Bolsa de lanzador + [CSW] SPG-9 Werfer Transporttasche + [CSW] Bolsa de Lançador - SPG-9 + [CSW] Sac lanceur SPG-9 + [CSW] SPG-9 ランチャー バッグ + [CSW] SPG-9 發射器袋 + [CSW] SPG-9 Launcher Bag + [CSW] SPG-9 raketomet v pouzdře + [CSW] SPG-9 Launcher Bag + [CSW] Torba na SPG-9 + [CSW] Сумка с СПГ-9 орудием + + + [CSW] SPG-9M Launcher Bag + [CSW] SPG-9M Bolsa de lanzador + [CSW] SPG-9M Werfer Transporttasche + [CSW] Bolsa de Lançador - SPG-9M + [CSW] Sac lanceur SPG-9M + [CSW] SPG-9M ランチャー バッグ + [CSW] SPG-9M 發射器袋 + [CSW] SPG-9M Launcher Bag + [CSW] SPG-9M raketomet v pouzdře + [CSW] SPG-9M Launcher Bag + [CSW] Torba na SPG-9M + [CSW] Сумка с СПГ-9М орудием + + + diff --git a/addons/dagr/CfgEventHandlers.hpp b/addons/dagr/CfgEventHandlers.hpp index ccbe4f4abbb..7694c8e7455 100644 --- a/addons/dagr/CfgEventHandlers.hpp +++ b/addons/dagr/CfgEventHandlers.hpp @@ -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)); }; }; \ No newline at end of file diff --git a/addons/dagr/functions/fnc_menuInit.sqf b/addons/dagr/functions/fnc_menuInit.sqf index 0425f1f4d28..c535ac1349a 100644 --- a/addons/dagr/functions/fnc_menuInit.sqf +++ b/addons/dagr/functions/fnc_menuInit.sqf @@ -347,7 +347,7 @@ GVAR(menuRun) = true; GVAR(digit4) = floor (GVAR(wp0) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); GVAR(digit5) = floor (GVAR(wp0) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); GVAR(digit6) = floor (GVAR(wp0) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); - GVAR(digit7) = floor (GVAR(wp0) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit7) = floor (GVAR(wp0) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); GVAR(digit8) = floor (GVAR(wp0) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); }; case 1: { @@ -357,7 +357,7 @@ GVAR(menuRun) = true; GVAR(digit4) = floor (GVAR(wp1) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); GVAR(digit5) = floor (GVAR(wp1) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); GVAR(digit6) = floor (GVAR(wp1) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); - GVAR(digit7) = floor (GVAR(wp1) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit7) = floor (GVAR(wp1) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); GVAR(digit8) = floor (GVAR(wp1) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); }; case 2: { @@ -367,7 +367,7 @@ GVAR(menuRun) = true; GVAR(digit4) = floor (GVAR(wp2) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); GVAR(digit5) = floor (GVAR(wp2) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); GVAR(digit6) = floor (GVAR(wp2) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); - GVAR(digit7) = floor (GVAR(wp2) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit7) = floor (GVAR(wp2) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); GVAR(digit8) = floor (GVAR(wp2) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); }; case 3: { @@ -377,7 +377,7 @@ GVAR(menuRun) = true; GVAR(digit4) = floor (GVAR(wp3) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); GVAR(digit5) = floor (GVAR(wp3) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); GVAR(digit6) = floor (GVAR(wp3) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); - GVAR(digit7) = floor (GVAR(wp3) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit7) = floor (GVAR(wp3) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); GVAR(digit8) = floor (GVAR(wp3) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); }; case 4: { @@ -387,7 +387,7 @@ GVAR(menuRun) = true; GVAR(digit4) = floor (GVAR(wp4) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); GVAR(digit5) = floor (GVAR(wp4) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); GVAR(digit6) = floor (GVAR(wp4) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); - GVAR(digit7) = floor (GVAR(wp4) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit7) = floor (GVAR(wp4) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); GVAR(digit8) = floor (GVAR(wp4) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); }; }; @@ -457,7 +457,7 @@ GVAR(menuRun) = true; GVAR(digit4) = floor(_gridVector / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); GVAR(digit5) = floor(_gridVector / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); GVAR(digit6) = floor(_gridVector / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); - GVAR(digit7) = floor(_gridVector / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit7) = floor(_gridVector / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); GVAR(digit8) = floor(_gridVector - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); }; if (GVAR(F3)) then { diff --git a/addons/dagr/stringtable.xml b/addons/dagr/stringtable.xml index c364eedabec..aa22633a7cd 100644 --- a/addons/dagr/stringtable.xml +++ b/addons/dagr/stringtable.xml @@ -15,6 +15,7 @@ DAGR 軍用GPS接收器 军用GPS接收器 + DAGR Configure DAGR @@ -30,6 +31,7 @@ DAGR 설정 設定軍用GPS接收器 设定军用GPS接收器 + DAGR'ı yapılandır Toggle DAGR @@ -40,11 +42,12 @@ Mostrar DAGR Přepnout DAGR Apri DAGR - Activer/Desactiver le DAGR + Activer/Désactiver le DAGR DAGR を常に表示 DAGR 토글 切換軍用GPS接收器 切换军用GPS接收器 + DAGR'yi aç / kapat Defense Advanced GPS Receiver diff --git a/addons/disarming/config.cpp b/addons/disarming/config.cpp index e38f4346ab8..5b81e5faf5a 100644 --- a/addons/disarming/config.cpp +++ b/addons/disarming/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {"ACE_DebugPotato"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_Interaction"}; + requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); authors[] = {"PabstMirror"}; url = ECSTRING(main,URL); diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index 30f9fa4b857..9cc9dca680b 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -16,6 +16,7 @@ 소지품 열기 開啟裝備 开启装备 + Envanteri Aç diff --git a/addons/disposable/CfgEventHandlers.hpp b/addons/disposable/CfgEventHandlers.hpp deleted file mode 100644 index a7c50f32472..00000000000 --- a/addons/disposable/CfgEventHandlers.hpp +++ /dev/null @@ -1,33 +0,0 @@ - -class Extended_PreStart_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preStart)); - }; -}; - -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit)); - }; -}; - -class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); - }; -}; - -class Extended_DisplayLoad_EventHandlers { - class RscDisplayInventory { - ADDON = QUOTE([ARR_2(ACE_player, _this select 0)] call FUNC(updateInventoryDisplay)); - }; -}; - -// handle preloaded missile -class Extended_InitPost_EventHandlers { - class CAManBase { - class ADDON { - init = QUOTE([_this select 0] call FUNC(takeLoadedATWeapon)); - }; - }; -}; diff --git a/addons/disposable/CfgMagazines.hpp b/addons/disposable/CfgMagazines.hpp deleted file mode 100644 index 6204b330e4d..00000000000 --- a/addons/disposable/CfgMagazines.hpp +++ /dev/null @@ -1,15 +0,0 @@ -class CfgMagazines { - class NLAW_F; - class ACE_PreloadedMissileDummy: NLAW_F { // The dummy magazine - author = ECSTRING(common,ACETeam); - scope = 1; - scopeArsenal = 1; - displayName = CSTRING(PreloadedMissileDummy); - picture = "\a3\ui_f\data\IGUI\Cfg\Targeting\Empty_ca.paa"; - weaponPoolAvailable = 0; - mass = 0; - }; - class ACE_FiredMissileDummy: ACE_PreloadedMissileDummy { - count = 0; - }; -}; diff --git a/addons/disposable/CfgVehicles.hpp b/addons/disposable/CfgVehicles.hpp index 0ad3ff51c07..0b4d739dc66 100644 --- a/addons/disposable/CfgVehicles.hpp +++ b/addons/disposable/CfgVehicles.hpp @@ -1,146 +1,8 @@ class CfgVehicles { - #define MACRO_NONLAW \ - class TransportMagazines { \ - class _xx_NLAW_F { \ - count = 0; \ - }; \ + class Launcher_Base_F; + class Weapon_launch_NLAW_F: Launcher_Base_F { + class TransportMagazines { + delete NLAW_F; }; - - class ReammoBox_F; - class NATO_Box_Base: ReammoBox_F {}; - class Box_NATO_Ammo_F: NATO_Box_Base { - MACRO_NONLAW }; - class Box_NATO_WpsLaunch_F: NATO_Box_Base { - MACRO_NONLAW - }; - - class IND_Box_Base: ReammoBox_F {}; - class Box_IND_WpsLaunch_F: IND_Box_Base { - MACRO_NONLAW - }; - class Box_IND_Ammo_F: IND_Box_Base { - MACRO_NONLAW - }; - - class B_supplyCrate_F: ReammoBox_F { - MACRO_NONLAW - }; - class I_supplyCrate_F: B_supplyCrate_F { - MACRO_NONLAW - }; - class C_supplyCrate_F: ReammoBox_F { - MACRO_NONLAW - }; - - class B_AssaultPack_rgr; - class B_AssaultPack_rgr_LAT: B_AssaultPack_rgr { - MACRO_NONLAW - }; - class B_AssaultPack_rgr_ReconLAT: B_AssaultPack_rgr { - MACRO_NONLAW - }; - - class B_Carryall_mcamo; - class B_AssaultPack_mcamo_Ammo: B_Carryall_mcamo { - MACRO_NONLAW - }; - class B_Carryall_oli; - class I_Fieldpack_oli_Ammo: B_Carryall_oli { - MACRO_NONLAW - }; - - class B_AssaultPack_dgtl; - class I_Fieldpack_oli_LAT: B_AssaultPack_dgtl { - MACRO_NONLAW - }; - - class CargoNet_01_ammo_base_F; - class B_CargoNet_01_ammo_F: CargoNet_01_ammo_base_F { - MACRO_NONLAW - }; - class I_CargoNet_01_ammo_F: CargoNet_01_ammo_base_F { - MACRO_NONLAW - }; - - class Slingload_01_Base_F; - class B_Slingload_01_Cargo_F: Slingload_01_Base_F { - MACRO_NONLAW - }; - - class Tank_F; - class APC_Tracked_01_base_F: Tank_F { - MACRO_NONLAW - }; - /*class B_APC_Tracked_01_base_F: APC_Tracked_01_base_F { - MACRO_NONLAW - }; - class B_APC_Tracked_01_rcws_F: B_APC_Tracked_01_base_F { - MACRO_NONLAW - }; - class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { - MACRO_NONLAW - }; - class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F { - MACRO_NONLAW - };*/ - - class Car_F; - class MRAP_01_base_F: Car_F { - MACRO_NONLAW - }; - /*class MRAP_01_gmg_base_F: MRAP_01_base_F { - MACRO_NONLAW - }; - class MRAP_01_hmg_base_F: MRAP_01_gmg_base_F { - MACRO_NONLAW - }; - class B_MRAP_01_F: MRAP_01_base_F { - MACRO_NONLAW - }; - class B_MRAP_01_gmg_F: MRAP_01_gmg_base_F { - MACRO_NONLAW - }; - class B_MRAP_01_hmg_F: MRAP_01_hmg_base_F { - MACRO_NONLAW - };*/ - - class MRAP_03_base_F: Car_F { - MACRO_NONLAW - }; - /*class MRAP_03_hmg_base_F: MRAP_03_base_F { - MACRO_NONLAW - }; - class MRAP_03_gmg_base_F: MRAP_03_hmg_base_F { - MACRO_NONLAW - }; - class I_MRAP_03_F: MRAP_03_base_F { - MACRO_NONLAW - }; - class I_MRAP_03_hmg_F: MRAP_03_hmg_base_F { - MACRO_NONLAW - }; - class I_MRAP_03_gmg_F: MRAP_03_gmg_base_F { - MACRO_NONLAW - };*/ - - class Wheeled_APC_F: Car_F {}; - class APC_Wheeled_03_base_F: Wheeled_APC_F { - MACRO_NONLAW - }; - class APC_Wheeled_01_base_F: Wheeled_APC_F { - MACRO_NONLAW - }; - /*class B_APC_Wheeled_01_base_F: APC_Wheeled_01_base_F { - MACRO_NONLAW - }; - class B_APC_Wheeled_01_cannon_F: B_APC_Wheeled_01_base_F { - MACRO_NONLAW - }; - class I_APC_Wheeled_03_base_F: APC_Wheeled_03_base_F { - MACRO_NONLAW - }; - class I_APC_Wheeled_03_cannon_F: I_APC_Wheeled_03_base_F { - MACRO_NONLAW - };*/ }; diff --git a/addons/disposable/CfgWeapons.hpp b/addons/disposable/CfgWeapons.hpp index 731910b704d..55372421a7a 100644 --- a/addons/disposable/CfgWeapons.hpp +++ b/addons/disposable/CfgWeapons.hpp @@ -1,19 +1,54 @@ class CfgWeapons { - class Launcher_Base_F; + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + class launch_NLAW_F: Launcher_Base_F { - ACE_UsedTube = "ACE_launch_NLAW_Used_F"; // The class name of the used tube. - magazines[] = {"ACE_PreloadedMissileDummy"}; // The dummy magazine + scope = 2; + scopeArsenal = 2; + baseWeapon = "launch_NLAW_F"; + + magazineWell[] = {}; // remove magwell, so only the fakeMag can be loaded (inherited by used) + magazines[] = {"CBA_FakeLauncherMagazine"}; + magazineReloadTime = 0.1; + reloadMagazineSound[] = {"",1,1}; + + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 180; // launcher 100, magazine 80 + }; }; - class ACE_launch_NLAW_Used_F: launch_NLAW_F { // the used tube should be a sub class of the disposable launcher - EGVAR(nlaw,enabled) = 0; // disable guidance for the disposabled tube + + class ACE_launch_NLAW_ready_F: launch_NLAW_F { + author = ECSTRING(common,ACETeam); scope = 1; - ACE_isUsedLauncher = 1; + scopeArsenal = 1; + baseWeapon = "launch_NLAW_F"; + + magazines[] = {"NLAW_F"}; + magazineWell[] = {"NLAW"}; // restore magwell + + class EventHandlers { + fired = "_this call CBA_fnc_firedDisposable"; // this weapon eventhandler is required! + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 100; + }; + }; + + class ACE_launch_NLAW_used_F: launch_NLAW_F { author = ECSTRING(common,ACETeam); + scope = 1; + scopeArsenal = 1; + baseWeapon = "ACE_launch_NLAW_used_F"; + displayName = CSTRING(UsedTube); descriptionShort = CSTRING(UsedTubeDescription); - magazines[] = {"ACE_FiredMissileDummy"}; // This will disable the used launcher class from being fired again. - //picture = ""; @todo - //model = ""; @todo weaponPoolAvailable = 0; + + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 100; + }; }; }; diff --git a/addons/disposable/README.md b/addons/disposable/README.md index 82281a3c528..b75ecb112dd 100644 --- a/addons/disposable/README.md +++ b/addons/disposable/README.md @@ -1,7 +1,7 @@ ace_disposable ============== -Makes the NLAW a disposable one-shot weapon and provides disposable launchers framework for use by other mods. +Makes the NLAW a disposable one-shot weapon using the [CBA Disposable Framework](https://github.com/CBATeam/CBA_A3/wiki/Disposable-Launchers). ## Maintainers diff --git a/addons/disposable/XEH_PREP.hpp b/addons/disposable/XEH_PREP.hpp deleted file mode 100644 index 8319e582aad..00000000000 --- a/addons/disposable/XEH_PREP.hpp +++ /dev/null @@ -1,4 +0,0 @@ - -PREP(replaceATWeapon); -PREP(takeLoadedATWeapon); -PREP(updateInventoryDisplay); diff --git a/addons/disposable/XEH_postInit.sqf b/addons/disposable/XEH_postInit.sqf deleted file mode 100644 index 4b395c6a644..00000000000 --- a/addons/disposable/XEH_postInit.sqf +++ /dev/null @@ -1,15 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -if (!hasInterface) exitWith {}; - -["loadout", { - params ["_unit"]; - [_unit] call FUNC(takeLoadedATWeapon); - [_unit] call FUNC(updateInventoryDisplay); -}] call CBA_fnc_addPlayerEventHandler; - -// Register fire event handler -// Only for the local player and for AI. Non-local players will handle it themselves -["ace_firedPlayer", DFUNC(replaceATWeapon)] call CBA_fnc_addEventHandler; -["ace_firedNonPlayer", DFUNC(replaceATWeapon)] call CBA_fnc_addEventHandler; diff --git a/addons/disposable/config.cpp b/addons/disposable/config.cpp index 19b02871bc1..2cc4f4202c1 100644 --- a/addons/disposable/config.cpp +++ b/addons/disposable/config.cpp @@ -4,7 +4,7 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; units[] = {}; - weapons[] = {}; + weapons[] = {"ACE_launch_NLAW_loaded_F","ACE_launch_NLAW_used_F"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); @@ -14,7 +14,9 @@ class CfgPatches { }; }; -#include "CfgEventHandlers.hpp" +class CBA_DisposableLaunchers { + ACE_launch_NLAW_ready_F[] = {"launch_NLAW_F","ACE_launch_NLAW_used_F"}; +}; + #include "CfgWeapons.hpp" -#include "CfgMagazines.hpp" #include "CfgVehicles.hpp" diff --git a/addons/disposable/functions/fnc_replaceATWeapon.sqf b/addons/disposable/functions/fnc_replaceATWeapon.sqf deleted file mode 100644 index dcb5d93c1dc..00000000000 --- a/addons/disposable/functions/fnc_replaceATWeapon.sqf +++ /dev/null @@ -1,69 +0,0 @@ -#include "script_component.hpp" -/* - * Author: bux, commy2 - * Replace the disposable launcher with the used dummy. Called from the unified fired EH. - * - * Arguments: - * None. Parameters inherited from EFUNC(common,firedEH) - * - * Return Value: - * None - * - * Example: - * [fromBisFiredEH] call ace_disposable_fnc_replaceATWeapon; - * - * Public: No - */ - -//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"]; -TRACE_10("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _vehicle, _gunner, _turret); - -if (!local _unit || {_weapon != secondaryWeapon _unit} || {_weapon != _muzzle}) exitWith {}; - -private _replacementTube = getText (configFile >> "CfgWeapons" >> _weapon >> "ACE_UsedTube"); -if (_replacementTube == "") exitWith {}; //If no replacement defined just exit - -// Save magazine of spotting muzzle (should be re-added to replacement weapon) -(((getUnitLoadout _unit) select 1) select 5) params [["_spottingMag", ""], ["_spottingRnds", 0]]; -if (_spottingMag != "") then { _unit addMagazine [_spottingMag, _spottingRnds]; }; -//Save array of items attached to launcher -private _items = secondaryWeaponItems _unit; -//Replace the orginal weapon with the 'usedTube' weapon -_unit addWeapon _replacementTube; -//Makes sure the used tube is still equiped -_unit selectWeapon _replacementTube; -//Re-add all attachments to the used tube -{ - if (_x != "") then {_unit addSecondaryWeaponItem _x}; -} count _items; - - -// AI - Remove the ai's missle launcher tube after the missle has exploded -if !([_unit] call EFUNC(common,isPlayer)) then { - [{ - params ["_args","_idPFH"]; - _args params ["_unit", "_tube", "_projectile"]; - - //don't do anything until projectile is null (exploded/max range) - if (isNull _projectile) then { - //Remove PFEH: - [_idPFH] call CBA_fnc_removePerFrameHandler; - - //If (tube is dropped) OR (is dead) OR (is player) just exit - if (secondaryWeapon _unit != _tube || {!alive _unit} || {[_unit] call EFUNC(common,isPlayer)}) exitWith {}; - - //private _items = secondaryWeaponItems _unit; - private _container = createVehicle ["GroundWeaponHolder", position _unit, [], 0, "CAN_COLLIDE"]; - _container setPosAsl (getPosAsl _unit); - _container addWeaponCargoGlobal [_tube, 1]; - - //This will duplicate attachements, because we will be adding a weapon that may already have attachments on it - //We either need a way to add a clean weapon, or a way to add a fully configured weapon to a container: - // { - // if (_x != "") then {_container addItemCargoGlobal [_x, 1];}; - // } forEach _items; - - _unit removeWeaponGlobal _tube; - }; - }, 1, [_unit, _replacementTube, _projectile]] call CBA_fnc_addPerFrameHandler; -}; diff --git a/addons/disposable/functions/fnc_takeLoadedATWeapon.sqf b/addons/disposable/functions/fnc_takeLoadedATWeapon.sqf deleted file mode 100644 index 3f12d610d3f..00000000000 --- a/addons/disposable/functions/fnc_takeLoadedATWeapon.sqf +++ /dev/null @@ -1,59 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Handle the take event. Add a dummy magazine if a disposable rocket launcher is taken. - * - * Arguments: - * 0: unit - Object the event handler is assigned to - * - * Return Value: - * None - * - * Example: - * [fromTakeEH] call ace_disposable_fnc_takeLoadedATWeapon; - * - * Public: No - */ - -params ["_unit"]; -TRACE_1("params",_unit); - -if (!local _unit) exitWith {}; - -private _launcher = secondaryWeapon _unit; -private _config = configFile >> "CfgWeapons" >> _launcher; - -if (isClass _config && {getText (_config >> "ACE_UsedTube") != ""} && {getNumber (_config >> "ACE_isUsedLauncher") != 1} && {count secondaryWeaponMagazine _unit == 0}) then { - private _magazine = getArray (_config >> "magazines") select 0; - private _isLauncherSelected = currentWeapon _unit == _launcher; - - _unit removeMagazines _magazine; - - if (backpack _unit == "") then { - _unit addBackpack "ACE_FakeBackpack"; - _unit removeWeapon _launcher; - _unit addMagazine _magazine; - private _didAdd = _magazine in magazines _unit; - _unit addWeapon _launcher; - - if (!_didAdd) then { - TRACE_1("Failed To Add Disposable Magazine Normally, doing backup method (no backpack)",_unit); - _unit addSecondaryWeaponItem _magazine; - }; - removeBackpack _unit; - } else { - _unit removeWeapon _launcher; - _unit addMagazine _magazine; - private _didAdd = _magazine in magazines _unit; - _unit addWeapon _launcher; - - if (!_didAdd) then { - TRACE_2("Failed To Add Disposable Magazine Normally, doing backup method",_unit,(backpack _unit)); - _unit addSecondaryWeaponItem _magazine; - }; - }; - - if (_isLauncherSelected) then { - _unit selectWeapon _launcher; - }; -}; diff --git a/addons/disposable/functions/fnc_updateInventoryDisplay.sqf b/addons/disposable/functions/fnc_updateInventoryDisplay.sqf deleted file mode 100644 index 7ab2d18d750..00000000000 --- a/addons/disposable/functions/fnc_updateInventoryDisplay.sqf +++ /dev/null @@ -1,47 +0,0 @@ -#include "script_component.hpp" -/* - * Author: bux, commy2 - * Hide or show the secondary weapon magazine inventory slot to prevent unloading of dummy magazines. - * - * Arguments: - * 0: unit - Object the event handler is assigned to - * - * Return Value: - * None - * - * Example: - * [player] call ace_disposable_fnc_updateInventoryDisplay; - * - * Public: No - */ - -disableSerialization; -params ["_player", ["_display",(findDisplay 602),[displayNull]]]; -TRACE_2("params",_player,_display); - -_player removeMagazines "ACE_PreloadedMissileDummy"; -_player removeMagazines "ACE_FiredMissileDummy"; - -if (isNull _display) exitWith {}; - -private _launcher = secondaryWeapon _player; - -if (_launcher == "" || {getText (configFile >> "CfgWeapons" >> _launcher >> "ACE_UsedTube") == ""}) then { - private _control = _display displayCtrl 627; - private _config = configFile >> "RscDisplayInventory" >> "controls" >> "SlotSecondaryMagazine"; - _control ctrlSetPosition [getNumber (_config >> "x"), getNumber (_config >> "y"), getNumber (_config >> "w"), getNumber (_config >> "h")]; - _control ctrlCommit 0; - - _control = _display displayCtrl 1251; - _config = configFile >> "RscDisplayInventory" >> "controls" >> "BackgroundSlotSecondaryMagazine"; - _control ctrlSetPosition [getNumber (_config >> "x"), getNumber (_config >> "y"), getNumber (_config >> "w"), getNumber (_config >> "h")]; - _control ctrlCommit 0; -} else { - private _control = _display displayCtrl 627; - _control ctrlSetPosition [0, 0, 0, 0]; - _control ctrlCommit 0; - - _control = _display displayCtrl 1251; - _control ctrlSetPosition [0, 0, 0, 0]; - _control ctrlCommit 0; -}; diff --git a/addons/disposable/functions/script_component.hpp b/addons/disposable/functions/script_component.hpp deleted file mode 100644 index 035e8e6bcc8..00000000000 --- a/addons/disposable/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\disposable\script_component.hpp" \ No newline at end of file diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index f41b2cad887..b0148a47a6d 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -16,11 +16,12 @@ 사용함 使用過的火箭筒 使用过的火箭筒 + Kullanılmış Tüp Used disposable rocket launcher Benutzter Einweg-Raketenwerfer - Lance-roquette à usage unique utilisé + Lance-roquette à usage unique déjà utilisé Použitý raketomet Zużyta rura granatnika jednorazowego użytku Lanzador desechable utilizado @@ -32,11 +33,12 @@ 사용한 일회용 발사관 使用過的一次性火箭發射器 使用过的一次性火箭发射器 + Tek Kullanımlık Roket Atar Preloaded Missile Dummy Vorgeladene Racketennachbildung - Missile préchargé + Missile inerte préchargé Přednabitá maketa rakety Wstępnie załadowana atrapa pocisku Precargado misil inerte diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index 45d2e827d74..c2fc066b3d4 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -7,12 +7,15 @@ Жетон Identifikační známka ドッグ タグ - Hundemarke + Erkennungsmarke 군번줄 Plaque d'identification Piastrina 兵籍牌 兵籍牌 + Dog Tag + Placa de identidad + Künye Check Dog Tag @@ -20,12 +23,15 @@ Проверить жетон Zkontrolovat známku ドッグ タグを見る - Hundemarke prüfen + Erkennungsmarke prüfen 군번줄 확인 - Vérifier les plaques d'identification + Vérifier la plaque d'identification Controlla Piastrina 檢查兵籍牌 检查兵籍牌 + Verificar Dog Tag + Verificar placa de identidad + Künyeyi Kontrol Et Check @@ -39,6 +45,9 @@ Controlla 檢查 检查 + Verificar + Verificar + Kontrol Et Take @@ -52,6 +61,9 @@ Prendi 拿取 拿取 + Pegar + Tomar + Al Dogtag taken from %1... @@ -59,12 +71,15 @@ Жетон снят с %1... Sebral jsem známku od %1... %1からドッグ タグを取っています・・・ - Hundemarke von %1 genommen ... + Erkennungsmarke von %1 genommen... %1로부터 군번줄을 회수했습니다... - Plaque d'identification pris sur %1... + Plaque d'identification prise sur %1... Piastrina presa da %1... 從%1身上拿取兵籍牌... 从%1身上拿取兵籍牌... + Dogtag pego de %1... + Tomada placa de identidad de %1... + Künye %1 kişisinden alındı Somebody else has already taken the dogtag... @@ -72,19 +87,29 @@ Кто-то уже забрал жетон... Někdo jiný už vzal identifikační známku... すでにドッグ タグは取られています・・・ - Jemand anderes hat bereits die Hundemarke genommen ... + Jemand anderes hat bereits die Erkennungsmarke genommen... 누군가 이미 군번줄을 회수해갔습니다... - Quelqu'un d'autre a déjâ pris les plaques d'identification... + Quelqu'un d'autre a déjà pris la plaque d'identification... Qualcun altro ha già preso la piastrina... 已經有人把他的兵籍牌拿走了... 已经有人把他的兵籍牌拿走了... + Alguém já pegou essa dogtag... + Alguien más ha tomado la placa de identidad + Başka biri zaten künyeyi almış Onscreen display for checking dogtags + Anzeige um Erkennungsmarke zu überprüfen 在畫面中顯示檢查兵籍牌 確認中のドッグタグを画面上で表示します Display su schermo per il controllo delle piastrine Wyświetlacz ekranowy dla sprawdzania nieśmiertelników + Экран для проверки жетонов + Tela de Exibição para verificar dogtags + Visualización en pantalla de placa de identidad + Affichage à l'écran pour le contrôle des plaques. + Okno na obrazovce pro kontrolu známek + Künye gösteriliyor diff --git a/addons/dragging/CfgEventHandlers.hpp b/addons/dragging/CfgEventHandlers.hpp index 424c2a3fed8..233c4bf79d4 100644 --- a/addons/dragging/CfgEventHandlers.hpp +++ b/addons/dragging/CfgEventHandlers.hpp @@ -21,6 +21,7 @@ class Extended_Init_EventHandlers { class CAManBase { class ADDON { init = QUOTE(_this call DFUNC(initPerson)); + exclude[] = {"VirtualMan_F"}; }; }; class StaticWeapon { @@ -52,9 +53,3 @@ class Extended_Killed_EventHandlers { }; }; }; - -class Extended_DisplayLoad_EventHandlers { - class RscDisplayMission { - ADDON = QUOTE(_this call COMPILE_FILE(XEH_missionDisplayLoad)); - }; -}; diff --git a/addons/dragging/CfgMovesMaleSdr.hpp b/addons/dragging/CfgMovesMaleSdr.hpp new file mode 100644 index 00000000000..715765679f4 --- /dev/null +++ b/addons/dragging/CfgMovesMaleSdr.hpp @@ -0,0 +1,13 @@ +class CfgMovesMaleSdr: CfgMovesBasic { + class InjuredMovedBase; + class AgonyBaseRfl; + + class States { + class AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon: InjuredMovedBase { + speed = -10; // 1/10 + }; + class AinjPfalMstpSnonWrflDnon_carried_Up: AgonyBaseRfl { + speed = -10; // 1/10 + }; + }; +}; diff --git a/addons/dragging/CfgVehicles.hpp b/addons/dragging/CfgVehicles.hpp index 9d5389efd8d..4c43dd814ea 100644 --- a/addons/dragging/CfgVehicles.hpp +++ b/addons/dragging/CfgVehicles.hpp @@ -171,7 +171,7 @@ class CfgVehicles { GVAR(canDrag) = 1; GVAR(dragPosition[]) = {0,1.2,0}; - GVAR(dragDirection) = 0; + GVAR(dragDirection) = 270; }; class MetalCase_01_base_F: Items_base_F { class EventHandlers { @@ -213,7 +213,7 @@ class CfgVehicles { }; GVAR(canCarry) = 1; GVAR(carryPosition[]) = {0,1,1}; - GVAR(carryDirection) = 270; + GVAR(carryDirection) = 0; GVAR(canDrag) = 1; GVAR(dragPosition[]) = {0,1.4,0}; diff --git a/addons/dragging/XEH_missionDisplayLoad.sqf b/addons/dragging/XEH_missionDisplayLoad.sqf deleted file mode 100644 index 289d2f067ae..00000000000 --- a/addons/dragging/XEH_missionDisplayLoad.sqf +++ /dev/null @@ -1,5 +0,0 @@ -#include "script_component.hpp" - -params ["_display"]; - -_display displayAddEventHandler ["MouseZChanged", {(_this select 1) call FUNC(handleScrollWheel)}]; diff --git a/addons/dragging/XEH_postInit.sqf b/addons/dragging/XEH_postInit.sqf index 2dbf47f3cca..dd782eddb2f 100644 --- a/addons/dragging/XEH_postInit.sqf +++ b/addons/dragging/XEH_postInit.sqf @@ -27,14 +27,16 @@ if (isNil "ACE_maxWeightCarry") then { // handle waking up dragged unit and falling unconscious while dragging ["ace_unconscious", {_this call FUNC(handleUnconscious)}] call CBA_fnc_addEventHandler; +// display event handler +["MouseZChanged", {_this select 1 call FUNC(handleScrollWheel)}] call CBA_fnc_addDisplayHandler; + //@todo Captivity? //Add Keybind: -["ACE3 Common", QGVAR(drag), (localize LSTRING(DragKeybind)), -{ +["ACE3 Common", QGVAR(drag), (localize LSTRING(DragKeybind)), { if (!alive ACE_player) exitWith {false}; if !([ACE_player, objNull, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith {false}; - + // If we are drag/carrying something right now then just drop it: if (ACE_player getVariable [QGVAR(isDragging), false]) exitWith { [ACE_player, ACE_player getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); @@ -51,7 +53,26 @@ if (isNil "ACE_maxWeightCarry") then { [ACE_player, _cursor] call FUNC(startDrag); false -}, -{false}, -[-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND +}, {}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND + +["ACE3 Common", QGVAR(carry), (localize LSTRING(CarryKeybind)), { + if (!alive ACE_player) exitWith {false}; + if !([ACE_player, objNull, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // If we are drag/carrying something right now then just drop it: + if (ACE_player getVariable [QGVAR(isDragging), false]) exitWith { + [ACE_player, ACE_player getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); + false + }; + if (ACE_player getVariable [QGVAR(isCarrying), false]) exitWith { + [ACE_player, ACE_player getVariable [QGVAR(carriedObject), objNull]] call FUNC(dropObject_carry); + false + }; + + private _cursor = cursorObject; + if ((isNull _cursor) || {(_cursor distance ACE_player) > 2.6}) exitWith {false}; + if (!([ACE_player, _cursor] call FUNC(canCarry))) exitWith {false}; + + [ACE_player, _cursor] call FUNC(startCarry); + false +}, {}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND diff --git a/addons/dragging/config.cpp b/addons/dragging/config.cpp index 8747ee44ea6..188f3916f29 100644 --- a/addons/dragging/config.cpp +++ b/addons/dragging/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); - authors[] = {"Garth 'L-H' de Wet", "commy2"}; + authors[] = {"Garth 'L-H' de Wet", "commy2", "PiZZADOX"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -17,3 +17,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgMovesBasic.hpp" +#include "CfgMovesMaleSdr.hpp" diff --git a/addons/dragging/functions/fnc_canCarry.sqf b/addons/dragging/functions/fnc_canCarry.sqf index 4e09cedbdcb..b5edbd800c5 100644 --- a/addons/dragging/functions/fnc_canCarry.sqf +++ b/addons/dragging/functions/fnc_canCarry.sqf @@ -27,4 +27,4 @@ if ((_unit getHitPointDamage "HitLegs") >= 0.5) exitWith {false}; // a static weapon has to be empty for dragging (ignore UAV AI) if (((typeOf _target) isKindOf "StaticWeapon") && {{(getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; -alive _target && {vehicle _target == _target} && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getVariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})} +alive _target && {vehicle _target isEqualto _target} && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getVariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})} diff --git a/addons/dragging/functions/fnc_canDrag.sqf b/addons/dragging/functions/fnc_canDrag.sqf index 81a85375867..dbae83521b3 100644 --- a/addons/dragging/functions/fnc_canDrag.sqf +++ b/addons/dragging/functions/fnc_canDrag.sqf @@ -23,4 +23,4 @@ if !([_unit, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)) exi // a static weapon has to be empty for dragging (ignore UAV AI) if ((typeOf _target) isKindOf "StaticWeapon" && {{(getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; -alive _target && {vehicle _target == _target} && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getVariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})}; +alive _target && {vehicle _target isEqualto _target} && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getVariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})} diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf index f7976079b3a..e3f8c2b61ec 100644 --- a/addons/dragging/functions/fnc_carryObject.sqf +++ b/addons/dragging/functions/fnc_carryObject.sqf @@ -63,7 +63,7 @@ _unit setVariable [QGVAR(ReleaseActionID), [ if (_target isKindOf "CAManBase") then { [localize LSTRING(Drop), "", ""] call EFUNC(interaction,showMouseHint); } else { - [localize LSTRING(Drop), "", localize LSTRING(LowerRaise)] call EFUNC(interaction,showMouseHint); + [localize LSTRING(Drop), "", localize LSTRING(RaiseLowerRotate)] call EFUNC(interaction,showMouseHint); }; // check everything diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index 6361dcc66d6..6204bbae627 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -24,7 +24,7 @@ #endif params ["_args", "_idPFH"]; -_args params ["_unit","_target", "_startTime"]; +_args params ["_unit", "_target", "_startTime"]; if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { TRACE_2("carry false",_unit,_target); @@ -35,7 +35,7 @@ if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { if (!alive _target || {_unit distance _target > 10}) then { TRACE_2("dead/distance",_unit,_target); if ((_unit distance _target > 10) && {(CBA_missionTime - _startTime) < 1}) exitWith { - //attachTo seems to have some kind of network delay and target can return an odd position durring the first few frames, + //attachTo seems to have some kind of network delay and target can return an odd position during the first few frames, //so wait a full second to exit if out of range (this is critical as we would otherwise detach and set it's pos to weird pos) TRACE_3("ignoring bad distance at start",_unit distance _target,_startTime,CBA_missionTime); }; diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf index 347eb857db9..ae52838e9b0 100644 --- a/addons/dragging/functions/fnc_dragObject.sqf +++ b/addons/dragging/functions/fnc_dragObject.sqf @@ -64,6 +64,9 @@ GVAR(currentHeightChange) = 0; // prevent UAVs from firing private _UAVCrew = _target call EFUNC(common,getVehicleUAVCrew); +// fixes not being able to move when in combat pace +[_unit, "forceWalk", "ACE_dragging", true] call EFUNC(common,statusEffect_set); + if !(_UAVCrew isEqualTo []) then { {_target deleteVehicleCrew _x} count _UAVCrew; _target setVariable [QGVAR(isUAV), true, true]; diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index dd18e0c825c..a45a26ae89e 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -24,7 +24,7 @@ #endif params ["_args", "_idPFH"]; -_args params ["_unit","_target", "_startTime"]; +_args params ["_unit", "_target", "_startTime"]; if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { TRACE_2("drag false",_unit,_target); @@ -35,7 +35,7 @@ if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { if (!alive _target || {_unit distance _target > 10}) then { TRACE_2("dead/distance",_unit,_target); if ((_unit distance _target > 10) && {(CBA_missionTime - _startTime) < 1}) exitWith { - //attachTo seems to have some kind of network delay and target can return an odd position durring the first few frames, + //attachTo seems to have some kind of network delay and target can return an odd position during the first few frames, //so wait a full second to exit if out of range (this is critical as we would otherwise detach and set it's pos to weird pos) TRACE_3("ignoring bad distance at start",_unit distance _target,_startTime,CBA_missionTime); }; diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index fde2a7f6d75..4ecc876afd9 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -76,3 +76,13 @@ if (_unit getVariable ["ACE_isUnconscious", false]) then { if (_target getVariable [QGVAR(isUAV), false]) then { createVehicleCrew _target; }; + +// fixes not being able to move when in combat pace +[_unit, "forceWalk", "ACE_dragging", false] call EFUNC(common,statusEffect_set); + +// reset mass +private _mass = _target getVariable [QGVAR(originalMass), 0]; + +if (_mass != 0) then { + [QEGVAR(common,setMass), [_target, _mass], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf index ae7bd3598ec..5235b7e66df 100644 --- a/addons/dragging/functions/fnc_dropObject_carry.sqf +++ b/addons/dragging/functions/fnc_dropObject_carry.sqf @@ -17,7 +17,7 @@ */ params ["_unit", "_target"]; -TRACE_2("params",_unit,_target); +TRACE_1("params",_this); // remove drop action [_unit, "DefaultAction", _unit getVariable [QGVAR(ReleaseActionID), -1]] call EFUNC(common,removeActionEventHandler); @@ -76,3 +76,13 @@ if !(_target isKindOf "CAManBase") then { if (_target getVariable [QGVAR(isUAV), false]) then { createVehicleCrew _target; }; + +// reset mass +private _mass = _target getVariable [QGVAR(originalMass), 0]; + +if (_mass != 0) then { + [QEGVAR(common,setMass), [_target, _mass], _target] call CBA_fnc_targetEvent; +}; + +// reset temp direction +_target setVariable [QGVAR(carryDirection_temp), nil]; diff --git a/addons/dragging/functions/fnc_getWeight.sqf b/addons/dragging/functions/fnc_getWeight.sqf index cd06b8a8845..c9d978cf7db 100644 --- a/addons/dragging/functions/fnc_getWeight.sqf +++ b/addons/dragging/functions/fnc_getWeight.sqf @@ -1,45 +1,95 @@ #include "script_component.hpp" /* - * Author: L-H, edited by commy2, rewritten by joko // Jonas - * Returns the weight of a crate. + * Author: L-H, edited by commy2, rewritten by joko // Jonas, re-rewritten by mharis001 + * Returns the weight of the given object. + * Weight is calculated from the object's mass and its current inventory. * * Arguments: - * 0: Crate to get weight of + * 0: Object * * Return Value: - * Total Weight + * Weight * * Example: - * [Crate1] call ace_dragging_fnc_getweight; + * [_object] call ace_dragging_fnc_getWeight * * Public: No -*/ + */ params ["_object"]; -// Initialize the total weight. -private _totalWeight = 0; +private _weight = 0; +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgGlasses = configFile >> "CfgGlasses"; +private _cfgVehicles = configFile >> "CfgVehicles"; +private _cfgMagazines = configFile >> "CfgMagazines"; + +// Add the masses of "regular" items in the object's inventory +// Handle separating CfgGlasses items from this cargo array +getItemCargo _object params ["_itemTypes", "_itemCounts"]; + +{ + private _itemConfig = if (isClass (_cfgGlasses >> _x)) then { + _cfgGlasses >> _x + } else { + _cfgWeapons >> _x >> "ItemInfo" + }; + + _weight = _weight + getNumber (_itemConfig >> "mass") * (_itemCounts select _forEachIndex); +} forEach _itemTypes; + +// Add the masses of magazine items in the object's inventory +getMagazineCargo _object params ["_magazineTypes", "_magazineCounts"]; -// Cycle through all item types with their assigned config paths. { - _x params ["_items", "_getConfigCode"]; - _items params ["_item", "_count"]; - // Cycle through all items and read their mass out of the config. + _weight = _weight + getNumber (_cfgMagazines >> _x >> "mass") * (_magazineCounts select _forEachIndex); +} forEach _magazineTypes; + +// Add the masses of backpack items in the object's inventory +getBackpackCargo _object params ["_backpackTypes", "_backpackCounts"]; + +{ + _weight = _weight + getNumber (_cfgVehicles >> _x >> "mass") * (_backpackCounts select _forEachIndex); +} forEach _backpackTypes; + +{ + _x params ["_weapon", "_muzzle", "_pointer", "_optic", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + + // Add the weapon's mass + _weight = _weight + getNumber (_cfgWeapons >> _weapon >> "WeaponSlotsInfo" >> "mass"); + + // Add the masses of the weapon's attachments if they exist + { + if (_x != "") then { + _weight = _weight + getNumber (_cfgWeapons >> _x >> "ItemInfo" >> "mass"); + }; + } forEach [_muzzle, _pointer, _optic, _bipod]; + + // Add the masses of the weapon's magazines if they exist { - // Multiply mass with amount of items and add the mass to the total weight. - _totalWeight = _totalWeight + (getNumber ((call _getConfigCode) >> "mass") * (_count select _forEachIndex)); - } forEach _item; - true -} count [ - //IGNORE_PRIVATE_WARNING ["_x"]; - [getMagazineCargo _object, {configFile >> "CfgMagazines" >> _x}], - [getBackpackCargo _object, {configFile >> "CfgVehicles" >> _x}], - [getItemCargo _object, {configFile >> "CfgWeapons" >> _x >> "ItemInfo"}], - [getWeaponCargo _object, {configFile >> "CfgWeapons" >> _x >> "WeaponSlotsInfo"}] -]; - -// add Weight of create to totalWeight -_totalWeight = _totalWeight + (getNumber (configFile >> "CfgVehicles" >> typeOf _object >> "mass")); - -// Mass in Arma isn't an exact amount but rather a volume/weight value. This attempts to work around that by making it a usable value. (sort of). -_totalWeight * 0.5 + _x params ["_magazine"]; + + if (!isNil "_magazine") then { + _weight = _weight + getNumber (_cfgMagazines >> _magazine >> "mass"); + }; + } forEach [_primaryMagazine, _secondaryMagazine]; +} forEach weaponsItemsCargo _object; + +// Add the mass of the object itself +// The mass of sub-containers such as vests was added through the items cargo +// The container object is generally of type SupplyX and has mass of zero +_weight = _weight + getNumber (_cfgVehicles >> typeOf _object >> "mass"); + +// Mass in Arma isn't an exact amount but rather a volume/weight value +// This attempts to work around that by making it a usable value (sort of) +// Note: this is done before the recursive calls to avoid reducing the weight multiple times +_weight = _weight * 0.5; + +// Handle sub-containers within the object's inventory +{ + _x params ["", "_container"]; + + _weight = _weight + (_container call FUNC(getWeight)); +} forEach everyContainer _object; + +_weight diff --git a/addons/dragging/functions/fnc_handleScrollWheel.sqf b/addons/dragging/functions/fnc_handleScrollWheel.sqf index 9c444add212..04c2542b2fd 100644 --- a/addons/dragging/functions/fnc_handleScrollWheel.sqf +++ b/addons/dragging/functions/fnc_handleScrollWheel.sqf @@ -22,30 +22,42 @@ private _unit = ACE_player; // EH is always assigned. Exit and don't overwrite input if not carrying if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith {false}; -// move carried item 15 cm per scroll interval -_scrollAmount = _scrollAmount * 0.15; - private _carriedItem = _unit getVariable [QGVAR(carriedObject), objNull]; //disabled for persons if (_carriedItem isKindOf "CAManBase") exitWith {false}; -private _position = getPosASL _carriedItem; -private _maxHeight = (_unit modelToWorldVisualWorld [0, 0, 0]) select 2; +if !(cba_events_control) then { + // raise/lower + + // move carried item 15 cm per scroll interval + _scrollAmount = _scrollAmount * 0.15; + + private _position = getPosASL _carriedItem; + private _maxHeight = (_unit modelToWorldVisualWorld [0, 0, 0]) select 2; + + _position set [2, ((_position select 2) + _scrollAmount min (_maxHeight + 1.5)) max _maxHeight]; -_position set [2, ((_position select 2) + _scrollAmount min (_maxHeight + 1.5)) max _maxHeight]; + // move up/down object and reattach at current position + detach _carriedItem; -// move up/down object and reattach at current position -detach _carriedItem; + // Uses this method of selecting position because setPosATL did not have immediate effect + private _positionChange = _position vectorDiff (getPosASL _carriedItem); + private _selectionPosition = _unit worldToModel (ASLtoAGL getPosWorld _carriedItem); + _selectionPosition = _selectionPosition vectorAdd _positionChange; + _carriedItem attachTo [_unit, _selectionPosition]; -// Uses this method of selecting position because setPosATL did not have immediate effect -private _positionChange = _position vectorDiff (getPosASL _carriedItem); -private _selectionPosition = _unit worldToModel (ASLtoAGL getPosWorld _carriedItem); -_selectionPosition = _selectionPosition vectorAdd _positionChange; -_carriedItem attachTo [_unit, _selectionPosition]; + //reset the carry direction + private _direction = _carriedItem getVariable [QGVAR(carryDirection_temp), _carriedItem getVariable [QGVAR(carryDirection), 0]]; + [QEGVAR(common,setDir), [_carriedItem, _direction], _carriedItem] call CBA_fnc_targetEvent; +} else { + // rotate -//reset the carry direction -private _direction = _carriedItem getVariable [QGVAR(carryDirection), 0]; -[QEGVAR(common,setDir), [_carriedItem, _direction], _carriedItem] call CBA_fnc_targetEvent; + private _direction = _carriedItem getVariable [QGVAR(carryDirection_temp), _carriedItem getVariable [QGVAR(carryDirection), 0]]; + _scrollAmount = _scrollAmount * 10; + _direction = _direction + _scrollAmount; + [QEGVAR(common,setDir), [_carriedItem, _direction], _carriedItem] call CBA_fnc_targetEvent; + _carriedItem setVariable [QGVAR(carryDirection_temp), _direction]; +}; true diff --git a/addons/dragging/functions/fnc_handleUnconscious.sqf b/addons/dragging/functions/fnc_handleUnconscious.sqf index ba399aee49f..fd3f95f95d2 100644 --- a/addons/dragging/functions/fnc_handleUnconscious.sqf +++ b/addons/dragging/functions/fnc_handleUnconscious.sqf @@ -29,10 +29,9 @@ if (_player getVariable [QGVAR(isDragging), false]) then { }; // handle waking up dragged unit - //if (_unit == _draggedObject) then { - // [_player, _draggedObject] call FUNC(dropObject); - //}; - + if (_unit == _draggedObject) then { + [_player, _draggedObject] call FUNC(dropObject); + }; }; if (_player getVariable [QGVAR(isCarrying), false]) then { @@ -45,8 +44,7 @@ if (_player getVariable [QGVAR(isCarrying), false]) then { }; // handle waking up dragged unit - //if (_unit == _carriedObject) then { - // [_player, _carriedObject] call FUNC(dropObject_carry); - //}; - + if (_unit == _carriedObject) then { + [_player, _carriedObject] call FUNC(dropObject_carry); + }; }; diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf index 12e2b74a8c5..6ec0abb4661 100644 --- a/addons/dragging/functions/fnc_setCarryable.sqf +++ b/addons/dragging/functions/fnc_setCarryable.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2 + * Author: commy2, PiZZADOX * Enable the object to be carried. * * Arguments: @@ -8,17 +8,19 @@ * 1: true to enable carrying, false to disable * 2: Position offset for attachTo command (default: [0,1,1]) * 3: Direction in degree to rotate the object after attachTo (default: 0) + * 4: Override weight limit (optional; default: false) * * Return Value: * None * * Example: - * [object, true, [0,1,1], 0] call ace_dragging_fnc_setCarryable; + * [object, true, [0,1,1], 0, false] call ace_dragging_fnc_setCarryable; * * Public: Yes */ -params ["_object", "_enableCarry", "_position", "_direction"]; +//IGNORE_PRIVATE_WARNING ["_player", "_target"]; +params ["_object", "_enableCarry", "_position", "_direction", ["_ignoreWeightCarry", false, [false]]]; if (isNil "_position") then { _position = _object getVariable [QGVAR(carryPosition), [0,1,1]]; @@ -32,6 +34,7 @@ if (isNil "_direction") then { _object setVariable [QGVAR(canCarry), _enableCarry]; _object setVariable [QGVAR(carryPosition), _position]; _object setVariable [QGVAR(carryDirection), _direction]; +_object setVariable [QGVAR(ignoreWeightCarry), _ignoreWeightCarry]; // add action to class if it is not already present private _type = typeOf _object; diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf index 36f42dd9f67..50a07b515b9 100644 --- a/addons/dragging/functions/fnc_setDraggable.sqf +++ b/addons/dragging/functions/fnc_setDraggable.sqf @@ -1,25 +1,26 @@ #include "script_component.hpp" /* - * Author: commy2 + * Author: commy2, PiZZADOX * Enable the object to be dragged. * * Arguments: * 0: Any object * 1: true to enable dragging, false to disable - * 2: Position offset for attachTo command (optinal; default: [0,0,0]) + * 2: Position offset for attachTo command (optional; default: [0,0,0]) * 3: Direction in degree to rotate the object after attachTo (optional; default: 0) + * 4: Override weight limit (optional; default: false) * * Return Value: * None * * Example: - * [object, true, [0,0,0], 0] call ace_dragging_fnc_setDraggable; + * [object, true, [0,0,0], 0, false] call ace_dragging_fnc_setDraggable; * * Public: Yes */ //IGNORE_PRIVATE_WARNING ["_player", "_target"]; -params ["_object", "_enableDrag", "_position", "_direction"]; +params ["_object", "_enableDrag", "_position", "_direction", ["_ignoreWeightDrag", false, [false]]]; if (isNil "_position") then { _position = _object getVariable [QGVAR(dragPosition), [0,0,0]]; @@ -33,6 +34,7 @@ if (isNil "_direction") then { _object setVariable [QGVAR(canDrag), _enableDrag]; _object setVariable [QGVAR(dragPosition), _position]; _object setVariable [QGVAR(dragDirection), _direction]; +_object setVariable [QGVAR(ignoreWeightDrag), _ignoreWeightDrag]; // add action to class if it is not already present private _type = typeOf _object; diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf index 5d7bc868155..a52afd1c27e 100644 --- a/addons/dragging/functions/fnc_startCarry.sqf +++ b/addons/dragging/functions/fnc_startCarry.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2 + * Author: commy2, PiZZADOX * Start the carrying process. * * Arguments: @@ -19,10 +19,12 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// check weight -private _weight = [_target] call FUNC(getWeight); - -if (_weight > missionNamespace getVariable ["ACE_maxWeightCarry", 1E11]) exitWith { +// exempt from weight check if object has override variable set +if (!GETVAR(_target,GVAR(ignoreWeightCarry),false) && { + private _weight = [_target] call FUNC(getWeight); + _weight > GETMVAR(ACE_maxWeightCarry,1E11) +}) exitWith { + // exit if object weight is over global var value [localize LSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; @@ -32,7 +34,7 @@ private _timer = CBA_missionTime + 5; if (_target isKindOf "CAManBase") then { // add a primary weapon if the unit has none. - if (primaryWeapon _unit == "") then { + if (primaryWeapon _unit isEqualto "") then { _unit addWeapon "ACE_FakePrimaryWeapon"; }; @@ -46,7 +48,7 @@ if (_target isKindOf "CAManBase") then { [_unit, "AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon", 2, true] call EFUNC(common,doAnimation); [_target, "AinjPfalMstpSnonWrflDnon_carried_Up", 2, true] call EFUNC(common,doAnimation); - _timer = CBA_missionTime + 15; + _timer = CBA_missionTime + 10; } else { @@ -71,3 +73,11 @@ _unit setVariable [QGVAR(isCarrying), true, true]; _unit setVariable [QGVAR(carriedObject), _target, true]; [FUNC(startCarryPFH), 0.2, [_unit, _target, _timer]] call CBA_fnc_addPerFrameHandler; + +// disable collisions by setting the physx mass to almost zero +private _mass = getMass _target; + +if (_mass > 1) then { + _target setVariable [QGVAR(originalMass), _mass, true]; + [QEGVAR(common,setMass), [_target, 1e-12], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/dragging/functions/fnc_startCarryPFH.sqf b/addons/dragging/functions/fnc_startCarryPFH.sqf index 89f9f232ed6..f2c5cfb5d26 100644 --- a/addons/dragging/functions/fnc_startCarryPFH.sqf +++ b/addons/dragging/functions/fnc_startCarryPFH.sqf @@ -35,7 +35,7 @@ if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { // same as dragObjectPFH, checks if object is deleted or dead OR (target moved away from carrier (weapon disasembled)) if (!alive _target || {_unit distance _target > 10}) then { TRACE_4("dead/distance",_unit,_target,_timeOut,CBA_missionTime); - [_unit, _target] call FUNC(dropObject); + [_unit, _target] call FUNC(dropObject_carry); [_idPFH] call CBA_fnc_removePerFrameHandler; }; @@ -54,11 +54,11 @@ if (_target isKindOf "CAManBase") then { // drop if in timeout private _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; - [_unit, _draggedObject] call FUNC(dropObject); + [_unit, _draggedObject] call FUNC(dropObject_carry); }; // wait for the unit to stand up - if (stance _unit == "STAND") exitWith { + if (stance _unit isEqualto "STAND") exitWith { TRACE_4("Start carry object",_unit,_target,_timeOut,CBA_missionTime); [_unit, _target] call FUNC(carryObject); diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index b926a972ce8..7a4c8908d33 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2 + * Author: commy2, PiZZADOX * Start the dragging process. * * Arguments: @@ -19,16 +19,18 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// check weight -private _weight = [_target] call FUNC(getWeight); - -if (_weight > missionNamespace getVariable ["ACE_maxWeightDrag", 1E11]) exitWith { +// exempt from weight check if object has override variable set +if (!GETVAR(_target,GVAR(ignoreWeightDrag),false) && { + private _weight = [_target] call FUNC(getWeight); + _weight > GETMVAR(ACE_maxWeightDrag,1E11) +}) exitWith { + // exit if object weight is over global var value [localize LSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; // add a primary weapon if the unit has none. // @todo prevent opening inventory when equipped with a fake weapon -if (primaryWeapon _unit == "") then { +if (primaryWeapon _unit isEqualto "") then { _unit addWeapon "ACE_FakePrimaryWeapon"; }; @@ -59,3 +61,11 @@ if (_target isKindOf "CAManBase") then { _unit setVariable [QGVAR(isDragging), true, true]; [FUNC(startDragPFH), 0.2, [_unit, _target, CBA_missionTime + 5]] call CBA_fnc_addPerFrameHandler; + +// disable collisions by setting the physx mass to almost zero +private _mass = getMass _target; + +if (_mass > 1) then { + _target setVariable [QGVAR(originalMass), _mass, true]; + [QEGVAR(common,setMass), [_target, 1e-12], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/dragging/script_component.hpp b/addons/dragging/script_component.hpp index 01b466972f0..e7ad88c825c 100644 --- a/addons/dragging/script_component.hpp +++ b/addons/dragging/script_component.hpp @@ -2,7 +2,6 @@ #define COMPONENT_BEAUTIFIED Dragging #include "\z\ace\addons\main\script_mod.hpp" -// #define DEBUG_ENABLED_DRAGGING // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 95a17c60b05..a427f5d83cb 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -7,7 +7,7 @@ Arrastrar Ciągnij Táhnout - Trainer + Traîner Ziehen Arrastar Trascina @@ -16,6 +16,7 @@ 끌기 拖拉 拖拉 + Sürükle Release @@ -32,14 +33,15 @@ 놓기 放開 放开 + Bırak Drag/Release Object - Тащить/Отпустить Объекты + Тащить/Отпустить Объект Arrastrar/Soltar Objeto Ciągnij/Puść Obiekt Táhnout/Položit Objekt - Trainer/Lâcher Objets + Traîner/Lâcher un objet Objekt ziehen/loslassen Arrastar/Soltar Objeto Trascina/Lascia Oggetto @@ -48,6 +50,13 @@ 물건 끌기/놓기 拖拉/放開物品 拖拉/放开物品 + Objeyi Sürükle/Bırak + + + Carry/Release Object + Porter/Lâcher un objet + Нести/Отпустить Объект + Nieś/Puść objekt Item too heavy @@ -64,6 +73,7 @@ 물체가 너무 무겁습니다 此物品過重 此物品过重 + Eşya çok ağır Carry @@ -80,21 +90,16 @@ 업기 背起 背起 + Taşı - - Raise/Lower - Heben/Senken - Wyżej/Niżej - Levantar/Abaixar - Поднять/Опустить - Zvýšit/Snížit - Alza/Abbassa - Subir/Bajar - Lever/Baisser - 上げる/下げる - 높이기/낮추기 - 提高/下降 - 提高/下降 + + Raise/Lower | (Ctrl + Scroll) Rotate + Heben/Senken | (Strg + Scrollen) Drehen + Lever/Baisser | (Ctrl + Scroll) Rotation + 上げる/下げる | (Ctrl + スクロール) 回転 + Zvednout/Snížit | (Ctrl + Kolečko myši) Otáčet + Поднять/Опустить | (Ctrl + Скролл) Крутить + Wyżej/niżej | (Ctrl + Kółko myszy) obracanie diff --git a/addons/dragon/$PBOPREFIX$ b/addons/dragon/$PBOPREFIX$ new file mode 100644 index 00000000000..41f191d39bd --- /dev/null +++ b/addons/dragon/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\dragon \ No newline at end of file diff --git a/addons/dragon/ACE_GuidanceConfig.hpp b/addons/dragon/ACE_GuidanceConfig.hpp new file mode 100644 index 00000000000..18cc5dd9fe1 --- /dev/null +++ b/addons/dragon/ACE_GuidanceConfig.hpp @@ -0,0 +1,11 @@ +class EGVAR(missileguidance,AttackProfiles) { + class DRAGON { + name = CSTRING(dragonName); + visualName = CSTRING(dragonName); + description = CSTRING(dragonName); + + onFired = QFUNC(onFired); + functionName = QFUNC(attackProfile_DRAGON); + }; +}; + diff --git a/addons/dragon/CfgAmmo.hpp b/addons/dragon/CfgAmmo.hpp new file mode 100644 index 00000000000..033239013f0 --- /dev/null +++ b/addons/dragon/CfgAmmo.hpp @@ -0,0 +1,147 @@ +class CfgAmmo { + class ammo_Penetrator_Base; + class M_Scalpel_AT; + class Rocket_03_AP_F; + + class GVAR(penetrator_super): ammo_Penetrator_Base { + caliber = 60; + warheadName = "HEAT"; + hit = 460; + fuseDistance = 75; + }; + + class GVAR(dragonBase): Rocket_03_AP_F { + EGVAR(frag,skip) = 1; + scope = 1; + aiAmmoUsageFlags = "128+512"; + model = QPATHTOF(models\dragon.p3d); + maxSpeed = 200; + thrust = 300; + initTime = 0.151; + thrustTime = 0; + sideAirFriction = 0.05; + effectsMissile = "missile2"; + effectFlare = ""; + airFriction = 0.5; + fuseDistance = 75; + whistleDist = 2; + + hit = 100; + indirectHit = 9; + indirectHitRange = 1; + explosive = 0.8; + timeToLive = 60; + cost = 500; + simulationStep = 0.005; + maxControlRange = 1500; + + class ace_missileguidance { + minDeflection = 0; + maxDeflection = 0; + incDeflection = 0; + + canVanillaLock = 0; + + // Guidance type for munitions + defaultSeekerType = "SACLOS"; + seekerTypes[] = { "SACLOS" }; + + defaultSeekerLockMode = "LOAL"; + seekerLockModes[] = { "LOAL", "LOBL" }; + + seekLastTargetPos = 0; + seekerAngle = 30; + seekerAccuracy = 1; + + seekerMinRange = 65; + seekerMaxRange = 1000; + + correctionDistance = 30; + missileLeadDistance = 0; + offsetFromCrosshair[] = { 0, 0, 0 }; + + serviceInterval = 0.33; // how many seconds between pops + serviceCharges = 32; // how many charges are in this missile + serviceChargeAcceleration = 6.5; + dragonSpeed = 100; // meters per second + + defaultAttackProfile = "DRAGON"; + attackProfiles[] = {"DRAGON"}; + }; + }; + + class GVAR(super) : GVAR(dragonBase) { + submunitionAmmo = QGVAR(penetrator_super); + submunitionDirectionType = "SubmunitionModelDirection"; + submunitionInitSpeed = 1000; + submunitionParentSpeedCoef = 0; + submunitionInitialOffset[] = { 0, 0, -0.2 }; + + class ace_missileguidance { + enabled = 1; + + // Guidance type for munitions + defaultSeekerType = "SACLOS"; + seekerTypes[] = { "SACLOS" }; + + defaultSeekerLockMode = "LOAL"; + seekerLockModes[] = { "LOAL", "LOBL" }; + + seekLastTargetPos = 0; + seekerAngle = 30; + seekerAccuracy = 1; + + seekerMinRange = 30; + seekerMaxRange = 1500; + + correctionDistance = 30; + missileLeadDistance = 0; + + serviceInterval = 0.33; // how many seconds between pops + serviceCharges = 60; // how many charges are in this missile + serviceChargeAcceleration = 6.5; + dragonSpeed = 100; // meters per second + + defaultAttackProfile = "DRAGON"; + attackProfiles[] = {"DRAGON"}; + }; + }; + + class ShellBase; + class GVAR(serviceCharge) : ShellBase { + hit = 1; + indirectHit = 2; + indirectHitRange = 1; + typicalSpeed = 100; + explosive = 1; + cost = 300; + model = "\A3\Weapons_F\empty.p3d"; + airFriction = 0; + timeToLive = 1; + explosionTime = 0.001; + soundFly[] = {"",1,1}; + soundEngine[] = {"",1,4}; + CraterEffects = ""; + explosionEffects = QGVAR(serviceExplosion); + hitarmor[] = {"soundDefault1", 1}; + hitbuilding[] = {"soundDefault1", 1}; + hitconcrete[] = {"soundDefault1", 1}; + hitdefault[] = {"soundDefault1", 1}; + hitfoliage[] = {"soundDefault1", 1}; + hitglass[] = {"soundDefault1", 1}; + hitglassarmored[] = {"soundDefault1", 1}; + hitgroundhard[] = {"soundDefault1", 1}; + hitgroundsoft[] = {"soundDefault1", 1}; + hitiron[] = {"soundDefault1", 1}; + hitman[] = {"soundDefault1", 1}; + hitmetal[] = {"soundDefault1", 1}; + hitmetalplate[] = {"soundDefault1", 1}; + hitplastic[] = {"soundDefault1", 1}; + hitrubber[] = {"soundDefault1", 1}; + hitwood[] = {"soundDefault1", 1}; + sounddefault1[] = {QPATHTOF(sounds\service_charge.wss), 56.2341, 1, 1800}; + soundHit[] = {QPATHTOF(sounds\service_charge.wss),56.23413,1,1800}; + multiSoundHit[] = {"soundDefault1", 1}; + }; +}; + diff --git a/addons/dragon/CfgEventHandlers.hpp b/addons/dragon/CfgEventHandlers.hpp new file mode 100644 index 00000000000..0d3301d6e0a --- /dev/null +++ b/addons/dragon/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/dragon/CfgMagazines.hpp b/addons/dragon/CfgMagazines.hpp new file mode 100644 index 00000000000..e4b59a93042 --- /dev/null +++ b/addons/dragon/CfgMagazines.hpp @@ -0,0 +1,16 @@ +class CfgMagazines { + class 1Rnd_GAA_missiles; + class GVAR(super) : 1Rnd_GAA_missiles { + sound[] = {}; + soundFly[] = {}; + soundHit[] = {}; + model = QPATHTOF(models\dragon.p3d); + ammo = QGVAR(super); + initSpeed = 120; + scope = 1; + displayName = CSTRING(dragonName); + displayNameShort = CSTRING(dragonName); + descriptionShort = CSTRING(dragonDescription); + }; +}; + diff --git a/addons/dragon/CfgVehicles.hpp b/addons/dragon/CfgVehicles.hpp new file mode 100644 index 00000000000..13441c6c26a --- /dev/null +++ b/addons/dragon/CfgVehicles.hpp @@ -0,0 +1,152 @@ +class CfgVehicles { + class LandVehicle; + class StaticWeapon: LandVehicle { + class Turrets; + class MainTurret; + class ACE_Actions { + class ACE_MainActions {}; + }; + }; + + class StaticATWeapon: StaticWeapon {}; + + class GVAR(staticBase): StaticATWeapon { + scope = 1; + author = ECSTRING(common,ACETeam); + displayname = CSTRING(dragonName); + side = 1; + faction = "BLU_F"; + crew = "B_soldier_f"; + model = QPATHTOF(models\ace_m47_static.p3d); + editorPreview = QPATHTOF(data\ace_dragon_staticAssembled.jpg); + picture = "\A3\Static_F_Gamma\data\UI\gear_StaticTurret_AT_CA.paa"; + UiPicture = "\A3\Static_F_Gamma\data\UI\gear_StaticTurret_AT_CA.paa"; + icon = "\A3\Static_F_Gamma\data\UI\map_StaticTurret_AT_CA.paa"; + threat[] = {0.7,1.0,0.1}; + cost = 150000; + class Damage { + tex[] = {}; + mat[] = { + "a3\static_f_gamma\data\staticturret_01.rvmat", + "a3\static_f_gamma\data\staticturret_01_damage.rvmat", + "a3\static_f_gamma\data\staticturret_01_destruct.rvmat", + "a3\static_f_gamma\data\staticturret_02.rvmat", + "a3\static_f_gamma\data\staticturret_02_damage.rvmat", + "a3\static_f_gamma\data\staticturret_02_destruct.rvmat", + "a3\weapons_f_beta\launchers\titan\data\titan_launcher.rvmat", + "a3\weapons_f_beta\launchers\titan\data\titan_launcher_damage.rvmat", + "a3\weapons_f_beta\launchers\titan\data\titan_launcher_destruct.rvmat", + "a3\weapons_f_beta\launchers\titan\data\titan_mtube.rvmat", + "a3\weapons_f_beta\launchers\titan\data\titan_mtube_damage.rvmat", + "a3\weapons_f_beta\launchers\titan\data\titan_mtube_destruct.rvmat" + }; + }; + class Turrets: Turrets { + class MainTurret: MainTurret { + optics = 1; + turretInfoType = "RscWeaponEmpty"; + gunnerOpticsModel = QPATHTOF(models\optics_m47.p3d); + minElev = -30; + maxElev = 20; + weapons[] = { QGVAR(dummyStatic) }; + magazines[] = { QGVAR(super) }; + + gunnerAction = "gunner_static_low01"; + gunnergetInAction = ""; + gunnergetOutAction = ""; + + discreteDistance[] = {}; + discreteDistanceInitIndex = 0; + + displayName = CSTRING(dragonName); + + class ViewOptics { + initAngleX = 0; + minAngleX = -30; + maxAngleX = 30; + initAngleY = 5; + minAngleY = -100; + maxAngleY = 100; + initFov = 0.055; + minFov = 0.055; // 6 degree FOV + maxFov = 0.055; + visionMode[] = {"Normal"}; + thermalMode[] = {0}; + }; + gunnerRightHandAnimName = "OtocHlaven_shake"; + gunnerLeftHandAnimName = "OtocHlaven_shake"; + gunBeg = "spice rakety"; + gunEnd = "konec rakety"; + memoryPointGunnerOptics = "look"; + }; + }; + class AnimationSources { + class rest_rotate { + source="user"; + animPeriod=0.00001; + initPhase=-0.35; + maxValue="3.60"; + minValue="-3.60"; + }; + class optic_hide { + source="user"; + animPeriod=0.0001; + initPhase=1; + maxValue="1"; + minValue="0"; + }; + class missile_hide { + source="user"; + animPeriod=0.0001; + initPhase=0; + maxValue="1"; + minValue="0"; + }; + }; + soundGetOut[] = {"A3\sounds_f\dummysound",0.001,1,5}; + soundGetIn[] = {"A3\sounds_f\dummysound",0.00031622776,1,5}; + armorStructural = 10.0; + + class ACE_CSW { + disassembleTo = QGVAR(super); + }; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + displayName = CSTRING(dragonName); + class GVAR(pickUp) { + displayName = ECSTRING(csw,Pickup_displayName); + condition = QUOTE(call FUNC(canPickupTripod)); + statement = QUOTE(call EFUNC(csw,assemble_pickupTripod)); + }; + class GVAR(attachSight) { + displayName = CSTRING(attachSight); + condition = QUOTE(call FUNC(sightCanAttach)); + statement = QUOTE(call FUNC(sightAttach)); + icon = QPATHTOF(data\m47_daysight_interaction_attach.paa); + }; + class GVAR(detachSight) { + displayName = CSTRING(detachSight); + condition = QUOTE(call FUNC(sightCanDetach)); + statement = QUOTE(call FUNC(sightDetach)); + icon = QPATHTOF(data\m47_daysight_interaction_detach.paa); + }; + }; + }; + + }; + + class GVAR(staticAssembled): GVAR(staticBase) { + scope = 2; + class AnimationSources: AnimationSources { + class optic_hide: optic_hide { + initPhase = 0; + }; + }; + class Turrets: Turrets { + class MainTurret: MainTurret { + weapons[] = { QGVAR(superStatic) }; + }; + }; + }; +}; diff --git a/addons/dragon/CfgWeapons.hpp b/addons/dragon/CfgWeapons.hpp new file mode 100644 index 00000000000..9cb58e2c1f4 --- /dev/null +++ b/addons/dragon/CfgWeapons.hpp @@ -0,0 +1,90 @@ +class CfgWeapons { + class launch_Titan_base; + class Launcher_Base_F; + class missiles_titan; + class Binocular; + class Default; + class missiles_titan_static: missiles_titan { + class WeaponSlotsInfo; + }; + class launch_Titan_F: launch_Titan_base { + class WeaponSlotsInfo; + }; + + class GVAR(super): launch_Titan_F { + model = QPATHTOF(models\ace_m47_magazine.p3d); + picture = QPATHTOF(data\m47_dragon_item_ca.paa); + magazines[] = {}; + displayName = CSTRING(dragonNameCarry); // add [CSW] prefix to make it clearer in arsenal that this is a deployable weapon + descriptionShort = CSTRING(dragonDescription); + scope = 2; + + class ACE_CSW { + type = "mount"; + deployTime = 2; + pickupTime = 2; + deploy = QGVAR(staticBase); + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 253; + }; + modes[] = {}; + }; + + class GVAR(superStatic): missiles_titan_static { + EGVAR(overpressure,angle) = 90; + EGVAR(overpressure,range) = 30; + EGVAR(overpressure,damage) = 0.85; + + initSpeed = 120; + + displayName = CSTRING(dragonName); + descriptionShort = CSTRING(dragonDescription); + magazines[] = { QGVAR(super) }; + }; + + // need a weapon in order to rotate turret + class GVAR(dummyStatic): Default { + cursor = ""; + cursorAim = ""; + scope = 1; + displayName = CSTRING(dragonName); + reloadTime = 0; + canLock = 0; + optics = 0; + enableAttack = 0; + }; + + class GVAR(sight): Binocular { + displayName = CSTRING(sightName); + model = QPATHTOF(models\ace_m47_optic.p3d); + picture = QPATHTOF(data\m47_daysight_item_ca.paa); + optics = 1; + weaponInfoType = "RscWeaponEmpty"; + modelOptics = QPATHTOF(models\optics_m47); + reloadaction = ""; + showSwitchAction = 1; + useAsBinocular = 1; + uipicture = ""; + descriptionShort = CSTRING(sightDescription); + ace_disposable = 0; + magazines[] = {}; + type = 4096; + opticsPPEffects[] = {"OpticsCHAbera1","OpticsBlur1"}; + opticsZoomMin = 0.055; + opticsZoomMax = 0.055; + scope = 2; + class ACE_CSW { + type = "weapon"; + deployTime = 2; + pickupTime = 1; + class assembleTo { + GVAR(super_noSight) = QGVAR(super_sight); + }; + }; + class WeaponSlotsInfo { + mass = 68; + }; + }; +}; diff --git a/addons/dragon/README.md b/addons/dragon/README.md new file mode 100644 index 00000000000..84a82ad8202 --- /dev/null +++ b/addons/dragon/README.md @@ -0,0 +1,12 @@ +ace_dragon +=================== + +Adds M47 Dragon Missile. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Brandon-TCVM](https://github.com/TheCandianVendingMachine) + diff --git a/addons/dragon/XEH_PREP.hpp b/addons/dragon/XEH_PREP.hpp new file mode 100644 index 00000000000..148dff5cf67 --- /dev/null +++ b/addons/dragon/XEH_PREP.hpp @@ -0,0 +1,7 @@ +PREP(attackProfile_DRAGON); +PREP(canPickupTripod); +PREP(onFired); +PREP(sightAttach); +PREP(sightCanAttach); +PREP(sightCanDetach); +PREP(sightDetach); diff --git a/addons/dragon/XEH_postInit.sqf b/addons/dragon/XEH_postInit.sqf new file mode 100644 index 00000000000..0305fe772a9 --- /dev/null +++ b/addons/dragon/XEH_postInit.sqf @@ -0,0 +1,41 @@ +#include "script_component.hpp" + +[QGVAR(detachSight), LINKFUNC(sightDetach)] call CBA_fnc_addEventHandler; +[QGVAR(attachSight), LINKFUNC(sightAttach)] call CBA_fnc_addEventHandler; + +["vehicle", { + params ["","_vehicle"]; + TRACE_2("vehicle change",_vehicle,typeOf _vehicle); + if (!(_vehicle isKindOf QGVAR(staticBase))) exitWith {}; + + _vehicle animate ["rest_rotate", 0]; + + if (isNil QGVAR(pfID)) then {GVAR(pfID) = -1}; + [GVAR(pfID)] call CBA_fnc_removePerFrameHandler; + + private _lastView = cameraView; + if (!(_lastView in ["INTERNAL", "EXTERNAL"])) then { _lastView == "INTERNAL"; }; + + GVAR(pfID) = [{ + params ["_args"]; + (_this select 0) params ["_vehicle", "_lastView"]; + + if ((!alive _vehicle) || {!alive ACE_player} || {(vehicle ACE_player) != _vehicle}) exitWith { + TRACE_1("exiting PFEH",GVAR(pfID)); + [GVAR(pfID)] call CBA_fnc_removePerFrameHandler; + if ((alive _vehicle) && {!alive gunner _vehicle}) then { + TRACE_1("reseting rest rotate anim",_vehicle); + _vehicle animate ["rest_rotate", -0.35]; + }; + }; + + if (cameraView in ["INTERNAL", "EXTERNAL"]) then { + _args set [1, cameraView]; + } else { + if ((cameraOn == _vehicle) && {!(_vehicle getVariable [QGVAR(sightAttached), ((typeOf _vehicle) == QGVAR(staticAssembled))])}) then { + _vehicle switchCamera _lastView; + }; + }; + }, 0, [_vehicle, _lastView]] call CBA_fnc_addPerFrameHandler; + TRACE_1("started PFEH",GVAR(pfID)); +}, true] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/hot/XEH_preInit.sqf b/addons/dragon/XEH_preInit.sqf similarity index 100% rename from addons/hot/XEH_preInit.sqf rename to addons/dragon/XEH_preInit.sqf diff --git a/addons/hot/XEH_preStart.sqf b/addons/dragon/XEH_preStart.sqf similarity index 100% rename from addons/hot/XEH_preStart.sqf rename to addons/dragon/XEH_preStart.sqf diff --git a/addons/dragon/anim/M47.rtm b/addons/dragon/anim/M47.rtm new file mode 100644 index 00000000000..48f3dfc3c43 Binary files /dev/null and b/addons/dragon/anim/M47.rtm differ diff --git a/addons/dragon/anim/model.cfg b/addons/dragon/anim/model.cfg new file mode 100644 index 00000000000..6be7f511b5c --- /dev/null +++ b/addons/dragon/anim/model.cfg @@ -0,0 +1,119 @@ +class cfgSkeletons { + class OFP2_ManSkeleton { + isDiscrete = 0; + skeletonInherit = ""; + skeletonBones[] = { + "Pelvis","", + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", + "camera","Pelvis",// case has changed for arma3 + "weapon","Spine1", + "launcher","Spine1", + "Neck","Spine3", + "Neck1","Neck", + "Head","Neck1", //Head skeleton in hierarchy + //Left upper side + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", + //Right upper side + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot", + //New facial features arma3 only + "Face_Hub","Head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub" + };// end of skeleton array + // location of pivot points (local axes) for hierarchical animation + pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d"; + }; +}; + diff --git a/addons/dragon/config.cpp b/addons/dragon/config.cpp new file mode 100644 index 00000000000..78d836936ea --- /dev/null +++ b/addons/dragon/config.cpp @@ -0,0 +1,42 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_hot","ace_csw"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Brandon (TCVM)"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_GuidanceConfig.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgWeapons.hpp" +#include "CfgMagazines.hpp" +#include "CfgAmmo.hpp" +#include "CfgVehicles.hpp" + +class GVAR(serviceExplosion) { + class Light1 { + simulation = "light"; + type = "GrenadeExploLight"; + position[] = {0,0,0}; + intensity = 0.005; + interval = 1; + lifeTime = 0.5; + }; + class GrenadeSmoke1 { + simulation = "particles"; + type = "ImpactSmoke2"; + position[] = {0,0,0}; + intensity = 0.15; + interval = 0.1; + lifeTime = 0.5; + }; +}; + diff --git a/addons/dragon/data/M47.rvmat b/addons/dragon/data/M47.rvmat new file mode 100644 index 00000000000..3241cd20d73 --- /dev/null +++ b/addons/dragon/data/M47.rvmat @@ -0,0 +1,81 @@ +class StageTI { + texture="z\ace\addons\dragon\data\m47_ti_ca.paa"; +}; +ambient[]={0.958,0.984,1,1}; +diffuse[]={0.958,0.984,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.153,0.169,0.111,1}; +specularPower=90; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 { + texture="z\ace\addons\dragon\data\m47_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="a3\weapons_f\Data\DetailMaps\Metal_rough_DT.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="z\ace\addons\dragon\data\m47_as.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage5 { + texture="z\ace\addons\dragon\data\m47_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,32,128,1)fresnel(4.01,2.86)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/dragon/data/M47mis.rvmat b/addons/dragon/data/M47mis.rvmat new file mode 100644 index 00000000000..b530ec030b3 --- /dev/null +++ b/addons/dragon/data/M47mis.rvmat @@ -0,0 +1,81 @@ +class StageTI { + texture="z\ace\addons\dragon\data\m47_ti_ca.paa"; +}; +ambient[]={0.989,1,0.958,1}; +diffuse[]={0.989,1,0.958,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.159,0.212,0.196,1}; +specularPower=90; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 { + texture="z\ace\addons\dragon\data\m47mis_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="a3\weapons_f\Data\DetailMaps\Metal_rough_DT.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage5 { + texture="z\ace\addons\dragon\data\m47mis_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,32,128,1)fresnel(4.01,2.86)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/dragon/data/ace_dragon_staticAssembled.jpg b/addons/dragon/data/ace_dragon_staticAssembled.jpg new file mode 100644 index 00000000000..d64bda59300 Binary files /dev/null and b/addons/dragon/data/ace_dragon_staticAssembled.jpg differ diff --git a/addons/dragon/data/dragon_text.paa b/addons/dragon/data/dragon_text.paa new file mode 100644 index 00000000000..a8a37872920 Binary files /dev/null and b/addons/dragon/data/dragon_text.paa differ diff --git a/addons/dragon/data/m47_as.paa b/addons/dragon/data/m47_as.paa new file mode 100644 index 00000000000..c561e39cf22 Binary files /dev/null and b/addons/dragon/data/m47_as.paa differ diff --git a/addons/dragon/data/m47_co.paa b/addons/dragon/data/m47_co.paa new file mode 100644 index 00000000000..5c621b5728a Binary files /dev/null and b/addons/dragon/data/m47_co.paa differ diff --git a/addons/dragon/data/m47_daysight_interaction_attach.paa b/addons/dragon/data/m47_daysight_interaction_attach.paa new file mode 100644 index 00000000000..0a9e19b461f Binary files /dev/null and b/addons/dragon/data/m47_daysight_interaction_attach.paa differ diff --git a/addons/dragon/data/m47_daysight_interaction_detach.paa b/addons/dragon/data/m47_daysight_interaction_detach.paa new file mode 100644 index 00000000000..7a0d5eb22e6 Binary files /dev/null and b/addons/dragon/data/m47_daysight_interaction_detach.paa differ diff --git a/addons/dragon/data/m47_daysight_item_ca.paa b/addons/dragon/data/m47_daysight_item_ca.paa new file mode 100644 index 00000000000..9768f42b9c2 Binary files /dev/null and b/addons/dragon/data/m47_daysight_item_ca.paa differ diff --git a/addons/dragon/data/m47_dragon_item_ca.paa b/addons/dragon/data/m47_dragon_item_ca.paa new file mode 100644 index 00000000000..0e875747945 Binary files /dev/null and b/addons/dragon/data/m47_dragon_item_ca.paa differ diff --git a/addons/dragon/data/m47_nohq.paa b/addons/dragon/data/m47_nohq.paa new file mode 100644 index 00000000000..e70a9f0ff2a Binary files /dev/null and b/addons/dragon/data/m47_nohq.paa differ diff --git a/addons/dragon/data/m47_smdi.paa b/addons/dragon/data/m47_smdi.paa new file mode 100644 index 00000000000..b6cd197ea82 Binary files /dev/null and b/addons/dragon/data/m47_smdi.paa differ diff --git a/addons/dragon/data/m47_ti_ca.paa b/addons/dragon/data/m47_ti_ca.paa new file mode 100644 index 00000000000..27c24a65992 Binary files /dev/null and b/addons/dragon/data/m47_ti_ca.paa differ diff --git a/addons/dragon/data/m47mis_co.paa b/addons/dragon/data/m47mis_co.paa new file mode 100644 index 00000000000..e76bee6f81a Binary files /dev/null and b/addons/dragon/data/m47mis_co.paa differ diff --git a/addons/dragon/data/m47mis_nohq.paa b/addons/dragon/data/m47mis_nohq.paa new file mode 100644 index 00000000000..6489813b6b7 Binary files /dev/null and b/addons/dragon/data/m47mis_nohq.paa differ diff --git a/addons/dragon/data/m47mis_smdi.paa b/addons/dragon/data/m47mis_smdi.paa new file mode 100644 index 00000000000..833a9c19c12 Binary files /dev/null and b/addons/dragon/data/m47mis_smdi.paa differ diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf new file mode 100644 index 00000000000..b7adb597f58 --- /dev/null +++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf @@ -0,0 +1,77 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) (Code inspired by NouberNou's Dragon Guidance) + * Attack profile: Dragon Guidance + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL - Unused + * + * Example: + * [[1,2,3], [], []] call ace_dragon_fnc_attackProfile_DRAGON; + * + * Public: No + */ +params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; +_args params ["_firedEH", "", "", "", "_stateParams"]; +_firedEH params ["_shooter","_weapon","","","","","_projectile"]; +_attackProfileStateParams params ["_maxCorrectableDistance", "_wireCut", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_lastTime", "_serviceInterval", "_serviceChargeCount", "_serviceChargeAcceleration", "_dragonSpeed"]; + +private _projectilePos = getPosASL _projectile; +private _distanceToProjectile = (getPosASL _shooter) vectorDistanceSqr _projectilePos; +private _retPos = _projectilePos vectorAdd (AGLtoASL (_projectile vectorModelToWorld [0, 50, 0])); + +// _shooter returns the vehicle that shot it. If the launcher dies, the wire would probably be cut so assume it +if ((_distanceToProjectile > _seekerMaxRangeSqr) || _wireCut || { !alive _shooter }) exitWith { + // wire snap, random direction + if (!_wireCut) then { + _attackProfileStateParams set [1, true]; + playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLtoASL (_shooter modelToWorld _wireCutSource), 5, 1, 25]; + }; + + if (_serviceChargeCount > 0 && {(_lastTime - CBA_missionTime) <= 0}) then { + _attackProfileStateParams set [5, CBA_missionTime + 0.05 + random 0.1]; + private _randomVector = [(random 2) - 1, random 1, (random 2) - 1]; + _projectile setVelocityModelSpace ((velocityModelSpace _projectile) vectorAdd (_randomVector vectorMultiply _serviceChargeAcceleration)); + private _charge = createVehicle [QGVAR(serviceCharge), [0, 0, 0], [], 0, "NONE"]; + _charge setPosASL (_projectilePos vectorAdd ((_randomVector vectorMultiply -1) vectorMultiply 0.025)); + _attackProfileStateParams set [7, _serviceChargeCount - 1]; + }; + + _retPos +}; + +if (_distanceToProjectile <= _seekerMinRangeSqr || { _serviceChargeCount <= 0 } || { !(_shooter getVariable [QGVAR(sightAttached), true]) }) exitWith { _retPos }; + +// if the time between updates is less than the pop time we want to fire the rockets OR if the missile wants to make a major correction pop it rapidly +if (((_lastTime - CBA_missionTime) <= 0) || {(_lastTime - CBA_missionTime) < (_serviceInterval / 2) && (_projectilePos vectorDistance _seekerTargetPos > 1)}) then { + _attackProfileStateParams set [5, CBA_missionTime + _serviceInterval]; + + private _vectorToCrosshair = vectorNormalized (_projectile worldToModel (ASLToAGL _seekerTargetPos)); + private _vectorToPos = vectorNormalized (((_projectile vectorWorldToModelVisual (_shooter weaponDirection _weapon)) vectorMultiply (_dragonSpeed * _serviceInterval)) vectorAdd (_vectorToCrosshair vectorMultiply _maxCorrectableDistance)); + + if ((_vectorToPos select 2) < 0) then { + _vectorToPos set [2, 0]; + } else { + private _a = _vectorToPos select 1; + private _b = _vectorToPos select 2; + // The booster has some angle to it, so we introduce that axis if the angle is too low + if (abs(_a) > 0 && { abs(atan (_b / _a)) < DRAGON_BOOSTER_ANGLE }) then { + _vectorToPos set [2, abs(_a)]; + }; + }; + + _projectile setVelocityModelSpace ((velocityModelSpace _projectile) vectorAdd (_vectorToPos vectorMultiply _serviceChargeAcceleration)); + + private _charge = createVehicle [QGVAR(serviceCharge), [0, 0, 0], [], 0, "NONE"]; + _charge setPosASL (_projectilePos vectorAdd ((_vectorToCrosshair vectorMultiply -1) vectorMultiply 0.025)); + + _attackProfileStateParams set [7, _serviceChargeCount - 1]; +}; + +_retPos + diff --git a/addons/dragon/functions/fnc_canPickupTripod.sqf b/addons/dragon/functions/fnc_canPickupTripod.sqf new file mode 100644 index 00000000000..c328c66bd68 --- /dev/null +++ b/addons/dragon/functions/fnc_canPickupTripod.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Determines if you can pick-up the Dragon missile. If the missile was fired you will not be able to pick up the tripod. + * + * Arguments: + * 0: Target + * 1: Unit Performing Action + * + * Return Value: + * Can Pickup Tripod + * + * Example: + * [vehicle player, player] call ace_dragon_fnc_canPickupTripod; + * + * Public: No + */ +params ["_target", "_unit"]; + +(alive _target) +&& {!alive (gunner _target)} +&& {!(_target getVariable [QGVAR(fired), false])} +&& {!(_target getVariable [QGVAR(sightAttached), ((typeOf _target) == QGVAR(staticAssembled))])} +&& EFUNC(csw,assemble_canPickupTripod) + diff --git a/addons/dragon/functions/fnc_onFired.sqf b/addons/dragon/functions/fnc_onFired.sqf new file mode 100644 index 00000000000..78d9d15b911 --- /dev/null +++ b/addons/dragon/functions/fnc_onFired.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Runs when Dragon is fired + * + * Arguments: + * 0: None + * 1: The weapon that was fired + * + * Return Value: + * None + * + * Example: + * [any, vehicle player] call ace_dragon_fnc_onFired; + * + * Public: No + */ +params ["_firedEH", "", "", "_seekerParams", "_stateParams"]; +_firedEH params ["_shooter","_weapon","","","","","_projectile"]; +_stateParams params ["", "", "_attackProfileStateParams"]; +_seekerParams params ["", "", "_seekerMaxRange", "_seekerMinRange"]; + +_shooter setVariable [QGVAR(fired), true, true]; +_shooter animate ["missile_hide", 1]; + +private _config = ([_projectile] call CBA_fnc_getObjectConfig) >> "ace_missileguidance"; + +private _serviceInterval = [_config >> "serviceInterval", "NUMBER", 0.33] call CBA_fnc_getConfigEntry; +private _serviceChargeCount = [_config >> "serviceCharges", "NUMBER", 60] call CBA_fnc_getConfigEntry; +private _serviceChargeAcceleration = [_config >> "serviceChargeAcceleration", "NUMBER", 6.5] call CBA_fnc_getConfigEntry; +private _dragonSpeed = [_config >> "dragonSpeed", "NUMBER", 100] call CBA_fnc_getConfigEntry; +private _maxCorrectableDistance = [_config >> "correctionDistance", "NUMBER", DEFAULT_CORRECTION_DISTANCE] call CBA_fnc_getConfigEntry; +private _maxDistanceSqr = _seekerMaxRange * _seekerMaxRange; +private _minDistanceSqr = _seekerMinRange * _seekerMinRange; + +private _turretPath = [_shooter, _weapon] call CBA_fnc_turretPathWeapon; +private _turretConfig = [_shooter, _turretPath] call CBA_fnc_getTurret; + +private _wireCutSource = _shooter selectionPosition getText(_turretConfig >> "missileEnd"); + +_attackProfileStateParams append [ + _maxCorrectableDistance, + false, + _maxDistanceSqr, + _minDistanceSqr, + _wireCutSource, + CBA_missionTime, + _serviceInterval, + _serviceChargeCount, + _serviceChargeAcceleration, + _dragonSpeed +]; + diff --git a/addons/dragon/functions/fnc_sightAttach.sqf b/addons/dragon/functions/fnc_sightAttach.sqf new file mode 100644 index 00000000000..6ad5df2077c --- /dev/null +++ b/addons/dragon/functions/fnc_sightAttach.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Attaches the sighting unit to the Dragon missile. + * + * Arguments: + * 0: Target + * 1: Unit Performing Action + * 2: Is event (function recursives globaly to set weapon where turret is local) (default: false) + * + * Return Value: + * Can Attach Sighting Unit + * + * Example: + * [cursorObject, player] call ace_dragon_fnc_sightAttach + * + * Public: No + */ + +params ["_target", "_unit", ["_event", false]]; +TRACE_3("sightAttach",_target,_unit,_event); + +if (_event isEqualTo true) then { // this is actually needed as 3rd arg may not be bool + if (!(_target turretLocal [0])) exitWith {}; + _target setVariable [QGVAR(sightAttached), true, true]; + _target animate ["optic_hide", 0]; + _target addWeapon QGVAR(superStatic); + _target removeWeapon QGVAR(dummyStatic); + TRACE_2("added sight",_target weaponsTurret [0],_target animationPhase "optic_hide"); +} else { + _unit removeWeapon QGVAR(sight); + [QGVAR(attachSight), [_target, _unit, true]] call CBA_fnc_globalEvent; +}; diff --git a/addons/dragon/functions/fnc_sightCanAttach.sqf b/addons/dragon/functions/fnc_sightCanAttach.sqf new file mode 100644 index 00000000000..9ec742d19b4 --- /dev/null +++ b/addons/dragon/functions/fnc_sightCanAttach.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Determines if you can attach the sighting unit to the Dragon missile. + * + * Arguments: + * 0: Target + * 1: Unit Performing Action + * + * Return Value: + * Can Attach Sighting Unit + * + * Example: + * [cursorObject, player] call ace_dragon_fnc_sightCanAttach + * + * Public: No + */ + +params ["_target", "_unit"]; + +(alive _target) +&& {!(_target getVariable [QGVAR(sightAttached), ((typeOf _target) == QGVAR(staticAssembled))])} +&& {QGVAR(sight) in (weapons _unit)} diff --git a/addons/dragon/functions/fnc_sightCanDetach.sqf b/addons/dragon/functions/fnc_sightCanDetach.sqf new file mode 100644 index 00000000000..92c4a9a913c --- /dev/null +++ b/addons/dragon/functions/fnc_sightCanDetach.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Determines if you can attach the sighting unit to the Dragon missile. + * + * Arguments: + * 0: Target + * 1: Unit Performing Action + * + * Return Value: + * Can Attach Sighting Unit + * + * Example: + * [cursorObject, player] call ace_dragon_fnc_sightCanDetach + * + * Public: No + */ + +params ["_target", "_unit"]; + +(alive _target) +&& {_target getVariable [QGVAR(sightAttached), ((typeOf _target) == QGVAR(staticAssembled))]} diff --git a/addons/dragon/functions/fnc_sightDetach.sqf b/addons/dragon/functions/fnc_sightDetach.sqf new file mode 100644 index 00000000000..161a13ba64b --- /dev/null +++ b/addons/dragon/functions/fnc_sightDetach.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Attaches the sighting unit to the Dragon missile. + * + * Arguments: + * 0: Target + * 1: Unit Performing Action + * 2: Is event (function recursives globaly to set weapon where turret is local) (default: false) + * + * Return Value: + * Can Attach Sighting Unit + * + * Example: + * [cursorObject, player] call ace_dragon_fnc_sightDetach; + * + * Public: No + */ + +params ["_target", "_unit"]; + +params ["_target", "_unit", ["_event", false]]; +TRACE_3("sightDetach",_target,_unit,_event); + +if (_event isEqualTo true) then { // this is actually needed as 3rd arg may not be bool + if (!(_target turretLocal [0])) exitWith {}; + _target setVariable [QGVAR(sightAttached), false, true]; + _target animate ["optic_hide", 1]; + _target removeWeapon QGVAR(superStatic); + _target addWeapon QGVAR(dummyStatic); + TRACE_2("removed sight",_target weaponsTurret [0],_target animationPhase "optic_hide"); +} else { + if ((binocular _unit) == "") then { + _unit addWeapon QGVAR(sight); + } else { + [_unit, QGVAR(sight)] call EFUNC(common,addToInventory); + }; + [QGVAR(detachSight), [_target, _unit, true]] call CBA_fnc_globalEvent; +}; diff --git a/addons/dragon/functions/script_component.hpp b/addons/dragon/functions/script_component.hpp new file mode 100644 index 00000000000..386679ecf6b --- /dev/null +++ b/addons/dragon/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\dragon\script_component.hpp" \ No newline at end of file diff --git a/addons/dragon/models/ace_m47_magazine.p3d b/addons/dragon/models/ace_m47_magazine.p3d new file mode 100644 index 00000000000..ac09112e91b Binary files /dev/null and b/addons/dragon/models/ace_m47_magazine.p3d differ diff --git a/addons/dragon/models/ace_m47_optic.p3d b/addons/dragon/models/ace_m47_optic.p3d new file mode 100644 index 00000000000..355c6b04b50 Binary files /dev/null and b/addons/dragon/models/ace_m47_optic.p3d differ diff --git a/addons/dragon/models/ace_m47_static.p3d b/addons/dragon/models/ace_m47_static.p3d new file mode 100644 index 00000000000..3c3a6b07319 Binary files /dev/null and b/addons/dragon/models/ace_m47_static.p3d differ diff --git a/addons/dragon/models/dragon.p3d b/addons/dragon/models/dragon.p3d new file mode 100644 index 00000000000..4416a2d7a92 Binary files /dev/null and b/addons/dragon/models/dragon.p3d differ diff --git a/addons/dragon/models/model.cfg b/addons/dragon/models/model.cfg new file mode 100644 index 00000000000..ab93f7e9a8a --- /dev/null +++ b/addons/dragon/models/model.cfg @@ -0,0 +1,94 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + + class ace_m47_static_skeleton: Default { + skeletonInherit = "Default"; + skeletonBones[] = { + "bipod","", + "grav_box","bipod", + "launcher","grav_box", + "optic","launcher", + "missile","launcher" + }; + }; +}; + +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {}; + }; + + class ace_m47_static: Default { + sectionsInherit = "Default"; + sections[] = {}; + skeletonName = "ace_m47_static_skeleton"; + class Animations { + class MainGun { + type="rotation"; + selection="launcher"; + sourceAddress = "clamp"; + source="MainGun"; + axis="elevate_axis"; + animPeriod=0.01; + initPhase=0; + maxValue="rad 360"; + minValue="rad -360"; + angle1="rad 360"; + angle0="rad -360"; + }; + class MainTurret { + type="rotation"; + source="MainTurret"; + selection="bipod"; + sourceAddress = "loop"; + axis="rotate_axis"; + animPeriod=0.005; + minValue="rad -360"; + maxValue="rad +360"; + angle0="rad -360"; + angle1="rad +360"; + }; + class rest_rotate { + type="rotation"; + selection="grav_box"; + sourceAddress = "clamp"; + source="user"; + axis="elevate_axis"; + animPeriod=0.00001; + initPhase=-0.35; + maxValue="3.60"; + minValue="-3.60"; + angle1="rad -360"; + angle0="rad 360"; + }; + class optic_hide { + type = "hide"; + source = "user"; + selection = "optic"; + animPeriod = 0.0001; + minValue = 0; + maxValue = 1; + minPhase = 0; + maxPhase = 1; + hideValue = 0.99; + initPhase = 1; + }; + class missile_hide { + type = "hide"; + source = "user"; + selection = "missile"; + animPeriod = 0.0001; + minValue = 0; + maxValue = 1; + minPhase = 0; + maxPhase = 1; + hideValue = 0.99; + }; + }; + }; +}; diff --git a/addons/dragon/models/optics_m47.p3d b/addons/dragon/models/optics_m47.p3d new file mode 100644 index 00000000000..08183a1f0ef Binary files /dev/null and b/addons/dragon/models/optics_m47.p3d differ diff --git a/addons/dragon/script_component.hpp b/addons/dragon/script_component.hpp new file mode 100644 index 00000000000..77521b2c6a2 --- /dev/null +++ b/addons/dragon/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT dragon +#define COMPONENT_BEAUTIFIED M47 Dragon +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_DRAGON + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_DRAGON + #define DEBUG_SETTINGS DEBUG_SETTINGS_DRAGON +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#define DRAGON_BOOSTER_ANGLE 45 diff --git a/addons/dragon/sounds/M47_1.wss b/addons/dragon/sounds/M47_1.wss new file mode 100644 index 00000000000..4b1949aa49c Binary files /dev/null and b/addons/dragon/sounds/M47_1.wss differ diff --git a/addons/dragon/sounds/M47_2.wss b/addons/dragon/sounds/M47_2.wss new file mode 100644 index 00000000000..c630402c5b0 Binary files /dev/null and b/addons/dragon/sounds/M47_2.wss differ diff --git a/addons/dragon/sounds/dry.wss b/addons/dragon/sounds/dry.wss new file mode 100644 index 00000000000..e54a8ab4e9f Binary files /dev/null and b/addons/dragon/sounds/dry.wss differ diff --git a/addons/dragon/sounds/rocket_fly.wss b/addons/dragon/sounds/rocket_fly.wss new file mode 100644 index 00000000000..76264b12467 Binary files /dev/null and b/addons/dragon/sounds/rocket_fly.wss differ diff --git a/addons/dragon/sounds/rocket_reload.wss b/addons/dragon/sounds/rocket_reload.wss new file mode 100644 index 00000000000..8cdce5a7f8b Binary files /dev/null and b/addons/dragon/sounds/rocket_reload.wss differ diff --git a/addons/dragon/sounds/service_charge.wss b/addons/dragon/sounds/service_charge.wss new file mode 100644 index 00000000000..1cafccaa91d Binary files /dev/null and b/addons/dragon/sounds/service_charge.wss differ diff --git a/addons/dragon/stringtable.xml b/addons/dragon/stringtable.xml new file mode 100644 index 00000000000..2e2e3de4701 --- /dev/null +++ b/addons/dragon/stringtable.xml @@ -0,0 +1,92 @@ + + + + + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + [CSW] M47 スーパー ドラゴン + [CSW] M47龍式 + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + [CSW] M47 Super-Dragon + + + M47 Super-Dragon + M47 Super-Dragon + M47 Super-Dragon + M47 Super-Dragon + M47 スーパー ドラゴン + M47 龍式 + M47 Super-Dragon + M47 Super-Dragon + M47 Super-Dragon + M47 Super-Dragon + M47 Super-Dragon + + + Attach Sight + Bringe Visier an + Colocar Mira + Monter le viseur + 照準器を取り付ける + 裝上瞄具 + Monta mirino + Připojit puškohled + Dołącz Optykę + Прикрепить прицел + + + Detach Sight + Nehme Visier ab + Remover Mira + Démonter le viseur + 照準器を外す + 拆下瞄具 + Smonta mirino + Odpojit puškohled + Odczep Optykę + Открепить прицел + + + SU-36/P Daysight + SU-36/P Daysight + SU-36/P Daysight + SU-36/P Daysight + SU-36/P デイサイト + SU-36/P 日間瞄具 + SU-36/P Daysight + SU-36/P denní puškohled + SU-36/P Celownik dzienny + SU-36/P Daysight + SU-36/P Дневной + + + A light, cheap sight used for daytime operations. Contains the guidance computer for the whole system + Ein leichte, billige Visierung for Tageseinsätze. Beinhaltet den Zielsuchcomputer für das ganze System. + Uma mira leve e comum utilizada para operações de dia. Contêm o computador de orientação para todo o sistema. + Un viseur léger et bon marché utilisé pour les opérations de jour.\nContient l'ordinateur de guidage pour tout le système. + 昼間時に使用される軽量で、低価格の照準器です。システム全体の誘導コンピュータを備えています。 + 一個輕量,便宜適合日間行動使用的廉價瞄具。內含全套制導電腦系統 + Una luce,un mirino usato per le operazioni diurne.Contiene il computer di guida per l'intero sistema + Lehký a levný puškohled pro použití za denního světla. Obsahuje navigační počítač pro celý systém. + Lekki, tani celownik używany do działania w trakcie dnia. Zawiera komputer naprowadząjący dla całego systemu + Легкий дешёвый прицел, используемый для дневных операций. Содержит компьютер для всей системы + + + A Wire-Guided SACLOS missile with a unique flight characteristic + Eine Drahtgelenkte SACLOS-Rakete mit einer einzigartigen Flugcharakteristik + Um míssil SACLOS, guiado por fio com uma característica única de vôo + Un missile filoguidé SACLOS, présentant une caractéristique de vol exceptionnelle. + 特徴的な飛行特性を持つ、ワイヤ誘導の SACLOS ミサイルです。 + 一個有線制導半自動指令型飛彈並有著獨特的飛航動作 + Un missile SACLOS filo-guidato con uniche caratterische di volo + Drátem naváděná SACLOS raketa s unikátními letovými vlastnostmi + Naprowadzany przewodowo rakietowy pocisk SACLOS o unikalnej charakterystyce lotu + Ракета SACLOS с проводным наведением с уникальной характеристикой полета + + + diff --git a/addons/explosives/Cfg3DEN.hpp b/addons/explosives/Cfg3DEN.hpp new file mode 100644 index 00000000000..d36baa9c408 --- /dev/null +++ b/addons/explosives/Cfg3DEN.hpp @@ -0,0 +1,22 @@ +#define DEFAULT_IS_EOD (_this getUnitTrait 'explosiveSpecialist') + +class Cfg3DEN { + class Object { + class AttributeCategories { + class ace_attributes { + class Attributes { + class ace_isEOD { + displayName = CSTRING(IsEOD_DisplayName); + tooltip = CSTRING(IsEOD_Description); + property = QUOTE(ace_isEOD); + control = "Checkbox"; + expression = QUOTE(_this setVariable [ARR_3('ACE_isEOD',_value,true)]); + defaultValue = QUOTE(DEFAULT_IS_EOD); + condition = "objectBrain"; + typeName = "BOOL"; + }; + }; + }; + }; + }; +}; diff --git a/addons/explosives/CfgAmmo.hpp b/addons/explosives/CfgAmmo.hpp index c79030d2aba..c02885362ee 100644 --- a/addons/explosives/CfgAmmo.hpp +++ b/addons/explosives/CfgAmmo.hpp @@ -65,6 +65,7 @@ class CfgAmmo { GVAR(size) = 0; }; + // "The SLAM has an anti-tamper feature that is only active in the bottom- and side-attack modes." class SLAMDirectionalMine_Wire_Ammo: DirectionalBombBase { indirectHitRange = 20; GVAR(explodeOnDefuseChance) = 1; @@ -77,10 +78,11 @@ class CfgAmmo { }; class ACE_SLAMDirectionalMine_Timer_Ammo: SLAMDirectionalMine_Wire_Ammo { mineTrigger = "TimeTrigger"; + GVAR(explodeOnDefuseChance) = 0; }; class ACE_SLAMDirectionalMine_Magnetic_Ammo: SLAMDirectionalMine_Wire_Ammo { mineTrigger = "ACE_MagneticTrigger"; - GVAR(explodeOnDefuseChance) = 0; + GVAR(explodeOnDefuseChance) = 1; explosionAngle = 360; indirectHitRange = 1; mineInconspicuousness = 25; @@ -162,19 +164,19 @@ class CfgAmmo { class ACE_IEDLandSmall_Command_Ammo: IEDLandSmall_Remote_Ammo { mineTrigger = "RemoteTrigger"; }; - class ACE_IEDLandSmall_Range_Ammo: IEDLandBig_Remote_Ammo { + class ACE_IEDLandSmall_Range_Ammo: IEDLandSmall_Remote_Ammo { mineTrigger = "RangeTriggerShort"; }; - + // Orange DLC: - class APERSMineDispenser_Ammo: PipeBombBase { + class APERSMineDispenser_Ammo: PipeBombBase { GVAR(magazine) = "APERSMineDispenser_Mag"; GVAR(Explosive) = "APERSMineDispenser_Ammo_Scripted"; // triggerWhenDestroyed = 1; GVAR(size) = 0; GVAR(defuseObjectPosition)[] = {0.0, -0.05, 0.15}; }; class APERSMine_Range_Ammo; - class TrainingMine_Ammo: APERSMine_Range_Ammo { + class TrainingMine_Ammo: APERSMine_Range_Ammo { GVAR(magazine) = "TrainingMine_Mag"; GVAR(size) = 0; GVAR(defuseObjectPosition)[] = {0, 0, 0.15}; diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 76d3e44bd19..f01a3ad20d3 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -60,3 +60,8 @@ GVAR(CurrentSpeedDial) = 0; _this call FUNC(interactEH); }] call CBA_fnc_addEventHandler; + +["unit", { + params ["_player"]; + [_player, QGVAR(explosiveActions)] call EFUNC(common,eraseCache); +}] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/explosives/config.cpp b/addons/explosives/config.cpp index 3d2077ff1dd..08042297dc5 100644 --- a/addons/explosives/config.cpp +++ b/addons/explosives/config.cpp @@ -16,6 +16,7 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" +#include "Cfg3DEN.hpp" #include "CfgAmmo.hpp" #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" @@ -46,6 +47,9 @@ class CfgActions { class DeactivateMine:None { show = 0; }; + class UseContainerMagazine: None { + show = 0; + }; }; class CfgMineTriggers { diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index 9fd1184150b..6956505df70 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -22,7 +22,7 @@ params ["_args", "_pfID"]; _args params ["_unit", "_i", "_arr", "_code"]; if ((_i mod 4) == 0) then { - playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit modelToWorldVisual [0,0.2,2]), 15,1,2.5]; + playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit modelToWorldVisual [0,0.2,2]), 5,1,5]; }; ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; diff --git a/addons/explosives/functions/fnc_openTimerUI.sqf b/addons/explosives/functions/fnc_openTimerUI.sqf index 05d340e8dd2..b7715d08a2d 100644 --- a/addons/explosives/functions/fnc_openTimerUI.sqf +++ b/addons/explosives/functions/fnc_openTimerUI.sqf @@ -15,6 +15,9 @@ * Public: No */ +#define TIMER_VALUE_MIN_CUSTOM (missionNamespace getVariable [QGVAR(customTimerMin), TIMER_VALUE_MIN]) +#define TIMER_VALUE_MAX_CUSTOM (missionNamespace getVariable [QGVAR(customTimerMax), TIMER_VALUE_MAX]) + params ["_explosive"]; TRACE_1("Opening timer UI",_explosive); @@ -23,6 +26,9 @@ private _display = uiNamespace getVariable [QGVAR(timerDisplay), displayNull]; // Update slider speed to 1s (_display displayCtrl IDC_TIMER_SLIDER) sliderSetSpeed [1, 1]; +(_display displayCtrl IDC_TIMER_SLIDER) sliderSetRange [TIMER_VALUE_MIN_CUSTOM, TIMER_VALUE_MAX_CUSTOM]; +(_display displayCtrl IDC_TIMER_SLIDER) sliderSetPosition (TIMER_VALUE_DEFAULT max TIMER_VALUE_MIN_CUSTOM min TIMER_VALUE_MAX_CUSTOM); + // Add confirm button action GVAR(explosive) = _explosive; @@ -52,7 +58,7 @@ _display displayAddEventHandler ["MouseZChanged", { if (cba_events_control) then {_change = _change * 10}; private _slider = _display displayCtrl IDC_TIMER_SLIDER; - private _value = (sliderPosition _slider + _change) max TIMER_VALUE_MIN min TIMER_VALUE_MAX; + private _value = (sliderPosition _slider + _change) max TIMER_VALUE_MIN_CUSTOM min TIMER_VALUE_MAX_CUSTOM; _slider sliderSetPosition _value; }]; diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index a85580f6728..96fc4820e4a 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -80,7 +80,7 @@ GVAR(TweakedAngle) = 0; #ifdef DEBUG_MODE_FULL drawLine3d [(eyePos _unit) call EFUNC(common,ASLToPosition), (_testPos) call EFUNC(common,ASLToPosition), [1,0,0,1]]; #endif - if (lineIntersects [eyePos _unit, _testPos, _unit]) exitWith {_return = false;}; + if !((lineIntersectsSurfaces [eyePos _unit, _testPos, _unit]) isEqualTo []) exitWith {_return = false;}; } forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]]; _return }; @@ -94,8 +94,8 @@ GVAR(TweakedAngle) = 0; private _testBase = _basePosASL vectorAdd _lookDirVector; { private _testPos = _testBase vectorAdd [0.1 * (_x select 0) * (cos _cameraAngle), 0.1 * (_x select 0) * (sin _cameraAngle), 0.1 * (_x select 1)]; - private _intersectsWith = lineIntersectsWith [eyePos _unit, _testPos, _unit]; - if (count _intersectsWith == 1) exitWith {_attachVehicle = (_intersectsWith select 0);}; + private _intersectObject = ((lineIntersectsSurfaces [eyePos _unit, _testPos, _unit]) param [0, objNull]) param [3, objNull]; + if !(_intersectObject isEqualTo objNull) exitWith {_attachVehicle = _intersectObject}; } forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]]; if ((!isNull _attachVehicle) && {[PLACE_RANGE_MIN] call _testPositionIsValid} && {(_attachVehicle isKindOf "Car") || {_attachVehicle isKindOf "Tank"} || {_attachVehicle isKindOf "Air"} || {_attachVehicle isKindOf "Ship"}}) then { diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 8923f1c5ddd..21c44d7956f 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -16,6 +16,7 @@ 폭발물 炸药 炸藥 + Patlayıcılar Place @@ -32,6 +33,7 @@ 설치 放置 放置 + Yerleştir Detonate @@ -48,6 +50,7 @@ 폭파 引爆 引爆 + Patlat Detonate All @@ -63,13 +66,14 @@ 모두 폭파 引爆全部 引爆全部 + Hepsini Patlat Explosive code: %1 Sprengstoffcode: %1 Código del explosivo: %1 Kod ładunku: %1 - Code de l'explosif: %1 + Code de l'explosif : %1 Kód výbušniny: %1 Robbanóanyag kódja: %1 Código do explosivo: %1 @@ -78,7 +82,8 @@ 爆破コード: %1 폭파 코드: %1 炸药代码: %1 - 炸藥代碼: %1 + 炸藥代號: %1 + Patlayıcı Kodu: %1 Place @@ -95,6 +100,7 @@ 설치 放置 放置 + Yerleştir Attach @@ -111,6 +117,7 @@ 부착 连接 連接 + Bağla Blocked @@ -126,6 +133,7 @@ 막힘 断开 斷開 + Bloke Edilmiş Cancel @@ -142,6 +150,7 @@ 취소 取消 取消 + Iptal Rotate @@ -158,6 +167,7 @@ 회전 旋转 旋轉 + Döndür Turn On Thor III @@ -174,6 +184,7 @@ Thor III 켜기 开启索尔三型 開啟索爾三型 + Thor III ü aç Turn Off Thor III @@ -190,6 +201,7 @@ Thor III 끄기 关闭索尔三型 關閉索爾三型 + Thor III ü kapat Cellphone @@ -206,13 +218,14 @@ 휴대전화 手机 手機 + Cep Telefonu Used to remotely trigger explosives Wird benutzt um Sprengstoffe fernzuzünden Usado para detonar remotamente explosivos Używany do zdalnego detonowania ładunków wybuchowych - Utilisé pour déclencher des explosifs à distance + Utilisé pour déclencher des explosifs à distance. Používaný ke vzdálenému odpalování výbušnin Usato per l'attivazione a distanza degli esplosivi Robbanóanyagok távoli robbantásához való @@ -238,13 +251,14 @@ M57 격발기 M57 引爆装置 M57 引爆裝置 + M57 Ateşleme Cihazı Used to remotely trigger explosives Wird benutzt um Sprengstoffe fernzuzünden Usado para detonar remotamente explosivos Używany do zdalnego detonowania ładunków wybuchowych - Utilisé pour déclencher des explosifs à distance + Utilisé pour déclencher des explosifs à distance. Používané ke vzdálenému odpalování výbušnin Usato per l'attivazione a distanza degli esplosivi Robbanóanyagok távoli robbantásához @@ -254,6 +268,7 @@ 원격으로 폭발물을 폭파시킬때 씁니다. 用于远端引爆炸药 用於遠端引爆炸藥 + Patlayıcıları uzaktan tetiklemek için kullanılır M152 Firing Device @@ -270,6 +285,7 @@ M152 격발기 M152 引爆装置 M152 引爆裝置 + M152 Ateşleme Cihazı M152 RAMS @@ -286,6 +302,7 @@ M152 RAMS M152 远端炸药引爆系统 M152 遠端炸藥引爆系統 + M152 RAMS Defusal Kit @@ -302,13 +319,14 @@ 해체 장비 拆弹工具 拆彈工具 + Imha Kiti Allows defusing of explosives Erlaubt die Entschärfung von Sprengstoffen Permite desactivar explosivos Umożliwia rozbrajanie ładunków wybuchowych - Permet de désamorçer des explosifs + Outils nécessaires au désamorçage des explosifs. Dovoluje zneškodňování výbušnin Consente la disattivazione degli ordigni esplosivi Robbanóanyagok hatástalanítását teszi lehetővé @@ -318,13 +336,14 @@ 폭발물을 해체할 수 있게 해줍니다 可以用来拆除炸弹 可以用來拆除炸彈 + Patlayıcıların etkisiz hale gelmesini sağlar. Add to Speed Dial Zur Schnellauswahl hinzufügen Añadir a marcado rápido Dodaj do szybkiego wybierania - Ajouter à la composition rapide + Ajouter à la numérotation rapide Přidat jako rychlou volbu Aggiungi alla selezione rapida Hozzáadás a gyorstárcsázóhoz @@ -350,6 +369,7 @@ 삭제 清除 清除 + Temiz Dial @@ -382,6 +402,7 @@ + Yukarı Down @@ -398,6 +419,7 @@ 아래 + Aşağı Cancel @@ -414,6 +436,7 @@ 취소 取消 取消 + Iptal Detonate Menu @@ -430,6 +453,7 @@ 폭파 메뉴 引爆选单 引爆選單 + Patlatma Menüsü Place Menu @@ -446,13 +470,14 @@ 설치 메뉴 放置选单 放置選單 + Yerleştirme Menüsü Defuse Entschärfen Desactivar Rozbrój - Désamorçer + Désamorcer Zneškodnit Disinnesca Hatástalanítás @@ -462,13 +487,14 @@ 해체 拆除 拆除 + Imha Defusing Explosive... Entschärfe Sprengstoff... Desactivando explosivo... Rozbrajanie ładunku... - Désamorçage des explosifs... + Désamorçage de l'explosif... Zneškodňuji Výbušninu... Esposivo in fase di disattivazione... Robbanóanyag hatástalanítása... @@ -478,6 +504,7 @@ 폭발물 해체중... 炸弹拆除中... 炸彈拆除中... + Patlayıcı Imha Ediliyor... Timer @@ -494,6 +521,7 @@ 타이머 计时器 計時器 + Zamanlayıcı Time: %1m %2s @@ -510,6 +538,7 @@ 시간: %1분 %2초 时间: %1分%2秒 時間: %1分%2秒 + Süre: %1m %2s Set Time @@ -526,13 +555,14 @@ 시간 설정 设定时间 設定時間 + Süreyi Ayarla Select a Trigger Wähle einen Zünder Seleccionar un detonador Wybierz zapalnik - Sélectionner une mise à feu + Sélectionner un déclencheur Zvolit detonátor Seleziona un attivatore Gyújtóeszköz kiválasztása @@ -542,6 +572,7 @@ 작동방식 선택 选择一个触发器 選擇一個觸發器 + Tetikleyici seç Select @@ -558,6 +589,7 @@ 선택 选择 選擇 + Seç Pressure Plate @@ -574,13 +606,14 @@ 압력식 压力盘 壓力盤 + Basınç Plakası Tripwire Linka naciągu Cable trampa Stolperdraht - Fil de détente + Fil piège Nástražný drát Filo a inciampo Botlódrót @@ -590,6 +623,7 @@ 인계철선 绊线 絆線 + Telli tuzak IR Sensor @@ -606,13 +640,14 @@ 적외선 센서 红外线感应器 紅外線感應器 + IR Sensörü No triggers available for %1 Brak dostępnych zapalników dla %1 No hay detonadores disponibles para %1 Keine Auslöser für %1 vorhanden - Pas de détonateur disponible pour %1 + Pas de déclencheur disponible pour %1. Žádný detonátor k dispozici pro %1 Nessun attivatore disponibile per %1 Nincs elérhető gyújtóeszköz ide: %1 @@ -690,7 +725,7 @@ Used to remotely trigger explosives when released. Zündet Sprengladungen wenn losgelassen. - Utilisé pour déclencher des explosifs à distance quand relaché. + Utilisé pour déclencher des explosifs à distance quand relâché. Používaný k vzdálenému odpálení, při uvolnění odpálí výbušniny Używany w celu zdalnej detonacji ładunków, kiedy jego operator zostanie zabity. Utilizado para detonar explosivos remotamente al soltarlo. @@ -718,6 +753,7 @@ 줍기 捡起 撿起 + Al Explosive System @@ -734,6 +770,7 @@ 폭발물 시스템 炸药系统 炸藥系統 + Patlayıcı Sistemi Require specialists? @@ -742,11 +779,11 @@ Benötigt Sprengstoffexperten? Vyžadovat specialistu? Requer especialista? - Requiert un spécialiste ? + Spécialiste requis Specialisták igénylése? Требуется специалист? Richiedi specialisti? - 特技兵を必要としますか? + 特技兵を必須 전문가가 필요합니까? 需要专家? 需要專家? @@ -758,11 +795,11 @@ Benötige Sprengstoffexperte um Sprengladungen zu entschärfen? Standard: Nein Vyžadovat specialistu na zneškodnění výbušniny? Výchozí: Ne Requer especialista em explosivos para desativar explosivos? Padrão: Não - Le désarmoçage d'explosif requiert un spécialiste ? Défaut : non + Seul un spécialiste peut désamorcer des explosifs. Szükséges-e egy specialista a robbanóanyagok hatástalanításához? Alapértelmezett: Nem Требуется ли специалист по минному делу для обезвреживания взрывчатки? По-умолчанию: Нет Richiedi specialisti esplosivi per disabilitare esplosivi? Default: No - 爆発物を無効化するには、爆発物の特技兵を必要としますか? 標準: 無効化 + 爆発物を無効化するには特技兵である必要かどうかを設定できます。標準: 無効化 폭발물을 해제하기 위해서는 전문가가 필요합니까? 기본설정: 아니요 需要炸弹专家才能拆除炸弹? 预设: 否 需要炸彈專家才能拆除炸彈? 預設: 否 @@ -774,11 +811,11 @@ Bestrafe Nicht-Sprengstoffexperten? Potrestat, pokud není specialista? Punir não especialistas? - Punir les non-spécialistes ? + Pénaliser les non-spécialistes Nem-specialisták büntetése? Штраф не-специалистам? Punisci non-specialisti? - 非特技兵へ足かせを与えますか? + 非特技兵へ足かせ 비-전문가에 불이익을 줍니까? 折磨非专业人员? 折磨非專業人員? @@ -790,11 +827,11 @@ Entschärfungszeit für Nicht-Sprengstoffexperten erhöhen? Standard: Ja Zvýšit čas potřebný k dokončení akce pokud není specialista? Výchozí: Ano Aumentar o tempo necessário para completar ações por não especialistas? Padrão: Sim - Augmenter le temps nécessaire au désarmoçage pour les non-spécialistes ? Défaut : oui + Augmente le temps nécessaire au désamorçage pour les unités non spécialisées. Nem-specialisták esetén több ideig tartson a cselekvés befejezése? Alapértelmezett: Igen Увеличивать время завершения действий для не-специалистов? По-умолчанию: Нет Aumenta il tempo richiesto per completare azioni per non-specialisti? Default: Si - 非特技兵へ動作完了までの時間を増加させますか? 標準: 有効化 + 非特技兵は動作完了までの時間を増加させますか? 標準: 有効化 비-전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예 增加非专业人员相关操作的时间? 预设: 是 增加非專業人員相關操作的時間? 預設: 是 @@ -806,11 +843,11 @@ Eksplozja przy rozbrajaniu? Explodovat při zneškodňování? Explotar al desactivar? - Explosion au désamorçage ? + Explosion au désamorçage Robbanás hatástalanításkor? Взрыв при разминир.? Fai esplodere quando disarmato? - 解除中に爆発させますか? + 解除中に爆発 해제시 폭발합니까? 拆除时引爆? 拆除時引爆? @@ -822,11 +859,11 @@ Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak Umožnit u některých výbušnin explozi při pokusu je zneškodnit? Výchozí: Ano ¿Habilitar ciertos explosivos para estallar al desactivar? Por defecto: Sí - Permet à certains explosifs d'exploser au désamorçage ? Défaut : oui + Certains explosifs exploseront durant le désamorçage. Valeur par défaut : activé. Meghatározott robbanóanyagok felrobbanjanak-e hatástalanításkor? Alapértelmezett: Igen Разрешить определенным взрывным устройствам взрываться при разминировании? По-умолчанию: Да Abilita alcuni esplosivi per esplosione al disarmo? Default: Si - 特定の爆発物を解除中に爆発させますか? 標準: 有効化 + 特定の爆発物を解除中に爆発させるかどうかを設定できます。? 標準: 有効化 특정 폭발물이 해제시 폭발하게 합니까? 기본설정: 예 启用后, 某些炸弹会在拆除时引爆? 预设: 是 啟用後, 某些炸彈會在拆除時引爆? 預設: 是 @@ -850,7 +887,7 @@ M6 SLAM Mine (Bottom Attack) - + /!\ Module obsolète /!\ - Mine M6 SLAM (par le bas) M6-SLAM-Mine (Bodenangriff) @@ -859,7 +896,6 @@ Mina M6 SLAM (atak od dołu) Mina M6 SLAM (Ataque Inferior) - Mine M6 SLAM (par le bas) Mina M6 SLAM (base) M6 SLAM (Útok zespoda) Mina M6 SLAM (Ataque Inferior) @@ -872,7 +908,7 @@ M6 SLAM Mine (Side Attack) - + /!\ Module obsolète /!\ - Mine M6 SLAM (de flanc) M6-SLAM-Mine (Seitenangriff) @@ -881,8 +917,7 @@ Mina M6 SLAM (atak od boku) Mina M6 SLAM (Ataque Lateral) - Mine M6 SLAM (de flanc) - STR_ACE_Explosives_Module_SLAMBottomAttack_DisplayName M6 SLAM Mine (Bottom Attack) Mine M6 SLAM (par le bas) M6-SLAM-Mine (Bodenangriff) Mina M6 SLAM (base) Mina M6 SLAM (atak od dołu) Mina M6 SLAM (Laterale) + Mina M6 SLAM (Laterale) M6 SLAM (Útok do strany) Mina M6 SLAM (Ataque Lateral) Мина M6 SLAM (направлена вбок) @@ -894,7 +929,7 @@ Large IED (Urban, Pressure Plate) - + /!\ Module obsolète /!\ - Grand EEI (urbain, plaque de pression) Große USBV (Stadt, Druckplatte) @@ -903,7 +938,6 @@ Duży IED (miejski, płyta naciskowa) IED Grande (Urbano, Placa de presión) - Grand EEI (Urbain, plaque de pression) IED grande (urbano, a pressione) IED, Velké (Městské, Nášlapné) IED Grande (Urbano, Placa de pressão) @@ -916,7 +950,7 @@ Large IED (Dug-in, Pressure Plate) - + /!\ Module obsolète /!\ - Grand EEI (enterré, plaque de pression) Große USBV (Eingegraben, Druckplatte) @@ -925,7 +959,6 @@ Duży IED (zakopany, płyta naciskowa) IED Grande (Enterrado, Placa de presión) - Grand EEI (Enterré, plaque de pression) IED grande (interrato, a pressione) IED, Velké (Zakopané, Nášlapné) IED Grande (Enterrado, Placa de pressão) @@ -938,7 +971,7 @@ Small IED (Urban, Pressure Plate) - + /!\ Module obsolète /!\ - Petit EEI (Urbain, plaque de pression) Kleine USBV (Stadt, Druckplatte) @@ -947,7 +980,6 @@ Mały IED (miejski, płyta naciskowa) IED Pequeño (Urbano, Placa de presión) - Petit EEI (Urbain, plaque de pression) IED piccolo (urbano, a pressione) IED, Malé (Městské, Nášlapné) IED Pequeno(Urbano, Placa de pressão) @@ -960,7 +992,7 @@ Small IED (Dug-in, Pressure Plate) - + /!\ Module obsolète /!\ - Petit EEI (Enterré, plaque de pression) Kleine USBV (Eingegraben, Druckplatte) @@ -969,7 +1001,6 @@ Mały IED (zakopany, płyta naciskowa) IED Pequeño (Enterrado, Placa de presión) - Petit EEI (Enterré, plaque de pression) IED piccolo (interrato, a pressione) IED, Malé (Zakopané, Nášlapné) IED Pequeno (Enterrado, Placa de pressão) @@ -1002,37 +1033,73 @@ Flara na linkę Stolperdraht-Leuchtrakete 조명지뢰 - Fusée éclairante avec fil de détente + Fusée éclairante avec fil piège Cavo d'innesco 绊线闪光地雷 絆線閃光地雷 + Tripwire (Sinalizador) + Světlice na nástražném drátu Type: Tripwire flare - Ignites a non-lethal flare when triggered.<br />Rounds: 1<br />Used on: Ground - Тип: Сигнальная растяжка - При срабатывании выпускает несмертельную сгнальную вспышку.<br />Зарядов: 1<br />Используется на: Земле + Тип: Сигнальная растяжка - При срабатывании выпускает несмертельную сигнальную вспышку.<br />Зарядов: 1<br />Используется на: Земле 種類: 仕掛け型照明地雷 - 発動したとき、非致死性の照明を発炎します。<br />装填数: 1<br />次で使用: 地表 Typ: Flara na linkę - Wystrzeliwuje nieszkodliwą flarę przy nadepnięciu linki.<br/>Pociski: 1<br/>Używane na: ziemia Typ: Stolperdraht-Leuchtrakete - Schießt bei Auslösung eine nicht-tödliche Leuchtrakete ab.<br />Ladungen: 1<br />Benutzt auf: Boden 종류: 조명지뢰 - 작동시 무해한 조명을 사출합니다.<br />장탄수: 1<br />사용처: 지면 - Type : Fusée éclairante avec fil de détente - Allume une fusée éclairante lorsque déclenché. <br />Coups : 1<br />Utilisé sur : le sol + Type : Fusée éclairante avec fil piège - Allume une fusée éclairante lorsque déclenchée.<br />Coups : 1<br />Utilisé sur : le sol Tipo: Cavo d'innesco - Sfocio un abbaglio non letale quanto attivato. <br />Rimanenti: 1<br />Usato: A terra 类型: 绊线闪光地雷 - 触发后产生非致命性的强光.<br />发数: 1<br />使用于: 地面 類型: 絆線閃光地雷 - 觸發後產生非致命性的強光.<br />發數: 1<br />使用於: 地面 + Tipo: Flare de Tripwire - Acende um sinalizador não letal quando acionado.<br/>Usos: 1<br/>Usado em: Chão + Typ: Světlice na nástražném drátu - Zapálí světlici při aktivaci.<br/>Pouze 1 použití<br/>Použít na zem Explosive range + Explosionsradius Portée du détonateur 爆発範囲 爆炸范围 爆炸範圍 Raggio di detonazione Zasięg wybuchu + Дальность подрыва + Alcance do explosivo + Dosah exploze Explosive Timer + Detonationszeit Timer di detonazione 爆発タイマー Czasomierz Wybuchu + Таймер взрывчатки + Timer de explosão + Minuteur de détonation + 引爆倒數 + Časovač exploze + + + Is EOD + Kampfmittelbeseitigung + EOD に + Spécialiste en explosifs + 是EOD + è EOD + Je specilista na výbušniny (EOD) + Jest EOD + Сапёр + + + Controls whether the unit is an explosive specialist. + Steuert, ob die Einheit ein Sprengstoffspezialist ist. + ユニットが何であれ爆発物専門家にします。 + Définit si l'unité est un spécialiste en explosifs. + 控制該單位是否是爆裂物處置專家 + Controlla se l'unità è uno specialista di esplosivi. + Určuje jestli je jednotka specialista na výbušniny. + Kontroluje, czy jednostka jest specjalistą od materiałów wybuchowych. + Определяет, является ли юнит сапёром. diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp index efd32d1ac61..68437f678dd 100644 --- a/addons/fastroping/CfgVehicles.hpp +++ b/addons/fastroping/CfgVehicles.hpp @@ -40,33 +40,53 @@ class CfgVehicles { class ACE_SelfActions { class ACE_prepareFRIES { displayName = CSTRING(Interaction_prepareFRIES); - condition = QUOTE([vehicle _player] call FUNC(canPrepareFRIES)); - statement = QUOTE([vehicle _player] call FUNC(prepareFRIES)); - showDisabled = 0; + condition = QUOTE([_target] call FUNC(canPrepareFRIES)); + statement = QUOTE([_target] call FUNC(prepareFRIES)); }; class ACE_stowFRIES { displayName = CSTRING(Interaction_stowFRIES); - condition = QUOTE([vehicle _player] call FUNC(canStowFRIES)); - statement = QUOTE([vehicle _player] call FUNC(stowFRIES)); - showDisabled = 0; + condition = QUOTE([_target] call FUNC(canStowFRIES)); + statement = QUOTE([_target] call FUNC(stowFRIES)); }; - class ACE_deployRopes { - displayName = CSTRING(Interaction_deployRopes); - condition = QUOTE([ARR_2(_player, vehicle _player)] call FUNC(canDeployRopes)); - statement = QUOTE([ARR_2(QUOTE(QGVAR(deployRopes)), [vehicle _player])] call CBA_fnc_serverEvent); - showDisabled = 0; + class ACE_deployRopes12 { + displayName = CSTRING(Interaction_deployRopes12); + condition = QUOTE([ARR_3(_target,_player,'ACE_rope12')] call FUNC(canDeployRopes)); + statement = QUOTE([ARR_2(QQGVAR(deployRopes),[ARR_3(_target,_player,'ACE_rope12'))]] call CBA_fnc_serverEvent); + }; + class ACE_deployRopes15 { + displayName = CSTRING(Interaction_deployRopes15); + condition = QUOTE([ARR_3(_target,_player,'ACE_rope15')] call FUNC(canDeployRopes)); + statement = QUOTE([ARR_2(QQGVAR(deployRopes),[ARR_3(_target,_player,'ACE_rope15'))]] call CBA_fnc_serverEvent); + }; + class ACE_deployRopes18 { + displayName = CSTRING(Interaction_deployRopes18); + condition = QUOTE([ARR_3(_target,_player,'ACE_rope18')] call FUNC(canDeployRopes)); + statement = QUOTE([ARR_2(QQGVAR(deployRopes),[ARR_3(_target,_player,'ACE_rope18'))]] call CBA_fnc_serverEvent); + }; + class ACE_deployRopes27 { + displayName = CSTRING(Interaction_deployRopes27); + condition = QUOTE([ARR_3(_target,_player,'ACE_rope27')] call FUNC(canDeployRopes)); + statement = QUOTE([ARR_2(QQGVAR(deployRopes),[ARR_3(_target,_player,'ACE_rope27'))]] call CBA_fnc_serverEvent); + }; + class ACE_deployRopes36 { + displayName = CSTRING(Interaction_deployRopes36); + condition = QUOTE([ARR_4(_target,_player,'ACE_rope36',true)] call FUNC(canDeployRopes)); + statement = QUOTE([ARR_2(QQGVAR(deployRopes),[ARR_3(_target,_player,'ACE_rope36'))]] call CBA_fnc_serverEvent); }; class ACE_cutRopes { displayName = CSTRING(Interaction_cutRopes); - condition = [vehicle _player] call FUNC(canCutRopes); - statement = [vehicle _player] call FUNC(cutRopes); - showDisabled = 0; + condition = QUOTE(true); + statement = ""; + class confirmCutRopes { + displayName = ECSTRING(common,confirm); + condition = QUOTE([_target] call FUNC(canCutRopes)); + statement = QUOTE([_target] call FUNC(cutRopes)); + }; }; class ACE_fastRope { displayName = CSTRING(Interaction_fastRope); - condition = [_player, vehicle _player] call FUNC(canFastRope); - statement = [_player, vehicle _player] call FUNC(fastRope); - showDisabled = 0; + condition = [_player, _target] call FUNC(canFastRope); + statement = [_player, _target] call FUNC(fastRope); }; }; }; @@ -187,7 +207,7 @@ class CfgVehicles { GVAR(enabled) = 2; GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(friesType) = "ACE_friesAnchorBar"; - GVAR(friesAttachmentPoint)[] = {0.065, 2.2, -0.15}; + GVAR(friesAttachmentPoint)[] = {0.035, 2.2, -0.15}; GVAR(onPrepare) = QFUNC(onPrepareCommon); GVAR(onCut) = QFUNC(onCutCommon); EQUIP_FRIES_ATTRIBUTE; @@ -252,4 +272,21 @@ class CfgVehicles { }; }; }; + class NATO_Box_Base; + class ACE_fastropingSupplyCrate: NATO_Box_Base { + scope = 2; + scopeCurator = 2; + accuracy = 1000; + displayName = CSTRING(Ropesupply); + model = "\A3\Weapons_F\AmmoBoxes\Box_NATO_AmmoVeh_F.p3d"; + editorPreview = "\A3\EditorPreviews_F\Data\CfgVehicles\Box_NATO_AmmoVeh_F.jpg"; + author = "Pokertour"; + class TransportItems { + MACRO_ADDITEM(ACE_rope12,15); + MACRO_ADDITEM(ACE_rope15,15); + MACRO_ADDITEM(ACE_rope18,15); + MACRO_ADDITEM(ACE_rope27,15); + MACRO_ADDITEM(ACE_rope36,15); + }; + }; }; diff --git a/addons/fastroping/CfgWeapons.hpp b/addons/fastroping/CfgWeapons.hpp new file mode 100644 index 00000000000..116497c6fa8 --- /dev/null +++ b/addons/fastroping/CfgWeapons.hpp @@ -0,0 +1,60 @@ +class CfgWeapons { + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + + class ACE_rope12: ACE_ItemCore { + scope = 2; + GVAR(ropeLength) = 12.2; + picture = QPATHTOF(data\m_rope_ca); + model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + displayName = CSTRING(Rope_12_Display); + descriptionShort = CSTRING(descriptionShort); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 36; + }; + }; + class ACE_rope15: ACE_ItemCore { + scope = 2; + GVAR(ropeLength) = 15.2; + picture = QPATHTOF(data\m_rope_ca); + model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + displayName = CSTRING(Rope_15_Display); + descriptionShort = CSTRING(descriptionShort); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 45; + }; + }; + class ACE_rope18: ACE_ItemCore { + scope = 2; + GVAR(ropeLength) = 18.3; + picture = QPATHTOF(data\m_rope_ca); + model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + displayName = CSTRING(Rope_18_Display); + descriptionShort = CSTRING(descriptionShort); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 54; + }; + }; + class ACE_rope27: ACE_ItemCore { + scope = 2; + GVAR(ropeLength) = 27.4; + picture = QPATHTOF(data\m_rope_ca); + model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + displayName = CSTRING(Rope_27_Display); + descriptionShort = CSTRING(descriptionShort); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 81; + }; + }; + class ACE_rope36: ACE_ItemCore { + scope = 2; + GVAR(ropeLength) = 36.6; + picture = QPATHTOF(data\m_rope_ca); + model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + displayName = CSTRING(Rope_36_Display); + descriptionShort = CSTRING(descriptionShort); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 108; + }; + }; +}; diff --git a/addons/fastroping/XEH_PREP.hpp b/addons/fastroping/XEH_PREP.hpp index 1ad995c598f..1a80bfa7969 100644 --- a/addons/fastroping/XEH_PREP.hpp +++ b/addons/fastroping/XEH_PREP.hpp @@ -4,7 +4,6 @@ PREP(canDeployRopes); PREP(canFastRope); PREP(canPrepareFRIES); PREP(canStowFRIES); -PREP(checkVehicleThread); PREP(cutRopes); PREP(deployAI); PREP(deployRopes); @@ -18,3 +17,4 @@ PREP(onPrepareCommon); PREP(onRopeBreak); PREP(prepareFRIES); PREP(stowFRIES); +PREP(unequipFRIES); diff --git a/addons/fastroping/XEH_preInit.sqf b/addons/fastroping/XEH_preInit.sqf index b47cf6628db..6d6065b3237 100644 --- a/addons/fastroping/XEH_preInit.sqf +++ b/addons/fastroping/XEH_preInit.sqf @@ -6,4 +6,12 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + +if (isServer) then { + ["Helicopter", "Deleted", LINKFUNC(unequipFRIES)] call CBA_fnc_addClassEventHandler; +}; + +["Helicopter", "Killed", LINKFUNC(unequipFRIES)] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/fastroping/anim/model.cfg b/addons/fastroping/anim/model.cfg index be41a523a8e..942b917d47f 100644 --- a/addons/fastroping/anim/model.cfg +++ b/addons/fastroping/anim/model.cfg @@ -1,124 +1,118 @@ -class cfgSkeletons -{ - class OFP2_ManSkeleton - { +class cfgSkeletons { + class OFP2_ManSkeleton { isDiscrete = 0; skeletonInherit = ""; - SkeletonBones[]= - { + skeletonBones[] = { "Pelvis","", - "Spine","Pelvis", - "Spine1","Spine", - "Spine2","Spine1", - "Spine3","Spine2", + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", "camera","Pelvis",// case has changed for arma3 - "weapon","Spine1", - "launcher","Spine1", - //Head skeleton in hierarchy - "Neck","Spine3", - "Neck1","Neck", - "Head","Neck1", - - //Left upper side - "LeftShoulder","Spine3", - "LeftArm","LeftShoulder", - "LeftArmRoll","LeftArm", - "LeftForeArm","LeftArmRoll", - "LeftForeArmRoll","LeftForeArm", - "LeftHand","LeftForeArmRoll", - "LeftHandRing","LeftHand", - "LeftHandRing1","LeftHandRing", - "LeftHandRing2","LeftHandRing1", - "LeftHandRing3","LeftHandRing2", - "LeftHandPinky1","LeftHandRing", - "LeftHandPinky2","LeftHandPinky1", - "LeftHandPinky3","LeftHandPinky2", - "LeftHandMiddle1","LeftHand", - "LeftHandMiddle2","LeftHandMiddle1", - "LeftHandMiddle3","LeftHandMiddle2", - "LeftHandIndex1","LeftHand", - "LeftHandIndex2","LeftHandIndex1", - "LeftHandIndex3","LeftHandIndex2", - "LeftHandThumb1","LeftHand", - "LeftHandThumb2","LeftHandThumb1", - "LeftHandThumb3","LeftHandThumb2", - //Right upper side - "RightShoulder","Spine3", - "RightArm","RightShoulder", - "RightArmRoll","RightArm", - "RightForeArm","RightArmRoll", - "RightForeArmRoll","RightForeArm", - "RightHand","RightForeArmRoll", - "RightHandRing","RightHand", - "RightHandRing1","RightHandRing", - "RightHandRing2","RightHandRing1", - "RightHandRing3","RightHandRing2", - "RightHandPinky1","RightHandRing", - "RightHandPinky2","RightHandPinky1", - "RightHandPinky3","RightHandPinky2", - "RightHandMiddle1","RightHand", - "RightHandMiddle2","RightHandMiddle1", - "RightHandMiddle3","RightHandMiddle2", - "RightHandIndex1","RightHand", - "RightHandIndex2","RightHandIndex1", - "RightHandIndex3","RightHandIndex2", - "RightHandThumb1","RightHand", - "RightHandThumb2","RightHandThumb1", - "RightHandThumb3","RightHandThumb2", - //Left lower side - "LeftUpLeg","Pelvis", - "LeftUpLegRoll","LeftUpLeg", - "LeftLeg","LeftUpLegRoll", - "LeftLegRoll","LeftLeg", - "LeftFoot","LeftLegRoll", - "LeftToeBase","LeftFoot", - //Right lower side - "RightUpLeg","Pelvis", - "RightUpLegRoll","RightUpLeg", - "RightLeg","RightUpLegRoll", - "RightLegRoll","RightLeg", - "RightFoot","RightLegRoll", - "RightToeBase","RightFoot", - + "weapon","Spine1", + "launcher","Spine1", + "Neck","Spine3", + "Neck1","Neck", + "Head","Neck1", //Head skeleton in hierarchy + //Left upper side + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", + //Right upper side + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot", //New facial features arma3 only - "Face_Hub","Head", - "Face_Jawbone","Face_Hub", - "Face_Jowl","Face_Jawbone", - "Face_chopRight","Face_Jawbone", - "Face_chopLeft","Face_Jawbone", - "Face_LipLowerMiddle","Face_Jawbone", - "Face_LipLowerLeft","Face_Jawbone", - "Face_LipLowerRight","Face_Jawbone", - "Face_Chin","Face_Jawbone", - "Face_Tongue","Face_Jawbone", - "Face_CornerRight","Face_Hub", - "Face_CheekSideRight","Face_CornerRight", - "Face_CornerLeft","Face_Hub", - "Face_CheekSideLeft","Face_CornerLeft", - "Face_CheekFrontRight","Face_Hub", - "Face_CheekFrontLeft","Face_Hub", - "Face_CheekUpperRight","Face_Hub", - "Face_CheekUpperLeft","Face_Hub", - "Face_LipUpperMiddle","Face_Hub", - "Face_LipUpperRight","Face_Hub", - "Face_LipUpperLeft","Face_Hub", - "Face_NostrilRight","Face_Hub", - "Face_NostrilLeft","Face_Hub", - "Face_Forehead","Face_Hub", - "Face_BrowFrontRight","Face_Forehead", - "Face_BrowFrontLeft","Face_Forehead", - "Face_BrowMiddle","Face_Forehead", - "Face_BrowSideRight","Face_Forehead", - "Face_BrowSideLeft","Face_Forehead", - "Face_Eyelids","Face_Hub", - "Face_EyelidUpperRight","Face_Hub", - "Face_EyelidUpperLeft","Face_Hub", - "Face_EyelidLowerRight","Face_Hub", - "Face_EyelidLowerLeft","Face_Hub", - "EyeLeft","Face_Hub", - "EyeRight","Face_Hub" + "Face_Hub","Head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub" };// end of skeleton array // location of pivot points (local axes) for hierarchical animation - pivotsModel="Samples_F\TemplateRTM\ManSkeleton_Pivots.p3d"; + pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d"; }; }; diff --git a/addons/fastroping/config.cpp b/addons/fastroping/config.cpp index f2bf1d4a5e2..98dfd267422 100644 --- a/addons/fastroping/config.cpp +++ b/addons/fastroping/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); - authors[] = {"KoffeinFlummi", "BaerMitUmlaut"}; + authors[] = {"KoffeinFlummi", "BaerMitUmlaut", "Pokertour"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -19,3 +19,4 @@ class CfgPatches { #include "CfgSounds.hpp" #include "CfgVehicles.hpp" #include "CfgWaypoints.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/fastroping/data/m_rope_ca.paa b/addons/fastroping/data/m_rope_ca.paa new file mode 100644 index 00000000000..b6744b8a77b Binary files /dev/null and b/addons/fastroping/data/m_rope_ca.paa differ diff --git a/addons/fastroping/functions/fnc_canDeployRopes.sqf b/addons/fastroping/functions/fnc_canDeployRopes.sqf index 5bc770c01d4..26b514368bc 100644 --- a/addons/fastroping/functions/fnc_canDeployRopes.sqf +++ b/addons/fastroping/functions/fnc_canDeployRopes.sqf @@ -4,27 +4,30 @@ * Checks if the unit can deploy ropes from the helicopter. * * Arguments: - * 0: Unit occupying the helicopter - * 1: The helicopter itself + * 0: The helicopter itself + * 1: Unit occupying the helicopter + * 2: Rope classname + * 3: Default (show when setting disabled) (default: false) * * Return Value: * Able to deploy ropes * * Example: - * [_player, _vehicle] call ace_fastroping_fnc_canDeployRopes + * [vehicle player, player, "ACE_rope36"] call ace_fastroping_fnc_canDeployRopes * * Public: No */ -params ["_unit", "_vehicle"]; +params ["_vehicle", "_player", "_ropeClass", ["_defaultOption", false]]; private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; -private _enabled = getNumber (_config >> QGVAR(enabled)); -private _deploymentStage = _vehicle getVariable [QGVAR(deploymentStage), 0]; -(driver _vehicle != _unit) && -{getPos _vehicle select 2 > 2} && -{_enabled == 1 || {_enabled == 2 && {!(isNull (_vehicle getVariable [QGVAR(FRIES), objNull]))}}} && -{ - (_deploymentStage == 0 && {getText (_config >> QGVAR(onPrepare)) == ""}) || - {_deploymentStage == 2 && {getText (_config >> QGVAR(onPrepare)) != ""}} +(driver _vehicle != _player) && +{getPos _vehicle select 2 > 2} && { + private _enabled = getNumber (_config >> QGVAR(enabled)); + _enabled == 1 || {_enabled == 2 && {!(isNull (_vehicle getVariable [QGVAR(FRIES), objNull]))}} +} && { + private _deploymentStage = _vehicle getVariable [QGVAR(deploymentStage), 0]; + if (getText (_config >> QGVAR(onPrepare)) == "") then { _deploymentStage == 0 } else { _deploymentStage == 2 }; +} && { + (_defaultOption && {!GVAR(requireRopeItems)}) || {(_ropeClass in (_player call EFUNC(common,uniqueItems))) || {_ropeClass in (itemCargo _vehicle)}} } diff --git a/addons/fastroping/functions/fnc_checkVehicleThread.sqf b/addons/fastroping/functions/fnc_checkVehicleThread.sqf deleted file mode 100644 index 7889cdb2683..00000000000 --- a/addons/fastroping/functions/fnc_checkVehicleThread.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: BaerMitUmlaut - * Checks if the given helicopter still exits, and if not, destroys the FRIES. - * - * Arguments: - * 0: The helicopter - * 1: The helicopter's FRIES - * - * Return Value: - * None - * - * Example: - * [_vehicle, _fries] call ace_fastroping_fnc_checkVehicleThread - * - * Public: No - */ -params ["_vehicle", "_fries"]; - -if (isNull _vehicle) then { - deleteVehicle _fries; -} else { - [FUNC(checkVehicleThread), _this, 5] call CBA_fnc_waitAndExecute; -}; diff --git a/addons/fastroping/functions/fnc_deployAI.sqf b/addons/fastroping/functions/fnc_deployAI.sqf index f6f39151815..8101a99dae2 100644 --- a/addons/fastroping/functions/fnc_deployAI.sqf +++ b/addons/fastroping/functions/fnc_deployAI.sqf @@ -59,10 +59,13 @@ if (_createDeploymentGroup) then { }; private _deployTime = 0; + if (getText (_config >> QGVAR(onPrepare)) != "") then { _deployTime = [_vehicle] call (missionNamespace getVariable (getText (_config >> QGVAR(onPrepare)))); }; -[{[_this] call FUNC(deployRopes)}, _vehicle, _deployTime] call CBA_fnc_waitAndExecute; + +[FUNC(deployRopes), _vehicle, _deployTime] call CBA_fnc_waitAndExecute; + driver _vehicle disableAI "MOVE"; DFUNC(deployAIRecursive) = { diff --git a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf index 20e3f704f63..73dbee6ea40 100644 --- a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf +++ b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf @@ -11,7 +11,7 @@ * true * * Example: - * [_group, [6560, 12390, 0]] call ace_fastroping_fnc_deployAIWayoint + * [_group, [6560, 12390, 0]] call ace_fastroping_fnc_deployAIWaypoint * * Public: No */ diff --git a/addons/fastroping/functions/fnc_deployRopes.sqf b/addons/fastroping/functions/fnc_deployRopes.sqf index bd286fb08dc..27ad76a0f9c 100644 --- a/addons/fastroping/functions/fnc_deployRopes.sqf +++ b/addons/fastroping/functions/fnc_deployRopes.sqf @@ -5,22 +5,43 @@ * * Arguments: * 0: The helicopter itself + * 1: The unit that called the action (may be remote) + * 2: Rope classname * * Return Value: * None * * Example: - * [_vehicle] call ace_fastroping_fnc_deployRopes + * [vehicle player, player, "ACE_rope36"] call ace_fastroping_fnc_deployRopes * * Public: No */ -params ["_vehicle"]; + +params ["_vehicle", ["_player", objNull], ["_ropeClass", ""]]; +TRACE_3("deployRopes",_vehicle,_player,_ropeClass); private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; private _ropeOrigins = getArray (_config >> QGVAR(ropeOrigins)); private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; private _hookAttachment = _vehicle getVariable [QGVAR(FRIES), _vehicle]; + +private _ropeLength = getNumber (configfile >> "CfgWeapons" >> _ropeClass >> QGVAR(ropeLength)); + +if (_ropeLength <= 0) then { + _ropeLength = DEFAULT_ROPE_LENGTH; +}; + +TRACE_3("",_ropeClass,_ropeLength,GVAR(requireRopeItems)); + +if (GVAR(requireRopeItems) && {_ropeClass != ""}) then { + if (_ropeClass in (_player call EFUNC(common,uniqueItems))) then { + _player removeItem _ropeClass; + } else { + _vehicle removeItem _ropeClass; + }; +}; + { private _ropeOrigin = _x; private _hook = QGVAR(helper) createVehicle [0, 0, 0]; @@ -39,7 +60,7 @@ private _hookAttachment = _vehicle getVariable [QGVAR(FRIES), _vehicle]; private _ropeTop = ropeCreate [_dummy, [0, 0, 0], _hook, [0, 0, 0], 0.5]; private _ropeBottom = ropeCreate [_dummy, [0, 0, 0], 1]; - ropeUnwind [_ropeBottom, 30, 34.5, false]; + ropeUnwind [_ropeBottom, 30, _ropelength, false]; _ropeTop addEventHandler ["RopeBreak", {[_this, "top"] call FUNC(onRopeBreak)}]; _ropeBottom addEventHandler ["RopeBreak", {[_this, "bottom"] call FUNC(onRopeBreak)}]; @@ -52,3 +73,4 @@ private _hookAttachment = _vehicle getVariable [QGVAR(FRIES), _vehicle]; _vehicle setVariable [QGVAR(deployedRopes), _deployedRopes, true]; _vehicle setVariable [QGVAR(deploymentStage), 3, true]; +_vehicle setVariable [QGVAR(ropeLength), _ropeLength, true]; diff --git a/addons/fastroping/functions/fnc_equipFRIES.sqf b/addons/fastroping/functions/fnc_equipFRIES.sqf index a6dc469749a..002a32364ca 100644 --- a/addons/fastroping/functions/fnc_equipFRIES.sqf +++ b/addons/fastroping/functions/fnc_equipFRIES.sqf @@ -12,27 +12,18 @@ * Example: * [_vehicle] call ace_fastroping_fnc_equipFRIES * - * Public: No + * Public: Yes */ + params ["_vehicle"]; private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; if !(isNumber (_config >> QGVAR(enabled))) then { - ["%1 has not been configured for ACE_Fastroping.", getText (_config >> "DisplayName")] call BIS_fnc_error; + ["%1 has not been configured for ACE_Fastroping.", getText (_config >> "displayName")] call BIS_fnc_error; } else { if (getNumber (_config >> QGVAR(enabled)) == 2) then { private _fries = (getText (_config >> QGVAR(friesType))) createVehicle [0, 0, 0]; - _fries attachTo [_vehicle, (getArray (_config >> QGVAR(friesAttachmentPoint)))]; + _fries attachTo [_vehicle, getArray (_config >> QGVAR(friesAttachmentPoint))]; _vehicle setVariable [QGVAR(FRIES), _fries, true]; - _vehicle addEventHandler ["Killed", { - params ["_vehicle"]; - deleteVehicle (_vehicle getVariable [QGVAR(FRIES), objNull]); - _vehicle setVariable [QGVAR(FRIES), nil, true]; - - if !((_vehicle getVariable [QGVAR(deployedRopes), []] isEqualTo [])) then { - [_vehicle] call FUNC(cutRopes); - }; - }]; - [FUNC(checkVehicleThread), [_vehicle, _fries], 5] call CBA_fnc_waitAndExecute; }; }; diff --git a/addons/fastroping/functions/fnc_fastRope.sqf b/addons/fastroping/functions/fnc_fastRope.sqf index 9deb95b1a69..39f7cc38c90 100644 --- a/addons/fastroping/functions/fnc_fastRope.sqf +++ b/addons/fastroping/functions/fnc_fastRope.sqf @@ -16,6 +16,7 @@ * Public: No */ params ["_unit", "_vehicle"]; +TRACE_2("fastRope",_unit,_vehicle); //Select unoccupied rope private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; diff --git a/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf b/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf index ed9cad2255f..9eb3ae4e4e9 100644 --- a/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf +++ b/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf @@ -28,8 +28,11 @@ if (isNull _hook) exitWith { [_pfhHandle] call CBA_fnc_removePerFrameHandler; }; +private _ropeLength = _vehicle getVariable [QGVAR(ropeLength), DEFAULT_ROPE_LENGTH]; + //Start fast roping if (getMass _dummy != 80) exitWith { + TRACE_1("unwinding ropes",_ropeLength); //Fix for twitchyness _dummy setMass 80; _dummy setCenterOfMass [0, 0, -2]; @@ -37,7 +40,7 @@ if (getMass _dummy != 80) exitWith { _dummy setPosASL (_origin vectorAdd [0, 0, -2]); _dummy setVectorUp [0, 0, 1]; - ropeUnwind [_ropeTop, 6, 34.5]; + ropeUnwind [_ropeTop, 6, _ropeLength]; ropeUnwind [_ropeBottom, 6, 0.5]; }; @@ -59,7 +62,7 @@ _dummy setVelocity [0,0,-6]; //Check if fast rope is finished if ( ((getPos _unit select 2) < 0.2) - || {ropeLength _ropeTop == 34.5} + || {ropeLength _ropeTop == _ropeLength} || {vectorMagnitude (velocity _vehicle) > 5} || {!([_unit] call EFUNC(common,isAwake))} ) exitWith { @@ -77,7 +80,7 @@ if ( _dummy setCenterOfMass [0.000143227,0.00105986,-0.246147]; _ropeTop = ropeCreate [_dummy, [0, 0, 0], _hook, [0, 0, 0], 0.5]; - _ropeBottom = ropeCreate [_dummy, [0, 0, 0], 34.5]; + _ropeBottom = ropeCreate [_dummy, [0, 0, 0], _ropeLength]; _ropeTop addEventHandler ["RopeBreak", {[_this, "top"] call FUNC(onRopeBreak)}]; _ropeBottom addEventHandler ["RopeBreak", {[_this, "bottom"] call FUNC(onRopeBreak)}]; diff --git a/addons/fastroping/functions/fnc_onCutCommon.sqf b/addons/fastroping/functions/fnc_onCutCommon.sqf index 1a32739eaa0..c6daaa7c351 100644 --- a/addons/fastroping/functions/fnc_onCutCommon.sqf +++ b/addons/fastroping/functions/fnc_onCutCommon.sqf @@ -10,7 +10,7 @@ * Amount of time to wait before cutting ropes * * Example: - * [_vehicle] call ace_fastroping_fnc_onCutRopesCommon + * [_vehicle] call ace_fastroping_fnc_onCutCommon * * Public: No */ diff --git a/addons/fastroping/functions/fnc_onPrepareCommon.sqf b/addons/fastroping/functions/fnc_onPrepareCommon.sqf index 76665dea717..362d04c120f 100644 --- a/addons/fastroping/functions/fnc_onPrepareCommon.sqf +++ b/addons/fastroping/functions/fnc_onPrepareCommon.sqf @@ -10,7 +10,7 @@ * Amount of time to wait before deploying ropes * * Example: - * [_vehicle] call ace_fastroping_fnc_onDeployRopesCommon + * [_vehicle] call ace_fastroping_fnc_onPrepareCommon * * Public: No */ diff --git a/addons/fastroping/functions/fnc_onRopeBreak.sqf b/addons/fastroping/functions/fnc_onRopeBreak.sqf index 023e53f762b..9c089f5c91c 100644 --- a/addons/fastroping/functions/fnc_onRopeBreak.sqf +++ b/addons/fastroping/functions/fnc_onRopeBreak.sqf @@ -42,7 +42,7 @@ private _unit = { if (_x isKindOf "CAManBase") exitWith {_x}; } forEach (attachedObjects (_brokenRope select 3)); -if !(isNil "_unit") then { +if (!isNil "_unit") then { if (_part == "top") then { detach _unit; } else { diff --git a/addons/fastroping/functions/fnc_unequipFRIES.sqf b/addons/fastroping/functions/fnc_unequipFRIES.sqf new file mode 100644 index 00000000000..7fade927b6e --- /dev/null +++ b/addons/fastroping/functions/fnc_unequipFRIES.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Removes FRIES from helicopter. + * + * Arguments: + * 0: The helicopter + * + * Return Value: + * None + * + * Example: + * [_vehicle] call ace_fastroping_fnc_unequipFRIES + * + * Public: Yes + */ + +params ["_vehicle"]; + +deleteVehicle (_vehicle getVariable [QGVAR(FRIES), objNull]); +_vehicle setVariable [QGVAR(FRIES), nil, true]; + +if !(_vehicle getVariable [QGVAR(deployedRopes), []] isEqualTo []) then { + [_vehicle] call FUNC(cutRopes); +}; diff --git a/addons/fastroping/initSettings.sqf b/addons/fastroping/initSettings.sqf new file mode 100644 index 00000000000..eac47639c68 --- /dev/null +++ b/addons/fastroping/initSettings.sqf @@ -0,0 +1,13 @@ +// CBA Settings [ADDON: ace_fastroping]: + +private _category = ["ACE Uncategorized", LLSTRING(setting_categoryMenu_displayName)]; + +[ + QGVAR(requireRopeItems), "CHECKBOX", + [LSTRING(setting_requireRopeItems_displayName)], + _category, + false, // default value + true, // isGlobal + {[QGVAR(requireRopeItems), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // needRestart +] call CBA_settings_fnc_init; diff --git a/addons/fastroping/script_component.hpp b/addons/fastroping/script_component.hpp index 77c8168f8d3..5bd19a1db2a 100644 --- a/addons/fastroping/script_component.hpp +++ b/addons/fastroping/script_component.hpp @@ -17,6 +17,7 @@ #include "\z\ace\addons\main\script_macros.hpp" +#define DEFAULT_ROPE_LENGTH 34.5 #define ANIMS_HOOK ["extendHookRight", "extendHookLeft"] #define ANIMS_ANIMATEDOOR ["door_R", "door_L", "CargoRamp_Open", "Door_rear_source", "Door_6_source", "CargoDoorR", "CargoDoorL"] diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml index 5b5400cdb28..c74b9bbd732 100644 --- a/addons/fastroping/stringtable.xml +++ b/addons/fastroping/stringtable.xml @@ -5,7 +5,7 @@ Equip FRIES Rüste FRIES aus Wyposaż FRIES - Equiper le FRIES + Équiper le FRIES Equipar FRIES Equipaggia il FRIES Vybavit FRIES @@ -20,13 +20,13 @@ Equips compatible helicopters with a Fast Rope Insertion Extraction System. Rüstet kompatible Helikopter mit einem Fast Rope Insertion Extraction System aus. Wyposaża kompatybilne helikoptery w zestaw Fast Rope Insertion Extraction System. - Equipe les hélicoptères compatibles avec un Module Fast Rope Insertion Extraction System. - Equipar helicoptero compatible con un Sistema de Inserción Extracción Fast Rope. + Équipe les hélicoptères compatibles avec un FRIES (Fast Rope Insertion Extraction System). + Equipar helicoptero compatible con un Sistema de Inserción/Extracción Rápida por Cuerda. Equipagga l'elicottero compatibile con il Fast Rope Insertion Extraction System Vybavit kompatibilní vrtulníky systémem Fast Rope Insertion Extraction (FRIES). Equipa um helicóptero compatível com o Fast Rope Insertion Exctraction System. Снаряжает совместимые вертолеты оборудованием для спуска десанта по канатам. - ヘリコプターで Fast Rope Insertion Extraction System を使えるようにします + ヘリコプターで Fast Rope Insertion Extraction System を使えるようにします。 패스트로프 투입 및 탈출 시스템을 호환되는 헬리콥터에 적용합니다. 使可相容的直升机启用快速绳降及撤离系统 使可相容的直升機啟用快速繩降及撤離系統 @@ -35,8 +35,8 @@ Prepare fast roping system Bereite "Fast Roping"-System vor Przygotuj system zjazdu na linach - Préparer le système de corde lisse - Preparar el sistema fast roping + Préparer le système d'aérocordage + Preparar el sistema de Cuerda Rápida Prepara le corde Připravit systém slaňování Prepara sistema de descida rápida @@ -45,6 +45,7 @@ 패스트로프 준비 准备快速绳降系统 準備快速繩降系統 + Halatla inme sistemini hazırla Stow fast roping system @@ -55,6 +56,11 @@ 收起快速绳降系统 패스트 로프 시스템 보관 Schowaj system zjazdu na linach + Спрятать систему спуска + Recolher o sistema de descida rápida + Désactiver le système d'aérocordage + Odložit systém slaňování + Recoger sistema de Cuerda Rápida Deploy ropes @@ -70,12 +76,13 @@ 줄 배치 部属绳索 部屬繩索 + Halatları sal Fast rope Abseilen Zjedź na linie - Descendre à la corde + Aérocordage - Descendre en rappel Descender por la cuerda Scendi dalla corda SLANIT @@ -85,12 +92,13 @@ 강하하기 快速绳降 快速繩降 + Halatla in Cut ropes Seile abwerfen Odetnij liny - Détacher les cordes + Aérocordage - Couper les cordes Cortar cuerdas Taglia le corde Odříznout lano @@ -100,12 +108,13 @@ 줄 자르기 剪掉绳索 剪掉繩索 + Halatı Kes Equip helicopter with FRIES Rüste Helicopter mit FRIES aus Wyposaż helikopter w FRIES - Equiper l'hélicoptère avec le FRIES + Équiper l'hélicoptère d'un FRIES Equipar helicoptero con FRIES Equipaggia l'elicottero con il FRIES Vybavit vrtulník pomocí FRIES @@ -120,8 +129,8 @@ Equips the selected helicopter with a Fast Rope Insertion Extraction System Rüstet den ausgewählten Helicopter mit einem Fast Rope Insertion Extraction System aus Wyposaża wybrany helikopter w zestaw Fast Rope Insertion Extraction System - Equipe l'hélicoptère sélectionné avec un Fast Rope Insertion Extraction System - Equipa el helicoptero seleccionado con un Sistema de Inserción Extracción Fast Rope + Équipe l'hélicoptère sélectionné avec un Fast Rope Insertion Extraction System (système d'aérocordage). + Equipa el helicoptero seleccionado con un Sistema de Inserción/Extracción Rápida por Cuerda Equipaggia l'elicottero selezionato con il Fast Rope Insertion Extraction System Vybavit vybraný vrtulník systémem Fast Rope Insertion Extraction (FRIES) Equipa um helicóptero selecionado com um sistema de Fast Rope Insertion Extraction System @@ -136,13 +145,206 @@ EINHEITEN ABSEILEN LASSEN SCENDI DALLE CORDE Equipa o helicóptero selecionado com o Fast Rope Insertion Extraction System - LAISSER LES UNITES UTILISER LA CORDE + LAISSER LES UNITÉS UTILISER LA CORDE ДЕСАНТИРОВАНИЕ ПО КАНАТУ ユニットへファスト ロープをさせる ZJAZD NA LINACH 让单位快速绳降 讓單位快速繩降 패스트 로프를 놓음 + UMOŽNIT JEDNOTKÁM SLAŇOVAT + + + Deploy 12m ropes + 12m Seile einsetzen + Déployer les cordes de 12 m + 12m ロープを展開 + Wysuń linę o długości 12 m. + Выпустить 12 м канат + Jogar cordar (12m) + 部屬12公尺長之繩索 + Dispiegamento corde 12m + Připravit 12m lana + 12m halat sal + Desplegar cuerdas de 12m + + + Deploy 15m ropes + 15m Seile einsetzen + Déployer les cordes de 15 m + 15m ロープを展開 + Wysuń linę o długości 15 m. + Выпустить 15 м канат + Jogar cordar (15m) + 部屬15公尺長之繩索 + Dispiegamento corde 15m + Připravit 15m lana + 15m halat sal + Desplegar cuerdas de 15m + + + Deploy 18m ropes + 18m Seile einsetzen + Déployer les cordes de 18 m + 18m ロープを展開 + Wysuń linę o długości 18 m. + Выпустить 18 м канат + Jogar cordar (18m) + 部屬18公尺長之繩索 + Dispiegamento corde 18m + Připravit 18m lana + 18m halat sal + Desplegar cuerdas de 18m + + + Deploy 27m ropes + 27m Seile einsetzen + Déployer les cordes de 27 m + 27m ロープを展開 + Wysuń linę o długości 27 m. + Выпустить 27 м канат + Jogar cordar (27m) + 部屬27公尺長之繩索 + Dispiegamento corde 27m + Připravit 27m lana + 27m halat sal + Desplegar cuerdas de 27m + + + Deploy 36m ropes + 36m Seile einsetzen + Déployer les cordes de 36 m + 36m ロープを展開 + Wysuń linę o długości 36 m. + Выпустить 36 м канат + Jogar cordar (36m) + 部屬36公尺長之繩索 + Dispiegamento corde 36m + Připravit 36m lana + 36m halat sal + Desplegar cuerdas de 36m + + + [ACE] Ropes Supply crate + [ACE] Seil Versorgungskiste + [ACE] Caisse de Cordes + [ACE] ロープ収納箱 + Skrzynia z linami ACE + [ACE] Ящик с канатами + [ACE] Suprimento de cordas + [ACE] 繩索補充箱 + [ACE] Cassa Corde + [ACE] Bedna s lany + [ACE] Halat Sandığı + [ACE] Caja de suministros - cuerdas + + + Used to do deploy ropes from a compatibile helicopter + Wird zum Bereitstellen von Seilen aus einem kompatiblen Hubschrauber verwendet + Utilisé pour déployer des cordes depuis un hélicoptère compatible. + 対応するヘリコプターからロープを展開する為に使用されます + Używane do opuszczania lin z kompatybilnych smigłowców + Используется для выпуска канатов с совместимого вертолета + Usado para fazer descida rápida de corda em helicópteros compatíveis com FRIES + 在可相容的直升機上部屬繩索 + Utilizzato per distribuire corde da un elicottero compatibile + Používané na přípravu lan na slaňování z kompatibilních helikoptér + Usar para desplegar cuerdas desde helicopteros compatibles + + + Rope 12.2 meters + 12.2 Meter Seil + Corde de 12,2 mètres + ロープ (12.2 メートル) + Lina, długość 12,2 m. + Канат 12.2 метров + Corda (12.2m) + 繩索(12.2公尺長) + Corda da 12.2 metri + Lano 12.2 metrů + 12.2 metre halat + Cuerda de 12.2 metros + + + Rope 15.2 meters + 15.2 Meter Seil + Corde de 15,2 mètres + ロープ (15.2 メートル) + Lina, długość 15,2 m. + Канат 15.2 метров + Corda (15.2m) + 繩索(15.2公尺長) + Corda da 15.2 metri + Lano 15.2 metrů + 15.2 metre halat + Cuerda de 15.2 metros + + + Rope 18.3 meters + 18.3 Meter Seil + Corde de 18,3 mètres + ロープ (18.3 メートル) + Lina, długość 18,3 m. + Канат 18.3 метров + Corda (18.3m) + 繩索(18.3公尺長) + Corda da 18.3 metri + Lano 18.3 metrů + 18.3 metre halat + Cuerda de 18.3 metros + + + Rope 27.4 meters + 27.4 Meter Seil + Corde de 27,4 mètres + ロープ (27.4 メートル) + Lina, długość 27,4 m. + Канат 27.4 метров + Corda (27.4m) + 繩索(27.4公尺長) + Corda da 27.4 metri + Lano 27.4 metrů + 27.4 metre halat + Cuerda de 27.4 metros + + + Rope 36.6 meters + 36.6 Meter Seil + Corde de 36,6 mètres + ロープ (36.6 メートル) + Lina, długość 36,6 m. + Канат 36.6 метров + Corda (36.6m) + 繩索(36.6公尺長) + Corda da 36.6 metri + Lano 36.6 metrů + 36.6 metre halat + Cuerda 36.6 metros + + + Fast-roping + Aérocordage + 快速繩降 + ファスト ロープ + Cuerdas rápidas + Zjazd na linach + Halatla Kayma + Slaňování + Спуск по канату + + + Require rope item to deploy + Seil-Item zum aufbauen benötigt + Nécessite une corde pour le déploiement + 展開にはロープ アイテムを必須に + Wymaga przedmiotu typu lina + Требуется канат + Requer uma corda para jogar + 需要繩索來部屬 + Richiede una corda per il dispigamento + Požadovat předmět lana pro slaňování + Requiere una cuerda para desplegar + Halatla kaymak için halat gerekli diff --git a/addons/fcs/XEH_postInit.sqf b/addons/fcs/XEH_postInit.sqf index ef6e89d5ccc..7693fecb6c6 100644 --- a/addons/fcs/XEH_postInit.sqf +++ b/addons/fcs/XEH_postInit.sqf @@ -15,13 +15,15 @@ if (!hasInterface) exitWith {}; }; }] call CBA_fnc_addEventHandler; -// Register fire event handler -["ace_firedPlayerVehicle", DFUNC(firedEH)] call CBA_fnc_addEventHandler; -["ace_firedPlayerVehicleNonLocal", DFUNC(firedEH)] call CBA_fnc_addEventHandler; - // Register event for global updates [QGVAR(forceUpdate), {[ACE_player] call FUNC(onForceUpdate)}] call CBA_fnc_addEventHandler; +[QGVAR(addFiredEH), { + TRACE_1("Adding firedEH",_this); + ["ace_firedPlayerVehicle", LINKFUNC(firedEH)] call CBA_fnc_addEventHandler; + ["ace_firedPlayerVehicleNonLocal", LINKFUNC(firedEH)] call CBA_fnc_addEventHandler; +}] call CBA_fnc_addEventHandler; + #ifdef DEBUG_MODE_FULL -call compile preprocessFileLineNumbers QPATHTOF(functions\dev_debugConfigs.sqf); +call compile preprocessFileLineNumbers QPATHTOF(dev\test_debugConfigs.sqf); #endif diff --git a/addons/fcs/config.cpp b/addons/fcs/config.cpp index df849ec346e..88e803d0ca4 100644 --- a/addons/fcs/config.cpp +++ b/addons/fcs/config.cpp @@ -28,7 +28,10 @@ class CfgPatches { #include "CfgOptics.hpp" class ACE_Extensions { - extensions[] += {"ace_fcs"}; + class ace_fcs { + windows = 1; + client = 1; + }; }; class ACE_Tests { diff --git a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf index a2fe8a2b7f6..9c8ef4c0a79 100644 --- a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf +++ b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [[array]] call ace_fcs_fnc_handleAirBurstAummunitionPFH + * [[array]] call ace_fcs_fnc_handleAirBurstAmmunitionPFH * * Public: No */ diff --git a/addons/fcs/functions/fnc_vehicleInit.sqf b/addons/fcs/functions/fnc_vehicleInit.sqf index 7117a121123..3314228729e 100644 --- a/addons/fcs/functions/fnc_vehicleInit.sqf +++ b/addons/fcs/functions/fnc_vehicleInit.sqf @@ -21,6 +21,11 @@ params ["_vehicle"]; private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) then { + if (isNil QGVAR(jipID)) then { + GVAR(jipID) = [QGVAR(addFiredEH), [], QGVAR(addFiredEH)] call CBA_fnc_globalEventJIP; + TRACE_1("Adding fired EH for players",GVAR(jipID)); + }; + _vehicle setVariable [format ["%1_%2", QGVAR(Distance), _x], 0, true]; _vehicle setVariable [format ["%1_%2", QGVAR(Magazines), _x], [], true]; _vehicle setVariable [format ["%1_%2", QGVAR(Elevation), _x], [], true]; @@ -41,5 +46,4 @@ params ["_vehicle"]; _vehicle setVariable [format ["%1_%2", QGVAR(ViewDiff), _x], 0, true]; }; }; - false -} count allTurrets _vehicle; +} forEach allTurrets _vehicle; diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index 93d81210584..6fff1a45c6b 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -4,7 +4,7 @@ Lase Target / Measure Distance Ziel anlasern / Entfernung messen - Télémétrer la cible + SCT - Illuminer la cible/Mesurer la distance Naświetl cel / Zmierz odległość Označit cíl / Změřit vzdálenost Iluminar objetivo / Medir distancia @@ -23,7 +23,7 @@ Ajustado a Wyzerowany na Nastaveno na - Remise à zéro à + Zéroté à Выставлено на Nullázási táv Fixado em @@ -39,7 +39,7 @@ Zwiększ zasięg SKO Ajustar distancia del FCS (arriba) Nastavit FCS Náměr (Nahoru) - Augmenter la distance du SCT + SCT - Augmenter la portée FCS tartomány állítása (Fel) Ajustar distância do FCS (Acima) Aumentare la distanza dell'FCS @@ -55,7 +55,7 @@ Zmniejsz zasięg SKO Ajustar distancia del FCS (abajo) Nastavit FCS Náměr (Dolů) - Réduire la distance du SCT + SCT - Réduire la portée FCS tartomány állítása (Le) Ajustar distância do FCS (Abaixo) Ridurre la distanza dell'FCS @@ -85,7 +85,7 @@ FCS has been reset. FLS wurde zurückgesetzt. FCS reiniciado - SCT réinitialisé. + SCT réinitialisé SKO został zresetowany. FCS byl resetován. FCS visszaállítva. diff --git a/addons/finger/ACE_Settings.hpp b/addons/finger/ACE_Settings.hpp index c28b33dd74e..b818c76d607 100644 --- a/addons/finger/ACE_Settings.hpp +++ b/addons/finger/ACE_Settings.hpp @@ -4,6 +4,7 @@ class ACE_Settings { value = 0; typeName = "BOOL"; displayName = CSTRING(enabled_displayName); + description = CSTRING(enabled_description); }; class GVAR(maxRange) { category = CSTRING(DisplayName); diff --git a/addons/finger/functions/fnc_keyPress.sqf b/addons/finger/functions/fnc_keyPress.sqf index 5308c44e6c2..faef2f00a37 100644 --- a/addons/finger/functions/fnc_keyPress.sqf +++ b/addons/finger/functions/fnc_keyPress.sqf @@ -48,7 +48,7 @@ private _nearbyMen = (ACE_player nearObjects ["CAManBase", (GVAR(maxRange) + 2)] {alive _x} && {(_x == (vehicle _x)) || {(vehicle _x) isKindOf "StaticWeapon"}} && {GVAR(indicatorForSelf) || {_x != ACE_player}} && - {!(lineIntersects [(eyePos _x), _playerEyePosASL, vehicle ACE_player, vehicle _x])} && + {((lineIntersectsSurfaces [(eyePos _x), _playerEyePosASL, vehicle ACE_player, vehicle _x]) isEqualTo [])} && {[_x] call EFUNC(common,isPlayer)}) then { _sendFingerToPlayers pushBack _x; diff --git a/addons/finger/stringtable.xml b/addons/finger/stringtable.xml index 24941404c59..c63a21a6009 100644 --- a/addons/finger/stringtable.xml +++ b/addons/finger/stringtable.xml @@ -1,7 +1,7 @@ - - + + Pointing Fingerzeig Puntamento @@ -9,14 +9,87 @@ 指向标记器 指差し 가리키기 - Pointage + Pointage du doigt Wskazywanie + Указание пальцем + Apontando + Ukazování + Señalando + Işaretleme - + + Pointing Enabled + Zeigen aktiviert + Pointage activé + Aktywuj wskazywanie + Mutatás engedélyezése + Apontamento ativado + Указание пальцем включено + Ukazování povoleno + Puntamento abilitato + 指差しを有効 + 가리키기 활성화 + 指向系统启动 + 指向系統啟動 + Señalado permitido + Işaretleme Etkin + + + Points, and shows a virtual marker of where you are looking to nearby units. Can be held down. + Zeigt in der Nähe befindlichen Spielern die eigene Blickrichtung mit Hilfe eines Kreissymbols an. + Permet d'effectuer un pointage du doigt, ce qui a pour effet d'afficher sur l'écran des joueurs alliés proches un marqueur virtuel, indiquant la direction dans laquelle vous regardez. Peut être maintenu. + Wskazuje a także wyświetla wirtualny marker-okrąg w miejscu, w które patrzysz, dla wszystkich pobliskich jednostek. Może być przytrzymywany. + Mutat, és elhelyez egy virtuális jelölőt a nézett területhez közeli egységekhez. Lenyomva tartható. + Aponta e mostra um marcador virtual para onde você está olhando para unidades próximas. Pode ser utilizado para baixo. + Показывает пальцем и рисует виртуальный маркер в направлении взгляда ближайшим игрокам. Можно удерживать. + Señala y muestra un marcador virtual donde ustás apuntando para las unidades cercanas. Puede ser mantenido. + Ukazuje virtuální značku kruhu ve směru, kterým se díváte pro všechny blízké jednotky. + Punta e mostra un marker virtuale di dove stai guardando alle unità vicine. Può essere tenuto premuto. + 指差し表記は自ユニットの近くにいる人のみに表記されます。また押しっぱなしにできます。 + 당신이 보는것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른채로 유지할 수 있습니다. + 当按下此按键后,你附近的单位即可看见一个虚拟图示,标明你正在指向的位置。此按键可以被按住来持续显示。 + 當按下此按鍵後,你附近的單位即可看見一個虛擬圖示,標明你正在指向的位置。此按鍵可以被按住來持續顯示。 + Işaretleyince nereye baktığınıza dair sanal bir daire gösterir. Basılı da tutulabilir. + + + Pointing Max Range + Maximale Zeigerreichweite + Portée maximale du pointage + Maks. zasięg wskazywania + Ujj maximum hatótávja + Distância máxima do apontamento + Макс. дальность + Distancia máxima de señalado + Maximální dosah pro ukazování směru + Raggio massimo puntamento + 指差しの最大範囲 + 가리키기 최대 범위 + 指向标记最大显示距离 + 指向指示器最大顯示距離 + Işaretleme maksimum uzaklığı + + + Max range between players to show the pointing indicator [default: 4 meters] + Maximale Reichweite zwischen Spielern, welche das Zeigesymbol des jeweils anderen sehen können. (Standard: 4 Meter). + Définit le rayon au-delà duquel les joueurs ne verront plus l'indicateur de pointage de leurs alliés. Valeur par défaut : 4 mètres. + Określ dystans na jakim można wskazywać coś palcem innym graczom. [domyślnie: 4m] + A maximális távolság, amelyben a közeli játékosoknak megjelenik az indikátor. [alapértelmezett: 4 méter] + Distância máxima entre jogadores para mostrar o apontamento [padrão: 4 metros] + Максимальная дальность между игроками для отображения индикатора указания пальцем [по-умолчанию: 4 метра] + Distancia máxima entre los jugadores para mostrar el indicador que señala [por defecto: 4 metros] + Maximální vzdálenost mezi hráči pro ukázání směru [výchozí: 4 metry] + Distanza massima tra giocatori per mostrare l'indicatore di puntamento [default: 4 metri] + 指差し表記が他のプレイヤーに表示される範囲を決定できます。(標準 4 メートル) + 플레이어 사이에서 가리키기 표시를 보이게 하는 최대거리를 설정합니다[기본설정: 4 미터] + 设定指向标记最大显示距离。[预设: 4公尺] + 設定指向指示器最大顯示距離。[預設: 4公尺] + Hangi uzaklıktakilerin sanal daireyi görmesini seçin. [Varsayılan : 4 metre] + + Show pointing indicator to self Zeigersymbol einem selbst anzeigen Индикатор пальца для показывающего - Afficher un indicateur de pointage à soi-même + Afficher son propre indicateur de pointage Pokaż indykator wskazywania palcem dla siebie Saját mutatási indikátor megjelenítése Mostrar indicador para si mesmo @@ -27,12 +100,13 @@ 자신이 가리키는곳을 보여줍니다 在自己身边显示指向标记 顯示指向指示器給自己 + Sanal daireyi işaretleyen kişiye göster - + Render the indicator for the pointing player. This option doesn't affect whether the other players would see the indicator Zeigt das eigene Zeigersymbol an. Diese Einstellung beeinflusst jedoch nicht andere Spieler, welche das Zeigersymbol sehen können. Отображать индикатор указания пальцем для показывающего игрока. Эта настройка не влияет на то, будут ли другие игроки видеть индикатор - Affiche l'indicateur pour le joueur qui pointe. Cette option n'affecte pas les autres joueurs + Le joueur qui pointe du doigt voit son propre indicateur à l'écran. Cette option n'a aucune incidence sur ce que voient les autres joueurs. Wyświetl indykator kiedy wskazujesz coś palcem. Ta opcja nie wpływa na to, czy inni gracze zobaczą ten indykator czy też nie. Az indikátor megjelenítése a mutató játékosnak. Ez a beállítás nem változtat azon, hogy más játékosok látják-e az indikátort. Renderizar o indicador para o jogador que está apontando. Esta opção não afeta se os outros jogadores verão ou não o indicador @@ -44,7 +118,7 @@ 显示指向标记给玩家自己。此选项设定并不影响其他玩家能否看到指示标记 顯示指向指示器給玩家自己。此選項設定並不影響其他玩家能否看到指示器 - + Pointing indicator Zeigersymbol Индикатор указания пальцем @@ -59,12 +133,13 @@ 가리키기 표시기 指向标记 指向指示器 + Daire Rengi - + Color of the pointing indicator circle Farbe des Zeigersymbols Цвет индикатора указания пальцем - Couleur du cercle de l'indicateur de pointage + Couleur et transparence du cercle indicateur de pointage. Kolor okręgu wyświetlanego przy wskazywaniu palcem Mutatási indikátor körének színe Cor do círculo de indicação @@ -75,12 +150,13 @@ 가리키기의 원형 색상 指向标记颜色 指向指示器顏色 + Sanal dairenin rengini belirleyin - + Action "point a finger at" Aktion: "Zeige Finger auf" Действие "показать пальцем на" - Action 'Pointer du doigt" + Action "Pointer du doigt vers" Akcja "wskaż palcem" Cselekvés "ujj rámutatása" Ação "Apontar um dedo para" @@ -92,10 +168,10 @@ 使"手指指向在" 使"手指指向在" - + Points, and shows a virtual marker of where you are looking to nearby units. Can be held down. Zeigt in der Nähe befindlichen Spielern die eigene Blickrichtung mit Hilfe eines Kreissymbols an. - Montre, et affiche un marqueur virtuel là ou vous regardez aux unités proches. Peut être maintenu. + Effectue un pointage du doigt, et affiche sur l'écran des unités alliées proches un marqueur virtuel, indiquant la direction dans laquelle vous regardez. Peut être maintenu. Wskazuje a także wyświetla wirtualny marker-okrąg w miejscu, w które patrzysz, dla wszystkich pobliskich jednostek. Może być przytrzymywany. Mutat, és elhelyez egy virtuális jelölőt a nézett területhez közeli egységekhez. Lenyomva tartható. Aponta e mostra um marcador virtual para onde você está olhando para unidades próximas. Pode ser utilizado para baixo. @@ -107,8 +183,9 @@ 당신이 보는것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른채로 유지할 수 있습니다. 当按下此按键后,你附近的单位即可看见一个虚拟图示,标明你正在指向的位置。此按键可以被按住来持续显示。 當按下此按鍵後,你附近的單位即可看見一個虛擬圖示,標明你正在指向的位置。此按鍵可以被按住來持續顯示。 + Işaretleyince nereye baktığınıza dair sanal bir daire gösterir. Basılı da tutulabilir. - + Pointing Settings Zeigen Einstellungen Options de pointage @@ -123,54 +200,7 @@ 가리키기 설정 指向设定 指向設定 - - - Pointing Enabled - Zeigen aktiviert - Pointage activé - Aktywuj wskazywanie - Mutatás engedélyezése - Apontamento ativado - Указание пальцем включено - Señalado habilitado - Ukazování povoleno - Puntamento abilitato - 指差しを有効 - 가리키기 활성화 - 指向系统启动 - 指向系統啟動 - - - Pointing Max Range - Maximale Zeigerreichweite - Distance maximale de pointage - Maks. zasięg wskazywania - Ujj maximum hatótávja - Distância máxima do apontamento - Макс. дальность - Distancia máxima de señalado - Maximální dosah pro ukazování směru - Raggio massimo puntamento - 指差しの最大範囲 - 가리키기 최대 범위 - 指向标记最大显示距离 - 指向指示器最大顯示距離 - - - Max range between players to show the pointing indicator [default: 4 meters] - Maximale Reichweite zwischen Spielern, welche das Zeigesymbol des jeweils anderen sehen können. (Standard: 4 Meter). - Distance maximale entre joueurs pour afficher l'indicateur (défaut: 4 mètres) - Określ dystans na jakim można wskazywać coś palcem innym graczom. [domyślnie: 4m] - A maximális távolság, amelyben a közeli játékosoknak megjelenik az indikátor. [alapértelmezett: 4 méter] - Distância máxima entre jogadores para mostrar o apontamento [padrão: 4 metros] - Максимальная дальность между игроками для отображения индикатора указания пальцем [по-умолчанию: 4 метра] - Distancia máxima entre los jugadores para mostrar el indicador que señala [por defecto: 4 metros] - Maximální vzdálenost mezi hráči pro ukázání směru [výchozí: 4 metry] - Distanza massima tra giocatori per mostrare l'indicatore di puntamento [default: 4 metri] - 指差し表記が他のプレイヤーに表示される範囲を決定できます。(標準 4 メートル) - 플레이어 사이에서 가리키기 표시를 보이게 하는 최대거리를 설정합니다[기본설정: 4 미터] - 设定指向标记最大显示距离。[预设: 4公尺] - 設定指向指示器最大顯示距離。[預設: 4公尺] + Işaretleme Ayarları diff --git a/addons/flashlights/CfgEventHandlers.hpp b/addons/flashlights/CfgEventHandlers.hpp index 30381d7200c..bf70b57b884 100644 --- a/addons/flashlights/CfgEventHandlers.hpp +++ b/addons/flashlights/CfgEventHandlers.hpp @@ -1,6 +1,5 @@ - class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient)); }; }; diff --git a/addons/flashlights/CfgVehicles.hpp b/addons/flashlights/CfgVehicles.hpp index fa766ad87bc..dbdf5421bc5 100644 --- a/addons/flashlights/CfgVehicles.hpp +++ b/addons/flashlights/CfgVehicles.hpp @@ -7,18 +7,17 @@ class CfgVehicles { }; class Item_Base_F; - class ACE_Flashlight_MX991Item: Item_Base_F { scope = 2; scopeCurator = 2; displayName = CSTRING(MX991_DisplayName); author = ECSTRING(common,ACETeam); - vehicleClass = "WeaponAccessories"; + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; + vehicleClass = "Items"; + class TransportItems { - class ACE_Flashlight_MX991 { - name = "ACE_Flashlight_MX991"; - count = 1; - }; + MACRO_ADDITEM(ACE_Flashlight_MX991,1); }; }; @@ -27,12 +26,12 @@ class CfgVehicles { scopeCurator = 2; displayName = CSTRING(KSF1_DisplayName); author = ECSTRING(common,ACETeam); - vehicleClass = "WeaponAccessories"; + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; + vehicleClass = "Items"; + class TransportItems { - class ACE_Flashlight_KSF1 { - name = "ACE_Flashlight_KSF1"; - count = 1; - }; + MACRO_ADDITEM(ACE_Flashlight_KSF1,1); }; }; @@ -41,38 +40,52 @@ class CfgVehicles { scopeCurator = 2; displayName = CSTRING(XL50_DisplayName); author = ECSTRING(common,ACETeam); - vehicleClass = "WeaponAccessories"; + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; + vehicleClass = "Items"; + class TransportItems { - class ACE_Flashlight_XL50 { - name = "ACE_Flashlight_XL50"; - count = 1; - }; + MACRO_ADDITEM(ACE_Flashlight_XL50,1); }; }; - class NATO_Box_Base; - class EAST_Box_Base; - class IND_Box_Base; - class FIA_Box_Base_F; + class Pistol_Base_F; + class ACE_Item_Flashlight_Maglite_ML300L: Pistol_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Maglite_ML300L_DisplayName); + author = ECSTRING(common,ACETeam); + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; + vehicleClass = "Items"; + + class TransportItems { + MACRO_ADDITEM(ACE_Flashlight_Maglite_ML300L,1); + }; + }; + class NATO_Box_Base; class Box_NATO_Support_F: NATO_Box_Base { class TransportItems { MACRO_ADDITEM(ACE_Flashlight_MX991,12); }; }; + class EAST_Box_Base; class Box_East_Support_F: EAST_Box_Base { class TransportItems { MACRO_ADDITEM(ACE_Flashlight_KSF1,12); }; }; + class IND_Box_Base; class Box_IND_Support_F: IND_Box_Base { class TransportItems { MACRO_ADDITEM(ACE_Flashlight_XL50,12); }; }; + class FIA_Box_Base_F; class Box_FIA_Support_F: FIA_Box_Base_F { class TransportItems { MACRO_ADDITEM(ACE_Flashlight_MX991,12); @@ -84,6 +97,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_Flashlight_MX991,12); MACRO_ADDITEM(ACE_Flashlight_KSF1,12); MACRO_ADDITEM(ACE_Flashlight_XL50,12); + MACRO_ADDITEM(ACE_Flashlight_Maglite_ML300L,2); }; }; -}; \ No newline at end of file +}; diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index 41bfd4a8bb4..1ebc9a5a586 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -1,17 +1,81 @@ class CfgWeapons { + class Pistol; + class Pistol_Base_F: Pistol { + class WeaponSlotsInfo; + }; + + class ACE_Flashlight_Maglite_ML300L: Pistol_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(Maglite_ML300L_DisplayName); + descriptionShort = CSTRING(Maglite_ML300L_Description); + model = QPATHTOF(data\maglite_ml300l.p3d); + picture = QPATHTOF(UI\maglite_ml300l_ca.paa); + cursor = ""; + cursorAim = ""; + + // binarized rtm, animation in "extras/assets/maglite" + handAnim[] = {"OFP2_ManSkeleton", QPATHTOF(data\maglite_ml300l.rtm)}; + recoil = "empty"; + muzzlePos = "flash"; + muzzleEnd = "flash dir"; + magazines[] = {"FakeMagazine"}; // Required for the weapon info box to work correctly. + textureType = "default"; // empty texture + weaponInfoType = "RscWeaponEmpty"; + + class WeaponSlotsInfo: WeaponSlotsInfo { + holsterScale = 0; // Item does not fit a pistol holster, so hide it. + mass = 20; + + class MuzzleSlot {}; + class CowsSlot {}; + }; + + inertia = 0.2; + dexterity = 1.8; + + class FlashLight { + color[] = {180,180,190}; + ambient[] = {0.9,0.81,0.7}; + intensity = 85; + size = 1; + innerAngle = 5; + outerAngle = 80; + coneFadeCoef = 8; + position = "flash dir"; + direction = "flash"; + useFlare = 1; + flareSize = 0.8; + flareMaxDistance = 100; + dayLight = 1; + + class Attenuation { + start = 0.25; + constant = 0; + linear = 0; + quadratic = 1; + hardLimitStart = 140; + hardLimitEnd = 150; + }; + + scale[] = {0}; + }; + }; class ACE_ItemCore; class CBA_MiscItem_ItemInfo; class ACE_Flashlight_MX991: ACE_ItemCore { author = ECSTRING(common,ACETeam); + scope = 2; displayName = CSTRING(MX991_DisplayName); descriptionShort = CSTRING(MX991_Description); - model = QPATHTOF(data\MX_991.p3d); - picture = QPATHTOF(UI\mx991_ca.paa); - scope = 2; + model = QPATHTOF(data\mx_991.p3d); + picture = QPATHTOF(UI\mx_991_ca.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 4; + class FlashLight { ACE_Flashlight_Colour = "red"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_red_ca.paa); @@ -22,13 +86,15 @@ class CfgWeapons { class ACE_Flashlight_KSF1: ACE_ItemCore { author = ECSTRING(common,ACETeam); + scope = 2; displayName = CSTRING(KSF1_DisplayName); descriptionShort = CSTRING(KSF1_Description); - model = QPATHTOF(data\KSF_1.p3d); - picture = QPATHTOF(UI\ksf1_ca.paa); - scope = 2; + model = QPATHTOF(data\ksf_1.p3d); + picture = QPATHTOF(UI\ksf_1_ca.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 4; + class FlashLight { ACE_Flashlight_Colour = "red"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_red_ca.paa); @@ -39,13 +105,15 @@ class CfgWeapons { class ACE_Flashlight_XL50: ACE_ItemCore { author = ECSTRING(common,ACETeam); + scope = 2; displayName = CSTRING(XL50_DisplayName); descriptionShort = CSTRING(XL50_Description); - model = QPATHTOF(data\Maglight.p3d); - picture = QPATHTOF(UI\xl50_ca.paa); - scope = 2; + model = QPATHTOF(data\maglite_xl50.p3d); + picture = QPATHTOF(UI\maglite_xl50_ca.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 3; + class FlashLight { ACE_Flashlight_Colour = "white"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_white_ca.paa); diff --git a/addons/flashlights/UI/KSF1_ca.paa b/addons/flashlights/UI/ksf_1_ca.paa similarity index 100% rename from addons/flashlights/UI/KSF1_ca.paa rename to addons/flashlights/UI/ksf_1_ca.paa diff --git a/addons/flashlights/UI/maglite_ml300l_ca.paa b/addons/flashlights/UI/maglite_ml300l_ca.paa new file mode 100644 index 00000000000..4a0440724f4 Binary files /dev/null and b/addons/flashlights/UI/maglite_ml300l_ca.paa differ diff --git a/addons/flashlights/UI/xl50_ca.paa b/addons/flashlights/UI/maglite_xl50_ca.paa similarity index 100% rename from addons/flashlights/UI/xl50_ca.paa rename to addons/flashlights/UI/maglite_xl50_ca.paa diff --git a/addons/flashlights/UI/mx991_ca.paa b/addons/flashlights/UI/mx_991_ca.paa similarity index 100% rename from addons/flashlights/UI/mx991_ca.paa rename to addons/flashlights/UI/mx_991_ca.paa diff --git a/addons/flashlights/config.cpp b/addons/flashlights/config.cpp index eefeb782f11..f88afc0663a 100644 --- a/addons/flashlights/config.cpp +++ b/addons/flashlights/config.cpp @@ -3,12 +3,22 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {}; - weapons[] = {"ACE_Flashlight_MX991", "ACE_Flashlight_KSF1", "ACE_Flashlight_XL50"}; + units[] = { + "ACE_Flashlight_MX991Item", + "ACE_Flashlight_KSF1Item", + "ACE_Flashlight_XL50Item", + "ACE_Item_Flashlight_Maglite_ML300L" + }; + weapons[] = { + "ACE_Flashlight_MX991", + "ACE_Flashlight_KSF1", + "ACE_Flashlight_XL50", + "ACE_Flashlight_Maglite_ML300L" + }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); - authors[] = {"voiper"}; + authors[] = {"voiper","bux","HorribleGoat"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/flashlights/data/KSF_1.p3d b/addons/flashlights/data/KSF_1.p3d index 0ec2fd23c69..0059335bd6f 100644 Binary files a/addons/flashlights/data/KSF_1.p3d and b/addons/flashlights/data/KSF_1.p3d differ diff --git a/addons/flashlights/data/MX_991.p3d b/addons/flashlights/data/MX_991.p3d index c79c330ea35..a373dd3f740 100644 Binary files a/addons/flashlights/data/MX_991.p3d and b/addons/flashlights/data/MX_991.p3d differ diff --git a/addons/flashlights/data/Maglight.p3d b/addons/flashlights/data/Maglight.p3d deleted file mode 100644 index 6ce3b9fcd4b..00000000000 Binary files a/addons/flashlights/data/Maglight.p3d and /dev/null differ diff --git a/addons/flashlights/data/ksf_1.rvmat b/addons/flashlights/data/ksf_1.rvmat index 113fe0cc147..ed9e802c54d 100644 --- a/addons/flashlights/data/ksf_1.rvmat +++ b/addons/flashlights/data/ksf_1.rvmat @@ -8,7 +8,7 @@ PixelShaderID="Super"; VertexShaderID="Super"; class Stage1 { - texture="z\ace\addons\flashlights\data\KSF_1_nohq.paa"; + texture="z\ace\addons\flashlights\data\textures\ksf_1_nohq.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; @@ -48,7 +48,7 @@ class Stage4 { }; }; class Stage5 { - texture="z\ace\addons\flashlights\data\KSF_1_smdi.paa"; + texture="z\ace\addons\flashlights\data\textures\ksf_1_smdi.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; diff --git a/addons/flashlights/data/maglite.rvmat b/addons/flashlights/data/maglite.rvmat deleted file mode 100644 index 960599813b6..00000000000 --- a/addons/flashlights/data/maglite.rvmat +++ /dev/null @@ -1,79 +0,0 @@ -ambient[]={1,1,1,1}; -diffuse[]={1,1,1,1}; -forcedDiffuse[]={0,0,0,0}; -emmisive[]={0,0,0,1}; -specular[]={0.6,0.6,0.6,1}; //amount of glossiness - the higher the number, the higher the glossiness -specularPower=700; //area of glossiness - the higher the number, the smaller the area -PixelShaderID="Super"; -VertexShaderID="Super"; - -class Stage1 { - texture="z\ace\addons\flashlights\data\Maglite_nohq.paa"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage2 { - texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage3 { - texture="#(argb,8,8,3)color(0,0,0,0,mc)"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage4 { - texture="#(argb,8,8,3)color(1,1,1,1,as)"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,1}; - pos[]={0,0,1}; - }; -}; -class Stage5 { - texture="z\ace\addons\flashlights\data\Maglite_smdi.paa"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage6 { - texture="#(ai,64,64,1)fresnel(4.7,1.2)"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,1}; - pos[]={0,0,0}; - }; -}; -class Stage7 { - texture="a3\data_f\env_land_ca.paa"; - uvSource="tex"; - class uvTransform { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,1}; - pos[]={0,0,0}; - }; -}; diff --git a/addons/flashlights/data/maglite_ml300l.p3d b/addons/flashlights/data/maglite_ml300l.p3d new file mode 100644 index 00000000000..e916514d513 Binary files /dev/null and b/addons/flashlights/data/maglite_ml300l.p3d differ diff --git a/addons/flashlights/data/maglite_ml300l.rtm b/addons/flashlights/data/maglite_ml300l.rtm new file mode 100644 index 00000000000..0a82508447c Binary files /dev/null and b/addons/flashlights/data/maglite_ml300l.rtm differ diff --git a/addons/flashlights/data/maglite_ml300l.rvmat b/addons/flashlights/data/maglite_ml300l.rvmat new file mode 100644 index 00000000000..a869bb93b45 --- /dev/null +++ b/addons/flashlights/data/maglite_ml300l.rvmat @@ -0,0 +1,80 @@ +ambient[] = {1,1,1,1}; +diffuse[] = {1,1,1,1}; +forcedDiffuse[] = {0,0,0,0}; +emmisive[] = {0,0,0,1}; +specular[] = {0.6,0.6,0.6,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower = 700; //area of glossiness - the higher the number, the smaller the area +PixelShaderID = "Super"; +VertexShaderID = "Super"; + +class Stage1 { + texture = "z\ace\addons\flashlights\data\textures\maglite_ml300l_nohq.paa"; + uvSource = "tex"; + + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; + +class Stage2 { + texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource = "tex"; + + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; + +class Stage3 { + texture = "#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource = "tex"; + + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; + +class Stage4 { + texture = "z\ace\addons\flashlights\data\textures\maglite_ml300l_as.paa"; + uvSource = "tex"; + + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,1}; + }; +}; + +class Stage5 { + texture = "z\ace\addons\flashlights\data\textures\maglite_ml300l_smdi.paa"; + uvSource = "tex"; + + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; + +class Stage6 { + texture = "#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource = "tex"; + + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; diff --git a/addons/flashlights/data/maglite_xl50.p3d b/addons/flashlights/data/maglite_xl50.p3d new file mode 100644 index 00000000000..b5619337d44 Binary files /dev/null and b/addons/flashlights/data/maglite_xl50.p3d differ diff --git a/addons/flashlights/data/maglite_xl50.rvmat b/addons/flashlights/data/maglite_xl50.rvmat new file mode 100644 index 00000000000..c1450280f33 --- /dev/null +++ b/addons/flashlights/data/maglite_xl50.rvmat @@ -0,0 +1,79 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.6,0.6,0.6,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=700; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="z\ace\addons\flashlights\data\textures\maglite_xl50_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,as)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,1}; + }; +}; +class Stage5 { + texture="z\ace\addons\flashlights\data\textures\maglite_xl50_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_ca.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/flashlights/data/model.cfg b/addons/flashlights/data/model.cfg new file mode 100644 index 00000000000..58bc63eb8dd --- /dev/null +++ b/addons/flashlights/data/model.cfg @@ -0,0 +1,175 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + + class OFP2_ManSkeleton { + isDiscrete = 0; + skeletonInherit = ""; + skeletonBones[] = { + "Pelvis","", + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", + "Camera","Pelvis", + "weapon","Spine1", + "launcher","Spine1", + + // Head skeleton in hierarchy + "neck","Spine3", + "neck1","neck", + "head","neck1", + + // New facial features + "Face_Hub","head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub", + + // Left upper side + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", + + // Right upper side + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + + // Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + + // Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot" + }; + + // location of pivot points (local axes) for hierarchical animation + pivotsModel = "A3\anims_f\data\skeleton\SkeletonPivots.p3d"; + }; +}; + +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = ""; + }; + + class ArmaMan: Default { + htMin = 60; // Minimum half-cooling time (in seconds) + htMax = 1800; // Maximum half-cooling time (in seconds) + afMax = 30; // Maximum temperature in case the model is alive (in celsius) + mfMax = 0; // Maximum temperature when the model is moving (in celsius) + mFact = 1; // Metabolism factor - number from interval <0, 1> (0 - metabolism has no influence, 1 - metabolism has full influence (no other temperature source will be considered)). + tBody = 37; // Metabolism temperature of the model (in celsius) + + sections[] = { + "osobnost", + "Head_Injury", + "Body_Injury", + "l_leg_injury", + "l_arm_injury", + "r_arm_injury", + "r_leg_injury", + "injury_body", + "injury_legs", + "injury_hands", + "clan", + "clan_sign", + "Camo", + "CamoB", + "Camo1", + "Camo2", + "personality", + "hl", + "injury_head", + "insignia", + "ghillie_hide" + }; + + skeletonName = "OFP2_ManSkeleton"; + }; +}; diff --git a/addons/flashlights/data/mx_991.rvmat b/addons/flashlights/data/mx_991.rvmat index 0268d4903c8..040b3ea8c6d 100644 --- a/addons/flashlights/data/mx_991.rvmat +++ b/addons/flashlights/data/mx_991.rvmat @@ -8,7 +8,7 @@ PixelShaderID="Super"; VertexShaderID="Super"; class Stage1 { - texture="z\ace\addons\flashlights\data\MX_991_nohq.paa"; + texture="z\ace\addons\flashlights\data\textures\mx_991_nohq.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; diff --git a/addons/flashlights/data/ksf_1_co.paa b/addons/flashlights/data/textures/ksf_1_co.paa similarity index 100% rename from addons/flashlights/data/ksf_1_co.paa rename to addons/flashlights/data/textures/ksf_1_co.paa diff --git a/addons/flashlights/data/KSF_1_nohq.paa b/addons/flashlights/data/textures/ksf_1_nohq.paa similarity index 100% rename from addons/flashlights/data/KSF_1_nohq.paa rename to addons/flashlights/data/textures/ksf_1_nohq.paa diff --git a/addons/flashlights/data/KSF_1_smdi.paa b/addons/flashlights/data/textures/ksf_1_smdi.paa similarity index 100% rename from addons/flashlights/data/KSF_1_smdi.paa rename to addons/flashlights/data/textures/ksf_1_smdi.paa diff --git a/addons/flashlights/data/textures/maglite_ml300l_as.paa b/addons/flashlights/data/textures/maglite_ml300l_as.paa new file mode 100644 index 00000000000..6dc466f969d Binary files /dev/null and b/addons/flashlights/data/textures/maglite_ml300l_as.paa differ diff --git a/addons/flashlights/data/textures/maglite_ml300l_ca.paa b/addons/flashlights/data/textures/maglite_ml300l_ca.paa new file mode 100644 index 00000000000..2a2368b6e30 Binary files /dev/null and b/addons/flashlights/data/textures/maglite_ml300l_ca.paa differ diff --git a/addons/flashlights/data/textures/maglite_ml300l_nohq.paa b/addons/flashlights/data/textures/maglite_ml300l_nohq.paa new file mode 100644 index 00000000000..4a08ff5925f Binary files /dev/null and b/addons/flashlights/data/textures/maglite_ml300l_nohq.paa differ diff --git a/addons/flashlights/data/textures/maglite_ml300l_smdi.paa b/addons/flashlights/data/textures/maglite_ml300l_smdi.paa new file mode 100644 index 00000000000..32cab82188d Binary files /dev/null and b/addons/flashlights/data/textures/maglite_ml300l_smdi.paa differ diff --git a/addons/flashlights/data/maglite_co.paa b/addons/flashlights/data/textures/maglite_xl50_co.paa similarity index 100% rename from addons/flashlights/data/maglite_co.paa rename to addons/flashlights/data/textures/maglite_xl50_co.paa diff --git a/addons/flashlights/data/Maglite_nohq.paa b/addons/flashlights/data/textures/maglite_xl50_nohq.paa similarity index 100% rename from addons/flashlights/data/Maglite_nohq.paa rename to addons/flashlights/data/textures/maglite_xl50_nohq.paa diff --git a/addons/flashlights/data/Maglite_smdi.paa b/addons/flashlights/data/textures/maglite_xl50_smdi.paa similarity index 100% rename from addons/flashlights/data/Maglite_smdi.paa rename to addons/flashlights/data/textures/maglite_xl50_smdi.paa diff --git a/addons/flashlights/data/mx_991_co.paa b/addons/flashlights/data/textures/mx_991_co.paa similarity index 100% rename from addons/flashlights/data/mx_991_co.paa rename to addons/flashlights/data/textures/mx_991_co.paa diff --git a/addons/flashlights/data/MX_991_nohq.paa b/addons/flashlights/data/textures/mx_991_nohq.paa similarity index 100% rename from addons/flashlights/data/MX_991_nohq.paa rename to addons/flashlights/data/textures/mx_991_nohq.paa diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml index 418c10cc6a8..478b1da2c84 100644 --- a/addons/flashlights/stringtable.xml +++ b/addons/flashlights/stringtable.xml @@ -15,6 +15,7 @@ Fulton MX-991 Fulton MX-991手电筒 Fulton MX-991 + Fulton MX-991 Flashlight with red filter. For use on map. @@ -30,6 +31,7 @@ 빨간색 필터가 달린 손전등입니다. 지도를 비출때 씁니다. 拥有红色滤光片的手电筒。用来照亮地图。 擁有紅色濾光片的手電筒。用來照亮地圖。 + Kırmızı filtreli el feneri. Harita üzerin de kullanım için. Maglite XL50 @@ -45,6 +47,7 @@ Maglite XL50 Maglite XL50手电筒 Maglite XL50 + Maglite XL50 White mini flashlight. For use on map. @@ -56,10 +59,11 @@ Mini linterna blanca. Para su uso en el mapa. Mini-torcia bianca. Da usare in mappa. Mini lampe torche blanche. Pour utilisation sur carte. - 白色光の小さなフラッシュライト。地図上でつかいます。 + 白色光の小さなフラッシュライト。地図上で使用します。 하얀색 조그마한 손전등. 지도를 비출때 씁니다. 白色的迷你手电筒。用来照亮地图。 白色的迷你手電筒。用來照亮地圖。 + Beyaz küçük el feneri. Harita üzerin de kullanım için. KSF-1 @@ -75,6 +79,7 @@ KSF-1 KSF-1手电筒 KSF-1 + KSF-1 Flashlight with red filter. For use on map. @@ -86,19 +91,52 @@ Linterna con filtro rojo. Para su uso en el mapa. Torcia con filtro rosso. Da usare in mappa. Lampe torche avec un filtre rouge. Pour utilisation sur carte. - 赤色フィルタ付きのフラッシュライト。地図上でつかいます。 + 赤色フィルタ付きのフラッシュライト。地図上で使用します。 빨간색 필터가 달린 손전등입니다. 지도를 비출때 씁니다. 拥有红色滤光片的手电筒。用来照亮地图。 擁有紅色濾光片的手電筒。用來照亮地圖。 + Kırmızı filtreli el feneri. Harita üzerin de kullanım için. Map light color + Farbe des Kartenlichts Couleur de la lampe sur carte 光の色 地图上手电的颜色 地圖上使用手電筒的顏色 Colore della luce sulla mappa Kolor światła na mapie + Цвет подсветки карты + Cor da lanterna no mapa + Barva svítilny na mapě + Harita ışık rengi + Color de luz sobre el mapa + + + Maglite ML300L + Maglite ML300L + Maglite ML300L + Maglite ML300L + Maglite ML300L + Maglite ML300L + Maglite ML300L + マグライト ML300L + Maglite ML300L + Maglite ML300L + Maglite ML300L + + + Powerful LED flashlight. + Leistungsstarke LED-Taschenlampe. + Mocna latarka LED. + 強大的LED手電筒 + Torcia a LED ad alta potenza + Silná LED svítilna. + Puissante lampe torche à LED. + 協力な LED のフラッシュライト。 + Güçlü LED el feneri + Linterna LED potente + Мощный светодиодный фонарь. diff --git a/addons/flashsuppressors/CfgWeapons.hpp b/addons/flashsuppressors/CfgWeapons.hpp index bf5aee16f18..957bbd7defc 100644 --- a/addons/flashsuppressors/CfgWeapons.hpp +++ b/addons/flashsuppressors/CfgWeapons.hpp @@ -50,23 +50,35 @@ class asdg_MuzzleSlot_762MG: asdg_MuzzleSlot { // for 7.62, 6.5 and 5.56 univers ACE_muzzle_mzls_B = 1; }; }; + +// Vanilla Muzzles from 1.94+ (ref https://github.com/CBATeam/CBA_A3/pull/1184) class MuzzleSlot; +class MuzzleSlot_65: MuzzleSlot { + class compatibleItems { + ACE_muzzle_mzls_H = 1; + }; +}; +class MuzzleSlot_556: MuzzleSlot { + class compatibleItems { + ACE_muzzle_mzls_L = 1; + }; +}; +class MuzzleSlot_762: MuzzleSlot { + class compatibleItems { + ACE_muzzle_mzls_B = 1; + }; +}; class CfgWeapons { class Rifle_Base_F; - class Rifle_Long_Base_F: Rifle_Base_F { class WeaponSlotsInfo; }; - /* Other */ class LMG_Mk200_F: Rifle_Long_Base_F { class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: asdg_MuzzleSlot_762MG { - class compatibleItems: compatibleItems { - ACE_muzzle_mzls_H = 1; - ACE_muzzle_mzls_B = 0; - }; + class MuzzleSlot: MuzzleSlot_65 { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; // uses array instead of inherited class }; }; }; diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml index 52563ea1c49..03b30aeeba4 100644 --- a/addons/flashsuppressors/stringtable.xml +++ b/addons/flashsuppressors/stringtable.xml @@ -15,7 +15,8 @@ 消炎器 (6.5 mm) 소염기 (6.5 mm) 消光器 (6.5 mm) - 消光器 (6.5 mm) + 消光器 (6.5 毫米) + Flash Suppressor (6.5 mm) Flash Suppressor (7.62 mm) @@ -31,7 +32,8 @@ 消炎器 (7.62 mm) 소염기 (7.62 mm) 消光器 (7.62 mm) - 消光器 (7.62 mm) + 消光器 (7.62 毫米) + Flash Suppressor (7.62 mm) Flash Suppressor (5.56 mm) @@ -47,7 +49,8 @@ 消炎器 (5.56 mm) 소염기 (5.56 mm) 消光器 (5.56 mm) - 消光器 (5.56 mm) + 消光器 (5.56 毫米) + Flash Suppressor (5.56 mm) Flash Suppressor (.45 ACP) @@ -64,6 +67,7 @@ 소염기 (.45 ACP) 消光器 (.45 ACP) 消光器 (.45 ACP) + Flash Suppressor (.45 ACP) Flash Suppressor (9 mm) @@ -79,7 +83,8 @@ 消炎器 (9 mm) 소염기 (9 mm) 消光器 (9 mm) - 消光器 (9 mm) + 消光器 (9 毫米) + Flash Suppressor (9 mm) Flash Suppressor (.338) @@ -96,6 +101,7 @@ 소염기 (.338) 消光器 (.338) 消光器 (.338) + Flash Suppressor (.338) Flash Suppressor (9.3 mm) @@ -111,7 +117,8 @@ 消炎器 (9.3 mm) 소염기 (9.3 mm) 消光器 (9.3 mm) - 消光器 (9.3 mm) + 消光器 (9.3 毫米) + Flash Suppressor (9.3 mm) diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index 8e1bf2f8040..5d08dcc7188 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -24,11 +24,10 @@ private _velocity = velocity _round; private _velocityStep = _velocity vectorMultiply _delta; private _forwardPos = _curPos vectorAdd _velocityStep; + private _intersectsWith = lineIntersectsWith [_curPos, _forwardPos]; if (_intersectsWith isEqualTo []) exitWith {}; - -// player sideChat format ["inter: %1", _intersectsWith]; { // diag_log text format ["Adding HP: %1", _x]; private _index = count GVAR(spallHPData); diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index d5a3091969d..34a755f87e0 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -40,7 +40,7 @@ Aktiviere die ACE-Splittersimulation Povolit ACE simulaci fragmentů Ativa a simulação de fragmentação do ACE - Active la simulation ACE de la fragmentation + Active la simulation de la fragmentation ACE. Az ACE repesz-szimuláció engedélyezése Включить симуляцию осколков ACE Abilita la Simulazione Frammentazione di ACE @@ -72,7 +72,7 @@ Aktiviere ACE-Explosionssimulation Povolit ACE simulaci úlomků Ativa a simulação de estilhaços do ACE - Active la simulation d'éclat ACE + Active la simulation d'éclat ACE. Az ACE pattogzás-szimuláció engedélyezése Включить симуляцию обломков ACE Abilita la Simulazione Spalling di ACE @@ -87,13 +87,14 @@ Simulazione Riflessi Esplosioni Druckwellensimulation Activar simulación de reflexiones - Simulation de la réflection des explosions. + Simulation de la réflexion des explosions Simulação de reflexo de explosão Cимуляция отражения взрывов ACE 爆発による飛翔シミュレーション 폭발 반사 시뮬레이션 模拟爆炸反射 模擬爆炸反射 + Simulace odrazu exploze Enable the ACE Explosion Reflection Simulation @@ -101,13 +102,14 @@ Abilita la Simulazione Riflessi Esplosioni di ACE Aktiviere die ACE-Druckwellensimulation Activa la simulación de reflexiones para las explosiones. - Activer la simulation de la réfléction des explosions ACE. + Active la simulation de la réflexion des explosions ACE. Ativa a simulação de reflexo de explosão do ACE Включить симуляцию отражения взрывов ACE 爆発による飛翔シミュレーションを有効化 ACE 폭발 반사 시뮬레이션을 적용합니다. 启用ACE模拟爆炸反射 啟用ACE模擬爆炸反射 + Povolit ACE simulaci odrazu exploze Maximum Projectiles Tracked @@ -116,7 +118,7 @@ Maximalzahl der verfolgten Projektile Maximální počet sledovaných projektilů Máximo de projéteis rastreados - Nombre maximum de projectile suivis + Nombre maximum de projectiles suivis Maximum követett repeszek Макс. количество отслеживаемых снарядов Numero massimo di Proiettili Tracciati @@ -132,7 +134,7 @@ Diese Einstellung steuert die maximale Anzahl an Projektilen, die das Splitter- und Explosionssystem gleichzeitig verfolgen wird. Wenn mehr Projektile abgefeuert werden, werden sie nicht verfolgt werden. Diese Einstellung zu verringern, kann FPS-Einbrüche bei Szenarien mit vielen Projektilen verhindern (>200 Objekte gleichzeitig in der Luft) Toto nastavení kontroluje maximální množství projektilů z fragmentace a úlomků, která jsou sledována v dané době. Pokud je vystřeleno více projektilů, tak nebudou sledovány. Snižte toto nastavení pokud si nepřejete propady FPS v situacích, kde je velké množství projektilů ( >200 nábojů najednou ve vzduchu) Esta definição controla a quantidade máxima de projéteis que o sistema de fragmentação e estilhaçamento irá acompanhar em qualquer momento. Se mais projéteis são disparados, eles não serão rastreados. Diminua essa configuração se você não quiser que o FPS caia em cenários com alta contagem de projéteis (> 200 projéteis no ar ao mesmo tempo) - Cette option contrôle le nombre maximum de projectiles et d'éclats résultant de la fragmentation que le système suivra à un moment T. Si plus de projectiles sont générés, ils ne seront pas pris en compte. Baisser cette option si vous ne voulez pas de baisse de FPS en cas d'un nombre important de projectiles (>200 éclats en même temps) + Ce paramètre contrôle le nombre maximum de projectiles et d'éclats résultant de la fragmentation, que le système peut suivre à chaque instant.\nSi plus de projectiles sont générés, ils ne seront pas pris en compte. Baissez ce réglage si vous ne voulez pas de chute de FPS en cas de nombre important de projectiles (>200 éclats en même temps). Ez a beállítás szabályozza a repeszeződés és pattogzás által kilőtt objektumok követett számát. Ha több ez a szám, ezek az objektumok nem lesznek követve. Csökkentsd ezt a beállítást, ha nem akarsz lassulásokat magas-törmelékmennyiségű helyzetekben (200+ repesz a levegőben egyszerre) Эта настройка контролирует максимальное количество снарядов, которок отслеживает система осколков и обломков в каждый момент времени. Снаряды, выстреленные сверх этого числа, отслеживаться не будут. Уменьшите это значение, если вы не хотите падения FPS при большом количестве снарядов в одной перестрелке (> 200 одновременно летящих снарядов) Questo parametro controlla il numero massimo di proiettili che la frammentazione e il sistema di spalling tracciano in ogni momento. Se più proiettili sono sparati, non verranno tracciati. Abbassa questo parametro se non vuoi cali di FPS in scenari con molti proiettili (>200 proiettili in aria contemporaneamente) @@ -164,7 +166,7 @@ El número de cálculos de esquirlas que se hará en cualquier cuadro. Esto ayuda a dispersar el impacto en FPS del seguimiento de esquirlas de balas a través de múltiples cuadros, lo que limita aún más su impacto. Počet úlomků v daném snímku. Toto pomáhá rozšířit FPS dopad sledovaného úlomku napříč více snímky, omezuje jeho vliv ještě více. O número de cálculos por estilhaço rastreado para executar em qualquer quadro. Isso ajuda a distribuir o impacto no FPS do rastreamento de estilhaço em vários quadros, o que limita o seu impacto ainda mais. - Le nombre d'éclats à calculer dans chaque image. Ceci permet de diffuser l'impact sur les FPS dans de multiples images, limitant la perte de FPS. + Le nombre de calculs de suivi à effectuer pour chaque image. Cela aide à répartir l'impact des calculs sur plusieurs images, limitant ainsi encore davantage l'impact sur les FPS. A lepattogzási útvonalak számításának darabjai képkockánként. Ez eloszlatja az FPS-megszakadást több képkockára, ezzel csökkentve a súlyosságát. Число обрабатываемых осколков за кадр. Это позволяет распределить нагрузку по отслеживанию осколков между несколькими кадрами, чтобы предотвратить падение FPS. Il numero di calcoli per tracciamento di spalling ad ogni frame. Questo aiuta a distribuire l'impatto del tracciamento dello spalling su più frame, limitando ancora di più l'impatto. diff --git a/addons/gestures/anim/model.cfg b/addons/gestures/anim/model.cfg index be41a523a8e..942b917d47f 100644 --- a/addons/gestures/anim/model.cfg +++ b/addons/gestures/anim/model.cfg @@ -1,124 +1,118 @@ -class cfgSkeletons -{ - class OFP2_ManSkeleton - { +class cfgSkeletons { + class OFP2_ManSkeleton { isDiscrete = 0; skeletonInherit = ""; - SkeletonBones[]= - { + skeletonBones[] = { "Pelvis","", - "Spine","Pelvis", - "Spine1","Spine", - "Spine2","Spine1", - "Spine3","Spine2", + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", "camera","Pelvis",// case has changed for arma3 - "weapon","Spine1", - "launcher","Spine1", - //Head skeleton in hierarchy - "Neck","Spine3", - "Neck1","Neck", - "Head","Neck1", - - //Left upper side - "LeftShoulder","Spine3", - "LeftArm","LeftShoulder", - "LeftArmRoll","LeftArm", - "LeftForeArm","LeftArmRoll", - "LeftForeArmRoll","LeftForeArm", - "LeftHand","LeftForeArmRoll", - "LeftHandRing","LeftHand", - "LeftHandRing1","LeftHandRing", - "LeftHandRing2","LeftHandRing1", - "LeftHandRing3","LeftHandRing2", - "LeftHandPinky1","LeftHandRing", - "LeftHandPinky2","LeftHandPinky1", - "LeftHandPinky3","LeftHandPinky2", - "LeftHandMiddle1","LeftHand", - "LeftHandMiddle2","LeftHandMiddle1", - "LeftHandMiddle3","LeftHandMiddle2", - "LeftHandIndex1","LeftHand", - "LeftHandIndex2","LeftHandIndex1", - "LeftHandIndex3","LeftHandIndex2", - "LeftHandThumb1","LeftHand", - "LeftHandThumb2","LeftHandThumb1", - "LeftHandThumb3","LeftHandThumb2", - //Right upper side - "RightShoulder","Spine3", - "RightArm","RightShoulder", - "RightArmRoll","RightArm", - "RightForeArm","RightArmRoll", - "RightForeArmRoll","RightForeArm", - "RightHand","RightForeArmRoll", - "RightHandRing","RightHand", - "RightHandRing1","RightHandRing", - "RightHandRing2","RightHandRing1", - "RightHandRing3","RightHandRing2", - "RightHandPinky1","RightHandRing", - "RightHandPinky2","RightHandPinky1", - "RightHandPinky3","RightHandPinky2", - "RightHandMiddle1","RightHand", - "RightHandMiddle2","RightHandMiddle1", - "RightHandMiddle3","RightHandMiddle2", - "RightHandIndex1","RightHand", - "RightHandIndex2","RightHandIndex1", - "RightHandIndex3","RightHandIndex2", - "RightHandThumb1","RightHand", - "RightHandThumb2","RightHandThumb1", - "RightHandThumb3","RightHandThumb2", - //Left lower side - "LeftUpLeg","Pelvis", - "LeftUpLegRoll","LeftUpLeg", - "LeftLeg","LeftUpLegRoll", - "LeftLegRoll","LeftLeg", - "LeftFoot","LeftLegRoll", - "LeftToeBase","LeftFoot", - //Right lower side - "RightUpLeg","Pelvis", - "RightUpLegRoll","RightUpLeg", - "RightLeg","RightUpLegRoll", - "RightLegRoll","RightLeg", - "RightFoot","RightLegRoll", - "RightToeBase","RightFoot", - + "weapon","Spine1", + "launcher","Spine1", + "Neck","Spine3", + "Neck1","Neck", + "Head","Neck1", //Head skeleton in hierarchy + //Left upper side + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", + //Right upper side + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot", //New facial features arma3 only - "Face_Hub","Head", - "Face_Jawbone","Face_Hub", - "Face_Jowl","Face_Jawbone", - "Face_chopRight","Face_Jawbone", - "Face_chopLeft","Face_Jawbone", - "Face_LipLowerMiddle","Face_Jawbone", - "Face_LipLowerLeft","Face_Jawbone", - "Face_LipLowerRight","Face_Jawbone", - "Face_Chin","Face_Jawbone", - "Face_Tongue","Face_Jawbone", - "Face_CornerRight","Face_Hub", - "Face_CheekSideRight","Face_CornerRight", - "Face_CornerLeft","Face_Hub", - "Face_CheekSideLeft","Face_CornerLeft", - "Face_CheekFrontRight","Face_Hub", - "Face_CheekFrontLeft","Face_Hub", - "Face_CheekUpperRight","Face_Hub", - "Face_CheekUpperLeft","Face_Hub", - "Face_LipUpperMiddle","Face_Hub", - "Face_LipUpperRight","Face_Hub", - "Face_LipUpperLeft","Face_Hub", - "Face_NostrilRight","Face_Hub", - "Face_NostrilLeft","Face_Hub", - "Face_Forehead","Face_Hub", - "Face_BrowFrontRight","Face_Forehead", - "Face_BrowFrontLeft","Face_Forehead", - "Face_BrowMiddle","Face_Forehead", - "Face_BrowSideRight","Face_Forehead", - "Face_BrowSideLeft","Face_Forehead", - "Face_Eyelids","Face_Hub", - "Face_EyelidUpperRight","Face_Hub", - "Face_EyelidUpperLeft","Face_Hub", - "Face_EyelidLowerRight","Face_Hub", - "Face_EyelidLowerLeft","Face_Hub", - "EyeLeft","Face_Hub", - "EyeRight","Face_Hub" + "Face_Hub","Head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub" };// end of skeleton array // location of pivot points (local axes) for hierarchical animation - pivotsModel="Samples_F\TemplateRTM\ManSkeleton_Pivots.p3d"; + pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d"; }; }; diff --git a/addons/gestures/stringtable.xml b/addons/gestures/stringtable.xml index 6e61d5cac08..a9db468cdb3 100644 --- a/addons/gestures/stringtable.xml +++ b/addons/gestures/stringtable.xml @@ -16,6 +16,7 @@ ACE 수신호 ACE 手势 ACE 手勢 + ACE Hareketleri ACE Gestures @@ -32,6 +33,7 @@ ACE 수신호 ACE 手势 ACE 手勢 + ACE Hareketleri Gestures @@ -48,6 +50,7 @@ 수신호 手势 手勢 + Hareketler Advance @@ -64,6 +67,7 @@ 전진 前进 前進 + Ilerle Go @@ -80,6 +84,7 @@ 이동 出发 出發 + Git Follow @@ -96,6 +101,7 @@ 따라올것 跟进 跟進 + Takip Et Up @@ -112,6 +118,7 @@ 起立 起立 + Yukarı Cease Fire @@ -128,6 +135,7 @@ 사격 중지 停火 停火 + Ateşi durdur Stop @@ -143,6 +151,7 @@ 멈춰 停止 停止 + Dur Freeze @@ -159,6 +168,7 @@ 정지 不准动 不准動 + Don Cover @@ -175,6 +185,7 @@ 엄폐 掩护 掩護 + Mevzi Al Rally up @@ -190,6 +201,7 @@ 집결 集合 集合 + Toplan Move forward @@ -205,6 +217,7 @@ 앞으로 이동 往前走 往前走 + Ileri Git Engage @@ -220,6 +233,7 @@ 교전할것 交战 交戰 + Tut Point @@ -235,6 +249,7 @@ 가리키기 指出 指出 + Nokta Hold @@ -250,6 +265,7 @@ 기다려 停住 停住 + Dur Warning @@ -265,6 +281,7 @@ 주의 警告 警告 + Uyarı Show Gestures On Interaction Menu @@ -273,13 +290,14 @@ Pokaż gesty w menu interakcji Mostra Gesti su Menù Interazione Mostrar gestos en el menú de interacción - Afficher les gestes dans le menu d'interaction. + Afficher les gestes dans le menu d'interaction Mostrar gestos no menu de interação Показать жесты в меню взаимодействия インタラクション メニュー上でジェスチャー表示 수신호를 상호작용 메뉴에서 보여줍니다 显示手势互动选单 顯示手勢互動選單 + Hareketleri Etkileşim Menüsünde Göster Show gestures on the self interaction menu, or just use keybinds, or disable completely @@ -288,13 +306,14 @@ Pokaż listę gestów w menu własnej interakcji, użyj tylko skrótów na klawiaturze lub wyłącz całkowicie Mostra Gesti nel Menù Interazione Personale, o usa solamente tasti di scelta rapida, o disabilita completamente Muestror los gestos en el menú de interacción propia, utilizar solo combinación de teclas o desactivarlos completamente - Afficher les gestes dans le menu d'interaction personnel, ou seulement utiliser les touches, ou desactiver complètement. + Afficher les gestes dans le menu d'interaction personnel, ou utiliser uniquement les touches, ou désactiver complètement. Mostra gestos no menu de interação, ou utilize um dos atalhos de teclado ou desative completamente Показать жесты в меню взамиодейтсвия с собой или только использовать горячие клавиши, или полностью отключить キー操作や同時使用を無効化している場合はセルフ インタラクション メニュ上でジェスチャーを表示します 수신호를 상호작용 메뉴에서 보여주거나 혹은 단축키를 지정하거나 아니면 아예 사용하지 않습니다. 显示手势选项在自己的互动选单上,或只利用键盘来使用手势,或完全禁用 顯示手勢選項在自己的互動選單上,或只利用鍵盤來使用手勢,或完全禁用 + Kendi kendine etkileşim menüsünde hareketleri göster veya sadece tuş atamaları kullan veya tamamen devre dışı bırak. Just Keybinds @@ -303,13 +322,14 @@ Tylko skróty klaw. Solo tasti di scelta rapida Solo mediante teclas - Seulement les touches + Touches uniquement Somente atalhos de teclado Только горячие клавиши キー操作のみ 오직 단축키만 只利用键盘 只利用鍵盤 + Sadece Tuş Atamaları Keybinds + Interaction Menu @@ -325,6 +345,7 @@ 단축키및 상호작용 메뉴 键盘 + 互动选单 鍵盤 + 互動選單 + Tuş Atamaları + Etkileşim Menüsü diff --git a/addons/gforces/ACE_Settings.hpp b/addons/gforces/ACE_Settings.hpp index dbe6dec13a3..e9702654671 100644 --- a/addons/gforces/ACE_Settings.hpp +++ b/addons/gforces/ACE_Settings.hpp @@ -1,8 +1,5 @@ class ACE_Settings { class GVAR(enabledFor) { - displayName = CSTRING(enabledFor_displayName); - typeName = "SCALAR"; - value = 1; - values[] = {ECSTRING(Common,Disabled), CSTRING(enabledFor_onlyAircraft), ECSTRING(Common,Enabled)}; + movedToSQF = 1; }; }; diff --git a/addons/gforces/XEH_preInit.sqf b/addons/gforces/XEH_preInit.sqf index 7530cabc451..4987bcc61d8 100644 --- a/addons/gforces/XEH_preInit.sqf +++ b/addons/gforces/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + GVAR(GForces) = []; GVAR(GForces_Index) = 0; diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index a5aee2d18e4..77f144e2f76 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -29,7 +29,7 @@ private _accel = ((_newVel vectorDiff GVAR(oldVel)) vectorMultiply (1 / INTERVAL // Cap maximum G's to +- 10 to avoid g-effects when the update is low fps. private _currentGForce = (((_accel vectorDotProduct vectorUp (vehicle ACE_player)) / 9.8) max -10) min 10; -GVAR(GForces) set [GVAR(GForces_Index), _currentGForce]; +GVAR(GForces) set [GVAR(GForces_Index), _currentGForce * GVAR(coef)]; GVAR(GForces_Index) = (GVAR(GForces_Index) + 1) % 30; // 30 = round (AVERAGEDURATION / INTERVAL); GVAR(oldVel) = _newVel; @@ -72,7 +72,7 @@ private _gBlackOut = MAXVIRTUALG / _classCoef + MAXVIRTUALG / _suitCoef - MAXVIR // Unconsciousness if ((_average > _gBlackOut) and {isClass (configFile >> "CfgPatches" >> "ACE_Medical") and {!(ACE_player getVariable ["ACE_isUnconscious", false])}}) then { - [ACE_player, true, (10 + floor(random 5))] call EFUNC(medical,setUnconscious); + [ACE_player, true, (10 + floor(random 5)), true] call EFUNC(medical,setUnconscious); }; GVAR(GForces_CC) ppEffectAdjust [1,1,0,[0,0,0,1],[0,0,0,0],[1,1,1,1],[10,10,0,0,0,0.1,0.5]]; @@ -80,14 +80,14 @@ GVAR(GForces_CC) ppEffectAdjust [1,1,0,[0,0,0,1],[0,0,0,0],[1,1,1,1],[10,10,0,0, if !(ACE_player getVariable ["ACE_isUnconscious", false]) then { if (_average > 0.30 * _gBlackOut) then { private _strength = ((_average - 0.30 * _gBlackOut) / (0.70 * _gBlackOut)) max 0; - GVAR(GForces_CC) ppEffectAdjust [1,1,0,[0,0,0,1],[0,0,0,0],[1,1,1,1],[2*(1-_strength),2*(1-_strength),0,0,0,0.1,0.5]]; + GVAR(GForces_CC) ppEffectAdjust [1,1,0,[0,0,0,1],[0,0,0,0],[1,1,1,1],[2 * (1 - _strength),2 * (1 - _strength),0,0,0,0.1,0.5]]; addCamShake [_strength, 1, 15]; } else { private _gRedOut = MINVIRTUALG / _classCoef; if (_average < -0.30 * _gRedOut) then { private _strength = ((abs _average - 0.30 * _gRedOut) / (0.70 * _gRedOut)) max 0; - GVAR(GForces_CC) ppEffectAdjust [1,1,0,[1,0.2,0.2,1],[0,0,0,0],[1,1,1,1],[2*(1-_strength),2*(1-_strength),0,0,0,0.1,0.5]]; + GVAR(GForces_CC) ppEffectAdjust [1,1,0,[1,0.2,0.2,1],[0,0,0,0],[1,1,1,1],[2 * (1 - _strength),2 * ( 1 -_strength),0,0,0,0.1,0.5]]; addCamShake [_strength / 1.5, 1, 15]; }; }; diff --git a/addons/gforces/initSettings.sqf b/addons/gforces/initSettings.sqf new file mode 100644 index 00000000000..2ea9dd12ef6 --- /dev/null +++ b/addons/gforces/initSettings.sqf @@ -0,0 +1,20 @@ + +[ + QGVAR(enabledFor), + "LIST", + [LLSTRING(enabledFor_displayName)], + LLSTRING(Category), + [[0, 1, 2], [LELSTRING(Common,Disabled), LLSTRING(enabledFor_onlyAircraft), LELSTRING(Common,Enabled)], 1], + true, + {[QGVAR(enabledFor), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_fnc_addSetting; + +[ + QGVAR(coef), + "SLIDER", + [LLSTRING(Coefficient_DisplayName), LLSTRING(Coefficient_Description)], + LLSTRING(Category), + [0, 1, 1, 0, true], + true +] call CBA_fnc_addSetting; diff --git a/addons/gforces/stringtable.xml b/addons/gforces/stringtable.xml index 737188f76b8..610e41c09bb 100644 --- a/addons/gforces/stringtable.xml +++ b/addons/gforces/stringtable.xml @@ -1,12 +1,18 @@ - - + + + ACE G-Forces + ACE Przeciążenia + ACE Force gravitationnelle + ACE Перегрузки + + Gforces Effects Effekte der G-Kräfte - Efectos Gforces + Efectos de fuerza G G Force efekty - Efeitos de ForçaG + Efeitos da Força G Effets de force gravitationnelle Эффекты перегрузок G による効果 @@ -15,8 +21,9 @@ Effetti forza G G力影响 G力影響 + G-Kuvveti Efekti - + Only Aircraft Nur Luftfahrzeug Sólo Aeronave @@ -30,15 +37,33 @@ Solo Aerei 只有战斗机 只有戰鬥機 + Sadece Uçaklar - + G-force reduction - Reduction des Gs + G-Kräfte Reduzierung + Réduction des Gs 耐 G 性 减少G力 減少G力 Riduzione forza G Redukcja przeciążenia + Уменьшение перегрузок + Redução de Força-G + Redukce G Force + Reducción de fuerzas G + + + G-Force Coefficient + Współczynnk przeciążenia + Coefficient de force gravitationnelle + Коэффициент перегрузки + + + Controls strength of G-Force affecting players. + Wpływa na siłe przeciążeń oddziałujących na graczy + Coefficient permettant d'ajuster le niveau de force gravitationnelle affectant les joueurs. + Определяет силу перегрузок, влияющих на игроков. diff --git a/addons/goggles/CfgVehicles.hpp b/addons/goggles/CfgVehicles.hpp new file mode 100644 index 00000000000..c9cdf702937 --- /dev/null +++ b/addons/goggles/CfgVehicles.hpp @@ -0,0 +1,14 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(wipeGlasses) { + displayName = CSTRING(WipeGlasses); + condition = QUOTE(GVAR(showClearGlasses) && {call FUNC(canWipeGlasses)}); + statement = QUOTE(call FUNC(clearGlasses)); + }; + }; + }; + }; +}; diff --git a/addons/goggles/XEH_PREP.hpp b/addons/goggles/XEH_PREP.hpp index ba198439b56..fdbb4f9fef6 100644 --- a/addons/goggles/XEH_PREP.hpp +++ b/addons/goggles/XEH_PREP.hpp @@ -17,6 +17,7 @@ PREP(isGogglesVisible); PREP(isInRotorWash); // general +PREP(canWipeGlasses); PREP(clearGlasses); PREP(getExplosionIndex); diff --git a/addons/goggles/XEH_postInit.sqf b/addons/goggles/XEH_postInit.sqf index a1a7c534605..a128c36ad76 100644 --- a/addons/goggles/XEH_postInit.sqf +++ b/addons/goggles/XEH_postInit.sqf @@ -3,12 +3,12 @@ if (!hasInterface) exitWith {}; ["ACE3 Common", QGVAR(wipeGlasses), localize LSTRING(WipeGlasses), { - if (GVAR(effects) != 2) exitWith {false}; //Can only wipe if full effects setting is set - if (!GETVAR(ace_player,ACE_isUnconscious,false)) exitWith { - call FUNC(clearGlasses); - true - }; - false + // Conditions: specific + if !(call FUNC(canWipeGlasses)) exitWith {false}; + + call FUNC(clearGlasses); + + true }, {false}, [20, [true, true, false]], false] call CBA_fnc_addKeybind; @@ -133,12 +133,16 @@ if (!hasInterface) exitWith {}; }] call CBA_fnc_addEventHandler; + // Handle "rain is snow" maps like CUP's Chernarus Winter + private _rainSpeed = getNumber (configFile >> "CfgWorlds" >> worldName >> "RainParticles" >> "dropSpeed"); + GVAR(mapHasRain) = _rainSpeed > 10; // CAWorld default is 25, Chernarus_Winter is 1 + // goggles effects main PFH [{ BEGIN_COUNTER(goggles); // rain - call FUNC(applyRainEffect); + if (GVAR(mapHasRain)) then FUNC(applyRainEffect); // auto remove effects under water if (GVAR(EffectsActive) && {underwater ACE_player} && {[goggles ACE_player] call FUNC(isDivingGoggles)}) then { diff --git a/addons/goggles/XEH_preInit.sqf b/addons/goggles/XEH_preInit.sqf index b47cf6628db..9361d05015e 100644 --- a/addons/goggles/XEH_preInit.sqf +++ b/addons/goggles/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/goggles/anim/model.cfg b/addons/goggles/anim/model.cfg index da614e05db1..dbe5bce4a65 100644 --- a/addons/goggles/anim/model.cfg +++ b/addons/goggles/anim/model.cfg @@ -1,4 +1,3 @@ - class CfgSkeletons { class Default { isDiscrete = 1; @@ -11,122 +10,114 @@ class CfgSkeletons { skeletonInherit = ""; skeletonBones[] = { "Pelvis","", - "Spine","Pelvis", - "Spine1","Spine", - "Spine2","Spine1", - "Spine3","Spine2", - "Camera","Pelvis", - "weapon","Spine1", - "launcher","Spine1", - - //Head skeleton in hierarchy - "neck","Spine3", - "neck1","neck", - "head","neck1", - - //New facial features - "Face_Hub","head", - "Face_Jawbone","Face_Hub", - "Face_Jowl","Face_Jawbone", - "Face_chopRight","Face_Jawbone", - "Face_chopLeft","Face_Jawbone", - "Face_LipLowerMiddle","Face_Jawbone", - "Face_LipLowerLeft","Face_Jawbone", - "Face_LipLowerRight","Face_Jawbone", - "Face_Chin","Face_Jawbone", - "Face_Tongue","Face_Jawbone", - "Face_CornerRight","Face_Hub", - "Face_CheekSideRight","Face_CornerRight", - "Face_CornerLeft","Face_Hub", - "Face_CheekSideLeft","Face_CornerLeft", - "Face_CheekFrontRight","Face_Hub", - "Face_CheekFrontLeft","Face_Hub", - "Face_CheekUpperRight","Face_Hub", - "Face_CheekUpperLeft","Face_Hub", - "Face_LipUpperMiddle","Face_Hub", - "Face_LipUpperRight","Face_Hub", - "Face_LipUpperLeft","Face_Hub", - "Face_NostrilRight","Face_Hub", - "Face_NostrilLeft","Face_Hub", - "Face_Forehead","Face_Hub", - "Face_BrowFrontRight","Face_Forehead", - "Face_BrowFrontLeft","Face_Forehead", - "Face_BrowMiddle","Face_Forehead", - "Face_BrowSideRight","Face_Forehead", - "Face_BrowSideLeft","Face_Forehead", - "Face_Eyelids","Face_Hub", - "Face_EyelidUpperRight","Face_Hub", - "Face_EyelidUpperLeft","Face_Hub", - "Face_EyelidLowerRight","Face_Hub", - "Face_EyelidLowerLeft","Face_Hub", - "EyeLeft","Face_Hub", - "EyeRight","Face_Hub", - + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", + "camera","Pelvis",// case has changed for arma3 + "weapon","Spine1", + "launcher","Spine1", + "Neck","Spine3", + "Neck1","Neck", + "Head","Neck1", //Head skeleton in hierarchy //Left upper side - "LeftShoulder","Spine3", - "LeftArm","LeftShoulder", - "LeftArmRoll","LeftArm", - "LeftForeArm","LeftArmRoll", - "LeftForeArmRoll","LeftForeArm", - "LeftHand","LeftForeArmRoll", - "LeftHandRing","LeftHand", - "LeftHandRing1","LeftHandRing", - "LeftHandRing2","LeftHandRing1", - "LeftHandRing3","LeftHandRing2", - "LeftHandPinky1","LeftHandRing", - "LeftHandPinky2","LeftHandPinky1", - "LeftHandPinky3","LeftHandPinky2", - "LeftHandMiddle1","LeftHand", - "LeftHandMiddle2","LeftHandMiddle1", - "LeftHandMiddle3","LeftHandMiddle2", - "LeftHandIndex1","LeftHand", - "LeftHandIndex2","LeftHandIndex1", - "LeftHandIndex3","LeftHandIndex2", - "LeftHandThumb1","LeftHand", - "LeftHandThumb2","LeftHandThumb1", - "LeftHandThumb3","LeftHandThumb2", - + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", //Right upper side - "RightShoulder","Spine3", - "RightArm","RightShoulder", - "RightArmRoll","RightArm", - "RightForeArm","RightArmRoll", - "RightForeArmRoll","RightForeArm", - "RightHand","RightForeArmRoll", - "RightHandRing","RightHand", - "RightHandRing1","RightHandRing", - "RightHandRing2","RightHandRing1", - "RightHandRing3","RightHandRing2", - "RightHandPinky1","RightHandRing", - "RightHandPinky2","RightHandPinky1", - "RightHandPinky3","RightHandPinky2", - "RightHandMiddle1","RightHand", - "RightHandMiddle2","RightHandMiddle1", - "RightHandMiddle3","RightHandMiddle2", - "RightHandIndex1","RightHand", - "RightHandIndex2","RightHandIndex1", - "RightHandIndex3","RightHandIndex2", - "RightHandThumb1","RightHand", - "RightHandThumb2","RightHandThumb1", - "RightHandThumb3","RightHandThumb2", - - //Left lower side - "LeftUpLeg","Pelvis", - "LeftUpLegRoll","LeftUpLeg", - "LeftLeg","LeftUpLegRoll", - "LeftLegRoll","LeftLeg", - "LeftFoot","LeftLegRoll", - "LeftToeBase","LeftFoot", - - //Right lower side - "RightUpLeg","Pelvis", - "RightUpLegRoll","RightUpLeg", - "RightLeg","RightUpLegRoll", - "RightLegRoll","RightLeg", - "RightFoot","RightLegRoll", - "RightToeBase","RightFoot" - }; - + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot", + //New facial features arma3 only + "Face_Hub","Head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub" + };// end of skeleton array // location of pivot points (local axes) for hierarchical animation pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d"; }; diff --git a/addons/goggles/config.cpp b/addons/goggles/config.cpp index 9102b7fbf01..5d0d8bbaf1d 100644 --- a/addons/goggles/config.cpp +++ b/addons/goggles/config.cpp @@ -16,6 +16,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" #define COMBAT_GOGGLES ACE_Overlay = QPATHTOF(textures\HUD\CombatGoggles.paa); \ ACE_OverlayCracked = QPATHTOF(textures\HUD\CombatGogglesCracked.paa); \ @@ -34,10 +35,21 @@ class CfgGlasses { ACE_DustPath = QPATHTOF(textures\fx\dust\%1.paa); }; + class G_Blindfold_01_base_F: None { + ACE_Overlay = QPATHTOF(textures\HUD\blindfold_ca.paa); + ACE_OverlayCracked = ""; + ACE_Resistance = 2; + ACE_Protection = 1; + }; + class G_Combat:None { COMBAT_GOGGLES }; + class G_Combat_Goggles_tna_F: None { + COMBAT_GOGGLES + }; + class G_Diving { ACE_Overlay = QPATHTOF(textures\HUD\DivingGoggles.paa); ACE_OverlayCracked = QPATHTOF(textures\HUD\DivingGogglesCracked.paa); @@ -179,6 +191,16 @@ class CfgGlasses { ACE_Protection = 1; }; + class G_Balaclava_TI_blk_F; + class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F { + COMBAT_GOGGLES + }; + + class G_Balaclava_TI_tna_F; + class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F { + COMBAT_GOGGLES + }; + class G_Bandanna_blk; class G_Bandanna_shades:G_Bandanna_blk { ACE_TintAmount=COLOUR*2; @@ -197,6 +219,16 @@ class CfgGlasses { ACE_Resistance = 1; ACE_Protection = 1; }; + + class G_EyeProtectors_base_F; + class G_EyeProtectors_F: G_EyeProtectors_base_F { + ACE_Resistance = 1; + ACE_Protection = 1; + }; + class G_EyeProtectors_Earpiece_F: G_EyeProtectors_base_F { + ACE_Resistance = 1; + ACE_Protection = 1; + }; }; #include "RscTitles.hpp" diff --git a/addons/goggles/functions/fnc_canWipeGlasses.sqf b/addons/goggles/functions/fnc_canWipeGlasses.sqf new file mode 100644 index 00000000000..e6dc89b3cef --- /dev/null +++ b/addons/goggles/functions/fnc_canWipeGlasses.sqf @@ -0,0 +1,18 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Checks if player can wipe goggles. + * + * Arguments: + * None + * + * Return Value: + * Can wipe goggles + * + * Example: + * [] call ace_goggles_fnc_canWipeGlasses + * + * Public: No + */ + +GVAR(effects) == 2 && {!GETVAR(ACE_player,ACE_isUnconscious,false)} // return diff --git a/addons/goggles/initSettings.sqf b/addons/goggles/initSettings.sqf new file mode 100644 index 00000000000..c8e88548ad7 --- /dev/null +++ b/addons/goggles/initSettings.sqf @@ -0,0 +1,8 @@ +[ + QGVAR(showClearGlasses), + "CHECKBOX", + [LSTRING(SettingShowClearGlasses), LELSTRING(common,showActionInSelfInteraction)], + localize LSTRING(SettingsName), + false, // default value + 0 // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index a4be10b0fc2..52473e8b61a 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -10,22 +10,45 @@ ゴーグル 고글 Gogle + Очки + Óculos + Lunettes + Brýle + Gafas + Gözlük + + + ACE Goggles + ACE Schutzbrille + ACE Occhiali + ACE 護目鏡 + ACE 护目镜 + ACE ゴーグル + ACE 고글 + ACE Gogle + ACE Очки + ACE Óculos + ACE Lunettes + ACE Brýle + [ACE] Gafas + ACE Gözlük Show Goggle Effects in Third Person Brilleneffekt in dritter Person anzeigen Mostrar efectos de las gafas en tercera persona Zobrazit efekt brýlí v třetí osobě - Effets de lunettes à la 3ème personne + Effets des lunettes à la 3ème personne Отображать эффект очков от третьего лица Szemüveg-effekt mutatása külső nézetből Włącz efekty gogli w trzeciej osobie Mostrar efeitos de óculos em Terceira Pessoa Attiva l'effetto degli occhiali in terza persona - 三人称視点でもゴーグルによる効果を出す + 三人称視点でもゴーグルによる効果を表示 3인칭시에도 고글 효과를 보이게 합니다 在第三人称视角显示护目镜效果 在第三人稱視角顯示護目鏡效果 + Gözlük efektlerini 3. şahıs görünümün de göster Wipe Goggles @@ -42,6 +65,7 @@ 고글 닦기 擦拭护目镜 擦拭護目鏡 + Gözlük Camlarını Sil Goggle Effects @@ -54,6 +78,10 @@ Effetti Occhiali 护目镜效果 護目鏡效果 + Efeitos de Óculos + Efekty brýlí + Efectos de gafas + Gözlük efektleri Tint @@ -66,6 +94,10 @@ Colore 染色 染色 + Cor + Zabarvení + Tinte + Ton Tint + Effects @@ -78,6 +110,24 @@ Colore + Effetti 染色 + 影响 染色 + 影響 + Cor + Efeitos + Zabarvení + Efekty + Tinte + efectos + Ton + Efektler + + + Show Wipe Goggles self interaction + Zeige "Brille abwischen" im Selbstinteraktionsmenü + Pokaż interakcję Wyczyść Gogle + Mostra interazione automatica per la pulizia degli occhiali + Ukaž Vyčistit brýle v menu Interakce (vlastní) + ゴーグル拭き取りをセルフ インタラクションに表示 + 在自我互動中顯示擦拭護目鏡的動作 + Afficher l'interaction "Essuyer les lunettes" + Mostra a auto-interação de limpar os óculos + Mostrar limpiar gafas en menú de auto-interacción + Kendi etkileşim menüsün de gözlük camlarını silmeyi göster + Показывать Протереть очки в меню взаимодействия с собой diff --git a/addons/goggles/textures/HUD/blindfold_ca.paa b/addons/goggles/textures/HUD/blindfold_ca.paa new file mode 100644 index 00000000000..460cf649b3b Binary files /dev/null and b/addons/goggles/textures/HUD/blindfold_ca.paa differ diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index c52ec34d047..e88c2196d96 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -119,6 +119,16 @@ class CfgAmmo { effectsSmoke = "ACE_M84FlashbangEffect"; whistleDist = 0; }; + + class ACE_G_CTS9: ACE_G_M84 { + GVAR(flashbang) = 1; + GVAR(flashbangBangs) = 9; + GVAR(flashbangInterval) = 0.5; + GVAR(flashbangIntervalMaxDeviation) = 0.35; + model = QPATHTOF(models\ACE_CTS_9bang_thrown.p3d); + explosionTime = 1.5; + timeToLive = 10; + }; class Chemlight_base: SmokeShell { GVAR(pullPinSound)[] = {"A3\sounds_f\weapons\Other\dry4.wss", 3, 2, 10}; diff --git a/addons/grenades/CfgMagazineWells.hpp b/addons/grenades/CfgMagazineWells.hpp index 0ce8abca356..7ac4a555dde 100644 --- a/addons/grenades/CfgMagazineWells.hpp +++ b/addons/grenades/CfgMagazineWells.hpp @@ -2,4 +2,7 @@ class CfgMagazineWells { class CBA_40mm_M203 { ADDON[] = {"ACE_40mm_flare_white", "ACE_40mm_flare_red", "ACE_40mm_flare_green", "ACE_40mm_flare_ir"}; }; + class UGL_40x36 { + ADDON[] = {"ACE_40mm_flare_white", "ACE_40mm_flare_red", "ACE_40mm_flare_green", "ACE_40mm_flare_ir"}; + }; }; diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 7faf13c9e15..b5ae52d6cee 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -64,6 +64,17 @@ class CfgMagazines { ammo = "ACE_G_M84"; mass = 4; }; + + class ACE_CTS9: HandGrenade { + author = ECSTRING(common,ACETeam); + displayname = CSTRING(CTS9_Name); + descriptionShort = CSTRING(M84_Description); + displayNameShort = CSTRING(CTS9_NameShort); + model = QPATHTOF(models\ACE_CTS_9bang.p3d); + picture = QPATHTOF(UI\ace_cts9_x_ca.paa); + ammo = "ACE_G_CTS9"; + mass = 4; + }; class SmokeShell; class ACE_M14: SmokeShell { diff --git a/addons/grenades/CfgWeapons.hpp b/addons/grenades/CfgWeapons.hpp index 832be6fe739..6aad2054376 100644 --- a/addons/grenades/CfgWeapons.hpp +++ b/addons/grenades/CfgWeapons.hpp @@ -2,7 +2,7 @@ class CfgWeapons { class GrenadeLauncher; class Throw: GrenadeLauncher { - muzzles[] += {"ACE_HandFlare_WhiteMuzzle","ACE_HandFlare_RedMuzzle","ACE_HandFlare_GreenMuzzle","ACE_HandFlare_YellowMuzzle","ACE_M84Muzzle","ACE_M14Muzzle"}; + muzzles[] += {"ACE_HandFlare_WhiteMuzzle","ACE_HandFlare_RedMuzzle","ACE_HandFlare_GreenMuzzle","ACE_HandFlare_YellowMuzzle","ACE_M84Muzzle","ACE_M14Muzzle","ACE_CTS9Muzzle"}; class ThrowMuzzle; class ACE_HandFlare_WhiteMuzzle: ThrowMuzzle { @@ -28,5 +28,9 @@ class CfgWeapons { class ACE_M14Muzzle: ThrowMuzzle { magazines[] = {"ACE_M14"}; }; + + class ACE_CTS9Muzzle: ThrowMuzzle { + magazines[] = {"ACE_CTS9"}; + }; }; }; diff --git a/addons/grenades/UI/ace_cts9_x_ca.paa b/addons/grenades/UI/ace_cts9_x_ca.paa new file mode 100644 index 00000000000..dfb775c23b8 Binary files /dev/null and b/addons/grenades/UI/ace_cts9_x_ca.paa differ diff --git a/addons/grenades/config.cpp b/addons/grenades/config.cpp index 326308a5eb3..945814796ac 100644 --- a/addons/grenades/config.cpp +++ b/addons/grenades/config.cpp @@ -10,7 +10,8 @@ class CfgPatches { "ACE_HandFlare_Green", "ACE_HandFlare_Yellow", "ACE_M84", - "ACE_M14" + "ACE_M14", + "ACE_CTS9" }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 37e9a10845a..39ad6fb7066 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -27,6 +27,7 @@ if (hasInterface) then { _light setLightAmbient [1,1,1]; _light setLightColor [1,1,1]; _light setLightDayLight true; + _light setLightAttenuation [0, 1, 5, 1000, 0, 20]; // Reduce the light after 0.1 seconds [{ @@ -46,7 +47,7 @@ private _affected = (ASLtoAGL _grenadePosASL) nearEntities ["CAManBase", 20]; _affected = _affected - [ACE_player]; { if (local _x && {alive _x}) then { - private _strength = 1 - (((getPosASL _x) vectorDistance _grenadePosASL) min 20) / 20; + private _strength = 1 - (((eyePos _x) vectorDistance _grenadePosASL) min 20) / 20; TRACE_3("FlashBangEffect Start",_x,((getPosASL _x) vectorDistance _grenadePosASL),_strength); @@ -54,9 +55,9 @@ _affected = _affected - [ACE_player]; _x setSkill (skill _x / 50); - if (_strength > 0.2) then { - _x setVectorDir ((getPosASL _x) vectorDiff _grenadePosASL); - }; + // Make AI try to look away + private _dirToFlash = _x getDir _grenadePosASL; + _x setDir (_dirToFlash + linearConversion [0.2, 1, _strength, 40, 135] * selectRandom [-1, 1]); [{ params ["_unit"]; @@ -73,6 +74,9 @@ _affected = _affected - [ACE_player]; // Affect local player, independently of distance if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then { + if ((getNumber (configFile >> "CfgVehicles" >> (typeOf ACE_player) >> "isPlayableLogic")) == 1) exitWith { + TRACE_1("skipping playable logic",typeOf ACE_player); // VirtualMan_F (placeable logic zeus / spectator) + }; // Do effects for player // is there line of sight to the grenade? private _eyePos = eyePos ACE_player; //PositionASL @@ -92,8 +96,10 @@ if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then { _strength = _strength * _losCoefficient; // Add ace_hearing ear ringing sound effect - if (isClass (configFile >> "CfgPatches" >> "ACE_Hearing") && {_strength > 0}) then { - [40 * _strength] call EFUNC(hearing,earRinging); + if (isClass (configFile >> "CfgPatches" >> "ACE_Hearing") && {_strength > 0 && {EGVAR(hearing,damageCoefficent) > 0.25}}) then { + private _earringingStrength = 40 * _strength; + [_earringingStrength] call EFUNC(hearing,earRinging); + TRACE_1("Earringing Strength",_earringingStrength); }; // add ace_medical pain effect: @@ -134,8 +140,11 @@ if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then { }, [], 17 * _strength] call CBA_fnc_waitAndExecute; }; - if (_strength > 0.2) then { - ACE_player setVectorDir (_eyePos vectorDiff _grenadePosASL); - }; + // Make player flinch + if (_strength <= 0.2) exitWith {}; + private _minFlinch = linearConversion [0.2, 1, _strength, 0, 60, true]; + private _maxFlinch = linearConversion [0.2, 1, _strength, 0, 95, true]; + private _flinch = (_minFlinch + random (_maxFlinch - _minFlinch)) * selectRandom [-1, 1]; + ACE_player setDir (getDir ACE_player + _flinch); }; true diff --git a/addons/grenades/functions/fnc_incendiary.sqf b/addons/grenades/functions/fnc_incendiary.sqf index b07ed48fb3a..d454001031f 100644 --- a/addons/grenades/functions/fnc_incendiary.sqf +++ b/addons/grenades/functions/fnc_incendiary.sqf @@ -229,7 +229,10 @@ private _enginePosition = _vehicle modelToWorld (_vehicle selectionPosition _eng if (_position distance _enginePosition < EFFECT_SIZE * 2) then { _vehicle setHit [_engineSelection, 1]; - if ("ace_cookoff" call EFUNC(common,isModLoaded) && {EGVAR(cookoff,enable)}) then { - _vehicle call EFUNC(cookoff,engineFire); + if ("ace_cookoff" call EFUNC(common,isModLoaded)) then { + private _enabled = _vehicle getVariable [QEGVAR(cookoff,enable), EGVAR(cookoff,enable)]; + if (_enabled in [2, true] || {_enabled isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} != -1}}) then { + _vehicle call EFUNC(cookoff,engineFire); + }; }; }; diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 0fe0c483d96..1c8066dec2e 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -37,9 +37,31 @@ if (local _unit) then { }; if (getNumber (_config >> QGVAR(flashbang)) == 1) then { - private _fuzeTime = getNumber (_config >> "explosionTime"); + private _bangs = 1; + private _entry = _config >> QGVAR(flashbangBangs); + if (isNumber _entry || isText _entry) then { + _bangs = getNumber _entry; + }; + + private _fuzeTimeBase = getNumber (_config >> "explosionTime"); + + private _interval = 0.5; + _entry = _config >> QGVAR(flashbangInterval); + if (isNumber _entry || isText _entry) then { + _interval = getNumber _entry; + }; - [FUNC(flashbangThrownFuze), [_projectile], _fuzeTime] call CBA_fnc_waitAndExecute; + private _maxDeviation = 0.1; + _entry = _config >> QGVAR(flashbangIntervalMaxDeviation); + if (isNumber _entry || isText _entry) then { + _maxDeviation = getNumber _entry; + }; + + for "_i" from 0 to (_bangs - 1) do { + private _fuzeTime = _fuzeTimeBase + _i*_interval + random [- _maxDeviation, 0, _maxDeviation]; + + [FUNC(flashbangThrownFuze), [_projectile], _fuzeTime] call CBA_fnc_waitAndExecute; + }; }; }; diff --git a/addons/grenades/models/ACE_CTS_9bang.p3d b/addons/grenades/models/ACE_CTS_9bang.p3d new file mode 100644 index 00000000000..aedd244c370 Binary files /dev/null and b/addons/grenades/models/ACE_CTS_9bang.p3d differ diff --git a/addons/grenades/models/ACE_CTS_9bang_thrown.p3d b/addons/grenades/models/ACE_CTS_9bang_thrown.p3d new file mode 100644 index 00000000000..646a8b71618 Binary files /dev/null and b/addons/grenades/models/ACE_CTS_9bang_thrown.p3d differ diff --git a/addons/grenades/models/ACE_M84.p3d b/addons/grenades/models/ACE_M84.p3d index e24ff378809..f3e41198738 100644 Binary files a/addons/grenades/models/ACE_M84.p3d and b/addons/grenades/models/ACE_M84.p3d differ diff --git a/addons/grenades/models/ACE_M84_thrown.p3d b/addons/grenades/models/ACE_M84_thrown.p3d index 0b206cfada4..20f322c643f 100644 Binary files a/addons/grenades/models/ACE_M84_thrown.p3d and b/addons/grenades/models/ACE_M84_thrown.p3d differ diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index e208aa183d0..a7ac8557f58 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -7,7 +7,7 @@ Cambiar modo de granada Przełącz sposób rzutu granatem Změnit styl hodu granátu - Changer type de lancer de grenade + Changer le mode de jet des grenades Сменить режим броска гранаты Gránátkezelési mód váltása Cambia tipo di granata @@ -16,6 +16,7 @@ 투척 종류 전환 切换投掷模式 切換投擲模式 + Bomba fırlatma modunu değiştir Normal Throw @@ -23,7 +24,7 @@ Lanzamiento normal Normalny rzut Normální hod - Lancer normal + Lancé normal Нормальный бросок Normál dobás Lancio normale @@ -32,6 +33,7 @@ 일반 던지기 普通投掷 普通投擲 + Normal Fırlatma High Throw @@ -39,7 +41,7 @@ Lanzamiento alto Wysoki rzut Vysoký hod - Lancer haut + Lancé haut Высокий бросок Magas dobás Lancio verso l'alto @@ -48,6 +50,7 @@ 높이 던지기 高抛 高拋 + Yüksek Fırlatma Precise Throw @@ -55,7 +58,7 @@ Lanzamiento preciso Precyzyjny rzut Přesný hod - Lancer précis + Lancé précis Точный бросок Pontos dobás Lancio preciso @@ -64,6 +67,7 @@ 정확한 던지기 精准投掷 精準投擲 + Yakına Fırlatma Roll Grenade @@ -71,7 +75,7 @@ Lanzamiento raso Po ziemi Po zemi - Lancer roulé + Lancé roulé Катить гранату Gránát gurítása Fai rotolare la granata @@ -80,6 +84,7 @@ 굴려넣기 地面滚抛 地面滾拋 + Bombayı Yuvarla Drop Grenade @@ -96,6 +101,7 @@ 떨어뜨리기 下丢投掷 下丟投擲 + Bombayı Yere Bırak M84 Stun Grenade @@ -112,6 +118,7 @@ M84 섬광 수류탄 M84 震撼弹 M84 震撼彈 + M84 Sersemletici El Bombası M84 @@ -128,15 +135,16 @@ M84 M84 M84 + M84 Also known as flashbang. Causes immediate flash blindness, deafness, tinnitus, and inner ear disturbance. Verursacht temporäre Blind- und Taubheit. Tambien conocida como granada cegadora. Produce de manera inmediata ceguera, sordera, tinitus y afecta el oído interior. - Aussi connu en tant que "Flashbang". Explose en causant cécité, surdité, bourdonnements d'oreilles et perturbation de l'oreille interne. + Aussi connue sous le nom de "Flashbang". Elle provoque immédiatement cécité, surdité, acouphènes et troubles de l'oreille interne. Znany też jako flashbang. Powoduje natychmiastową tymczasową ślepotę, głuchotę, dzwonienie w uszach i inne zaburzenia ucha wewnętrznego. Omračující granát je taktická nesmrtící zbraň používaná při záchraně rukojmí a zvládání davu. - XM84 (M84) - граната нелетального действия, и предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. + XM84 (M84) - граната нелетального действия, предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. Villanógránát néven is ismert. Azonnali villanási vakságot, süketséget, fülzúgást, és belső füli zavart okoz. Anche conosciuta come flashbang. Causa accecamento immediato, sensazioni di sposatezza, mancanza d'equilibrio e disturbi al timpano. Também conhecida como flashbang. Causa uma clarão imediato, cegueira, surdez, zumbido e distúrbio no tímpano. @@ -144,6 +152,37 @@ 플래시뱅이라고도 알려져있습니다. 사용즉시 섬광으로 인한 시력장애, 청각장애, 이명, 내이기관방해를 유발합니다. 也被称为闪光弹,会造成暂时性失明,耳聋,耳鸣等效果。 也被稱為閃光彈,會造成暫時性失明,耳聾,耳鳴等效果 + Flashbang olarak da bilinir. Ani flaş körlüğü, sağırlık, kulak çınlaması ve iç kulak rahatsızlığına neden olur. + + + CTS 7290 9-bang Flash Grenade + CTS 7290 9-fach Blendgranate + CTS 7290-9 9閃 閃光彈 + CTS 7290 9- Flash bang Grenade + CTS 7290 9 ranný oslepující granát + CTS 7290 9-bang 閃光手榴弾 + CTS 7290 9-bang Granat Hukowy + CTS 7290 9-bang Grenade incapacitante + Granada de Luz CTS 7290 9-Explosões + CTS 7290 9- Flaş Bombası + CTS 7290-9 Светошумовая граната + + + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 + CTS 7290-9 M127A1 Hand Held Signal (White) @@ -155,11 +194,12 @@ M127A1 Sinalizador (Branco) M127A1 Фальшфейер (Белый) Bengala M127A1 (Blanca) - M127A1 Feux à main (Blanc) + M127A1 Feu à main (Blanc) M127A1 信号弾 (白) M127A1 신호탄 (하얀색) M127A1 手持式信号弹 (白色) M127A1 手持式信號彈 (白色) + M127A1 El Sinyali (Beyaz) M127A1 Hand Held Signal (Red) @@ -171,11 +211,12 @@ M127A1 Sinalizador (Vermelho) M127A1 Фальшфейер (Красный) Bengala M127A1 (Roja) - M127A1 Feux à main (Rouge) + M127A1 Feu à main (Rouge) M127A1 信号弾 (赤) M127A1 신호탄 (빨간색) M127A1 手持式信号弹 (红色) M127A1 手持式信號彈 (紅色) + M127A1 El Sinyali (Kırmızı) M127A1 Hand Held Signal (Green) @@ -187,11 +228,12 @@ M127A1 Sinalizador (Verde) M127A1 Фальшфейер (Зелёный) Bengala M127A1 (Verde) - M127A1 Feux à main (Vert) + M127A1 Feu à main (Vert) M127A1 信号弾 (緑) M127A1 신호탄 (초록색) M127A1 手持式信号弹 (绿色) M127A1 手持式信號彈 (綠色) + M127A1 El Sinyali (Yeşil) M127A1 Hand Held Signal (Yellow) @@ -201,13 +243,14 @@ M127A1 Bengala (Giallo) Flara ręczna sygnałowa M127A1 (żółta) M127A1 Sinalizador (Amarelo) - M127A1 Фальшфейер (Жёлтые) + M127A1 Фальшфейер (Жёлтый) Bengala M127A1 (Amarilla) - M127A1 Feux à main (Jaune) + M127A1 Feu à main (Jaune) M127A1 信号弾 (黄) M127A1 신호탄 (노란색) M127A1 手持式信号弹 (黄色) M127A1 手持式信號彈 (黃色) + M127A1 El Sinyali (Sarı) White Hand Flare @@ -219,11 +262,12 @@ Sinalizador de Mão (Branco) Фальшфейер (Белый) Bengala (Blanca) - Feux à main (Blanc) - 白の発炎筒 + Feu à main (Blanc) + 白の手持ち式信号弾 하얀색 불꽃신호기 白色手持式信号弹 白色手持式信號彈 + Beyaz el işaret fişeği Red Hand Flare @@ -235,11 +279,12 @@ Sinalizador de Mão (Vermelho) Фальшфейер (Красный) Bengala (Roja) - Feux à main (Rouge) - 赤の発炎筒 + Feu à main (Rouge) + 赤の手持ち式信号弾 빨간색 불꽃신호기 红色手持式信号弹 紅色手持式信號彈 + Kırmızı el işaret fişeği Green Hand Flare @@ -251,11 +296,12 @@ Sinalizador de Mão (Verde) Фальшфейер (Зелёный) Bengala (Verde) - Feux à main (Vert) - 緑の発炎筒 + Feu à main (Vert) + 緑の手持ち式信号弾 초록색 불꽃신호기 绿色手持式信号弹 綠色手持式信號彈 + Yeşil el işaret fişeği Yellow Hand Flare @@ -265,13 +311,14 @@ Bengala (Giallo) Flara ręczna (żółta) Sinalizador de Mão (Amarelo) - Фальшфейер (Жёлтые) + Фальшфейер (Жёлтый) Bengala (Amarilla) - Feux à main (Jaune) - 黄の発炎筒 + Feu à main (Jaune) + 黄の手持ち式信号弾 노란색 불꽃신호기 黄色手持式信号弹 黃色手持式信號彈 + Sarı el işaret fişeği M127A1 (White) @@ -288,6 +335,7 @@ M127A1 (하양) M127A1 (白色) M127A1 (白色) + M127A1 (Beyaz) M127A1 (Red) @@ -304,6 +352,7 @@ M127A1 (빨강) M127A1 (红色) M127A1 (紅色) + M127A1 (Kırmızı) M127A1 (Green) @@ -320,6 +369,7 @@ M127A1 (초록) M127A1 (绿色) M127A1 (綠色) + M127A1 (Yeşil) M127A1 (Yellow) @@ -330,12 +380,13 @@ M127A1 (Giallo) M127A1 (żółta) M127A1 (Amarelo) - M127A1 (Жёлтые) + M127A1 (Жёлтый) M127A1 (Amarilla) M127A1 (黄) M127A1 (노랑) M127A1 (黄色) M127A1 (黃色) + M127A1 (Sarı) AN-M14 Incendiary Grenade @@ -344,10 +395,12 @@ AN-M14 焼夷手榴弾 Granat zapalający AN-M14 AN-M14 소이 수류탄 - Grenade incendiaire AN-M14 + AN-M14 Grenade incendiaire AN-M14 Granata Incendiaria AN-M14 燃烧手榴弹 AN-M14 燃燒手榴彈 + Granada Incendiária AN-M14 + AN-M14 zápalný granát AN-M14 @@ -360,48 +413,100 @@ AN-M14 AN-M14 AN-M14 + AN-M14 + AN-M14 + AN-M14 Incendiary grenade used to destroy weapons, ammunition and other equipment. Brandsatzgranate. Verwendet um Waffen, Munition und andere Ausrüstung zu zerstören. Зажигательная граната используется для уничтожения оружия, боеприпасов и прочего оборудования. - 焼夷手榴弾は武器や弾薬箱などの装備を破壊するために使われます。 + 焼夷手榴弾は武器や弾薬箱などの装備を破壊する為に使われます。 Granat zapalający, używany do niszczenia broni, amunicji i innego sprzętu. 소이 수류탄은 무기나 탄약 그리고 장비를 파괴할때 쓰입니다. - Grenade incendiaire utilisé pour détruire des armes, munitions et autres équipements. + Grenade incendiaire utilisée pour détruire des armes, des munitions et d'autres équipements. Granata incendiaria usata per distruggere armi, munizioni e altri equipaggiamenti. 燃烧手榴弹是用来摧毁武器,弹药以及其他装备的好帮手。 燃燒手榴彈是用來摧毀武器,彈藥以及其他裝備的好幫手 + Granada Incendiária utilizada para destruir armas, munições e outros equipamentos. + Zápalný granát používaný ke zničení zbraní, munice a další výbavy. Type: Star Parachute Flare + Typ: Fallschirmfackel Typ: Gwiezdna Flara Spadochronowa Tipo: Granata a paracadute con bengala + 種類: パラシュート式照明弾 (星弾) + Тип: Осветительная ракета - звезда на парашюте + Tipo: Sinalizador de pára-quedas estrela + 類型:星式帶傘照明彈 + Type : Fusée éclairante à parachute + Typ: Světlice s padákem M583 Illumination Flare (White) + M583 Leuchtfackel (Weiß) M583 Flara oświetlająca (Biała) M583 Granata con bengala (Bianca) + M583 照明弾 (白) + M583 Осветит. ракета (Белая) + M583 Sinalizador de Iluminação (Branco) + M583 照明彈(白色) + M583 Fusée éclairante (Blanche) + M583 Světlice (Bílá) + M583 Aydınlatma Fişeği (Beyaz) M662 Illumination Flare (Red) + M662 Leuchtfackel (Rot) M662 Flara oświetlająca (Czerwona) M662 Granata con bengala (Rossa) + M662 照明弾 (赤) + M662 Осветит. ракета (Красная) + M662 Sinalizador de Iluminação (Vermelho) + M662 照明彈(紅色) + M662 Fusée éclairante (Rouge) + M662 Světlice (Červená) + M662 Aydınlatma Fişeği (Kırmızı) M661 Illumination Flare (Green) + M661 Leuchtfackel (Grün) M661 Flara oświetlająca (Zielona) M661 Granata con bengala (Verde) + M661 照明弾 (緑) + M661 Осветит. ракета (Зеленая) + M661 Sinalizador de Iluminação (Verde) + M661 照明彈(綠色) + M661 Fusée éclairante (Verte) + M661 Světlice (Zelená) + M661 Aydınlatma Fişeği (Yeşil) Type: Parachute IR Flare + Typ: Infrarote Fallschirmfackel Typ: Spadochronowa Flara IR Tipo: Granata a paracadute con infrarosso + 種類: パラシュート式赤外線照明弾 + Тип: ИК-осветительная ракета на парашюте + Tipo: Sinalizador Infravermelho de Pára-quedas + 類型:帶傘型紅外線照明彈 + Type : Fusée IR à parachute + Typ: Infračervená světlice s padákem + Tip : Paraşüt IR Flare M992 Illumination IR Flare + M992 IR Leuchtfackel M992 Oświetlająca flara IR M992 Granata con infrarosso + M992 赤外線照明弾 + M992 ИК-осветительная ракета + M992 Sinalizador de Iluminação Infravermelho + M992 紅外線照明彈 + M992 Fusée IR + M992 Infračervená světlice + M992 Illumination IR Flare diff --git a/addons/grenades/textures/ace_cts_9bang_co.paa b/addons/grenades/textures/ace_cts_9bang_co.paa new file mode 100644 index 00000000000..14c17ca4636 Binary files /dev/null and b/addons/grenades/textures/ace_cts_9bang_co.paa differ diff --git a/addons/gunbag/CfgVehicles.hpp b/addons/gunbag/CfgVehicles.hpp index e23966cfa24..a5cae40f770 100644 --- a/addons/gunbag/CfgVehicles.hpp +++ b/addons/gunbag/CfgVehicles.hpp @@ -10,6 +10,13 @@ class CfgVehicles { showDisabled = 0; icon = QPATHTOF(ui\gunbag_icon_ca.paa); }; + class GVAR(weaponSwap) { + displayName = CSTRING(SwapGunbag); + condition = QUOTE((GVAR(swapGunbagEnabled)) && ([_target] call FUNC(hasGunbag)) && {[ARR_2(_player,_target)] call FUNC(canInteract) == 2}); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(swapGunbag)); + showDisabled = 0; + icon = QPATHTOF(ui\gunbag_icon_ca.paa); + }; class GVAR(weaponOff) { displayName = CSTRING(OffGunbag); condition = QUOTE(([_target] call FUNC(hasGunbag)) && {[ARR_2(_player,_target)] call FUNC(canInteract) == 1}); @@ -41,6 +48,13 @@ class CfgVehicles { showDisabled = 0; icon = QPATHTOF(ui\gunbag_icon_ca.paa); }; + class GVAR(weaponSwap) { + displayName = CSTRING(SwapGunbag); + condition = QUOTE((GVAR(swapGunbagEnabled)) && ([ARR_2(_player,_player)] call FUNC(canInteract) == 2)); + statement = QUOTE([ARR_2(_player,_player)] call FUNC(swapGunbag)); + showDisabled = 0; + icon = QPATHTOF(ui\gunbag_icon_ca.paa); + }; class GVAR(weaponOff) { displayName = CSTRING(OffGunbag); condition = QUOTE([ARR_2(_player,_player)] call FUNC(canInteract) == 1); @@ -73,6 +87,7 @@ class CfgVehicles { hiddenSelectionsTextures[] = {QPATHTOF(data\gunbag_co.paa)}; maximumLoad = 80; mass = 11; + ADDON = 1; }; class GVAR(Tan): ADDON { diff --git a/addons/gunbag/XEH_PREP.hpp b/addons/gunbag/XEH_PREP.hpp index d76682f986e..45d55207d66 100644 --- a/addons/gunbag/XEH_PREP.hpp +++ b/addons/gunbag/XEH_PREP.hpp @@ -1,6 +1,8 @@ PREP(toGunbag); PREP(toGunbagCallback); +PREP(swapGunbag); +PREP(swapGunbagCallback); PREP(offGunbag); PREP(offGunbagCallback); PREP(status); diff --git a/addons/gunbag/XEH_preInit.sqf b/addons/gunbag/XEH_preInit.sqf index 8f313ba4727..582d64f7e5d 100644 --- a/addons/gunbag/XEH_preInit.sqf +++ b/addons/gunbag/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + // restore gunbag info after respawn ["CAManBase", "respawn", { [{ @@ -35,7 +37,7 @@ PREP_RECOMPILE_END; [QEGVAR(arsenal,displayClosed), { - if !(isNil QGVAR(arsenalCache)) then { + if (!isNil QGVAR(arsenalCache)) then { (backpackContainer EGVAR(arsenal,center)) setVariable [QGVAR(gunbagWeapon),GVAR(arsenalCache), true]; }; diff --git a/addons/gunbag/data/model.cfg b/addons/gunbag/data/model.cfg index 894edab2ac2..b82cefbfdbb 100644 --- a/addons/gunbag/data/model.cfg +++ b/addons/gunbag/data/model.cfg @@ -9,115 +9,114 @@ class CfgSkeletons { skeletonInherit = ""; skeletonBones[] = { "Pelvis","", - "Spine","Pelvis", - "Spine1","Spine", - "Spine2","Spine1", - "Spine3","Spine2", - "Camera","Pelvis", - "weapon","Spine1", - "launcher","Spine1", - //Head skeleton in hierarchy - "neck","Spine3", - "neck1","neck", - "head","neck1", - //New facial features - "Face_Hub","head", - "Face_Jawbone","Face_Hub", - "Face_Jowl","Face_Jawbone", - "Face_chopRight","Face_Jawbone", - "Face_chopLeft","Face_Jawbone", - "Face_LipLowerMiddle","Face_Jawbone", - "Face_LipLowerLeft","Face_Jawbone", - "Face_LipLowerRight","Face_Jawbone", - "Face_Chin","Face_Jawbone", - "Face_Tongue","Face_Jawbone", - "Face_CornerRight","Face_Hub", - "Face_CheekSideRight","Face_CornerRight", - "Face_CornerLeft","Face_Hub", - "Face_CheekSideLeft","Face_CornerLeft", - "Face_CheekFrontRight","Face_Hub", - "Face_CheekFrontLeft","Face_Hub", - "Face_CheekUpperRight","Face_Hub", - "Face_CheekUpperLeft","Face_Hub", - "Face_LipUpperMiddle","Face_Hub", - "Face_LipUpperRight","Face_Hub", - "Face_LipUpperLeft","Face_Hub", - "Face_NostrilRight","Face_Hub", - "Face_NostrilLeft","Face_Hub", - "Face_Forehead","Face_Hub", - "Face_BrowFrontRight","Face_Forehead", - "Face_BrowFrontLeft","Face_Forehead", - "Face_BrowMiddle","Face_Forehead", - "Face_BrowSideRight","Face_Forehead", - "Face_BrowSideLeft","Face_Forehead", - "Face_Eyelids","Face_Hub", - "Face_EyelidUpperRight","Face_Hub", - "Face_EyelidUpperLeft","Face_Hub", - "Face_EyelidLowerRight","Face_Hub", - "Face_EyelidLowerLeft","Face_Hub", - "EyeLeft","Face_Hub", - "EyeRight","Face_Hub", + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", + "camera","Pelvis",// case has changed for arma3 + "weapon","Spine1", + "launcher","Spine1", + "Neck","Spine3", + "Neck1","Neck", + "Head","Neck1", //Head skeleton in hierarchy //Left upper side - "LeftShoulder","Spine3", - "LeftArm","LeftShoulder", - "LeftArmRoll","LeftArm", - "LeftForeArm","LeftArmRoll", - "LeftForeArmRoll","LeftForeArm", - "LeftHand","LeftForeArmRoll", - "LeftHandRing","LeftHand", - "LeftHandRing1","LeftHandRing", - "LeftHandRing2","LeftHandRing1", - "LeftHandRing3","LeftHandRing2", - "LeftHandPinky1","LeftHandRing", - "LeftHandPinky2","LeftHandPinky1", - "LeftHandPinky3","LeftHandPinky2", - "LeftHandMiddle1","LeftHand", - "LeftHandMiddle2","LeftHandMiddle1", - "LeftHandMiddle3","LeftHandMiddle2", - "LeftHandIndex1","LeftHand", - "LeftHandIndex2","LeftHandIndex1", - "LeftHandIndex3","LeftHandIndex2", - "LeftHandThumb1","LeftHand", - "LeftHandThumb2","LeftHandThumb1", - "LeftHandThumb3","LeftHandThumb2", + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", //Right upper side - "RightShoulder","Spine3", - "RightArm","RightShoulder", - "RightArmRoll","RightArm", - "RightForeArm","RightArmRoll", - "RightForeArmRoll","RightForeArm", - "RightHand","RightForeArmRoll", - "RightHandRing","RightHand", - "RightHandRing1","RightHandRing", - "RightHandRing2","RightHandRing1", - "RightHandRing3","RightHandRing2", - "RightHandPinky1","RightHandRing", - "RightHandPinky2","RightHandPinky1", - "RightHandPinky3","RightHandPinky2", - "RightHandMiddle1","RightHand", - "RightHandMiddle2","RightHandMiddle1", - "RightHandMiddle3","RightHandMiddle2", - "RightHandIndex1","RightHand", - "RightHandIndex2","RightHandIndex1", - "RightHandIndex3","RightHandIndex2", - "RightHandThumb1","RightHand", - "RightHandThumb2","RightHandThumb1", - "RightHandThumb3","RightHandThumb2", - //Left lower side - "LeftUpLeg","Pelvis", - "LeftUpLegRoll","LeftUpLeg", - "LeftLeg","LeftUpLegRoll", - "LeftLegRoll","LeftLeg", - "LeftFoot","LeftLegRoll", - "LeftToeBase","LeftFoot", - //Right lower side - "RightUpLeg","Pelvis", - "RightUpLegRoll","RightUpLeg", - "RightLeg","RightUpLegRoll", - "RightLegRoll","RightLeg", - "RightFoot","RightLegRoll", - "RightToeBase","RightFoot" - }; + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot", + //New facial features arma3 only + "Face_Hub","Head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub" + };// end of skeleton array // location of pivot points (local axes) for hierarchical animation pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d"; }; diff --git a/addons/gunbag/functions/fnc_calculateMass.sqf b/addons/gunbag/functions/fnc_calculateMass.sqf index 8f845dc4ee5..6d66d191df2 100644 --- a/addons/gunbag/functions/fnc_calculateMass.sqf +++ b/addons/gunbag/functions/fnc_calculateMass.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ir0n1E - * Calculate mass of weapon an items. + * Calculate mass of weapon and items. * * Arguments: * 0: Weapon diff --git a/addons/gunbag/functions/fnc_canInteract.sqf b/addons/gunbag/functions/fnc_canInteract.sqf index 46451b50d51..04313f67415 100644 --- a/addons/gunbag/functions/fnc_canInteract.sqf +++ b/addons/gunbag/functions/fnc_canInteract.sqf @@ -1,14 +1,14 @@ #include "script_component.hpp" /* * Author: Ir0n1E - * Check if client able to interact with gunbag. + * Check if client is able to interact with gunbag. * * Arguments: * 0: Unit * 1: Target * * Return Value: - * -1: can't interact 0: empty gunbag 1: full gunbag + * -1: can't interact 0: empty gunbag 1: full gunbag 2: full gunbag & has primary * * Example: * _canInteract = [player, target] call ace_gunbag_fnc_canInteract @@ -29,5 +29,7 @@ if ((_gunbag getVariable [QGVAR(gunbagWeapon), []]) isEqualTo [] && {_weapon != if (!((_gunbag getVariable [QGVAR(gunbagWeapon), []]) isEqualTo []) && {_weapon == ""}) then { _result = 1; }; - +if (!((_gunbag getVariable [QGVAR(gunbagWeapon), []]) isEqualTo []) && {_weapon != ""}) then { + _result = 2; +}; _result diff --git a/addons/gunbag/functions/fnc_hasGunbag.sqf b/addons/gunbag/functions/fnc_hasGunbag.sqf index 5fa90c7b9cd..7f9c7135e08 100644 --- a/addons/gunbag/functions/fnc_hasGunbag.sqf +++ b/addons/gunbag/functions/fnc_hasGunbag.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ir0n1E - * Switches gunbag full/empty for mass calculation. + * Check if unit has a gunbag. * * Arguments: * 0: Unit @@ -17,4 +17,4 @@ params ["_unit"]; -(backpackContainer _unit) isKindOf QUOTE(ADDON) +getNumber (configFile >> "CfgVehicles" >> (backpack _unit) >> QUOTE(ADDON)) == 1 diff --git a/addons/gunbag/functions/fnc_offGunbag.sqf b/addons/gunbag/functions/fnc_offGunbag.sqf index 751402fa0f7..2b83beba4d7 100644 --- a/addons/gunbag/functions/fnc_offGunbag.sqf +++ b/addons/gunbag/functions/fnc_offGunbag.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [player, target] call ace_gunbag_fnc_toGunbag + * [player, target] call ace_gunbag_fnc_offGunbag * * Public: No */ diff --git a/addons/gunbag/functions/fnc_swapGunbag.sqf b/addons/gunbag/functions/fnc_swapGunbag.sqf new file mode 100644 index 00000000000..46eb926f38c --- /dev/null +++ b/addons/gunbag/functions/fnc_swapGunbag.sqf @@ -0,0 +1,34 @@ +#include "script_component.hpp" +/* + * Author: Ir0n1E and mjc4wilton + * Swap primary weapon and weapon in gunbag. + * + * Arguments: + * 0: Unit + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, target] call ace_gunbag_fnc_swapGunbag + * + * Public: No + */ + +params ["_unit", "_target"]; + +private _gunbag = backpackContainer _target; + +_unit call EFUNC(common,goKneeling); + +// play sound +if (["ace_backpacks"] call EFUNC(common,isModLoaded)) then { + [_target, _gunbag] call EFUNC(backpacks,backpackOpened); +}; + +[(PROGRESSBAR_TIME * 1.5), _this, { + (_this select 0) call FUNC(swapGunbagCallback) +}, {}, LLSTRING(swapGunbag), +{(_this select 0) call FUNC(canInteract) == 2} +] call EFUNC(common,progressBar); diff --git a/addons/gunbag/functions/fnc_swapGunbagCallback.sqf b/addons/gunbag/functions/fnc_swapGunbagCallback.sqf new file mode 100644 index 00000000000..8ed4f2cf594 --- /dev/null +++ b/addons/gunbag/functions/fnc_swapGunbagCallback.sqf @@ -0,0 +1,76 @@ +#include "script_component.hpp" +/* + * Author: Ir0n1E and mjc4wilton + * Swap primary weapon and weapon in gunbag. + * + * Arguments: + * 0: Unit + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, target] call ace_gunbag_fnc_swapGunbag + * + * Public: No + */ + +params ["_unit", "_target"]; +private _currentWeapon = primaryWeapon _unit; //Get Current Weapon +private _gunbag = backpackContainer _target; + + +//---Set up current weapon for storing +private _currentWeaponState = [_unit, _currentWeapon] call EFUNC(common,getWeaponState); //Gets weapon attachments + +/* + * example return value _state + * [["","","optic_Aco",""],["arifle_MX_GL_ACO_F","GL_3GL_F"],["30Rnd_65x39_caseless_mag","1Rnd_HE_Grenade_shell"],[30,1]] + */ + +_currentWeaponState params ["_currentWeaponItems", "", "_currentWeaponMagazines", "_currentWeaponAmmo"]; //Extract Weapon Attachments to separate arrays + +private _currentWeaponMass = [_currentWeapon, _currentWeaponItems, _currentWeaponMagazines] call FUNC(calculateMass); + +{ + _currentWeaponMagazines set [_forEachIndex, [_x, _currentWeaponAmmo select _forEachIndex]]; +} forEach _currentWeaponMagazines; + +//---Set up weapon in gunbag +private _newWeaponState = _gunbag getVariable [QGVAR(gunbagWeapon), []]; + +if (_newWeaponState isEqualTo []) exitWith { + [LLSTRING(empty)] call EFUNC(common,displayTextStructured); +}; + +_newWeaponState params ["_newWeapon", "_newWeaponItems", "_newWeaponMagazines"]; + +//---Swap Weapons +_unit removeWeapon _currentWeapon; +_unit addWeapon _newWeapon; + +// Game will auto add magazines from player's inventory, put these back in player inventory as they will be overwritten +([_unit, _newWeapon] call EFUNC(common,getWeaponState)) params ["", "", "_addedMags", "_addedAmmo"]; +{ + if (((_x select 0) != "") && {(_addedMags select _forEachIndex) != ""}) then { + TRACE_2("Re-adding mag",_x,_addedMags select _forEachIndex); + _unit addMagazine [_addedMags select _forEachIndex, _addedAmmo select _forEachIndex]; + }; +} forEach _newWeaponMagazines; + +removeAllPrimaryWeaponItems _unit; + +{ + _unit addWeaponItem [_newWeapon, _x]; +} forEach (_newWeaponItems + _newWeaponMagazines); + +_unit selectWeapon _newWeapon; + +_newWeaponMagazines = _newWeaponMagazines apply {_x select 0}; + +private _newWeaponMass = [_newWeapon, _newWeaponItems, _newWeaponMagazines] call FUNC(calculateMass); + +// update virtual load +[_target, _gunbag, _currentWeaponMass - _newWeaponMass] call EFUNC(movement,addLoadToUnitContainer); +_gunbag setVariable [QGVAR(gunbagWeapon), [_currentWeapon, _currentWeaponItems, _currentWeaponMagazines], true]; //Replace weapon in gunbag diff --git a/addons/gunbag/initSettings.sqf b/addons/gunbag/initSettings.sqf new file mode 100644 index 00000000000..f48981e2fdd --- /dev/null +++ b/addons/gunbag/initSettings.sqf @@ -0,0 +1,9 @@ +// CBA Settings [ADDON: ace_gunbag]: + +[ + QGVAR(swapGunbagEnabled), "CHECKBOX", + [LSTRING(SwapGunbagEnabled_DisplayName), LSTRING(SwapGunbagEnabled_Description)], + ["ACE Uncategorized", LLSTRING(DisplayName_Settings)], + true, // default value + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/gunbag/stringtable.xml b/addons/gunbag/stringtable.xml index ab4fdf5ac72..5dbd48b3f2f 100644 --- a/addons/gunbag/stringtable.xml +++ b/addons/gunbag/stringtable.xml @@ -13,10 +13,13 @@ Borsa per Armi 枪袋 槍袋 + Bolsa de Arma + Silah Çantası + Funda de arma Gunbag (Tan) - Waffentasche (Tan) + Waffentasche (hellbraun) Housse d'arme (marron clair) Чехол (желтовато-коричневый) Pouzdro na zbraň (Žlutohnědá) @@ -26,11 +29,30 @@ Borsa per Armi (Tan) 枪袋 (黄褐色) 槍袋 (黃褐色) + Bolsa de Arma (Bege) + Silah Çantası (Tan) + Funda de arma (Tan) + + + ACE Gunbag + ACE Waffentasche + ACE Housse d'arme + ACE Чехол + ACE Pouzdro na zbraň + ACE ガンバッグ + ACE Torba na broń + ACE 총가방 + ACE Borsa per Armi + ACE 枪袋 + ACE 槍袋 + ACE Bolsa de Arma + ACE Silah Çantası + ACE Funda de arma Put weapon into gunbag Lege Waffe in Waffentasche - Placer l'arme dans la housse d'arme + Ranger l'arme dans la housse Зачехлить оружие Vložit zbraň do pouzdra ガンバッグへ武器を入れる @@ -39,11 +61,32 @@ Metti l'arma nella borsa per armi 将武器放置枪袋 將武器放置槍袋 + Colocar arma na Bosla de Arma + Silahını silah çantasına koy + Poner el arma en la funda + + + Exchange weapon in gunbag + Wymień broń w torbie + Заменить оружие в чехле + Échanger les armes + + + Enable Weapon Swap + Aktywuj wymianę broni + Включить обмен оружием + Activer l'échange d'arme + + + Allows interaction to directly swap the primary weapon and stored weapon. + Pozwala na interakcje do wymiany broni głównej na bron schowaną. + Разрешает действие прямого обмена основного оружия и спрятанного в чехле. + Permet d'échanger directement l'arme primaire et l'arme stockée dans la housse, via le menu d'interaction personnelle. Get weapon out of gunbag Hole Waffe aus Waffentasche - Sortir l'arme hors de la housse + Prendre l'arme de la housse Расчехлить оружие Vytáhnout zbraň z pouzdra ガンバッグから武器を出す @@ -52,11 +95,14 @@ Prendi l'arma dalla borsa per armi 将武器拿出枪袋 將武器拿出槍袋 + Retirar arma da Bolsa de Arma + Silahını silah çantasından çıkart + Sacar el arma de la funda Status Status - Status + Statut Статус Status 中身 @@ -65,6 +111,9 @@ Stato 状态 狀態 + Status + Kontrol Et + Estado Gunbag Empty @@ -78,6 +127,9 @@ Borsa per armi vuota 枪袋为空 槍袋為空 + Bolsa de Arma Vazia + Silah Çantası Boş + Funda de arma vacía diff --git a/addons/hearing/CfgEventHandlers.hpp b/addons/hearing/CfgEventHandlers.hpp index aa8dbf51342..cacaee8bce5 100644 --- a/addons/hearing/CfgEventHandlers.hpp +++ b/addons/hearing/CfgEventHandlers.hpp @@ -7,13 +7,13 @@ 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 { - clientInit = QUOTE( call COMPILE_FILE(XEH_postInit) ); + clientinit = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/hearing/CfgVehicles.hpp b/addons/hearing/CfgVehicles.hpp index 48fb79277ea..729e14a4365 100644 --- a/addons/hearing/CfgVehicles.hpp +++ b/addons/hearing/CfgVehicles.hpp @@ -7,7 +7,7 @@ class CfgVehicles { displayName = CSTRING(EarPlugs_On); condition = QUOTE(GVAR(EnableCombatDeafness) && {!([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarPlugs' in items _player}}); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; - statement = QUOTE( [_player] call FUNC(putInEarPlugs) ); + statement = QUOTE( ARR_2([_player, true]) call FUNC(putInEarPlugs) ); showDisabled = 0; icon = QPATHTOF(UI\ACE_earplugs_x_ca.paa); }; @@ -15,7 +15,7 @@ class CfgVehicles { displayName = CSTRING(EarPlugs_Off); condition = QUOTE( GVAR(EnableCombatDeafness) && {[_player] call FUNC(hasEarPlugsIn)}); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; - statement = QUOTE( [_player] call FUNC(removeEarPlugs) ); + statement = QUOTE( ARR_2([_player, true]) call FUNC(removeEarPlugs) ); showDisabled = 0; icon = QPATHTOF(UI\ACE_earplugs_x_ca.paa); }; diff --git a/addons/hearing/functions/fnc_putInEarplugs.sqf b/addons/hearing/functions/fnc_putInEarplugs.sqf index 7292c86f853..25584130e43 100644 --- a/addons/hearing/functions/fnc_putInEarplugs.sqf +++ b/addons/hearing/functions/fnc_putInEarplugs.sqf @@ -5,17 +5,18 @@ * * Arguments: * 0: Unit (player) + * 1: Display hint (default: false) * * Return Value: * None * * Example: - * [ace_player] call ace_hearing_fnc_putInEarplugs + * [ace_player, false] call ace_hearing_fnc_putInEarplugs * * Public: No */ -params ["_player"]; +params ["_player", ["_displayHint", false, [false]]]; if (!GVAR(EnableCombatDeafness)) exitWith {}; @@ -24,12 +25,14 @@ _player removeItem "ACE_EarPlugs"; _player setVariable ["ACE_hasEarPlugsIn", true, true]; -[localize LSTRING(EarPlugs_Are_On)] call EFUNC(common,displayTextStructured); +if (_displayHint) then { + [localize LSTRING(EarPlugs_Are_On)] call EFUNC(common,displayTextStructured); +}; //Force an immediate fast volume update: [[true]] call FUNC(updateVolume); -/*// No Earplugs in inventory, telling user -[localize LSTRING(NoPlugs)] call EFUNC(common,displayTextStructured);*/ +// No Earplugs in inventory, telling user +//[localize LSTRING(NoPlugs)] call EFUNC(common,displayTextStructured); [] call FUNC(updateHearingProtection); diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf index 9af41f6d8b4..5e8064e7676 100644 --- a/addons/hearing/functions/fnc_removeEarplugs.sqf +++ b/addons/hearing/functions/fnc_removeEarplugs.sqf @@ -5,17 +5,18 @@ * * Arguments: * 0: Unit (player) + * 1: Display hint (default false) * * Return Value: * None * * Example: - * [ace_player] call ace_hearing_fnc_removeEarplugs + * [ace_player, false] call ace_hearing_fnc_removeEarplugs * * Public: No */ -params ["_player"]; +params ["_player", ["_displayHint", false, [false]]]; if (!GVAR(EnableCombatDeafness)) exitWith {}; @@ -28,7 +29,9 @@ _player addItem "ACE_EarPlugs"; _player setVariable ["ACE_hasEarPlugsIn", false, true]; -[localize LSTRING(EarPlugs_Are_Off)] call EFUNC(common,displayTextStructured); +if (_displayHint) then { + [localize LSTRING(EarPlugs_Are_Off)] call EFUNC(common,displayTextStructured); +}; //Force an immediate fast volume update: [[true]] call FUNC(updateVolume); diff --git a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf index 8d42ca1c0cb..9f33633462f 100644 --- a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf +++ b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf @@ -44,8 +44,11 @@ if (ACE_player != _vehicle) then { linearConversion [2, 8, _armor, 0.5, 0.3, true];}; case (_effectType == "OpenCarAttenuation"): {1}; case (_effectType == "TankAttenuation"): {0.1}; + case (_effectType == "MrapAttenuation"): {0.2}; case (_effectType == "HeliAttenuation"): {0.3}; case (_effectType == "OpenHeliAttenuation"): {0.9}; + case (_effectType == "SemiOpenCarAttenuation"); + case (_effectType == "SemiOpenCarAttenuation2"); case (_effectType == "SemiOpenHeliAttenuation"): {0.6}; case (_effectType == "HeliAttenuationGunner"): {0.85}; case (_effectType == "HeliAttenuationRamp"): {0.85}; diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index 4cf1a6b1174..11dc919a7ec 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -36,6 +36,7 @@ if (!_justUpdateVolume) then { if (CBA_missionTime - GVAR(time3) < 3) exitWith {}; GVAR(time3) = CBA_missionTime; + if (!isGameFocused) exitWith {}; if (GVAR(deafnessDV) > 19.75) then { playSound (["ACE_Combat_Deafness_Heavy", "ACE_Combat_Deafness_Heavy_NoRing"] select GVAR(DisableEarRinging)); } else { diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 048445d3fa7..e5a8ca2bab0 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -8,7 +8,7 @@ Stopery do uszu Špunty Беруши - Bouchons Anti-Bruits + Bouchons anti bruit Füldugó Protetor auricular Tappi auricolari @@ -16,6 +16,7 @@ 귀마개 耳塞 耳塞 + Kulak Tıkacı Protective Earplugs allow the wearer to be near loud weaponry without damage to his hearing. @@ -24,7 +25,7 @@ Stopery do uszu umożliwiają użytkownikowi przebywać w pobliżu głośnej broni bez poniesienia konsekwencji jaką jest utrata słuchu. Ochranné špunty umožňují uživateli, aby neutrpěl zranění jeho sluchu v blízkosti hlasitých zbraní. Беруши позволяют носителю находиться возле громкого вооружения без потери слуха. - Bouchons Anti-Bruits permettant au porteur d'être près d'arme bruyante sans risque d'endommager son ouïe. + Les bouchons d'oreilles anti bruit permettent au porteur d'être près d'armes bruyantes, sans risque d'endommager son ouïe. Erősebb hanghatásoktól védő füldugó, megakadályozza a nagy hanggal járó fegyverzettől való halláskárosodást. Protetor para ouvidos permitem que o usuário esteja próximo a ruídos sem danificar sua audição. Proteggono l'apparato uditivo, permettendo a chi li indossa di resistere ai suoni particolarmente forti senza alcun danno. @@ -48,6 +49,7 @@ 귀마개 착용 塞入耳塞 塞入耳塞 + Kulak Tıkacı Tak Earplugs out @@ -64,6 +66,7 @@ 귀마개 뺌 取出耳塞 取出耳塞 + Kulak Tıkacını Çıkart Earplugs in @@ -80,6 +83,7 @@ 귀마개 착용 耳塞已塞入 耳塞已塞入 + Kulak Tıkacı Takıldı Earplugs out @@ -96,6 +100,7 @@ 귀마개 뺌 耳塞已取出 耳塞已取出 + Kulak Tıkacı Çıkartıldı You have no earplugs @@ -104,7 +109,7 @@ Nie masz stoperów Nemáš žádné špunty У вас нет беруш - Vous n'avez pas de bouchons anti-bruits + Vous n'avez pas de bouchons anti bruit. Nincsen füldugód Você não possui protetores auriculares Non hai i tappi auricolari @@ -112,13 +117,14 @@ 귀마개가 없습니다 你没有耳塞 你沒有耳塞 + Kulak Tıkacın Yok No inventory space Kein Platz im Inventar Sin espacio en el inventario Brak miejsca w ekwipunku - Pas de place dans l'inventaire + Il n'y a plus de place dans l'inventaire. Není místo v inventáři Non hai abbastanza spazio Não há espaço no inventário @@ -128,10 +134,11 @@ 넣을 공간이 없습니다 无可用空间 無可用空間 + Envanterin de alan yok Disable ear ringing - Désactiver le bourdonnement + Désactiver les bourdonnements Desactivar zumbido de oídos Отключить звон в ушах Knalltrauma deaktivieren @@ -140,7 +147,7 @@ Fülcsengés letiltása Disabilita i fischi nelle orecchie Desabilitar zumbido de ouvidos - 耳鳴りを無効化する + 耳鳴りを無効化 이명현상 끄기 关闭耳鸣效果 關閉耳鳴效果 @@ -150,7 +157,7 @@ Deaktiviert Ohrklingeln wenn der Spieler Hörschäden davonträgt. Desactiva el efecto de zumbido cuando el jugador recibe daño auditivo. Usuń szum w uszach przy chwilowej utracie słuchu. - Enlève les acouphènes quand le joueur prend des dommages auditifs. + Enlève l'effet d'acouphène lorsqu'un joueur subit des dommages auditifs. Quando il giocatore riceve danni all'udito, non fa sentire i fischi nelle orecchie Remove o efeito de zunido quando o jogador recebe dano na audição Убирает эффект звона в ушах, когда игрок получает повреждение слуха @@ -158,6 +165,7 @@ 플레이어가 청력손실을 입을때 생기는 이명현상을 제거합니다. 关闭耳鸣效果时,就算玩家受到相当程度的听力伤害, 也不会造成耳鸣效果 關閉耳鳴效果時,就算玩家受到相當程度的聽力傷害, 也不會造成耳鳴效果 + Odstranit tinitus když hráč utrpí poškození sluchu Hearing @@ -200,7 +208,7 @@ Ativar surdez em combate? Уменьшает возможность игрока слышать звуки при повреждении органов слуха Riduci l'abilità uditiva quando il giocatore riceve danno uditivo - Réduire l'audition lorsque le joueur prend des dommages auditifs. + Réduit la capacité auditive du joueur lorsqu'il subit des dommages auditifs. 音による損傷をうけ、聴覚が減る可能性があります 청력에 손상을 입으면 듣는 소리가 감소합니다. 当玩家听力受损时降低听力能力? @@ -214,7 +222,7 @@ Dieses Modul aktiviert/deaktiviert die Taubheit im Gefecht. Wenn aktiviert, können Spieler ohne Gehörschutz taub werden, wenn eine Waffe in ihrer Nähe abgefeuert wird oder eine Explosion stattfindet. Ztráta sluchu je možná ve chvíly, kdy se v bezprostřední blízkosti střílí z velkorážní zbraně nebo při bombardování a osoba je bez ochrany sluchu (např. špunty). Tento modul umožňuje tuto věc povolit nebo zakázat. Este módulo ativa / desativa surdez em combate. Quando ativado, os jogadores podem ficar surdos quando uma arma é disparada ao seu redor ou uma explosão ocorre sem proteção auditiva. - Ce module active / désactivé la surdité au combat. Si active, des joueurs peuvent devenir sourds sans protection d'oreille, si une arme est utilisée ou une explosion a lieu à proximité + Pemet le réglage de la surdité au combat et des bourdonnements. Si actif, les joueurs sans protection auditive peuvent être assourdis quand une arme est utilisée à proximité, ou lorsqu'une explosion se produit. Controles de sordera de combate y zumbido en los oídos. Al activarlo, los jugadores pueden ser ensordecidos cuando un arma se dispara cerca o una explosión tiene lugar sin protección auditiva Controlla la sordità da combattimento e fischio alle orecchie. Quando attivato, i giocatori possono essere assordati quando un'arma spara vicino o avviene un'esplosione senza protezione uditiva 戦闘による難聴や、耳鳴りを設定します。有効では聴覚を保護していないと近傍の銃声や爆発音により、難聴になります。 @@ -231,7 +239,7 @@ Efecto Zeus RC Vliv na Zeus RC Effetto Zeus RC - Effet sur le CàD du Zeus + Affecte le CàD Zeus Zeus RC への効果 Zeus RC 효과 启用效果在宙斯远程遥控 @@ -246,7 +254,7 @@ Permitir a las unidades por control remoto de zeus que puedan tener daños auditivos. Aktivovat efekt ztráty sluchu pro vzdáleně ovládané jednotky. Consenti alle unità controllate in remoto da Zeus di ricevere danni all'udito. - Permet aux unités controlées à distance de subir des traumatismes sonores. + Permet aux unités contrôlées à distance par Zeus de subir des dommages auditifs. Zeus により遠隔操作されたユニットにも、聴覚へ損傷を受けるようにします。 Zeus가 원격으로 청력손실을 입힐 수 있게 합니다. 设定宙斯远程遥控的单位也会受到耳鸣的效果。 @@ -261,7 +269,7 @@ Přidat špunty jednotce Aggiungi Tappi per Orecchie alle unità Agregar tapones de oida a la unidad - Ajouter des bouchons anti-bruits aux unités + Ajouter des bouchons anti bruit aux unités ユニットへ耳栓を追加 해당 인원에게 귀마개 추가 增加耳塞给单位 @@ -276,7 +284,7 @@ Přidat `ACE_EarPlugs` všem jednotkám které mají zbraň. Můžete vypnout, pokud používáte vlastní výbavu. Aggiungi l'oggetto 'ACE_EarPlugs' a tutte le unità che hanno armi rumorose. Può essere disabilitato se vengono usati loadout personalizzati. Agregar el item `ACE_EarPlugs` a todas las unidades equipadas con armas muy ruidosas. Desactivar si quieren utilizarse equipamientos personalizados. - Ajoute l'objet "Ace_EarPlugs" à toutes les unités ayant des armes bruyantes. Peut être désactivé par des loadouts personalisés. + Ajoute l'objet `Ace_EarPlugs` à toutes les unités ayant des armes bruyantes. Peut être désactivé si de l'équipement personnalisé est utilisé. 全ユニットへ`ACE_EarPlugs`アイテムを持たせます。これは変更された武装で無効化できます。 무기를 가지고 있는 모든 인원에게 'ACE_EarPlugs'를 지급합니다. 임의의 장비를 사용시 비활성화 할 수 있습니다. 增加`ACE_EarPlugs`物品给拥有巨大噪音武器的单位。当你想自定装备时,此功能可被关闭。 @@ -284,53 +292,81 @@ Hearing protection + Gehörschutz Protection auditive 聴覚保護 听力保护 聽力保護 Protezione auditiva Ochrona słuchu + Защита слуха + Proteção Auditiva + Ochrana sluchu Volume muffling - Étouffement des sons + Lautstärkedämpfung + Atténuation du volume 音量低下 降低音量 進低音量 Volume attenuazione Tłumienie głośności + Глушение звука + Abafamento de Volume + Snížení hlasitosti Earplugs Volume + Lautstärke Ohrenstöpsel 耳栓時の音量 耳塞时音量 耳塞時音量 Volume tappi per le orecchie Głośność Stoperów + Громкость в берушах + Volume do Protetor Auricular + Volume bouchons anti bruit + Hlasitost se špunty Volume when using earplugs. + Lautstärke wenn man Ohrenstöpsel benutzt 耳栓使用時の音量を決定します。 决定带上耳塞时的音量 使用耳塞時音量 Volume audio quandi si indossano i tappi per le orecchie. Głośność podczas używania stoperów. + Громкость при одетых берушах + Volume quando estiver utilizando um Protetor Auricular + Volume audio perçu par les joueurs portant des bouchons anti bruit. + Hlasitost při používání špuntů do uší. Unconscious Volume + Lautstärke Bewusstlosigkeit 気絶時の音量 无意识时音量 昏迷時音量 Volume quando incoscente Nieprzytomna Głośność + Громкость без сознания + Volume Inconsciente + Volume inconscience + Hlasitost při ztrátě vědomí Volume when unconscious. + Lautstärke während man Bewusstlos ist 気絶時の音量を決定します。 决定处于无意识时的音量 昏迷時使用耳塞的音量 Volume quando incoscente. Głośność podczas bycia nieprzytomnym. + Громкость при потере сознания + Volume enquanto inconsciente + Volume perçu par les joueurs inconscients. + Hlasitost během ztráty vědomí. diff --git a/addons/hellfire/CfgAmmo.hpp b/addons/hellfire/CfgAmmo.hpp index a5d72142927..8a50594ffa2 100644 --- a/addons/hellfire/CfgAmmo.hpp +++ b/addons/hellfire/CfgAmmo.hpp @@ -65,4 +65,65 @@ class CfgAmmo { enabled = 1; // Missile Guidance must be explicitly enabled }; }; + class ACE_Hellfire_AGM114L: ACE_Hellfire_AGM114K { + displayName = "AGM-114L"; + displayNameShort = "AGM-114L"; + description = "AGM-114L"; + descriptionShort = "AGM-114L"; + class ace_missileguidance: ace_missileguidance { + canVanillaLock = 1; + enabled = 1; // Missile Guidance must be explicitly enabled + seekLastTargetPos = 0; + defaultSeekerType = "ARH"; + seekerTypes[] = { "ARH" }; + defaultSeekerLockMode = "LOBL"; + seekerLockModes[] = { "LOBL" }; + + activeRadarEngageDistance = 1000; + seekerMaxRange = 2000; // distance that the hellfire internal radar can scan + }; + + // Vanilla lock system vars + weaponLockSystem = "8"; + airLock = 1; + lockType = 0; + maneuvrability = 0; // no maneuvrability so that default guidance doesnt work + + missileLockMaxDistance = 8000; + missileLockMinDistance = 250; + missileLockMaxSpeed = 600; + missileKeepLockedCone = 70; + + flightProfiles[] = {}; + class Components { + class SensorsManagerComponent { + class Components { + class MillimeterWaveRadar { + componentType = "ActiveRadarSensorComponent"; + class AirTarget { + minRange = 0; + maxRange = 8000; + objectDistanceLimitCoef = -1; + viewDistanceLimitCoef = -1; + }; + class GroundTarget { + minRange = 0; + maxRange = 8000; + objectDistanceLimitCoef = -1; + viewDistanceLimitCoef = -1; + }; + typeRecognitionDistance = 4000; + angleRangeHorizontal = 70; + angleRangeVertical = 70; + groundNoiseDistanceCoef = 0; // relevant to AA missiles - not really for this + maxGroundNoiseDistance = 250; + minSpeedThreshold = 0; + maxSpeedThreshold = 600; + nightRangeCoef = 1; + maxFogSeeThrough = 0.8; + }; + }; + }; + }; + }; }; diff --git a/addons/hellfire/CfgMagazineWells.hpp b/addons/hellfire/CfgMagazineWells.hpp new file mode 100644 index 00000000000..17d6adee593 --- /dev/null +++ b/addons/hellfire/CfgMagazineWells.hpp @@ -0,0 +1,5 @@ +class CfgMagazineWells { + class GVAR(K) {}; + class GVAR(N) {}; + class GVAR(L) {}; +}; diff --git a/addons/hellfire/CfgMagazines.hpp b/addons/hellfire/CfgMagazines.hpp index de63540a2aa..51dba52661a 100644 --- a/addons/hellfire/CfgMagazines.hpp +++ b/addons/hellfire/CfgMagazines.hpp @@ -84,4 +84,43 @@ class CfgMagazines { ammo = "ACE_Hellfire_AGM114N"; pylonWeapon = QGVAR(launcher_N); }; + + // Lima - tandem shaped charge HEAT (anti-tank) Fire and Forget Active Radar Homing + class 6Rnd_ACE_Hellfire_AGM114L: 6Rnd_ACE_Hellfire_AGM114K { // Old style vehicle magazine + count = 6; + ammo = "ACE_Hellfire_AGM114L"; + displayName = "AGM-114L [ACE]"; + displayNameShort = "AGM-114L"; + descriptionShort = "AGM-114L"; + }; + + // 1.70 pylon magazines: + class PylonMissile_1Rnd_ACE_Hellfire_AGM114L: PylonMissile_1Rnd_ACE_Hellfire_AGM114K { // Bare missle + displayName = "1x AGM-114L [ACE]"; + displayNameShort = "AGM-114L"; + descriptionShort = "AGM-114L"; + ammo = "ACE_Hellfire_AGM114L"; + pylonWeapon = QGVAR(launcher_L); + }; + class PylonRack_1Rnd_ACE_Hellfire_AGM114L: PylonRack_1Rnd_ACE_Hellfire_AGM114K { // 1x Launcher Support Rack + displayName = "1x AGM-114L [ACE]"; + displayNameShort = "AGM-114L"; + descriptionShort = "AGM-114L"; + ammo = "ACE_Hellfire_AGM114L"; + pylonWeapon = QGVAR(launcher_L); + }; + class PylonRack_3Rnd_ACE_Hellfire_AGM114L: PylonRack_3Rnd_ACE_Hellfire_AGM114K { // 3x Launcher Support Rack + displayName = "3x AGM-114L [ACE]"; + displayNameShort = "AGM-114L"; + descriptionShort = "AGM-114L"; + ammo = "ACE_Hellfire_AGM114L"; + pylonWeapon = QGVAR(launcher_L); + }; + class PylonRack_4Rnd_ACE_Hellfire_AGM114L: PylonRack_4Rnd_ACE_Hellfire_AGM114K { // 4x Launcher Support Rack + displayName = "4x AGM-114L [ACE]"; + displayNameShort = "AGM-114L"; + descriptionShort = "AGM-114L"; + ammo = "ACE_Hellfire_AGM114L"; + pylonWeapon = QGVAR(launcher_L); + }; }; diff --git a/addons/hellfire/CfgVehicles.hpp b/addons/hellfire/CfgVehicles.hpp deleted file mode 100644 index 89dbf131d7a..00000000000 --- a/addons/hellfire/CfgVehicles.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgVehicles { - class Heli_Attack_01_base_F; - class Heli_Attack_01_dynamicLoadout_base_F: Heli_Attack_01_base_F { - GVAR(addLaserDesignator) = 1; - }; -}; diff --git a/addons/hellfire/CfgWeapons.hpp b/addons/hellfire/CfgWeapons.hpp index 1d7f167aad7..a09c6426960 100644 --- a/addons/hellfire/CfgWeapons.hpp +++ b/addons/hellfire/CfgWeapons.hpp @@ -1,12 +1,13 @@ class CfgWeapons { class RocketPods; + class MissileLauncher; class GVAR(launcher): RocketPods { displayName = "AGM-114K Hellfire II"; GVAR(enabled) = 1; // handle adding interactions and adding Laser Designator EGVAR(laser,canSelect) = 1; // can ace_laser lock (allows switching laser code) EGVAR(laser,showHud) = 1; // show attack profile / lock on hud magazines[] = {"6Rnd_ACE_Hellfire_AGM114K", "PylonMissile_1Rnd_ACE_Hellfire_AGM114K", "PylonRack_1Rnd_ACE_Hellfire_AGM114K", "PylonRack_3Rnd_ACE_Hellfire_AGM114K", "PylonRack_4Rnd_ACE_Hellfire_AGM114K"}; - + magazineWell[] += {QGVAR(K)}; autoFire = 0; canLock = 0; weaponLockSystem = 0; @@ -14,7 +15,7 @@ class CfgWeapons { lockedTargetSound[] = {"",0,1}; soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1",1,1.1,700}; nameSound = "MissileLauncher"; - sounds[] = {"StandardSound"}; + sounds[] = {"StandardSound"}; class StandardSound { begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_1",1.12202,1.3,1000}; soundBegin[] = {"begin1",1}; @@ -27,5 +28,28 @@ class CfgWeapons { class GVAR(launcher_N): GVAR(launcher) { displayName = "AGM-114N Hellfire II"; magazines[] = {"6Rnd_ACE_Hellfire_AGM114N", "PylonMissile_1Rnd_ACE_Hellfire_AGM114N", "PylonRack_1Rnd_ACE_Hellfire_AGM114N", "PylonRack_3Rnd_ACE_Hellfire_AGM114N", "PylonRack_4Rnd_ACE_Hellfire_AGM114N"}; + magazineWell[] += {QGVAR(N)}; + }; + class GVAR(launcher_L): GVAR(launcher) { + displayName = "AGM-114L Hellfire ""Longbow"""; + magazines[] = {"6Rnd_ACE_Hellfire_AGM114L", "PylonMissile_1Rnd_ACE_Hellfire_AGM114L", "PylonRack_1Rnd_ACE_Hellfire_AGM114L", "PylonRack_3Rnd_ACE_Hellfire_AGM114L", "PylonRack_4Rnd_ACE_Hellfire_AGM114L"}; + magazineWell[] += {QGVAR(L)}; + EGVAR(laser,showHud) = 1; // Just to show the attack profile + EGVAR(laser,canSelect) = 0; + class StandardSound { + begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_1",1.12202,1.3,1000}; + soundBegin[] = {"begin1",1}; + soundsetshot[] = {"RocketsMedium_Shot_SoundSet"}; + }; + cursor = "EmptyCursor"; + cursorAim = "missile"; + showAimCursorInternal = 0; + + // vanilla weapon lock systems + weaponLockSystem = 8; + cmImmunity = 0.9; + lockAcquire = 0; + weaponLockDelay = 0.1; + canLock = 2; }; }; diff --git a/addons/hellfire/config.cpp b/addons/hellfire/config.cpp index 8df15946125..37358ea7022 100644 --- a/addons/hellfire/config.cpp +++ b/addons/hellfire/config.cpp @@ -18,5 +18,5 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" -#include "CfgVehicles.hpp" +#include "CfgMagazineWells.hpp" #include "CfgWeapons.hpp" diff --git a/addons/hellfire/functions/fnc_attackProfile.sqf b/addons/hellfire/functions/fnc_attackProfile.sqf index 8904d579785..7d4980a1b3c 100644 --- a/addons/hellfire/functions/fnc_attackProfile.sqf +++ b/addons/hellfire/functions/fnc_attackProfile.sqf @@ -18,8 +18,10 @@ */ params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; -_args params ["_firedEH", "_launchParams"]; -_launchParams params ["","_targetLaunchParams"]; +_args params ["_firedEH", "_launchParams", "", "", "_stateParams"]; +_stateParams params ["", "_seekerStateParams"]; +_launchParams params ["","_targetLaunchParams","_seekerType"]; + _targetLaunchParams params ["", "", "_launchPos"]; _firedEH params ["","","","","","","_projectile"]; @@ -68,7 +70,7 @@ switch (_attackStage) do { private _gainSlope = linearConversion [0.5, 0.1, _distToGoRatio, 7, -7, true]; _returnTargetPos = +_seekerTargetPos; _returnTargetPos set [2, ((_projectilePos select 2) + (_distanceToTarget2d * sin _gainSlope)) max (_seekerTargetPos select 2)]; - + if ((_distanceToTarget2d < 500) || {(_currentHeightOverTarget atan2 _distanceToTarget2d) > 15}) then { // Wait until we can come down at a sharp angle _attackProfileStateParams set [0, STAGE_ATTACK_TERMINAL]; TRACE_2("New Stage: STAGE_ATTACK_TERMINAL",_distanceToTarget2d,_currentHeightOverTarget); @@ -80,5 +82,16 @@ switch (_attackStage) do { }; }; +// Special radar case. Adjust target position such that we are leading it +if (_attackStage >= 3 && { _seekerType isEqualTo "ARH" }) then { + _seekerStateParams params ["", "", "", "", "", "", "", "_lastKnownVelocity"]; + private _projectileVelocity = velocity _projectile; + if (_projectileVelocity#2 < 0) then { + private _projectileSpeed = vectorMagnitude _projectileVelocity; // this gives a precise impact time versus using speed _projectile. Dont change + private _timeUntilImpact = (_seekerTargetPos distance _projectilePos) / _projectileSpeed; + _returnTargetPos = _returnTargetPos vectorAdd (_lastKnownVelocity vectorMultiply _timeUntilImpact); + }; +}; + // TRACE_1("Adjusted target position", _returnTargetPos); _returnTargetPos; diff --git a/addons/hellfire/stringtable.xml b/addons/hellfire/stringtable.xml index 990e5a5b845..c621e6ddb46 100644 --- a/addons/hellfire/stringtable.xml +++ b/addons/hellfire/stringtable.xml @@ -3,13 +3,19 @@ Set Hellfire mode - Setze Hellfire-Modus + Hellfire-Modus einstellen Imposta modalità Hellfire ヘルファイア モードを設定 设定地狱火模式 設定地獄火模式 Ustaw tryb pocisku Hellfire 헬파이어 모드 세팅 + Установить режим Hellfire + Definir modo de Hellfire + Définir mode Hellfire + Nastavit režim Hellfire + Hellfire modunu ayarla + Ajustar modo Hellfire diff --git a/addons/hitreactions/XEH_PREP.hpp b/addons/hitreactions/XEH_PREP.hpp index 7701b8ef19b..53f2d60eb6a 100644 --- a/addons/hitreactions/XEH_PREP.hpp +++ b/addons/hitreactions/XEH_PREP.hpp @@ -1,3 +1,4 @@ PREP(fallDown); PREP(getRandomAnimation); +PREP(throwWeapon); diff --git a/addons/hitreactions/functions/fnc_fallDown.sqf b/addons/hitreactions/functions/fnc_fallDown.sqf index 08c7282ab71..4b305700e00 100644 --- a/addons/hitreactions/functions/fnc_fallDown.sqf +++ b/addons/hitreactions/functions/fnc_fallDown.sqf @@ -36,11 +36,6 @@ if (_unit == ACE_player) then { addCamShake [3, 5, _damage + random 10]; }; -// play scream sound -if (!isNil QEFUNC(medical,playInjuredSound)) then { - [_unit,_damage] call EFUNC(medical,playInjuredSound); -}; - private _vehicle = vehicle _unit; // handle static weapons diff --git a/addons/hitreactions/functions/fnc_throwWeapon.sqf b/addons/hitreactions/functions/fnc_throwWeapon.sqf new file mode 100644 index 00000000000..bc2936e1019 --- /dev/null +++ b/addons/hitreactions/functions/fnc_throwWeapon.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Makes the unit throw their currently selected weapon. + * Unit must be local and not inside a vehicle or attached to another object. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Weapon Holder + * + * Example: + * player call ace_hitreactions_fnc_throwWeapon + * + * Public: No + */ + +#define OFFSET_LATERAL 0.59 +#define THROW_ANGLE 63.43 +#define THROW_VELOCITY 1.5 +#define THROW_TORQUE 0.2 + +params ["_unit"]; + +private _weapon = currentWeapon _unit; +if (!isNull objectParent _unit || _weapon isEqualTo "") exitWith {objNull}; + +private _data = weaponsItems _unit select {_x select 0 == _weapon} select 0; + +private _holder = createVehicle ["WeaponHolderSimulated", [0, 0, 0], [], 0, "CAN_COLLIDE"]; +_holder addWeaponWithAttachmentsCargoGlobal [_data, 1]; + +private _vDir = _unit weaponDirection _weapon; +private _vLat = vectorNormalized (_vDir vectorCrossProduct [0, 0, 1]); +private _vUp = _vLat vectorCrossProduct _vDir; + +private _position = _unit modelToWorldWorld (_unit selectionPosition "RightHand") vectorAdd (_vLat vectorMultiply OFFSET_LATERAL); +private _velocity = vectorNormalized (_vDir vectorAdd (_vUp vectorMultiply tan THROW_ANGLE)) vectorMultiply THROW_VELOCITY vectorAdd velocity _unit; + +_unit removeWeapon _weapon; +_holder setPosWorld _position; +_holder setVectorDirAndUp [_vUp, _vLat]; +_holder setVelocity _velocity; +_holder addTorque (call CBA_fnc_randomVector3D vectorMultiply THROW_TORQUE); + +["ACE_weaponThrown", [_unit, _holder, _data]] call CBA_fnc_localEvent; + +_holder // return diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml index b727e485145..8e654e3ad24 100644 --- a/addons/hitreactions/stringtable.xml +++ b/addons/hitreactions/stringtable.xml @@ -1,7 +1,7 @@ - - + + Min Damage to trigger falling Danno Minimo da caduta 觸發倒下前最低需受到多少傷害 @@ -10,6 +10,12 @@ 방아쇠를 당기는 최소한의 피해 Mindestschaden, um Sturz auszulösen Minimalne obrażenie, żeby aktywować spadanie + Минимальный урон для активации падения + Dano Mínimo para ativar queda + Dommages minimaux pour déclencher la chute + Minimum škody pro aktivaci spadnutí + Düşmeyi tetikleyen min hasar + Daño mínimo para provocar la caída diff --git a/addons/hot/ACE_GuidanceConfig.hpp b/addons/hot/ACE_GuidanceConfig.hpp deleted file mode 100644 index 81f5c69261d..00000000000 --- a/addons/hot/ACE_GuidanceConfig.hpp +++ /dev/null @@ -1,19 +0,0 @@ -class EGVAR(missileguidance,AttackProfiles) { - class WIRE { - name = CSTRING(missileType); - visualName = CSTRING(missileType); - description = CSTRING(missileType_Description); - - functionName = QFUNC(attackProfile_WIRE); - }; -}; -class EGVAR(missileguidance,SeekerTypes) { - class SACLOS { - name = "SACLOS"; - visualName = "SACLOS"; - description = CSTRING(SACLOS_Description); - - functionName = QFUNC(seekerType_SACLOS); - }; -}; - diff --git a/addons/hot/CfgAmmo.hpp b/addons/hot/CfgAmmo.hpp index 168386d47f1..4ee29bec6d7 100644 --- a/addons/hot/CfgAmmo.hpp +++ b/addons/hot/CfgAmmo.hpp @@ -70,8 +70,6 @@ class CfgAmmo { defaultSeekerLockMode = "LOAL"; seekerLockModes[] = { "LOAL", "LOBL" }; - onFired = QFUNC(onFired); - seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos] seekerAngle = 30; // Angle from the shooter's view that can track the missile seekerAccuracy = 1; // seeker accuracy multiplier @@ -79,7 +77,7 @@ class CfgAmmo { seekerMinRange = 75; seekerMaxRange = 4000; // Range from the missile which the seeker can visually search - correctionDistance = 15; // distance from center of crosshair where missile slows down + correctionDistance = 8; // distance from center of crosshair where missile slows down offsetFromCrosshair[] = { 0, 0, 0.5 }; // where the missile wants to stay in relation to the center of the crosshair. // Attack profile type selection diff --git a/addons/hot/CfgEventHandlers.hpp b/addons/hot/CfgEventHandlers.hpp deleted file mode 100644 index 755e0552c5d..00000000000 --- a/addons/hot/CfgEventHandlers.hpp +++ /dev/null @@ -1,12 +0,0 @@ -class Extended_PreStart_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preStart)); - }; -}; - -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit)); - }; -}; - diff --git a/addons/hot/XEH_PREP.hpp b/addons/hot/XEH_PREP.hpp deleted file mode 100644 index 5942a97017c..00000000000 --- a/addons/hot/XEH_PREP.hpp +++ /dev/null @@ -1,4 +0,0 @@ -PREP(seekerType_SACLOS); -PREP(attackProfile_WIRE); -PREP(onFired); - diff --git a/addons/hot/config.cpp b/addons/hot/config.cpp index 52f9f5ef6ea..c61886cd26f 100644 --- a/addons/hot/config.cpp +++ b/addons/hot/config.cpp @@ -14,8 +14,6 @@ class CfgPatches { }; }; -#include "ACE_GuidanceConfig.hpp" -#include "CfgEventHandlers.hpp" #include "CfgAmmo.hpp" #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" diff --git a/addons/hot/functions/fnc_attackProfile_WIRE.sqf b/addons/hot/functions/fnc_attackProfile_WIRE.sqf deleted file mode 100644 index 8aef8a702b3..00000000000 --- a/addons/hot/functions/fnc_attackProfile_WIRE.sqf +++ /dev/null @@ -1,60 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Brandon (TCVM) - * Attack profile: Wire guided - * - * Arguments: - * 0: Seeker Target PosASL - * 1: Guidance Arg Array - * 2: Attack Profile State - * - * Return Value: - * Missile Aim PosASL - * - * Example: - * [[1,2,3], [], []] call ace_hot_fnc_attackProfile_WIRE; - * - * Public: No - */ -params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; -_args params ["_firedEH"]; -_firedEH params ["_shooter","","","","","","_projectile"]; -_attackProfileStateParams params["_maxCorrectableDistance", "_wireCut", "_randomVector", "_crosshairOffset", "_seekerMaxRangeSqr", "_wireCutSource"]; - -private _projectilePos = getPosASL _projectile; - -if ((((getPosASL _shooter) vectorDistanceSqr _projectilePos) > _seekerMaxRangeSqr) || { _wireCut }) exitWith { - // wire snap, random direction - if (_randomVector isEqualTo [0, 0, 0]) then { - _randomVector = RANDOM_VECTOR_3D vectorMultiply 300; - _attackProfileStateParams set [1, true]; - _attackProfileStateParams set [2, _randomVector]; - - playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLtoASL (_shooter modelToWorld _wireCutSource), 150, 1, 25]; - }; - _projectilePos vectorAdd _randomVector -}; - -if (_seekerTargetPos isEqualTo [0, 0, 0]) exitWith { - // cut wire if its caught on terrain - /*if !(lineIntersectsSurfaces [getPosASL _shooter, _projectilePos, _shooter] isEqualTo []) then { - _attackProfileStateParams set [1, true]; - };*/ - // return position 50m infront of projectile - _projectilePos vectorAdd (_projectile vectorModelToWorld [0, 50, 0]) -}; - -private _relativeCorrection = _projectile vectorWorldToModel (_projectilePos vectorDiff _seekerTargetPos); -_relativeCorrection = _relativeCorrection vectorDiff _crosshairOffset; - -private _magnitude = vectorMagnitude [_relativeCorrection select 0, 0, _relativeCorrection select 2]; - -private _fovImpulse = 1 min (_magnitude / _maxCorrectableDistance); // the simulated impulse for the missile being close to the center of the crosshair - -// Adjust the impulse due to near-zero values creating wobbly missiles? -private _correction = _fovImpulse; - -_relativeCorrection = (vectorNormalized _relativeCorrection) vectorMultiply _correction; - -_projectilePos vectorDiff (_projectile vectorModelToWorld _relativeCorrection); - diff --git a/addons/hot/functions/fnc_onFired.sqf b/addons/hot/functions/fnc_onFired.sqf deleted file mode 100644 index 38599f9b6a3..00000000000 --- a/addons/hot/functions/fnc_onFired.sqf +++ /dev/null @@ -1,53 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Brandon (TCVM) - * Sets up missile guidance state arrays (called from missileGuidance's onFired). - * - * Arguments: - * Guidance Arg Array - * - * Return Value: - * None - * - * Example: - * [] call ace_hot_fnc_onFired - * - * Public: No - */ -params ["_firedEH", "", "", "_seekerParams", "_stateParams"]; -_firedEH params ["_shooter","_weapon","","","","","_projectile", "_gunner"]; -_stateParams params ["", "_seekerStateParams", "_attackProfileStateParams"]; -_seekerParams params ["", "", "_seekerMaxRange"]; - -private _config = ([_projectile] call CBA_fnc_getObjectConfig) >> "ace_missileguidance"; -private _maxCorrectableDistance = [_config >> "correctionDistance", "NUMBER", DEFAULT_CORRECTION_DISTANCE] call CBA_fnc_getConfigEntry; -private _crosshairOffset = [_config >> "offsetFromCrosshair", "ARRAY", [0, 0, 0]] call CBA_fnc_getConfigEntry; -private _maxDistanceSqr = _seekerMaxRange * _seekerMaxRange; -private _distanceAheadOfMissile = [_config >> "missileLeadDistance", "NUMBER", DEFAULT_LEAD_DISTANCE] call CBA_fnc_getConfigEntry; - -// AI don't know how to use the crosshair offset becauze they dum dum -if ((_gunner != ACE_PLAYER) && {_gunner != (ACE_controlledUAV select 1)}) then { - _crosshairOffset = [0, 0, 0]; -}; -if (_shooter isKindOf "Plane") then {WARNING("SACLOS fired from planes unsupported");}; - -private _turretPath = [_shooter, _weapon] call CBA_fnc_turretPathWeapon; -private _turretConfig = [_shooter, _turretPath] call CBA_fnc_getTurret; - -private _wireCutSource = _shooter selectionPosition getText(_turretConfig >> "missileEnd"); - -_attackProfileStateParams set [0, _maxCorrectableDistance]; -_attackProfileStateParams set [1, false]; // _wireCut -_attackProfileStateParams set [2, [0, 0, 0]]; // _randomVector -_attackProfileStateParams set [3, _crosshairOffset]; // crosshair offset -_attackProfileStateParams set [4, _maxDistanceSqr]; // max distance squared used for wire cut -_attackProfileStateParams set [5, _wireCutSource]; - -private _memoryPointGunnerOptics = getText(_turretConfig >> "memoryPointGunnerOptics"); -private _animationSourceBody = getText(_turretConfig >> "animationSourceBody"); -private _animationSourceGun = getText(_turretConfig >> "animationSourceGun"); -_seekerStateParams set [0, _memoryPointGunnerOptics]; -_seekerStateParams set [1, _animationSourceBody]; -_seekerStateParams set [2, _animationSourceGun]; -_seekerStateParams set [3, _distanceAheadOfMissile]; - diff --git a/addons/hot/functions/fnc_seekerType_SACLOS.sqf b/addons/hot/functions/fnc_seekerType_SACLOS.sqf deleted file mode 100644 index 89ee38b6963..00000000000 --- a/addons/hot/functions/fnc_seekerType_SACLOS.sqf +++ /dev/null @@ -1,50 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Brandon (TCVM) - * SACLOS seeker - * - * Arguments: - * 1: Guidance Arg Array - * 2: Seeker State - * - * Return Value: - * Position of wanted missile pos relative to the camera direction - * - * Example: - * [] call ace_hot_fnc_seekerType_SACLOS - * - * Public: No - */ -params ["", "_args"]; -_args params ["_firedEH", "", "", "_seekerParams", "_stateParams"]; -_firedEH params ["_shooter","_weapon","","","","","_projectile"]; -_seekerParams params ["_seekerAngle"]; -_stateParams params ["", "_seekerStateParams"]; -_seekerStateParams params ["_memoryPointGunnerOptics", "_animationSourceBody", "_animationSourceGun", "_distanceAheadOfMissile"]; - -private _shooterPos = AGLToASL (_shooter modelToWorld(_shooter selectionPosition _memoryPointGunnerOptics)); -private _projPos = getPosASL _projectile; - -private _lookDirection = if !(_shooter isKindOf "CAManBase") then { - private _gBody = -deg(_shooter animationPhase _animationSourceBody); - private _gGun = deg(_shooter animationPhase _animationSourceGun); - - _shooter vectorModelToWorld ([1, _gBody, _gGun] call CBA_fnc_polar2vect); -} else { - _shooterPos = eyePos _shooter; - _shooter weaponDirection _weapon -}; - -private _distanceToProj = _shooterPos vectorDistance _projPos; -private _testPointVector = vectorNormalized (_projPos vectorDiff _shooterPos); -private _testDotProduct = (_lookDirection vectorDotProduct _testPointVector); - -private _testIntersections = lineIntersectsSurfaces [_shooterPos, _projPos, _shooter]; - -if ((_testDotProduct < (cos _seekerAngle)) || { !(_testIntersections isEqualTo []) }) exitWith { - // out of LOS of seeker - [0, 0, 0] -}; - -_shooterPos vectorAdd (_lookDirection vectorMultiply (_distanceToProj + _distanceAheadOfMissile)); - diff --git a/addons/hot/functions/script_component.hpp b/addons/hot/functions/script_component.hpp deleted file mode 100644 index fbebb0b9a3d..00000000000 --- a/addons/hot/functions/script_component.hpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "\z\ace\addons\hot\script_component.hpp" - diff --git a/addons/hot/script_component.hpp b/addons/hot/script_component.hpp index fd5475f15f5..54cf5ccea1a 100644 --- a/addons/hot/script_component.hpp +++ b/addons/hot/script_component.hpp @@ -16,13 +16,3 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define RANDOM_VECTOR_3D (call {\ - private _z = random 2 - 1;\ - private _r = sqrt (1 - _z^2);\ - private _theta = random 360;\ - [_r * cos _theta, _r * sin _theta, _z]\ -}) - -#define DEFAULT_CORRECTION_DISTANCE 10 -#define DEFAULT_LEAD_DISTANCE 50 - diff --git a/addons/hot/stringtable.xml b/addons/hot/stringtable.xml index 149ea1d7d0d..d688d06828e 100644 --- a/addons/hot/stringtable.xml +++ b/addons/hot/stringtable.xml @@ -6,108 +6,293 @@ Drahtgelenkt Kierowany przewodem Filoguidato + ワイヤ有線誘導 + Проводное управление + Guiado por Fio + 有線制導 + Filoguidé + Drátem naváděné + Tel-Güdümlü + Guiado por cable Semi-automatic command to line of sight - halbautomatische Steuerung über Sichtverbindung (SACLOS) + Halbautomatische Steuerung über Sichtverbindung (SACLOS) Semi-automatyczna komenda do pola widzenia Comando Semi-Automatico via Contatto Visivo(SACLOS) + 半自動指令照準線一致誘導方式 + Полуавтоматическое командное наведение по линии визирования (SACLOS) + Comando semi-automático para a linha de visão (SACLOS) + 視線內半自動指令 + Contrôle semi-automatique par contact visuel (SACLOS) + Poloautomatický povelový systém dalkového navedení pro záměrné cíle (SACLOS) + Control semi-automático por línea de visión Wire-Guided Missile Drahtgelenkte Rakete Pocisk kierowany przewodowo Missile filoguidato + ワイヤ有線誘導ミサイル + Ракета с проводным управлением + Míssil Guiado por Fio + 有線制導飛彈 + Missile filoguidé + Drátem naváděná střela + Tel Güdümlü Füze + Misil guiado por cable HOT Missile + Lenkflugkörper Pocisk HOT Missile HOT + HOT ミサイル + Ракета HOT + Míssil HOT + 高次音速(HOT)飛彈 + Missile HOT + HOT Střela + HOT Missile + Misil HOT HOT 1 + HOT 1 HOT 1 HOT 1 + HOT 1 + HOT 1 + HOT 1 + HOT 1 + HOT 1 + HOT 1 + HOT 1 + HOT 1 HOT 2 + HOT 2 HOT 2 HOT 2 + HOT 2 + HOT 2 + HOT 2 + HOT 2 + HOT 2 + HOT 2 + HOT 2 + HOT 2 HOT 2MP + HOT 2MP HOT 2MP HOT 2MP + HOT 2MP + HOT 2MP + HOT 2MP + HOT 2MP + HOT 2MP + HOT 2MP + HOT 2MP + HOT 2MP HOT 3 + HOT 3 HOT 3 HOT 3 + HOT 3 + HOT 3 + HOT 3 + HOT 3 + HOT 3 + HOT 3 + HOT 3 + HOT 3 Wire-Guided Missile (Anti-Personnel) + Anti Personen Lenkflugkörper Pocisk kierowany przewodowo (przeciwpiechotny) Missile filoguidato antiuomo + ワイヤ有線誘導ミサイル (対人) + Ракета с проводным управлением (Противопехотная) + Míssil Guiado por Fio (Anti-Pessoal) + 有線制導飛彈(反步兵) + Missile filoguidé (antipersonnel) + Drátem naváděná střela (protipěchotní) + Tel Güdümlü Füze (Anti-Personelı) + Misil guiado por cable (Antipersona) 1x HOT 1 [ACE] + 1x HOT 1 [ACE] 1x HOT 1 [ACE] 1x HOT1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] + 1x HOT 1 [ACE] 3x HOT 1 [ACE] + 3x HOT 1 [ACE] 3x HOT 1 [ACE] 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] + 3x HOT 1 [ACE] 4x HOT 1 [ACE] + 4x HOT 1 [ACE] 4x HOT 1 [ACE] 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] + 4x HOT 1 [ACE] 1x HOT 2 [ACE] + 1x HOT 2 [ACE] 1x HOT 2 [ACE] 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] + 1x HOT 2 [ACE] 3x HOT 2 [ACE] + 3x HOT 2 [ACE] 3x HOT 2 [ACE] 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] + 3x HOT 2 [ACE] 4x HOT 2 [ACE] + 4x HOT 2 [ACE] 4x HOT 2 [ACE] 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] + 4x HOT 2 [ACE] 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] 1x HOT 3 [ACE] + 1x HOT 3 [ACE] 1x HOT 3 [ACE] 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] + 1x HOT 3 [ACE] 4x HOT 3 [ACE] + 4x HOT 3 [ACE] 4x HOT 3 [ACE] 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] + 4x HOT 3 [ACE] 3x HOT 3 [ACE] + 3x HOT 3 [ACE] 3x HOT 3 [ACE] 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] + 3x HOT 3 [ACE] diff --git a/addons/huntir/CfgEventhandlers.hpp b/addons/huntir/CfgEventhandlers.hpp index 5da5fd0dc24..becf3950523 100644 --- a/addons/huntir/CfgEventhandlers.hpp +++ b/addons/huntir/CfgEventhandlers.hpp @@ -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)); }; }; diff --git a/addons/huntir/CfgMagazineWells.hpp b/addons/huntir/CfgMagazineWells.hpp index 2d9b87897ce..2d336054df4 100644 --- a/addons/huntir/CfgMagazineWells.hpp +++ b/addons/huntir/CfgMagazineWells.hpp @@ -2,7 +2,7 @@ class CfgMagazineWells { class CBA_40mm_M203 { ADDON[] = {"ACE_HuntIR_M203"}; }; - class UGL_40x36 { //Vanilla + class UGL_40x36 { //Vanilla and RHS [rhsusf\addons\rhsusf_c_weapons\cfgMagazineWells.hpp] ADDON[] = {"ACE_HuntIR_M203"}; }; }; diff --git a/addons/huntir/CfgVehicles.hpp b/addons/huntir/CfgVehicles.hpp index cf6c98904aa..03243cfbdda 100644 --- a/addons/huntir/CfgVehicles.hpp +++ b/addons/huntir/CfgVehicles.hpp @@ -73,7 +73,7 @@ class CfgVehicles { class ReammoBox_F; class ACE_HuntIR_Box: ReammoBox_F { model = QPATHTOF(data\ace_huntirbox.p3d); - displayName = $STR_DN_ACE_HUNTIRBOX; + displayName = CSTRING(TransportBox_DisplayName); class TransportItems { MACRO_ADDITEM(ACE_HuntIR_monitor,5); }; diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml index 1948a6c4b8a..6fde6d90777 100644 --- a/addons/huntir/stringtable.xml +++ b/addons/huntir/stringtable.xml @@ -1,7 +1,7 @@ - + HuntIR Transport Box HuntIR Transportkiste Caja de transporte de HuntIR @@ -16,8 +16,9 @@ HuntIR 수송함 高空战术摄像头运输箱 高空戰術成像器運輸箱 + HuntIR Taşıma Kutusu - + HuntIR Round HuntIR Granate Proyectil HuntIR @@ -25,15 +26,16 @@ HuntIR снаряд Colpo HuntIR Nabój HuntIR - Munition HuntIR + Projectile HuntIR HuntIR lövedék Cartucho HuntIR HuntIR 弾頭 HuntIR 유탄 高空战术摄像头弹药 高空戰術成像器彈藥 + HuntIR Mermisi - + HuntIR monitor HuntIR Monitor Monitor HuntIR @@ -48,8 +50,9 @@ HuntIR 모니터 高空战术摄像头显示面板 高空戰術成像器顯示面板 + HuntIR Ekranı - + Activate HuntIR monitor HuntIR Monitor aktivieren Activar monitor HuntIR @@ -64,8 +67,9 @@ HuntIR 모니터 켜기 开启高空战术摄像头显示面板 開啟高空戰術成像器顯示面板 + HuntIR Ekranı Aktif - + Camera: Kamera: Camara: @@ -80,8 +84,9 @@ 카메라: 摄像头: 攝影機: + Kamera: - + Altitude: Höhe: Altitud: @@ -96,8 +101,9 @@ 고도: 高度: 高度: + Yükseklik: - + Recording Time: Aufnahmezeit: Tiempo de grabación: @@ -112,8 +118,9 @@ 녹화시간: 记录时间: 記錄時間: + Kayıt süresi: - + Press ESC to quit camera Zum Verlassen ESC drücken Pulsar ESC para salir de la camara @@ -121,15 +128,16 @@ Нажмите ESC чтобы выйти из режима камеры Premi ESC per uscire dalla telecamera Wciśnij ESC by wyjść z widoku kamery - Appuyer sur ESC pour quitter la camera + Appuyez sur ESC pour quitter la camera. Nyomj ESC-ket a kamerából való kilépéshez Pressione ESC para sair da câmera ESC を押しカメラを抜ける ESC를 눌러 카메라 나가기 按下ESC退出摄像头 按下ESC退出攝影機 + ESC'ye basarak çıkış yap - + Help Hilfe Ayuda @@ -144,8 +152,9 @@ 도움말 帮助 幫助 + Yardım - + A/D - Cycle zoom A/D - Zoom A/D - Cambiar zoom @@ -160,8 +169,9 @@ A/D - 줌 전환 A/D - 切换放大倍率 A/D - 切換放大倍率 + A/D Uzaklığı değiştir - + W/S - Select camera W/S - Wähle Kamera W/S - Seleccionar camara @@ -176,8 +186,9 @@ W/S - 카메라 선택 W/S - 切换摄像头 W/S - 切換攝影機 + W/S- Kamerayı seç - + Left/Right - Rotate camera Links/Rechts - Rotiere Kamera Left/Right - Rotar camara @@ -192,8 +203,9 @@ 좌/우 - 카메라 돌리기 左/右 - 旋转摄像头 左/右 - 旋轉攝影機 + Sol/Sağ Kamerayı döndür - + Up/Down - Elevate/lower camera Hoch/Runter - Neige Kamera Up/Down - Subir/bajar camara @@ -208,8 +220,9 @@ 상/하 카메라 올리기/내리기 上/下 - 上升/下降摄像头 上/下 - 上升/下降攝影機 + Yukarı/Asağı- Kamerayı yukarı aşağı oynat - + N - Cycle IT modes N - Sichtmodi N - Cambiar modos de IT @@ -224,8 +237,9 @@ N - IT모드 순환 N - 切换热显模式 N - 切換熱顯模式 + N- IT modülünü değiştir - + R - Reset camera R - Kamera zurücksetzen R - Reiniciar camara @@ -240,11 +254,12 @@ R - 카메라 초기화 R - 重置摄像头 R - 重置攝影機 + R- Kamerayı sıfırla - + Esc - Exit help ESC - Hilfe verlassen - Esc - Salit de ayuda + Esc - Salir del menú de ayuda Esc - Ukončit pomoc Esc - Выйти из помощи Esc - Chiudi aiuto @@ -256,6 +271,7 @@ Esc - 도움말 나가기 Esc - 离开帮助 Esc - 離開幫助 + Esc- Çıkış Yardım diff --git a/addons/interact_menu/ACE_Settings.hpp b/addons/interact_menu/ACE_Settings.hpp index a36d3dd98d5..9f555f3ed13 100644 --- a/addons/interact_menu/ACE_Settings.hpp +++ b/addons/interact_menu/ACE_Settings.hpp @@ -1,32 +1,18 @@ class ACE_Settings { class GVAR(alwaysUseCursorSelfInteraction) { - value = 0; - typeName = "BOOL"; - isClientSettable = 1; - category = CSTRING(Category_InteractionMenu); - displayName = CSTRING(AlwaysUseCursorSelfInteraction); + movedToSQF = 1; }; class GVAR(cursorKeepCentered) { - value = 0; - typeName = "BOOL"; - isClientSettable = 1; - category = CSTRING(Category_InteractionMenu); - displayName = CSTRING(cursorKeepCentered); - description = CSTRING(cursorKeepCenteredDescription); + movedToSQF = 1; }; class GVAR(alwaysUseCursorInteraction) { - value = 0; - typeName = "BOOL"; - isClientSettable = 1; - category = CSTRING(Category_InteractionMenu); - displayName = CSTRING(AlwaysUseCursorInteraction); + movedToSQF = 1; }; class GVAR(useListMenu) { - value = 0; - typeName = "BOOL"; - isClientSettable = 1; - category = CSTRING(Category_InteractionMenu); - displayName = CSTRING(UseListMenu); + movedToSQF = 1; + }; + class GVAR(menuBackground) { + movedToSQF = 1; }; class GVAR(colorTextMax) { value[] = {1, 1, 1, 1}; @@ -80,14 +66,6 @@ class ACE_Settings { category = CSTRING(Category_InteractionMenu); displayName = CSTRING(ActionOnKeyRelease); }; - class GVAR(menuBackground) { - value = 0; - typeName = "SCALAR"; - isClientSettable = 1; - category = CSTRING(Category_InteractionMenu); - displayName = CSTRING(background); - values[] = {"$STR_A3_OPTIONS_DISABLED", CSTRING(backgroundBlur), CSTRING(backgroundBlack)}; - }; class GVAR(addBuildingActions) { value = 0; typeName = "BOOL"; diff --git a/addons/interact_menu/CfgEventHandlers.hpp b/addons/interact_menu/CfgEventHandlers.hpp index b8bb1264e11..b5880fb05b2 100644 --- a/addons/interact_menu/CfgEventHandlers.hpp +++ b/addons/interact_menu/CfgEventHandlers.hpp @@ -17,14 +17,6 @@ class Extended_PostInit_EventHandlers { }; }; -class Extended_InitPost_EventHandlers { - class All { - class GVAR(compileMenu) { - init = QUOTE(_this call FUNC(compileMenu);_this call FUNC(compileMenuSelfAction)); - }; - }; -}; - class Extended_DisplayLoad_EventHandlers { class RscDiary { ADDON = QUOTE(call COMPILE_FILE(XEH_displayLoad)); diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index d6d5cd065c2..bc4870ef544 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -2,6 +2,29 @@ if (!hasInterface) exitWith {}; +// Wait until player controls (man,vehicle or uav) a thing before compiling the menu +GVAR(controllableSelfActionsAdded) = [] call CBA_fnc_createNamespace; +DFUNC(newControllableObject) = { + params ["_object"]; + private _type = typeOf _object; + TRACE_2("newControllableObject",_object,_type); + if (_type == "") exitWith {}; + + if (!(GVAR(controllableSelfActionsAdded) getVariable [_type, false])) then { + [_type] call FUNC(compileMenuSelfAction); + GVAR(controllableSelfActionsAdded) setVariable [_type, true]; + [{ + TRACE_1("sending newControllableObject event",_this); + // event for other systems to add self actions, running addActionToClass before this will cause compiling + [QGVAR(newControllableObject), _this] call CBA_fnc_localEvent; + }, [_type]] call CBA_fnc_execNextFrame; // delay event a frame to ensure postInit has run for all addons + }; +}; +["unit", {[_this select 0] call FUNC(newControllableObject)}, true] call CBA_fnc_addPlayerEventHandler; +["vehicle", {[_this select 1] call FUNC(newControllableObject)}, true] call CBA_fnc_addPlayerEventHandler; +["ACE_controlledUAV", {[_this select 0] call FUNC(newControllableObject)}] call CBA_fnc_addEventHandler; + + GVAR(blockDefaultActions) = []; GVAR(cachedBuildingTypes) = []; @@ -77,10 +100,15 @@ format ["%1 (%2)", (localize LSTRING(SelfInteractKey)), localize ELSTRING(common // background options ["ace_interactMenuOpened", { - if (GVAR(menuBackground)==1) then {[QGVAR(menuBackground), true] call EFUNC(common,blurScreen);}; - if (GVAR(menuBackground)==2) then {0 cutRsc[QGVAR(menuBackground), "PLAIN", 1, false];}; + params ["_menuType"]; + private _menuBackgroundSetting = [GVAR(menuBackground), GVAR(menuBackgroundSelf)] select _menuType; + if (_menuBackgroundSetting == 1) exitWith {[QGVAR(menuBackground), true] call EFUNC(common,blurScreen);}; + if (_menuBackgroundSetting == 2) exitWith {0 cutRsc [QGVAR(menuBackground), "PLAIN", 1, false];}; }] call CBA_fnc_addEventHandler; + ["ace_interactMenuClosed", { - if (GVAR(menuBackground)==1) then {[QGVAR(menuBackground), false] call EFUNC(common,blurScreen);}; - if (GVAR(menuBackground)==2) then {(uiNamespace getVariable [QGVAR(menuBackground), displayNull]) closeDisplay 0;}; + params ["_menuType"]; + private _menuBackgroundSetting = [GVAR(menuBackground), GVAR(menuBackgroundSelf)] select _menuType; + if (_menuBackgroundSetting == 1) exitWith {[QGVAR(menuBackground), false] call EFUNC(common,blurScreen);}; + if (_menuBackgroundSetting == 2) exitWith {(uiNamespace getVariable [QGVAR(menuBackground), displayNull]) closeDisplay 0;}; }] call CBA_fnc_addEventHandler; diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index a05eac1bb56..0d321112f96 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -8,12 +8,20 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +if (!hasInterface) exitWith { ADDON = true; }; + +["All", "init", {_this call FUNC(compileMenu)}] call CBA_fnc_addClassEventHandler; + GVAR(ActNamespace) = [] call CBA_fnc_createNamespace; GVAR(ActSelfNamespace) = [] call CBA_fnc_createNamespace; +// Compile actions for CAManBase now and use for all mans types +["CAManBase"] call FUNC(compileMenu); +GVAR(cacheManActions) = +(GVAR(ActNamespace) getVariable ["CAManBase", []]); // copy + // Event handlers for all interact menu controls DFUNC(handleMouseMovement) = { - if (GVAR(cursorKeepCentered)) then { + if ([GVAR(cursorKeepCentered), GVAR(cursorKeepCenteredSelfInteraction)] select GVAR(keyDownSelfAction)) then { GVAR(cursorPos) = GVAR(cursorPos) vectorAdd [_this select 1, _this select 2, 0] vectorDiff [0.5, 0.5, 0]; setMousePosition [0.5, 0.5]; } else { @@ -66,4 +74,38 @@ GVAR(lastTimeSearchedActions) = -1000; // Init zeus menu [] call FUNC(compileMenuZeus); +// Handle addActionToClass with Inheritance flag set (CAManBase actions are seperated for speed) +GVAR(inheritedActionsAll) = []; +GVAR(inheritedClassesAll) = []; +GVAR(inheritedActionsMan) = []; +GVAR(inheritedClassesMan) = []; + +["All", "InitPost", { + BEGIN_COUNTER(InitPost); + params ["_object"]; + private _type = typeOf _object; + + if (GVAR(inheritedClassesAll) pushBackUnique _type == -1) exitWith { END_COUNTER(InitPost); }; + + { + _x params ["_objectType", "_typeNum", "_parentPath", "_action"]; + if (_object isKindOf _objectType) then { + [_type, _typeNum, _parentPath, _action] call FUNC(addActionToClass); + }; + } forEach GVAR(inheritedActionsAll); + END_COUNTER(InitPost); +}] call CBA_fnc_addClassEventHandler; +["CAManBase", "InitPost", { + BEGIN_COUNTER(InitPost); + params ["_object"]; + private _type = typeOf _object; + + if (GVAR(inheritedClassesMan) pushBackUnique _type == -1) exitWith { END_COUNTER(InitPost); }; + { + _x params ["_typeNum", "_parentPath", "_action"]; + [_type, _typeNum, _parentPath, _action] call FUNC(addActionToClass); + } forEach GVAR(inheritedActionsMan); + END_COUNTER(InitPost); +}, true, ["VirtualMan_F"]] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index 687d6449249..ff29cfc850a 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -23,5 +23,12 @@ class CfgPatches { #include "ACE_Settings.hpp" class ACE_Extensions { - extensions[] += {"ace_break_line", "ace_parse_imagepath"}; + class ace_break_line { + windows = 1; + client = 1; + }; + class ace_parse_imagepath { + windows = 1; + client = 1; + }; }; diff --git a/addons/interact_menu/functions/fnc_addActionToClass.sqf b/addons/interact_menu/functions/fnc_addActionToClass.sqf index 558c4976671..69425ea0475 100644 --- a/addons/interact_menu/functions/fnc_addActionToClass.sqf +++ b/addons/interact_menu/functions/fnc_addActionToClass.sqf @@ -20,25 +20,29 @@ * Public: Yes */ +if (!hasInterface) exitWith { [] }; if (!params [["_objectType", "", [""]], ["_typeNum", 0, [0]], ["_parentPath", [], [[]]], ["_action", [], [[]], 11]]) exitWith { ERROR("Bad Params"); [] }; -TRACE_4("params",_objectType,_typeNum,_parentPath,_action); +TRACE_4("addActionToClass",_objectType,_typeNum,_parentPath,_action); if (param [4, false, [false]]) exitwith { - if (isNil QGVAR(inheritedActions)) then {GVAR(inheritedActions) = [];}; - private _index = GVAR(inheritedActions) pushBack [[], _typeNum, _parentPath, _action]; - private _initEH = compile format [' - params ["_object"]; - private _typeOf = typeOf _object; - (GVAR(inheritedActions) select %1) params ["_addedClasses", "_typeNum", "_parentPath", "_action"]; - if (_typeOf in _addedClasses) exitWith {}; - _addedClasses pushBack _typeOf; - [_typeOf, _typeNum, _parentPath, _action] call FUNC(addActionToClass); - ', _index]; - TRACE_2("Added inheritable action",_objectType,_index); - [_objectType, "init", _initEH, true, [], true] call CBA_fnc_addClassEventHandler; + BEGIN_COUNTER(addAction); + if (_objectType == "CAManBase") then { + GVAR(inheritedActionsMan) pushBack [_typeNum, _parentPath, _action]; + { + [_x, _typeNum, _parentPath, _action] call FUNC(addActionToClass); + } forEach GVAR(inheritedClassesMan); + } else { + GVAR(inheritedActionsAll) pushBack [_objectType, _typeNum, _parentPath, _action]; + { + if (_x isKindOf _objectType) then { + [_x, _typeNum, _parentPath, _action] call FUNC(addActionToClass); + }; + } forEach GVAR(inheritedClassesAll); + }; + END_COUNTER(addAction); // Return the full path (_parentPath + [_action select 0]) diff --git a/addons/interact_menu/functions/fnc_addActionToObject.sqf b/addons/interact_menu/functions/fnc_addActionToObject.sqf index 3ee7c5c3328..f3102469a55 100644 --- a/addons/interact_menu/functions/fnc_addActionToObject.sqf +++ b/addons/interact_menu/functions/fnc_addActionToObject.sqf @@ -19,6 +19,7 @@ * Public: Yes */ +if (!hasInterface) exitWith { [] }; if (!params [["_object", objNull, [objNull]], ["_typeNum", 0, [0]], ["_parentPath", [], [[]]], ["_action", [], [[]], 11]]) exitWith { ERROR("Bad Params"); [] diff --git a/addons/interact_menu/functions/fnc_addActionToZeus.sqf b/addons/interact_menu/functions/fnc_addActionToZeus.sqf index 65ef178fb0f..538ea5fe169 100644 --- a/addons/interact_menu/functions/fnc_addActionToZeus.sqf +++ b/addons/interact_menu/functions/fnc_addActionToZeus.sqf @@ -17,6 +17,7 @@ * Public: Yes */ +if (!hasInterface) exitWith { [] }; if (!params [["_parentPath", [], [[]]], ["_action", [], [[]], 11]]) exitWith {ERROR("Bad Params"); []}; if ((_parentPath param [0, ""]) != "ACE_ZeusActions") exitWith {ERROR_1("Bad path %1 - should have ACE_ZeusActions as base", _parentPath); []}; TRACE_2("addActionToZeus",_parentPath,_action); diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 94c63795ffd..7f36247e225 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -24,7 +24,16 @@ if (_target isEqualType objNull) then { private _namespace = GVAR(ActNamespace); // Exit if the action menu is already compiled for this class -if !(isNil {_namespace getVariable _objectType}) exitWith {}; +if (!isNil {_namespace getVariable _objectType}) exitWith {}; + +if (_objectType isKindOf "VirtualMan_F") exitWith { // these have config: isPlayableLogic = 1 + TRACE_1("skipping playable logic",_objectType); + _namespace setVariable [_objectType, []]; +}; + +if ((_objectType isKindOf "CAManBase") && {!isNil QGVAR(cacheManActions)}) exitWith { + _namespace setVariable [_objectType, +GVAR(cacheManActions)]; // copy +}; private _recurseFnc = { params ["_actionsCfg", "_parentDistance"]; @@ -32,7 +41,7 @@ private _recurseFnc = { { private _entryCfg = _x; - if(isClass _entryCfg) then { + if (isClass _entryCfg) then { private _displayName = getText (_entryCfg >> "displayName"); private _distance = _parentDistance; if (isNumber (_entryCfg >> "distance")) then {_distance = getNumber (_entryCfg >> "distance");}; @@ -106,11 +115,6 @@ private _recurseFnc = { _actions }; -if ((getNumber (configFile >> "CfgVehicles" >> _objectType >> "isPlayableLogic")) == 1) exitWith { - TRACE_1("skipping playable logic",_objectType); - _namespace setVariable [_objectType, []]; -}; - private _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; TRACE_1("Building ACE_Actions",_objectType); @@ -118,7 +122,7 @@ private _actions = [_actionsCfg, 0] call _recurseFnc; // ace_interaction_fnc_addPassengerAction expects ACE_MainActions to be first // Other mods can change the order that configs are added, so we should verify this now and resort if needed -if (_objectType isKindOf "CaManBase") then { +if (_objectType isKindOf "CAManBase") then { if ((((_actions select 0) select 0) select 0) != "ACE_MainActions") then { INFO_1("ACE_MainActions not first for man [%1]",_objectType); private _mainActions = []; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 8a79fe99e14..879ca7b1384 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -24,7 +24,7 @@ if (_target isEqualType objNull) then { private _namespace = GVAR(ActSelfNamespace); // Exit if the action menu is already compiled for this class -if !(isNil {_namespace getVariable _objectType}) exitWith {}; +if (!isNil {_namespace getVariable _objectType}) exitWith {}; private _recurseFnc = { @@ -34,7 +34,7 @@ private _recurseFnc = { { private _entryCfg = _x; - if(isClass _entryCfg) then { + if (isClass _entryCfg) then { private _displayName = getText (_entryCfg >> "displayName"); private _icon = if (isArray (_entryCfg >> "icon")) then { diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf index af28bf22846..c1f4dc08587 100644 --- a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -16,7 +16,7 @@ */ // Exit if the action menu is already compiled for zeus -if !(isNil {missionNamespace getVariable [QGVAR(ZeusActions), nil]}) exitWith {}; +if (!isNil {missionNamespace getVariable [QGVAR(ZeusActions), nil]}) exitWith {}; private _recurseFnc = { params ["_actionsCfg"]; @@ -24,7 +24,7 @@ private _recurseFnc = { { private _entryCfg = _x; - if(isClass _entryCfg) then { + if (isClass _entryCfg) then { private _displayName = getText (_entryCfg >> "displayName"); private _icon = if (isArray (_entryCfg >> "icon")) then { diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index f8c61c3842e..428f8a26d7a 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -28,6 +28,7 @@ // IGNORE_PRIVATE_WARNING(_actionName,_displayName,_icon,_statement,_condition,_insertChildren,_customParams,_position,_distance,_params,_modifierFunction); +if (!hasInterface) exitWith { [] }; params [ "_actionName", "_displayName", diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 54a9f070ce4..c080fa4481a 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -36,6 +36,12 @@ if (_menuType == 0) then { GVAR(keyDownSelfAction) = true; }; GVAR(keyDownTime) = diag_tickTime; + +// Raise MenuClosed event whenever one type is replaced with another, because KeyUp code is not guaranteed. +if (GVAR(openedMenuType) != -1) then { + ["ace_interactMenuClosed", [GVAR(openedMenuType)]] call CBA_fnc_localEvent; +}; + GVAR(openedMenuType) = _menuType; GVAR(lastTimeSearchedActions) = -1000; GVAR(ParsedTextCached) = []; @@ -44,8 +50,8 @@ GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || (!(isNull (ACE_controlledUAV select 0))) || visibleMap || (!isNull curatorCamera) || - {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}} || - {(_menuType == 0) && GVAR(AlwaysUseCursorInteraction)}; + {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(alwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}} || + {(_menuType == 0) && GVAR(alwaysUseCursorInteraction)}; // Delete existing controls in case there's any left GVAR(iconCount) = 0; diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index be98452177a..2504ca2b785 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -24,7 +24,7 @@ if (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]) then { (findDisplay 91919) closeDisplay 2; }; -if(GVAR(actionSelected)) then { +if (GVAR(actionSelected)) then { this = GVAR(selectedTarget); private _player = ACE_Player; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 21f19621807..19725fb6100 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -38,7 +38,7 @@ if (_iconFile isEqualTo "") then { _iconFile = DEFAULT_ICON; }; -_text = if (GVAR(UseListMenu)) then { +_text = if ([GVAR(useListMenu), GVAR(useListMenuSelf)] select GVAR(keyDownSelfAction)) then { format ["%4", _iconFile, _iconColor, _textSettings, _text] } else { format ["
%4", _iconFile, _iconColor, _textSettings, "ace_break_line" callExtension _text]; @@ -47,13 +47,14 @@ _text = if (GVAR(UseListMenu)) then { [_ctrl, GVAR(iconCount), _text] call FUNC(ctrlSetParsedTextCached); GVAR(iconCount) = GVAR(iconCount) + 1; -private _pos = if (GVAR(UseListMenu)) then { +private _pos = if ([GVAR(useListMenu), GVAR(useListMenuSelf)] select GVAR(keyDownSelfAction)) then { [(_sPos select 0) - (0.0095 * SafeZoneW), (_sPos select 1) - (0.0095 * SafeZoneW), 0.20 * SafeZoneW, 0.035 * SafeZoneW] } else { [(_sPos select 0) - (0.0750 * SafeZoneW), (_sPos select 1) - (0.0095 * SafeZoneW), 0.15 * SafeZoneW, 0.100 * SafeZoneW] }; -if (GVAR(cursorKeepCentered) && {uiNamespace getVariable [QGVAR(cursorMenuOpened),false]}) then { + +if (([GVAR(cursorKeepCentered), GVAR(cursorKeepCenteredSelfInteraction)] select GVAR(keyDownSelfAction)) && {uiNamespace getVariable [QGVAR(cursorMenuOpened),false]}) then { _pos set [0, ((_pos select 0) - (GVAR(cursorPos) select 0) + 0.5)]; _pos set [1, ((_pos select 1) - (GVAR(cursorPos) select 1) + 0.5)]; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 5801f4602fe..d51766548f7 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -89,8 +89,8 @@ if (_numChildren == 1) then { // Scale menu based on the amount of children private _scaleX = 1; private _scaleY = 1; - -if (GVAR(UseListMenu)) then { +private _useListMenu = [GVAR(useListMenu), GVAR(useListMenuSelf)] select GVAR(keyDownSelfAction); +if (_useListMenu) then { private _textSize = [0.75, 0.875, 1, 1.2, 1.4] select GVAR(textSize); _scaleX = _textSize * 0.17 * 1.1; _scaleY = 0.17 * 0.30 * 4/3; @@ -112,7 +112,7 @@ private _player = ACE_player; //END_COUNTER(children); private _angle = _centerAngle - _angleSpan / 2; { - private _newPos = if (GVAR(UseListMenu)) then { + private _newPos = if (_useListMenu) then { [(_sPos select 0) + _scaleX, (_sPos select 1) + _scaleY * (_forEachIndex - _numChildren/2 + 0.5)]; } else { diff --git a/addons/interact_menu/functions/fnc_renderSelector.sqf b/addons/interact_menu/functions/fnc_renderSelector.sqf index 0449f9c9228..96f42f8a193 100644 --- a/addons/interact_menu/functions/fnc_renderSelector.sqf +++ b/addons/interact_menu/functions/fnc_renderSelector.sqf @@ -39,7 +39,7 @@ private _pos = if (GVAR(UseListMenu)) then { GVAR(iconCount) = GVAR(iconCount) + 1; -if (GVAR(cursorKeepCentered) && {uiNamespace getVariable [QGVAR(cursorMenuOpened),false]}) then { +if (([GVAR(cursorKeepCentered), GVAR(cursorKeepCenteredSelfInteraction)] select GVAR(keyDownSelfAction)) && {uiNamespace getVariable [QGVAR(cursorMenuOpened), false]}) then { _pos set [0, ((_pos select 0) - (GVAR(cursorPos) select 0) + 0.5)]; _pos set [1, ((_pos select 1) - (GVAR(cursorPos) select 1) + 0.5)]; }; diff --git a/addons/interact_menu/initSettings.sqf b/addons/interact_menu/initSettings.sqf index 45c9fdbd3b0..8d353906f69 100644 --- a/addons/interact_menu/initSettings.sqf +++ b/addons/interact_menu/initSettings.sqf @@ -1,9 +1,81 @@ [ QGVAR(selectorColor), "COLOR", - localize LSTRING(SelectorColor), - format ["ACE %1", localize LSTRING(Category_InteractionMenu)], + LSTRING(SelectorColor), + format ["ACE %1", LLSTRING(Category_InteractionMenu)], [1, 0, 0], false, {GVAR(selectorColorHex) = _this call BIS_fnc_colorRGBtoHTML} // Stored in Hex to avoid constant conversion ] call CBA_settings_fnc_init; + +[ + QGVAR(alwaysUseCursorInteraction), + "CHECKBOX", + LSTRING(AlwaysUseCursorInteraction), + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], + false, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(cursorKeepCentered), + "CHECKBOX", + [LSTRING(cursorKeepCentered), LSTRING(cursorKeepCenteredDescription)], + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], + false, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(useListMenu), + "CHECKBOX", + LSTRING(UseListMenu), + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], + false, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(menuBackground), + "LIST", + LSTRING(background), + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], + [[0, 1, 2], ["STR_A3_OPTIONS_DISABLED", LLSTRING(backgroundBlur), LLSTRING(backgroundBlack)], 0], + false +] call CBA_settings_fnc_init; + +[ + QGVAR(alwaysUseCursorSelfInteraction), + "CHECKBOX", + LSTRING(AlwaysUseCursorInteraction), + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], + true, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(cursorKeepCenteredSelfInteraction), + "CHECKBOX", + [LSTRING(cursorKeepCentered), LSTRING(cursorKeepCenteredDescription)], + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], + false, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(useListMenuSelf), + "CHECKBOX", + LSTRING(UseListMenu), + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], + false, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(menuBackgroundSelf), + "LIST", + LSTRING(background), + [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], + [[0, 1, 2], ["STR_A3_OPTIONS_DISABLED", LLSTRING(backgroundBlur), LLSTRING(backgroundBlack)], 0], + false +] call CBA_settings_fnc_init; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 2e29db71e56..ab4c9f89f1c 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -64,6 +64,7 @@ 상호작용 키 互动键 互動鍵 + Etkileşim Tuşu Self Interaction Key @@ -80,6 +81,7 @@ 자기상호작용 키 自我互动键 自我互動鍵 + Kendi Etkileşimim Tuşu Self Actions @@ -96,6 +98,7 @@ 자기 동작 自我动作 自我動作 + Kendi Etkileşimim Vehicle Actions @@ -112,6 +115,7 @@ 차량 동작 载具动作 載具動作 + Araç Etkileşimi Zeus Actions @@ -128,12 +132,13 @@ Zeus 동작 宙斯操作 宙斯操作 + Zeus Etkileşimi Interaction - Text Max Interakcja - Tekst max Interakce - Text Max - Interaction - Texte Max + Interaction - Texte max Interaktionstextfarbe Max Interazioni - Testo Massimo Взаимодействие - Текст Макс. @@ -149,7 +154,7 @@ Interaction - Text Min Interakcja - Tekst min Interakce - Text Min - Interaction - Texte Min + Interaction - Texte min Interaktionstextfarbe Min Interazioni - Testo Minimo Взаимодействие - Текст Мин. @@ -165,7 +170,7 @@ Interaction - Shadow Max Interakcja - Cień max Interakce - Stín Max - Interaction - Ombre Max + Interaction - Ombre max Interaktionstextschatten Max Interazioni - Ombra Massima Взаимодействие - Тень Макс. @@ -181,7 +186,7 @@ Interaction - Shadow Min Interakcja - Cień min Interakce - Stín Min - Interaction - Ombre Min + Interaction - Ombre min Interaktionstextschatten Min Interazioni - Ombra Minima Взаимодействие - Тень Мин. @@ -212,7 +217,7 @@ Keeps cursor centered and pans the option menu around. Useful if screen size is limited. Udržuje kurzor na středu. Užitečné, pokud je velikost obrazovky omezena. - Garde le curseur au milieu et dispose le menu des options autour. Utile si la taille de l'écran est limitée. + Garde le curseur au milieu de l'écran, et dispose le menu des options tout autour. Utile si la taille de l'écran est limitée. Центрирует курсор и двигает само меню опций. Полезно при ограниченном размере экрана. Hält den Mauszeiger zentriert und verschiebt das Menü beim Bewegen. Nützlich bei kleinen Bildschirmen. Középen tartja a kurzort, és a menüelemeket mozgatja. Hasznos lehetőség korlátozott képméretnél. @@ -230,7 +235,7 @@ Aktion nach Loslassen der Taste ausführen Wykonuj akcje po puszczeniu klawisza menu Provést akci při pustění klávesy menu - Action au relachement de touche + Action au relâchement des touches Выполнять действие при отпускании кнопки взаимодействия Realizar la acción al soltar la tecla menu Execute a ação quando soltar a tecla de menu @@ -277,7 +282,7 @@ Allows controlling the text's shadow. Outline ignores custom shadow colors. Umožňuje změnit stíny textu v menu interakce. Barva stínu je u tahu písma ignorována. Stellt den Hintergrundschatten ein. Die Einstellung 'Kontur' ignoriert die Farbe des Schattens. - Permet de controler l'ombre du texte. Le contour ne prend pas en compte la couleur des ombres. + Permet de régler l'ombre du texte. Le contour ne prend pas en compte la couleur des ombres. Дает возможность изменять тень, отбрасываемую текстом. Контур не зависит от выбранного цвета тени. Permite contolar la sombra del texto. El contorno ignora los colores personalizados de la sombra. Pozwala kontrolować cień tekstu. Kontury ignorują niestandardowe kolory cienia. @@ -312,7 +317,7 @@ Pozadí menu interakce Interaktionsmenü-Hintergrund Fundo do menu de interação - Arrière plan du menu d'interaction + Arrière-plan du menu d'interaction Cselekvő menü háttere Фон меню взаимодействия Sfondo Menù Interazioni @@ -328,7 +333,7 @@ Rozmazat obraz při otevřeném interakčním menu. Den Hintergrund verschwimmen lassen, während das Interaktionsmenü geöffnet ist. Desfocar o fundo enquanto o menu de interação está aberto. - Flouter l'arrière plan durant l'ouverture du menu d'interaction + Floute l'arrière-plan durant l'ouverture du menu d'interaction. A háttér elmosása a cselekvő menü használata alatt. Размыть фон, пока открыто меню взаимодействия. Sfoca lo sfondo mentre il Menù Interazioni è aperto. @@ -352,6 +357,7 @@ 화면 흐리게 模糊画面 模糊畫面 + Bulanık Ekran Black @@ -368,6 +374,7 @@ 까맣게 黑色 黑色 + Siyah Show actions for buildings @@ -375,7 +382,7 @@ Pokazuj akcje dla budynków Zobrazit akci pro budovy Mostrar acciones para edificios - Affiche les actions pour les batiments + Afficher les actions pour les bâtiments Cselekvések mutatása épületeknél Mostrar ações para edifícios Показывать действия для зданий @@ -391,7 +398,7 @@ Dodaje opcje interakcji dla otwierania drzwi oraz wchodzenia po drabinach do budynków. Uwaga: Użycie tej opcji może spowodować spadek wydajności menu interakcji, szczególnie w dużych miastach. Přidá možnost interakce pro otevření dvěří a umistňovat žebříky na budovy. (Poznámka: Použití této možnosti snižuje výkon při otevírání pomocí interakčního menu, zejména ve velkých městech.) Añade las acciones de interacción para la apertura de puertas y montaje de escaleras en los edificios. (Nota: Hay un coste de rendimiento al abrir el menú de interacción, especialmente en las ciudades) - Ajoute des interactions pour ouvrir les portes et les échelles des batiments. (Note: l'ouverture du menu en ville dégrade les performances) + Ajoute des interactions pour ouvrir les portes et les échelles des bâtiments.\nNote : l'ouverture du menu en ville dégrade les performances. Cselekvéseket engedélyez ajtók kinyitására és létrák mászására. (Figyelem: ez teljesítményvesztéssel járhat a menü megnyitásakor, főleg városokban) Adiciona ações de interações para abrir portas e montar escadas em edifícios. (Nota: Existe um custo de performance quando aberto o menu de interação, especialmente em cidades) Добавляет действия открывания дверей и залезания на лестницы для зданий. (Примечание: возможно падение производительности при открытии меню взаимодействия, особенно в городах) @@ -425,7 +432,7 @@ Rychlost animace interakce Velocità Animazioni Interazioni Velocidad de animación del menú de interacción - Vitesse de l'aniamtion d'interaction + Vitesse de l'animation d'interaction インタラクションのアニメーション速度 상호작용 움직임 속도 互动选单动画速度 @@ -440,7 +447,7 @@ Zrychlí animaci menu a sníží tak čas potřebný pro plné zobrazení podmenu Rende le animazioni Menù più veloci e diminuisce il tempo richiesto per mostrare sotto-azioni Hace la animación del menú más rápida, reduciendo el tiempo necesario para abrir sub-acciones. - Rend les animations de menu plus rapide et réduit le temps nécessaire à l'affichage des sous menus d'action + Rend les animations du menu plus rapide, et réduit le temps nécessaire à l'affichage des sous menus d'action. ホバーで子アクションを表示した時に出るメニューのアニメーション速度を早くしたり遅くしたりできます 使选单的动画速度更快,并减少子选项显现出来的时间 使選單的動畫速度更快,並減少子選項顯現出來的時間 @@ -448,11 +455,17 @@ Selector Color + Farbauswahl セレクターの色 选择器颜色 選單的顏色 Controllo Settore Kolor wybierającego + Цвет селектора + Cor do Seletor + Couleur du sélecteur + Barva selektoru + Selector de color diff --git a/addons/interaction/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp index bdadfa5e63f..9fad6c819af 100644 --- a/addons/interaction/ACE_ZeusActions.hpp +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -54,7 +54,7 @@ class ACE_ZeusActions { displayName = "$STR_repair"; icon = "\A3\ui_f\data\igui\cfg\actions\repair_ca.paa"; condition = QUOTE(ZEUS_ACTION_CONDITION && {-1 < (curatorSelected select 0) findIf {_x isKindOf 'AllVehicles' && {!(_x isKindOf 'Man')}}}); - statement = QUOTE({if (_x isKindOf 'AllVehicles' && {!(_x isKindOf 'Man')}) then {_x setDamage 0}} forEach (curatorSelected select 0)); + statement = QUOTE(call FUNC(repair_Statement)); }; }; diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 558a0779fec..3239badbdd6 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -72,49 +72,49 @@ class CfgVehicles { displayName = CSTRING(TeamManagement); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {GVAR(EnableTeamManagement)}); statement = ""; + modifierFunction = QUOTE([ARR_3(assignedTeam _target, 'PATHTOF(UI\team\team_management_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); exceptions[] = {"isNotSwimming"}; showDisabled = 0; - icon = QPATHTOF(UI\team\team_management_ca.paa); class ACE_AssignTeamRed { displayName = CSTRING(AssignTeamRed); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); - statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_target,'RED',true)] call DFUNC(joinTeam)); exceptions[] = {"isNotSwimming"}; showDisabled = 1; - icon = QPATHTOF(UI\team\team_red_ca.paa); + modifierFunction = QUOTE([ARR_3('RED', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_AssignTeamGreen { displayName = CSTRING(AssignTeamGreen); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); - statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_target,'GREEN',true)] call DFUNC(joinTeam)); exceptions[] = {"isNotSwimming"}; showDisabled = 1; - icon = QPATHTOF(UI\team\team_green_ca.paa); + modifierFunction = QUOTE([ARR_3('GREEN', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_AssignTeamBlue { displayName = CSTRING(AssignTeamBlue); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); - statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_target,'BLUE',true)] call DFUNC(joinTeam)); exceptions[] = {"isNotSwimming"}; showDisabled = 1; - icon = QPATHTOF(UI\team\team_blue_ca.paa); + modifierFunction = QUOTE([ARR_3('BLUE', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_AssignTeamYellow { displayName = CSTRING(AssignTeamYellow); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); - statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_target,'YELLOW',true)] call DFUNC(joinTeam)); exceptions[] = {"isNotSwimming"}; showDisabled = 1; - icon = QPATHTOF(UI\team\team_yellow_ca.paa); + modifierFunction = QUOTE([ARR_3('YELLOW', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_UnassignTeam { displayName = CSTRING(LeaveTeam); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'MAIN'}); - statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_target,'MAIN',true)] call DFUNC(joinTeam)); exceptions[] = {"isNotSwimming"}; showDisabled = 1; - icon = QPATHTOF(UI\team\team_white_ca.paa); + modifierFunction = QUOTE([ARR_3('MAIN', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; }; @@ -244,48 +244,48 @@ class CfgVehicles { condition = QUOTE(GVAR(EnableTeamManagement)); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; statement = ""; + modifierFunction = QUOTE([ARR_3(assignedTeam _target, 'PATHTOF(UI\team\team_management_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); showDisabled = 1; - icon = QPATHTOF(UI\team\team_management_ca.paa); class ACE_JoinTeamRed { displayName = CSTRING(JoinTeamRed); condition = QUOTE(true); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; - statement = QUOTE([ARR_2(_player,'RED')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_player,'RED',true)] call DFUNC(joinTeam)); showDisabled = 1; - icon = QPATHTOF(UI\team\team_red_ca.paa); + modifierFunction = QUOTE([ARR_3('RED', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_JoinTeamGreen { displayName = CSTRING(JoinTeamGreen); condition = QUOTE(true); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; - statement = QUOTE([ARR_2(_player,'GREEN')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_player,'GREEN',true)] call DFUNC(joinTeam)); showDisabled = 1; - icon = QPATHTOF(UI\team\team_green_ca.paa); + modifierFunction = QUOTE([ARR_3('GREEN', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_JoinTeamBlue { displayName = CSTRING(JoinTeamBlue); condition = QUOTE(true); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; - statement = QUOTE([ARR_2(_player,'BLUE')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_player,'BLUE',true)] call DFUNC(joinTeam)); showDisabled = 1; - icon = QPATHTOF(UI\team\team_blue_ca.paa); + modifierFunction = QUOTE([ARR_3('BLUE', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_JoinTeamYellow { displayName = CSTRING(JoinTeamYellow); condition = QUOTE(true); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; - statement = QUOTE([ARR_2(_player,'YELLOW')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_player,'YELLOW',true)] call DFUNC(joinTeam)); showDisabled = 1; - icon = QPATHTOF(UI\team\team_yellow_ca.paa); + modifierFunction = QUOTE([ARR_3('YELLOW', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_LeaveTeam { displayName = CSTRING(LeaveTeam); condition = QUOTE(assignedTeam _player != 'MAIN'); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; - statement = QUOTE([ARR_2(_player,'MAIN')] call DFUNC(joinTeam)); + statement = QUOTE([ARR_3(_player,'MAIN',true)] call DFUNC(joinTeam)); showDisabled = 1; - icon = QPATHTOF(UI\team\team_white_ca.paa); + modifierFunction = QUOTE([ARR_3('MAIN', 'PATHTOF(UI\team\team_white_ca.paa)', _this select 3)] call FUNC(modifyTeamManagementAction)); }; class ACE_BecomeLeader { displayName = CSTRING(BecomeLeader); @@ -299,7 +299,7 @@ class CfgVehicles { displayName = CSTRING(LeaveGroup); condition = QUOTE(count (units group _player) > 1); exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; - statement = QUOTE(_oldGroup = units group _player; _newGroup = createGroup side _player; [_player] joinSilent _newGroup; {_player reveal _x} forEach _oldGroup;); + statement = QUOTE(_oldGroup = units group _player; _newGroup = createGroup side group _player; [_player] joinSilent _newGroup; {_player reveal _x} forEach _oldGroup;); showDisabled = 1; icon = QPATHTOF(UI\team\team_management_ca.paa); }; @@ -706,6 +706,30 @@ class CfgVehicles { }; }; + class Land_Camping_Light_off_F: ThingX { + class ACE_Actions { + class ACE_MainActions { + displayName = CSTRING(MainAction); + distance = 2; + + // to make "Camping Lantern (Off)" be turned on we replace it with "Camping Lantern" + class GVAR(TurnOn) { + displayName = CSTRING(TurnOn); + icon = "\A3\Ui_f\data\IGUI\Cfg\VehicleToggles\LightsIconOn_ca.paa"; + condition = QUOTE(alive _target); + statement = QUOTE(\ + private _position = getPosATL _target;\ + private _vectorDirAndUp = [ARR_2(vectorDir _target,vectorUp _target)];\ + deleteVehicle _target;\ + private _newLamp = 'Land_Camping_Light_F' createVehicle [ARR_3(0,0,0)];\ + _newLamp setPosATL _position;\ + _newLamp setVectorDirAndUp _vectorDirAndUp;\ + ); + }; + }; + }; + }; + class RoadCone_F: ThingX { class ACE_Actions { class ACE_MainActions { diff --git a/addons/interaction/RscTitles.hpp b/addons/interaction/RscTitles.hpp index b619ed594cc..e157fd696c1 100644 --- a/addons/interaction/RscTitles.hpp +++ b/addons/interaction/RscTitles.hpp @@ -67,7 +67,7 @@ class RscACE_SelectAnItem { text = ""; }; class itemList: RscListBox { - onMouseButtonDblClick = "_this call ACE_Interaction_fnc_onSelectMenuDblClick"; + onMouseButtonDblClick = QUOTE(_this call DFUNC(onSelectMenuDblClick)); idc = 8866; x = X_OFFSET + 0.005; w = 0.59; @@ -106,7 +106,7 @@ class RscACE_SelectAnItem { y = 0.605; style = 2; text = CSTRING(Back); - action = "call ACE_Interaction_fnc_hideMenu;"; //'Default' call ACE_Interaction_fnc_openMenu; 'Default' call ACE_Interaction_fnc_openMenuSelf; + action = QUOTE(call DFUNC(hideMenu);); //'Default' call DFUNC(openMenu); 'Default' call DFUNC(openMenuSelf); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; colorBackgroundActive[] = {1,1,1,0.2}; @@ -120,7 +120,7 @@ class RscACE_SelectAnItem { w = 0.15; style = 2; text = CSTRING(MakeSelection); - action = "call ACE_Interaction_fnc_hideMenu;"; + action = QUOTE(call DFUNC(hideMenu);); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; colorBackgroundActive[] = {1,1,1,0.2}; diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp index ea6c275f365..5fb57ce6df3 100644 --- a/addons/interaction/XEH_PREP.hpp +++ b/addons/interaction/XEH_PREP.hpp @@ -18,6 +18,7 @@ PREP(getDown); PREP(sendAway); PREP(canJoinGroup); PREP(modifyJoinGroupAction); +PREP(modifyTeamManagementAction); PREP(canJoinTeam); PREP(joinTeam); PREP(canPassMagazine); diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index 4b97c408aae..7a9f2b6572d 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -135,21 +135,3 @@ GVAR(isOpeningDoor) = false; }]; }; }] call CBA_fnc_addEventHandler; - - -// to make "Camping Lantern (Off)" be turned on we replace it with "Camping Lantern" -private _action = [ - QGVAR(TurnOn), - localize LSTRING(TurnOn), - "\A3\Ui_f\data\IGUI\Cfg\VehicleToggles\LightsIconOn_ca.paa", - { - private _position = getPosATL _target; - private _vectorDirAndUp = [vectorDir _target, vectorUp _target]; - deleteVehicle _target; - private _newLamp = "Land_Camping_Light_F" createVehicle [0,0,0]; - _newLamp setPosATL _position; - _newLamp setVectorDirAndUp _vectorDirAndUp; - }, - {alive _target} -] call EFUNC(interact_menu,createAction); -["Land_Camping_Light_off_F", 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf index b47cf6628db..dbc37e2bb68 100644 --- a/addons/interaction/XEH_preInit.sqf +++ b/addons/interaction/XEH_preInit.sqf @@ -6,4 +6,11 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +DFUNC(repair_Statement) = { // moved from config because of build problems + TRACE_1("repair_Statement",_this); + { + if (_x isKindOf 'AllVehicles' && {!(_x isKindOf 'Man')}) then { _x setDamage 0; }; + } forEach (curatorSelected select 0) +}; + ADDON = true; diff --git a/addons/interaction/functions/fnc_addPassengerActions.sqf b/addons/interaction/functions/fnc_addPassengerActions.sqf index 673fb3ad009..03d77e39018 100644 --- a/addons/interaction/functions/fnc_addPassengerActions.sqf +++ b/addons/interaction/functions/fnc_addPassengerActions.sqf @@ -12,7 +12,7 @@ * Children actions * * Example: - * array = [target, player, [params]] call ace_interaction_fnc_addPassengerAction + * array = [target, player, [params]] call ace_interaction_fnc_addPassengerActions * * Public: No */ diff --git a/addons/interaction/functions/fnc_canPassMagazine.sqf b/addons/interaction/functions/fnc_canPassMagazine.sqf index f25e5da1646..5cc1ed96e20 100644 --- a/addons/interaction/functions/fnc_canPassMagazine.sqf +++ b/addons/interaction/functions/fnc_canPassMagazine.sqf @@ -19,11 +19,12 @@ params ["_player", "_target", "_weapon"]; if (!GVAR(enableMagazinePassing)) exitWith {false}; +if (_weapon isEqualTo "") exitWith {false}; if (((vehicle _target) != _target) && {(vehicle _target) != (vehicle _player)}) exitWith {false}; -private _compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines"); -{ +private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; + +(magazinesAmmoFull _player) findIf { _x params ["_className", "", "_loaded"]; - if ((_className in _compatibleMags) && {!_loaded} && {_target canAdd _className}) exitWith {true}; - false -} foreach (magazinesAmmoFull _player); + (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} +} > -1 diff --git a/addons/interaction/functions/fnc_getVehiclePos.sqf b/addons/interaction/functions/fnc_getVehiclePos.sqf index 2da5a318209..bd25fc710b3 100644 --- a/addons/interaction/functions/fnc_getVehiclePos.sqf +++ b/addons/interaction/functions/fnc_getVehiclePos.sqf @@ -56,7 +56,7 @@ if (_cameraPosASL select 2 >= 0) then { _pos set [2, (_pos select 2) min _dz]; }; -TRACE_4("",_bb,_bbX,_relPos,_pos,_cameraPosASL); +TRACE_5("",_bb,_bbX,_relPos,_pos,_cameraPosASL); _pos /////////////////// diff --git a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf index 186d4249567..17f77922b9c 100644 --- a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf +++ b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf @@ -59,5 +59,5 @@ if (_cameraPosASL select 2 >= 0) then { _pos set [2, (_pos select 2) min _dz]; }; -TRACE_4("",_bb,_bbX,_relPos,_pos,_cameraPosASL); +TRACE_5("",_bb,_bbX,_relPos,_pos,_cameraPosASL); _pos diff --git a/addons/interaction/functions/fnc_joinTeam.sqf b/addons/interaction/functions/fnc_joinTeam.sqf index 92e06b42173..06a1ea9f721 100644 --- a/addons/interaction/functions/fnc_joinTeam.sqf +++ b/addons/interaction/functions/fnc_joinTeam.sqf @@ -6,17 +6,18 @@ * Arguments: * 0: Unit * 1: Team + * 2: Display hint (default: false) * * Return Value: * None * * Example: - * [player, "YELLOW"] call ace_interaction_fnc_joinTeam + * [player, "YELLOW", false] call ace_interaction_fnc_joinTeam * * Public: No */ -params ["_unit", "_team"]; +params ["_unit", "_team", ["_displayHint", false, [false]]]; ["CBA_teamColorChanged", [_unit, _team]] call CBA_fnc_globalEvent; @@ -30,6 +31,7 @@ if (_unit == ACE_player) then { _team = localize format [LSTRING(Team%1), _team]; _message = format [localize LSTRING(JoinedTeam), _team]; }; - - [_message] call EFUNC(common,displayTextStructured); + if (_displayHint) then { + [_message] call EFUNC(common,displayTextStructured); + }; }; diff --git a/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf b/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf new file mode 100644 index 00000000000..f7f82f2453e --- /dev/null +++ b/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Modifies the ACE_TeamManagement or join team action with given group color and icon. + * + * Arguments: + * 0: Team color + * 1: Icon to show on action + * 2: Action Data to modifiy + * + * Return Value: + * None + * + * + * Public: No + */ + +params ["_teamColor", "_icon", "_actionData"]; + +private _color = switch (toUpper _teamColor) do { + case "RED": {missionNamespace getVariable [QEGVAR(nametags,nametagColorRed), [221, 0, 0]]}; + case "GREEN": {missionNamespace getVariable [QEGVAR(nametags,nametagColorGreen), [0, 221, 0]]}; + case "BLUE": {missionNamespace getVariable [QEGVAR(nametags,nametagColorBlue), [0, 0, 221]]}; + case "YELLOW": {missionNamespace getVariable [QEGVAR(nametags,nametagColorYellow), [221, 221, 0]]}; + default {missionNamespace getVariable [QEGVAR(nametags,nametagColorMain), [255, 255, 255]]}; +}; + +_actionData set [2, [_icon, _color call BIS_fnc_colorRGBtoHTML]]; + +nil diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf index d27ac52f44d..73cf4e0a37d 100644 --- a/addons/interaction/functions/fnc_openDoor.sqf +++ b/addons/interaction/functions/fnc_openDoor.sqf @@ -23,6 +23,10 @@ TRACE_2("openDoor",_house,_door); if (isNull _house) exitWith {}; +if ((configProperties [configFile >> "CfgVehicles" >> (typeOf _house) >> "UserActions"]) isEqualTo []) exitWith { + TRACE_1("Ignore houses with no UserActions",typeOf _house); // Fix problem with Shoothouse Walls +}; + private _getDoorAnimations = [_house, _door] call FUNC(getDoorAnimations); _getDoorAnimations params ["_animations"]; diff --git a/addons/interaction/functions/fnc_passMagazine.sqf b/addons/interaction/functions/fnc_passMagazine.sqf index c52e40e88fe..07db3dba3cc 100644 --- a/addons/interaction/functions/fnc_passMagazine.sqf +++ b/addons/interaction/functions/fnc_passMagazine.sqf @@ -12,21 +12,24 @@ * None * * Example: - * [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_magToPassazine + * [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_passMagazine * * Public: No */ params ["_player", "_target", "_weapon"]; -private _compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines"); -private _filteredMags = magazinesAmmoFull _player select {(_x select 0) in _compatibleMags && {!(_x select 2)}}; +private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; +private _filteredMags = magazinesAmmoFull _player select { + _x params ["_className", "", "_loaded"]; + (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} +}; //select magazine with most ammo private _magToPass = _filteredMags select 0; private _magToPassIndex = 0; { _x params ["_className", "_ammoCount"]; - if ((_ammoCount > (_magToPass select 1)) && (_target canAdd _className)) then { + if (_ammoCount > (_magToPass select 1)) then { _magToPass = _x; _magToPassIndex = _forEachIndex; }; diff --git a/addons/interaction/functions/fnc_showMouseHint.sqf b/addons/interaction/functions/fnc_showMouseHint.sqf index b56d053eaab..2c43937a0e5 100644 --- a/addons/interaction/functions/fnc_showMouseHint.sqf +++ b/addons/interaction/functions/fnc_showMouseHint.sqf @@ -8,7 +8,7 @@ * 0: Left click text * 1: Right click text * 2: Scroll text (default: "") - * 2: Extra icon/text pairs (default: []) + * 3: Extra icon/text pairs (default: []) * * Return Value: * None diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 50b023f95de..bacbf5e8e83 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -10,6 +10,12 @@ インタラクション 상호작용 Interakcja + Взаимодействие + Interação + Interaction + Interakce + Interacción + Etkileşim Interactions @@ -21,11 +27,12 @@ Взаимодействия Cselekvések Interazioni - Interaçãoes + Interações インタラクション 상호작용 互动 互動 + Etkileşimler Torso @@ -42,6 +49,7 @@ 몸통 身体 身體 + Gövde Head @@ -58,6 +66,7 @@ 머리 头部 頭部 + Kafa Left Arm @@ -74,6 +83,7 @@ 왼쪽 팔 左手 左手 + Sol Kol Right Arm @@ -90,6 +100,7 @@ 오른쪽 팔 右手 右手 + Sağ Kol Left Leg @@ -106,6 +117,7 @@ 왼쪽 다리 左脚 左腳 + Sol Bacak Right Leg @@ -122,6 +134,7 @@ 오른쪽 다리 右脚 右腳 + Sağ Bacak Weapon @@ -138,6 +151,7 @@ 무기 武器 武器 + Silah Interaction Menu @@ -154,6 +168,7 @@ 상호작용 메뉴 互动选单 互動選單 + Etkileim Menüsü Interaction Menu (Self) @@ -161,7 +176,7 @@ Menú de interacción (Propio) Menu interakcji (własne) Menu interakce (vlastní) - Menu d'interaction (Perso) + Menu d'interaction (personnel) Меню взаимодействия (с собой) Cselekvő menü (saját) Menu de Interação (Individual) @@ -170,6 +185,7 @@ 상호작용 메뉴(자신) 互动选单 (自我) 互動選單 (自我) + Etkileşim Menüsü(Şahsi) Open / Close Door @@ -177,7 +193,7 @@ Abrir / Cerrar puerta Otwórz / Zamknij drzwi Otevřít / Zavřít dveře - Ouvrir / Fermer la porte + Ouvrir/Fermer la porte Открыть / Закрыть двери Ajtó nyitása / zárása Abrir / Fechar Porta @@ -186,6 +202,7 @@ 문 열기 / 닫기 打开/关上 门 打開/關上 門 + Kapıyı Aç/Kapat Lock Door @@ -202,6 +219,7 @@ 문 잠그기 锁门 鎖門 + Kapıyı Kilitle Unlock Door @@ -218,6 +236,7 @@ 잠긴문 열기 解锁门 解鎖門 + Kapının Kilidini Aç Locked Door @@ -234,6 +253,7 @@ 잠긴 문 门已上锁 門已上鎖 + Kilitli Kapı Unlocked Door @@ -250,6 +270,7 @@ 열린 문 门未上锁 門未上鎖 + Kilidi Açık Kapı Join group @@ -266,6 +287,7 @@ 그룹 참여 加入小队 加入小隊 + Gruba katıl Leave Group @@ -282,6 +304,7 @@ 그룹 나가기 离开小队 離開小隊 + Gruptan ayrıl Become Leader @@ -298,6 +321,7 @@ 리더 되기 成为队长 成為隊長 + Lider ol DANCE! @@ -305,7 +329,7 @@ BAILAR! TAŃCZ! TANCUJ! - Danser ! + DANSER ! ТАНЦЕВАТЬ! TÁNC! DANCE! @@ -314,6 +338,7 @@ 춤추기! 跳舞 跳舞 + DANS! Stop Dancing @@ -330,6 +355,7 @@ 춤 멈추기 停止跳舞 停止跳舞 + Dans Etmeyi Durdur << Back @@ -346,6 +372,7 @@ <<뒤로 <<返回 <<返回 + << Geri Put weapon on back @@ -362,6 +389,7 @@ 등에 무기 메기 将武器放到背后 將武器放到背後 + Silahı arkaya koy Tap Shoulder @@ -378,12 +406,13 @@ 어깨 치기 轻拍肩膀 輕拍肩膀 + Omuzuna Dokun You were tapped on the RIGHT shoulder Te tocaron el hombro DERECHO Dir wurde auf die rechte Schulter geklopft - On vous tape sur l'épaule droite + On vous tape sur l'épaule DROITE Zostałeś klepnięty w prawe ramię Megveregették a JOBB válladat. Někdo tě poklepal na PRAVÉ rameno @@ -394,12 +423,13 @@ 누군가 오른쪽 어깨를 쳤다 你的右肩膀被轻拍了一下 你的右肩膀被輕拍了一下 + Birisi Sağ Omuzuna Dokundu You were tapped on the LEFT shoulder. Te tocaron el hombro IZQUIERDO. Dir wurde auf die linke Schulter geklopft - On vous tape sur l'épaule gauche + On vous tape sur l'épaule GAUCHE Zostałeś klepnięty w lewe ramię Megveregették a BAL válladat. Někdo tě poklepal na LEVÉ rameno @@ -410,6 +440,7 @@ 누군가 왼쪽 어깨를 쳤다 你的左肩膀被轻拍了一下 你的左肩膀被輕拍了一下 + Birisi Sol Omuzuna Dokundu Cancel @@ -426,6 +457,7 @@ 취소 取消 取消 + Iptal Select @@ -442,6 +474,7 @@ 선택 选择 選擇 + Seç Go Away! @@ -450,7 +483,7 @@ Odejdź! Jděte pryč! Allez-vous-en ! - Уходите отсюда! + Уйдите отсюда! Tűnés! Vá Embora! Via di qui! @@ -458,6 +491,7 @@ 저리 가! 走开! 走開! + Git! Get Down! @@ -465,7 +499,7 @@ Al suelo! Padnij! K zemi! - A terre ! + À terre ! A földre! Ложись! Abaixe-se! @@ -474,6 +508,7 @@ 엎드려! 趴下! 趴下! + Yat! Get Out @@ -482,12 +517,14 @@ Aussteigen! Sal del vehículo! Sortez ! - Выходи + Выходи! Vystupte 降りろ 나가 出去 出去 + Saia! + Dışarı Team Management @@ -504,6 +541,7 @@ 팀 설정 小队管理 小隊管理 + Takım Yönetimi Red @@ -520,6 +558,7 @@ 빨강 红色 紅色 + Kırmızı Green @@ -536,6 +575,7 @@ 초록 绿色 綠色 + Yeşil Blue @@ -552,6 +592,7 @@ 파랑 蓝色 藍色 + Mavi Yellow @@ -568,6 +609,7 @@ 노랑 黄色 黃色 + Sarı Assign Red @@ -584,6 +626,7 @@ 빨강에 등록 指派为红组 指派為紅組 + Kırmızıya Ata Assign Green @@ -600,6 +643,7 @@ 초록에 등록 指派为绿组 指派為綠組 + Yeşile Ata Assign Blue @@ -616,6 +660,7 @@ 파랑이 등록 指派为蓝组 指派為藍組 + Maviye Ata Assign Yellow @@ -632,6 +677,7 @@ 노랑에 등록 指派为黄组 指派為黃組 + Sarıya Ata Join Red @@ -648,6 +694,7 @@ 빨강에 참여 加入红组 加入紅組 + Kırmızıya Katıl Join Green @@ -664,6 +711,7 @@ 초록에 참여 加入绿组 加入綠組 + Yeşile Katıl Join Blue @@ -680,6 +728,7 @@ 파랑에 참여 加入蓝组 加入藍組 + Maviye Katıl Join Yellow @@ -696,12 +745,13 @@ 노랑에 참여 加入黄组 加入黃組 + Sarıya Katıl You joined Team %1 Du bist Gruppe %1 beigetreten Te has unido al equipo %1 - Vous avez rejoint l'équipe %1 + Vous avez rejoint l'équipe %1. Dołączyłeś do %1 Připojili jste se do %1 týmu Вы присоединились к группе %1 @@ -712,6 +762,7 @@ 당신은 %1팀에 참여했습니다 你已加入%1组 你已加入%1組 + Takıma katıldın %1 Leave Team @@ -728,12 +779,13 @@ 팀 나가기 离开小队 離開小隊 + Takımdan Ayrıl You left the Team Du hast die Gruppe verlassen Has dejado el equipo - Vous avez quitté l'équipe + Vous avez quitté l'équipe. Opuściłeś drużynę Opustili jste tým Вы покинули группу @@ -744,6 +796,7 @@ 팀을 나갔습니다 你已离开小队 你已離開小隊 + Takımdan Ayrıldın Pardon @@ -760,6 +813,7 @@ 허용 原谅 原諒 + Pardon Scroll @@ -776,6 +830,7 @@ 스크롤 滚动 滾動 + Kaydırma Modifier Key @@ -792,6 +847,7 @@ 키 할당하기 编辑按键 編輯按鍵 + Modifiye Tuşu Not in Range @@ -808,6 +864,7 @@ 범위 내에 없습니다 不在范围内 不在範圍內 + Menzilde Değil Equipment @@ -824,6 +881,7 @@ 장비 装备 裝備 + Ekipmanlar Push @@ -840,14 +898,21 @@ 밀기 + Ittir Flip + Umdrehen Перевернуть ひっくり返す Gira Przewróć + Virar + Tourner + Otočit + Voltear + Döndür Interact @@ -864,6 +929,7 @@ 상호작용 互动 互動 + Etkileşim Passengers @@ -880,6 +946,7 @@ 승객 乘客 乘客 + Yolcular Open @@ -896,6 +963,7 @@ 열기 打开 打開 + Interaction System @@ -912,6 +980,7 @@ 상호작용 시스템 互动系统 互動系統 + Etkileşim Sistemi Enable Team Management @@ -924,10 +993,11 @@ Csapatkezelés engedélyezése Habilitar gestão de equipes Abilità Management Squadra - チーム管理を使う + チーム管理の有効化 팀 설정 활성화 启用小队管理 啟用小隊管理 + Takım Yönetimini Etkinleştir Should players be allowed to use the Team Management Menu? Default: Yes @@ -936,14 +1006,15 @@ Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja Mohou hráči použít menu správy týmu? Výchozí: Ano Разрешить ли игрокам использовать меню управления группами? По-умолчани: Да - Permettre aux joueurs d'utiliser la gestion de groupe? Défaut : oui + Permet aux joueurs d'utiliser la gestion d'équipe. Valeur par défaut : activé. A játékosoknak engedélyezve legyen a csapatkezelő menü? Alapértelmezett: Igen Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim Possono i giocatori usare il Menù Managment Squadra? Default: Si - プレイヤーがチーム管理メニューを使えるようにしますか? 標準: 有効化 + プレイヤーがチーム管理メニューを使えるかどうかを設定します。標準: 有効化 플레이어들이 팀 설정하는 것을 허락합니까? 기본설정: 예 允许玩家使用小队管理选单? 预设: 是 允許玩家使用小隊管理選單? 預設: 是 + Oyuncuların Takım Yönetimi Menüsünü kullanmalarına izin verilmeli mi? Varsayılan: Evet Disable negative rating @@ -954,6 +1025,11 @@ 关闭负面评价 부정행위 가중치 사용안함 Wyłącz negatywną ocenę + Отключить отрицательный рейтинг + Desativar avaliação negativa + Désactiver la notation négative + Vypnout negativní hodnocení + Deshabilitar valoración negativa Should players receive negative rating? When enabled players are only receiving positive ratings which prevents friendly AI fire when destroying friendly equipment or killing team members. @@ -964,6 +1040,11 @@ 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。 플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 높은 레이팅을 가질때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다. Czy powinni gracze otrzymywać negatywną ocenę? Kiedy aktywowani gracze otrzymuję wyłącznie pozytywną ocenę, która zapobiega ognia przyjaznego SI podczas niszczenia przyjaznego wyposażenia lub zabijaniu członków drużyny. + Должны ли игроки получать отрицательный рейтинг? Когда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды. + Jogadores devem receber uma avaliação negativa? Quando ativado, os jogadores estão recebendo avaliações positivas, prevenindo que IA amigável atire quando destruir algum equipamento aliado ou matar membros de equipe. + Définit si les joueurs peuvent recevoir une note négative. Si l'option est activée, les joueurs obtiennent des notes positives exclusivement.\nCela permet d'éviter que les unités IA ne fassent du tir ami lorsque des joueurs détruisent de l'équipement allié, ou tuent des membres de l'équipe. + Měli by hráči obdržet negativní hodnocení? Pokud ne, hráči obdrží pouze pozitivní hodnocení, což zabrání přátelské AI střílet na hráče pokud hráči ničí přátelské vybavení nebo zabíjejí vlastní tým. + ¿Deben los jugadores recibir una calificación negativa? Cuando los jugadores habilitados solo reciben calificaciones positivas, lo que evita el fuego amistoso de la IA al destruir equipamiento amigo o matar a los miembros del equipo. Team management allows color allocation for team members, taking team command and joining/leaving teams. @@ -971,7 +1052,7 @@ Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. La gestión del equipo permite la asignación de colores para los miembros del equipo, tomando el mando del equipo y uniendo/dejando equipos. - La gestion d'équipe permet l'allocation de couleur aux membres d'équipe, de prendre le commandement, de rejoindre ou quitter une équipe. + La gestion d'équipe permet d'allouer des couleurs aux membres des équipes, de prendre le commandement, et de rejoindre ou quitter une équipe. A csapatkezelés engedélyezi a tagok színének meghatározását, a vezetés átvételét, és csapatoknál be-és kilépést. O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. Управление группами позволяет назначать цвета членам групп, брать командование, вступать в группы или покидать их. @@ -995,13 +1076,14 @@ 켜기 开启 開啟 + Turn off Deaktivieren Wyłącz Apagar - Eteindre + Éteindre Spegni Vypnout Desligar @@ -1010,6 +1092,7 @@ 끄기 关闭 關閉 + Kapat Pass magazine @@ -1035,11 +1118,12 @@ Zásobník do primární zbraně Caricatore Primario Cargador primario - Chargeur de l'arme principale + Chargeur d'arme principale プライマリ用弾倉 주무기 탄창 给予主武器弹匣 給予主武器彈匣 + Birincil Şarjörü Pistol magazine @@ -1055,6 +1139,7 @@ 부무기 탄창 给予手枪弹匣 給予手槍彈匣 + Tabanca Şarjörü %1 passed you a %2 magazine. @@ -1081,13 +1166,14 @@ Mostra interazione "passa caricatore" Mostrar "Pasar cargador" en el menú de interacción Montrer l'interaction "Passer un chargeur" - "弾倉を渡す"をインタラクションに表示する + "弾倉を渡す"をインタラクションに表示 '탄창 건네기'를 상호작용에서 보여줌 显示"给予弹匣"互动动作 顯示"給予彈匣"互動動作 Pull out body + Person herausziehen Вытащить тело 身体を引き出す Estrai il corpo @@ -1095,17 +1181,24 @@ 拿出屍體 拿出尸体 Wyciągnij ciało + Retirar Corpo + Retirer le corps + Vytáhnout tělo + Sacar cuerpo Smash windshield Frontscheibe einschlagen - Dégager le pare-brise + Briser le pare-brise Vyrazit čelní sklo Выбить лобовое стекло Wyłam szybę Szélvédő széttörése フロントガラスを破る Sfonda il parabrezza + Quebrar pára-brisa + 踹開擋風玻璃 + Romper parabrisas diff --git a/addons/inventory/XEH_postInit.sqf b/addons/inventory/XEH_postInit.sqf index 7135383734e..c5dc6c48f6c 100644 --- a/addons/inventory/XEH_postInit.sqf +++ b/addons/inventory/XEH_postInit.sqf @@ -9,46 +9,23 @@ if (!hasInterface) exitWith {}; // luckily we don't need private items, so dummy and parent classes are out of the picture GVAR(ItemKeyNamespace) = [] call CBA_fnc_createNamespace; +private _allItems = uiNamespace getVariable [QGVAR(ItemKeyCache), []]; //See XEH_preStart.sqf -private _fnc_addToCache = { - private _displayName = getText (_this >> "displayName"); - private _picture = getText (_this >> "picture"); - - // list box seems to delete the leading backslash - if (_picture select [0,1] == "\") then { - _picture = _picture select [1]; +// isEqualType is hacking protection as we cannot trust that the cache hasn't been manipulated +{ + if (_x isEqualType [] && {_x isEqualTypeArray ["", configNull]}) then { + GVAR(ItemKeyNamespace) setVariable _x; }; - - GVAR(ItemKeyNamespace) setVariable [format ["%1:%2", _displayName, _picture], _this]; -}; - -private _allItems = []; - -_allItems append ("getNumber (_x >> 'scope') > 0" configClasses (configFile >> "CfgWeapons")); -_allItems append ("getNumber (_x >> 'scope') > 0" configClasses (configFile >> "CfgGlasses")); -_allItems append ("getNumber (_x >> 'scope') == 2" configClasses (configFile >> "CfgMagazines")); -_allItems append ("getNumber (_x >> 'scope') > 0 && {getNumber (_x >> 'isBackpack') == 1}" configClasses (configFile >> "CfgVehicles")); - -{_x call _fnc_addToCache; false} count _allItems; +} forEach ([[], _allItems] select (_allItems isEqualType [])); GVAR(customFilters) = []; GVAR(selectedFilterIndex) = -1; // add custom filters -// generate list of grenades -GVAR(Grenades_ItemList) = []; - -{ - GVAR(Grenades_ItemList) append getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines"); - false -} count getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles"); - -// make list case insensitive -GVAR(Grenades_ItemList) = GVAR(Grenades_ItemList) apply {toLower _x}; - -// filter duplicates -GVAR(Grenades_ItemList) = GVAR(Grenades_ItemList) arrayIntersect GVAR(Grenades_ItemList); +// get list of grenades +GVAR(Grenades_ItemList) = uiNamespace getVariable [QGVAR(Grenades_ItemList), []]; +if (!(GVAR(Grenades_ItemList) isEqualType [])) then {GVAR(Grenades_ItemList) = []}; [localize LSTRING(Grenades), QFUNC(filterGrenades)] call FUNC(addCustomFilter); @@ -57,24 +34,8 @@ GVAR(Grenades_ItemList) = GVAR(Grenades_ItemList) arrayIntersect GVAR(Grenades_I [localize LSTRING(Vests), QFUNC(filterVests)] call FUNC(addCustomFilter); [localize LSTRING(Headgear), QFUNC(filterHeadgear)] call FUNC(addCustomFilter); -// generate list of medical items -GVAR(Medical_ItemList) = []; - -{ - GVAR(Medical_ItemList) append getArray (_x >> "items"); - false -} count ( - ("true" configClasses (configFile >> QEGVAR(Medical,Actions) >> "Basic")) + - ("true" configClasses (configFile >> QEGVAR(Medical,Actions) >> "Advanced")) -); - -// remove all numbers from list -GVAR(Medical_ItemList) = GVAR(Medical_ItemList) select {_x isEqualType ""}; - -// make list case insensitive -GVAR(Medical_ItemList) = GVAR(Medical_ItemList) apply {toLower _x}; - -// filter duplicates -GVAR(Medical_ItemList) = GVAR(Medical_ItemList) arrayIntersect GVAR(Medical_ItemList); +// get list of medical items +GVAR(Medical_ItemList) = uiNamespace getVariable [QGVAR(Medical_ItemList), []]; +if (!(GVAR(Medical_ItemList) isEqualType [])) then {GVAR(Medical_ItemList) = []}; [localize LSTRING(Medical), QFUNC(filterMedical)] call FUNC(addCustomFilter); diff --git a/addons/inventory/XEH_preStart.sqf b/addons/inventory/XEH_preStart.sqf index 022888575ed..18999d638e4 100644 --- a/addons/inventory/XEH_preStart.sqf +++ b/addons/inventory/XEH_preStart.sqf @@ -1,3 +1,53 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +//item cache, see XEH_postInit.sqf +private _allItems = ("getNumber (_x >> 'scope') > 0" configClasses (configFile >> "CfgWeapons")); +_allItems append ("getNumber (_x >> 'scope') > 0" configClasses (configFile >> "CfgGlasses")); +_allItems append ("getNumber (_x >> 'scope') == 2" configClasses (configFile >> "CfgMagazines")); +_allItems append ("getNumber (_x >> 'scope') > 0 && {getNumber (_x >> 'isBackpack') == 1}" configClasses (configFile >> "CfgVehicles")); + +uiNamespace setVariable [QGVAR(ItemKeyCache), _allItems apply { + private _displayName = getText (_x >> "displayName"); + private _picture = getText (_x >> "picture"); + + // list box seems to delete the leading backslash + if (_picture select [0,1] == "\") then { + _picture = _picture select [1]; + }; + + [format ["%1:%2", _displayName, _picture], _x]; +}]; + +// generate list of grenades +private _grenades_ItemList = []; + +{ + _grenades_ItemList append getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines"); +} forEach getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles"); + +// make list case insensitive +_grenades_ItemList = _grenades_ItemList apply {toLower _x}; + +// filter duplicates +_grenades_ItemList = _grenades_ItemList arrayIntersect _grenades_ItemList; + +uiNamespace setVariable [QGVAR(Grenades_ItemList), _grenades_ItemList]; + +// generate list of medical items +private _medical_ItemList = ["FirstAidKit", "Medikit"]; +{ + _medical_ItemList append getArray (_x >> "items"); +} forEach ("true" configClasses (configFile >> QEGVAR(medical_treatment,Actions))); + +// remove all numbers from list +_medical_ItemList = _medical_ItemList select {_x isEqualType ""}; + +// make list case insensitive +_medical_ItemList = _medical_ItemList apply {toLower _x}; + +// filter duplicates +_medical_ItemList = _medical_ItemList arrayIntersect _medical_ItemList; + +uiNamespace setVariable [QGVAR(Medical_ItemList), _medical_ItemList]; diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index ca09417810e..e5ed3008365 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -8,7 +8,7 @@ Изменить размер окна инвентаря Zvětšit zobrazení inventáře Powiększ UI ekwipunku - Agrandir la taille d'affichage de l'inventaire + Agrandir l'affichage de l'inventaire Legyen a felszerelés menüje nagyobb Ingrandisci il menù inventario Aumentar o Tamanho da Tela do Inventário @@ -16,6 +16,7 @@ 소지품 화면을 더 크게 합니다 使物品显示清单更大 使物品顯示清單更大 + Envanter Görüntüsünü Daha Büyük Yap Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed. @@ -24,7 +25,7 @@ Обычно, размер окна инвентаря зависит от размеров пользовательского интерфейса. Эта настройка позволяет увеличить размер окна инвентаря, не увеличивая размеры шрифтов, так что отображется большее количество строк. Normálně se velikost invetáře škáluje s velikostí UI. Toto nastavení dovoluje škálování velikost inventáře ale nežvětšuje velikost fontu. To dovoluje zobrazení více řad v inventáři. Ekwipunek skalowany jest poprzez rozmiar UI. Ta opcja pozwala powiększyć rozmiar UI ekwipunku, lecz nie zwiększa rozmiaru fontu pozwalając na wyświetlanie większej ilości wierszy. - L'inventaire est normalement affiché en fonction de la taille de l'UI. Cette option permet d'agrandir l'affichage de l'inventaire, mais n'a aucun effet sur la taille des polices permettant d'afficher plus de lignes. + En principe, l'affichage de l'inventaire est dimensionné par la taille de l'IU. Cette option permet d'agrandir l'IU de l'inventaire, mais sans augmenter la taille des polices, ce qui permet d'afficher plus de lignes. Alaphelyzetben a kezelőfelület mérete skálázza a felszerelési menüt. Ez az opció engedélyezi a menü felskálázását, de megtartja a betűméreteket, így növelve a láthatóságot. Normalmente il menù inventario è scalato in base alle dimensioni dell'interfaccia. Questa opzione permette di ingrandirlo ulteriormente ma senza aumentare la dimensione del testo. Normalmente o tamanho da tela do inventário é ditada pelo tamanho da UI. Isso permite aumentar o tamanho da tela de inventário, mas não aumenta o tamanho da fonte, permitindo que mais linhas sejam visualizadas. @@ -32,6 +33,7 @@ 보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케하면서 글씨는 그대로 냅두게 해줍니다. 一般来说,物品清单尺寸是由使用者介面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数! 一般來說,物品清單尺寸是由使用者介面來決定的。此選項能讓你的物品顯示清單更大但不會增加字體大小,此舉可增加更多能被顯示的描述行數! + Normalde envanter görüntüleme, kullanıcı arayüzü boyutuna göre ölçeklenir. Bu, Envanter kullanıcı arayüzü boyutunu büyütmeye izin verir, ancak daha fazla satır görüntülenmesine izin vermek için yazı tipi boyutunu büyütmez. Backpacks @@ -47,6 +49,7 @@ 가방 背包 背包 + Çantalar Headgear @@ -62,6 +65,7 @@ 헬멧 头盔 頭盔 + Kasklar Glasses @@ -77,6 +81,7 @@ 안경 眼镜 眼鏡 + Gözlükler Uniforms @@ -92,6 +97,7 @@ 복장 服装 服裝 + Üniformalar Vests @@ -107,6 +113,7 @@ 조끼 背心 背心 + Yelekler Grenades @@ -122,6 +129,7 @@ 수류탄 手榴弹 手榴彈 + Bombalar Medical @@ -137,6 +145,7 @@ 의료 医疗 醫療 + Sağlık diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index b277b6364e5..e06c6aae0bc 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -1,8 +1,16 @@ +class Mode_SemiAuto; class CfgWeapons { - - class missiles_titan_static; + class MissileLauncher; + class missiles_titan: MissileLauncher { + class Player: MissileLauncher { + EGVAR(missileGuidance,attackProfile) = "JAV_DIR"; + }; + class TopDown: Player { + EGVAR(missileGuidance,attackProfile) = "JAV_TOP"; + }; + }; + class missiles_titan_static: missiles_titan {}; class GVAR(Titan_Static): missiles_titan_static { - modes[] = {"Player"}; GVAR(enabled) = 1; weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = QPATHTOF(data\reticle_titan.p3d); @@ -13,7 +21,16 @@ class CfgWeapons { lockedTargetSound[] = {"",0,1}; }; - class launch_Titan_short_base; + class Launcher_Base_F; + class launch_Titan_base: Launcher_Base_F { + class Single: Mode_SemiAuto { + EGVAR(missileGuidance,attackProfile) = "JAV_DIR"; + }; + class TopDown: Single { + EGVAR(missileGuidance,attackProfile) = "JAV_TOP"; + }; + }; + class launch_Titan_short_base: launch_Titan_base {}; class launch_B_Titan_short_F: launch_Titan_short_base { GVAR(enabled) = 1; weaponInfoType = "ACE_RscOptics_javelin"; diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index b2de0be4e94..8c3b088dda3 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -14,7 +14,7 @@ * None * * Example: - * [] call ace_javelin_fnc_mapHelperDraw + * [] call ace_javelin_fnc_onOpticDraw * * Public: No */ diff --git a/addons/javelin/functions/fnc_showFireMode.sqf b/addons/javelin/functions/fnc_showFireMode.sqf index e7a8f80ade4..589a9727aa3 100644 --- a/addons/javelin/functions/fnc_showFireMode.sqf +++ b/addons/javelin/functions/fnc_showFireMode.sqf @@ -15,10 +15,22 @@ * Public: No */ -private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; -private _currentFireMode = _currentShooter getVariable ["ace_missileguidance_attackProfile", "JAV_TOP"]; +(if (((vehicle ACE_player) == ACE_player) || {ACE_player call CBA_fnc_canUseWeapon}) then { + weaponState ACE_player +} else { + _turretPath = if (ACE_player == (driver _currentShooter)) then {[-1]} else {ACE_player call CBA_fnc_turretPath}; + weaponState [vehicle ACE_player, _turretPath] +}) params ["_weapon", "", "_mode"]; + +private _currentFireMode = getText (configFile >> "CfgWeapons" >> _weapon >> _mode >> QEGVAR(missileGuidance,attackProfile)); -TRACE_1("showFireMode", _currentFireMode); +TRACE_3("showFireMode",_weapon,_mode,_currentFireMode); + +if (_currentFireMode == "") then { // backwards compatiblity for addons using ace_javelin (CUP) + private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; + _currentFireMode = _currentShooter getVariable ["ace_missileguidance_attackProfile", "JAV_TOP"]; + TRACE_1("using getVar",_currentFireMode); +}; if (_currentFireMode == "JAV_TOP") then { __JavelinIGUITop ctrlSetTextColor __ColorGreen; diff --git a/addons/javelin/script_component.hpp b/addons/javelin/script_component.hpp index b78032439df..3e9ad4ebfc1 100644 --- a/addons/javelin/script_component.hpp +++ b/addons/javelin/script_component.hpp @@ -26,7 +26,6 @@ #define __JavelinIGUISeek (__JavelinIGUI displayCtrl 699000) #define __JavelinIGUITop (__JavelinIGUI displayCtrl 699001) #define __JavelinIGUIDir (__JavelinIGUI displayCtrl 699002) -#define __JavelinIGUIRangefinder (__JavelinIGUI displayCtrl 151) // Constrains #define __JavelinIGUITargetingConstrains (__JavelinIGUI displayCtrl 699100) diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 96dc8d33eee..77b6d4a6232 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -3,11 +3,11 @@ Lock Target (Hold) - Ziel aufschalten + Ziel aufschalten (Halten) Захватить цель (удерживать) Zamknout cíl (držet) Namierz cel (przytrzymaj) - Verrouiller la cible (maintenir) + Javelin - Verrouiller la cible (maintenir) Célpontra állás (Lenyomva tartott) Aggangia il bersaglio Fijar objetivo (Mantener) @@ -16,6 +16,7 @@ 표적 획득 (누르기) 锁定目标 (按住) 鎖定目標 (按住) + Hedefe Kilitlen(Basılı Tut) diff --git a/addons/kestrel4500/CfgEventHandlers.hpp b/addons/kestrel4500/CfgEventHandlers.hpp index 10dce0a9bfe..2bed8a2eef7 100644 --- a/addons/kestrel4500/CfgEventHandlers.hpp +++ b/addons/kestrel4500/CfgEventHandlers.hpp @@ -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)); }; }; diff --git a/addons/kestrel4500/functions/fnc_canShow.sqf b/addons/kestrel4500/functions/fnc_canShow.sqf index d577cfd4d1b..0dc623c7355 100644 --- a/addons/kestrel4500/functions/fnc_canShow.sqf +++ b/addons/kestrel4500/functions/fnc_canShow.sqf @@ -15,4 +15,4 @@ * Public: No */ -("ACE_Kestrel4500" in (uniformItems ACE_player)) || ("ACE_Kestrel4500" in (vestItems ACE_player)) +"ACE_Kestrel4500" in ([ACE_player] call EFUNC(common,uniqueItems)) diff --git a/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf b/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf index 445c6cc7898..80ff3025f5f 100644 --- a/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf +++ b/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf @@ -15,12 +15,10 @@ * Public: No */ -if (GVAR(Kestrel4500)) exitWith { false }; -if (underwater ACE_player) exitWith { false }; -if (!("ACE_Kestrel4500" in (uniformItems ACE_player)) && !("ACE_Kestrel4500" in (vestItems ACE_player))) exitWith { false }; +if (GVAR(Kestrel4500) || {underwater ACE_player} || {!(call FUNC(canShow))}) exitWith {false}; GVAR(Overlay) = false; -3 cutText ["", "PLAIN"]; +QGVAR(Layer) cutText ["", "PLAIN"]; GVAR(Kestrel4500) = true; createDialog 'Kestrel4500_Display'; diff --git a/addons/kestrel4500/functions/fnc_dayOfWeek.sqf b/addons/kestrel4500/functions/fnc_dayOfWeek.sqf index 932f0a72aac..39190ca38fc 100644 --- a/addons/kestrel4500/functions/fnc_dayOfWeek.sqf +++ b/addons/kestrel4500/functions/fnc_dayOfWeek.sqf @@ -12,7 +12,7 @@ * Day of The Week * * Example: - * [1995, 10, 21] call ace_kestrel4500_fnc_buttonPressed + * [1995, 10, 21] call ace_kestrel4500_fnc_dayOfWeek * * Public: No */ diff --git a/addons/kestrel4500/functions/fnc_displayKestrel.sqf b/addons/kestrel4500/functions/fnc_displayKestrel.sqf index c93de715ed0..1c2338645e5 100644 --- a/addons/kestrel4500/functions/fnc_displayKestrel.sqf +++ b/addons/kestrel4500/functions/fnc_displayKestrel.sqf @@ -38,11 +38,10 @@ if (GVAR(Overlay)) exitWith { GVAR(Overlay) = false; - 3 cutText ["", "PLAIN"]; + QGVAR(Layer) cutText ["", "PLAIN"]; true }; -if (underwater ACE_player) exitWith { true }; -if (!("ACE_Kestrel4500" in (uniformItems ACE_player)) && !("ACE_Kestrel4500" in (vestItems ACE_player))) exitWith { true }; +if (underwater ACE_player || {!(call FUNC(canShow))}) exitWith {true}; if (GVAR(Kestrel4500) && dialog) then { GVAR(Kestrel4500) = false; @@ -53,9 +52,9 @@ GVAR(Overlay) = true; [{ // abort condition - if (!GVAR(Overlay) || {!(("ACE_Kestrel4500" in (uniformItems ACE_player)) || ("ACE_Kestrel4500" in (vestItems ACE_player)))}) exitWith { + if (!GVAR(Overlay) || {!(call FUNC(canShow))}) exitWith { GVAR(Overlay) = false; - 3 cutText ["", "PLAIN"]; + QGVAR(Layer) cutText ["", "PLAIN"]; [_this select 1] call CBA_fnc_removePerFrameHandler; }; @@ -64,7 +63,7 @@ GVAR(Overlay) = true; private _outputData = [] call FUNC(generateOutputData); - 3 cutRsc ["RscKestrel4500", "PLAIN", 1, false]; + QGVAR(Layer) cutRsc ["RscKestrel4500", "PLAIN", 1, false]; _outputData params [ "_ctrlTop", "_ctrlCenterBig", diff --git a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf index 5dcbf681d29..c28fef1262e 100644 --- a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf +++ b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf @@ -10,7 +10,7 @@ * wind speed * * Example: - * call ace_kestrel4500_fnc_canShow + * call ace_kestrel4500_fnc_measureWindSpeed * * Public: No */ diff --git a/addons/kestrel4500/functions/fnc_restoreUserData.sqf b/addons/kestrel4500/functions/fnc_restoreUserData.sqf index ca90f8bbcc7..869eb6eb17e 100644 --- a/addons/kestrel4500/functions/fnc_restoreUserData.sqf +++ b/addons/kestrel4500/functions/fnc_restoreUserData.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_kestrel4500_fnc_restore_user_data + * call ace_kestrel4500_fnc_restoreUserData * * Public: No */ diff --git a/addons/kestrel4500/functions/fnc_storeUserData.sqf b/addons/kestrel4500/functions/fnc_storeUserData.sqf index 71338984ff6..37bf2c90f65 100644 --- a/addons/kestrel4500/functions/fnc_storeUserData.sqf +++ b/addons/kestrel4500/functions/fnc_storeUserData.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_kestrel4500_fnc_store_user_data + * call ace_kestrel4500_fnc_storeUserData * * Public: No */ diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index f83c875d579..1ce5294745b 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -16,6 +16,7 @@ Kestrel 4500NV 猎隼4500测风仪 獵隼4500測風儀 + Kestrel 4500NV Kestrel 4500 Pocket Weather Tracker @@ -32,6 +33,7 @@ Kestrel 4500 휴대형 기상 관측기 猎隼4500掌上型天气追踪仪 獵隼4500掌上型天氣追蹤儀 + Kestrel 4500 Cep Hava Durumu Izleyicisi Open Kestrel 4500 @@ -48,6 +50,7 @@ Kestrel 4500 열기 开启猎隼4500测风仪 開啟獵隼4500測風儀 + Aç Kestrel 4500 Show Kestrel 4500 @@ -64,6 +67,7 @@ Kestrel 4500 보이기 显示猎隼4500测风仪 顯示獵隼4500測風儀 + Göster Kestrel 4500 Hide Kestrel 4500 @@ -80,6 +84,7 @@ Kestrel 4500 숨기기 隐藏猎隼4500测风仪 隱藏獵隼4500測風儀 + Gizle Kestrel 4500 Open Kestrel 4500 @@ -96,6 +101,7 @@ Kestrel 4500 열기 开启猎隼4500测风仪 開啟獵隼4500測風儀 + Aç Kestrel 4500 Show Kestrel 4500 @@ -112,6 +118,7 @@ Kestrel 4500 숨기기 显示猎隼4500测风仪 顯示獵隼4500測風儀 + Göster Kestrel 4500 diff --git a/addons/laser/functions/fnc_addLaserTarget.sqf b/addons/laser/functions/fnc_addLaserTarget.sqf index 48a98353e90..2cf99a53110 100644 --- a/addons/laser/functions/fnc_addLaserTarget.sqf +++ b/addons/laser/functions/fnc_addLaserTarget.sqf @@ -31,7 +31,7 @@ _vehicle setVariable [QGVAR(targetObject), _targetObject, true]; private _laserMethod = QFUNC(findLaserSource); private _vehicleSourceSelection = ""; -if (_vehicle isKindOf "CaManBase") then { +if (_vehicle isKindOf "CAManBase") then { _vehicleSourceSelection = "pilot"; } else { { // Go through turrets on vehicle and find the laser diff --git a/addons/laser/functions/fnc_rotateVectLine.sqf b/addons/laser/functions/fnc_rotateVectLine.sqf index 990234c62c5..766cb5df5bf 100644 --- a/addons/laser/functions/fnc_rotateVectLine.sqf +++ b/addons/laser/functions/fnc_rotateVectLine.sqf @@ -10,7 +10,7 @@ * None * * Example: - * call ace_laser_fnc_rotateVectline + * call ace_laser_fnc_rotateVectLine * * Public: No */ diff --git a/addons/laser/functions/fnc_shootRay.sqf b/addons/laser/functions/fnc_shootRay.sqf index ecd16fc0d4b..1fff8d57181 100644 --- a/addons/laser/functions/fnc_shootRay.sqf +++ b/addons/laser/functions/fnc_shootRay.sqf @@ -46,7 +46,7 @@ if (!(_intersects isEqualTo [])) then { TRACE_3("", _resultPos, _distance, _intersects); #ifdef DRAW_LASER_INFO -if !(isNil "_resultPos") then { +if (!isNil "_resultPos") then { private _text = [_distance, 4, 0] call CBA_fnc_formatNumber; drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0, 1, 0, 1], ASLtoAGL _resultPos, 0.5, 0.5, 0, _text, 0.4, 0.025, "TahomaB"]; drawLine3D [ASLtoAGL _posASL, ASLtoAGL _resultPos, [0,1,0,1]]; diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index 016c8f5c8a3..46637128409 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -7,10 +7,15 @@ Laserstreuung-Simulationszähler 레이저 분산 시뮬레이션 수 Wskaźnik poziomu rozproszenia wiązki lasera - Compte de la simulation de la dispersion du laser + Nombre de simulations pour la dispersion du laser Contatore di Simulazione della Dispersione del Laser 雷射散射模拟计算 雷射散射模擬計算 + Число симуляций рассеивания лазерного луча + Contador da Simulação de Dispersão de Laser + Počet simulace disperze laseru + Número de dispersión en la simulación del láser + Laser Dispersion Simulation Count Laser Code @@ -27,12 +32,13 @@ 레이저 코드 雷射码 雷射碼 + Lazer Kod Laser - Cycle Code Up Lasercode + Laser - Następny kod - Laser - Code + + Code laser + Лазер - увеличить частоту Laser - Alternar Código para Cima Lézer - kódciklus növelése @@ -43,12 +49,13 @@ 레이저 - 코드 순환 위 雷射 - 循环切换雷射码 上 雷射 - 循環切換雷射碼 上 + Lazer - Çevrim Kodu Yukarı Laser - Cycle Code Down Lasercode - Laser - Poprzedni kod - Laser - Code - + Code laser - Лазер - уменьшить частоту Laser - Alternar Código para Baixo Lézer - kódciklus csökkentése @@ -59,6 +66,7 @@ 레이저 - 코드 순환 아래 雷射 - 循环切换雷射码 下 雷射 - 循環切換雷射碼 下 + Lazer - Çevrim Kodu aşağı diff --git a/addons/laserpointer/CfgJointRails.hpp b/addons/laserpointer/CfgJointRails.hpp index 7583bd03b5d..da7aee71b53 100644 --- a/addons/laserpointer/CfgJointRails.hpp +++ b/addons/laserpointer/CfgJointRails.hpp @@ -6,3 +6,11 @@ class asdg_FrontSideRail: asdg_SlotInfo { ACE_acc_pointer_green_IR = 1; }; }; + +class PointerSlot_Rail: PointerSlot { + class compatibleItems { + ACE_acc_pointer_red = 1; + ACE_acc_pointer_green = 1; + ACE_acc_pointer_green_IR = 1; + }; +}; diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 17b7dbe9331..9418705ceb0 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -16,6 +16,7 @@ 레이저 지시기 雷射指示器 雷射指示器 + Lazer Işaretleyici Laser Pointer (red) @@ -32,6 +33,7 @@ 레이저 지시기 (빨강) 雷射指示器 (红色) 雷射指示器 (紅色) + Lazer Işaretleyici (Kırmızı) Laser Pointer (green) @@ -48,6 +50,7 @@ 레이저 지시기 (초록) 雷射指示器 (绿色) 雷射指示器 (綠色) + Lazer Işaretleyici (Yeşil) Emits visible light. @@ -64,11 +67,12 @@ 밝은 곳에서도 보임 发射出可见光 發射出可見光 + Görünür ışık yayar. <t color='#9cf953'>Use: </t>Turn Laser ON/OFF <t color='#9cf953'>Použití: </t>Zapnout/vypnout laser - <t color='#9cf953'>Utiliser : </t>laser allumé/éteint + <t color='#9cf953'>Utilisation : </t>Allumer/Éteindre le laser <t color='#9cf953'>Benutzen: </t>Laser EIN/AUS <t color='#9cf953'>Uso: </t>Laser ON/OFF <t color='#9cf953'>Użyj: </t>wł./wył. laser @@ -80,6 +84,7 @@ <t color='#9cf953'>사용키: </t>레이저 켜기/끄기 <t color='#9cf953'>使用: </t>雷射开启/关闭 <t color='#9cf953'>使用: </t>雷射開啟/關閉 + <t color='#9cf953'>Use: </t>Turn Laser ON/OFF Laser @@ -96,6 +101,7 @@ 레이저 雷射 雷射 + Lazer IR Laser @@ -112,13 +118,14 @@ 적외선 레이저 红外线雷射 紅外線雷射 + IR Lazer Switch Laser / IR Laser Umschalten Laser / IR-Laser Przełącz Laser / Laser IR Изменить режим Лазер / ИК-лазер - Changer Laser / Laser IR + Alterner laser/laser IR Alterna Laser / IR Laser Cambiar láser / Láser IR Lézer / Infravörös Lézer váltása @@ -128,6 +135,7 @@ 레이저 / 적외선 레이저 전환 切换雷射/红外线雷射 切換雷射/紅外線雷射 + Değiştir Lazer/IR Lazer diff --git a/addons/logistics_uavbattery/CfgVehicles.hpp b/addons/logistics_uavbattery/CfgVehicles.hpp index 6af24e7474d..068174e5d72 100644 --- a/addons/logistics_uavbattery/CfgVehicles.hpp +++ b/addons/logistics_uavbattery/CfgVehicles.hpp @@ -6,18 +6,18 @@ class CfgVehicles { }; }; class Helicopter_Base_F: Helicopter { - class ACE_Actions: ACE_Actions{ + class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions {}; }; }; class UAV_01_base_F: Helicopter_Base_F { fuelCapacity = 19; // Around 30 minutes hovering - class ACE_Actions: ACE_Actions{ + class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions { class GVAR(RefuelUAV) { displayName = CSTRING(Recharge); - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRefuelUAV)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(refuelUAV)); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canRefuelUAV)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(refuelUAV)); icon = QPATHTOF(ui\UAV_battery_ca.paa); }; }; @@ -25,12 +25,36 @@ class CfgVehicles { }; class UAV_06_base_F: Helicopter_Base_F { fuelCapacity = 16; // Around 25 minutes hovering - class ACE_Actions: ACE_Actions{ + class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions { class GVAR(RefuelUAV) { displayName = CSTRING(Recharge); - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRefuelUAV)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(refuelUAV)); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canRefuelUAV)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(refuelUAV)); + icon = QPATHTOF(ui\UAV_battery_ca.paa); + }; + }; + }; + }; + + class LandVehicle; + class Tank: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class Tank_F: Tank { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions {}; + }; + }; + class UGV_02_Base_F: Tank_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class GVAR(RefuelUAV) { + displayName = CSTRING(Recharge); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canRefuelUAV)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(refuelUAV)); icon = QPATHTOF(ui\UAV_battery_ca.paa); }; }; diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index 412e000d9b5..3efa6dee470 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -5,7 +5,7 @@ Drone is full Drohne ist voll El VANT está lleno - Le drone est chargé + Le drone est chargé. Dron jest naładowany A drón fel van töltve Dron je nabitý @@ -16,12 +16,13 @@ 무인기 충전완료 无人载具电池已充满 無人載具電池已充滿 + IHA Dolu You need a UAV Battery Du brauchst eine UAV-Batterie Necesitas una batería para VANT - Le drone nécessite une batterie + Le drone nécessite une batterie. Potrzebujesz baterii UAV Szükséged van egy UAV akkumulátorra Potřebuješ UAV baterii @@ -32,6 +33,7 @@ 무인기 배터리가 필요합니다 你需要一个无人载具电池 你需要一個無人載具電池 + UAV Bataryaya ihtiyacın var Recharge @@ -48,6 +50,7 @@ 재충전 充电 充電 + Şarj UAV Battery @@ -64,12 +67,13 @@ 무인기 배터리 无人载具电池 無人載具電池 + UAV Batarya Used to refuel Carried UAV's Verwendet zum Aufladen von tragbaren UAVs - Usada para reabastecer el VANT - Utilisée pour recharger un drone + Usada para reabastecer el VANT transportado + Utilisée pour alimenter un drone en énergie. Używana do naładowania baterii przenośnego UAV Hordozható UAV-k feltöltéséhez való akkumulátor Používané k dobíjení UAV @@ -80,6 +84,7 @@ 무인기를 재충전 할때 씁니다. 对可携式无人载具进行充电 對可攜式無人載具進行充電 + Used to refuel Carried UAV's Recharging... @@ -96,6 +101,7 @@ 充电中... 充電中... 충전중... + Şarj Oluyor diff --git a/addons/logistics_wirecutter/script_component.hpp b/addons/logistics_wirecutter/script_component.hpp index ebb703219d5..69b2c5cdab2 100644 --- a/addons/logistics_wirecutter/script_component.hpp +++ b/addons/logistics_wirecutter/script_component.hpp @@ -54,7 +54,21 @@ "fort_razorwire.p3d",\ "barbedwire.pd3",\ "dd_pletivo.p3d",\ - "plot_green_draty.p3d"\ + "plot_green_draty.p3d",\ + "plot_rust_draty.p3d",\ + "wall_fen1_5_2.p3d",\ + "gm_fence_border_gssz_70_600.p3d",\ + "gm_fence_border_gssz_70_gate_350_r.p3d",\ + "gm_fence_border_gssz_70_gate_350_w.p3d",\ + "gm_fence_border_gz1_600.p3d",\ + "gm_fence_border_gz1_gate_350_r.p3d",\ + "gm_fence_border_gz1_gate_350_w.p3d",\ + "gm_fence_wirefence_01_01.p3d",\ + "gm_fence_wirefence_01_02.p3d",\ + "gm_fence_wirefence_01_03.p3d",\ + "gm_gc_g501_sm70_01.p3d",\ + "gm_gc_g501_sm70_02.p3d",\ + "gm_gc_g501_sm70_03.p3d"\ ] #define SOUND_CLIP_TIME_SPACING 1.5 diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index dd4ce0dd2ec..8b131e6a171 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -16,6 +16,7 @@ 절단기 剪铁丝网钳 剪鐵絲網鉗 + Tel Makası Wirecutter @@ -32,6 +33,7 @@ 절단기 剪铁丝网钳 剪鐵絲網鉗 + Tel Makası Cut Fence @@ -48,6 +50,7 @@ 철조망 자르기 剪断护栏 剪斷護欄 + Çiti/Teli Kes Cutting Fences / Wires... @@ -64,6 +67,7 @@ 철망/철조망 자르는중... 剪断护栏/刺网中... 剪斷護欄/刺網中... + Kesiliyor Çit/Tel Fence cut @@ -80,6 +84,7 @@ 절단됨 护栏已被剪断 護欄已被剪斷 + Çit kesme diff --git a/addons/magazinerepack/CfgEventHandlers.hpp b/addons/magazinerepack/CfgEventHandlers.hpp index be284a9d702..0d3301d6e0a 100644 --- a/addons/magazinerepack/CfgEventHandlers.hpp +++ b/addons/magazinerepack/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); @@ -10,3 +9,9 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/magazinerepack/XEH_PREP.hpp b/addons/magazinerepack/XEH_PREP.hpp index fc1861dc3dc..ba58d49d529 100644 --- a/addons/magazinerepack/XEH_PREP.hpp +++ b/addons/magazinerepack/XEH_PREP.hpp @@ -1,4 +1,4 @@ - +PREP(canRepackMagazine); PREP(getMagazineChildren); PREP(magazineRepackFinish); PREP(magazineRepackProgress); diff --git a/addons/magazinerepack/XEH_postInit.sqf b/addons/magazinerepack/XEH_postInit.sqf new file mode 100644 index 00000000000..8a1cf07ca64 --- /dev/null +++ b/addons/magazinerepack/XEH_postInit.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +// Inventory context menu action to repack magazines +[ + "#Magazine", + ["CONTAINER", "MAGAZINE"], + LSTRING(RepackMagazines), + [], + QPATHTOEF(common,UI\repack_ca.paa), + [ + {true}, + { + params ["_unit", "", "_magazine"]; + + [_unit, _magazine] call FUNC(canRepackMagazine) + } + ], + { + params ["_unit", "", "_magazine"]; + + [_unit, _unit, _magazine] call FUNC(startRepackingMagazine); + } +] call CBA_fnc_addItemContextMenuOption; diff --git a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf new file mode 100644 index 00000000000..034de578be7 --- /dev/null +++ b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Checks if the given unit can repack magazines of the given type. + * + * Arguments: + * 0: Unit + * 1: Magazine + * + * Return Value: + * Can Repack Magazine + * + * Example: + * [_unit, _magazine] call ace_magazinerepack_fnc_canRepackMagazine + * + * Public: No + */ + +params ["_unit", "_magazine"]; + +private _maxAmmoCount = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count"); + +{ + _x params ["_magazineType", "_ammoCount", "_isLoaded"]; + + _magazineType == _magazine // Magazine is of given type + && {_ammoCount > 0 && {_ammoCount < _maxAmmoCount}} // Is a partial magazine + && {!_isLoaded || {_unit canAdd _magazineType}} // In inventory or can be moved into it +} count magazinesAmmoFull _unit > 1 diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 3145b220eb0..cbe0e1bec9a 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -3,12 +3,17 @@ Magazine Repack + Magazine umpacken Riempimento Caricatori 重新整理彈匣 重新整理弹匣 弾倉詰め替え 탄약 채우기 Przepakowywanie magazynków + Перепаковка Магазинов + Preenchimento de Carregador + Remplissage des chargeurs + Přepáskování zásobníků Time per round @@ -19,6 +24,10 @@ 弾頭毎の所有時間 구경 당 시간 Czas na nabój + Время на патрон + Tempo por projétil + Temps par cartouche + Čas na náboj Time per magazine @@ -29,6 +38,10 @@ 弾倉毎の所有時間 탄창 당 시간 Czas na magazynek + Время на магазин + Tempo por carregador + Temps par chargeur + Čas na zásobník Time per belt link @@ -39,12 +52,16 @@ ベルトリンク毎の所有時間 탄약띠 당 시간 Czas na taśmę + Время на звено ленты + Tempo por carregador de cinto + Temps par bande + Čas na článek pásu Repack Magazines Magazine umpacken Reorganizar cargadores - Réorganiser les chargeurs + Remplir les chargeurs Przepakuj magazynki Přepáskovat zásobníky Riempi Caricatori @@ -60,7 +77,7 @@ Repacking Magazines... Magazine umpacken... Reorganizando cargadores... - Réorganisation des chargeurs... + Remplissage des chargeurs... Przepakowywanie magazynków... Přepáskovávám zásobník... Riempendo i caricatori... @@ -76,7 +93,7 @@ %1 full mag(s) and %2 extra round(s) %1 volle(s) Magazin(e) und %2 übrig gebliebene Patrone(n) %1 cargador(es) completo(s) y %2 bala(s) extra(s) - %1 chargeur(s) plein(s) et %2 cartouche(s) en rab + %1 chargeur(s) plein(s) et %2 cartouche(s) en surplus. Pełnych magazynków: %1.<br/>Dodatkowych naboi: %2. %1 plný zásobník(y) a %2 munice navíc %1 caricatore(i) pieno e %2 munizione(i) extra @@ -90,7 +107,7 @@ Repacking Finished - Réorganisation terminée + Remplissage terminé. Wiederverpacken fertig Reorganización finalizada Перепаковка завершена @@ -106,7 +123,7 @@ Repacking Interrupted - Réorganisation interrompue + Remplissage interrompu. Umpacken unterbrochen Reorganización interrumpida Перепаковка прервана @@ -122,7 +139,7 @@ %1 Full and %2 Partial - %1 plein(s) et %2 partiel(s) + %1 chargeur(s) plein(s) et %2 chargeur(s) partiel(s). %1 volle(s) Magazin(e) und %2 angefangene(s) Magazin(e) %1 Llenos y %2 Incompletos %1 полных и %2 неполных diff --git a/addons/main/config.cpp b/addons/main/config.cpp index 81b5e7ce3dd..7dda3f1f4ca 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -6,14 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { - "A3_Data_F_Tank_Loadorder", - "A3_Data_F_Mod_Loadorder", - // CBA - "cba_ui", - "cba_xeh", - "cba_jr" - }; + requiredAddons[] = {"cba_main"}; author = ECSTRING(common,ACETeam); url = CSTRING(URL); VERSION_CONFIG; diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 3efab1e6083..5cdbcb61655 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -125,8 +125,7 @@ #define PFORMAT_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) \ format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10 J=%11', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I), RETNIL(J)] #ifdef DEBUG_MODE_FULL -#define TRACE_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) \ - [THIS_FILE_, __LINE__, PFORMAT_10(MESSAGE,A,B,C,D,E,F,G,H,I,J)] call CBA_fnc_log +#define TRACE_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_10(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I,J)) #else #define TRACE_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) /* disabled */ #endif diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index d9e307d3c27..41236880155 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -5,12 +5,13 @@ #include "script_version.hpp" -#define VERSION MAJOR.MINOR.PATCHLVL.BUILD -#define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD +#define VERSION MAJOR.MINOR +#define VERSION_STR MAJOR.MINOR.PATCHLVL.BUILD +#define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 1.86 -#define REQUIRED_CBA_VERSION {3,9,0} +#define REQUIRED_VERSION 1.98 +#define REQUIRED_CBA_VERSION {3,15,0} #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index f046b3d4efa..ef72d01e65d 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 -#define MINOR 12 -#define PATCHLVL 5 -#define BUILD 40 +#define MINOR 13 +#define PATCHLVL 3 +#define BUILD 52 diff --git a/addons/main/stringtable.xml b/addons/main/stringtable.xml index 9f1a9d6b8d7..31c0b5c16cc 100644 --- a/addons/main/stringtable.xml +++ b/addons/main/stringtable.xml @@ -15,6 +15,7 @@ ACE 后勤 ACE 後勤 ACE 논리 + ACE Lojistik http://ace3mod.com/ @@ -30,6 +31,8 @@ http://ace3mod.com/ http://ace3mod.com/ http://ace3mod.com/ + http://ace3mod.com/ + http://ace3mod.com/ diff --git a/addons/map/XEH_PREP.hpp b/addons/map/XEH_PREP.hpp index af6e815fd74..8e2094c29b2 100644 --- a/addons/map/XEH_PREP.hpp +++ b/addons/map/XEH_PREP.hpp @@ -13,3 +13,4 @@ PREP(simulateMapLight); PREP(switchFlashlight); PREP(updateMapEffects); PREP(initMainMap); +PREP(isFlashlight); diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index f439c4db55d..a30da81a40d 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -8,6 +8,8 @@ LOG(MSG_INIT); // Calculate the maximum zoom allowed for this map call FUNC(determineZoom); +GVAR(flashlights) = [] call CBA_fnc_createNamespace; + ["ace_settingsInitialized", { if (isMultiplayer && {GVAR(DefaultChannel) != -1}) then { //Set the chat channel once the map has finished loading @@ -24,12 +26,6 @@ call FUNC(determineZoom); }, 0, []] call CBA_fnc_addPerFrameHandler; }; - // Start Blue Force Tracking if Enabled - if (GVAR(BFT_Enabled)) then { - GVAR(BFT_markers) = []; - [FUNC(blueForceTrackingUpdate), GVAR(BFT_Interval), []] call CBA_fnc_addPerFrameHandler; - }; - //illumination settings if (GVAR(mapIllumination)) then { ["loadout", { @@ -114,6 +110,7 @@ GVAR(vehicleLightColor) = [1,1,1,0]; switch (true) do { case (_vehicle isKindOf "Tank"); case (_vehicle isKindOf "Wheeled_APC"): { {true} }; + case (_vehicle isKindOf "ParachuteBase"): { {false} }; case (_vehicle isKindOf "Helicopter"); case (_vehicle isKindOf "Plane"): { {(driver _vehicle == _unit) || {gunner _vehicle == _unit}} }; default { {false} }; diff --git a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf index 9b8e288ac4f..152964b8edc 100644 --- a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf +++ b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf @@ -46,7 +46,7 @@ if (GVAR(BFT_Enabled) and {(!isNil "ACE_player") and {alive ACE_player}}) then { private _markerType = [_x] call EFUNC(common,getMarkerType); private _colour = format ["Color%1", side _x]; - private _marker = createMarkerLocal [format ["ACE_BFT_%1", _forEachIndex], [(getPos _x) select 0, (getPos _x) select 1]]; + private _marker = createMarkerLocal [format ["ACE_BFT_player_%1", _forEachIndex], [(getPos _x) select 0, (getPos _x) select 1]]; _marker setMarkerTypeLocal _markerType; _marker setMarkerColorLocal _colour; _marker setMarkerTextLocal (name _x); @@ -67,7 +67,7 @@ if (GVAR(BFT_Enabled) and {(!isNil "ACE_player") and {alive ACE_player}}) then { private _markerType = [_x] call EFUNC(common,getMarkerType); private _colour = format ["Color%1", side _x]; - private _marker = createMarkerLocal [format ["ACE_BFT_%1", _forEachIndex], [(getPos leader _x) select 0, (getPos leader _x) select 1]]; + private _marker = createMarkerLocal [format ["ACE_BFT_group_%1", _forEachIndex], [(getPos leader _x) select 0, (getPos leader _x) select 1]]; _marker setMarkerTypeLocal _markerType; _marker setMarkerColorLocal _colour; _marker setMarkerTextLocal (groupId _x); diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index d8f537380df..f1c72e74c55 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -17,22 +17,4 @@ params ["_unit"]; -private _flashlights = []; -private _cfgWeapons = configFile >> "CfgWeapons"; - -{ - private _weaponConfig = _cfgWeapons >> _x; - if ( - -1 < [ - _weaponConfig >> "ItemInfo" >> "FlashLight", - _weaponConfig >> "FlashLight" - ] findIf { - isText (_x >> "ACE_Flashlight_Colour") - || {!(getArray (_x >> "ambient") in [[], [0,0,0]])} - } - ) then { - _flashlights pushBack _x; - }; -} forEach ([_unit, true] call CBA_fnc_uniqueUnitItems); - -_flashlights +([_unit, true] call CBA_fnc_uniqueUnitItems) select {_x call FUNC(isFlashlight)} // return diff --git a/addons/map/functions/fnc_initMainMap.sqf b/addons/map/functions/fnc_initMainMap.sqf index bebfcbd999d..1617be33db0 100644 --- a/addons/map/functions/fnc_initMainMap.sqf +++ b/addons/map/functions/fnc_initMainMap.sqf @@ -7,6 +7,12 @@ if (ctrlIDD _display != IDD_MAIN_MAP) exitWith {}; private _control = _display displayCtrl IDC_MAP; GVAR(lastStillPosition) = _control ctrlMapScreenToWorld [0.5, 0.5]; +[{ + if (!GVAR(isShaking)) then { // player map position won't be correct until a frame later + GVAR(lastStillPosition) = _this ctrlMapScreenToWorld [0.5, 0.5]; + }; +}, _control] call CBA_fnc_execNextFrame; + GVAR(lastStillTime) = CBA_missionTime; GVAR(isShaking) = false; diff --git a/addons/map/functions/fnc_isFlashlight.sqf b/addons/map/functions/fnc_isFlashlight.sqf new file mode 100644 index 00000000000..3d75803fc39 --- /dev/null +++ b/addons/map/functions/fnc_isFlashlight.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Checks if the given item is a flashlight. + * + * Arguments: + * 0: Item Classname + * + * Return Value: + * Is flashlight + * + * Example: + * ["acc_flashlight"] call ace_map_fnc_isFlashlight + * + * Public: No + */ + +params [["_class", "", [""]]]; + +private _isFlashlight = GVAR(flashlights) getVariable _class; + +if (isNil "_isFlashlight") then { + private _items = ([_class] + (_class call CBA_fnc_switchableAttachments)); + private _cfgWeapons = configFile >> "CfgWeapons"; + + // if this item or any of the switchable items is a flashlight + _isFlashlight = _items findIf { + private _weaponConfig = _cfgWeapons >> _x; + + [ + _weaponConfig >> "ItemInfo" >> "FlashLight", + _weaponConfig >> "FlashLight" + ] findIf { + isText (_x >> "ACE_Flashlight_Colour") + || {!(getArray (_x >> "ambient") in [[], [0,0,0]])} + } != -1 // return + } != -1; + + // cache value + GVAR(flashlights) setVariable [_class, _isFlashlight]; +}; + +_isFlashlight // return diff --git a/addons/map/initSettings.sqf b/addons/map/initSettings.sqf index d184c5c1ac4..4da66c22ebc 100644 --- a/addons/map/initSettings.sqf +++ b/addons/map/initSettings.sqf @@ -7,7 +7,7 @@ true, {[QGVAR(mapIllumination), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(mapGlow), @@ -18,7 +18,7 @@ true, {[QGVAR(mapGlow), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(mapShake), @@ -27,7 +27,7 @@ format["ACE %1", localize LSTRING(Module_DisplayName)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(mapLimitZoom), @@ -36,7 +36,7 @@ format["ACE %1", localize LSTRING(Module_DisplayName)], false, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(mapShowCursorCoordinates), @@ -45,7 +45,7 @@ format["ACE %1", localize LSTRING(Module_DisplayName)], false, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(DefaultChannel), @@ -56,7 +56,7 @@ true, {[QGVAR(DefaultChannel), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; // Blue Force Tracking [ @@ -66,9 +66,16 @@ [format ["ACE %1", localize LSTRING(Module_DisplayName)], localize LSTRING(BFT_Module_DisplayName)], false, true, - {[QGVAR(BFT_Enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart -] call CBA_settings_fnc_init; + { + [QGVAR(BFT_Enabled), _this] call EFUNC(common,cbaSettings_settingChanged); + + if (GVAR(BFT_Enabled) && {isNil QGVAR(BFT_markers)}) then { + GVAR(BFT_markers) = []; + [FUNC(blueForceTrackingUpdate), GVAR(BFT_Interval), []] call CBA_fnc_addPerFrameHandler; + }; + }, + false +] call CBA_fnc_addSetting; [ QGVAR(BFT_Interval), @@ -79,7 +86,7 @@ true, {[QGVAR(BFT_Interval), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(BFT_ShowPlayerNames), @@ -89,8 +96,8 @@ false, true, {[QGVAR(BFT_ShowPlayerNames), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart -] call CBA_settings_fnc_init; + false +] call CBA_fnc_addSetting; [ QGVAR(BFT_HideAiGroups), @@ -100,5 +107,5 @@ false, true, {[QGVAR(BFT_HideAiGroups), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart -] call CBA_settings_fnc_init; + false +] call CBA_fnc_addSetting; diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index d2cc5e90d0b..973cd9cac09 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -16,6 +16,7 @@ 지도 地图 地圖 + Harita Map illumination @@ -24,7 +25,7 @@ ¿Iluminación de mapa Osvětlení mapy Iluminação do mapa - Illumination de la carte + Éclairage de la carte Térkép megvilágítása Освещение карты Illuminazione Mappa @@ -32,18 +33,19 @@ 지도에 조명 地图照明 地圖照明 + Harita aydınlatması Simulate map lighting based on ambient lighting and player's items? Simuliere Kartenbeleuchtung auf Basis des Umgebungslichts sowie der mitgeführten Gegenstände? Symuluj oświetlenie mapy bazujące na oświetleniu otoczenia oraz przedmiotach gracza? - Calculer la luminosité de la carte en fonction des conditions de lumière ? + Simule l'éclairage de la carte en fonction de l'éclairage ambiant et des objets du joueur. Симулировать освещение карты на основе окружающего света и приборов игрока? Simular a luz do mapa baseado em luz ambiente e itens do jogador? Simular iluminación de mapa basada en la iluminación ambiente y los elementos de los jugadores? Simulovat nasvícení mapy v závisloti na okolí a předmětů hráče? Simula illuminazione della mappa in base alla luce ambientale e agli oggetti del giocatore? - 地図へ環境光やプレイヤーのアイテムに基づいた光のシミュレーションをおこないますか? + 地図へ環境光やプレイヤーのアイテムに基づいた光のシミュレーションを行うかどうかを設定できます。 주변 환경및 플레이어 조명에 의한 빛 변화를 지도에 반영할까요? 透过环境光与玩家的手电筒来决定地图亮度. 透過環境光與玩家的物品來決定地圖亮度? @@ -57,8 +59,8 @@ Resplandor de linterna en el mapa Nasvícení mapy pomocí baterky Luce della torcia in mappa - Lumière de la lampe de carte - 地図をライトで照らしますか + Lueur lampe carte + 地図をライトで照らす 지도 조명이 빛이 납니까 增加地图亮度 增加地圖亮度 @@ -67,13 +69,13 @@ Add external glow to players who use flashlight on map? Kartenbeleuchtung mittels Taschenlampe durch Dritte erkennbar? Pokaż poświatę światła latarki na graczu, który używa latarki na widoku mapy? - Ajouter un effet de lumière sur un joueur utilisant une lampe torche sur la carte ? + Ajoute une lueur externe aux joueurs éclairant leur carte avec une lampe. Добавить свет при использовании фонаря на карте? Adicionar brilho externo para jogadores que usam lanterna no mapa? Añadir resplandor externo a los jugadores que utilizan la linterna en el mapa? Přidat externí záři hráči který používá baterku v mapě? Aggiungi luce esterna a giocatori che usano la torcia in mappa? - プレイヤが地図上でフラッシュライトを使うと、照らすようにしますか? + プレイヤーが地図をフラッシュライトで照らせられるように設定します。 지도에 불빛을 비치는 플레이어를 조금 더 밝게 합니까? 当玩家打开手电筒时,增加地图亮度. 當玩家擁有手電筒時,增加地圖亮度? @@ -89,10 +91,11 @@ Térkép-rázkódás Тряска карты Scuoti la mappa - 地図を揺らしますか + 地図を揺らす 지도 흔들림 地图震动 地圖震動 + Harita sarsıntısı Make map shake when walking? @@ -101,11 +104,11 @@ Kamerawackeln beim Gehen? Umožnit třesení mapy za pochodu? Tremer o mapa enquanto caminha? - Faire trembler la carte lors d'un déplacement? + La carte tremble lorsque le joueur marche en la regardant. Rázkódjon-e a térkép mozgáskor? Заставлять карту трястись при ходьбе? Far scuotere la mappa mentre cammini? - 歩いているときは地図を揺らしますか? + 歩いているときは地図を揺らすかかどうかを設定できます。 걸을때 지도보면 흔들리게 합니까? 走路时打开地图会产生晃动. 走路時讓地圖有震動的感覺? @@ -117,11 +120,11 @@ Kartenvergrößerung einschränken Omezit přiblížení mapy Limitar zoom do mapa - Limiter le zoom de la carte + Limiter le zoom sur carte Térkép-nagyítás korlátozása Ограничить приближение карты Limita lo zoom in mappa - 地図の拡大を制限しますか + 地図の拡大を制限 지도 확대 제한 限制地图缩放倍率 限制地圖縮放倍率 @@ -133,11 +136,11 @@ Schränkt die maximale Kartenvergrößerung ein. Omezit stupeň přiblížení pro mapu? Limitar a quantidade de zoom disponível para o mapa? - Limiter le zoom maximum de la carte ? + Limite le niveau de zoom sur la carte. Korlátozva legyen-e a nagyítás mennyisége a térképnél? Ограничить максимальное приближение, доступное на карте? Limita l'ammontare di zoom disponibile per la mappa? - 地図上で利用できる拡大倍率を制限しますか? + 地図上で利用できる拡大倍率を制限できます。 지도 확대에 제한을 둡니까? 限制地图上可允许缩放的倍率? 限制地圖上可允許縮放的倍率? @@ -149,11 +152,11 @@ Zeige Mauszeiger-Koordinaten Zobrazit souřadnice u kurzoru Mostrar coordenadas no cursor - Afficher les coordonnées sur le curseur + Afficher les coordonnées du curseur Kurzor-koordináták mutatása Показывать координаты курсора Mostra coordinate sul cursore - カーソル先で座標を表示しますか + カーソル先で座標を表示 커서에 좌표를 보이게 합니까 显示游标的座标 顯示游標的座標 @@ -165,11 +168,11 @@ Gitter-Koordinaten auf dem Mauszeiger anzeigen? Zobrazit souřadnice u kurzoru v mapě? Mostrar as coordenadas de grade no ponteiro do mouse? - Afficher les coordonnées de la grille à coté du curseur ? + Affiche les coordonnées de la grille sur le pointeur de souris. Mutatva legyen-e a kurzornál található rész rácskoordinátája? Показывать координаты около курсора мыши? Mostra la griglia coordinate sul cursore mouse? - カーソルに合わせた先を地図座標で表示しますか? + カーソルで合わせた先を地図座標で表示するかどうかを設定できます。 지도에서 커서 옆에 좌표가 뜨게 합니까? 显示滑鼠游标所在的网格座标? 顯示滑鼠游標所在的網格座標? @@ -180,7 +183,7 @@ Dieses Modul erweitert die Kartenfunktionen. Tento modul umožňuje přizpůsobit mapu s obrazem. Este módulo permite que você personalize a tela de mapa. - Ce module permet de personnaliser l'écran de la carte. + Ce module permet de personnaliser l'écran de carte. Ez a modul lehetővé teszi a térképnézet testreszabását. Этот модуль позволяет настроить отображение карты. Este módulo permite personalizar la pantalla del mapa. @@ -197,7 +200,7 @@ Blue Force Tracking Blue Force Tracking Rastreio de forças azuis - Blue Force Tracking (SFA) + Suivi des Forces Alliées (SFA) Blue Force követés Система слежения Blue Force Tracking Blue Force Tracking @@ -213,7 +216,7 @@ Aktywuj BFT Povolit BFT Activar BFT - Activer le Suivi des Forces Alliées + Activer le SFA BFT engedélyezése Включить BFT Abilita BFT @@ -229,7 +232,7 @@ Aktywuj Blue Force Tracking. Domyślnie: Nie Povolit Blue Force Tracking. Výchozí: Ne Activar Blue Force Tracking. Por defecto: No - Active le SFA. Défaut : non + Active le SFA. Valeur par défaut : désactivé. Blue Force követés engedélyezése. Alapértelmezett: Nem Включает систему служения BFT. По-умолчанию: Нет Abilita Blue Force Tracking. Default: No @@ -261,7 +264,7 @@ Wie oft sollen die Markierungen aktualisiert werden (in Sekunden) Jak často budou značky aktualizovány (v sekundách) Frequência em que os marcadores devem ser atualizados (em segundos) - Fréquence de rafraîchissement des marqueurs ? + Fréquence de rafraîchissement des marqueurs (en secondes). Milyen gyakran frissüljenek a jelölők (másodpercben) Как часто должны обновляться маркеры (в секундах) Quanto spesso vengono aggiornati i marker (in secondi) @@ -277,11 +280,11 @@ KI-Gruppen verstecken Skrýt AI skupiny Esconder grupos de IA - Cacher les groupes d'IA + Cacher les groupes IA AI csoportok elrejtése Скрыть группы ботов Nascondere gruppi IA - AI グループを非表示にしますか + AI グループを非表示 인공지능 그룹을 숨깁니까 隐藏AI小队 隱藏AI小隊 @@ -293,11 +296,11 @@ Verstecke Marker für "nur KI"-Gruppen? Skrýt značky pouze pro AI skupiny? Esconder marcadores que pertencem ao grupo de IA? - Cacher les marqueurs pour les groupes d'IA seulement ? + Cache les marqueurs pour les groupes composés exclusivement d'unités IA. Jelölők elrejtése "csak AI" csoportoknál? Скрыть маркеры групп, которые состоят полностью из ботов? Nascondi markers per gruppi di sole IA? - 'AI のみ'グループのマーカを隠しますか? + 'AI のみ'グループのマーカー表示有無を設定できます。 인공지능만 있는 그룹의 마커를 숨깁니까? 隐藏'AI小队'的踪迹? 隱藏'AI小隊'的蹤跡? @@ -313,7 +316,7 @@ Itt található az a játékos nevét Показать имена игроков Mostra i nomi dei giocatori - プレイヤ名を表示しますか + プレイヤー名を表示 플레이어 이름을 표시합니까 显示玩家名称 顯示玩家名稱 @@ -325,11 +328,11 @@ Zeigt die Namen der einzelnen Spieler an Zobrazit názvy jednotlivých hráčů? Mostrar nomes individuais dos jogadores? - Affiche les noms des joueurs individuels ? + Affiche les noms de tous les joueurs individuellement. Itt található az adott játékos neveket? Показать отдельные имена игроков? Mostra i nomi dei giocatori singoli? - プレイヤの名前を表示しますか? + プレイヤーの名前の表示有無を設定できます。 각 플레이어의 이름을 표시합니까? 显示玩家的个别名称? 顯示玩家的個別名稱? @@ -364,6 +367,7 @@ 손전등 手电筒 手電筒 + Fenerler NVG @@ -379,13 +383,14 @@ 야투경 夜视镜 夜視鏡 + NVG On Ein Włącz Ligado - Allumé + Allumée Вкл. Zapnout Encendido @@ -394,13 +399,14 @@ 켜기 开启 開啟 + Açık Off Aus Wyłącz Desligado - Éteins + Éteinte Выкл. Vypnout Apagado @@ -409,6 +415,7 @@ 끄기 关闭 關閉 + Kapali Increase Brightness @@ -455,6 +462,7 @@ %1 켜기 开启%1 開啟%1 + %1 'i aç Turn Off %1 @@ -471,6 +479,7 @@ %1 끄기 关闭%1 關閉%1 + %1 'i Kapat Set Channel At Start @@ -481,7 +490,7 @@ Zvolit kanál po startu Imposta Canale all'Avvio Setear canal al comenzar - Mettre un canal par défaut + Définir un canal par défaut 開始時のチャンネルを決定 시작시 채널 设定游戏开始时的聊天频道 @@ -508,10 +517,13 @@ BFTを無効化 GPS피아식별기 끄기 Wyłącz BFT - Désactive le BFT + Désactiver le SFA Disablita BFT 关闭友军踪迹 關閉友軍蹤跡 + Отключить BFT + Desativar BFT + Vypnout sledování přátelských jednotek (BFT). Always disable Blue Force Tracking for this group. @@ -519,10 +531,13 @@ このグループへのブルー フォース トラッキングを常に無効化します。 이 그룹에 한해 GPS피아식별기를 항상 끕니다. Zawsze wyłączaj Blue Force Tracking dla tej grupy. - Désactive en permanence le Blue Force Tracking pour ce groupe. + Désactive en permanence le Suivi des Forces Alliées pour ce groupe. Disabilita sempre il Blue Force Tracking per questo gruppo. 对此小队永远关闭友军踪迹显示 對此小隊永遠關閉友軍蹤跡顯示 + Всегда отключать Blue Force Tracking для этой группы + Sempre desativar Rastreio Blue Force (BFT) para esse grupo. + Vždy vypne sledování přátelských jednotek (BFT) pro tuto skupinu. diff --git a/addons/map_gestures/ACE_Settings.hpp b/addons/map_gestures/ACE_Settings.hpp index d74d58a1a5b..668902584c7 100644 --- a/addons/map_gestures/ACE_Settings.hpp +++ b/addons/map_gestures/ACE_Settings.hpp @@ -1,49 +1,20 @@ class ACE_Settings { class GVAR(enabled) { - displayName = CSTRING(enabled_displayName); - description = CSTRING(enabled_description); - category = CSTRING(mapGestures_category); - typeName = "BOOL"; - value = 1; + movedToSQF = 1; }; class GVAR(maxRange) { - displayName = CSTRING(maxRange_displayName); - description = CSTRING(maxRange_description); - category = CSTRING(mapGestures_category); - typeName = "SCALAR"; - value = 7; - sliderSettings[] = {0, 50, 7, 1}; + movedToSQF = 1; }; class GVAR(interval) { - displayName = CSTRING(interval_displayName); - description = CSTRING(interval_description); - category = CSTRING(mapGestures_category); - typeName = "SCALAR"; - value = 0.03; - sliderSettings[] = {0, 1, 0.03, 2}; + movedToSQF = 1; }; class GVAR(nameTextColor) { - displayName = CSTRING(nameTextColor_displayName); - description = CSTRING(nameTextColor_description); - category = CSTRING(mapGestures_category); - isClientSettable = 1; - typeName = "COLOR"; - value[] = {0.2, 0.2, 0.2, 0.3}; + movedToSQF = 1; }; class GVAR(defaultLeadColor) { - displayName = CSTRING(defaultLeadColor_displayName); - description = CSTRING(defaultLeadColor_description); - category = CSTRING(mapGestures_category); - isClientSettable = 1; - typeName = "COLOR"; - value[] = {1, 0.88, 0, 0.95}; + movedToSQF = 1; }; class GVAR(defaultColor) { - displayName = CSTRING(defaultColor_displayName); - description = CSTRING(defaultColor_description); - category = CSTRING(mapGestures_category); - isClientSettable = 1; - typeName = "COLOR"; - value[] = {1, 0.88, 0, 0.7}; + movedToSQF = 1; }; }; diff --git a/addons/map_gestures/CfgEventHandlers.hpp b/addons/map_gestures/CfgEventHandlers.hpp index becf3950523..efe179abce0 100644 --- a/addons/map_gestures/CfgEventHandlers.hpp +++ b/addons/map_gestures/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); @@ -16,3 +15,15 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; + +class Extended_DisplayLoad_EventHandlers { + class RscDisplayCurator { + ADDON = QUOTE(((_this select 0) displayCtrl ID_CURATOR_MAP) call FUNC(initDisplayCurator)); + }; + class RscDisplayEGSpectator { + ADDON = QUOTE((((_this select 0) displayCtrl ID_EG_MAP_CONTROL) controlsGroupCtrl ID_EG_MAP_CONTROLGROUP) call FUNC(initDisplaySpectator)); + }; + class RscDiary { // for loading saves use uiNamespace because missionNamespace is not restored before map is loaded + ADDON = QUOTE(((_this select 0) displayCtrl ID_DIARY_MAP) call (uiNamespace getVariable 'DFUNC(initDisplayDiary)')); + }; +}; diff --git a/addons/map_gestures/XEH_PREP.hpp b/addons/map_gestures/XEH_PREP.hpp index 8d457bd7e0c..5ffeeb4bd7e 100644 --- a/addons/map_gestures/XEH_PREP.hpp +++ b/addons/map_gestures/XEH_PREP.hpp @@ -1,12 +1,9 @@ - PREP(addGroupColorMapping); PREP(drawMapGestures); -PREP(endTransmit); PREP(getProximityPlayers); -PREP(initTransmit); +PREP(initDisplayCurator); +PREP(initDisplayDiary); +PREP(initDisplaySpectator); PREP(isValidColorArray); PREP(moduleGroupSettings); PREP(moduleSettings); -PREP(receiverInit); -PREP(transmit); -PREP(transmitterInit); diff --git a/addons/map_gestures/XEH_postInit.sqf b/addons/map_gestures/XEH_postInit.sqf index cc3daf6a06c..d5e68c1ba21 100644 --- a/addons/map_gestures/XEH_postInit.sqf +++ b/addons/map_gestures/XEH_postInit.sqf @@ -4,29 +4,7 @@ if (["STMapGestures"] call EFUNC(common,isModLoaded)) exitWith { WARNING("st_map_gestures is installed - exiting [remove st_map_gestures.pbo to allow ace version]"); }; -if (!hasInterface) exitWith {}; - -["ace_settingsInitialized", { - if (!GVAR(enabled)) exitWith {}; - - // This will set QEGVAR(common,playerOwner) var on player objects - [] call EFUNC(common,setPlayerOwner); - - GVAR(pointPosition) = [0,0,0]; - - [QGVAR(syncPos), { - params ["_unit", "_pointPos"]; - _unit setVariable [QGVAR(pointPosition), _pointPos]; - }] call CBA_fnc_addEventHandler; - - [{ - if (isNull (findDisplay 12)) exitWith {}; - - params ["", "_pfhId"]; - - call FUNC(receiverInit); - call FUNC(transmitterInit); - - [_pfhId] call CBA_fnc_removePerFrameHandler; - }, 1, []] call CBA_fnc_addPerFrameHandler; -}] call CBA_fnc_addEventHandler; +["visibleMap", { + GVAR(EnableTransmit) = false; + ACE_player setVariable [QGVAR(pointPosition), nil, true]; // Instantly transmit nil to stop drawing icon +}, true] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/map_gestures/XEH_preInit.sqf b/addons/map_gestures/XEH_preInit.sqf index 92387036e43..9bf1ff814ec 100644 --- a/addons/map_gestures/XEH_preInit.sqf +++ b/addons/map_gestures/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + GVAR(GroupColorCfgMappingNew) = call CBA_fnc_createNamespace; ADDON = true; diff --git a/addons/map_gestures/functions/fnc_drawMapGestures.sqf b/addons/map_gestures/functions/fnc_drawMapGestures.sqf index 2aecd2388fd..6fd210eb333 100644 --- a/addons/map_gestures/functions/fnc_drawMapGestures.sqf +++ b/addons/map_gestures/functions/fnc_drawMapGestures.sqf @@ -5,16 +5,18 @@ * * Arguments: * 0: Map Handle + * 1: Positions (objects or posAGLs) * * Return Value: * None * * Example: - * [findDisplay 12 displayCtrl 51] call ace_map_gesutres_fnc_drawMapGestures + * [findDisplay 12 displayCtrl 51, [player]] call ace_map_gestures_fnc_drawMapGestures * * Public: No */ + BEGIN_COUNTER(draw); #define ICON_RENDER_SIZE 55 @@ -26,36 +28,30 @@ BEGIN_COUNTER(draw); #define TEXT_SIZE 0.030 #define TEXT_SHADOW 0 -if (!GVAR(enabled) || !visibleMap) exitWith {}; +if (!GVAR(enabled)) exitWith {}; -params ["_mapHandle"]; +params ["_mapHandle", "_positions"]; +private _players = [[_positions, GVAR(maxRange)], FUNC(getProximityPlayers), missionNamespace, QGVAR(proximityPlayersCache), 1] call EFUNC(common,cachedCall); // Iterate over all nearby players and render their pointer if player is transmitting. { - + private _pos = _x getVariable QGVAR(pointPosition); // Only render if the unit is alive and transmitting - if (alive _x && {_x getVariable [QGVAR(Transmit), false]}) then { - - private _pos = _x getVariable [QGVAR(pointPosition), [0,0,0]]; - - private _group = group _x; - private _grpName = groupID _group; + if (alive _x && { !isNil "_pos" }) then { + if (_x == ACE_player && { !isNil QGVAR(cursorPosition) }) then { + _pos = GVAR(cursorPosition); + }; // If color settings for the group exist, then use those, otherwise fall back to the default colors - private _colorMap = GVAR(GroupColorCfgMappingNew) getVariable _grpName; - private _color = if (isNil "_colorMap") then { - [GVAR(defaultLeadColor), GVAR(defaultColor)] select (_x != leader _group); - } else { - _colorMap select (_x != leader _group); - }; + private _colorMap = GVAR(GroupColorCfgMappingNew) getVariable [(groupID (group _x)), [GVAR(defaultLeadColor), GVAR(defaultColor)]]; + private _color = _colorMap select (_x != leader _x); TRACE_2("",_colorMap,_color); - + // Render icon and player name _mapHandle drawIcon ["\a3\ui_f\data\gui\cfg\Hints\icon_text\group_1_ca.paa", _color, _pos, ICON_RENDER_SIZE, ICON_RENDER_SIZE, ICON_ANGLE, "", ICON_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; _mapHandle drawIcon ["#(argb,8,8,3)color(0,0,0,0)", GVAR(nameTextColor), _pos, TEXT_ICON_RENDER_SIZE, TEXT_ICON_RENDER_SIZE, ICON_ANGLE, name _x, TEXT_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; }; - nil -} count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers)); +} forEach _players; END_COUNTER(draw); diff --git a/addons/map_gestures/functions/fnc_endTransmit.sqf b/addons/map_gestures/functions/fnc_endTransmit.sqf deleted file mode 100644 index e591cd39ba9..00000000000 --- a/addons/map_gestures/functions/fnc_endTransmit.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Dslyecxi, MikeMatrix - * Ensure that all variables used to indicate transmission are disabled. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_map_gestures_fnc_endTransmit - * - * Public: No - */ - -if (!GVAR(enabled)) exitWith {}; - -ACE_player setVariable [QGVAR(Transmit), false, true]; -GVAR(EnableTransmit) = false; diff --git a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf index 9718095b01b..400449310b3 100644 --- a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf +++ b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf @@ -4,22 +4,35 @@ * Returns all players in a given range and in the units vehicle. * * Arguments: - * 0: Unit + * 0: Positions (objects or posAGLs) * 1: Range * * Return Value: - * All units in proximity + * All units in proximity > * * Example: - * [player, 7] call ace_map_gestures_fnc_getProximityPlayers + * [[player], 7] call ace_map_gestures_fnc_getProximityPlayers * * Public: No */ -params ["_unit", "_range"]; +params ["_positions", "_range"]; -private _proximityPlayers = (getPos _unit) nearEntities [["CAMAnBase"], _range]; -_proximityPlayers deleteAt (_proximityPlayers find _unit); -_proximityPlayers append (crew vehicle _unit); +private _proximityPlayers = []; -_proximityPlayers select {[_x, false] call EFUNC(common,isPlayer);} +{ + _proximityPlayers append (_x nearEntities [["CAMAnBase"], _range]); + if (_x isEqualType objNull) then { + _proximityPlayers append (crew vehicle _x); + }; +} forEach _positions; + +_proximityPlayers = _proximityPlayers arrayIntersect _proximityPlayers; + +_proximityPlayers = _proximityPlayers select { [_x, false] call EFUNC(common,isPlayer); }; + +if (GVAR(onlyShowFriendlys)) then { + _proximityPlayers = _proximityPlayers select { [side group ace_player, side _x] call BIS_fnc_areFriendly; }; +}; + +_proximityPlayers diff --git a/addons/map_gestures/functions/fnc_initDisplayCurator.sqf b/addons/map_gestures/functions/fnc_initDisplayCurator.sqf new file mode 100644 index 00000000000..b85bf2401c3 --- /dev/null +++ b/addons/map_gestures/functions/fnc_initDisplayCurator.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: joko // Jonas + * Binds Draw EventHandlers to Zeus map. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * _mapCtrl call ace_map_gestures_fnc_initDisplayCurator + * + * Public: No + */ +params ["_mapCtrl"]; +TRACE_1("initDisplayCurator",_mapCtrl); + +_mapCtrl ctrlAddEventHandler ["Draw", { [_this select 0, [ACE_player, positionCameraToWorld [0, 0, 0]]] call FUNC(drawMapGestures);}]; diff --git a/addons/map_gestures/functions/fnc_initDisplayDiary.sqf b/addons/map_gestures/functions/fnc_initDisplayDiary.sqf new file mode 100644 index 00000000000..4fb4bc66a5e --- /dev/null +++ b/addons/map_gestures/functions/fnc_initDisplayDiary.sqf @@ -0,0 +1,55 @@ +#include "script_component.hpp" +/* + * Author: Dslyecxi, MikeMatrix, joko // Jonas + * Bind all required EventHandlers to Player map. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * _mapCtrl call ace_map_gestures_fnc_initDisplayDiary + * + * Public: No + */ +params ["_mapCtrl"]; +TRACE_1("initDisplayDiary",_mapCtrl); + +_mapCtrl ctrlAddEventHandler ["Draw", { [_this select 0, [ACE_player]] call FUNC(drawMapGestures); }]; + +// MouseMoving EH. +_mapCtrl ctrlAddEventHandler ["MouseMoving", { + if (!GVAR(enabled)) exitWith {}; + params ["_control", "_posX", "_posY"]; + private _position = _control ctrlMapScreenToWorld [_posX, _posY]; + GVAR(cursorPosition) = _position; + // Don't transmit any data if we're using the map tools + if (!GVAR(EnableTransmit) || {(["ace_maptools"] call EFUNC(common,isModLoaded)) && {EGVAR(maptools,mapTool_isDragging) || EGVAR(maptools,mapTool_isRotating)}}) exitWith {}; + if (_position distance2D (ACE_player getVariable [QGVAR(pointPosition), [0, 0, 0]]) >= 1) then { + [ACE_player, QGVAR(pointPosition), _position, GVAR(interval)] call EFUNC(common,setVariablePublic); + }; +}]; + +// MouseDown EH +_mapCtrl ctrlAddEventHandler ["MouseButtonDown", { + if (getClientStateNumber < 10) exitWith {}; + if (!GVAR(enabled)) exitWith {}; + params ["", "_button", "_x", "_y", "_shift", "_ctrl", "_alt"]; + if (_button == 0 && {[_shift, _ctrl, _alt] isEqualTo [false, false, false]}) then { + GVAR(EnableTransmit) = true; + }; +}]; + +// MouseUp EH +_mapCtrl ctrlAddEventHandler ["MouseButtonUp", { + if (getClientStateNumber < 10) exitWith {}; + if (!GVAR(enabled)) exitWith {}; + params ["", "_button"]; + if (_button == 0) then { + GVAR(EnableTransmit) = false; + ACE_player setVariable [QGVAR(pointPosition), nil, true]; // Instantly transmit nil to stop drawing icon + GVAR(cursorPosition) = nil; + }; +}]; diff --git a/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf b/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf new file mode 100644 index 00000000000..4582d6d6f50 --- /dev/null +++ b/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: joko // Jonas + * Binds Draw EventHandlers to Spectator map. + * + * Arguments: + * 0: Map Handle from a spectator gui + * + * Return Value: + * None + * + * Example: + * _mapCtrl call ace_map_gestures_fnc_initDisplaySpectator + * + * Public: No + */ +params ["_mapCtrl"]; +TRACE_1("initDisplaySpectator",_mapCtrl); + +_mapCtrl ctrlAddEventHandler ["Draw", { + private _targets = [positionCameraToWorld [0, 0, 0]]; + + private _aceSpectatorFocus = missionNamespace getVariable [QEGVAR(spectator,camFocus), objNull]; + if (!isNull _aceSpectatorFocus) then { + _targets pushback _aceSpectatorFocus; + }; + private _vanillaSpectatorFocus = uiNamespace getVariable ["RscEGSpectator_focus", objNull]; + if (!isNull _vanillaSpectatorFocus) then { + _targets pushback _vanillaSpectatorFocus; + }; + [_this select 0, _targets] call FUNC(drawMapGestures); +}]; diff --git a/addons/map_gestures/functions/fnc_initTransmit.sqf b/addons/map_gestures/functions/fnc_initTransmit.sqf deleted file mode 100644 index 782b4c96666..00000000000 --- a/addons/map_gestures/functions/fnc_initTransmit.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Dslyecxi, MikeMatrix - * Initializes transmitting map gestures. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_map_gestures_fnc_initTransmit - * - * Public: No - */ - -if (!GVAR(enabled)) exitWith {}; - -GVAR(EnableTransmit) = true; -[FUNC(transmit), GVAR(interval), []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/map_gestures/functions/fnc_moduleSettings.sqf b/addons/map_gestures/functions/fnc_moduleSettings.sqf index 93525226ead..ac0bb62b362 100644 --- a/addons/map_gestures/functions/fnc_moduleSettings.sqf +++ b/addons/map_gestures/functions/fnc_moduleSettings.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [module, [player], true] call ace_map_gestures_fnc_moduleGroupSettings + * [module, [player], true] call ace_map_gestures_fnc_moduleSettings * * Public: No */ diff --git a/addons/map_gestures/functions/fnc_receiverInit.sqf b/addons/map_gestures/functions/fnc_receiverInit.sqf deleted file mode 100644 index 0effb9a7d58..00000000000 --- a/addons/map_gestures/functions/fnc_receiverInit.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Dslyecxi, MikeMatrix - * Initializes the receiver and hooks it to the Draw event of the map. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_map_gestures_fnc_receiverInit - * - * Public: No - */ - -ACE_player setVariable [QGVAR(Transmit), false, true]; -GVAR(EnableTransmit) = false; - -if (!isNil QGVAR(DrawMapHandlerID)) then { - (findDisplay 12 displayCtrl 51) ctrlRemoveEventHandler ["Draw", GVAR(DrawMapHandlerID)]; - GVAR(DrawMapHandlerID) = nil; -}; -GVAR(DrawMapHandlerID) = findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", {call FUNC(drawMapGestures)}]; diff --git a/addons/map_gestures/functions/fnc_transmit.sqf b/addons/map_gestures/functions/fnc_transmit.sqf deleted file mode 100644 index 1b1f462f01b..00000000000 --- a/addons/map_gestures/functions/fnc_transmit.sqf +++ /dev/null @@ -1,42 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Dslyecxi, MikeMatrix - * Transmit PFH - * - * Arguments: - * 0: Arguments - * 1: PFH ID - * - * Return Value: - * Return description - * - * Example: - * [[], 2] call ace_map_gestures_fnc_transmit - * - * Public: No - */ - -BEGIN_COUNTER(transmit); - -params ["", "_pfhId"]; - -if (!visibleMap) then { - call FUNC(endTransmit); -}; - -if (!GVAR(EnableTransmit) || !visibleMap) exitWith { - [_pfhId] call CBA_fnc_removePerFrameHandler; -}; - -{ - private _owner = _x getVariable [QEGVAR(common,playerOwner), -1]; - if (_owner > -1) then { - private _remotePos = _x getVariable [QGVAR(remotePos), [0,0,0]]; - if ((_remotePos distance2d GVAR(pointPosition)) > 1) then { // Only transmit when actually moving - [QGVAR(syncPos), [ACE_Player, GVAR(pointPosition)], _owner] call CBA_fnc_ownerEvent; - _x setVariable [QGVAR(remotePos), GVAR(pointPosition)]; - }; - }; -} count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers)); - -END_COUNTER(transmit); diff --git a/addons/map_gestures/functions/fnc_transmitterInit.sqf b/addons/map_gestures/functions/fnc_transmitterInit.sqf deleted file mode 100644 index a081ef5b149..00000000000 --- a/addons/map_gestures/functions/fnc_transmitterInit.sqf +++ /dev/null @@ -1,68 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Dslyecxi, MikeMatrix - * Initializes the transmitting event handlers. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_map_gestures_fnc_transmitterInit - * - * Public: No - */ - -disableSerialization; - -private _mapCtrl = findDisplay 12 displayCtrl 51; - -// MouseMoving EH. -if (!isNil QGVAR(MouseMoveHandlerID)) then { - _mapCtrl ctrlRemoveEventHandler ["MouseMoving", GVAR(MouseMoveHandlerID)]; - GVAR(MouseMoveHandlerID) = nil; -}; -GVAR(MouseMoveHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseMoving", { - // Don't transmit any data if we're using the map tools - if (!GVAR(EnableTransmit) || {(["ace_maptools"] call EFUNC(common,isModLoaded)) && {EGVAR(maptools,mapTool_isDragging) || EGVAR(maptools,mapTool_isRotating)}}) exitWith {}; - - params ["_control", "_posX", "_posY"]; - - if (!(ACE_player getVariable QGVAR(Transmit))) then { - ACE_player setVariable [QGVAR(Transmit), true, true]; - }; - - GVAR(pointPosition) = _control ctrlMapScreenToWorld [_posX, _posY]; -}]; - -// MouseDown EH -if (!isNil QGVAR(MouseDownHandlerID)) then { - _mapCtrl ctrlRemoveEventHandler ["MouseButtonDown",GVAR(MouseDownHandlerID)]; - GVAR(MouseDownHandlerID) = nil; -}; -GVAR(MouseDownHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseButtonDown", { - if (!GVAR(enabled)) exitWith {}; - - params ["", "_button", "_x", "_y", "_shift", "_ctrl", "_alt"]; - - if (_button == 0 && {[_shift, _ctrl, _alt] isEqualTo [false, false, false]}) then { - call FUNC(initTransmit); - }; -}]; - -// MouseUp EH -if (!isNil QGVAR(MouseUpHandlerID)) then { - _mapCtrl ctrlRemoveEventHandler ["MouseButtonUp", GVAR(MouseUpHandlerID)]; - GVAR(MouseUpHandlerID) = nil; -}; -GVAR(MouseUpHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseButtonUp", { - if (!GVAR(enabled)) exitWith {}; - - params ["", "_button"]; - - if (_button == 0) then { - call FUNC(endTransmit); - }; -}]; diff --git a/addons/map_gestures/initSettings.sqf b/addons/map_gestures/initSettings.sqf new file mode 100644 index 00000000000..8dd23618971 --- /dev/null +++ b/addons/map_gestures/initSettings.sqf @@ -0,0 +1,56 @@ +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(enabled_displayName), LSTRING(enabled_description)], + LSTRING(mapGestures_category), + true, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(maxRange), "SLIDER", + [LSTRING(maxRange_displayName), LSTRING(maxRange_description)], + LSTRING(mapGestures_category), + [0,50,7,1], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(onlyShowFriendlys), + "CHECKBOX", + [LSTRING(onlyShowFriendlys_displayName), LSTRING(onlyShowFriendlys_description)], + LSTRING(mapGestures_category), + false, + 1 +] call CBA_fnc_addSetting; + +[ + QGVAR(interval), "SLIDER", + [LSTRING(interval_displayName), LSTRING(interval_description)], + LSTRING(mapGestures_category), + [0,1,0.03,2], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(nameTextColor), "COLOR", + [LSTRING(nameTextColor_displayName), LSTRING(nameTextColor_description)], + LSTRING(mapGestures_category), + [0.2,0.2,0.2,0.3], + false +] call CBA_fnc_addSetting; + +[ + QGVAR(defaultLeadColor), "COLOR", + [LSTRING(defaultLeadColor_displayName), LSTRING(defaultLeadColor_description)], + LSTRING(mapGestures_category), + [1,0.88,0,0.95], + false +] call CBA_fnc_addSetting; + +[ + QGVAR(defaultColor), "COLOR", + [LSTRING(defaultColor_displayName), LSTRING(defaultColor_description)], + LSTRING(mapGestures_category), + [1,0.88,0,0.7], + false +] call CBA_fnc_addSetting; diff --git a/addons/map_gestures/script_component.hpp b/addons/map_gestures/script_component.hpp index ca428f87254..92cef1c6627 100644 --- a/addons/map_gestures/script_component.hpp +++ b/addons/map_gestures/script_component.hpp @@ -15,3 +15,8 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define ID_CURATOR_MAP 50 +#define ID_EG_MAP_CONTROL 63909 +#define ID_EG_MAP_CONTROLGROUP 62609 +#define ID_DIARY_MAP 51 diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml index feb98f20915..f02c0f091a0 100644 --- a/addons/map_gestures/stringtable.xml +++ b/addons/map_gestures/stringtable.xml @@ -1,7 +1,7 @@ - - + + Map Gestures Gestos no mapa Gesty na mapie @@ -10,13 +10,14 @@ Gesti Mappa Kartenzeichen Gestos en mapa - Gestes de carte - マップ ジェスチャ + Pointage sur carte + マップ ジェスチャー 지도 신호 地图标识器 地圖指示器 + Harita Hareketleri - + Enabled Ativado Aktywne @@ -25,13 +26,30 @@ Abilita Aktiviert Activado - Activer + Activé 有効化 켜기 启用 啟用 + Etkin - + + Enables the Map Gestures. + Ativa os gestos no mapa + Aktywuje gesty na mapie. + Включает указания на карте. + Povolit ukazování v mapě + Abilita i Gesti Mappa + Aktiviert die Kartenzeichen. + Activar Gestos en Mapa + Active le pointage sur carte. + マップ ジェスチャーを有効化 + 지도 신호 활성화 + 启用地图标识器 + 啟用地圖指示器 + Harita hareketlerini etkinleştir. + + Map Gesture Max Range Distância para gestos no mapa Maks. zasięg gestów @@ -40,13 +58,14 @@ Distanza Massima Gesti Mappa Maximale Reichweite der Kartenzeichen Máx. dist. para gestos en mapa - Distance max. des gestes de carte - マップ ジェスチャの最大範囲 + Portée du pointage sur carte + マップ ジェスチャーの最大範囲 지도 신호 최대 거리 地图标识器最大范围 地圖指示器最大範圍 + Harita Hareketi Max Uzaklık - + Max range between players to show the map gesture indicator [default: 7 meters] Distância max. entre os jogadores para mostrar o indicador de gesto no mapa [padrão: 7 metros] Maksymalny zasięg, w obrębie którego gesty będą widoczne dla graczy [domyślnie: 7 metrów] @@ -55,13 +74,76 @@ Distanza massima tra giocatori per mostrare i gesti in mappa [default: 7 metri] Maximale Reichweite zwischen Spielern um Kartenzeichen anzuzeigen (Standard: 7 Meter) Máxima distancia a la cual pueden verse el indicador de gestos [defecto: 7 m] - Distance max. entre les joueurs pour montrer le pointage sur carte. (Défaut : 7m) - プレイヤのマップ ジェスチャによる表示範囲を設定します [標準:7 メートル] + Définit le rayon au-delà duquel les joueurs ne verront plus l'indicateur de pointage de leurs alliés. Valeur par défaut : 7 mètres. + プレイヤーによるマップ ジェスチャーの表示範囲を設定します [標準:7 メートル] 플레이어간에 지도 신호 표시거리를 설정합니다. [기본: 7 미터] 设定地图标识器显示的最大范围距离 [预设: 7公尺] 設定地圖指示器顯示的最大範圍距離 [預設: 7公尺] - + + Update Interval + Intervalo de atualizações + Interwał aktualizacji + Интервал обновления + Interval aktualizace + Intervallo Aggiornamento + Update-Intervall + Período de actualización + Intervalle de mise à jour + 更新間隔 + 갱신 간격 + 更新间隔 + 更新間隔 + Güncelleme aralığı + + + Time between data updates. + Tempo entre atualização de dados + Odstęp pomiędzy aktualizacjami danych + Время между обновлениями данных. + Čas mezi aktualizacemi dat. + Intervallo tra aggiornamenti dati. + Zeit zwischen Datenupdates. + Tiempo entre actualizaciones sucesivas. + Période de mise à jour des données. + データの更新間隔 + 데이터 갱신 간격 + 定义每次更新数据的时间. + 定義每次更新數據的時間 + Veri güncellemeleri arasındaki zaman. + + + Name Text Color + Cor do texto do nome + Kolor nazw + Цвет текста имени + Barva textu pro jména + Colore Testo Nome + Farbe der Namenstexte. + Color de los nombres + Couleur du texte du nom + 名前への色 + 글 색상 명칭 + 名称文字颜色 + 名稱文字顏色 + Isim Metin Rengi + + + Color of the name tag text besides the map gestures mark. + Cor do texto da etiqueta de nome que fica embaixo da marcação de gestos no mapa. + Kolor nazwy gracza obok markera gestu mapy. + Цвет инмени игрока рядом с маркером жестов. + Colore del testo dei nametag oltre a quello dei Gesti Mappa + Farbe der Namenstexte neben der Kartenzeichen-Markierung. + Color de los nombres dibujados al lado del marcados de gestos. + Définit la couleur du texte pour le nom à côté du marqueur de pointage sur carte. + マップ ジェスチャーに表示される、名前の色を決定します。 + 지도 색상에 표시되는 이름의 색상을 결정합니다. + 定义名称文字颜色。使其与地图标识器颜色有所区别。 + 定義名稱文字顏色。使其與地圖指示器顏色有所區別 + Barva jména zobrazeného vedle značky ukazovátka na mapě. + + Lead Default Color Cor padrão para o líder Domyślny kolor lidera @@ -70,13 +152,13 @@ Colore Default Caposquadra Gruppenführer-Standardfarbe Color por defecto para el lider - Couleur principale de commandement. + Couleur de commandement par défaut リーダー用標準の色 리더 기본 색상 队长预设颜色 隊長預設顏色 - + Fallback Color value for group leaders when there is no group setting. [Module: leave blank to not force on clients] Valor de cor alternativa para líderes de grupo Domyślny kolor dla liderów grup. @@ -84,13 +166,14 @@ Colore di riserva dei capisquadra quando non c'è nessuna impostazione gruppo. [Modulo: lascia vuoto per non forzare su clients] Ersatz-Farbwert für Gruppenführer wenn keine Gruppeneinstellung vorhanden ist. [Modul: leer lassen um Anwendung bei Clients nicht zu erzwingen] Color por defecto para líderes cuando no está configurado [Módulo: dejar en blanco para no forzar] - Couleur par défaut pour les chefs de groupe quand il n'y a pas de réglage pour le groupe. (Module : laisser vide pour ne pas forcer chez les clients) + Définit la couleur par défaut pour les chefs de groupe quand il n'y a pas de réglage de groupe. [Module : laisser vide pour ne pas forcer chez les clients.] グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] 그룹 설정이 없는 경우 리더의 예비 색상 값입니다. [모듈: 클라이언트에서 강체치 않기 위해 공백으로 비워둘것] 当没有设定小队颜色时,此功能会定义队长的标识器颜色。[模块: 此栏留空来保持预设颜色] 當沒有設定小隊顏色時,此功能會定義隊長的指示器顏色。[模塊: 此欄留空來保持預設顏色] + Záložní barva pro velitele skupin pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů] - + Default Color Cor padrão Kolor domyślny @@ -104,8 +187,9 @@ 기본 색상 预设颜色 預設顏色 + Varsayılan Renk - + Fallback Color value when there is no group setting. [Module: leave blank to not force on clients] Valor alternativo de cor Kolor domyślny @@ -113,13 +197,14 @@ Colore di riserva quando non ci sono impostazioni gruppo. [Modulo: lascia vuto per non forzare sui clients] Ersatz-Farbwert wenn keine Gruppeneinstellung vorhanden ist. [Modul: leer lassen um Anwendung bei Clients nicht zu erzwingen] Color por defecto cuando no está configurado [Módulo: dejar en blanco para no forzar] - Couleur par défaut quand il n'y a pas de réglage pour le groupe. (Module : laisser vide pour ne pas forcer chez les clients) + Définit la couleur par défaut quand il n'y a pas de réglage pour le groupe. [Module : laisser vide pour ne pas forcer chez les clients.] グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] 그룹 설정이 없을 경우의 예비 색상입니다. [모듈: 클라이언트에서 강체치 않기 위해 공백으로 비워둘것] 当没有设定小队颜色时,此功能会定义玩家的标识器颜色。[模块: 此栏留空来保持预设颜色] 當沒有設定小隊顏色時,此功能會定義玩家的指示器顏色。[模塊: 此欄留空來保持預設顏色] + Záložní barva pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů] - + Lead Color Cor do líder Kolor lidera @@ -134,7 +219,7 @@ 队长颜色 隊長顏色 - + Color value for group leaders of groups synced with this module. Valor de cor para líderes de grupo sincronizados com este módulo. Kolor dla liderów grup zsynchronizowanych z tym modułem. @@ -142,13 +227,14 @@ Colore dei Caposquadra per gruppi sincronizzati con questo modulo. Farbwert für Gruppenführer, die mit diesem Modul synchronisiert werden. Color para los líderes de los grupos sincronizados al módulo. - Couleur pour les chefs de groupe des groupes synchronisés avec le module. + Couleur pour les chefs des groupes synchronisés avec ce module. モジュールで同期されたグループのリーダー用に色の値を決定します。 그룹이 이 모듈에 동기화 됐을때의 리더 색상입니다. 改变与此同步小队队长的标识器颜色。 改變與此同步小隊隊長的指示器顏色 + Barva pro velitele skupin které jsou synchronizované s tímto modulem. - + Color Cor Kolor @@ -162,8 +248,9 @@ 색상 颜色 顏色 + Renk - + Color value for group members of groups synced with this module. Valor de cor para membros de grupo sincronizados com este módulo. Kolor dla członków grup zsynchronizowanych z tym modułem. @@ -171,13 +258,25 @@ Colore per membri di gruppi sincronizzati con questo modulo. Farbwert für Gruppenmitglieder, die mit diesem Modul synchronisiert werden. Color para los miembros de los grupos sincronizados al módulo. - Couleur pour les membres du groupe synchronisé avec ce module. + Couleur pour les membres des groupes synchronisés avec ce module. モジュールで同期されたグループのメンバ用に色の値を決定します。 그룹이 이 모듈에 동기화 됐을때의 멤버 색상입니다. 改变与此同步小队队员的标识器颜色 改變與此同步小隊隊員的指示器顏色 + Barva pro členy skupin které jsou synchronizované s tímto modulem. + + + Only Show Friendly Gestures + Показывать только союзные жесты + Pokazuj jedynie sojusznicze gesty + Afficher uniquement le pointage des alliés + + + Shows only Gestures from Units that are from the same side or a Friendly side. + Показывать жесты только от игроков союзной стороны. + Affiche uniquement les pointages effectués par des unités qui sont du même camp, ou d'un camp allié. - + Map Gestures - Group Settings Gestos no mapa - Definições de Grupo Gesty na mapie - ustawienia grup @@ -186,100 +285,27 @@ Gesti Mappa - Impostazioni Gruppi Kartenzeichen - Gruppeneinstellungen Gestos en mapas - Configuración de grupos - Gestes de carte - réglages de groupe - マップ ジェスチャ - グループ設定 + Pointage sur carte - réglages de groupe + マップ ジェスチャー - グループ設定 지도 신호 - 그룹 설정 地图标识器 - 队伍设定 地圖指示器 - 隊伍設定 - - Update Interval - Intervalo de atualizações - Interwał aktualizacji - Интервал обновления - Interval aktualizace - Intervallo Aggiornamento - Update-Intervall - Período de actualización - Intervalle de mise à jour - 更新間隔 - 갱신 간격 - 更新间隔 - 更新間隔 - - - Time between data updates. - Tempo entre atualização de dados - Odstęp pomiędzy aktualizacjami danych - Время между обновлениями данных. - Čas mezi aktualizacemi dat. - Intervallo tra aggiornamenti dati. - Zeit zwischen Datenupdates. - Tiempo entre actualizaciones sucesivas. - Temps entre les actualisations de données - データの更新間隔 - 데이터 갱신 간격 - 定义每次更新数据的时间. - 定義每次更新數據的時間 - - - Enables the Map Gestures. - Ativa os gestos no mapa - Aktywuje gesty na mapie. - Включает указания на карте. - Povolit ukazování v mapě - Abilita i Gesti Mappa - Aktiviert die Kartenzeichen. - Activar Gestos en Mapa - Activer les gestes de carte - マップ ジェスチャを有効化 - 지도 신호 활성화 - 启用地图标识器 - 啟用地圖指示器 - - - Name Text Color - Cor do texto do nome - Kolor nazw - Цвет текста имени - Barva textu pro jména - Colore Testo Nome - Farbe der Namenstexte. - Color de los nombres - Couleur du texte du nom - 名前への色 - 글 색상 명칭 - 名称文字颜色 - 名稱文字顏色 - - - Color of the name tag text besides the map gestures mark. - Cor do texto da etiqueta de nome que fica embaixo da marcação de gestos no mapa. - Kolor nazwy gracza obok markera gestu mapy. - Цвет инмени игрока рядом с маркером жестов. - Colore del testo dei nametag oltre a quello dei Gesti Mappa - Farbe der Namenstexte neben der Kartenzeichen-Markierung. - Color de los nombres dibujados al lado del marcados de gestos. - Couleur des tags de nom à côté de marqueur de pointage sur carte. - マップ ジェスチャに表示される、名前の色を決定します。 - 지도 색상에 표시되는 이름의 색상을 결정합니다. - 定义名称文字颜色。使其与地图标识器颜色有所区别。 - 定義名稱文字顏色。使其與地圖指示器顏色有所區別 - - - Map Gestures - Gestos no mapa - Gesty na mapie - Жесты на карте - Ukazovní v mapě - Gesti Mappa - Kartenzeichen - Gestos en mapa - Gestes de carte - マップ ジェスチャ - 지도 신호 - 地图标识器 - 地圖指示器 + + ACE Map Gestures + ACE Gestos no mapa + ACE Gesty na mapie + ACE Жесты на карте + ACE Ukazování v mapě + ACE Gesti Mappa + ACE Kartenzeichen + ACE Gestos en mapa + ACE Pointage sur carte + ACE マップ ジェスチャー + ACE 지도 신호 + ACE 地图标识器 + ACE 地圖指示器 + ACE Harita Hareketleri diff --git a/addons/maptools/CfgEventHandlers.hpp b/addons/maptools/CfgEventHandlers.hpp index 5c876708f2c..1f53a9b2ec1 100644 --- a/addons/maptools/CfgEventHandlers.hpp +++ b/addons/maptools/CfgEventHandlers.hpp @@ -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 { - clientInit = QUOTE( call COMPILE_FILE(XEH_postInitClient) ); + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient)); }; }; diff --git a/addons/maptools/CfgVehicles.hpp b/addons/maptools/CfgVehicles.hpp index 2e5663e251f..5ab3eac165f 100644 --- a/addons/maptools/CfgVehicles.hpp +++ b/addons/maptools/CfgVehicles.hpp @@ -5,14 +5,14 @@ class CfgVehicles { class ACE_MapGpsShow { displayName = CSTRING(MapGpsShow); condition = QUOTE((!GVAR(mapGpsShow)) && {call FUNC(canUseMapGPS)}); - statement = QUOTE(GVAR(mapGpsShow) = true; [GVAR(mapGpsShow)] call FUNC(openMapGps)); + statement = QUOTE(GVAR(mapGpsShow) = true;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 0; }; class ACE_MapGpsHide { displayName = CSTRING(MapGpsHide); condition = QUOTE((GVAR(mapGpsShow)) && {call FUNC(canUseMapGPS)}); - statement = QUOTE(GVAR(mapGpsShow) = false; [GVAR(mapGpsShow)] call FUNC(openMapGps)); + statement = QUOTE(GVAR(mapGpsShow) = false;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 0; }; diff --git a/addons/maptools/MapGpsUI.hpp b/addons/maptools/MapGpsUI.hpp deleted file mode 100644 index cd0a4184653..00000000000 --- a/addons/maptools/MapGpsUI.hpp +++ /dev/null @@ -1,80 +0,0 @@ -#define GUI_GRID_X (0) -#define GUI_GRID_Y (0) -#define GUI_GRID_W (0.025) -#define GUI_GRID_H (0.04) - -#define ST_LEFT 0x00 -#define ST_RIGHT 0x01 -#define ST_CENTER 0x02 - -#define W_gps 0.4025 -#define H_gps 0.25 -#define X_gps safeZoneX + safeZoneW - 1.1 * W_gps -#define Y_gps safeZoneY + safeZoneH - 1.2 * H_gps - -class RscTitles { - class RscACE_MapGps { - idd = 9855; - movingEnable = 1; - duration = 3600; - fadein = 0; - fadeout = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ui_mapGpsDisplay)), _this select 0)];); - class controls { - class back:RscPicture { - x = X_gps; - y = Y_gps; - w = W_gps; - h = H_gps; - text = QPATHTOF(UI\mapGps.paa); - colorBackground[] = {1, 1, 1, 1}; - }; - class heading: RscText{ - idc = 913590; - x = X_gps + W_gps * 0.225; - y = Y_gps + H_gps * 0.12; - w = W_gps * 0.2; - h = H_gps * 0.16; - style = ST_LEFT; - text = "225"; - colorBackground[] = {0,0,0,0}; - colorText[] = {0.247,0.251,0.157,1}; - shadowColo[] = {0,0,0,0}; - // EtelkaNarrowMediumPro broke with 1.72 hotfix, can revert back to that font if fixed (following 3 uses of PuristaSemibold) - font = "PuristaSemibold"; - shadow = 0; - sizeEx = 0.042; - }; - class altitude: RscText{ - idc = 913591; - x = X_gps + W_gps * 0.575; - y = Y_gps + H_gps * 0.12; - w = W_gps * 0.2; - h = H_gps * 0.16; - style = ST_RIGHT; - text = "55 m"; - colorBackground[] = {0,0,0,0}; - colorText[] = {0.247,0.251,0.157,1}; - shadowColo[] = {0,0,0,0}; - font = "PuristaSemibold"; - shadow = 0; - sizeEx = 0.042; - }; - class coordinates: RscText{ - idc = 913592; - x = X_gps + W_gps * 0.15; - y = Y_gps + H_gps * 0.33; - w = W_gps * 0.7; - h = H_gps * 0.35; - style = ST_CENTER; - text = "012.3 115.1"; - colorBackground[] = {0,0,0,0}; - colorText[] = {0.247,0.251,0.157,1}; - shadowColo[] = {0,0,0,0}; - font = "PuristaSemibold"; - shadow = 0; - sizeEx = 0.1; - }; - }; - }; -}; diff --git a/addons/maptools/RscDisplayMainMap.hpp b/addons/maptools/RscDisplayMainMap.hpp new file mode 100644 index 00000000000..db54ab6bf8f --- /dev/null +++ b/addons/maptools/RscDisplayMainMap.hpp @@ -0,0 +1,89 @@ +class RscDisplayMainMap { + class objects { + class GVAR(MapGpsDisplay): RscObject { + show = 0; + idc = 913589; + type = 82; + model = QPATHTOF(data\MapGpsDisplay.p3d); + /* + 1.000 - normal model + memory - has 4 points in selection "deviceScreen" and then those 4 as individual "deviceScreen tl", "deviceScreen br", "deviceScreen b'", "deviceScreen br" + geometry - has a simpe box with a name selection component01 (needed to make it dragable) + */ + scale = 0.333; + direction[] = {0,1,0}; + up[] = {0,0,-1}; + x = 0.9; + y = 0.9; + z = 0.2; + xBack = 0.9; + yBack = 0.9; + zBack = 0.3; + inBack = 1; + enableZoom = 1; + zoomDuration = 0.001; + class Areas { + class deviceScreen { + selection = "deviceScreen"; + class controls { + class Picture: RscPicture { + text = QPATHTOF(UI\MapGpsDisplay_background_ca.paa); + // gets displayed in game a little bit washed out depending on rotation angle + x = 0; + y = 0; + w = 1; + h = 0.77; + }; + + class heading: RscText { + idc = 913590; + x = 0.15; + y = 0; + w = 0.35; + h = 0.2; + style = 0; // ST_LEFT + text = "225"; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.1235,0.1255,0.0785,1}; + shadowColor[] = {0,0,0,0}; + // EtelkaNarrowMediumPro broke with 1.72 hotfix, can revert back to that font if fixed (following 3 uses of PuristaSemibold) [ still broken ] + font = "PuristaSemibold"; + shadow = 0; + sizeEx = 0.18; + }; + class altitude: RscText{ + idc = 913591; + x = 0.5; + y = 0; + w = 0.35; + h = 0.2; + style = 1; // ST_RIGHT + text = "55 m"; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.1235,0.1255,0.0785,1}; + shadowColor[] = {0,0,0,0}; + font = "PuristaSemibold"; + shadow = 0; + sizeEx = 0.18; + }; + class coordinates: RscText{ + idc = 913592; + x = 0; + y = 0.225; + w = 1; + h = 0.35; + style = 2; // ST_CENTER + text = "12345 12345"; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.1235,0.1255,0.0785,1}; + shadowColor[] = {0,0,0,0}; + font = "PuristaSemibold"; + shadow = 0; + sizeEx = 0.333; + }; + }; + }; + }; + }; + }; +}; diff --git a/addons/maptools/UI/MapGpsDisplay_background_ca.paa b/addons/maptools/UI/MapGpsDisplay_background_ca.paa new file mode 100644 index 00000000000..fedae61df57 Binary files /dev/null and b/addons/maptools/UI/MapGpsDisplay_background_ca.paa differ diff --git a/addons/maptools/UI/mapGps.paa b/addons/maptools/UI/mapGps.paa deleted file mode 100644 index defcdbc63bd..00000000000 Binary files a/addons/maptools/UI/mapGps.paa and /dev/null differ diff --git a/addons/maptools/XEH_PREP.hpp b/addons/maptools/XEH_PREP.hpp index eac6947431a..cf193698e5d 100644 --- a/addons/maptools/XEH_PREP.hpp +++ b/addons/maptools/XEH_PREP.hpp @@ -5,6 +5,5 @@ PREP(drawLinesOnRoamer); PREP(handleMouseButton); PREP(handleMouseMove); PREP(isInsideMapTool); -PREP(openMapGps); PREP(openMapGpsUpdate); PREP(updateMapToolMarkers); diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index ddde7063cc9..c7dceacd759 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -6,6 +6,7 @@ if (!hasInterface) exitWith {}; // Init variables GVAR(mapGpsShow) = true; +GVAR(mapGpsNextUpdate) = -1; GVAR(mapTool_Shown) = 0; GVAR(mapTool_pos) = [0,0]; @@ -19,18 +20,12 @@ GVAR(mapTool_isRotating) = false; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", {_this call FUNC(handleMouseMove);}]; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseButtonDown", {[1, _this] call FUNC(handleMouseButton);}]; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseButtonUp", {[0, _this] call FUNC(handleMouseButton)}]; - ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {_this call FUNC(updateMapToolMarkers);}]; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {call FUNC(updateMapToolMarkers); call FUNC(openMapGpsUpdate);}]; }, []] call CBA_fnc_waitUntilAndExecute; ["visibleMap", { params ["", "_mapOn"]; - if (_mapOn) then { - // Show GPS if required - [GVAR(mapGpsShow)] call FUNC(openMapGps); - } else { - // Hide GPS - [false] call FUNC(openMapGps); - + if (!_mapOn) then { // Handle closing map in middle of line drawing (it's never created) GVAR(freedrawing) = false; }; diff --git a/addons/maptools/config.cpp b/addons/maptools/config.cpp index e94ec2edcde..40d532a0c11 100644 --- a/addons/maptools/config.cpp +++ b/addons/maptools/config.cpp @@ -26,7 +26,7 @@ class RscButtonMenu; class RscEdit; #include "ACE_Settings.hpp" -#include "MapGpsUI.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "RscDisplayMainMap.hpp" diff --git a/addons/maptools/data/MapGpsDisplay.p3d b/addons/maptools/data/MapGpsDisplay.p3d new file mode 100644 index 00000000000..8b5a4831684 Binary files /dev/null and b/addons/maptools/data/MapGpsDisplay.p3d differ diff --git a/addons/maptools/functions/fnc_canUseMapGPS.sqf b/addons/maptools/functions/fnc_canUseMapGPS.sqf index 80f2541cab8..5de3546d9c7 100644 --- a/addons/maptools/functions/fnc_canUseMapGPS.sqf +++ b/addons/maptools/functions/fnc_canUseMapGPS.sqf @@ -10,7 +10,7 @@ * Boolean * * Example: - * call ACE_map_fnc_canUseMapGPS + * call ACE_maptools_fnc_canUseMapGPS * * Public: No */ diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index 36639a02d7b..4e1c124b2a1 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -24,8 +24,10 @@ TRACE_2("params",_dir,_params); if ((_button == 0) && {GVAR(freedrawing) || _ctrlKey}) exitWith { if (GVAR(freedrawing) && {_dir == 0}) then { GVAR(freedrawing) = false; - GVAR(drawPosEnd) = _control ctrlMapScreenToWorld [_screenPosX, _screenPosY]; - TRACE_1("Ending Line",GVAR(freedrawing),GVAR(drawPosEnd)); + if (_shiftKey) exitWith { + TRACE_1("using vanilla straight line",_shiftKey); + }; + TRACE_2("Ending Line",GVAR(freedrawing),GVAR(freeDrawingData)); [{ if (allMapMarkers isEqualTo []) exitWith {}; private _markerName = allMapMarkers select (count allMapMarkers - 1); diff --git a/addons/maptools/functions/fnc_openMapGps.sqf b/addons/maptools/functions/fnc_openMapGps.sqf deleted file mode 100644 index 96be3f6bd24..00000000000 --- a/addons/maptools/functions/fnc_openMapGps.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: esteldunedain - * Opens or closes the gps on the map screen, showing coordinates - * - * Arguments: - * 0: Open GPS? - * - * Return Value: - * None - * - * Example: - * [true] call ACE_maptools_fnc_openMapGps - * - * Public: No - */ - -params ["_shouldOpenGps"]; - -private _isOpen = !(isNull (uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull])); - -if (_shouldOpenGps && {"ItemGPS" in assignedItems ACE_player} && {!_isOpen}) then { - ("RscACE_MapGps" call BIS_fnc_rscLayer) cutRsc ["RscACE_MapGps","PLAIN"]; - - [FUNC(openMapGpsUpdate), 0.5, []] call CBA_fnc_addPerFrameHandler; //update bearing/altitude every 0.5 sec (ticktime) -} else { - ("RscACE_MapGps" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; -}; diff --git a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf index 84cb3f17a46..646b5df2e07 100644 --- a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf +++ b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf @@ -1,30 +1,34 @@ #include "script_component.hpp" /* - * Author: esteldunedain - * update gps display + * Author: esteldunedain, PabstMirror + * update gps display, called from main map's draw * * Arguments: - * Something + * 0: Map ctrl * * Return Value: * None * * Example: - * call ACE_maptools_fnc_openMapGpsUpdate + * [findDisplay 12 displayCtrl 51] call ACE_maptools_fnc_openMapGpsUpdate; * * Public: No */ -if ((!("ItemGPS" in assigneditems ACE_player)) || {isNull (uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull])}) exitWith { - ("RscACE_MapGps" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; // Close GPS RSC - [(_this select 1)] call CBA_fnc_removePerFrameHandler; // Remove frameHandler +params ["_mapCtrl"]; +private _mapDisplay = ctrlParent _mapCtrl; + +if ((!GVAR(mapGpsShow)) || {!(call FUNC(canUseMapGPS))}) exitWith { + (_mapDisplay displayCtrl 913589) ctrlShow false; }; -disableSerialization; +(_mapDisplay displayCtrl 913589) ctrlShow true; + +if (CBA_missionTime < GVAR(mapGpsNextUpdate)) exitWith {}; +GVAR(mapGpsNextUpdate) = CBA_missionTime + 0.5; -private _mapGpsDisplay = uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull]; -private _ctrl = _mapGpsDisplay displayCtrl 913590; +private _ctrl = _mapDisplay displayCtrl 913590; _ctrl ctrlSetText str (round (getDir ACE_player)); // Set Heading -_ctrl = _mapGpsDisplay displayCtrl 913591; +_ctrl = _mapDisplay displayCtrl 913591; _ctrl ctrlSetText str (round ((getPosASL ACE_player) select 2) + EGVAR(common,mapAltitude)); // Set Altitude -_ctrl = _mapGpsDisplay displayCtrl 913592; +_ctrl = _mapDisplay displayCtrl 913592; _ctrl ctrlSetText mapGridPosition ACE_player; // Set grid cords diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index f0fdd8f1865..56ee4daa184 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -16,6 +16,7 @@ 독도용 도구 地图工具 地圖工具 + Harita Araçları The Map Tools allow you to measure distances and angles on the map. @@ -32,6 +33,7 @@ 독도용 도구는 지도상에서 거리나 각도를 잴 수 있게 해줍니다. 地图工具能够让你在地图上测量距离与角度 地圖工具能夠讓你在地圖上測量距離與角度 + Harita Araçları, haritadaki mesafeleri ve açıları ölçmenize olanak tanır. Map Tools @@ -48,6 +50,7 @@ 독도용 도구 地图工具 地圖工具 + Harita Araçları Hide Map Tool @@ -64,12 +67,13 @@ 독도용 도구 숨기기 隐藏地图工具 隱藏地圖工具 + Harita Aracını gizle Show Normal Map Tool Zeige Kartenwerkzeug (normal) Mostrar herr. de mapa normal - Montrer les outils de cartographie (normaux) + Montrer les outils de navigation (normaux) Visualizza Strumenti Cartografici standard Mostrar Ferramenta de Mapa Padrão Térképészeti eszköz megjelenítése (normál méret) @@ -80,12 +84,13 @@ 보통 독도용 도구로 보기 显示地图工具 顯示地圖工具 + Normal Harita Aracını Göster Show Small Map Tool Zeige Kartenwerkzeug (klein) Mostrar herr. de mapa pequeñas - Montrer les outils de cartographie (petits) + Montrer les outils de navigation (petits) Visualizza Strumenti Cartografici piccoli Mostrar Ferramenta de Mapa Pequena Térképészeti eszköz megjelenítése (kicsinyített) @@ -96,6 +101,7 @@ 작은 독도용 도구로 보기 显示小的地图工具 顯示小的地圖工具 + Küçük Harita Aracını Göster Align Map Tool to North @@ -112,6 +118,7 @@ 독도용 도구를 북쪽으로 정렬 地图工具对准北方 地圖工具對準北方 + Harita Aracını Kuzeye Hizala Align Map Tool to Compass @@ -128,12 +135,13 @@ 독도용 도구를 나침반에 정렬 地图工具对准指北针 地圖工具對準指北針 + Harita Aracını Pusulaya Hizala Show GPS on Map Zeige GPS auf der Karte Mostrar el GPS sobre el mapa - Montrer le GPS + Afficher le GPS sur la carte Visualizza il GPS sulla mappa Mostrar GPS no Mapa GPS megjelenítése a térképen @@ -144,12 +152,13 @@ GPS를 지도상에 꺼내기 在地图上显示GPS 在地圖上顯示GPS + Harita da GPS Göster Hide GPS on Map Verstecke GPS auf der Karte Ocultar el GPS del mapa - Ranger le GPS + Masquer le GPS sur la carte Nascondi il GPS sulla mappa Ocultar GPS no Mapa GPS elrejtése a térképről @@ -160,6 +169,7 @@ GPS를 지도상에서 숨기기 在地图上隐藏GPS 在地圖上隱藏GPS + Harita da GPS'i Gizle Direction: %1° @@ -176,10 +186,11 @@ 방위: %1° 方位: %1° 方位: %1° + Yön: %1° Rotate Map Tools Key - Touche de rotation des outils de naviguation + Touche de rotation des outils de navigation Клавиша поворота инструментов карты マップ ツールの回転キー Klawisz obrotu narzędzi nawigacyjnych @@ -188,10 +199,13 @@ Ruota Strumenti di Mappatura 选转地图工具的按键 選轉地圖工具的按鍵 + Tecla para girar Ferramentas de Mapa + Klávesa pro otáčení pomůcky k mapě + Harita Aracının Yönünü Değiştirme Tuşu Modifier key to allow rotating map tools - Touche modificatrice permettant la rotation des outils de naviguation + Touche modificatrice permettant la rotation des outils de navigation. Клавиша-модификатор, позволяющая поворачивать инструменты карты マップ ツールを回転させるキーを編集できます。 Modyfikator pozwalający na obracanie narzędzi nawigacyjnych @@ -200,6 +214,9 @@ Tasto modifica per consentire strumenti di mappatura rotanti 修改旋转地图工具的按键 修改旋轉地圖工具的按鍵 + Tecla de Modificador para permitir girar as ferramentas de mapa + Klávesa která umožnuje otáčení pomůcky k mapě + Dönen harita araçlarına izin veren değiştirici tuş Draw straight lines with maptools @@ -211,6 +228,10 @@ Disegna linee dritte con gli strumenti di mappatura 使用地图工具来绘制直线 使用地圖工具來繪製直線 + Прямые линии с инструментами карты + Desenhar linhas retas com as ferramentas de mapa + Kreslit rovné čáry s pomůckou k mapě + Maptools ile düz çizgiler çizme Draw on the edge of maptools to draw straight lines. Note: Must hover at midpoint to delete. @@ -218,10 +239,14 @@ Zeichne gerade Linien am Rand des Kartenwerkzeugs. Hinweis: zum Löschen über den Mittelpunkt der Linie fahren 독도용 도구 가장자리에 직선을 그립니다. 주의: 삭제하기 위해선 선의 중앙에 가져다 대십시요 Przeciągnij po krawędzi narzędzi nawigacyjnych by narysować prostą linię. Uwaga: aby usunąć linię - nalezy ustawić kursor nad jej środkiem. - Utiliser le bord des outils de navigation pour tracer des lignes droites. Note: l'on doit survoler le milieu du trait pour pouvoir le supprimer. + Utilise le bord des outils de navigation pour tracer des lignes droites. Note : il faut pointer au milieu du trait pour pouvoir le supprimer. Disegna sul bordo degli strumenti di mappatura per disegnare linee dritte. Nota: Deve spostarsi al centro per essere cancellato. 使用地图工具的边缘来绘制直线。备注: 要删除直线时,请把滑鼠移动到该线条的中央即可删除该线。 使用地圖工具的邊緣來繪製直線。備註: 要刪除直線時,請把滑鼠移動到該線條的中央即可刪除該線 + Рисуйте по краю инструмента карты, чтобы провести прямые линии. Примечание: при удалении линии размещайте курсор над ее серединой + Desenhe no canto da ferramenta de mapa para desenhar linhas retas. Observação: Sobreponha o meio com o mouse para deletar. + Povolit kreslení rovných čar při kreslení na okraji pomůcky k mapě. Poznámka: Pro smazání musíte mít kurzor nad středem čáry. + Düz çizgiler çizmek için maptools'un kenarına çizin. Not: Silmek için orta noktada fareyle üzerine gelmeniz gerekir. diff --git a/addons/markers/XEH_postInit.sqf b/addons/markers/XEH_postInit.sqf index 050dcffd81f..7f644691d3f 100644 --- a/addons/markers/XEH_postInit.sqf +++ b/addons/markers/XEH_postInit.sqf @@ -18,6 +18,8 @@ GVAR(currentMarkerAngle) = 0; GVAR(currentMarkerColorConfigName) = ""; GVAR(currentMarkerConfigName) = ""; +GVAR(userPlacedMarkers) = []; + // set marker pos local on every machine (prevent markers visible for everyone) [QGVAR(setMarkerPosLocal), { params ["_marker", "_pos"]; @@ -28,6 +30,7 @@ GVAR(currentMarkerConfigName) = ""; private _index = (GETGVAR(allMapMarkers,[])) find _marker; // case-sensitive, but should be fine if (_index < 0) exitWith { + if (!isMultiplayer) exitWith {}; WARNING_1("Could not find data for %1", _marker); }; diff --git a/addons/markers/functions/fnc_canMove.sqf b/addons/markers/functions/fnc_canMove.sqf index 7b19385d266..2b2eaf5e9f7 100644 --- a/addons/markers/functions/fnc_canMove.sqf +++ b/addons/markers/functions/fnc_canMove.sqf @@ -4,17 +4,19 @@ * Checks whether the player can move markers. * * Arguments: - * None + * 0: Marker Name * * Return Value: * Whether the player can move markers * * Example: - * [] call ace_markers_fnc_canMove + * ["X"] call ace_markers_fnc_canMove * * Public: No */ +params [["_marker",""]]; + switch (GVAR(moveRestriction)) do { case MOVE_RESTRICTION_NOBODY: {false}; case MOVE_RESTRICTION_ALL: {true}; @@ -25,5 +27,8 @@ switch (GVAR(moveRestriction)) do { case MOVE_RESTRICTION_GROUP_LEADERS_ADMINS: { (leader ACE_player == ACE_player) || IS_ADMIN }; + case MOVE_RESTRICTION_OWNER: { + _marker in GVAR(userPlacedMarkers) + }; default {true}; }; // return diff --git a/addons/markers/functions/fnc_onMouseButtonDown.sqf b/addons/markers/functions/fnc_onMouseButtonDown.sqf index afdacfb521f..ce6f99ee00e 100644 --- a/addons/markers/functions/fnc_onMouseButtonDown.sqf +++ b/addons/markers/functions/fnc_onMouseButtonDown.sqf @@ -27,7 +27,7 @@ if (_button != 0 || {!([_shift, _ctrl, _alt] isEqualTo [false, false, true])}) e ctrlMapMouseOver _ctrlMap params [["_type", ""], "_marker"]; -if (_type == "marker" && {_marker find "_USER_DEFINED" != -1 && {call FUNC(canMove)}}) then { +if (_type == "marker" && {_marker find "_USER_DEFINED" != -1 && {_marker call FUNC(canMove)}}) then { _ctrlMap ctrlMapCursor ["Track", "Move"]; private _originalPos = getMarkerPos _marker; diff --git a/addons/markers/functions/fnc_placeMarker.sqf b/addons/markers/functions/fnc_placeMarker.sqf index af905d71f1e..a1b136aad51 100644 --- a/addons/markers/functions/fnc_placeMarker.sqf +++ b/addons/markers/functions/fnc_placeMarker.sqf @@ -16,19 +16,45 @@ * Public: No */ -disableserialization; params ["_display", "_closeNum"]; TRACE_2("params",_display,_closeNum); +private _editingMarker = !(GVAR(editingMarker) isEqualTo ""); + if (_closeNum isEqualTo 1) then { - if !(GVAR(editingMarker) isEqualTo "") then { + if (_editingMarker) then { //delete "old" marker deleteMarker GVAR(editingMarker); }; // set and send marker data the next frame. the actual marker isn't created yet [{ + params ["_startingMarkers", "_editingMarker"]; + private _newMarkers = allMapMarkers - _startingMarkers; + + private _newestMarker = ""; + private _newestMarkerDist = 1e10; + + { + private _distX = GVAR(currentMarkerPosition) distance2d (getMarkerPos _x); + if (_distX < _newestMarkerDist) then { + _newestMarker = _x; + _newestMarkerDist = _distX; + }; + } forEach _newMarkers; + + TRACE_3("",_newestMarker,_newestMarkerDist,_newMarkers); + + if (_newestMarker == "") exitWith {ERROR_1("could not find user placed marker from %1",_newMarkers);}; + + // provide hook for external scripts + [QGVAR(markerPlaced),[_newestMarker, _editingMarker]] call CBA_fnc_localEvent; + + // Add to list of user placed markers, and then filter for deleted + GVAR(userPlacedMarkers) pushBack _newestMarker; + GVAR(userPlacedMarkers) = GVAR(userPlacedMarkers) select {!((getMarkerPos _x) isEqualTo [0,0,0])}; + [QGVAR(setMarkerNetwork), [ - allMapMarkers select (count allMapMarkers - 1), [ + _newestMarker, [ GETGVAR(currentMarkerConfigName,""), GETGVAR(currentMarkerColorConfigName,""), GETGVAR(currentMarkerPosition,[]), @@ -36,10 +62,10 @@ if (_closeNum isEqualTo 1) then { ] ]] call CBA_fnc_globalEvent; - }, []] call CBA_fnc_execNextFrame; + }, [allMapMarkers, _editingMarker]] call CBA_fnc_execNextFrame; } else { - if !(GVAR(editingMarker) isEqualTo "") then { - //editing was canceled show the original marker again + if (_editingMarker) then { + // editing was canceled show the original marker again GVAR(editingMarker) setMarkerAlphaLocal 1; }; }; diff --git a/addons/markers/functions/fnc_sendMarkersJIP.sqf b/addons/markers/functions/fnc_sendMarkersJIP.sqf index 08b36181b1f..2d6a3c912a4 100644 --- a/addons/markers/functions/fnc_sendMarkersJIP.sqf +++ b/addons/markers/functions/fnc_sendMarkersJIP.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [onUnloadEvent] call ace_markers_fnc_sendMarkerJIP; + * [onUnloadEvent] call ace_markers_fnc_sendMarkersJIP; * * Public: No */ diff --git a/addons/markers/functions/fnc_setMarkerJIP.sqf b/addons/markers/functions/fnc_setMarkerJIP.sqf index ba7dc68a5b5..9c9aea9fd71 100644 --- a/addons/markers/functions/fnc_setMarkerJIP.sqf +++ b/addons/markers/functions/fnc_setMarkerJIP.sqf @@ -18,7 +18,7 @@ */ params ["_allMapMarkers", "_allMapMarkersProperties"]; -TRACE_3("params",_allMapMarkers,_allMapMarkersProperties); +TRACE_2("params",_allMapMarkers,_allMapMarkersProperties); { private _index = _allMapMarkers find _x; diff --git a/addons/markers/functions/fnc_setMarkerNetwork.sqf b/addons/markers/functions/fnc_setMarkerNetwork.sqf index b59338e7d2b..eb0b547bb0f 100644 --- a/addons/markers/functions/fnc_setMarkerNetwork.sqf +++ b/addons/markers/functions/fnc_setMarkerNetwork.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [[],[],dummyLogic] call ace_markers_fnc_setMarkerJIP; + * [[],[],dummyLogic] call ace_markers_fnc_setMarkerNetwork; * * Public: No */ diff --git a/addons/markers/initSettings.sqf b/addons/markers/initSettings.sqf index d317d663eae..e4aa16b00fc 100644 --- a/addons/markers/initSettings.sqf +++ b/addons/markers/initSettings.sqf @@ -1,21 +1,23 @@ [ QGVAR(moveRestriction), "LIST", [LSTRING(MoveRestriction), LSTRING(MoveRestriction_Description)], - format ["ACE %1", localize ELSTRING(map,Module_DisplayName)], + [format ["ACE %1", localize ELSTRING(map,Module_DisplayName)], localize LSTRING(Module_DisplayName)], [ [ MOVE_RESTRICTION_NOBODY, MOVE_RESTRICTION_ALL, MOVE_RESTRICTION_ADMINS, MOVE_RESTRICTION_GROUP_LEADERS, - MOVE_RESTRICTION_GROUP_LEADERS_ADMINS + MOVE_RESTRICTION_GROUP_LEADERS_ADMINS, + MOVE_RESTRICTION_OWNER ], [ LSTRING(MoveRestriction_Nobody), LSTRING(MoveRestriction_All), LSTRING(MoveRestriction_Admins), LSTRING(MoveRestriction_GroupLeaders), - LSTRING(MoveRestriction_GroupLeadersAndAdmins) + LSTRING(MoveRestriction_GroupLeadersAndAdmins), + LSTRING(MoveRestriction_Owner) ], 1 ] diff --git a/addons/markers/script_component.hpp b/addons/markers/script_component.hpp index fdb5f1614e3..8b268e2d03e 100644 --- a/addons/markers/script_component.hpp +++ b/addons/markers/script_component.hpp @@ -29,3 +29,4 @@ #define MOVE_RESTRICTION_ADMINS 1 #define MOVE_RESTRICTION_GROUP_LEADERS 2 #define MOVE_RESTRICTION_GROUP_LEADERS_ADMINS 3 +#define MOVE_RESTRICTION_OWNER 4 diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 4ce49db4df8..2add6e468ed 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -16,6 +16,7 @@ 방위: %1° 方位: %1° 方位: %1° + Yön: %1° Markers @@ -26,6 +27,11 @@ 标志 맵마커 Znaczniki + Маркеры + Marcadores + Marqueurs + Značky + Işaretleyiciler Allow moving markers for @@ -36,16 +42,25 @@ 谁可以移动标志 Permetti di spostare i marcatori a: Zezwól na poruszanie znaczników dla + Разрешить перемещение маркеров для + Permitir que movam marcadores + Permettre le déplacement des marqueurs pour + Povolit pohyb se značkami pro Restricts which players are able to move markers while holding the Alt key. Beschränkt welche Spieler Marker mit gedrückter Alt-Taste bewegen können. - どのプレイヤーが Alt キーを押しながらマーカー移動をさせられるか制限できます。 + どのプレイヤーが Alt キーを押しながらマーカー移動をできるか制限できます。 Alt 키를 누른 상태에서 마커를 움직일 수있는 플레이어를 제한합니다. 設定誰可以透過按住Alt鍵來移動標誌 设定谁可以透过按住Alt键来移动标志。 Limita quali giocatori possono spostare i marcatori mentre premono il tasto Alt. Ogranicz którzy gracze mogą poruszać znacznikami podczas trzymania przycisku Alt. + Устанавливает ограничение на перемещения маркеров игроками при помощи клавиши Alt + Restringe quais jogadores podem mover os marcadores do mapa enquanto seguram a tecla ALT. + Définit quels joueurs peuvent déplacer des marqueurs en maintenant la touche Alt enfoncée. + Omezuje kdo může pohybovat se značkami při podržení klávesy Alt. + Alt tuşunu basılı tutarken hangi işaretçilerin hareket edebileceğini sınırlar. Nobody @@ -56,6 +71,11 @@ 没有人 Nessuno Nikt + Никого + Ninguém + Personne + Nikdo + Hiçkimse All players @@ -66,6 +86,11 @@ 所有玩家 모든 플레이어 Wszyscy gracze + Всех игроков + Todos jogadores + Tous les joueurs + Všichni hráči + Bütün Oyuncular Admins @@ -76,6 +101,11 @@ 管理员 관리자 Administratorzy + Админов + Admins + Admins + Administrátoři + Adminler Group leaders @@ -86,6 +116,11 @@ 小队长 분대장 Przywódcy grup + Лидеров групп + Líderes de grupo + Chefs de groupe + Velitelé jednotek + Grup Liderleri Group leaders and Admins @@ -96,6 +131,24 @@ 小队长与管理员 분대장과 관리자 Przywódcy grup i Administratorzy + Лидеров групп и Админов + Líderes de grupo e Admins + Chefs de groupe et Admins + Velitelé jednotek a Administrátoři + Grup Liderleri Ve Adminler + + + Creator + Ersteller + 設置者 + Twórca + Создателя + Criador + 放置者 + Créateur + Creatore + Tvůrce + Yaratıcı diff --git a/addons/maverick/CfgAmmo.hpp b/addons/maverick/CfgAmmo.hpp index 2b48618e82e..a741501540c 100644 --- a/addons/maverick/CfgAmmo.hpp +++ b/addons/maverick/CfgAmmo.hpp @@ -4,7 +4,7 @@ class CfgAmmo { class Components; }; class Missile_AGM_02_F : MissileBase {}; - + class GVAR(L) : Missile_AGM_02_F { author = "xrufix"; autoSeekTarget = 0; diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml index 4b0a83cc947..45d50ef5a81 100644 --- a/addons/maverick/stringtable.xml +++ b/addons/maverick/stringtable.xml @@ -1,8 +1,8 @@ - - + + - + AGM-65 Maverick L, Laser Guided Anti-Ground-Missile AGM-65 Maverick L, lasergelenkte Luft-Boden-Rakete AGM-65 Maverick L, Guida Laser Missile Anti-Terra @@ -11,8 +11,13 @@ AGM-65"小牛"空地L型,雷射导引对地导弹 AGM-65 Maverick L, 레이저 유도 대지 미사일 AGM-65 Maverick L, Kierowany laserowo pocisk powietrze-ziemia + AGM-65 Maverick L, ракета Воздух-Земля с лазерным наведением + AGM-65 Maverick L, Míssil Anti Chão Guiado a Laser + AGM-65L Maverick, Missile Air-Sol à Guidage Laser + AGM-65 Maverick L, Laserem naváděná střela vzduch-země + AGM-65 Maverick L, Laser Guided Anti-Ground-Missile - + AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] @@ -21,8 +26,13 @@ AGM-65"小牛"空地L型 [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] + AGM-65 Maverick L [ACE] + AGM-65 Maverick L [ACE] + 1x AGM-65L Maverick [ACE] + AGM-65 Maverick L [ACE] + AGM-65 Maverick L [ACE] - + 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] @@ -31,8 +41,13 @@ 2x AGM-65"小牛"空地L型 [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] + 2x AGM-65 Maverick L [ACE] + 2x AGM-65 Maverick L [ACE] + 2x AGM-65L Maverick [ACE] + 2x AGM-65 Maverick L [ACE] + 2x AGM-65 Maverick L [ACE] - + 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] @@ -41,8 +56,13 @@ 3x AGM-65"小牛"空地L型 [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] + 3x AGM-65 Maverick L [ACE] + 3x AGM-65 Maverick L [ACE] + 3x AGM-65L Maverick [ACE] + 3x AGM-65 Maverick L [ACE] + 3x AGM-65 Maverick L [ACE] - + Laser Guided Lasergelenkt Guida Laser @@ -51,8 +71,13 @@ 雷射导引 레이저 유도 Kierowany laserowo + С лазерным наведением + Guiado a laser + Guidage Laser + Laserem naváděná + Lazer Güdümlü - + Kh-25ML, Laser Guided Air-to-Ground-Missile Ch-25ML, Lasergelenkte Luft-Boden-Rakete Kh-25ML, 레이저 유도 대공 미사일 @@ -61,8 +86,13 @@ Kh-25ML、レーザー誘導対地ミサイル Kh-25ML, a Guida Laser Missile Aria-Terra Kh-25ML, Kierowany laserowo pocisk powietrze-ziemia + Х-25МЛ, ракета Воздух-Земля с лазерным наведением + Kh-25ML, Míssil Ar para Chão Guiado a Laser + Kh-25ML, Missile Air-Sol à Guidage Laser + Kh-25ML, Laserem naváděná střela vzduch-země + Kh-25ML, Laser Guided Air-to-Ground-Missile - + 1x Kh-25ML [ACE] 1x Ch-25ML [ACE] 1x Х-25МЛ [ACE] @@ -72,10 +102,14 @@ 1x Kh-25ML [ACE] 1x Kh-25ML [ACE] 1x Kh-25ML [ACE] + 1x Kh-25ML [ACE] + 1x Kh-25ML [ACE] + 1x Kh-25ML [ACE] + 1x Kh-25ML [ACE] - + AGM-65 Maverick L AGM-65 Maverick L AGM-65 Maverick L @@ -84,8 +118,13 @@ AGM-65"小牛"飞弹L型 AGM-65 Maverick L AGM-65 Maverick L + AGM-65 Maverick L + AGM-65 Maverick L + AGM-65L Maverick + AGM-65 Maverick L + AGM-65 Maverick L - + Kh-25ML Ch-25ML Х-25МЛ @@ -95,6 +134,10 @@ Kh-25ML Kh-25ML Kh-25ML + Kh-25ML + Kh-25ML + Kh-25ML + Kh-25ML diff --git a/addons/medical/$PBOPREFIX$ b/addons/medical/$PBOPREFIX$ index 72c25436ddc..15ed1394ed4 100644 --- a/addons/medical/$PBOPREFIX$ +++ b/addons/medical/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\medical +z\ace\addons\medical \ No newline at end of file diff --git a/addons/medical/ACE_Medical_Actions.hpp b/addons/medical/ACE_Medical_Actions.hpp deleted file mode 100644 index 64fc82dbec9..00000000000 --- a/addons/medical/ACE_Medical_Actions.hpp +++ /dev/null @@ -1,789 +0,0 @@ - -class ACE_Head { - displayName = CSTRING(Head); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(treatment)); - EXCEPTIONS - }; - class CheckResponse: CheckPulse { - displayName = CSTRING(Check_Response); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Diagnose: CheckPulse { - displayName = CSTRING(Actions_Diagnose); - condition = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; -class ACE_Torso { - displayName = CSTRING(Torso); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - enableInside = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PlaceInBodyBag { - displayName = CSTRING(PlaceInBodyBag); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'BodyBag')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'BodyBag')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - enableInside = 1; - }; - class TriageCard { - displayName = CSTRING(Actions_TriageCard); - distance = 2.0; - condition = "true"; - statement = QUOTE([ARR_2(_target, true)] call DFUNC(displayTriageCard)); - EXCEPTIONS - showDisabled = 1; - enableInside = 1; - icon = QPATHTOF(UI\icons\triageCard.paa); - }; - class Diagnose { - displayName = CSTRING(Actions_Diagnose); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'Diagnose')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'Diagnose')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = ""; - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - enableInside = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class SurgicalKit: fieldDressing { - displayName = CSTRING(Use_SurgicalKit); - condition = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\surgicalKit.paa); - }; - class PersonalAidKit: fieldDressing { - displayName = CSTRING(Use_Aid_Kit); - condition = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CPR: fieldDressing { - displayName = CSTRING(Actions_CPR); - condition = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; -}; -class ACE_ArmLeft { - displayName = ECSTRING(interaction,ArmLeft); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; -class ACE_ArmRight { - displayName = ECSTRING(interaction,ArmRight); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; - -}; -class ACE_LegLeft { - displayName = ECSTRING(interaction,LegLeft); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; -class ACE_LegRight { - displayName = ECSTRING(interaction,LegRight); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; diff --git a/addons/medical/ACE_Medical_SelfActions.hpp b/addons/medical/ACE_Medical_SelfActions.hpp deleted file mode 100644 index 9f01f08908a..00000000000 --- a/addons/medical/ACE_Medical_SelfActions.hpp +++ /dev/null @@ -1,520 +0,0 @@ -class Medical { - displayName = CSTRING(Actions_Medical); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class ACE_Head { - displayName = CSTRING(Head); - icon = QPATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - runOnHover = 1; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(treatment)); - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(treatment)); - }; - }; - class ACE_Torso { - displayName = CSTRING(Torso); - distance = 5.0; - condition = "true"; - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - class TriageCard { - displayName = CSTRING(Actions_TriageCard); - distance = 2.0; - condition = "true"; - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_2(_target, true)] call DFUNC(displayTriageCard)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\triageCard.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - }; - class ACE_ArmLeft { - displayName = ECSTRING(interaction,ArmLeft); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(treatment)); - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; - class ACE_ArmRight { - displayName = ECSTRING(interaction,ArmRight); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(treatment)); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(treatment)); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment)); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment)); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(treatment)); - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; - class ACE_LegLeft { - displayName = ECSTRING(interaction,LegLeft); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(treatment)); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(treatment)); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; - class ACE_LegRight { - displayName = ECSTRING(interaction,LegRight); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(treatment)); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(treatment)); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment)); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; -}; diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp deleted file mode 100644 index 2056b042cce..00000000000 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ /dev/null @@ -1,1346 +0,0 @@ - -class ACE_Medical_Actions { - class Basic { - class Bandage { - displayName = CSTRING(Bandage); - displayNameProgress = CSTRING(Bandaging); - category = "bandage"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"All"}; - allowSelfTreatment = 1; - requiredMedic = 0; - treatmentTime = 5; - treatmentTimeSelfCoef = 1; - items[] = {{"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}}; - condition = ""; - patientStateCondition = 0; - itemConsumed = 1; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_bandage)); - callbackFailure = ""; - callbackProgress = ""; - - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"}; - animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - litter[] = { - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class Morphine: Bandage { - displayName = CSTRING(Inject_Morphine); - displayNameProgress = CSTRING(Injecting_Morphine); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 1; - category = "medication"; - treatmentTime = 2; - items[] = {"ACE_morphine"}; - callbackSuccess = QUOTE(DFUNC(treatmentBasic_morphine)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; - }; - class Epinephrine: Bandage { - displayName = CSTRING(Inject_Epinephrine); - displayNameProgress = CSTRING(Injecting_Epinephrine); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 1; - category = "medication"; - requiredMedic = QGVAR(medicSetting_basicEpi); - treatmentTime = 3; - items[] = {"ACE_epinephrine"}; - callbackSuccess = QUOTE(DFUNC(treatmentBasic_epipen)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; - treatmentLocations[] = {QGVAR(useLocation_basicEpi)}; - }; - class BloodIV: Bandage { - displayName = CSTRING(Transfuse_Blood); - displayNameProgress = CSTRING(Transfusing_Blood); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 0; - category = "advanced"; - requiredMedic = 1; - treatmentTime = 7; - items[] = {"ACE_bloodIV"}; - // callbackSuccess = QUOTE(DFUNC(treatmentBasic_bloodbag)); - callbackSuccess = QUOTE(DFUNC(treatmentIV)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = {}; - }; - class BloodIV_500: BloodIV { - category = "advanced"; - items[] = {"ACE_bloodIV_500"}; - }; - class BloodIV_250: BloodIV { - category = "advanced"; - items[] = {"ACE_bloodIV_250"}; - }; - class BodyBag: Bandage { - displayName = CSTRING(PlaceInBodyBag); - displayNameProgress = CSTRING(PlacingInBodyBag); - category = "advanced"; - treatmentLocations[] = {"All"}; - requiredMedic = 0; - treatmentTime = 4; - items[] = {"ACE_bodyBag"}; - condition = "!alive (_this select 1);"; - callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationPatientUnconscious = ""; - itemConsumed = 1; - litter[] = {}; - }; - class Diagnose: Bandage { - displayName = CSTRING(Actions_Diagnose); - displayNameProgress = CSTRING(Actions_Diagnosing); - category = "examine"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"head", "body"}; - requiredMedic = 0; - treatmentTime = 1; - items[] = {}; - callbackSuccess = QUOTE(DFUNC(actionDiagnose)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationCaller = ""; // TODO - itemConsumed = 0; - litter[] = {}; - }; - class CPR: Bandage { - displayName = CSTRING(Actions_CPR); - displayNameProgress = CSTRING(Actions_PerformingCPR); - category = "advanced"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"body"}; - allowSelfTreatment = 0; - requiredMedic = 0; - treatmentTime = 15; - items[] = {}; - condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && GVAR(enableRevive)>0); - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); - callbackFailure = ""; - callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)"; - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - animationCallerSelf = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; - litter[] = {}; - }; - }; - - class Advanced { - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - displayNameProgress = CSTRING(Bandaging); - category = "bandage"; - // Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All. - treatmentLocations[] = {"All"}; - allowedSelections[] = {"All"}; - allowSelfTreatment = 1; - // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor - requiredMedic = 0; - // The time it takes for a treatment action to complete. Time is in seconds. - treatmentTime = 8; - // Item required for the action. Leave empty for no item required. - items[] = {"ACE_fieldDressing"}; - condition = ""; - patientStateCondition = 0; - // Callbacks - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_bandage)); - callbackFailure = ""; - callbackProgress = ""; - itemConsumed = 1; - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"}; - animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - litter[] = { - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - items[] = {"ACE_packingBandage"}; - litter[] = { - {"All", "", {"ACE_MedicalLitter_packingBandage"}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - items[] = {"ACE_elasticBandage"}; - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - items[] = {"ACE_quikclot"}; - litter[] = { - {"All", "", {"ACE_MedicalLitter_QuickClot"}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Apply_Tourniquet); - displayNameProgress = CSTRING(Applying_Tourniquet); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - items[] = {"ACE_tourniquet"}; - treatmentTime = 4; - callbackSuccess = QUOTE(DFUNC(treatmentTourniquet)); - condition = QUOTE(!([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo))); - litter[] = {}; - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - displayNameProgress = CSTRING(Injecting_Morphine); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - category = "medication"; - items[] = {"ACE_morphine"}; - treatmentTime = 3; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_medication)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - displayNameProgress = CSTRING(Injecting_Adenosine); - items[] = {"ACE_adenosine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_adenosine"}} }; - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - displayNameProgress = CSTRING(Injecting_Atropine); - items[] = {"ACE_atropine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_atropine"}} }; - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - displayNameProgress = CSTRING(Injecting_Epinephrine); - items[] = {"ACE_epinephrine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - displayNameProgress = CSTRING(Transfusing_Blood); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 0; - category = "advanced"; - items[] = {"ACE_bloodIV"}; - requiredMedic = 1; - treatmentTime = 7; - callbackSuccess = QUOTE(DFUNC(treatmentIV)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = {}; - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - items[] = {"ACE_bloodIV_500"}; - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - items[] = {"ACE_bloodIV_250"}; - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - displayNameProgress = CSTRING(Transfusing_Plasma); - items[] = {"ACE_plasmaIV"}; - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - items[] = {"ACE_plasmaIV_500"}; - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - items[] = {"ACE_plasmaIV_250"}; - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - displayNameProgress = CSTRING(Transfusing_Saline); - items[] = {"ACE_salineIV"}; - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - items[] = {"ACE_salineIV_500"}; - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - items[] = {"ACE_salineIV_250"}; - }; - class SurgicalKit: fieldDressing { - displayName = CSTRING(Use_SurgicalKit); - displayNameProgress = CSTRING(Stitching); - category = "advanced"; - items[] = {"ACE_surgicalKit"}; - treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; - allowSelfTreatment = 0; - requiredMedic = QGVAR(medicSetting_SurgicalKit); - patientStateCondition = QGVAR(useCondition_SurgicalKit); - treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; - callbackSuccess = ""; - callbackProgress = QUOTE(DFUNC(treatmentAdvanced_surgicalKit_onProgress)); - itemConsumed = QGVAR(consumeItem_SurgicalKit); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"} }}; - }; - class PersonalAidKit: fieldDressing { - displayName = CSTRING(Use_Aid_Kit); - displayNameProgress = CSTRING(TreatmentAction); - category = "advanced"; - items[] = {"ACE_personalAidKit"}; - treatmentLocations[] = {QGVAR(useLocation_PAK)}; - allowSelfTreatment = 0; - requiredMedic = QGVAR(medicSetting_PAK); - patientStateCondition = QGVAR(useCondition_PAK); - treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_fullHeal)); - itemConsumed = QGVAR(consumeItem_PAK); - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"}; - animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - displayNameProgress = CSTRING(Check_Pulse_Content); - category = "examine"; - treatmentLocations[] = {"All"}; - requiredMedic = 0; - treatmentTime = 2; - items[] = {}; - callbackSuccess = QUOTE(DFUNC(actionCheckPulse)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationCaller = ""; // TODO - animationCallerProne = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; - litter[] = {}; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - callbackSuccess = QUOTE(DFUNC(actionCheckBloodPressure)); - displayNameProgress = CSTRING(Check_Bloodpressure_Content); - }; - class CheckResponse: CheckPulse { - displayName = CSTRING(Check_Response); - callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); - displayNameProgress = CSTRING(Check_Response_Content); - allowSelfTreatment = 0; - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - items[] = {}; - treatmentTime = 2.5; - callbackSuccess = QUOTE(DFUNC(actionRemoveTourniquet)); - condition = QUOTE([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo)); - displayNameProgress = CSTRING(RemovingTourniquet); - litter[] = {}; - }; - class CPR: fieldDressing { - displayName = CSTRING(Actions_CPR); - displayNameProgress = CSTRING(Actions_PerformingCPR); - category = "advanced"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"body"}; - allowSelfTreatment = 0; - requiredMedic = 0; - treatmentTime = 15; - items[] = {}; - condition = "!([(_this select 1)] call ace_common_fnc_isAwake)"; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); - callbackFailure = ""; - callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)"; - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - animationCallerSelf = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; - litter[] = {}; - }; - class BodyBag: fieldDressing { - displayName = CSTRING(PlaceInBodyBag); - displayNameProgress = CSTRING(PlacingInBodyBag); - category = "advanced"; - treatmentLocations[] = {"All"}; - allowSelfTreatment = 0; - requiredMedic = 0; - treatmentTime = 15; - items[] = {"ACE_bodyBag"}; - condition = "!alive (_this select 1);"; - callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationPatientUnconscious = ""; - itemConsumed = 1; - litter[] = {}; - }; - }; -}; - -class ACE_Medical_Advanced { - // Defines all the possible injury types for advanced medical - class Injuries { - // All the possible wounds - class wounds { - - // Source: Scarle - // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). - class Abrasion { - name = CSTRING(Wounds_Abrasion); - selections[] = {"All"}; - bleedingRate = 0.0001; - pain = 0.01; - causes[] = {"falling", "ropeburn", "vehiclecrash", "unknown"}; - minDamage = 0.01; - class Minor { - name = CSTRING(Wounds_Abrasion_Minor); - minDamage = 0.01; - maxDamage = 0.2; - bleedingRate = 0.0001; - }; - class Medium { - name = CSTRING(Wounds_Abrasion_Medium); - minDamage = 0.2; - maxDamage = 0.3; - bleedingRate = 0.00015; - }; - class Large { - name = CSTRING(Wounds_Abrasion_Large); - minDamage = 0.3; - maxDamage = 0.5; - bleedingRate = 0.0002; - }; - }; - // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. - class Avulsions { - name = CSTRING(Wounds_Avulsion); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.3; - causes[] = {"explosive", "vehiclecrash", "grenade", "shell", "bullet", "backblast", "bite"}; - minDamage = 0.2; - class Minor { - name = CSTRING(Wounds_Avulsion_Minor); - minDamage = 0.2; - maxDamage = 0.3; - bleedingRate = 0.01; - }; - class Medium { - name = CSTRING(Wounds_Avulsion_Medium); - minDamage = 0.3; - maxDamage = 0.6; - bleedingRate = 0.02; - }; - class Large { - name = CSTRING(Wounds_Avulsion_Large); - minDamage = 0.5; - bleedingRate = 0.05; - }; - }; - // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. - class Contusion { - name = CSTRING(Wounds_Contusion); - selections[] = {"All"}; - bleedingRate = 0.0; - pain = 0.05; - causes[] = {"bullet", "backblast", "punch", "vehiclecrash", "falling"}; - minDamage = 0.01; - maxDamage = 0.1; - class Minor { - name = CSTRING(Wounds_Contusion_Minor); - minDamage = 0.01; - maxDamage = 0.1; - }; - class Medium { - name = CSTRING(Wounds_Contusion_Medium); - minDamage = 0.1; - maxDamage = 0.15; - }; - class Large { - name = CSTRING(Wounds_Contusion_Large); - minDamage = 0.15; - maxDamage = 0.2; - }; - }; - // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. - class CrushWound { - name = CSTRING(Wounds_Crush); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.1; - causes[] = {"falling", "vehiclecrash", "punch", "unknown"}; - minDamage = 0.1; - class Minor { - name = CSTRING(Wounds_Crush_Minor); - minDamage = 0.1; - maxDamage = 0.45; - bleedingRate = 0.005; - }; - class Medium { - name = CSTRING(Wounds_Crush_Medium); - minDamage = 0.4; - maxDamage = 0.7; - bleedingRate = 0.007; - }; - class Large { - name = CSTRING(Wounds_Crush_Large); - minDamage = 0.6; - bleedingRate = 0.0095; - }; - }; - // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. - class Cut { - name = CSTRING(Wounds_Cut); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.075; - causes[] = {"vehiclecrash", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; - minDamage = 0.1; - class Minor { - name = CSTRING(Wounds_Cut_Minor); - minDamage = 0.1; - maxDamage = 0.3; - bleedingRate = 0.005; - }; - class Medium { - name = CSTRING(Wounds_Cut_Medium); - minDamage = 0.3; - maxDamage = 0.65; - bleedingRate = 0.02; - }; - class Large { - name = CSTRING(Wounds_Cut_Large); - minDamage = 0.65; - bleedingRate = 0.05; - }; - }; - // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. - class Laceration { - name = CSTRING(Wounds_Laceration); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.075; - causes[] = {"vehiclecrash", "punch"}; - minDamage = 0.01; - class Minor { - name = CSTRING(Wounds_Laceration_Minor); - minDamage = 0.1; - maxDamage = 0.5; - bleedingRate = 0.005; - }; - class Medium { - name = CSTRING(Wounds_Laceration_Medium); - minDamage = 0.5; - maxDamage = 0.7; - bleedingRate = 0.01; - }; - class Large { - name = CSTRING(Wounds_Laceration_Large); - minDamage = 0.7; - bleedingRate = 0.03; - }; - }; - // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. - class velocityWound { - name = CSTRING(Wounds_VelocityWound); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.2; - causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; - minDamage = 0.15; - class Minor { - name = CSTRING(Wounds_VelocityWound_Minor); - minDamage = 0.15; - maxDamage = 0.3; - bleedingRate = 0.025; - }; - class Medium { - name = CSTRING(Wounds_VelocityWound_Medium); - minDamage = 0.3; - maxDamage = 0.75; - bleedingRate = 0.05; - }; - class Large { - name = CSTRING(Wounds_VelocityWound_Large); - minDamage = 0.75; - bleedingRate = 0.1; - }; - }; - // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. - class punctureWound { - name = CSTRING(Wounds_PunctureWound); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.075; - causes[] = {"stab", "grenade"}; - minDamage = 0.01; - class Minor { - name = CSTRING(Wounds_PunctureWound_Minor); - minDamage = 0.01; - maxDamage = 0.5; - bleedingRate = 0.01; - }; - class Medium { - name = CSTRING(Wounds_PunctureWound_Medium); - minDamage = 0.5; - maxDamage = 0.75; - bleedingRate = 0.03; - }; - class Large { - name = CSTRING(Wounds_PunctureWound_Large); - minDamage = 0.65; - bleedingRate = 0.08; - }; - }; - }; - class fractures { - class Femur { - name = CSTRING(Wounds_Femur); - selections[] = {"Head", "Torso"}; - pain = 0.2; - causes[] = {"Bullet", "VehicleCrash", "Backblast", "Explosive", "Shell", "Grenade"}; - minDamage = 0.5; - }; - }; - class damageTypes { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - lethalDamage = 0.01; - - class bullet { - // above damage, amount. Put the highest threshold to the left and lower the threshold with the elements to the right of it. - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class grenade { - thresholds[] = {{0.1, 3}, {0, 1}}; - selectionSpecific = 0; - }; - class explosive { - thresholds[] = {{1, 6}, {0.1, 4}, {0, 1}}; - selectionSpecific = 0; - }; - class shell { - thresholds[] = {{1, 7}, {0.1, 5}, {0, 1}}; - selectionSpecific = 0; - }; - class vehiclecrash { - thresholds[] = {{0.25, 5}, {0.05, 1}}; - selectionSpecific = 0; - lethalDamage = 0.2; - }; - class backblast { - thresholds[] = {{1, 6}, {0.55, 5}, {0, 2}}; - selectionSpecific = 0; - lethalDamage = 1; - }; - class stab { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class punch { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class falling { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - lethalDamage = 0.4; - }; - class ropeburn { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class unknown { - thresholds[] = {{0.1, 1}}; - }; - }; - }; - class Treatment { - class Bandaging { - // Field dressing is normal average treatment - // packing bandage is average treatment, higher reopen change, longer reopening delay - // elastic bandage is higher treatment, higher reopen change, shorter reopen delay - // quickclot is lower treatment, lower reopen change, longer reopening delay - class Bandage { // basic bandage - effectiveness = 5; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - - class FieldDressing { - // How effect is the bandage for treating one wounds type injury - effectiveness = 1; - // What is the chance and delays (in seconds) of the treated default injury reopening - reopeningChance = 0.1; - reopeningMinDelay = 120; - reopeningMaxDelay = 200; - - class Abrasion { - effectiveness = 3; - reopeningChance = 0.3; - reopeningMinDelay = 200; - reopeningMaxDelay = 1000; - }; - class AbrasionMinor: Abrasion { - effectiveness = 3; - }; - class AbrasionMedium: Abrasion { - effectiveness = 2.5; - reopeningChance = 0.7; - }; - class AbrasionLarge: Abrasion { - effectiveness = 2; - reopeningChance = 0.9; - }; - - class Avulsions: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 120; - reopeningMaxDelay = 200; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 1; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 0.9; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 0.75; - }; - - class Contusion: Abrasion { - effectiveness = 1; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.2; - reopeningMinDelay = 20; - reopeningMaxDelay = 1000; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 1; - reopeningChance = 0.2; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 0.7; - reopeningChance = 0.3; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 0.6; - reopeningChance = 0.4; - }; - - class Cut: Abrasion { - effectiveness = 4; - reopeningChance = 0.1; - reopeningMinDelay = 300; - reopeningMaxDelay = 1000; - }; - class CutMinor: Cut { - effectiveness = 4; - reopeningChance = 0.1; - }; - class CutMedium: Cut { - effectiveness = 3; - reopeningChance = 0.3; - }; - class CutLarge: Cut { - effectiveness = 1; - reopeningChance = 0.5; - }; - - class Laceration: Abrasion { - effectiveness = 0.95; - reopeningChance = 0.3; - reopeningMinDelay = 100; - reopeningMaxDelay = 800; - }; - class LacerationMinor: Laceration { - effectiveness = 0.95; - reopeningChance = 0.3; - }; - class LacerationMedium: Laceration { - effectiveness = 0.7; - reopeningChance = 0.5; - }; - class LacerationLarge: Laceration { - effectiveness = 0.5; - reopeningChance = 0.6; - }; - - class velocityWound: Abrasion { - effectiveness = 2; - reopeningChance = 0.7; - reopeningMinDelay = 100; - reopeningMaxDelay = 500; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 2; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 1.5; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 1; - }; - - class punctureWound: Abrasion { - effectiveness = 2; - reopeningChance = 0.5; - reopeningMinDelay = 200; - reopeningMaxDelay = 850; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 2; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 1.3; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 0.9; - }; - }; - - class PackingBandage: fieldDressing { - class Abrasion { - effectiveness = 3; - reopeningChance = 0.6; - reopeningMinDelay = 800; - reopeningMaxDelay = 1500; - }; - class AbrasionMinor: Abrasion { - effectiveness = 3; - }; - class AbrasionMedium: Abrasion { - effectiveness = 2.5; - reopeningChance = 0.9; - }; - class AbrasionLarge: Abrasion { - effectiveness = 2; - reopeningChance = 1; - }; - - class Avulsions: Abrasion { - effectiveness = 1; - reopeningChance = 0.7; - reopeningMinDelay = 1000; - reopeningMaxDelay = 1600; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 1; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 0.9; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 0.75; - }; - - class Contusion: Abrasion { - effectiveness = 1; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 600; - reopeningMaxDelay = 1000; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 1; - reopeningChance = 0.6; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 0.7; - reopeningChance = 0.7; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 0.6; - reopeningChance = 0.8; - }; - - class Cut: Abrasion { - effectiveness = 4; - reopeningChance = 0.4; - reopeningMinDelay = 700; - reopeningMaxDelay = 1000; - }; - class CutMinor: Cut { - effectiveness = 4; - reopeningChance = 0.6; - }; - class CutMedium: Cut { - effectiveness = 3; - reopeningChance = 0.7; - }; - class CutLarge: Cut { - effectiveness = 1; - reopeningChance = 0.8; - }; - - class Laceration: Abrasion { - effectiveness = 0.95; - reopeningChance = 0.65; - reopeningMinDelay = 500; - reopeningMaxDelay = 2000; - }; - class LacerationMinor: Laceration { - effectiveness = 0.95; - reopeningChance = 0.65; - }; - class LacerationMedium: Laceration { - effectiveness = 0.7; - reopeningChance = 0.8; - }; - class LacerationLarge: Laceration { - effectiveness = 0.5; - reopeningChance = 0.9; - }; - - class velocityWound: Abrasion { - effectiveness = 2; - reopeningChance = 1; - reopeningMinDelay = 800; - reopeningMaxDelay = 2000; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 2; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 1.5; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 1; - }; - - class punctureWound: Abrasion { - effectiveness = 2; - reopeningChance = 1; - reopeningMinDelay = 1000; - reopeningMaxDelay = 3000; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 2; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 1.3; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 0.9; - }; - }; - - class ElasticBandage: fieldDressing { - class Abrasion { - effectiveness = 4; - reopeningChance = 0.6; - reopeningMinDelay = 80; - reopeningMaxDelay = 150; - }; - class AbrasionMinor: Abrasion { - effectiveness = 4; - }; - class AbrasionMedium: Abrasion { - effectiveness = 3; - reopeningChance = 0.9; - }; - class AbrasionLarge: Abrasion { - effectiveness = 2.5; - reopeningChance = 1; - }; - - class Avulsions: Abrasion { - effectiveness = 2; - reopeningChance = 0.7; - reopeningMinDelay = 100; - reopeningMaxDelay = 160; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 2; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 1.4; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 1; - }; - - class Contusion: Abrasion { - effectiveness = 2; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 2; - reopeningChance = 0.5; - reopeningMinDelay = 60; - reopeningMaxDelay = 100; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 2; - reopeningChance = 0.6; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 1.7; - reopeningChance = 0.7; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 1.6; - reopeningChance = 0.8; - }; - - class Cut: Abrasion { - effectiveness = 5; - reopeningChance = 0.4; - reopeningMinDelay = 70; - reopeningMaxDelay = 100; - }; - class CutMinor: Cut { - effectiveness = 5; - reopeningChance = 0.6; - }; - class CutMedium: Cut { - effectiveness = 3.5; - reopeningChance = 0.7; - }; - class CutLarge: Cut { - effectiveness = 2; - reopeningChance = 0.8; - }; - - class Laceration: Abrasion { - effectiveness = 2; - reopeningChance = 0.65; - reopeningMinDelay = 50; - reopeningMaxDelay = 200; - }; - class LacerationMinor: Laceration { - effectiveness = 2; - reopeningChance = 0.65; - }; - class LacerationMedium: Laceration { - effectiveness = 1.5; - reopeningChance = 0.8; - }; - class LacerationLarge: Laceration { - effectiveness = 1; - reopeningChance = 0.9; - }; - - class velocityWound: Abrasion { - effectiveness = 2.2; - reopeningChance = 1; - reopeningMinDelay = 80; - reopeningMaxDelay = 200; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 2.2; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 1.75; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 1.5; - }; - - class punctureWound: Abrasion { - effectiveness = 2.5; - reopeningChance = 1; - reopeningMinDelay = 100; - reopeningMaxDelay = 300; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 2.5; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 2; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 1.5; - }; - }; - - class QuikClot: fieldDressing { - class Abrasion { - effectiveness = 2; - reopeningChance = 0.3; - reopeningMinDelay = 800; - reopeningMaxDelay = 1500; - }; - class AbrasionMinor: Abrasion { - effectiveness = 2; - }; - class AbrasionMedium: Abrasion { - effectiveness = 1; - reopeningChance = 0.4; - }; - class AbrasionLarge: Abrasion { - effectiveness = 0.7; - reopeningChance = 0.5; - }; - - class Avulsions: Abrasion { - effectiveness = 0.7; - reopeningChance = 0.2; - reopeningMinDelay = 1000; - reopeningMaxDelay = 1600; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 0.7; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 0.65; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 0.5; - }; - - class Contusion: Abrasion { - effectiveness = 1; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 0.6; - reopeningChance = 0.5; - reopeningMinDelay = 600; - reopeningMaxDelay = 1000; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 0.6; - reopeningChance = 0.3; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 0.5; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 0.4; - }; - - class Cut: Abrasion { - effectiveness = 2; - reopeningChance = 0.2; - reopeningMinDelay = 700; - reopeningMaxDelay = 1000; - }; - class CutMinor: Cut { - effectiveness = 2; - reopeningChance = 0.3; - }; - class CutMedium: Cut { - effectiveness = 1; - }; - class CutLarge: Cut { - effectiveness = 0.6; - }; - - class Laceration: Abrasion { - effectiveness = 0.7; - reopeningChance = 0.4; - reopeningMinDelay = 500; - reopeningMaxDelay = 2000; - }; - class LacerationMinor: Laceration { - effectiveness = 0.7; - reopeningChance = 0.4; - }; - class LacerationMedium: Laceration { - effectiveness = 0.7; - }; - class LacerationLarge: Laceration { - effectiveness = 0.5; - }; - - class velocityWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 800; - reopeningMaxDelay = 2000; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 1; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 0.75; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 0.5; - }; - - class punctureWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 1000; - reopeningMaxDelay = 3000; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 1; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 0.7; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 0.4; - }; - }; - }; - - class Medication { - // How much does the pain get reduced? - painReduce = 0; - // How much will the heart rate be increased when the HR is low (below 55)? {minIncrease, maxIncrease, seconds} - hrIncreaseLow[] = {0, 0, 0}; - hrIncreaseNormal[] = {0, 0, 0}; - hrIncreaseHigh[] = {0, 0, 0}; - // Callback once the heart rate values have been added. - hrCallback = ""; - - // How long until this medication has disappeared - timeInSystem = 120; - // How many of this type of medication can be in the system before the patient overdoses? - maxDose = 4; - // Function to execute upon overdose. Arguments passed to call back are 0: unit , 1: medicationClassName - onOverDose = ""; - // The viscosity of a fluid is a measure of its resistance to gradual deformation by shear stress or tensile stress. For liquids, it corresponds to the informal concept of "thickness". This value will increase/decrease the viscoty of the blood with the percentage given. Where 100 = max. Using the minus will decrease viscosity - viscosityChange = 0; - - // specific details for the ACE_Morphine treatment action - class Morphine { - painReduce = 15; - hrIncreaseLow[] = {-10, -20, 35}; - hrIncreaseNormal[] = {-10, -30, 35}; - hrIncreaseHigh[] = {-10, -35, 50}; - timeInSystem = 900; - maxDose = 4; - inCompatableMedication[] = {}; - viscosityChange = -10; - }; - class Epinephrine { - painReduce = 0; - hrIncreaseLow[] = {10, 20, 15}; - hrIncreaseNormal[] = {10, 50, 10}; - hrIncreaseHigh[] = {10, 40, 5}; - timeInSystem = 120; - maxDose = 10; - inCompatableMedication[] = {}; - }; - class Adenosine { - painReduce = 0; - hrIncreaseLow[] = {-7, -10, 15}; - hrIncreaseNormal[] = {-15, -30, 20}; - hrIncreaseHigh[] = {-15, -35, 10}; - timeInSystem = 120; - maxDose = 6; - inCompatableMedication[] = {}; - }; - class Atropine { - painReduce = 0; - hrIncreaseLow[] = {-2, -5, 15}; - hrIncreaseNormal[] = {-10, -15, 20}; - hrIncreaseHigh[] = {-5, -20, 10}; - timeInSystem = 120; - maxDose = 6; - inCompatableMedication[] = {}; - }; - class PainKillers { - painReduce = 0.7; - timeInSystem = 120; - maxDose = 10; - inCompatableMedication[] = {}; - viscosityChange = 5; - }; - }; - class IV { - // volume is in millileters - volume = 1000; - ratio[] = {}; - type = "Blood"; - class BloodIV { - volume = 1000; - ratio[] = {"Plasma", 1}; - }; - class BloodIV_500: BloodIV { - volume = 500; - }; - class BloodIV_250: BloodIV { - volume = 250; - }; - class PlasmaIV: BloodIV { - volume = 1000; - ratio[] = {"Blood", 1}; - type = "Plasma"; - }; - class PlasmaIV_500: PlasmaIV { - volume = 500; - }; - class PlasmaIV_250: PlasmaIV { - volume = 250; - }; - class SalineIV: BloodIV { - volume = 1000; - type = "Saline"; - ratio[] = {}; - }; - class SalineIV_500: SalineIV { - volume = 500; - }; - class SalineIV_250: SalineIV { - volume = 250; - }; - }; - }; -}; diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index ee393c37e72..eb84ee7f109 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -1,313 +1,24 @@ class ACE_Settings { - class GVAR(level) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_level_DisplayName); - description = CSTRING(MedicalSettings_level_Description); - value = 1; - typeName = "SCALAR"; - values[] = {"Disabled", "Basic", "Advanced"}; - }; - class GVAR(medicSetting) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_medicSetting_DisplayName); - description = CSTRING(MedicalSettings_medicSetting_Description); - value = 1; - typeName = "SCALAR"; - values[] = {"Disabled", "Normal", "Advanced"}; - }; - class GVAR(increaseTrainingInLocations) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_increaseTrainingInLocations_DisplayName); - description = CSTRING(MedicalSettings_increaseTrainingInLocations_Description); - value = 0; - typeName = "BOOL"; - }; + /* @todo class GVAR(enableFor) { category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableFor_Description); - value = 0; - typeName = "SCALAR"; - values[] = {"Players only", "Players and AI"}; - }; - class GVAR(enableOverdosing) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_enableOverdosing_DisplayName); - description = CSTRING(MedicalSettings_enableOverdosing_Description); - typeName = "BOOL"; + displayName = CSTRING(MedicalSettings_enableFor_DisplayName); + description = CSTRING(MedicalSettings_enableFor_Description); value = 1; - }; - class GVAR(bleedingCoefficient) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_bleedingCoefficient_DisplayName); - description = CSTRING(MedicalSettings_bleedingCoefficient_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(painCoefficient) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_painCoefficient_DisplayName); - description = CSTRING(MedicalSettings_painCoefficient_Description); typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(enableAdvancedWounds) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_Description); - typeName = "BOOL"; - value = 0; + values[] = {"Players only", "Players and AI"}; }; + */ + /* @todo class GVAR(enableVehicleCrashes) { category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(enableScreams) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_enableScreams_DisplayName); - description = CSTRING(MedicalSettings_enableScreams_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(playerDamageThreshold) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_playerDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_playerDamageThreshold_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(AIDamageThreshold) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_AIDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_AIDamageThreshold_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(enableUnconsciousnessAI) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_enableUnconsciousnessAI_DisplayName); - description = CSTRING(MedicalSettings_enableUnconsciousnessAI_Description); - value = 1; - typeName = "SCALAR"; - values[] = {"Disabled", "50/50", "Enabled"}; - }; - class GVAR(remoteControlledAI) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_remoteControlledAI_DisplayName); - description = CSTRING(MedicalSettings_remoteControlledAI_Description); + displayName = CSTRING(MedicalSettings_enableVehicleCrashes_DisplayName); + description = CSTRING(MedicalSettings_enableVehicleCrashes_Description); typeName = "BOOL"; value = 1; }; - class GVAR(preventInstaDeath) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_preventInstaDeath_DisplayName); - description = CSTRING(MedicalSettings_preventInstaDeath_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(enableRevive) { - category = CSTRING(Category_Medical); - displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); - description = CSTRING(ReviveSettings_enableRevive_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"Disabled", "Players only", "Players and AI"}; - }; - class GVAR(maxReviveTime) { - category = CSTRING(Category_Medical); - displayName = CSTRING(ReviveSettings_maxReviveTime_DisplayName); - description = CSTRING(ReviveSettings_maxReviveTime_Description); - typeName = "SCALAR"; - value = 120; - sliderSettings[] = {0, 3600, 120, 0}; - }; - class GVAR(amountOfReviveLives) { - category = CSTRING(Category_Medical); - displayName = CSTRING(ReviveSettings_amountOfReviveLives_DisplayName); - description = CSTRING(ReviveSettings_amountOfReviveLives_Description); - typeName = "SCALAR"; - value = -1; - sliderSettings[] = {-1, 25, -1, -1}; - }; - - /* - class GVAR(allowDeadBodyMovement) { - category = CSTRING(Category_Medical); - typeName = "BOOL"; - value = 0; - }; */ - - class GVAR(allowLitterCreation) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_allowLitterCreation_DisplayName); - description = CSTRING(MedicalSettings_allowLitterCreation_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(litterSimulationDetail) { - category = CSTRING(Category_Medical); - displayName = CSTRING(litterSimulationDetail); - description = CSTRING(litterSimulationDetail_Desc); - typeName = "SCALAR"; - - value = 3; - values[] = {"Off", "Low", "Medium", "High", "Ultra"}; - _values[] = { 0, 50, 100, 1000, 5000 }; - }; - class GVAR(litterCleanUpDelay) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_litterCleanUpDelay_DisplayName); - description = CSTRING(MedicalSettings_litterCleanUpDelay_Description); - typeName = "SCALAR"; - value = 0; - sliderSettings[] = {-1, 3600, 0, 0}; - }; - class GVAR(medicSetting_basicEpi) { - category = CSTRING(Category_Medical); - displayName = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_Description); - typeName = "SCALAR"; - value = 1; - values[] = {"Anyone", "Medics only", "Doctors only"}; - }; - class GVAR(medicSetting_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_Description); - typeName = "SCALAR"; - value = 1; - values[] = {"Anyone", "Medics only", "Doctors only"}; - }; - class GVAR(medicSetting_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_Description); - typeName = "SCALAR"; - value = 1; - values[] = {"Anyone", "Medics only", "Doctors only"}; - }; - class GVAR(consumeItem_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"No", "Yes"}; - }; - class GVAR(consumeItem_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"No", "Yes"}; - }; - class GVAR(useLocation_basicEpi) { - category = CSTRING(Category_Medical); - displayName = CSTRING(BasicMedicalSettings_useLocation_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_useLocation_basicEpi_Description); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(AdvancedMedicalSettings_anywhere), CSTRING(AdvancedMedicalSettings_vehicle), CSTRING(AdvancedMedicalSettings_facility), CSTRING(AdvancedMedicalSettings_vehicleAndFacility), ECSTRING(common,Disabled)}; - }; - class GVAR(useLocation_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); - typeName = "SCALAR"; - value = 3; - values[] = {CSTRING(AdvancedMedicalSettings_anywhere), CSTRING(AdvancedMedicalSettings_vehicle), CSTRING(AdvancedMedicalSettings_facility), CSTRING(AdvancedMedicalSettings_vehicleAndFacility), ECSTRING(common,Disabled)}; - }; - class GVAR(useLocation_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); - typeName = "SCALAR"; - value = 2; - values[] = {CSTRING(AdvancedMedicalSettings_anywhere), CSTRING(AdvancedMedicalSettings_vehicle), CSTRING(AdvancedMedicalSettings_facility), CSTRING(AdvancedMedicalSettings_vehicleAndFacility), ECSTRING(common,Disabled)}; - }; - class GVAR(useCondition_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"Anytime", "Stable"}; - }; - class GVAR(useCondition_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"Anytime", "Stable"}; - }; - class GVAR(keepLocalSettingsSynced) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_keepLocalSettingsSynced_DisplayName); - description = CSTRING(MedicalSettings_keepLocalSettingsSynced_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(healHitPointAfterAdvBandage) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); - description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(painIsOnlySuppressed) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); - description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(painEffectType) { - category = CSTRING(Category_Medical); - displayName = CSTRING(painEffectType); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(painEffect_Flash), CSTRING(painEffect_Chroma)}; - isClientSettable = 1; - }; - class GVAR(allowUnconsciousAnimationOnTreatment) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_allowUnconsciousAnimationOnTreatment_DisplayName); - description = CSTRING(MedicalSettings_allowUnconsciousAnimationOnTreatment_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(moveUnitsFromGroupOnUnconscious) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_moveUnitsFromGroupOnUnconscious_DisplayName); - description = CSTRING(MedicalSettings_moveUnitsFromGroupOnUnconscious_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(menuTypeStyle) { - category = CSTRING(Category_Medical); - displayName = CSTRING(menuTypeDisplay); - description = CSTRING(menuTypeDescription); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(useSelection), CSTRING(useRadial), "Disabled"}; - isClientSettable = 1; - }; - class GVAR(delayUnconCaptive) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_delayUnconCaptive_DisplayName); - description = CSTRING(MedicalSettings_delayUnconCaptive_Description); - typeName = "SCALAR"; - value = 3; - sliderSettings[] = {0, 30, 3, 0}; + class GVAR(spontaneousWakeUpChance) { + movedToSQF = 1; }; }; diff --git a/addons/medical/CfgActions.hpp b/addons/medical/CfgActions.hpp deleted file mode 100644 index 387c3b8de29..00000000000 --- a/addons/medical/CfgActions.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgActions { - class None; - class Heal: None { - show = 0; - }; -}; diff --git a/addons/medical/CfgEden.hpp b/addons/medical/CfgEden.hpp deleted file mode 100644 index bebfdb95496..00000000000 --- a/addons/medical/CfgEden.hpp +++ /dev/null @@ -1,69 +0,0 @@ -class ctrlToolbox; - -class Cfg3DEN { - class Attributes { - class Default; - class Title: Default { - class Controls { - class Title; - }; - }; - class GVAR(isMedicControl): Title { - attributeLoad = "(_this controlsGroupCtrl 100) lbSetCurSel (((_value + 1) min 3) max 0);"; - attributeSave = "(lbCurSel (_this controlsGroupCtrl 100)) - 1"; - class Controls: Controls { - class Title: Title{}; - class Value: ctrlToolbox { - idc = 100; - style = "0x02"; - x = "48 * (pixelW * pixelGrid * 0.50)"; - w = "82 * (pixelW * pixelGrid * 0.50)"; - h = "5 * (pixelH * pixelGrid * 0.50)"; - rows = 1; - columns = 4; - strings[] = {"$STR_3DEN_Attributes_Lock_Default_text", CSTRING(AssignMedicRoles_role_none), CSTRING(AssignMedicRoles_role_medic), CSTRING(AssignMedicRoles_role_doctorShort)}; - }; - }; - }; - }; - class Object { - class AttributeCategories { - class ace_attributes { - class Attributes { - class ace_isMedic { - property = QUOTE(ace_isMedic); - control = QGVAR(isMedicControl); - displayName = CSTRING(AssignMedicRoles_role_DisplayName); - tooltip = CSTRING(Attributes_isMedic_Description); - expression = QUOTE(if (_value > -1) then {_this setVariable [ARR_3(QUOTE(QGVAR(medicClass)),_value, true)];};); - typeName = "NUMBER"; - condition = "objectBrain"; - defaultValue = "-1"; - }; - class ace_isMedicalVehicle { - property = QUOTE(ace_isMedicalVehicle); - value = 0; - control = "CheckboxNumber"; - displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); - tooltip = CSTRING(Attributes_isMedicalVehicle_Description); - expression = QUOTE(_this setVariable [ARR_3(QUOTE(QGVAR(medicClass)),_value, true)];); - typeName = "NUMBER"; - condition = "objectVehicle"; - defaultValue = 0; - }; - class ace_isMedicalFacility { - property = QUOTE(ace_isMedicalFacility); - value = 0; - control = "Checkbox"; - displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); - tooltip = CSTRING(AssignMedicalFacility_enabled_Description); - expression = QUOTE(_this setVariable [ARR_3(QUOTE(QGVAR(isMedicalFacility)),_value, true)];); - typeName = "BOOL"; - condition = "(1 - objectBrain) * (1 - objectVehicle)"; - defaultValue = "false"; - }; - }; - }; - }; - }; -}; diff --git a/addons/medical/CfgEventHandlers.hpp b/addons/medical/CfgEventHandlers.hpp index becf3950523..0d3301d6e0a 100644 --- a/addons/medical/CfgEventHandlers.hpp +++ b/addons/medical/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); diff --git a/addons/medical/CfgFactionClasses.hpp b/addons/medical/CfgFactionClasses.hpp deleted file mode 100644 index 0ca922c8a6a..00000000000 --- a/addons/medical/CfgFactionClasses.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgFactionClasses { - class NO_CATEGORY; - class ADDON: NO_CATEGORY { - displayName = CSTRING(Category_DisplayName); - }; -}; diff --git a/addons/medical/CfgSounds.hpp b/addons/medical/CfgSounds.hpp deleted file mode 100644 index 9cc5faedf9c..00000000000 --- a/addons/medical/CfgSounds.hpp +++ /dev/null @@ -1,37 +0,0 @@ -class CfgSounds { - class ACE_heartbeat_fast_1 { - name = "ACE_heartbeat_fast_1"; - sound[] = {QPATHTOF(sounds\heart_beats\fast_1.wav), "db+1", 1}; - titles[] = {}; - }; - class ACE_heartbeat_fast_2 { - name = "ACE_heartbeat_fast_2"; - sound[] = {QPATHTOF(sounds\heart_beats\fast_2.wav), "db+1", 1}; - titles[] = {}; - }; - class ACE_heartbeat_fast_3 { - name = "ACE_heartbeat_fast_3"; - sound[] = {QPATHTOF(sounds\heart_beats\fast_3.wav), "db+1", 1}; - titles[] = {}; - }; - class ACE_heartbeat_norm_1 { - name = "ACE_heartbeat_norm_1"; - sound[] = {QPATHTOF(sounds\heart_beats\norm_1.wav), "db+1", 1}; - titles[] = {}; - }; - class ACE_heartbeat_norm_2 { - name = "ACE_heartbeat_norm_2"; - sound[] = {QPATHTOF(sounds\heart_beats\norm_2.wav), "db+1", 1}; - titles[] = {}; - }; - class ACE_heartbeat_slow_1 { - name = "ACE_heartbeat_slow_1"; - sound[] = {QPATHTOF(sounds\heart_beats\slow_1.wav), "db+1", 1}; - titles[] = {}; - }; - class ACE_heartbeat_slow_2 { - name = "ACE_heartbeat_slow_2"; - sound[] = {QPATHTOF(sounds\heart_beats\slow_2.wav), "db+1", 1}; - titles[] = {}; - }; -}; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 5db82ce1e53..60bac164237 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -1,956 +1,23 @@ - -#define MEDICAL_ACTION_DISTANCE 1.75 - -class CBA_Extended_EventHandlers; - class CfgVehicles { + // Backwards compatibility + // Left as dumb modules so that old missions don't error about missing vehicles class Logic; class Module_F: Logic { - class ArgumentsBaseUnits { - }; - }; - - class ACE_Module; - class ACE_moduleMedicalSettings: ACE_Module { - scope = 1; - displayName = CSTRING(MedicalSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QUOTE(DFUNC(moduleMedicalSettings)); - functionPriority = 1; - isGlobal = 1; - isSingular = 1; - isTriggerActivated = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class level { - displayName = CSTRING(MedicalSettings_level_DisplayName); - description = CSTRING(MedicalSettings_level_Description); - typeName = "NUMBER"; - class values { - class normal { - name = CSTRING(MedicalSettings_basic); - value = 1; - default = 1; - }; - class full { - name = CSTRING(MedicalSettings_advanced); - value = 2; - }; - }; - }; - class medicSetting { - displayName = CSTRING(MedicalSettings_medicSetting_DisplayName); - description = CSTRING(MedicalSettings_medicSetting_Description); - typeName = "NUMBER"; - class values { - class disable { - name = CSTRING(MedicalSettings_medicSetting_disable); - value = 0; - }; - class normal { - name = CSTRING(MedicalSettings_basic); - value = 1; - default = 1; - }; - class full { - name = CSTRING(MedicalSettings_advanced); - value = 2; - }; - }; - }; - class increaseTrainingInLocations { - displayName = CSTRING(MedicalSettings_increaseTrainingInLocations_DisplayName); - description = CSTRING(MedicalSettings_increaseTrainingInLocations_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class allowLitterCreation { - displayName = CSTRING(MedicalSettings_allowLitterCreation_DisplayName); - description = CSTRING(MedicalSettings_allowLitterCreation_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class litterCleanUpDelay { - displayName = CSTRING(MedicalSettings_litterCleanUpDelay_DisplayName); - description = CSTRING(MedicalSettings_litterCleanUpDelay_Description); - typeName = "NUMBER"; - defaultValue = 1800; - }; - class enableScreams { - displayName = CSTRING(MedicalSettings_enableScreams_DisplayName); - description = CSTRING(MedicalSettings_enableScreams_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class playerDamageThreshold { - displayName = CSTRING(MedicalSettings_playerDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_playerDamageThreshold_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class AIDamageThreshold { - displayName = CSTRING(MedicalSettings_AIDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_AIDamageThreshold_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class enableUnconsciousnessAI { - displayName = CSTRING(MedicalSettings_enableUnconsciousnessAI_DisplayName); - description = CSTRING(MedicalSettings_enableUnconsciousnessAI_Description); - typeName = "NUMBER"; - class values { - class disable { - name = ECSTRING(common,Disabled); - value = 0; - }; - class normal { - name = "50/50"; - value = 1; - default = 1; - }; - class full { - name = ECSTRING(common,Enabled); - value = 2; - }; - }; - }; - class remoteControlledAI { - displayName = CSTRING(MedicalSettings_remoteControlledAI_DisplayName); - description = CSTRING(MedicalSettings_remoteControlledAI_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class preventInstaDeath { - displayName = CSTRING(MedicalSettings_preventInstaDeath_DisplayName); - description = CSTRING(MedicalSettings_preventInstaDeath_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class bleedingCoefficient { - displayName = CSTRING(MedicalSettings_bleedingCoefficient_DisplayName); - description = CSTRING(MedicalSettings_bleedingCoefficient_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class painCoefficient { - displayName = CSTRING(MedicalSettings_painCoefficient_DisplayName); - description = CSTRING(MedicalSettings_painCoefficient_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class keepLocalSettingsSynced { - displayName = CSTRING(MedicalSettings_keepLocalSettingsSynced_DisplayName); - description = CSTRING(MedicalSettings_keepLocalSettingsSynced_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - }; - - class ModuleDescription { - description = CSTRING(MedicalSettings_Module_Description); - sync[] = {}; - }; - }; - class ACE_moduleBasicMedicalSettings: ACE_Module { - scope = 1; - displayName = CSTRING(BasicMedicalSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleBasicMedicalSettings); - functionPriority = 10; - isGlobal = 2; - isSingular = 1; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class medicSetting_basicEpi { - displayName = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_Description); - typeName = "NUMBER"; - class values { - class anyone { name = CSTRING(AdvancedMedicalSettings_anyone); value = 0; }; - class Medic { name = CSTRING(AdvancedMedicalSettings_Medic); value = 1; default = 1; }; - class Special { name = CSTRING(AdvancedMedicalSettings_Special); value = 2; }; - }; - }; - class useLocation_basicEpi { - displayName = CSTRING(BasicMedicalSettings_useLocation_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_useLocation_basicEpi_Description); - typeName = "NUMBER"; - class values { - class anywhere { name = CSTRING(AdvancedMedicalSettings_anywhere); value = 0; default = 1; }; - class vehicle { name = CSTRING(AdvancedMedicalSettings_vehicle); value = 1; }; - class facility { name = CSTRING(AdvancedMedicalSettings_facility); value = 2; }; - class vehicleAndFacility { name = CSTRING(AdvancedMedicalSettings_vehicleAndFacility); value = 3; }; - class disabled { name = ECSTRING(common,Disabled); value = 4;}; - }; - }; - }; - class ModuleDescription { - description = CSTRING(BasicMedicalSettings_Module_Description); - sync[] = {}; - }; - }; - class ACE_moduleAdvancedMedicalSettings: ACE_Module { - scope = 1; - displayName = CSTRING(AdvancedMedicalSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAdvancedMedicalSettings); - functionPriority = 10; - isGlobal = 2; - isSingular = 1; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class enableFor { - displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableFor_Description); - typeName = "NUMBER"; - class values { - class playableUnits { - name = CSTRING(playeronly); - value = 0; - default = 1; - }; - class playableUnitsAndAI { - name = CSTRING(playersandai); - value = 1; - }; - }; - }; - class enableAdvancedWounds { - displayName = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class enableVehicleCrashes { - displayName = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class medicSetting_PAK { - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_Description); - typeName = "NUMBER"; - class values { - class anyone { name = CSTRING(AdvancedMedicalSettings_anyone); value = 0; }; - class Medic { name = CSTRING(AdvancedMedicalSettings_Medic); value = 1; default = 1; }; - class Special { name = CSTRING(AdvancedMedicalSettings_Special); value = 2; }; - }; - }; - class consumeItem_PAK { - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); - typeName = "NUMBER"; - class values { - class keep { name = ECSTRING(common,No); value = 0; }; - class remove { name = ECSTRING(common,Yes); value = 1; default = 1; }; - }; - }; - class useCondition_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); - typeName = "NUMBER"; - class values { - class AnyTime { name = CSTRING(AnyTime); value = 0; }; - class Stable { name = CSTRING(Stable); value = 1; default = 1; }; - }; - }; - class useLocation_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); - typeName = "NUMBER"; - class values { - class anywhere { name = CSTRING(AdvancedMedicalSettings_anywhere); value = 0; }; - class vehicle { name = CSTRING(AdvancedMedicalSettings_vehicle); value = 1; }; - class facility { name = CSTRING(AdvancedMedicalSettings_facility); value = 2; }; - class vehicleAndFacility { name = CSTRING(AdvancedMedicalSettings_vehicleAndFacility); value = 3; default = 1; }; - class disabled { name = ECSTRING(common,Disabled); value = 4;}; - }; - }; - class medicSetting_SurgicalKit: medicSetting_PAK { - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_Description); - }; - class consumeItem_SurgicalKit: consumeItem_PAK { - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_Description); - }; - class useLocation_SurgicalKit: useLocation_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); - }; - class useCondition_SurgicalKit: useCondition_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); - class values { - class AnyTime { name = CSTRING(AnyTime); value = 0; default = 1; }; - class Stable { name = CSTRING(Stable); value = 1; }; - }; - }; - class healHitPointAfterAdvBandage { - displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); - description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class painIsOnlySuppressed { - displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); - description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - }; - - class ModuleDescription { - description = CSTRING(AdvancedMedicalSettings_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleReviveSettings: ACE_Module { - scope = 1; - displayName = CSTRING(ReviveSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QUOTE(DFUNC(moduleReviveSettings)); - functionPriority = 1; - isGlobal = 1; - isSingular = 1; - isTriggerActivated = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class enableRevive { - displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); - description = CSTRING(ReviveSettings_enableRevive_Description); - typeName = "NUMBER"; - defaultValue = 0; - class values { - class disable { name = ECSTRING(common,Disabled); value = 0; default = 1;}; - class playerOnly { name = CSTRING(playeronly); value = 1; }; - class playerAndAI { name = CSTRING(playersandai); value = 2; }; - }; - }; - class maxReviveTime { - displayName = CSTRING(ReviveSettings_maxReviveTime_DisplayName); - description = CSTRING(ReviveSettings_maxReviveTime_Description); - typeName = "NUMBER"; - defaultValue = 120; - }; - class amountOfReviveLives { - displayName = CSTRING(ReviveSettings_amountOfReviveLives_DisplayName); - description = CSTRING(ReviveSettings_amountOfReviveLives_Description); - typeName = "NUMBER"; - defaultValue = -1; - }; - }; - - class ModuleDescription { - description = CSTRING(ReviveSettings_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleAssignMedicRoles: Module_F { - scope = 1; - displayName = CSTRING(AssignMedicRoles_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAssignMedicRoles); - functionPriority = 10; - isGlobal = 2; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class EnableList { - displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName); - description = CSTRING(AssignMedicRoles_EnableList_Description); - defaultValue = ""; - typeName = "STRING"; - }; - class role { - displayName = CSTRING(AssignMedicRoles_role_DisplayName); - description = CSTRING(AssignMedicRoles_role_Description); - typeName = "NUMBER"; - class values { - class none { - name = CSTRING(AssignMedicRoles_role_none); - value = 0; - }; - class medic { - name = CSTRING(AssignMedicRoles_role_medic); - value = 1; - default = 1; - }; - class doctor { - name = CSTRING(AssignMedicRoles_role_doctor); - value = 2; - }; - }; - }; - }; - - class ModuleDescription { - description = CSTRING(AssignMedicRoles_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleAssignMedicVehicle: Module_F { - scope = 1; - displayName = CSTRING(AssignMedicVehicle_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAssignMedicalVehicle); - functionPriority = 10; - isGlobal = 2; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class EnableList { - displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName); - description = CSTRING(AssignMedicVehicle_EnableList_Description); - defaultValue = ""; - typeName = "STRING"; - }; - class enabled { - displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); - description = CSTRING(AssignMedicVehicle_enabled_Description); - - typeName = "NUMBER"; - class values { - class none { - name = ECSTRING(common,No); - value = 0; - }; - class medic { - name = ECSTRING(common,Yes); - value = 1; - default = 1; - }; - }; - }; - }; - - class ModuleDescription { - description = CSTRING(AssignMedicVehicle_Module_Description); - sync[] = {}; - }; + class EventHandlers; }; - - class ACE_moduleAssignMedicalFacility: Module_F { - scope = 1; - displayName = CSTRING(AssignMedicalFacility_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAssignMedicalFacility); - functionPriority = 10; - isGlobal = 2; - isTriggerActivated = 0; - isDisposable = 0; + class ACE_moduleMedicalSettings: Module_F { author = ECSTRING(common,ACETeam); - - class Arguments { - class enabled { - displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); - description = CSTRING(AssignMedicalFacility_enabled_Description); - typeName = "BOOL"; - }; - }; - - class ModuleDescription { - description = CSTRING(AssignMedicalFacility_Module_Description); - sync[] = {}; - }; - }; - - #define ARM_LEG_ARMOR_DEFAULT 1 - #define ARM_LEG_ARMOR_BETTER 1 - #define ARM_LEG_ARMOR_CSAT 1 - - #define ADD_ACE_HITPOINTS(ARM_ARMOR,LEG_ARMOR) \ - class HitLeftArm { \ - armor = ARM_ARMOR; \ - material = -1; \ - name = "hand_l"; \ - passThrough = 1; \ - radius = 0.08; \ - explosionShielding = 1; \ - visual = "injury_hands"; \ - minimalHit = 0.01; \ - }; \ - class HitRightArm: HitLeftArm { \ - name = "hand_r"; \ - }; \ - class HitLeftLeg { \ - armor = LEG_ARMOR; \ - material = -1; \ - name = "leg_l"; \ - passThrough = 1; \ - radius = 0.1; \ - explosionShielding = 1; \ - visual = "injury_legs"; \ - minimalHit = 0.01; \ - }; \ - class HitRightLeg: HitLeftLeg { \ - name = "leg_r"; \ - }; - - class Man; - class CAManBase: Man { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_DEFAULT,ARM_LEG_ARMOR_DEFAULT) - }; - - class ACE_SelfActions { - #include "ACE_Medical_SelfActions.hpp" - }; - - class ACE_Actions { - // Include actions in body parts for treatment while in the open - #define EXCEPTIONS exceptions[] = {"isNotSwimming"}; - #define ACTION_CONDITION condition = QUOTE(GVAR(menuTypeStyle) == 0); - #include "ACE_Medical_Actions.hpp" - - // Create a consolidates medical menu for treatment while boarded - class ACE_MainActions { - class Medical { - displayName = CSTRING(Actions_Medical); - runOnHover = 1; - exceptions[] = {"isNotInside"}; - condition = QUOTE((vehicle _target != _target && vehicle _target == vehicle _player) || GVAR(menuTypeStyle) == 1); - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - icon = QPATHTOF(UI\icons\medical_cross.paa); - - #undef EXCEPTIONS - #undef ACTION_CONDITION - #define EXCEPTIONS exceptions[] = {"isNotInside", "isNotSwimming"}; - #define ACTION_CONDITION condition = "true"; - #include "ACE_Medical_Actions.hpp" - }; - class GVAR(loadPatient) { - displayName = CSTRING(LoadPatient); - distance = 5; - condition = QUOTE(_target getVariable [ARR_2(QUOTE(QUOTE(ACE_isUnconscious)), false)] && {alive _target} && {vehicle _target == _target}); - statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionLoadUnit)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotDragging", "isNotCarrying", "isNotSwimming"}; - insertChildren = QUOTE(call DFUNC(addLoadPatientActions)); - }; - class GVAR(UnLoadPatient) { - displayName = CSTRING(UnloadPatient); - distance = 5; - condition = QUOTE(_target getVariable [ARR_2(QUOTE(QUOTE(ACE_isUnconscious)), false)] && {alive _target} && {vehicle _target != _target} && {vehicle _player == _player}); - statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionUnloadUnit)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotDragging", "isNotCarrying", "isNotInside", "isNotSwimming"}; - }; - }; - }; - }; - - class SoldierWB: CAManBase {}; - class SoldierEB: CAManBase {}; - class SoldierGB: CAManBase {}; - - class B_Soldier_base_F: SoldierWB {}; - - class B_Soldier_04_f: B_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class B_Soldier_05_f: B_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class I_Soldier_base_F: SoldierGB {}; - - class I_Soldier_03_F: I_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class I_Soldier_04_F: I_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_Soldier_base_F: SoldierEB { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_Soldier_diver_base_F: O_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_Soldier_02_F: O_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_officer_F: O_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - //These VR guys already have limb hitpoints that we should be able to use - //Note: the selections are a little weird, eg: class leg_l {name = "leg_l";}; - // class B_Soldier_VR_F: B_Soldier_base_F { { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class O_Soldier_VR_F: O_Soldier_base_F { { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class I_Soldier_VR_F: I_Soldier_base_F { { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class C_Soldier_VR_F: C_man_1 { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class O_Protagonist_VR_F: O_Soldier_base_F { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - - class MapBoard_altis_F; - class ACE_bodyBagObject: MapBoard_altis_F { - class EventHandlers { - class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; - }; - scope = 1; - scopeCurator = 2; - side = -1; - model = QPATHTOEF(apl,ace_bodybag.p3d); - icon = ""; - displayName = CSTRING(Bodybag_Display); - EGVAR(dragging,canDrag) = 1; - EGVAR(dragging,dragPosition)[] = {0,1.2,0}; - EGVAR(dragging,dragDirection) = 0; - EGVAR(cargo,size) = 1; - EGVAR(cargo,canLoad) = 1; - hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = {QPATHTOEF(apl,data\bodybag_co.paa)}; - class ACE_Actions { - class ACE_MainActions { - displayName = ECSTRING(interaction,MainAction); - distance = 5; - condition = QUOTE(true); - statement = ""; - icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; - selection = ""; - }; - }; - }; - - // Medical litter classes - class Thing; - class ACE_MedicalLitterBase: Thing { - scope = 1; - scopeCurator = 0; - displayName = " "; - destrType = "DestructNo"; - model = QPATHTOF(data\littergeneric.p3d); - }; - class ACE_MedicalLitter_clean: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_clean.p3d); - }; - class ACE_MedicalLitter_bandage1: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_bandages1.p3d); - }; - class ACE_MedicalLitter_bandage2: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_bandages2.p3d); - }; - class ACE_MedicalLitter_bandage3: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_bandages3.p3d); - }; - class ACE_MedicalLitter_packingBandage: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_packingBandage.p3d); - }; - class ACE_MedicalLitter_gloves: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_gloves.p3d); - }; - class ACE_MedicalLitter_adenosine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_adenosine.p3d); - }; - class ACE_MedicalLitter_atropine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_atropine.p3d); - }; - class ACE_MedicalLitter_epinephrine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_epinephrine.p3d); - }; - class ACE_MedicalLitter_morphine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_morphine.p3d); - }; - class ACE_MedicalLitter_QuickClot: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_Quikclot.p3d); - }; - class Item_Base_F; - class ACE_fieldDressingItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Bandage_Basic_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_fieldDressing,1); - }; - }; - class ACE_packingBandageItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Packing_Bandage_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_packingBandage,1); - }; - }; - class ACE_elasticBandageItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Bandage_Elastic_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_elasticBandage,1); - }; - }; - class ACE_tourniquetItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Tourniquet_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_tourniquet,1); - }; - }; - class ACE_morphineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Morphine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_morphine,1); - }; - }; - class ACE_adenosineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Adenosine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_adenosine,1); - }; - }; - class ACE_atropineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Atropine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_atropine,1); - }; - }; - class ACE_epinephrineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Epinephrine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_epinephrine,1); - }; - }; - class ACE_plasmaIVItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Plasma_IV); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_plasmaIV,1); - }; - }; - - class ACE_bloodIVItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Blood_IV); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_bloodIV,1); - }; - }; - class ACE_salineIVItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Saline_IV); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_salineIV,1); - }; - }; - class ACE_quikClotItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(QuikClot_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_quikclot,1); - }; - }; - class ACE_personalAidKitItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Aid_Kit_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_personalAidKit,1); - }; - }; - class ACE_surgicalKitItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(SurgicalKit_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_surgicalKit,1); - }; - }; - class ACE_bodyBagItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Bodybag_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_bodyBag,1); - }; - }; - - class ThingX; - class ReammoBox_F: ThingX { - class ACE_Actions; - }; - class NATO_Box_Base: ReammoBox_F { - class ACE_Actions: ACE_Actions { - class ACE_MainActions; - }; - }; - class ACE_medicalSupplyCrate: NATO_Box_Base { - scope = 2; - scopeCurator = 2; - accuracy = 1000; - displayName = CSTRING(medicalSupplyCrate); - model = QPATHTOF(data\ace_medcrate.p3d); - author = "ElTyranos"; - class TransportItems { - MACRO_ADDITEM(ACE_fieldDressing,50); - MACRO_ADDITEM(ACE_morphine,25); - MACRO_ADDITEM(ACE_epinephrine,25); - MACRO_ADDITEM(ACE_bloodIV,15); - MACRO_ADDITEM(ACE_bloodIV_500,15); - MACRO_ADDITEM(ACE_bloodIV_250,15); - MACRO_ADDITEM(ACE_bodyBag,10); - }; - class AnimationSources { - class Cover { - source = "user"; - animPeriod = 1.5; - initPhase = 0; - minValue = 0; - maxValue = 1; - }; - }; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - selection = "cover_action"; - class ACE_OpenLid { - displayName = CSTRING(openLid); - condition = QUOTE(alive _target && {_target animationPhase 'Cover' < 0.5}); - statement = QUOTE(_target animate ARR_2(['Cover',1])); - showDisabled = 0; - }; - class ACE_CloseLid { - displayName = CSTRING(closeLid); - condition = QUOTE(alive _target && {_target animationPhase 'Cover' >= 0.5}); - statement = QUOTE(_target animate ARR_2(['Cover',0])); - showDisabled = 0; - }; - }; - }; - }; - class ACE_medicalSupplyCrate_advanced: ACE_medicalSupplyCrate { - displayName = CSTRING(medicalSupplyCrate_advanced); - class TransportItems { - MACRO_ADDITEM(ACE_fieldDressing,25); - MACRO_ADDITEM(ACE_packingBandage,25); - MACRO_ADDITEM(ACE_elasticBandage,25); - MACRO_ADDITEM(ACE_tourniquet,15); - MACRO_ADDITEM(ACE_morphine,15); - MACRO_ADDITEM(ACE_adenosine,15); - MACRO_ADDITEM(ACE_atropine,15); - MACRO_ADDITEM(ACE_epinephrine,15); - MACRO_ADDITEM(ACE_plasmaIV,7); - MACRO_ADDITEM(ACE_plasmaIV_500,7); - MACRO_ADDITEM(ACE_plasmaIV_250,7); - MACRO_ADDITEM(ACE_salineIV,7); - MACRO_ADDITEM(ACE_salineIV_500,7); - MACRO_ADDITEM(ACE_salineIV_250,7); - MACRO_ADDITEM(ACE_bloodIV,7); - MACRO_ADDITEM(ACE_bloodIV_500,7); - MACRO_ADDITEM(ACE_bloodIV_250,7); - MACRO_ADDITEM(ACE_quikClot,20); - MACRO_ADDITEM(ACE_personalAidKit,3); - MACRO_ADDITEM(ACE_surgicalKit,2); - MACRO_ADDITEM(ACE_bodyBag,5); + displayName = "[ACE] Retired Medical module (will have no effect)"; + class EventHandlers: EventHandlers { + init = "diag_log text format ['[ACE] (Medical) Warning retired module [%1] placed (will have no effect)', typeOf (_this select 0)];"; }; }; + class ACE_moduleBasicMedicalSettings: ACE_moduleMedicalSettings {}; + class ACE_moduleAdvancedMedicalSettings: ACE_moduleMedicalSettings {}; + class ACE_moduleReviveSettings: ACE_moduleMedicalSettings {}; + class ACE_moduleAssignMedicRoles: ACE_moduleMedicalSettings {}; + class ACE_moduleAssignMedicVehicle: ACE_moduleMedicalSettings {}; + class ACE_moduleAssignMedicalFacility: ACE_moduleMedicalSettings {}; + class ACE_moduleMedicalMenuSettings: ACE_moduleMedicalSettings {}; }; diff --git a/addons/medical/CfgWeapons.hpp b/addons/medical/CfgWeapons.hpp deleted file mode 100644 index 7260452bc4e..00000000000 --- a/addons/medical/CfgWeapons.hpp +++ /dev/null @@ -1,259 +0,0 @@ - -class CfgWeapons { - class ItemCore; - class CBA_MiscItem_ItemInfo; - class InventoryFirstAidKitItem_Base_F; - class MedikitItem; - - // ITEMS - class FirstAidKit: ItemCore { - type = 0; - ace_arsenal_hide = 1; - class ItemInfo: InventoryFirstAidKitItem_Base_F { - mass = 4; - }; - }; - class Medikit: ItemCore { - type = 0; - ace_arsenal_hide = 1; - class ItemInfo: MedikitItem { - mass = 60; - }; - }; - - class ACE_ItemCore; - class ACE_fieldDressing: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - model = QPATHTOF(data\bandage.p3d); - picture = QPATHTOF(ui\items\fieldDressing_x_ca.paa); - displayName = CSTRING(Bandage_Basic_Display); - descriptionShort = CSTRING(Bandage_Basic_Desc_Short); - descriptionUse = CSTRING(Bandage_Basic_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_packingBandage: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Packing_Bandage_Display); - picture = QPATHTOF(ui\items\packingBandage_x_ca.paa); - model = QPATHTOF(data\packingbandage.p3d); - descriptionShort = CSTRING(Packing_Bandage_Desc_Short); - descriptionUse = CSTRING(Packing_Bandage_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_elasticBandage: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Bandage_Elastic_Display); - picture = QPATHTOF(ui\items\elasticBandage_x_ca.paa); - model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; - descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); - descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_tourniquet: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Tourniquet_Display); - picture = QPATHTOF(ui\items\tourniquet_x_ca.paa); - model = QPATHTOF(data\tourniquet.p3d); - descriptionShort = CSTRING(Tourniquet_Desc_Short); - descriptionUse = CSTRING(Tourniquet_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_morphine: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Morphine_Display); - picture = QPATHTOF(ui\items\morphine_x_ca.paa); - model = QPATHTOF(data\morphine.p3d); - descriptionShort = CSTRING(Morphine_Desc_Short); - descriptionUse = CSTRING(Morphine_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_adenosine: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Adenosine_Display); - picture = QPATHTOF(ui\items\adenosine_x_ca.paa); - model = QPATHTOF(data\adenosine.p3d); - descriptionShort = CSTRING(adenosine_Desc_Short); - descriptionUse = CSTRING(adenosine_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_atropine: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Atropine_Display); - picture = QPATHTOF(ui\items\atropine_x_ca.paa); - model = QPATHTOF(data\atropine.p3d); - descriptionShort = CSTRING(Atropine_Desc_Short); - descriptionUse = CSTRING(Atropine_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_epinephrine: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Epinephrine_Display); - picture = QPATHTOF(ui\items\epinephrine_x_ca.paa); - model = QPATHTOF(data\epinephrine.p3d); - descriptionShort = CSTRING(Epinephrine_Desc_Short); - descriptionUse = CSTRING(Epinephrine_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - - class ACE_plasmaIV: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Plasma_IV); - model = QPATHTOF(data\IVBag_1000ml.p3d); - hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_plasma_1000ml_ca.paa) }; - picture = QPATHTOF(ui\items\plasmaIV_x_ca.paa); - descriptionShort = CSTRING(Plasma_IV_Desc_Short); - descriptionUse = CSTRING(Plasma_IV_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 10; - }; - }; - class ACE_plasmaIV_500: ACE_plasmaIV { - displayName = CSTRING(Plasma_IV_500); - model = QPATHTOF(data\IVBag_500ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_plasma_500ml_ca.paa) }; - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 5; - }; - }; - class ACE_plasmaIV_250: ACE_plasmaIV { - displayName = CSTRING(Plasma_IV_250); - model = QPATHTOF(data\IVBag_250ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_plasma_250ml_ca.paa) }; - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 2.5; - }; - }; - class ACE_bloodIV: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - model = QPATHTOF(data\IVBag_1000ml.p3d); - displayName = CSTRING(Blood_IV); - picture = QPATHTOF(ui\items\bloodIV_x_ca.paa); - hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_blood_1000ml_ca.paa) }; - descriptionShort = CSTRING(Blood_IV_Desc_Short); - descriptionUse = CSTRING(Blood_IV_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 10; - }; - }; - class ACE_bloodIV_500: ACE_bloodIV { - displayName = CSTRING(Blood_IV_500); - model = QPATHTOF(data\IVBag_500ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_blood_500ml_ca.paa) }; - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 5; - }; - }; - class ACE_bloodIV_250: ACE_bloodIV { - displayName = CSTRING(Blood_IV_250); - model = QPATHTOF(data\IVBag_250ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_blood_250ml_ca.paa) }; - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 2.5; - }; - }; - class ACE_salineIV: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Saline_IV); - model = QPATHTOF(data\IVBag_1000ml.p3d); - hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_saline_1000ml_ca.paa) }; - picture = QPATHTOF(ui\items\salineIV_x_ca.paa); - descriptionShort = CSTRING(Saline_IV_Desc_Short); - descriptionUse = CSTRING(Saline_IV_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 10; - }; - }; - class ACE_salineIV_500: ACE_salineIV { - displayName = CSTRING(Saline_IV_500); - model = QPATHTOF(data\IVBag_500ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_saline_500ml_ca.paa) }; - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 5; - }; - }; - class ACE_salineIV_250: ACE_salineIV { - displayName = CSTRING(Saline_IV_250); - model = QPATHTOF(data\IVBag_250ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_saline_250ml_ca.paa) }; - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 2.5; - }; - }; - class ACE_quikclot: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(QuikClot_Display); - model = QPATHTOF(data\QuikClot.p3d); - picture = QPATHTOF(ui\items\quickclot_x_ca.paa); - descriptionShort = CSTRING(QuikClot_Desc_Short); - descriptionUse = CSTRING(QuikClot_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; - }; - }; - class ACE_personalAidKit: ACE_ItemCore { - scope = 2; - author = ECSTRING(common,ACETeam); - displayName = CSTRING(Aid_Kit_Display); - picture = QPATHTOF(ui\items\personal_aid_kit_x_ca.paa); - descriptionShort = CSTRING(Aid_Kit_Desc_Short); - descriptionUse = CSTRING(Aid_Kit_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 10; - }; - }; - class ACE_surgicalKit: ACE_ItemCore { - scope=2; - author = ECSTRING(common,ACETeam); - displayName= CSTRING(SurgicalKit_Display); - model = QPATHTOF(data\surgical_kit.p3d); - picture = QPATHTOF(ui\items\surgicalKit_x_ca.paa); - descriptionShort = CSTRING(SurgicalKit_Desc_Short); - descriptionUse = CSTRING(SurgicalKit_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 15; - }; - }; - class ACE_bodyBag: ACE_ItemCore { - scope=2; - author = ECSTRING(common,ACETeam); - displayName= CSTRING(Bodybag_Display); - model = QPATHTOF(data\bodybagItem.p3d); - picture = QPATHTOF(ui\items\bodybag_x_ca.paa); - descriptionShort = CSTRING(Bodybag_Desc_Short); - descriptionUse = CSTRING(Bodybag_Desc_Use); - class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 7; - }; - }; -}; diff --git a/addons/medical/README.md b/addons/medical/README.md deleted file mode 100644 index ecf8f5793e0..00000000000 --- a/addons/medical/README.md +++ /dev/null @@ -1,12 +0,0 @@ -ace_medical -=============== - -Provides a basic and advanced medical system. - - -## Maintainers - -The people responsible for merging changes to this component or answering potential questions. - -- [Glowbal](https://github.com/Glowbal) -- [KoffeinFlummi](https://github.com/KoffeinFlummi) diff --git a/addons/medical/XEH_PREP.hpp b/addons/medical/XEH_PREP.hpp index 8f5a39e1073..8cdc7feecf3 100644 --- a/addons/medical/XEH_PREP.hpp +++ b/addons/medical/XEH_PREP.hpp @@ -1,119 +1,3 @@ - -PREP(actionCheckBloodPressure); -PREP(actionCheckBloodPressureLocal); -PREP(actionCheckPulse); -PREP(actionCheckPulseLocal); -PREP(actionCheckResponse); -PREP(actionDiagnose); -PREP(actionPlaceInBodyBag); -PREP(actionRemoveTourniquet); -PREP(actionLoadUnit); -PREP(actionUnloadUnit); PREP(addDamageToUnit); -PREP(addHeartRateAdjustment); -PREP(addLoadPatientActions); -PREP(addToLog); -PREP(addToTriageCard); -PREP(addUnconsciousCondition); -PREP(addUnloadPatientActions); -PREP(addVitalLoop); PREP(adjustPainLevel); -PREP(bodyCleanupLoop); -PREP(canAccessMedicalEquipment); -PREP(canTreat); -PREP(canTreatCached); -PREP(determineIfFatal); -PREP(getBloodLoss); -PREP(getBloodPressure); -PREP(getBloodVolumeChange); -PREP(getCardiacOutput); -PREP(getTypeOfDamage); -PREP(getHeartRateChange); -PREP(getTriageStatus); -PREP(getUnconsciousCondition); -PREP(handleDamage); -PREP(handleDamage_advanced); -PREP(handleDamage_advancedSetDamage); -PREP(handleDamage_airway); -PREP(handleDamage_caching); -PREP(handleDamage_fractures); -PREP(handleDamage_internalInjuries); -PREP(handleDamage_wounds); -PREP(handleDamage_woundsOld); -PREP(handleInit); -PREP(handleKilled); -PREP(handleLocal); -PREP(handleRespawn); -PREP(handleUnitVitals); -PREP(handleBandageOpening); -PREP(hasItem); -PREP(hasItems); -PREP(hasMedicalEnabled); -PREP(hasTourniquetAppliedTo); -PREP(init); -PREP(isBeingCarried); -PREP(isBeingDragged); -PREP(isInMedicalFacility); -PREP(isInMedicalVehicle); -PREP(isMedic); -PREP(isMedicalVehicle); -PREP(isInStableCondition); -PREP(itemCheck); -PREP(medicationEffectLoop); -PREP(modifyMedicalAction); -PREP(onMedicationUsage); -PREP(parseConfigForInjuries); -PREP(playInjuredSound); -PREP(reviveStateLoop); -PREP(selectionNameToNumber); -PREP(serverRemoveBody); -PREP(setCardiacArrest); -PREP(setDead); -PREP(setHitPointDamage); -PREP(setStructuralDamage); PREP(setUnconscious); -PREP(showBloodEffect); -PREP(translateSelections); -PREP(treatment); -PREP(treatment_failure); -PREP(treatment_success); -PREP(treatmentAdvanced_bandage); -PREP(treatmentAdvanced_bandageLocal); -PREP(treatmentAdvanced_CPR); -PREP(treatmentAdvanced_CPRLocal); -PREP(treatmentAdvanced_fullHeal); -PREP(treatmentAdvanced_fullHealLocal); -PREP(treatmentAdvanced_fullHealTreatmentTime); -PREP(treatmentAdvanced_medication); -PREP(treatmentAdvanced_medicationLocal); -PREP(treatmentAdvanced_surgicalKit_onProgress); -PREP(treatmentBasic_bloodbag); -PREP(treatmentBasic_bloodbagLocal); -PREP(treatmentBasic_epipen); -PREP(treatmentBasic_morphine); -PREP(treatmentBasic_morphineLocal); -PREP(treatmentIV); -PREP(treatmentIVLocal); -PREP(treatmentTourniquet); -PREP(treatmentTourniquetLocal); -PREP(useItem); -PREP(useItems); -PREP(vitalLoop); -PREP(displayPatientInformation); -PREP(displayTriageCard); -PREP(dropDownTriageCard); -PREP(moduleMedicalSettings); -PREP(moduleBasicMedicalSettings); -PREP(moduleAdvancedMedicalSettings); -PREP(moduleReviveSettings); -PREP(moduleAssignMedicRoles); -PREP(moduleAssignMedicalVehicle); -PREP(moduleAssignMedicalFacility); -PREP(copyDeadBody); -PREP(unconsciousPFH); -PREP(updateTourniquets); - -// Networked litter -PREP(createLitter); -PREP(handleCreateLitter); -PREP(litterCleanupLoop); diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 991124fcb12..89c3ced877f 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -1,313 +1,16 @@ -// ACE Medical System Visual Loop - +// #define DEBUG_MODE_FULL #include "script_component.hpp" -GVAR(heartBeatSounds_Fast) = ["ACE_heartbeat_fast_1", "ACE_heartbeat_fast_2", "ACE_heartbeat_fast_3"]; -GVAR(heartBeatSounds_Normal) = ["ACE_heartbeat_norm_1", "ACE_heartbeat_norm_2"]; -GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; - -["ace_interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call CBA_fnc_addEventHandler; - -//Treatment EventHandlers: -[QGVAR(actionCheckBloodPressureLocal), DFUNC(actionCheckBloodPressureLocal)] call CBA_fnc_addEventHandler; -[QGVAR(actionCheckPulseLocal), DFUNC(actionCheckPulseLocal)] call CBA_fnc_addEventHandler; -[QGVAR(addVitalLoop), DFUNC(addVitalLoop)] call CBA_fnc_addEventHandler; -[QGVAR(addToMedicalLog), DFUNC(addToLog)] call CBA_fnc_addEventHandler; -[QGVAR(addToTriageCard), DFUNC(addToTriageCard)] call CBA_fnc_addEventHandler; -[QGVAR(setDead), DFUNC(setDead)] call CBA_fnc_addEventHandler; -[QGVAR(setHitPointDamage), DFUNC(setHitPointDamage)] call CBA_fnc_addEventHandler; -[QGVAR(setUnconscious), DFUNC(setUnconscious)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_bandageLocal), DFUNC(treatmentAdvanced_bandageLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_CPRLocal), DFUNC(treatmentAdvanced_CPRLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_fullHealLocal), DFUNC(treatmentAdvanced_fullHealLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_medicationLocal), DFUNC(treatmentAdvanced_medicationLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentBasic_bloodbagLocal), DFUNC(treatmentBasic_bloodbagLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentBasic_morphineLocal), DFUNC(treatmentBasic_morphineLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentIVLocal), DFUNC(treatmentIVLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentTourniquetLocal), DFUNC(treatmentTourniquetLocal)] call CBA_fnc_addEventHandler; -[QGVAR(actionPlaceInBodyBag), FUNC(actionPlaceInBodyBag)] call CBA_fnc_addEventHandler; - -//Handle Deleting Bodies and creating litter on Server: -if (isServer) then { - ["ace_placedInBodyBag", FUNC(serverRemoveBody)] call CBA_fnc_addEventHandler; - [QGVAR(createLitterServer), FUNC(handleCreateLitter)] call CBA_fnc_addEventHandler; - addMissionEventHandler ["BuildingChanged", { - if (isNil QGVAR(allCreatedLitter)) exitWith {}; - params ["_buildingOld", "_buildingNew", "_isRuin"]; - TRACE_3("BuildingChanged",_buildingOld,_buildingNew,_isRuin); - private _radius = sizeOf typeOf _buildingOld / 2; - TRACE_1("",_radius); - { - _x params ["", "_objects"]; - if (({(_x distance2d _buildingOld) < _radius && {getPos _x select 2 > 0.1}} count _objects) > 0) then { - GVAR(allCreatedLitter) deleteAt (GVAR(allCreatedLitter) find _x); - { TRACE_1("deleting",_x); deleteVehicle _x } forEach _objects; - }; - } forEach (+GVAR(allCreatedLitter)); - }]; -}; - -["ace_unconscious", { - params ["_unit", "_status"]; - if (local _unit) then { - if (_status) then { - _unit setVariable ["tf_voiceVolume", 0, true]; - _unit setVariable ["tf_unable_to_use_radio", true, true]; - - _unit setVariable ["acre_sys_core_isDisabled", true, true]; - } else { - _unit setVariable ["tf_voiceVolume", 1, true]; - _unit setVariable ["tf_unable_to_use_radio", false, true]; - - _unit setVariable ["acre_sys_core_isDisabled", false, true]; - }; - }; -}] call CBA_fnc_addEventHandler; - - -// Initialize all effects -if (hasInterface) then { - -_fnc_createEffect = { - params ["_type", "_layer", "_default"]; - - private _effect = ppEffectCreate [_type, _layer]; - _effect ppEffectForceInNVG true; - _effect ppEffectAdjust _default; - _effect ppEffectCommit 0; - - _effect -}; - -GVAR(effectUnconsciousCC) = [ - "ColorCorrections", - 4201, - [1,1,0, [0,0,0,1], [0,0,0,0], [1,1,1,1], [0.4,0.4,0,0,0,0.1,0.3]] -] call _fnc_createEffect; - -GVAR(effectUnconsciousRB) = [ - "RadialBlur", - 4202, - [0.01,0.01,0,0] -] call _fnc_createEffect; - -GVAR(effectBlindingCC) = [ - "ColorCorrections", - 4203, - [1,1,0, [1,1,1,0], [0,0,0,1], [0,0,0,0]] -] call _fnc_createEffect; - -GVAR(effectBloodVolumeCC) = [ - "ColorCorrections", - 4204, - [1,1,0, [0,0,0,0], [1,1,1,1], [0.2,0.2,0.2,0]] -] call _fnc_createEffect; - -GVAR(effectPainCA) = [ - "chromAberration", - 4205, - [0, 0, false] -] call _fnc_createEffect; - -GVAR(effectPainCC) = [ - "ColorCorrections", - 4206, - [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1.3,1.3,0,0,0,0.2,2]] -] call _fnc_createEffect; - -// Initialize Other Variables -GVAR(effectBlind) = false; -GVAR(effectTimeBlood) = CBA_missionTime; - -// MAIN EFFECTS LOOP -[{ - // Zeus interface is open or player is dead; disable everything - if (!(isNull curatorCamera) or !(alive ACE_player)) exitWith { - GVAR(effectUnconsciousCC) ppEffectEnable false; - GVAR(effectUnconsciousRB) ppEffectEnable false; - GVAR(effectBlindingCC) ppEffectEnable false; - GVAR(effectBloodVolumeCC) ppEffectEnable false; - GVAR(effectPainCA) ppEffectEnable false; - GVAR(effectPainCC) ppEffectEnable false; - ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); - }; - - // Unconsciousness effect - if (ACE_player getVariable ["ACE_isUnconscious", false]) then { - GVAR(effectUnconsciousCC) ppEffectEnable true; - GVAR(effectUnconsciousRB) ppEffectEnable true; - GVAR(effectBlind) = true; - ["unconscious", true] call EFUNC(common,setDisableUserInputStatus); - } else { - GVAR(effectUnconsciousCC) ppEffectEnable false; - GVAR(effectUnconsciousRB) ppEffectEnable false; - ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); - if (GVAR(effectBlind)) then { - _strength = 0.78 * (call EFUNC(common,ambientBrightness)); - GVAR(effectBlindingCC) ppEffectEnable true; - GVAR(effectBlindingCC) ppEffectAdjust [1,1,_strength, [1,1,1,0], [0,0,0,1], [0,0,0,0]]; - GVAR(effectBlindingCC) ppEffectCommit 0; - - [{ - GVAR(effectBlindingCC) ppEffectAdjust [1,1,0, [1,1,1,0], [0,0,0,1], [0,0,0,0]]; - GVAR(effectBlindingCC) ppEffectCommit ((_this select 0) * 2); - }, [_strength], 0.01, 0] call CBA_fnc_waitAndExecute; - - [{ - GVAR(effectBlindingCC) ppEffectEnable false; - }, [], (_strength * 2) + 0.5, 0] call CBA_fnc_waitAndExecute; - - GVAR(effectBlind) = false; - }; - }; - - private _bleeding = [ACE_player] call FUNC(getBloodLoss); - // Bleeding Indicator - if (_bleeding > 0 and GVAR(effectTimeBlood) + 3.5 < CBA_missionTime) then { - GVAR(effectTimeBlood) = CBA_missionTime; - [600 * _bleeding] call FUNC(showBloodEffect); - }; - - // Blood Volume Effect - private _blood = if (GVAR(level) < 2) then { - (ACE_player getVariable [QGVAR(bloodVolume), 100]) / 100; - } else { - (((ACE_player getVariable [QGVAR(bloodVolume), 100]) - 60) max 0) / 40; - }; - - if (_blood > 0.99) then { - GVAR(effectBloodVolumeCC) ppEffectEnable false; - } else { - GVAR(effectBloodVolumeCC) ppEffectEnable true; - GVAR(effectBloodVolumeCC) ppEffectAdjust [1,1,0, [0,0,0,0], [1,1,1,_blood], [0.2,0.2,0.2,0]]; - GVAR(effectBloodVolumeCC) ppEffectCommit 0; - }; -}, 0.5, []] call CBA_fnc_addPerFrameHandler; - - -GVAR(lastHeartBeat) = CBA_missionTime; -GVAR(lastHeartBeatSound) = CBA_missionTime; - -// HEARTRATE BASED EFFECTS -[{ - private _heartRate = ACE_player getVariable [QGVAR(heartRate), 70]; - private _pain = ACE_player getVariable [QGVAR(pain), 0]; - if (GVAR(level) == 1) then { - _heartRate = 60 + 40 * _pain; - }; - if (_heartRate <= 0) exitWith {}; - private _interval = 60 / (_heartRate min 40); - - if ((ACE_player getVariable ["ACE_isUnconscious", false])) then { - if (GVAR(painEffectType) == 1) then { - GVAR(effectPainCA) ppEffectEnable false; - } else { - GVAR(effectPainCC) ppEffectEnable false; - }; - } else { - if ((CBA_missionTime > GVAR(lastHeartBeat) + _interval)) then { - GVAR(lastHeartBeat) = CBA_missionTime; - - // Pain effect, no pain effect in zeus camera - if (isNull curatorCamera) then { - private _strength = ((_pain - (ACE_player getVariable [QGVAR(painSuppress), 0])) max 0) min 1; - _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); - if (GVAR(painEffectType) == 1) then { - GVAR(effectPainCC) ppEffectEnable false; - if (_pain > (ACE_player getVariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.15; - GVAR(effectPainCA) ppEffectEnable true; - GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call CBA_fnc_waitAndExecute; - } else { - GVAR(effectPainCA) ppEffectEnable false; - }; - } else { - GVAR(effectPainCA) ppEffectEnable false; - if (_pain > (ACE_player getVariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.9; - GVAR(effectPainCC) ppEffectEnable true; - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call CBA_fnc_waitAndExecute; - } else { - GVAR(effectPainCC) ppEffectEnable false; - }; - }; - }; - }; - }; - - if (GVAR(level) >= 2 && {_heartRate > 0}) then { - private _minTime = 60 / _heartRate; - if (CBA_missionTime - GVAR(lastHeartBeatSound) > _minTime) then { - GVAR(lastHeartBeatSound) = CBA_missionTime; - // Heart rate sound effect - if (_heartRate < 60) then { - private _sound = GVAR(heartBeatSounds_Normal) select (random((count GVAR(heartBeatSounds_Normal)) -1)); - playSound _sound; - } else { - if (_heartRate > 150) then { - playSound "ACE_heartbeat_fast_2"; - }; - }; - }; - }; - -}, 0, []] call CBA_fnc_addPerFrameHandler; -}; - -["ace_settingsInitialized", { - [ - {(((_this select 0) getVariable [QGVAR(bloodVolume), 100]) < 65)}, - {(((_this select 0) getVariable [QGVAR(pain), 0]) - ((_this select 0) getVariable [QGVAR(painSuppress), 0])) > 0.9}, - {(([_this select 0] call FUNC(getBloodLoss)) > 0.25)}, - {((_this select 0) getVariable [QGVAR(inReviveState), false])}, - {((_this select 0) getVariable [QGVAR(inCardiacArrest), false])}, - {((_this select 0) getVariable ["ACE_isDead", false])} - ] call FUNC(addUnconsciousCondition); - -}] call CBA_fnc_addEventHandler; - -// Prevent all types of interaction while unconscious -// @todo: probably remove this when CBA keybind hold key works properly -["isNotUnconscious", {!((_this select 0) getVariable ["ACE_isUnconscious", false])}] call EFUNC(common,addCanInteractWithCondition); +[QEGVAR(medical,setUnconscious), LINKFUNC(setUnconscious)] call CBA_fnc_addEventHandler; -// Item Event Handler -["loadout", FUNC(itemCheck)] call CBA_fnc_addPlayerEventHandler; +if (!hasInterface) exitWith {}; -if (hasInterface) then { - ["ace_playerJIP", { - INFO("JIP Medical init for player."); - [player] call FUNC(init); - }] call CBA_fnc_addEventHandler; -}; +[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { + (linearConversion [0, 1, GET_PAIN_PERCEIVED(ACE_player), 1, 5, true]) + (ACE_player getVariable [QEGVAR(medical_engine,aimFracture), 0]) +}] call EFUNC(common,arithmeticSetSource); -if (["ACE_Arsenal"] call EFUNC(common,isModLoaded)) then { - [QEGVAR(arsenal,displayOpened), { - EGVAR(arsenal,virtualItems) set [17, (EGVAR(arsenal,virtualItems) select 17) - ["FirstAidKit", "Medikit"]]; - }] call CBA_fnc_addEventHandler; -}; +#ifdef DEBUG_MODE_FULL + call compile preprocessFileLineNumbers QPATHTOF(dev\reportSettings.sqf); + call compile preprocessFileLineNumbers QPATHTOF(dev\watchVariable.sqf); + call compile preprocessFileLineNumbers QPATHTOF(dev\debugDisplay.sqf); +#endif diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 51c2c166880..2ebebbbd3df 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -6,57 +6,49 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -GVAR(injuredUnitCollection) = []; - -private _versionEx = "ace_medical" callExtension "version"; -DFUNC(handleDamage_assignWounds) = if (_versionEx == "") then { - DFUNC(handleDamage_woundsOld) -} else { - DFUNC(handleDamage_wounds) -}; - -call FUNC(parseConfigForInjuries); - -GVAR(HITPOINTS) = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; -GVAR(SELECTIONS) = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; - -//Hack for #3168 (units in static weapons do not take any damage): -//doing a manual pre-load with a small distance seems to fix the LOD problems with handle damage not returning full results -GVAR(fixedStatics) = []; -private _fixStatic = { - params ["_vehicle"]; - private _vehType = typeOf _vehicle; - TRACE_2("",_vehicle,_vehType); - if (!(_vehType in GVAR(fixedStatics))) then { - GVAR(fixedStatics) pushBack _vehType; - TRACE_1("starting preload",_vehType); - [{ - 1 preloadObject (_this select 0); - }, { - TRACE_1("preload done",_this); - }, [_vehType]] call CBA_fnc_waitUntilAndExecute; - }; -}; -["StaticWeapon", "init", _fixStatic] call CBA_fnc_addClassEventHandler; -["Car", "init", _fixStatic] call CBA_fnc_addClassEventHandler; -["CAManBase", "Init", FUNC(handleInit)] call CBA_fnc_addClassEventHandler; -["CAManBase", "Respawn", FUNC(handleRespawn)] call CBA_fnc_addClassEventHandler; -["CAManBase", "Killed", FUNC(handleKilled)] call CBA_fnc_addClassEventHandler; -["CAManBase", "Local", FUNC(handleLocal)] call CBA_fnc_addClassEventHandler; - -addMissionEventHandler ["Loaded",{ - { - TRACE_1("starting preload (save load)",_x); - [{ - 1 preloadObject (_this select 0); - }, { - TRACE_1("preload done",_this); - }, [_x]] call CBA_fnc_waitUntilAndExecute; - } forEach GVAR(fixedStatics); - - // Reload configs into extension (handle full game restart) - call FUNC(parseConfigForInjuries); -}]; - +#include "initSettings.sqf" + +// Add warning for old functions that were technically public, Remove at 3.14.0 +{ + missionNamespace setVariable [_x, compileFinal format ['diag_log text "ACE Medical WARNING: Formerly public function [%1] has no effect in medical rewrite."; nil', _x]]; +} forEach [ + QFUNC(actionPlaceInBodyBag), + QFUNC(actionRemoveTourniquet), + QFUNC(addHeartRateAdjustment), + QFUNC(addToLog), + QFUNC(addToTriageCard), + QFUNC(addUnconsciousCondition), + QFUNC(addVitalLoop), + QFUNC(canAccessMedicalEquipment), + QFUNC(canTreat), + QFUNC(displayTriageCard), + QFUNC(dropDownTriageCard), + QFUNC(getTriageStatus), + QFUNC(getUnconsciousCondition), + QFUNC(hasItem), + QFUNC(hasItems), + QFUNC(hasTourniquetAppliedTo), + QFUNC(isInMedicalFacility), + QFUNC(isInMedicalVehicle), + QFUNC(isMedic), + QFUNC(isMedicalVehicle), + QFUNC(itemCheck), + QFUNC(selectionNameToNumber), + QFUNC(setCardiacArrest), + QFUNC(setDead), + QFUNC(setHitPointDamage), + QFUNC(showBloodEffect), + QFUNC(treatment), + QFUNC(treatmentAdvanced_bandage), + QFUNC(treatmentAdvanced_CPR), + QFUNC(treatmentAdvanced_CPRLocal), + QFUNC(treatmentAdvanced_medication), + QFUNC(treatmentAdvanced_medicationLocal), + QFUNC(treatmentIV), + QFUNC(treatmentIVLocal), + QFUNC(unconsciousPFH), + QFUNC(useItem), + QFUNC(useItems) +]; ADDON = true; diff --git a/addons/medical/XEH_preStart.sqf b/addons/medical/XEH_preStart.sqf index 022888575ed..bc3262c38c2 100644 --- a/addons/medical/XEH_preStart.sqf +++ b/addons/medical/XEH_preStart.sqf @@ -1,3 +1,5 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +[false] call compile preprocessFileLineNumbers QPATHTOF(dev\test_hitpointConfigs.sqf); diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 002c9e2cf49..6c93d1e3e82 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -3,58 +3,21 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {"ACE_medicalSupplyCrate", "ACE_medicalSupplyCrate_advanced", "ACE_fieldDressingItem", "ACE_packingBandageItem", "ACE_elasticBandageItem", "ACE_tourniquetItem", "ACE_morphineItem", "ACE_atropineItem", "ACE_epinephrineItem", "ACE_plasmaIVItem", "ACE_bloodIVItem", "ACE_salineIVItem", "ACE_quikclotItem", "ACE_personalAidKitItem", "ACE_surgicalKitItem", "ACE_bodyBagItem", "ACE_bodyBagObject"}; - weapons[] = {"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_tourniquet", "ACE_morphine", "ACE_atropine", "ACE_epinephrine", "ACE_plasmaIV", "ACE_plasmaIV_500", "ACE_plasmaIV_250", "ACE_bloodIV", "ACE_bloodIV_500", "ACE_bloodIV_250", "ACE_salineIV", "ACE_salineIV_500", "ACE_salineIV_250", "ACE_quikclot", "ACE_personalAidKit", "ACE_surgicalKit", "ACE_bodyBag"}; + units[] = {}; + weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interaction", "ace_apl"}; + requiredAddons[] = {"ace_medical_engine"}; author = ECSTRING(common,ACETeam); - authors[] = {"Glowbal", "KoffeinFlummi"}; + authors[] = {"Glowbal", "KoffeinFlummi","Arcanum417"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; }; -#include "CfgActions.hpp" +#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" -#include "CfgFactionClasses.hpp" #include "CfgVehicles.hpp" -#include "CfgWeapons.hpp" -#include "CfgSounds.hpp" -#include "CfgEden.hpp" -#include "ACE_Medical_Treatments.hpp" -#include "ACE_Settings.hpp" -#include "ui\CfgInGameUI.hpp" -#include "ui\RscTitles.hpp" -#include "ui\triagecard.hpp" - -class ACE_newEvents { - medical_onUnconscious = "ace_unconscious"; - medical_treatmentSuccess = "ace_treatmentSucceded"; - medical_onSetDead = "ace_killed"; - Medical_onEnteredCardiacArrest = "ace_cardiacArrestEntered"; - Medical_onItemAddedToTriageCard = "ace_triageCardItemAdded"; - medical_onLogEntryAdded = "ace_medicalLogEntryAdded"; - Medical_onHeartRateAdjustmentAdded = "ace_heartRateAdjustmentAdded"; - placedInBodyBag = "ace_placedInBodyBag"; - actionPlaceInBodyBag = QGVAR(actionPlaceInBodyBag); - treatmentTourniquetLocal = QGVAR(treatmentTourniquetLocal); - treatmentIVLocal = QGVAR(treatmentIVLocal); - treatmentBasic_morphineLocal = QGVAR(treatmentBasic_morphineLocal); - treatmentBasic_bloodbagLocal = QGVAR(treatmentBasic_bloodbagLocal); - treatmentAdvanced_medicationLocal = QGVAR(treatmentAdvanced_medicationLocal); - treatmentAdvanced_fullHealLocal = QGVAR(treatmentAdvanced_fullHealLocal); - treatmentAdvanced_CPRLocal = QGVAR(treatmentAdvanced_CPRLocal); - treatmentAdvanced_bandageLocal = QGVAR(treatmentAdvanced_bandageLocal); - setUnconscious = QGVAR(setUnconscious); - setHitPointDamage = QGVAR(setHitPointDamage); - setDead = QGVAR(setDead); - addToTriageCard = QGVAR(addToTriageCard); - addToMedicalLog = QGVAR(addToMedicalLog); - actionCheckPulseLocal = QGVAR(actionCheckPulseLocal); - actionCheckBloodPressureLocal = QGVAR(actionCheckBloodPressureLocal); - addVitalLoop = QGVAR(addVitalLoop); -}; -class ACE_Extensions { - extensions[] += {"ace_medical"}; +class ACE_Tests { + medicalHitpoints = QPATHTOF(dev\test_hitpointConfigs.sqf); }; diff --git a/addons/medical/data/IVBag_1000ml.p3d b/addons/medical/data/IVBag_1000ml.p3d deleted file mode 100644 index e76108b4ff9..00000000000 Binary files a/addons/medical/data/IVBag_1000ml.p3d and /dev/null differ diff --git a/addons/medical/data/IVBag_250ml.p3d b/addons/medical/data/IVBag_250ml.p3d deleted file mode 100644 index 1e727c45d80..00000000000 Binary files a/addons/medical/data/IVBag_250ml.p3d and /dev/null differ diff --git a/addons/medical/data/IVBag_500ml.p3d b/addons/medical/data/IVBag_500ml.p3d deleted file mode 100644 index 569244fe88f..00000000000 Binary files a/addons/medical/data/IVBag_500ml.p3d and /dev/null differ diff --git a/addons/medical/data/QuikClot.p3d b/addons/medical/data/QuikClot.p3d deleted file mode 100644 index 9fe747cb54f..00000000000 Binary files a/addons/medical/data/QuikClot.p3d and /dev/null differ diff --git a/addons/medical/data/ace_medcrate.p3d b/addons/medical/data/ace_medcrate.p3d deleted file mode 100644 index 6158b3c9729..00000000000 Binary files a/addons/medical/data/ace_medcrate.p3d and /dev/null differ diff --git a/addons/medical/data/adenosine.p3d b/addons/medical/data/adenosine.p3d deleted file mode 100644 index fa9fb72c84a..00000000000 Binary files a/addons/medical/data/adenosine.p3d and /dev/null differ diff --git a/addons/medical/data/atropine.p3d b/addons/medical/data/atropine.p3d deleted file mode 100644 index fa9fb72c84a..00000000000 Binary files a/addons/medical/data/atropine.p3d and /dev/null differ diff --git a/addons/medical/data/bandage.p3d b/addons/medical/data/bandage.p3d deleted file mode 100644 index 23540f10d99..00000000000 Binary files a/addons/medical/data/bandage.p3d and /dev/null differ diff --git a/addons/medical/data/bodybagItem.p3d b/addons/medical/data/bodybagItem.p3d deleted file mode 100644 index 73b3bfe404f..00000000000 Binary files a/addons/medical/data/bodybagItem.p3d and /dev/null differ diff --git a/addons/medical/data/bodybagItem_nohq.paa b/addons/medical/data/bodybagItem_nohq.paa deleted file mode 100644 index 5699ec5e044..00000000000 Binary files a/addons/medical/data/bodybagItem_nohq.paa and /dev/null differ diff --git a/addons/medical/data/bodybagItem_smdi.paa b/addons/medical/data/bodybagItem_smdi.paa deleted file mode 100644 index cf4cf805e3e..00000000000 Binary files a/addons/medical/data/bodybagItem_smdi.paa and /dev/null differ diff --git a/addons/medical/data/bodybagitem.rvmat b/addons/medical/data/bodybagitem.rvmat deleted file mode 100644 index a373bfaae8d..00000000000 --- a/addons/medical/data/bodybagitem.rvmat +++ /dev/null @@ -1,32 +0,0 @@ -ambient[]={1.000000,1.000000,1.000000,1.000000}; -diffuse[]={1.000000,1.000000,1.000000,1.000000}; -forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; -emmisive[]={0.000000,0.000000,0.000000,1.000000}; -specular[]={1.000000,1.000000,1.000000,1.000000}; -specularPower=20.000000; -PixelShaderID="NormalMapSpecularDIMap"; -VertexShaderID="NormalMap"; -class Stage1 -{ - texture="z\ace\addons\medical\data\bodybagItem_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1.000000,0.000000,0.000000}; - up[]={0.000000,1.000000,0.000000}; - dir[]={0.000000,0.000000,0.000000}; - pos[]={0.000000,0.000000,0.000000}; - }; -}; -class Stage2 -{ - texture="z\ace\addons\medical\data\bodybagItem_smdi.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1.000000,0.000000,0.000000}; - up[]={0.000000,1.000000,0.000000}; - dir[]={0.000000,0.000000,0.000000}; - pos[]={0.000000,0.000000,0.000000}; - }; -}; diff --git a/addons/medical/data/bodybagitem_co.paa b/addons/medical/data/bodybagitem_co.paa deleted file mode 100644 index d04f8ec64c5..00000000000 Binary files a/addons/medical/data/bodybagitem_co.paa and /dev/null differ diff --git a/addons/medical/data/epinephrine.p3d b/addons/medical/data/epinephrine.p3d deleted file mode 100644 index 45f0aee1f78..00000000000 Binary files a/addons/medical/data/epinephrine.p3d and /dev/null differ diff --git a/addons/medical/data/ivbag.rvmat b/addons/medical/data/ivbag.rvmat deleted file mode 100644 index c33c0ead903..00000000000 --- a/addons/medical/data/ivbag.rvmat +++ /dev/null @@ -1,99 +0,0 @@ -#define _ARMA_ - -class StageTI -{ - texture = "a3\data_f\default_ti_ca.paa"; -}; -ambient[] = {1,1,1,1}; -diffuse[] = {1,1,1,1}; -forcedDiffuse[] = {0,0,0,0}; -emmisive[] = {0,0,0,0}; -specular[] = {0.3,0.3,0.3,0.3}; -specularPower = 150; -PixelShaderID = "Super"; -VertexShaderID = "Super"; -class Stage1 -{ - texture = "z\ace\addons\medical\data\IVBag_nohq.paa"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; -class Stage2 -{ - texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; -class Stage3 -{ - texture = "#(argb,8,8,3)color(0,0,0,0,MC)"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; -class Stage4 -{ - texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; -class Stage5 -{ - texture = "#(argb,8,8,3)color(0,0.6,1,1,SMDI)"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; -class Stage6 -{ - texture = "#(ai,64,64,1)fresnelGlass(2)"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; -class Stage7 -{ - useWorldEnvMap = "true"; - texture = "a3\data_f\env_land_ca.paa"; - uvSource = "tex"; - class uvTransform - { - aside[] = {1,0,0}; - up[] = {0,1,0}; - dir[] = {0,0,1}; - pos[] = {0,0,0}; - }; -}; diff --git a/addons/medical/data/littergeneric.p3d b/addons/medical/data/littergeneric.p3d deleted file mode 100644 index 801a6f5a4f3..00000000000 Binary files a/addons/medical/data/littergeneric.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_Quikclot.p3d b/addons/medical/data/littergeneric_Quikclot.p3d deleted file mode 100644 index e54e3317216..00000000000 Binary files a/addons/medical/data/littergeneric_Quikclot.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_adenosine.p3d b/addons/medical/data/littergeneric_adenosine.p3d deleted file mode 100644 index 4490a11c0e1..00000000000 Binary files a/addons/medical/data/littergeneric_adenosine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_atropine.p3d b/addons/medical/data/littergeneric_atropine.p3d deleted file mode 100644 index 4490a11c0e1..00000000000 Binary files a/addons/medical/data/littergeneric_atropine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_bandages1.p3d b/addons/medical/data/littergeneric_bandages1.p3d deleted file mode 100644 index bdbc4471789..00000000000 Binary files a/addons/medical/data/littergeneric_bandages1.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_bandages2.p3d b/addons/medical/data/littergeneric_bandages2.p3d deleted file mode 100644 index 7b48675370f..00000000000 Binary files a/addons/medical/data/littergeneric_bandages2.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_bandages3.p3d b/addons/medical/data/littergeneric_bandages3.p3d deleted file mode 100644 index 7b48675370f..00000000000 Binary files a/addons/medical/data/littergeneric_bandages3.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_clean.p3d b/addons/medical/data/littergeneric_clean.p3d deleted file mode 100644 index 0ebddf30ca9..00000000000 Binary files a/addons/medical/data/littergeneric_clean.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_epinephrine.p3d b/addons/medical/data/littergeneric_epinephrine.p3d deleted file mode 100644 index 8246ef607e6..00000000000 Binary files a/addons/medical/data/littergeneric_epinephrine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_gloves.p3d b/addons/medical/data/littergeneric_gloves.p3d deleted file mode 100644 index ca920176882..00000000000 Binary files a/addons/medical/data/littergeneric_gloves.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_morphine.p3d b/addons/medical/data/littergeneric_morphine.p3d deleted file mode 100644 index 906280227c3..00000000000 Binary files a/addons/medical/data/littergeneric_morphine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_packingbandage.p3d b/addons/medical/data/littergeneric_packingbandage.p3d deleted file mode 100644 index 185b8a73ff2..00000000000 Binary files a/addons/medical/data/littergeneric_packingbandage.p3d and /dev/null differ diff --git a/addons/medical/data/model.cfg b/addons/medical/data/model.cfg deleted file mode 100644 index 58f288c3b93..00000000000 --- a/addons/medical/data/model.cfg +++ /dev/null @@ -1,77 +0,0 @@ -class CfgSkeletons { - class Default { - isDiscrete = 1; - skeletonInherit = ""; - skeletonBones[] = {}; - }; - - class ACE_Medcrate_Skeleton { - isDiscrete = 1; - skeletonInherit = "Default"; - skeletonBones[] = { - "cover","" - }; - }; -}; - -class CfgModels { - class Default { - sectionsInherit=""; - sections[] = {""}; - skeletonName = ""; - }; - - - class ace_medcrate: Default { - skeletonName = "ACE_Medcrate_Skeleton"; - sectionsInherit = "Default"; - - class Animations { - class Cover { - type = "rotationX"; - source = "user"; - selection = "cover"; - axis = "cover_axis"; - memory = 1; - sourceAddress = "clamp"; - minValue = 0; - maxValue = 1; - angle0 = "0"; - angle1 = "rad + 240"; - }; - }; - }; - - class adenosine: Default {}; - class atropine: Default {}; - class bandage: Default {}; - class bodybagItem: Default {}; - class epinephrine: Default {}; - - class IVBagBase: Default { - sectionsInherit = ""; - sections[] = {"camo"}; - skeletonName = ""; - }; - class IVBag_250ml: IVBagBase {}; - class IVBag_500ml: IVBagBase {}; - class IVBag_1000ml: IVBagBase {}; - - class littergeneric: Default {}; - class littergeneric_adenosine: Default {}; - class littergeneric_atropine: Default {}; - class littergeneric_bandages1: Default {}; - class littergeneric_bandages2: Default {}; - class littergeneric_bandages3: Default {}; - class littergeneric_clean: Default {}; - class littergeneric_epinephrine: Default {}; - class littergeneric_gloves: Default {}; - class littergeneric_morphine: Default {}; - class littergeneric_packingbandage: Default {}; - class littergeneric_Quikclot: Default {}; - class morphine: Default {}; - class packingbandage: Default {}; - class QuikClot: Default {}; - class surgical_kit: Default {}; - class tourniquet: Default {}; -}; diff --git a/addons/medical/data/morphine.p3d b/addons/medical/data/morphine.p3d deleted file mode 100644 index 3328630ac99..00000000000 Binary files a/addons/medical/data/morphine.p3d and /dev/null differ diff --git a/addons/medical/data/packingbandage.p3d b/addons/medical/data/packingbandage.p3d deleted file mode 100644 index 0e083c4766a..00000000000 Binary files a/addons/medical/data/packingbandage.p3d and /dev/null differ diff --git a/addons/medical/data/packingbandage.rvmat b/addons/medical/data/packingbandage.rvmat deleted file mode 100644 index ba2fdfb2e6e..00000000000 --- a/addons/medical/data/packingbandage.rvmat +++ /dev/null @@ -1,32 +0,0 @@ -ambient[]={1,1,1,1}; -diffuse[]={0.5,0.5,0.5,1}; -forcedDiffuse[]={0.5,0.5,0.5,0}; -emmisive[]={0,0,0,0}; -specular[]={0,0,0,0}; -specularPower=0; -PixelShaderID="NormalMapSpecularDIMap"; -VertexShaderID="NormalMap"; -class Stage1 -{ - texture="z\ace\addons\medical\data\packingbandage_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,1}; - pos[]={0,0,0}; - }; -}; -class Stage2 -{ - texture= "#(argb,8,8,3)color(0,0,0,1,SMDI)"; - uvSource="tex"; - class uvTransform - { - aside[]={0,0,0}; - up[]={0,0,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; diff --git a/addons/medical/data/quikclot.rvmat b/addons/medical/data/quikclot.rvmat deleted file mode 100644 index 778e9812e18..00000000000 --- a/addons/medical/data/quikclot.rvmat +++ /dev/null @@ -1,82 +0,0 @@ -class StageTI -{ - texture="a3\data_f\default_ti_ca.paa"; -}; -ambient[]={1,1,1,1}; -diffuse[]={1,1,1,1}; -forcedDiffuse[]={0,0,0,0}; -emmisive[]={0,0,0,1}; -specular[]={0.050000008,0.050000008,0.050000008,1}; -specularPower=50; -PixelShaderID="Super"; -VertexShaderID="Super"; -class Stage1 -{ - texture="z\ace\addons\medical\data\quikclot_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage2 -{ - texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; - uvSource="tex"; - class uvTransform - { - aside[]={0,9,0}; - up[]={4.5,0,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage3 -{ - texture="#(argb,8,8,3)color(0,0,0,0)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage4 -{ - texture="#(argb,8,8,3)color(1,1,1,1,AS)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage5 -{ - texture="#(argb,8,8,3)color(1,1,1,1,SMDI)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage6 -{ - texture="#(ai,64,64,1)fresnel(1.5,1.22)"; - uvSource="none"; -}; -class Stage7 -{ - texture="a3\data_f\env_land_co.paa"; - uvSource="none"; -}; diff --git a/addons/medical/data/surgical_kit.p3d b/addons/medical/data/surgical_kit.p3d deleted file mode 100644 index f820ea60789..00000000000 Binary files a/addons/medical/data/surgical_kit.p3d and /dev/null differ diff --git a/addons/medical/data/surgical_kit.rvmat b/addons/medical/data/surgical_kit.rvmat deleted file mode 100644 index 71d266f6689..00000000000 --- a/addons/medical/data/surgical_kit.rvmat +++ /dev/null @@ -1,92 +0,0 @@ -ambient[]={1,1,1,1}; -diffuse[]={1,1,1,1}; -forcedDiffuse[]={0,0,0,0}; -emmisive[]={0,0,0,1}; -specular[]={0.70399898,0.70399898,0.70399898,0}; -specularPower=70; -PixelShaderID="Super"; -VertexShaderID="Super"; -class Stage1 -{ - texture="z\ace\addons\medical\data\surgical_kit_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage2 -{ - texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage3 -{ - texture="#(argb,8,8,3)color(0,0,0,0,MC)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage4 -{ - texture="#(argb,8,8,3)color(1,1,1,1,AS)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage5 -{ - texture="#(argb,8,8,3)color(0,0.05,1,1,SMDI)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage6 -{ - texture="#(ai,32,128,1)fresnel(0.98,1.02)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage7 -{ - texture="z\ace\addons\apl\data\env_co.tga"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; diff --git a/addons/medical/data/tourniquet.p3d b/addons/medical/data/tourniquet.p3d deleted file mode 100644 index 94a7e4c8309..00000000000 Binary files a/addons/medical/data/tourniquet.p3d and /dev/null differ diff --git a/addons/medical/dev/debugDisplay.sqf b/addons/medical/dev/debugDisplay.sqf new file mode 100644 index 00000000000..541aaaccbad --- /dev/null +++ b/addons/medical/dev/debugDisplay.sqf @@ -0,0 +1,33 @@ +#include "\z\ace\addons\medical\script_component.hpp" + +[{!isNull findDisplay 46}, { + INFO("Creating Debug Display"); + if (!isNull (uiNamespace getVariable [QGVAR(debugControl), controlNull])) then { + ctrlDelete (uiNamespace getVariable [QGVAR(debugControl), controlNull]); // cleanup on SP Restart + }; + private _ctrl = findDisplay 46 ctrlCreate ["RscText", -1]; + _ctrl ctrlSetPosition [ + safeZoneX, + safeZoneY, + safeZoneW, + 40 * pixelH + ]; + _ctrl ctrlSetFontHeight (40 * pixelH); + _ctrl ctrlSetTextColor [0.6, 0, 0, 1]; + _ctrl ctrlCommit 0; + uiNamespace setVariable [QGVAR(debugControl), _ctrl]; + + [{ + private _playerState = [ACE_player, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + (uiNamespace getVariable [QGVAR(debugControl), controlNull]) ctrlSetText format ["Player state: %1", _playerState]; + + if (!isNull cursorTarget && {cursorTarget isKindOf "CAManBase"}) then { + private _targetState = [cursorTarget, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + private _targetStateAI = ""; + if (!isNil QEGVAR(medical_ai,stateMachine)) then { + _targetStateAI = [cursorTarget, EGVAR(medical_ai,stateMachine)] call CBA_statemachine_fnc_getCurrentState; + }; + drawIcon3D ["", [0.6, 0, 0, 1], cursorTarget modelToWorldVisual (cursorTarget selectionPosition "pelvis"), 0, 0, 0, format ["State: %1 / %2", _targetState,_targetStateAI], 2, 40 * pixelH, "RobotoCondensed"]; + }; + }, 0 ,[]] call CBA_fnc_addPerFrameHandler; +}, []] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/medical/dev/reportSettings.sqf b/addons/medical/dev/reportSettings.sqf new file mode 100644 index 00000000000..97350121a36 --- /dev/null +++ b/addons/medical/dev/reportSettings.sqf @@ -0,0 +1,14 @@ +#include "\z\ace\addons\medical\script_component.hpp" +// Dumps info on all non-default medical settings + +[{ + private _medicalSettings = cba_settings_allSettings select {(_x select [0,11]) == "ace_medical"}; + INFO_1("-- Checking %1 medical Settings --",count _medicalSettings); + { + private _currentValue = missionNamespace getVariable [_x, "$"]; + private _defaultValue = (cba_settings_default getVariable [_x, []]) param [0, "#"]; + if !(_currentValue isEqualTo _defaultValue) then { + diag_log text format ["%1: [Current %2] [Default: %3]", _x, _currentValue, _defaultValue]; + }; + } forEach _medicalSettings; +}, nil, 2] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/dev/test_hitpointConfigs.sqf b/addons/medical/dev/test_hitpointConfigs.sqf new file mode 100644 index 00000000000..2067abcd662 --- /dev/null +++ b/addons/medical/dev/test_hitpointConfigs.sqf @@ -0,0 +1,43 @@ +// PabstMirror, commy2 +// ["medicalHitpoints"] call ace_common_fnc_runTests; +// call compile preprocessFileLineNumbers "\z\ace\addons\medical\dev\test_hitpointConfigs.sqf" + +#include "\z\ace\addons\medical\script_component.hpp" + +// UAV-AI should get filtered by scope check + +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgVehicles = configFile >> "CfgVehicles"; + +private _uniforms = "getNumber (_x >> 'scope') == 2 && {configName _x isKindOf ['Uniform_Base', _cfgWeapons]}" configClasses _cfgWeapons; +private _units = _uniforms apply {_cfgVehicles >> getText (_x >> "ItemInfo" >> "uniformClass")}; +if (param [0, false]) then { // Check all units (if naked) + INFO("checking ALL units"); + _units append ((configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'scope')) == 2} && {configName _x isKindOf 'CAManBase'}", true])); +}; + +INFO_1("Checking uniforms for correct medical hitpoints [%1 units]",count _units); + +private _testPass = true; +{ + private _typeOf = configName _x; + private _hitpoints = (configProperties [_x >> "HitPoints", "isClass _x", true]) apply {configName _x}; + + // _typeOf createUnit [position player, group player, "z = this"]; + // deleteVehicle z; + + private _lastHitpoint = (_hitpoints param [(count _hitpoints) - 1, "#array"]); + if (_lastHitpoint != "ACE_HDBracket") then { + WARNING_2("%1 has bad last hitpoint: %2",_typeOf,_hitpoints); + _testPass = false; + }; + + if (((_hitpoints findIf {_x == "HitLeftArm"}) == -1) || {(_hitpoints findIf {_x == "HitRightArm"}) == -1} + || {(_hitpoints findIf {_x == "HitLeftLeg"}) == -1} || {(_hitpoints findIf {_x == "HitRightLeg"}) == -1} + || {(_hitpoints findIf {_x == "HitHead"}) == -1} || {(_hitpoints findIf {_x == "HitBody"}) == -1}) then { + WARNING_2("%1 missing ace hitpoints: %2",_typeOf,_hitpoints); + _testPass = false; + }; +} forEach _units; + +_testPass diff --git a/addons/medical/dev/watchVariable.sqf b/addons/medical/dev/watchVariable.sqf new file mode 100644 index 00000000000..0d02a74e193 --- /dev/null +++ b/addons/medical/dev/watchVariable.sqf @@ -0,0 +1,161 @@ +#include "\z\ace\addons\medical\script_component.hpp" + +if (missionNamespace getVariable [QGVAR(dev_watchVariableRunning), false]) exitWith {}; +GVAR(dev_watchVariableRunning) = true; + +["medical", { + + // Hide when patient display is up because they might overlap + private _display = uiNamespace getVariable [QEGVAR(medical_gui,RscPatientInfo), displayNull]; + if (!isNull _display) exitWith {"Paused"}; + + private _unit = cursorTarget; + if (!(_unit isKindOf "CAManBase")) then {_unit = cursorObject}; + if (!(_unit isKindOf "CAManBase")) then {_unit = ACE_player}; + if ((_unit != ACE_player) && {IS_UNCONSCIOUS(ACE_player)}) then {_unit = ACE_player}; + if (!(_unit isKindOf "CAManBase")) exitWith {"No Unit?"}; + + private _return = []; + + // Header: + _return pushBack format ["%2 [%3]", (["00FF00", "0000FF"] select (_unit == ACE_player)), [_unit] call EFUNC(common,getName), typeOf _unit]; + _return pushBack ""; + + // State: + private _targetState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + if (!local _unit) then {_targetState = "NotLocal";}; + private _color = switch (_targetState) do {case "Default": {"33FF33"}; case "Injured": {"FF3333"}; case "Unconscious": {"FF8833"}; case "CardiacArrest": {"FF33AA"}; default {"555555"}}; + _return pushBack format ["State: %2", _color, _targetState]; + private _hasStableVitals = ["N", "Y"] select ([_unit] call EFUNC(medical_status,hasStableVitals)); + private _hasStableCondition = ["N", "Y"] select ([_unit] call EFUNC(medical_status,isInStableCondition)); + private _unconcFlag = if IS_UNCONSCIOUS(_unit) then {"[U]"} else {""}; + private _timeLeft = _unit getVariable [QEGVAR(medical_statemachine,cardiacArrestTimeLeft), -1]; + private _cardiactArrestFlag = if IN_CRDC_ARRST(_unit) then {format ["[CA %1]", _timeLeft toFixed 1]} else {""}; + _return pushBack format ["[StableVitals: %1] [StableCon: %2] %3 %4", _hasStableVitals, _hasStableCondition, _unconcFlag, _cardiactArrestFlag]; + + // Blood: + private _bloodVolume = GET_BLOOD_VOLUME(_unit); + private _woundBleeding = GET_WOUND_BLEEDING(_unit); + private _bloodLoss = GET_BLOOD_LOSS(_unit); + private _hemorrhage = GET_HEMORRHAGE(_unit); + private _isBleeding = if (IS_BLEEDING(_unit)) then {"Bleeding"} else {""}; + private _secondsToHeartstop = if (_bloodLoss != 0) then {format ["[Time Left: %1 sec]", (((_bloodVolume - BLOOD_VOLUME_CLASS_4_HEMORRHAGE) max 0) / _bloodLoss) toFixed 0]} else {""}; + _return pushBack format ["Blood: %1 [Hemorrhage: %2] %3", _bloodVolume toFixed 3, _hemorrhage, _isBleeding]; + _return pushBack format [" - [W: %1 T: %2] %3", _woundBleeding toFixed 4, _bloodLoss toFixed 4, _secondsToHeartstop]; + + // Heart: + private _cardiacOutput = [_unit] call EFUNC(medical_status,getCardiacOutput); + private _heartRate = GET_HEART_RATE(_unit); + GET_BLOOD_PRESSURE(_unit) params ["_bpLow", "_bpHigh"]; + _return pushBack format ["CardiacOutput %1", _cardiacOutput toFixed 5]; + _return pushBack format [" - [HR: %1] [BP: %2 / %3]", _heartRate toFixed 1, _bpHigh toFixed 1, _bpLow toFixed 1]; + + // Pain: + private _pain = GET_PAIN(_unit); + private _painSuppress = GET_PAIN_SUPPRESS(_unit); + private _painLevel = GET_PAIN_PERCEIVED(_unit); + private _isInPain = IS_IN_PAIN(_unit); + _return pushBack format ["Effective Pain: %1 [%2]", _painLevel toFixed 3, _isInPain]; + _return pushBack format [" - [Pain: %1] [Suppress: %2]", _pain toFixed 3, _painSuppress toFixed 3]; + + // Damage: + private _damage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; + private _limping = if (_unit getVariable [QEGVAR(medical,isLimping), false]) then {"[ Limping ]"} else {""}; + _return pushBack format ["BodyPartDamage: [H: %1] [B: %2]", (_damage select 0) toFixed 2, (_damage select 1) toFixed 2]; + _return pushBack format ["[LA:%1] [RA: %2] [LL:%3] [RL: %4]", (_damage select 2) toFixed 2, (_damage select 3) toFixed 2, (_damage select 4) toFixed 2, (_damage select 5) toFixed 2]; + + _return pushBack format ["Hitpoints: [HHed:%1] [HBod: %2]", (_unit getHitPointDamage "HitHead") toFixed 2, (_unit getHitPointDamage "HitBody") toFixed 2]; + _return pushBack format ["[HHnd:%1] [HLeg: %2] %3", (_unit getHitPointDamage "HitHands") toFixed 2, (_unit getHitPointDamage "HitLegs") toFixed 2, _limping]; + + private _fractures = GET_FRACTURES(_unit); + private _canSprint = if (isSprintAllowed _unit) then {""} else {"[Sprint Blocked]"}; + _return pushBack format ["Fractures: %1 %2", _fractures, _canSprint]; + + + // Tourniquets: + _return pushBack "------- Tourniquets: -------"; + private _tourniquets = GET_TOURNIQUETS(_unit); + private _occludedMedications = _unit getVariable [QEGVAR(medical,occludedMedications), []]; + { + private _tPartNum = _forEachIndex; + if (_x != 0) then { + _return pushBack format ["%1 [Time On: %2]", ALL_SELECTIONS select _tPartNum, (CBA_missionTime - _x) toFixed 1]; + }; + { + _x params ["_medPartNum", "_medClassname"]; + if (_medPartNum == _tPartNum) then { + _return pushBack format [" - Occluded Med: %1", _medClassname]; + }; + } forEach _occludedMedications; + } forEach _tourniquets; + + + // Wounds: + _return pushBack "------- Open Wounds: -------"; + private _wounds = GET_OPEN_WOUNDS(_unit); + { + _x params ["_xClassID", "_xBodyPartN", "_xAmountOf", "_xBleeding", "_xDamage"]; + _return pushBack format ["%1: [%2] [x%3] [Bld: %4] [Dmg: %5]", ALL_SELECTIONS select _xBodyPartN, _xClassID, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _wounds; + + // Bandaged Wounds: + _return pushBack "------- Bandaged Wounds: -------"; + private _wounds = GET_BANDAGED_WOUNDS(_unit); + { + _x params ["_xClassID", "_xBodyPartN", "_xAmountOf", "_xBleeding", "_xDamage"]; + _return pushBack format ["%1: [%2] [x%3] [Bld: %4] [Dmg: %5]", ALL_SELECTIONS select _xBodyPartN, _xClassID, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _wounds; + + // Stitched Wounds: + _return pushBack "------- Stitched Wounds: -------"; + private _wounds = GET_STITCHED_WOUNDS(_unit); + { + _x params ["_xClassID", "_xBodyPartN", "_xAmountOf", "_xBleeding", "_xDamage"]; + _return pushBack format ["%1: [%2] [x%3] [Bld: %4] [Dmg: %5]", ALL_SELECTIONS select _xBodyPartN, _xClassID, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _wounds; + + // IVs: + _return pushBack "------- IVs: -------"; + private _ivBags = _unit getVariable [QEGVAR(medical,ivBags), []]; + { + _x params ["_xVolumeAdded", "_xType", "_xBodyPartN"]; + _return pushBack format ["%1: %2 [%3 ml]", ALL_SELECTIONS select _xBodyPartN, _xType, _xVolumeAdded]; + } forEach _ivBags; + + // Medications: + _return pushBack "------- Medications: -------"; + private _hrTargetAdjustment = 0; + private _painSupressAdjustment = 0; + private _peripheralResistanceAdjustment = 0; + private _uniqueMedications = []; + private _rawMedications = (_unit getVariable [VAR_MEDICATIONS, []]) apply { + _x params ["_medication", "_timeAdded", "_timeTillMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust"]; + _uniqueMedications pushBackUnique _medication; + private _timeInSystem = CBA_missionTime - _timeAdded; + private _effectRatio = (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + _hrTargetAdjustment = _hrTargetAdjustment + _hrAdjust * _effectRatio; + _painSupressAdjustment = _painSupressAdjustment + _painAdjust * _effectRatio; + _peripheralResistanceAdjustment = _peripheralResistanceAdjustment + _flowAdjust * _effectRatio; + format ["%1 [%2 / %3][%4][%5,%6,%7]",_medication,_timeInSystem toFixed 0,_maxTimeInSystem toFixed 0, _effectRatio toFixed 2, _hrAdjust toFixed 1, _painAdjust toFixed 2, _flowAdjust toFixed 1]; + }; + _return pushBack format ["Adjusts: [HR %1][PS %2][PR %3]", _hrTargetAdjustment toFixed 2, _painSupressAdjustment toFixed 2, _peripheralResistanceAdjustment toFixed 2]; + { + private _medicationCount = [_unit, _x, true] call EFUNC(medical_status,getMedicationCount); + private _medicationEffectiveness = [_unit, _x, false] call EFUNC(medical_status,getMedicationCount); + _return pushBack format ["-%1: C: %2 - E: %3", _x, _medicationCount toFixed 2, _medicationEffectiveness toFixed 2]; + } forEach _uniqueMedications; + _return pushBack "------- Medications Raw: -------"; + _return append _rawMedications; + + if (_unit isEqualTo ACE_player) then { + _return pushBack format ["ACE_setCustomAimCoef: %1", [missionNamespace, "ACE_setCustomAimCoef", "max"] call EFUNC(common,arithmeticGetResult)]; + }; + + _return pushBack format ["%1 - %2",lifeState _unit, animationState _unit]; + + // Footer: + _return pushBack ""; + + // Return: + _return joinString "
" +}, [40]] call EFUNC(common,watchVariable); diff --git a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf deleted file mode 100644 index dfd930451f6..00000000000 --- a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the blood pressure of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckBloodPressure - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName"]; -if (local _target) then { - [QGVAR(actionCheckBloodPressureLocal), [_caller, _target, _selectionName]] call CBA_fnc_localEvent; -} else { - [QGVAR(actionCheckBloodPressureLocal), [_caller, _target, _selectionName], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf deleted file mode 100644 index aa87f4889d8..00000000000 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ /dev/null @@ -1,66 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Local callback for checking the blood pressure of a patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckBloodPressureLocal - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName"]; - -private _bloodPressure = if (!alive _target) then { - [0,0] -} else { - [_target] call FUNC(getBloodPressure) -}; -_bloodPressure params [ "_bloodPressureLow", "_bloodPressureHigh"]; -private _output = ""; -private _logOutPut = ""; -if ([_caller] call FUNC(isMedic)) then { - _output = LSTRING(Check_Bloodpressure_Output_1); - _logOutPut = format["%1/%2",round(_bloodPressureHigh),round(_bloodPressureLow)]; -} else { - if (_bloodPressureHigh > 20) then { - _output = LSTRING(Check_Bloodpressure_Output_2); - _logOutPut = LSTRING(Check_Bloodpressure_Low); - if (_bloodPressureHigh > 100) then { - _output = LSTRING(Check_Bloodpressure_Output_3); - _logOutPut = LSTRING(Check_Bloodpressure_Normal); - if (_bloodPressureHigh > 160) then { - _output = LSTRING(Check_Bloodpressure_Output_4); - _logOutPut = LSTRING(Check_Bloodpressure_High); - }; - - }; - } else { - if (random(10) > 3) then { - _output = LSTRING(Check_Bloodpressure_Output_5); - _logOutPut = LSTRING(Check_Bloodpressure_NoBloodpressure); - } else { - _output = LSTRING(Check_Bloodpressure_Output_6); - //Fail to find pressure, no logoutput - }; - }; -}; - -if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { - _output = LSTRING(Check_Bloodpressure_Output_6); - _logOutPut = ""; -}; - -[QEGVAR(common,displayTextStructured), [[_output, [_target] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)], 1.75, _caller], [_caller]] call CBA_fnc_targetEvent; - -if (_logOutPut != "") then { - [_target,"activity", LSTRING(Check_Bloodpressure_Log), [[_caller, false, true] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); - [_target,"quick_view", LSTRING(Check_Bloodpressure_Log), [[_caller, false, true] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); -}; diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf deleted file mode 100644 index da0711d280b..00000000000 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the pulse or heart rate of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckPulse - * - * Public: No - */ - -params ["_caller","_target", "_selectionName"]; -if (local _target) then { - [QGVAR(actionCheckPulseLocal), [_caller, _target, _selectionName]] call CBA_fnc_localEvent; -} else { - [QGVAR(actionCheckPulseLocal), [_caller, _target, _selectionName], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf deleted file mode 100644 index 6e8989acc36..00000000000 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ /dev/null @@ -1,58 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Local callback for checking the pulse of a patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckPulseLocal - * - * Public: No - */ - -params ["_caller", "_unit", "_selectionName"]; - -private _heartRate = _unit getVariable [QGVAR(heartRate), 80]; -if (!alive _unit) then { - _heartRate = 0; -}; -private _heartRateOutput = LSTRING(Check_Pulse_Output_5); -private _logOutPut = LSTRING(Check_Pulse_None); - -if (_heartRate > 1.0) then { - if ([_caller] call FUNC(isMedic)) then { - _heartRateOutput = LSTRING(Check_Pulse_Output_1); - _logOutPut = format["%1",round(_heartRate)]; - } else { - // non medical personel will only find a pulse/HR - _heartRateOutput = LSTRING(Check_Pulse_Output_2); - _logOutPut = LSTRING(Check_Pulse_Weak); - if (_heartRate > 60) then { - if (_heartRate > 100) then { - _heartRateOutput = LSTRING(Check_Pulse_Output_3); - _logOutPut = LSTRING(Check_Pulse_Strong); - } else { - _heartRateOutput = LSTRING(Check_Pulse_Output_4); - _logOutPut = LSTRING(Check_Pulse_Normal); - }; - }; - }; -}; - -if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { - _heartRateOutput = LSTRING(Check_Pulse_Output_5); - _logOutPut = LSTRING(Check_Pulse_None); -}; - -[QEGVAR(common,displayTextStructured), [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; - -if (_logOutPut != "") then { - [_unit,"activity", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); - [_unit,"quick_view", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); -}; diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf deleted file mode 100644 index 58e8219be99..00000000000 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the response status of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckResponse - * - * Public: No - */ - -params ["_caller", "_target"]; - -private _output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select ([_target] call EFUNC(common,isAwake)); - -[QEGVAR(common,displayTextStructured), [[_output, [_target] call EFUNC(common,getName)], 2, _caller], [_caller]] call CBA_fnc_targetEvent; - -[_target ,"activity", _output, [[_target, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "quick_view", _output, [[_target, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical/functions/fnc_actionDiagnose.sqf b/addons/medical/functions/fnc_actionDiagnose.sqf deleted file mode 100644 index bd51233ddda..00000000000 --- a/addons/medical/functions/fnc_actionDiagnose.sqf +++ /dev/null @@ -1,47 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for diagnosing in basic medical - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionDiagnose - * - * Public: No - */ - -params ["_caller", "_target"]; - -private _genericMessages = [LSTRING(diagnoseMessage), [_target] call EFUNC(common,getName)]; - -if (alive _target) then { - _genericMessages pushBack LSTRING(diagnoseAlive); -} else { - _genericMessages pushBack LSTRING(diagnoseDead); -}; - -if (_target getVariable[QGVAR(hasLostBlood), 0] > 0) then { - if (_target getVariable[QGVAR(hasLostBlood), 0] > 1) then { - _genericMessages pushBack LSTRING(lostBloodALot); - } else { - _genericMessages pushBack LSTRING(lostBlood); - }; -} else { - _genericMessages pushBack LSTRING(noBloodloss); -}; - -if (alive _target) then { - if (_target getVariable[QGVAR(hasPain), false]) then { - _genericMessages pushBack LSTRING(inPain); - } else { - _genericMessages pushBack LSTRING(noPain); - }; -}; - -[QEGVAR(common,displayTextStructured), [_genericMessages, 3.0, _caller], [_caller]] call CBA_fnc_targetEvent; diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf deleted file mode 100644 index 95b7cbf8a37..00000000000 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for loading an unconscious or dead unit in the nearest vehicle, or _vehicle if given. - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: The vehicle (default: objNull) - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionLoadUnit - * - * Public: No - */ - -params ["_caller", "_target", ["_vehicle", objNull]]; - -if ([_target] call EFUNC(common,isAwake)) exitWith { - [QEGVAR(common,displayTextStructured), [[LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; -}; -if ([_target] call FUNC(isBeingCarried)) then { - [_caller, _target] call EFUNC(dragging,dropObject_carry); -}; -if ([_target] call FUNC(isBeingDragged)) then { - [_caller, _target] call EFUNC(dragging,dropObject); -}; - -[_caller, _target, _vehicle] call EFUNC(common,loadPerson); diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf deleted file mode 100644 index b4f53370aa3..00000000000 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ /dev/null @@ -1,51 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Replace a (dead) body by a body bag - * - * Arguments: - * 0: The actor - * 1: The patient - * - * Return Value: - * body bag (will return objNull when run where target is not local) - * - * Example: - * [player, cursorTarget] call ace_medical_fnc_actionPlaceInBodyBag - * - * Public: Yes - */ - -params ["_caller", "_target"]; -TRACE_2("params",_caller,_target); - -if (!local _target) exitWith { - TRACE_1("running where local",local _target); - [QGVAR(actionPlaceInBodyBag), [_caller, _target], [_target]] call CBA_fnc_targetEvent; - objNull -}; - -if (alive _target) then { - TRACE_1("manually killing with setDead",_target); - [_target, true] call FUNC(setDead); -}; - -private _position = (getPosASL _target) vectorAdd [0, 0, 0.2]; - -private _headPos = _target modelToWorldVisual (_target selectionPosition "head"); -private _spinePos = _target modelToWorldVisual (_target selectionPosition "Spine3"); -private _dirVect = _headPos vectorFromTo _spinePos; -private _direction = _dirVect call CBA_fnc_vectDir; - -//move the body away now, so it won't physX the bodyBag object (this setPos seems to need to be called where object is local) -_target setPosASL [-5000, -5000, 0]; - -private _bodyBag = createVehicle ["ACE_bodyBagObject", _position, [], 0, "NONE"]; - -// prevent body bag from flipping -_bodyBag setPosASL _position; -_bodyBag setDir _direction; - -["ace_placedInBodyBag", [_target, _bodyBag]] call CBA_fnc_globalEvent; //hide and delete body on server - -_bodyBag diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf deleted file mode 100644 index 0e7d668b3ae..00000000000 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ /dev/null @@ -1,56 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for removing the tourniquet on specified selection - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection"] call ace_medical_fnc_actionRemoveTourniquet - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName"]; -TRACE_3("params",_caller,_target,_selectionName); - -// grab the required data -private _part = [_selectionName] call FUNC(selectionNameToNumber); -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; - -// Check if there is a tourniquet on this bodypart -if ((_tourniquets select _part) == 0) exitWith { - [QEGVAR(common,displayTextStructured), [LSTRING(noTourniquetOnBodyPart), 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; -}; - -// Removing the tourniquet -_tourniquets set [_part, 0]; -_target setVariable [QGVAR(tourniquets), _tourniquets, true]; - -// Adding the tourniquet item to the caller -_caller addItem "ACE_tourniquet"; - -//Handle all injected medications now that blood is flowing: -private _delayedMedications = _target getVariable [QGVAR(occludedMedications), []]; -private _updatedArray = false; -TRACE_2("meds",_part,_delayedMedications); -{ - _x params ["", "", "_medPartNum"]; - if (_part == _medPartNum) then { - TRACE_1("delayed medication call after tourniquet removeal",_x); - [QGVAR(treatmentAdvanced_medicationLocal), _x, [_target]] call CBA_fnc_targetEvent; - _delayedMedications set [_forEachIndex, -1]; - _updatedArray = true; - }; -} forEach _delayedMedications; - -if (_updatedArray) then { - _delayedMedications = _delayedMedications - [-1]; - _target setVariable [QGVAR(occludedMedications), _delayedMedications, true]; -}; diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical/functions/fnc_actionUnloadUnit.sqf deleted file mode 100644 index e98c01fd2b4..00000000000 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for unloading an unconscious or dead unit from a vechile - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Drag after unload (default: false) - * - * Return Value: - * None - * - * Example: - * [bob, kevin, false] call ACE_medical_fnc_actionUnloadUnit - * - * Public: No - */ - -params ["_caller", "_target", ["_drag", false]]; - -// cannot unload a unit not in a vehicle. -if (vehicle _target == _target) exitWith {}; -if (([_target] call EFUNC(common,isAwake))) exitWith {}; - -["ace_unloadPersonEvent", [_target, vehicle _target, _caller], _target] call CBA_fnc_targetEvent; diff --git a/addons/medical/functions/fnc_addDamageToUnit.sqf b/addons/medical/functions/fnc_addDamageToUnit.sqf index 609c636bfa3..f571d27726c 100644 --- a/addons/medical/functions/fnc_addDamageToUnit.sqf +++ b/addons/medical/functions/fnc_addDamageToUnit.sqf @@ -2,61 +2,68 @@ /* * Author: PabstMirror * Manually Apply Damage to a unit (can cause lethal damage) - * NOTE: because of caching, this will not have instant effects (~3 frame delay) * * Arguments: * 0: The Unit * 1: Damage to Add - * 2: Selection ("head", "body", "hand_l", "hand_r", "leg_l", "leg_r") + * 2: Body part ("Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg") * 3: Projectile Type + * 4: Source + * 5: Non-directional damage source array (Optional) * * Return Value: - * HandleDamage's return + * Successful * * Example: - * [player, 0.8, "leg_r", "bullet"] call ace_medical_fnc_addDamageToUnit - * [cursorTarget, 1, "body", "stab"] call ace_medical_fnc_addDamageToUnit + * [player, 0.8, "rightleg", "bullet"] call ace_medical_fnc_addDamageToUnit + * [cursorTarget, 1, "body", "stab", player] call ace_medical_fnc_addDamageToUnit * * Public: Yes */ // #define DEBUG_TESTRESULTS -params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_selection", "", [""]], ["_typeOfDamage", "", [""]]]; -TRACE_4("params",_unit,_damageToAdd,_selection,_typeOfDamage); +params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]], ["_instigator", objNull, [objNull]], ["_damageSelectionArray", [], [[]]]]; +TRACE_6("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator,_damageSelectionArray); -_selection = toLower _selection; -if ((isNull _unit) || {!local _unit} || {!alive _unit}) exitWith {ERROR_1("addDamageToUnit - badUnit %1", _this); -1}; -if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); -1}; -if (!(_selection in GVAR(SELECTIONS))) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); -1}; +_bodyPart = toLower _bodyPart; +private _bodyPartIndex = ALL_BODY_PARTS find _bodyPart; +if (_bodyPartIndex < 0) then { _bodyPartIndex = ALL_SELECTIONS find _bodyPart; }; // 2nd attempt with selection names ("hand_l", "hand_r", "leg_l", "leg_r") +if (_bodyPartIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); false}; +if (isNull _unit || {!local _unit} || {!alive _unit}) exitWith {ERROR_2("addDamageToUnit - badUnit %1 [local %2]", _this, local _unit); false}; +if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); false}; -//Get the hitpoint and the index -private _hitpoint = [_unit, _selection, true] call ace_medical_fnc_translateSelections; -(getAllHitPointsDamage _unit) params [["_allHitPoints", []]]; -private _hitpointIndex = -1; -{ //case insensitive find - if (_x == _hitpoint) exitWith {_hitpointIndex = _forEachIndex;}; -} forEach _allHitPoints; -if (_hitpointIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad hitpointIndex %1", _this); -1}; +// Extension is case sensitive and expects this format (different from ALL_BODY_PARTS) +_bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex; -private _currentDamage = _unit getHitIndex _hitpointIndex; +if (_damageSelectionArray isEqualTo []) then { // this will only be used if damage type is not location specific + _damageSelectionArray = [HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1, HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1]; +}; -#ifdef DEBUG_TESTRESULTS -private _checkAtFrame = diag_frameno + 5; -private _partNumber = [_selection] call FUNC(selectionNameToNumber); -private _startDmg = (_unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _partNumber; -private _debugCode = { - params ["", "_unit", "_startDmg", "_damageToAdd", "_partNumber"]; - private _endDmg = (_unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _partNumber; - if ((!alive _unit) || {_endDmg > _startDmg}) then { - INFO_6("addDamageToUnit - PASSED - [unit:%1, partNo:%2, addDmg:%3] results:[alive:%4 old:%5 new:%6]", _unit, _partNumber, _damageToAdd, alive _unit, _startDmg, _endDmg); - } else { - ERROR_6("addDamageToUnit - FAILED - [unit:%1, partNo:%2, addDmg:%3] results:[alive:%4 old:%5 new:%6]", _unit, _partNumber, _damageToAdd, alive _unit, _startDmg, _endDmg); - }; +if (!isNull _instigator) then { + _unit setVariable [QEGVAR(medical,lastDamageSource), _instigator]; + _unit setVariable [QEGVAR(medical,lastInstigator), _instigator]; }; -[{diag_frameno > (_this select 0)}, _debugCode, [_checkAtFrame, _unit, _startDmg, _damageToAdd, _partNumber]] call CBA_fnc_waitUntilAndExecute; + +#ifdef DEBUG_TESTRESULTS +private _startDmg = +(_unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]); +private _startPain = GET_PAIN(_unit); #endif -private _return = [_unit, _selection, (_currentDamage + _damageToAdd), _unit, _typeOfDamage, _hitpointIndex, objNull] call FUNC(handleDamage); -TRACE_1("handleDamage called",_return); +[QEGVAR(medical,woundReceived), [_unit, _bodyPart, _damageToAdd, _instigator, _typeOfDamage, _damageSelectionArray]] call CBA_fnc_localEvent; + +#ifdef DEBUG_TESTRESULTS +private _endDmg = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; +private _endPain = GET_PAIN(_unit); +private _typeOfDamageAdj = _typeOfDamage call EFUNC(medical_damage,getTypeOfDamage); +private _config = configFile >> "ACE_Medical_Injuries" >> "damageTypes" >> _typeOfDamageAdj; +private _selectionSpecific = true; +if (isClass _config) then { + _selectionSpecific = (getNumber (_config >> "selectionSpecific")) == 1; +} else { + WARNING_2("Damage type not in config [%1:%2]", _typeOfDamage, _config); +}; +INFO_4("Debug AddDamageToUnit: Type [%1] - Selection Specific [%2] - HitPoint [%3 -> %4]",_typeOfDamage,_selectionSpecific,_startDmg select _bodyPartIndex,_endDmg select _bodyPartIndex); +INFO_4("Pain Change [%1 -> %2] - BodyPartDamage Change [%3 -> %4]",_startPain,_endPain,_startDmg,_endDmg); +#endif -_return +true diff --git a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf b/addons/medical/functions/fnc_addHeartRateAdjustment.sqf deleted file mode 100644 index 6c932bb2ef4..00000000000 --- a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, KoffeinFlummi - * Increase the Heart Rate of a local unit by given number within given amount of seconds. - * - * Arguments: - * 0: The unit - * 1: value - * 2: time in seconds - * 3: callback - * - * Return Value: - * None - * - * Example: - * [bob, 1, 5, {callback}] call ace_medical_fnc_addHeartRateAdjustment - * - * Public: Yes - */ - -params [["_unit", objNull, [objNull]], ["_value", 0, [0]], ["_time", 1, [0]], ["_callBack", {}, [{}]]]; - -private _adjustment = _unit getVariable [QGVAR(heartRateAdjustments), []]; -_adjustment pushBack [_value, _time, _callBack]; -_unit setVariable [QGVAR(heartRateAdjustments), _adjustment]; - -["ace_heartRateAdjustmentAdded", [_unit, _value, _time]] call CBA_fnc_localEvent; diff --git a/addons/medical/functions/fnc_addLoadPatientActions.sqf b/addons/medical/functions/fnc_addLoadPatientActions.sqf deleted file mode 100644 index 0b0b64fb69f..00000000000 --- a/addons/medical/functions/fnc_addLoadPatientActions.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: 654wak654 - * Adds child actions to the "load patient" action for near vehicles. - * - * Arguments: - * 0: Patient - * - * Return Value: - * Child actions - * - * Example: - * [kevin] call ace_medical_fnc_addLoadPatientActions - * - * Public: No - */ - -params ["_target"]; - -private _statement = { - params ["_target", "_player", "_vehicle"]; - [_player, _target, _vehicle] call FUNC(actionLoadUnit); -}; - -[_target call EFUNC(common,nearestVehiclesFreeSeat), _statement, _target] call EFUNC(interact_menu,createVehiclesActions) diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf deleted file mode 100644 index dadab94a2af..00000000000 --- a/addons/medical/functions/fnc_addToLog.sqf +++ /dev/null @@ -1,52 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Add an entry to the specified log - * - * Arguments: - * 0: The patient - * 1: The log type - * 2: The message - * 3: The arguments for localization - * - * Return Value: - * None - * - * Example: - * [bob, "type", "message", [_args]] call ace_medical_fnc_addToLog - * - * Public: Yes - */ - -params ["_unit", "_type", "_message", "_arguments"]; - -if (!local _unit) exitWith { - [QGVAR(addToMedicalLog), _this, _unit] call CBA_fnc_targetEvent; -}; - -date params ["", "", "", "_hour", "_minute"]; - -private _moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute]; -private _logVarName = format[QGVAR(logFile_%1), _type]; - -private _log = _unit getVariable [_logVarName, []]; -if (count _log >= 8) then { - private _newLog = []; - { - // ensure the first element will not be added - if (_forEachIndex > 0) then { - _newLog pushBack _x; - }; - } forEach _log; - _log = _newLog; -}; -_log pushBack [_message, _moment, _type, _arguments]; - -_unit setVariable [_logVarName, _log, true]; -["ace_medicalLogEntryAdded", [_unit, _type, _message, _arguments]] call CBA_fnc_localEvent; - -private _logs = _unit getVariable [QGVAR(allLogs), []]; -if !(_logVarName in _logs) then { - _logs pushBack _logVarName; - _unit setVariable [QGVAR(allLogs), _logs, true]; -}; diff --git a/addons/medical/functions/fnc_addToTriageCard.sqf b/addons/medical/functions/fnc_addToTriageCard.sqf deleted file mode 100644 index 9b240846bc7..00000000000 --- a/addons/medical/functions/fnc_addToTriageCard.sqf +++ /dev/null @@ -1,44 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Add an entry to the triage card - * - * Arguments: - * 0: The patient - * 1: The new item classname - * - * Return Value: - * None - * - * Example: - * [bob, "bandage"] call ace_medical_fnc_addToTriageCard - * - * Public: Yes - */ - -params ["_unit", "_newItem"]; - -if (!local _unit) exitWith { - [QGVAR(addToTriageCard), _this, _unit] call CBA_fnc_targetEvent; -}; - -private _log = _unit getVariable [QGVAR(triageCard), []]; -private _inList = false; -private _amount = 1; -{ - if ((_x select 0) == _newItem) exitWith { - private _info = _log select _forEachIndex; - _info set [1,(_info select 1) + 1]; - _info set [2, CBA_missionTime]; - _log set [_forEachIndex, _info]; - - _amount = (_info select 1); - _inList = true; - }; -} forEach _log; - -if (!_inList) then { - _log pushBack [_newItem, 1, CBA_missionTime]; -}; -_unit setVariable [QGVAR(triageCard), _log, true]; -["ace_triageCardItemAdded", [_unit, _newItem, _amount]] call CBA_fnc_localEvent; diff --git a/addons/medical/functions/fnc_addUnconsciousCondition.sqf b/addons/medical/functions/fnc_addUnconsciousCondition.sqf deleted file mode 100644 index f31e5045fd8..00000000000 --- a/addons/medical/functions/fnc_addUnconsciousCondition.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state. - * - * Arguments: - * 0-N: Code, should return a boolean - * - * Return Value: - * None - * - * Example: - * [[{bob}]] call ace_medical_fnc_addUnconsciousCondition - * - * Public: Yes - */ - -if (isnil QGVAR(unconsciousConditions)) then { - GVAR(unconsciousConditions) = []; -}; -if (_this isEqualType []) then { - { - if (_x isEqualType {}) then { - GVAR(unconsciousConditions) pushback _x; - }; - } foreach _this; -}; diff --git a/addons/medical/functions/fnc_addUnloadPatientActions.sqf b/addons/medical/functions/fnc_addUnloadPatientActions.sqf deleted file mode 100644 index bb73dab4e8c..00000000000 --- a/addons/medical/functions/fnc_addUnloadPatientActions.sqf +++ /dev/null @@ -1,43 +0,0 @@ -#include "script_component.hpp" -/* - * Author: esteldunedain - * Create one unload action per unconscious passenger - * - * Arguments: - * 0: Vehicle - * 1: Player - * 3: Parameters - * - * Return Value: - * Children actions - * - * Example: - * [car, kevin, [params]] call ACE_medical_fnc_addUnloadPatientActions - * - * Public: No - */ -params ["_vehicle", "_player", "_parameters"]; - -private _actions = []; - -{ - private _unit = _x; - if (_unit != _player && {(alive _unit) && {_unit getVariable ["ACE_isUnconscious", false]}}) then { - _actions pushBack - [ - [ - str(_unit), - [_unit, true] call EFUNC(common,getName), - "", - {[_player, (_this select 2) select 0] call FUNC(actionUnloadUnit);}, - {true}, - {}, - [_unit] - ] call EFUNC(interact_menu,createAction), - [], - _unit - ]; - }; -} forEach crew _vehicle; - -_actions diff --git a/addons/medical/functions/fnc_addVitalLoop.sqf b/addons/medical/functions/fnc_addVitalLoop.sqf deleted file mode 100644 index a1a01a5a61c..00000000000 --- a/addons/medical/functions/fnc_addVitalLoop.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Enabled the vitals loop for a unit. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ace_medical_fnc_addVitalLoop - * - * Public: Yes - */ - -params ["_unit", ["_force", false]]; - -if !([_unit] call FUNC(hasMedicalEnabled) || _force) exitWith {}; - -if !(local _unit) exitWith { - [QGVAR(addVitalLoop), [_unit, _force], _unit] call CBA_fnc_targetEvent; -}; - -// Quit if the unit already has a vital loop, or is dead, unless it's forced -if ((_unit getVariable[QGVAR(addedToUnitLoop),false] || !alive _unit) && !_force) exitWith{}; - -// Schedule the loop to be executed again 1 sec later -// @todo: should the loop be started righ away instead? -_unit setVariable [QGVAR(addedToUnitLoop), true, true]; -[DFUNC(vitalLoop), [_unit, CBA_missionTime], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_adjustPainLevel.sqf b/addons/medical/functions/fnc_adjustPainLevel.sqf index 97bc9389a0f..233638180fa 100644 --- a/addons/medical/functions/fnc_adjustPainLevel.sqf +++ b/addons/medical/functions/fnc_adjustPainLevel.sqf @@ -1,7 +1,8 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Interface to allow external modules to safely adjust pain levels. + * Public interface to allow external modules to safely adjust pain levels. + * Added pain can be positive or negative (Note: ignores painCoefficient setting) * * Arguments: * 0: The patient @@ -17,18 +18,11 @@ */ params ["_unit", "_addedPain"]; -//Only run on local units: -if (!local _unit) exitWith {ERROR("unit is not local");}; -TRACE_3("ACE_DEBUG: adjustPainLevel Called",_unit, _pain, _addedPain); -//Ignore if medical system disabled: -if (GVAR(level) == 0) exitWith {}; +if (!local _unit) exitWith { ERROR_1("unit [%1] is not local",_unit); }; -private _pain = ((_unit getVariable [QGVAR(pain), 0]) + _addedPain) max 0; +private _pain = GET_PAIN(_unit); -_unit setVariable [QGVAR(pain), _pain]; +_pain = 0 max (_pain + _addedPain) min 1; -//Start up the vital watching (if not already running) -[_unit] call FUNC(addVitalLoop); - -_pain; +_unit setVariable [VAR_PAIN, _pain]; diff --git a/addons/medical/functions/fnc_bodyCleanupLoop.sqf b/addons/medical/functions/fnc_bodyCleanupLoop.sqf deleted file mode 100644 index 31d1ef8b929..00000000000 --- a/addons/medical/functions/fnc_bodyCleanupLoop.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Loop that cleans up litter - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_medical_fnc_bodyCleanupLoop - * - * Public: No - */ - -{ - TRACE_2("body",_x,isPlayer _x); - if ((!isNull _x) && {!isPlayer _x}) then {deleteVehicle _x}; -} forEach GVAR(bodiesToDelete); - -// deleteVehicle doesn't have instant results so it won't usualy be filtered until next run -GVAR(bodiesToDelete) = GVAR(bodiesToDelete) - [objNull]; - -// If no more bodies remain, exit the loop -if (GVAR(bodiesToDelete) isEqualTo []) exitWith { - TRACE_1("array emptied - rem PFEH",GVAR(bodiesToDelete)); -}; - -// Schedule the loop to be executed again 20 sec later -[DFUNC(bodyCleanupLoop), [], 20] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf b/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf deleted file mode 100644 index d73a70f6574..00000000000 --- a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if caller can access targets medical equipment, based upon accessLevel. - * - * Arguments: - * 0: The caller - * 1: The target - * - * Return Value: - * Can Treat - * - * Example: - * [bob, target] call ace_medical_fnc_canAccessMedicalEquipment - * - * Public: Yes - */ - -params ["_caller", "_target"]; - -private _accessLevel = _target getVariable [QGVAR(allowSharedEquipmentAccess), -1]; - -private _return = false; - -if (_accessLevel >= 0) then { - if (_accessLevel == 0) exitWith { _return = true; }; - if (_accessLevel == 1) exitWith { _return = (side _target == side _caller); }; - if (_accessLevel == 2) exitWith { _return = (group _target == group _caller); }; -}; - -_return; diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf deleted file mode 100644 index 913cc4c30e7..00000000000 --- a/addons/medical/functions/fnc_canTreat.sqf +++ /dev/null @@ -1,96 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if the treatment action can be performed. - * - * Arguments: - * 0: The caller - * 1: The target - * 2: Selection name - * 3: ACE_Medical_Treatments Classname - * - * Return Value: - * Can Treat - * - * Example: - * [player, cursorTarget, "Head", "SurgicalKit"] call ace_medical_fnc_canTreat - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className"]; - -if !(_target isKindOf "CAManBase") exitWith { false }; - -private _config = (ConfigFile >> "ACE_Medical_Actions" >> (["Basic", "Advanced"] select (GVAR(level)>=2)) >> _className); - -if !(isClass _config) exitwith {false}; - -// Allow self treatment check -if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false}; - -private _medicRequired = if (isNumber (_config >> "requiredMedic")) then { - getNumber (_config >> "requiredMedic"); -} else { - // Check for required class - if (isText (_config >> "requiredMedic")) exitwith { - missionNamespace getVariable [(getText (_config >> "requiredMedic")), 0] - }; - 0; -}; -if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith { false }; - -private _items = getArray (_config >> "items"); -if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith { false }; - -private _allowedSelections = getArray (_config >> "allowedSelections"); -if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith { false }; - -private _return = true; -if (getText (_config >> "condition") != "") then { - private _condition = getText (_config >> "condition"); - if (isnil _condition) then { - _condition = compile _condition; - } else { - _condition = missionNamespace getVariable _condition; - }; - if (_condition isEqualType false) then { - _return = _condition; - } else { - _return = [_caller, _target, _selectionName, _className] call _condition; - }; -}; -if (!_return) exitwith { false }; - -private _patientStateCondition = if (isText(_config >> "patientStateCondition")) then { - missionNamespace getVariable [getText(_config >> "patientStateCondition"), 0] -} else { - getNumber(_config >> "patientStateCondition") -}; -if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; - -private _locations = getArray (_config >> "treatmentLocations"); -if ("All" in _locations) exitwith { true }; - -private _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; -private _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isInMedicalVehicle))}; - -{ - if (_x == "field") exitwith {_return = true;}; - if (_x == "MedicalFacility" && _medFacility) exitwith {_return = true;}; - if (_x == "MedicalVehicle" && _medVeh) exitwith {_return = true;}; - if !(isnil _x) exitwith { - private _val = missionNamespace getVariable _x; - if (_val isEqualType 0) then { - _return = switch (_val) do { - case 0: {true}; //AdvancedMedicalSettings_anywhere - case 1: {call _medVeh}; //AdvancedMedicalSettings_vehicle - case 2: {call _medFacility}; //AdvancedMedicalSettings_facility - case 3: {(call _medFacility) || {call _medVeh}}; //AdvancedMedicalSettings_vehicleAndFacility - default {false}; //Disabled - }; - }; - }; -} foreach _locations; - -_return; diff --git a/addons/medical/functions/fnc_canTreatCached.sqf b/addons/medical/functions/fnc_canTreatCached.sqf deleted file mode 100644 index 35fc3ada223..00000000000 --- a/addons/medical/functions/fnc_canTreatCached.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Cached Check if the treatment action can be performed. - * - * Arguments: - * 0: The caller - * 1: The target - * 2: Selection name - * 3: ACE_Medical_Treatments Classname - * - * Return Value: - * Can Treat - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_canTreatCached - * - * Public: No - */ - -#define MAX_DURATION_CACHE 2 -params ["", "_target", "_selection", "_classname"]; - -// parameters, function, namespace, uid -[_this, DFUNC(canTreat), _target, format [QGVAR(canTreat_%1_%2), _selection, _classname], MAX_DURATION_CACHE, QEGVAR(interact_menu,clearConditionCaches)] call EFUNC(common,cachedCall); diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf deleted file mode 100644 index 56687988e4a..00000000000 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ /dev/null @@ -1,83 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Makes a copy of a dead body. For handling dead bodies for actions such as load and carry. - * - * Arguments: - * 0: The oldbody - * 1: The caller - * - * Return Value: - * Returns the copy of the unit. If no copy could be made, returns the oldBody - * - * Example: - * [bob, kevin] call ACE_medical_fnc_copyDeadBody - * - * Public: No - */ - -params ["_oldBody", "_caller"]; - -if (alive _oldBody) exitWith {_oldBody}; // we only want to do this for dead bodies - -private _name = _oldBody getVariable ["ACE_name", "unknown"]; -private _class = typeOf _oldBody; -private _side = side _caller; -private _group = createGroup _side; -private _position = getPos _oldBody; - -private _newUnit = _group createUnit [typeOf _oldBody, _position, [], 0, "NONE"]; -_newUnit setVariable ["ACE_name", _name, true]; - -_newUnit disableAI "TARGET"; -_newUnit disableAI "AUTOTARGET"; -_newUnit disableAI "MOVE"; -_newUnit disableAI "ANIM"; -_newUnit disableAI "FSM"; - -removeallweapons _newUnit; -removeallassigneditems _newUnit; -removeUniform _newUnit; -removeHeadgear _newUnit; -removeBackpack _newUnit; -removeVest _newUnit; - -_newUnit addHeadgear (headgear _oldBody); -_newUnit addBackpack (backpack _oldBody); -clearItemCargoGlobal (backpackContainer _newUnit); -clearMagazineCargoGlobal (backpackContainer _newUnit); -clearWeaponCargoGlobal (backpackContainer _newUnit); - -_newUnit addVest (vest _oldBody); -clearItemCargoGlobal (backpackContainer _newUnit); -clearMagazineCargoGlobal (backpackContainer _newUnit); -clearWeaponCargoGlobal (backpackContainer _newUnit); - -_newUnit addUniform (uniform _oldBody); -clearItemCargoGlobal (backpackContainer _newUnit); -clearMagazineCargoGlobal (backpackContainer _newUnit); -clearWeaponCargoGlobal (backpackContainer _newUnit); - -{_newUnit addMagazine _x} count (magazines _oldBody); -{_newUnit addWeapon _x} count (weapons _oldBody); -{_newUnit addItem _x} count (items _oldBody); - -_newUnit selectWeapon (primaryWeapon _newUnit); - -// We are attaching the old unit and hiding it, so we can keep the original unit until later. -_oldBody attachTo [_newUnit, [0,0,0]]; -if (isMultiplayer) then { - hideObjectGlobal _oldBody; -} else { - hideObject _oldBody; -}; - -_newUnit setVariable [QGVAR(copyOfUnit), _oldBody, true]; -_oldBody setVariable [QGVAR(hasCopy), _newUnit, true]; -_newUnit setVariable ["ACE_isDead", true, true]; -_newUnit setVariable ["ACE_isUnconscious", true, true]; -_newUnit setVariable [QGVAR(disableInteraction), true, true]; -_oldBody setVariable [QGVAR(disableInteraction), true, true]; - -[_newUnit, 0.89] call FUNC(setStructuralDamage); -_newUnit; diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf deleted file mode 100644 index 349f6252d95..00000000000 --- a/addons/medical/functions/fnc_createLitter.sqf +++ /dev/null @@ -1,95 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Spawns litter for the treatment action on the ground around the target - * - * Arguments: - * 0: The Caller - * 1: The target - * 2: The treatment Selection Name - * 3: The treatment classname - * 4: ? - * 5: Users of Items - * 6: Blood Loss on selection (previously called _previousDamage) - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname", , , 5] call ACE_medical_fnc_createLitter - * - * Public: No - */ - -#define MIN_ENTRIES_LITTER_CONFIG 3 - -params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_bloodLossOnSelection"]; -TRACE_6("params",_caller,_target,_selectionName,_className,_usersOfItems,_bloodLossOnSelection); - -//Ensures comptibilty with other possible medical treatment configs -private _previousDamage = _bloodLossOnSelection; - -if !(GVAR(allowLitterCreation)) exitwith {}; -if (vehicle _caller != _caller || {vehicle _target != _target}) exitwith {}; - -private _config = if (GVAR(level) >= 2) then { - (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -} else { - (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className) -}; -if !(isClass _config) exitwith {TRACE_1("No action config", _className);}; - -if !(isArray (_config >> "litter")) exitwith {TRACE_1("No litter config", _className);}; -private _litter = getArray (_config >> "litter"); - -private _createLitter = { - params ["_unit", "_litterClass"]; - // @TODO: handle carriers over water - // For now, don't spawn litter if we are over water to avoid floating litter - if (surfaceIsWater (getPos _unit)) exitWith { false }; - - private _position = getPosATL _unit; - _position params ["_posX", "_posY", "_posZ"]; - _position = [_posX + (random 2) - 1, _posY + (random 2) - 1, _posZ]; - - private _direction = (random 360); - - // Create the litter, and timeout the event based on the cleanup delay - // The cleanup delay for events in MP is handled by the server side - TRACE_3("Creating Litter on server",_litterClass,_position,_direction); - [QGVAR(createLitterServer), [_litterClass, _position, _direction]] call CBA_fnc_serverEvent; - - true -}; - -private _createdLitter = []; -{ - if (_x isEqualType []) then { - if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; - - _x params ["_selection", "_litterCondition", "_litterOptions"]; - - if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. - - if (isnil _litterCondition) then { - _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; - } else { - _litterCondition = missionNamespace getVariable _litterCondition; - if (!(_litterCondition isEqualType {})) then {_litterCondition = {false}}; - }; - if !([_caller, _target, _selectionName, _className, _usersOfItems, _bloodLossOnSelection] call _litterCondition) exitwith {}; - - if (_litterOptions isEqualType []) then { - // Loop through through the litter options and place the litter - { - if (_x isEqualType [] && {(count _x > 0)}) then { - [_target, selectRandom _x] call _createLitter; - }; - if (_x isEqualType "") then { - [_target, _x] call _createLitter; - }; - } foreach _litterOptions; - }; - }; - }; -} foreach _litter; diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf deleted file mode 100644 index 1cf30acc751..00000000000 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ /dev/null @@ -1,59 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Determine If Fatal - * - * Arguments: - * 0: Unit - * 1: Part - * 2: with Damage (default: 0) - * - * Return Value: - * None - * - * Example: - * [bob, 2, 5] call ACE_medical_fnc_determineIfFatal - * - * Public: No - */ - -#define INCREASE_CHANCE_HEAD 0.05 -#define INCREASE_CHANCE_TORSO 0.03 -#define INCREASE_CHANGE_LIMB 0.01 - -#define CHANGE_FATAL_HEAD 0.7 -#define CHANGE_FATAL_TORSO 0.6 -#define CHANGE_FATAL_LIMB 0.1 - -params ["_unit", "_part", ["_withDamage", 0]]; - -if (!alive _unit) exitWith {true}; -if ((vehicle _unit != _unit) && {!alive (vehicle _unit)}) exitWith { true }; -if (_part < 0 || _part > 5) exitWith {false}; - -// Find the correct Damage threshold for unit. -private _damageThreshold = [1,1,1]; -if ([_unit, GVAR(remoteControlledAI)] call EFUNC(common,isPlayer)) then { - _damageThreshold =_unit getVariable[QGVAR(unitDamageThreshold), [GVAR(playerDamageThreshold), GVAR(playerDamageThreshold), GVAR(playerDamageThreshold) * 1.7]]; -} else { - _damageThreshold =_unit getVariable[QGVAR(unitDamageThreshold), [GVAR(AIDamageThreshold), GVAR(AIDamageThreshold), GVAR(AIDamageThreshold) * 1.7]]; -}; -_damageThreshold params ["_thresholdHead", "_thresholdTorso", "_thresholdLimbs"]; - -private _damageBodyPart = ((_unit getVariable [QGVAR(bodyPartStatus),[0, 0, 0, 0, 0, 0]]) select _part) + _withDamage; - -// Check if damage to body part is higher as damage head -if (_part == 0) exitWith { - private _chanceFatal = CHANGE_FATAL_HEAD + ((INCREASE_CHANCE_HEAD * (_damageBodyPart - _thresholdHead)) * 10); - (_damageBodyPart >= _thresholdHead && {(_chanceFatal >= random(1))}); -}; - -// Check if damage to body part is higher as damage torso -if (_part == 1) exitWith { - private _chanceFatal = CHANGE_FATAL_TORSO + ((INCREASE_CHANCE_TORSO * (_damageBodyPart - _thresholdTorso)) * 10); - (_damageBodyPart >= _thresholdTorso && {(_chanceFatal >= random(1))}); -}; -// Check if damage to body part is higher as damage limbs -// We use a slightly lower decrease for limbs, as we want any injuries done to those to be less likely to be fatal compared to head shots or torso. -private _chanceFatal = CHANGE_FATAL_LIMB + ((INCREASE_CHANGE_LIMB * (_damageBodyPart - _thresholdLimbs)) * 10); -(_damageBodyPart >= _thresholdLimbs && {(_chanceFatal >= random(1))}); diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf deleted file mode 100644 index d506c09c509..00000000000 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ /dev/null @@ -1,196 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Displays the patient information for given unit. - * - * Arguments: - * 0: The Unit - * 1: Show (default: true) - * 2: Selection (default: 0) - * - * Return Value: - * None - * - * Example: - * [bob, true, 2] call ACE_medical_fnc_displayPatientInformation - * - * Public: No - */ -#define MAX_DISTANCE 10 - -// Exit for basic medical -if (GVAR(level) < 2) exitWith {}; - -params ["_target", ["_show", true], ["_selectionN", 0]]; - -GVAR(currentSelectedSelectionN) = [0, _selectionN] select (IS_SCALAR(_selectionN)); -GVAR(displayPatientInformationTarget) = [ObjNull, _target] select _show; - -if (_show) then { - ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutRsc [QGVAR(DisplayInformation),"PLAIN"]; - - [{ - params ["_args", "_idPFH"]; - _args params ["_target", "_selectionN"]; - - if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - if (ACE_player distance _target > MAX_DISTANCE) exitwith { - ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; - [_idPFH] call CBA_fnc_removePerFrameHandler; - [QEGVAR(common,displayTextStructured), [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player], [ACE_player]] call CBA_fnc_targetEvent; - }; - - disableSerialization; - private _display = uiNamespace getVariable QGVAR(DisplayInformation); - if (isnil "_display") exitwith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - - private _allInjuryTexts = []; - private _genericMessages = []; - - private _partText = [LSTRING(Head), LSTRING(Torso), LSTRING(LeftArm) ,LSTRING(RightArm) ,LSTRING(LeftLeg), LSTRING(RightLeg)] select _selectionN; - _genericMessages pushback [localize _partText, [1, 1, 1, 1]]; - - if (_target getVariable[QGVAR(isBleeding), false]) then { - _genericMessages pushback [localize LSTRING(Status_Bleeding), [1, 0.1, 0.1, 1]]; - }; - if (_target getVariable[QGVAR(hasLostBlood), 0] > 1) then { - _genericMessages pushback [localize LSTRING(Status_Lost_Blood), [1, 0.1, 0.1, 1]]; - }; - - if (((_target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select _selectionN) > 0) then { - _genericMessages pushback [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; - }; - if (_target getVariable[QGVAR(hasPain), false]) then { - _genericMessages pushback [localize LSTRING(Status_Pain), [1, 1, 1, 1]]; - }; - - private _totalIvVolume = 0; - private _bloodBags = _target getVariable [QGVAR(ivBags), []]; - { - _x params ["_bagVolumeRemaining"]; - _totalIvVolume = _totalIvVolume + _bagVolumeRemaining; - } foreach _bloodBags; - - if (_totalIvVolume >= 1) then { - _genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; - }; - - private _damaged = [false, false, false, false, false, false]; - private _selectionBloodLoss = [0,0,0,0,0,0]; - - private _openWounds = _target getVariable [QGVAR(openWounds), []]; - { - _x params ["", "_x1", "_selectionX", "_amountOf", "_x4"]; - // Find how much this bodypart is bleeding - if (_amountOf > 0) then { - _damaged set [_selectionX, true]; - _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))]; - - if (_selectionN == _selectionX) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6, ceil _amountOf], [1,1,1,1]]; - } else { - // TODO localization - _allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6], [1,1,1,1]]; - }; - }; - }; - } foreach _openWounds; - - private _bandagedwounds = _target getVariable [QGVAR(bandagedWounds), []]; - { - _x params ["", "", "_selectionX", "_amountOf", "_x4"]; - // Find how much this bodypart is bleeding - if !(_damaged select _selectionX) then { - _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))]; - }; - if (_selectionN == _selectionX) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf > 0) then { - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushback [format["[B] %2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, ceil _amountOf], [0.88,0.7,0.65,1]]; - } else { - // TODO localization - _allInjuryTexts pushback [format["[B] Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [0.88,0.7,0.65,1]]; - }; - }; - }; - } foreach _bandagedwounds; - - // Handle the body image coloring - private _availableSelections = [50,51,52,53,54,55]; - { - private _total = _x; - private _red = 1; - private _green = 1; - private _blue = 1; - - if (_total > 0) then { - if (_damaged select _forEachIndex) then { - _green = (0.9 - _total) max 0; - _blue = _green; - } else { - _green = (0.9 - _total) max 0; - _red = _green; - //_blue = _green; - }; - }; - (_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; - } foreach _selectionBloodLoss; - - // update tourniquet information - [_display, _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]] call FUNC(updateTourniquets); - - private _lbCtrl = (_display displayCtrl 200); - lbClear _lbCtrl; - { - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_foreachIndex, _color]; - } foreach _genericMessages; - - private _amountOfGeneric = count _genericMessages; - { - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _color]; - } foreach _allInjuryTexts; - if (count _allInjuryTexts == 0) then { - _lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart)); - }; - - private _logCtrl = (_display displayCtrl 302); - lbClear _logCtrl; - - private _logs = _target getVariable [QGVAR(logFile_Activity), []]; - { - _x params ["_message", "_moment", "_type", "_arguments"]; - if (isLocalized _message) then { - _message = localize _message; - }; - - { - if (_x isEqualType "" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; - }; - } foreach _arguments; - _message = format([_message] + _arguments); - _logCtrl lbAdd format["%1 %2", _moment, _message]; - } foreach _logs; - - private _triageStatus = [_target] call FUNC(getTriageStatus); - (_display displayCtrl 303) ctrlSetText (_triageStatus select 0); - (_display displayCtrl 303) ctrlSetBackgroundColor (_triageStatus select 2); - - }, 0, [_target, GVAR(currentSelectedSelectionN)]] call CBA_fnc_addPerFrameHandler; - -} else { - ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; -}; diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf deleted file mode 100644 index 1a84b98e87b..00000000000 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ /dev/null @@ -1,78 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Display triage card for a unit - * - * Arguments: - * 0: The unit - * 1: Show (default: true) - * - * Return Value: - * None - * - * Example: - * [bob, true] call ace_medical_fnc_displayTriageCard - * - * Public: Yes - */ - -params ["_target", ["_show", true]]; - -GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull}; - -if (_show) then { - //("ACE_MedicalTriageCard" call BIS_fnc_rscLayer) cutRsc [QGVAR(triageCard),"PLAIN"]; - createDialog QGVAR(triageCard); - - [{ - params ["_args", "_idPFH"]; - _args params ["_target"]; - if (GVAR(TriageCardTarget) != _target) exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - - disableSerialization; - private _display = uiNamespace getVariable QGVAR(triageCard); - if (isNil "_display") exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - - private _triageCardTexts = []; - - // TODO fill the lb with the appropiate information for the patient - private _lbCtrl = (_display displayCtrl 200); - lbClear _lbCtrl; - - private _log = _target getVariable [QGVAR(triageCard), []]; - { - _x params ["_item", "_amount"]; - private _message = _item; - if (isClass(configFile >> "CfgWeapons" >> _item)) then { - _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); - } else { - if (isLocalized _message) then { - _message = localize _message; - }; - }; - _triageCardTexts pushBack format["%1x - %2", _amount, _message]; - } forEach _log; - - if (count _triageCardTexts == 0) then { - _lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry)); - }; - { - _lbCtrl lbAdd _x; - } forEach _triageCardTexts; - - private _triageStatus = [_target] call FUNC(getTriageStatus); - _triageStatus params ["_text", "", "_color"]; - - (_display displayCtrl 2000) ctrlSetText _text; - (_display displayCtrl 2000) ctrlSetBackgroundColor _color; - - }, 0, [_target]] call CBA_fnc_addPerFrameHandler; - -} else { - //("ACE_MedicalTriageCard" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; - closeDialog 7010; -}; diff --git a/addons/medical/functions/fnc_dropDownTriageCard.sqf b/addons/medical/functions/fnc_dropDownTriageCard.sqf deleted file mode 100644 index c409e39ac0f..00000000000 --- a/addons/medical/functions/fnc_dropDownTriageCard.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Display triage card for a unit - * - * Arguments: - * 0: Show - * - * Return Value: - * None - * - * Example: - * [true] call ace_medical_fnc_dropDownTriageCard - * - * Public: Yes - */ - -params ["_show"]; - -disableSerialization; -private _display = uiNamespace getVariable QGVAR(triageCard); -if (isNil "_display") exitWith {}; - -private _pos = [0,0,0,0]; -if (_show) then { - _pos = ctrlPosition (_display displayCtrl 2001); -}; -for "_idc" from 2002 to 2006 step 1 do { - _pos set [1, (_pos select 1) + (_pos select 3)]; - private _ctrl = (_display displayCtrl _idc); - _ctrl ctrlSetPosition _pos; - _ctrl ctrlCommit 0; -}; diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf deleted file mode 100644 index 1caff245275..00000000000 --- a/addons/medical/functions/fnc_getBloodLoss.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Calculate the total blood loss of a unit. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Total blood loss of unit - * - * Example: - * [bob] call ACE_medical_fnc_getBloodLoss - * - * Public: No - */ - -#define BLOODLOSSRATE_BASIC 0.2 - -// TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical). -params ["_unit"]; - -private _totalBloodLoss = 0; -private _tourniquets = _unit getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -{ - if ((_tourniquets select (_x select 2)) == 0) then { - // total bleeding ratio * percentage of injury left - _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); - // (((BLOODLOSS_SMALL_WOUNDS * (_x select 0))) + ((BLOODLOSS_MEDIUM_WOUNDS * (_x select 1))) + ((BLOODLOSS_LARGE_WOUNDS * (_x select 2))) * (_cardiacOutput / DEFAULT_CARDIAC_OUTPUT)); - }; -} forEach (_unit getVariable [QGVAR(openWounds), []]); - -{ - _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); -} forEach (_unit getVariable [QGVAR(internalWounds), []]); - -_totalBloodLoss * ((_unit getVariable [QGVAR(bleedingCoefficient), GVAR(bleedingCoefficient)]) max 0); diff --git a/addons/medical/functions/fnc_getBloodPressure.sqf b/addons/medical/functions/fnc_getBloodPressure.sqf deleted file mode 100644 index 7a582df5e1b..00000000000 --- a/addons/medical/functions/fnc_getBloodPressure.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Calculates the blood volume change and decreases the IVs given to the unit. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * 0: BloodPressure Low - * 1: BloodPressure High - * - * Example: - * [bob, kevin] call ACE_medical_fnc_getBloodPressure - * - * Public: No - */ - -// Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120. -#define MODIFIER_BP_HIGH 0.229 - -// Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80. -#define MODIFIER_BP_LOW 0.1524 - -params ["_unit"]; - -private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); -private _resistance = _unit getVariable [QGVAR(peripheralResistance), 100]; - -private _bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance; -private _bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance; - -[_bloodPressureLow max 0, _bloodPressureHigh max 0] diff --git a/addons/medical/functions/fnc_getBloodVolumeChange.sqf b/addons/medical/functions/fnc_getBloodVolumeChange.sqf deleted file mode 100644 index 32bcfb23ede..00000000000 --- a/addons/medical/functions/fnc_getBloodVolumeChange.sqf +++ /dev/null @@ -1,56 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Calculates the blood volume change and decreases the IVs given to the unit. - * - * Arguments: - * 0: The Unit - * 1: Global Sync Values (bloodbags) - * - * Return Value: - * Blood volume change (in % total) - * - * Example: - * [bob, true] call ACE_medical_fnc_getBloodVolumeChange - * - * Public: No - */ - -/* - IV Change per second calculation: - 250ml should take 60 seconds to fill. 250/60 = 4.166. - Basic medical is 10x (will take 6 seconds for 250ml) - */ -#define IV_CHANGE_PER_SECOND ([41.66, 4.166] select (GVAR(level) >= 2)) - -params ["_unit", "_syncValues"]; - -private _bloodVolume = _unit getVariable [QGVAR(bloodVolume), 100]; -private _bloodVolumeChange = -([_unit] call FUNC(getBloodLoss)); - -if (!isNil {_unit getVariable QGVAR(ivBags)}) then { - if (_bloodVolume < 100) then { - private _bloodBags = _unit getVariable [QGVAR(ivBags), []]; - _bloodBags = _bloodBags apply { - _x params ["_bagVolumeRemaining"]; - private _bagChange = IV_CHANGE_PER_SECOND min _bagVolumeRemaining; // absolute value of the change in miliLiters - _bagVolumeRemaining = _bagVolumeRemaining - _bagChange; - _bloodVolumeChange = _bloodVolumeChange + (_bagChange / 70); // ((bag change in ml) / (body total:7000ml)) out of 100 percent - if (_bagVolumeRemaining < 0.01) then { - [] - } else { - [_bagVolumeRemaining]; - }; - }; - _bloodBags = _bloodBags - [[]]; // remove empty bags - if (_bloodBags isEqualTo []) then { - _unit setVariable [QGVAR(ivBags), nil, true]; // no bags left - clear variable (always globaly sync this) - } else { - _unit setVariable [QGVAR(ivBags), _bloodBags, _syncValues]; - }; - } else { - _unit setVariable [QGVAR(ivBags), nil, true]; // blood volume = 100% - clear variable (always globaly sync this) - }; -}; - -_bloodVolumeChange; diff --git a/addons/medical/functions/fnc_getCardiacOutput.sqf b/addons/medical/functions/fnc_getCardiacOutput.sqf deleted file mode 100644 index 9fcaad87319..00000000000 --- a/addons/medical/functions/fnc_getCardiacOutput.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the cardiac output from the Heart, based on current Heart Rate and Blood Volume. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Current cardiac output - * - * Example: - * [bob] call ACE_medical_fnc_getCardiacOutput - * - * Public: No - */ - -/* - Cardiac output (Q or or CO ) is the volume of blood being pumped by the heart, in particular by a left or right ventricle in the CBA_missionTime interval of one minute. CO may be measured in many ways, for example dm3/min (1 dm3 equals 1 litre). - - Source: http://en.wikipedia.org/wiki/Cardiac_output -*/ - -// to limit the amount of complex calculations necessary, we take a set modifier to calculate Stroke Volume. -#define MODIFIER_CARDIAC_OUTPUT 19.04761 - -params ["_unit"]; - -((_unit getVariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getVariable [QGVAR(heartRate), 80])/80-1); diff --git a/addons/medical/functions/fnc_getHeartRateChange.sqf b/addons/medical/functions/fnc_getHeartRateChange.sqf deleted file mode 100644 index dcd35ed4765..00000000000 --- a/addons/medical/functions/fnc_getHeartRateChange.sqf +++ /dev/null @@ -1,86 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the change in the heart rate. Used for the vitals calculations. Calculated in one seconds. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Change in heart Rate - * - * Example: - * [bob] call ACE_medical_fnc_getHeartRateChange - * - * Public: No - */ - -#define HEART_RATE_MODIFIER 0.02 - -params ["_unit"]; - -private _hrIncrease = 0; -if (!(_unit getVariable [QGVAR(inCardiacArrest),false])) then { - private _heartRate = _unit getVariable [QGVAR(heartRate), 80]; - private _bloodLoss = [_unit] call FUNC(getBloodLoss); - - private _adjustment = _unit getVariable [QGVAR(heartRateAdjustments), []]; - { - _x params ["_values", "_time", "_callBack"]; - if (abs _values > 0) then { - if (_time <= 0) then { - _time = 1; - }; - private _change = (_values / _time); - _hrIncrease = _hrIncrease + _change; - - if ( (_time - 1) <= 0) then { - _time = 0; - _adjustment set [_forEachIndex, ObjNull]; - [_unit] call _callBack; - } else { - _time = _time - 1; - _adjustment set [_forEachIndex, [_values - _change, _time]]; - }; - } else { - _adjustment set [_forEachIndex, ObjNull]; - [_unit] call _callBack; - }; - } forEach _adjustment; - - _adjustment = _adjustment - [ObjNull]; - _unit setVariable [QGVAR(heartRateAdjustments), _adjustment]; - - private _bloodVolume = _unit getVariable [QGVAR(bloodVolume), 100]; - if (_bloodVolume > 75) then { - if (_bloodLoss > 0.0) then { - if (_bloodLoss < 0.5) then { - if (_heartRate < 126) then { - _hrIncrease = _hrIncrease + 0.05; - }; - } else { - if (_bloodLoss < 1) then { - if (_heartRate < 161) then { - _hrIncrease = _hrIncrease + 0.1; - }; - } else { - if (_heartRate < 220) then { - _hrIncrease = _hrIncrease + 0.15; - }; - }; - }; - } else { - // Stabalize it - if (_heartRate < (60 + round(random(10)))) then { - _hrIncrease = _hrIncrease + HEART_RATE_MODIFIER; - } else { - if (_heartRate > (77 + round(random(10)))) then { - _hrIncrease = _hrIncrease - HEART_RATE_MODIFIER; - }; - }; - }; - } else { - _hrIncrease = _hrIncrease - HEART_RATE_MODIFIER; - }; -}; -_hrIncrease diff --git a/addons/medical/functions/fnc_getTriageStatus.sqf b/addons/medical/functions/fnc_getTriageStatus.sqf deleted file mode 100644 index 2b502b563b8..00000000000 --- a/addons/medical/functions/fnc_getTriageStatus.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the triage status and information from a unit - * - * Arguments: - * 0: The unit - * - * Return Value: - * 0: Name - * 1: Status ID - * 2: Color > - * - * Example: - * [bob] call ace_medical_fnc_getTriageStatus - * - * Public: Yes - */ - -params ["_unit"]; - -private _status = _unit getVariable [QGVAR(triageLevel), -1]; -private _return = switch (_status) do { - case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]}; - case 2: {[localize LSTRING(Triage_Status_Delayed), 2, [0.7, 0.5, 0, 0.9]]}; - case 3: {[localize LSTRING(Triage_Status_Immediate), 3, [0.4, 0.07, 0.07, 0.9]]}; - case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]}; - default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]}; -}; -_return diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical/functions/fnc_getTypeOfDamage.sqf deleted file mode 100644 index c65f5d78e71..00000000000 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the type of damage based upon the projectile. - * - * Arguments: - * 0: The projectile classname or object - * - * Return Value: - * Type of damage - * - * Example: - * ["bullet"] call ACE_medical_fnc_getTypeOfDamage - * - * Public: No - */ - -params ["_typeOfProjectile"]; - - -if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"}; -if (_typeOfProjectile isKindOf "ShotgunBase") exitWith {"bullet"}; -if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"}; -if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "FuelExplosion") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "ShellBase") exitWith {"shell"}; -if (_typeOfProjectile isKindOf "RocketBase") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"}; -if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"}; -toLower _typeOfProjectile diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf deleted file mode 100644 index 436365cc912..00000000000 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get whatever or not a unit should be or stay unconscious. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Should the unit stay unconscious? - * - * Example: - * [bob] call ace_medical_fnc_getUnconsciousCondition - * - * Public: Yes - */ - -params ["_unit"]; - -if (isnil QGVAR(unconsciousConditions)) then { - GVAR(unconsciousConditions) = []; -}; - -private _return = false; -{ - if ((_x isEqualType {}) && {([_unit] call _x)}) exitwith { - _return = true; - }; -} foreach GVAR(unconsciousConditions); - -_return diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf deleted file mode 100644 index 1e80a727dff..00000000000 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ /dev/null @@ -1,121 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the bandage of a patient. - * - * Arguments: - * 0: The target - * 1: The impact - * 2: Selection part number - * 3: Injury index - * 4: Injury - * 5: Used Bandage type - * - * Return Value: - * None - * - * Example: - * [bob, 5, 5, 1, [injury], "bandage"] call ACE_medical_fnc_handleBandageOpening - * - * Public: No - */ - -params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; - -private _classID = _injury select 1; -private _className = GVAR(woundClassNames) select _classID; - -// default, just in case.. -private _reopeningChance = 0.1; -private _reopeningMinDelay = 120; -private _reopeningMaxDelay = 200; - -// Get the default values for the used bandage -private _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); -if (isClass (_config >> _bandage)) then { - _config = (_config >> _bandage); - _reopeningChance = getNumber (_config >> "reopeningChance"); - _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); - _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; -} else { - WARNING_2("No config for bandage [%1] config base [%2]", _bandage, _config); -}; - -if (isClass (_config >> _className)) then { - private _woundTreatmentConfig = (_config >> _className); - if (isNumber (_woundTreatmentConfig >> "reopeningChance")) then { - _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); - }; - if (isNumber (_woundTreatmentConfig >> "reopeningMinDelay")) then { - _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); - }; - if (isNumber (_woundTreatmentConfig >> "reopeningMaxDelay")) then { - _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; - }; -} else { - WARNING_2("No config for wound type [%1] config base [%2]", _className, _config); -}; -TRACE_5("configs",_bandage,_className,_reopeningChance,_reopeningMinDelay,_reopeningMaxDelay); - -private _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; -private _injuryType = _injury select 1; -private _exist = false; -private _bandagedInjury = []; -{ - if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { - _exist = true; - private _existingInjury = _x; - _existingInjury set [3, (_existingInjury select 3) + _impact]; - _bandagedWounds set [_foreachIndex, _existingInjury]; - - _bandagedInjury = _existingInjury; - }; -} foreach _bandagedWounds; - -if !(_exist) then { - // [ID, classID, bodypart, percentage treated, bloodloss rate] - _bandagedInjury = [_injury select 0, _injury select 1, _injury select 2, _impact, _injury select 4]; - _bandagedWounds pushback _bandagedInjury; -}; - -_target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; - -TRACE_1("",_reopeningChance); -// Check if we are ever going to reopen this -if (random(1) <= _reopeningChance) then { - private _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); - TRACE_1("Will open",_delay); - [{ - params ["_target", "_impact", "_part", "_injuryIndex", "_injury"]; - TRACE_5("params",_target,_impact,_part,_injuryIndex,_injury); - - //if (alive _target) then { - private _openWounds = _target getVariable [QGVAR(openWounds), []]; - if ((count _openWounds) - 1 < _injuryIndex) exitwith {}; - private _selectedInjury = _openWounds select _injuryIndex; - if (_selectedInjury select 1 == _injury select 1 && (_selectedInjury select 2) == (_injury select 2)) then { // matching the IDs - - private _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; - private _exist = false; - private _injuryId = _injury select 1; - { - if ((_x select 1) == _injuryId && (_x select 2) == (_injury select 2)) exitwith { - _exist = true; - private _existingInjury = _x; - _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; - _bandagedWounds set [_foreachIndex, _existingInjury]; - }; - } foreach _bandagedWounds; - - if (_exist) then { - TRACE_2("Reopening Wound",_bandagedWounds,_openWounds); - _selectedInjury set [3, (_selectedInjury select 3) + _impact]; - _openWounds set [_injuryIndex, _selectedInjury]; - _target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; - _target setVariable [QGVAR(openWounds), _openWounds, true]; - }; - }; - // Otherwise something went wrong, we we don't reopen them.. - //}; - }, [_target, _impact, _part, _injuryIndex, +_injury], _delay] call CBA_fnc_waitAndExecute; -}; diff --git a/addons/medical/functions/fnc_handleCollisionDamage.sqf b/addons/medical/functions/fnc_handleCollisionDamage.sqf deleted file mode 100644 index aaaa3f894be..00000000000 --- a/addons/medical/functions/fnc_handleCollisionDamage.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * - * - * Arguments: - * 0: Unit - * 1: New Damage - * - * Return Value: - * None - * - * Example: - * [bob, 2] call ACE_medical_fnc_handleCollisionDamage - * - * Public: No - */ - -params ["_unit", "_newDamage"]; - -private _selection = "body"; - -private _totalDamage = (_unit getHit _selection) + _newDamage; - -_unit setHit [_selection, _totalDamage]; - -systemChat format ["collision: %1", _this]; diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf deleted file mode 100644 index 7a39fe767ad..00000000000 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ /dev/null @@ -1,57 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * handle Litter Create - * - * Arguments: - * 0: Litter Class - * 1: Position - * 2: Unit - * - * Return Value: - * None - * - * Example: - * ["litter", [2, 5, 6], bob] call ACE_medical_fnc_handleCreateLitter - * - * Public: No - */ - -params ["_litterClass", "_position", "_direction"]; -TRACE_3("params",_litterClass,_position,_direction); - -//IGNORE_PRIVATE_WARNING(_values); - -if (isNil QGVAR(allCreatedLitter)) then { - GVAR(allCreatedLitter) = []; - GVAR(litterPFHRunning) = false; -}; - -private _p3dFile = getText (configFile >> "CfgVehicles" >> _litterClass >> "model"); -if (_p3dFile == "") exitWith {TRACE_2("no model",_litterClass,_p3dFile)}; -// createSimpleObject expects a path without the leading slash -if ((_p3dFile select [0,1]) == "\") then {_p3dFile = _p3dFile select [1];}; - -private _litterObject = createSimpleObject [_p3dFile, [0,0,0]]; -TRACE_2("created",_litterClass,_litterObject); -_litterObject setDir _direction; -_litterObject setPosATL _position; -// Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112 -[{ params ["_object", "_pos"]; _object setPosATL _pos; }, [_litterObject, _position]] call CBA_fnc_execNextFrame; - -private _maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); -if ((count GVAR(allCreatedLitter)) > _maxLitterCount) then { - // gank the first litter object, and spawn ours. - private _oldLitter = GVAR(allCreatedLitter) deleteAt 0; - { - deleteVehicle _x; - } forEach (_oldLitter select 1); -}; - -GVAR(allCreatedLitter) pushBack [CBA_missionTime, [_litterObject]]; - -if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { - // Start the litter cleanup loop - GVAR(litterPFHRunning) = true; - call FUNC(litterCleanupLoop); -}; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf deleted file mode 100644 index ea4c5d96116..00000000000 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ /dev/null @@ -1,147 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal, commy2 - * Main HandleDamage EH function. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: HitPointIndex (-1 for structural) - * 6: Shooter - * - * Return Value: - * Damage To Be Inflicted - * - * Example: - * [bob, "leg", 2, kevin, "bullet", -1, kevin] call ACE_medical_fnc_handleDamage - * - * Public: No - */ - -_this = _this select [0, 7]; -params ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_hitPointIndex"]; -TRACE_5("ACE_DEBUG: HandleDamage Called",_unit, _selection, _damage, _shooter, _projectile); - -// bug, apparently can fire for remote units in special cases -if !(local _unit) exitWith { - TRACE_2("ACE_DEBUG: HandleDamage on remote unit!",_unit, isServer); - nil -}; - -// bug, assumed fixed, @todo excessive testing, if nothing happens remove -if (_projectile isEqualType objNull) then { - _projectile = typeOf _projectile; - _this set [4, _projectile]; -}; - -TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage,_unit); - -// If damage is in dummy hitpoints, "hands" and "legs", don't change anything -if (_selection == "hands") exitWith {_unit getHit "hands"}; -if (_selection == "legs") exitWith {_unit getHit "legs"}; -if (_selection == "arms") exitWith {_unit getHit "arms"}; - -// Deal with the new hitpoint and selection names introduced with Arma v1.50 and later. -// This will convert new selection names into selection names that the medical system understands -// TODO This should be cleaned up when we revisit the medical system at a later stage -// and instead we should deal with the new hitpoints directly -_selection = [_unit, _selection, _hitPointIndex] call FUNC(translateSelections); -_this set [1, _selection]; // ensure that the parameters are set correctly - -// If the damage is being weird, we just tell it to fuck off. Ignore: "hands", "legs", "arms" -if (_selection != "" && {!(_selection in GVAR(SELECTIONS))}) exitWith {0}; - -// Exit if we disable damage temporarily -if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { - TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit,_unit); - if (_selection == "") then { - damage _unit - } else { - _unit getHit _selection - }; -}; - -// Get return damage -private _damageReturn = _damage; - -private _newDamage = _this call FUNC(handleDamage_caching); -// handleDamage_caching may have modified the projectile string -private _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); - -TRACE_3("ACE_DEBUG: HandleDamage caching new damage",_selection,_newDamage,_unit); - -private _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); -private _minLethalDamage = if (_typeIndex >= 0) then { - GVAR(minLethalDamages) select _typeIndex -} else { - 0.01 -}; - -if (!isNull _shooter) then { - _unit setvariable [QGVAR(lastDamageSource), _shooter, false]; -}; - -private _vehicle = vehicle _unit; -private _effectiveSelectionName = _selection; -if ((_vehicle != _unit) && {!(_vehicle isKindOf "StaticWeapon")} && {_shooter in [objNull, driver _vehicle, _vehicle]} && {_projectile == ""} && {_selection == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _effectiveSelectionName = _this select 1; //pull random selection from HDC - }; -}; - -if ((_minLethalDamage <= _newDamage) && {[_unit, [_effectiveSelectionName] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { - if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith { - _damageReturn = 0.9; - }; - if ([_unit, false, true] call FUNC(setDead)) then { - _damageReturn = 1; - } else { - _damageReturn = _damageReturn min 0.89; - }; -} else { - _damageReturn = _damageReturn min 0.89; -}; - -// Start the loop that tracks the unit vitals -[_unit] call FUNC(addVitalLoop); - -if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { - private _delayedUnconsicous = false; - if (_vehicle != _unit and {damage _vehicle >= 1}) then { - [_unit] call EFUNC(common,unloadPerson); - _delayedUnconsicous = true; - }; - - if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { - if (_unit getVariable ["ACE_isUnconscious", false]) exitwith { - [_unit, false, true] call FUNC(setDead); - 0.89; - }; - if (_delayedUnconsicous) then { - [{ - [_this select 0, true] call FUNC(setUnconscious); - }, [_unit], 0.7] call CBA_fnc_waitAndExecute; - } else { - [{ - [_this select 0, true] call FUNC(setUnconscious); - }, [_unit]] call CBA_fnc_execNextFrame; - }; - 0.89; - }; - _damageReturn min 0.89; -}; - -if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { - if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { - [_unit] call EFUNC(common,unloadPerson); - }; - [_unit, false, true] call FUNC(setDead); - 0.89; -}; - -TRACE_3("ACE_DEBUG: HandleDamage damage return",_selection,_damageReturn,_unit); - -_damageReturn diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf deleted file mode 100644 index 049b6a004c9..00000000000 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ /dev/null @@ -1,73 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Advanced HandleDamage EH function. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: Hit part index of the hit point - * 6: Shooter? - * 7: Current damage to be returned - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "bullet", 2, kevin, 2] call ACE_medical_fnc_handleDamage_advanced - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfProjectile", "_hitPointNumber", "", "_newDamage"]; - -// For burning damage we will get a ton of very small hits of damage; they are too small to create any wounds -// Save them up in a variable and run when it is over a noticable amount - -if ((_typeOfProjectile == "") && {_newDamage < 0.15} && { - _newDamage = _newDamage + (_unit getVariable [QGVAR(trivialDamage), 0]); - if (_newDamage > 0.15) then { - // if the new sum is large enough, reset variable and continue with it added in - _unit setVariable [QGVAR(trivialDamage), 0]; - false - } else { - // otherwise just save the new sum into the variable and exit - _unit setVariable [QGVAR(trivialDamage), _newDamage]; - true // exit - }; -}) exitWith {}; - -private _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part < 0) exitWith {}; - -private _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; -// Sorting out the damage -private _damageBodyParts = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - -_damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; -_unit setVariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; - -private _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); - -[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); - -// TODO Disabled until implemented fully -//if (GVAR(enableAirway)) then { -// [_unit,_selectionName,_newDamage,_sourceOfDamage, _typeOfDamage] call FUNC(handleDamage_airway); -//}; -//if (GVAR(enableFractures)) then { -// [_unit,_selectionName,_newDamage,_sourceOfDamage, _typeOfDamage] call FUNC(handleDamage_fractures); -//}; -//if (GVAR(enableInternalBleeding)) then { -// [_unit,_selectionName,_newDamage,_sourceOfDamage, _typeOfDamage] call FUNC(handleDamage_internalInjuries); -//}; - -if (alive _unit && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { - // If it reaches this, we can assume that the hit did not kill this unit, as this function is called 3 frames after the damage has been passed. - if ([_unit, _part, if (_part > 1) then {_newDamage * 1.3} else {_newDamage * 2}] call FUNC(determineIfFatal)) then { - [_unit] call FUNC(setUnconscious); - }; -}; diff --git a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf deleted file mode 100644 index 8bf6d8f8e04..00000000000 --- a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Sets the hitpoint damage for au nit to the correct values - * - * Arguments: - * 0: Unit for which the hitpoint damage will be sorted out - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleDamage_advancedSetDamage - * - * Public: No - */ - -params ["_unit"]; - -if (!local _unit) exitWith {}; - -// ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] -private _bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - -_bodyStatus params ["_headDamage", "_torsoDamage", "_handsDamageR", "_handsDamageL", "_legsDamageR", "_legsDamageL"]; - -_unit setHitPointDamage ["hitHead", _headDamage min 0.95]; -_unit setHitPointDamage ["hitBody", _torsoDamage min 0.95]; -_unit setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; -_unit setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; - -if (_bodyStatus isEqualTo [0,0,0,0,0,0]) then { - _unit setDamage 0; -}; diff --git a/addons/medical/functions/fnc_handleDamage_airway.sqf b/addons/medical/functions/fnc_handleDamage_airway.sqf deleted file mode 100644 index 6b033dee365..00000000000 --- a/addons/medical/functions/fnc_handleDamage_airway.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the airway injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_airway - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); - -if (_bodyPartn > 1) exitWith {}; - -if (_amountOfDamage > 0.5) then { - if (random(1) >= 0.8) then { - if !(_unit getVariable[QGVAR(airwayCollapsed), false]) then { - _unit setVariable [QGVAR(airwayCollapsed), true, true]; - }; - }; -}; diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf deleted file mode 100644 index 42cb8c3e053..00000000000 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ /dev/null @@ -1,152 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Cache a handleDamage call to execute it 3 frames later - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: HitPointIndex (-1 for structural) - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "bullet", -1] call ACE_medical_fnc_handleDamage_caching - * - * Public: No - */ - -params ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitPointIndex"]; - -private _hitSelections = GVAR(SELECTIONS); - -// Calculate change in damage - use getHitIndex because selection is translated (hitdiaphragm->body) -private _newDamage = _damage - (damage _unit); -if (_hitPointIndex >= 0) then {_newDamage = _damage - (_unit getHitIndex _hitPointIndex)}; - -TRACE_7("ACE_DEBUG: HandleDamage_Caching Called",_unit, _selectionName, _damage, _source, _projectile,_hitPointIndex,_newDamage); - -// Check for vehicle crash -private _vehicle = vehicle _unit; -if ((_vehicle != _unit) && {!(_vehicle isKindOf "StaticWeapon")} && {_source in [objNull, driver _vehicle, _vehicle]} && {_projectile == ""} && {_selectionName == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _selectionName = selectRandom _hitSelections; - _projectile = "vehiclecrash"; - _this set [1, _selectionName]; - _this set [4, _projectile]; - }; -}; - -// Handle falling damage -private _impactVelocity = (velocity _unit) select 2; -if (_impactVelocity < -5 && {_vehicle == _unit}) then { - TRACE_1("Starting isFalling", time); - _unit setVariable [QGVAR(isFalling), true]; - _unit setVariable [QGVAR(impactVelocity), _impactVelocity]; -} else { - if ((_unit getVariable [QGVAR(isFalling), false]) && {diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2}) then { - TRACE_1("Ending isFalling", time); - _unit setVariable [QGVAR(isFalling), false]; - }; -}; - -if (_unit getVariable [QGVAR(isFalling), false]) then { - if !(_selectionName in ["", "leg_l", "leg_r"]) then { - if (_selectionName == "body") then { - _newDamage = _newDamage * abs(_unit getVariable [QGVAR(impactVelocity), _impactVelocity]) / 50; - } else { - _newDamage = _newDamage * 0.5; - }; - if (_newDamage < 0.075) then {_newDamage = 0;}; //Filter minor falling damage to non-leg hitpoints - } else { - if (_selectionName == "") then { - _selectionName = selectRandom ["leg_l", "leg_r"]; - _this set [1, _selectionName]; - }; - _newDamage = _newDamage * 0.7; - }; - _projectile = "falling"; - _this set [4, "falling"]; -}; - -// Finished with the current frame, reset variables -// Note: sometimes handleDamage spans over 2 or even 3 frames. -if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) then { - _unit setVariable [QGVAR(frameNo_damageCaching), diag_frameno]; - - // handle the cached damages 2 frames later - [{ - [{ - params ["_unit"]; - _unit setDamage 0; - private _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; - private _cache_damages = _unit getVariable QGVAR(cachedDamages); - { - (_x + [_cache_damages select _forEachIndex]) call FUNC(handleDamage_advanced); - } forEach _cache_params; - [_unit] call FUNC(handleDamage_advancedSetDamage); - }, _this] call CBA_fnc_execNextFrame; - }, _unit] call CBA_fnc_execNextFrame; - - _unit setVariable [QGVAR(cachedProjectiles), []]; - _unit setVariable [QGVAR(cachedHitPoints), []]; - _unit setVariable [QGVAR(cachedDamages), []]; - _unit setVariable [QGVAR(cachedHandleDamageParams), []]; -}; - -// Caching of the damage events -if (_selectionName != "") then { - private _cache_projectiles = _unit getVariable QGVAR(cachedProjectiles); - private _index = _cache_projectiles find _projectile; - - // Check if the current projectile has already been handled once - if (_index >= 0 && {_projectile != "falling"}) exitWith { - - private _cache_damages = _unit getVariable QGVAR(cachedDamages); - private _otherDamage = (_cache_damages select _index); // Find the previous damage this projectile has done - - // Take the highest damage of the two - if (_newDamage > _otherDamage) then { - private _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - private _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); - - // Restore the damage before the previous damage was processed - private _hitPoint = _cache_hitpoints select _index; - private _restore = ((_unit getHitIndex _hitPoint) - _otherDamage) max 0; - _unit setHitIndex [_hitPoint, _restore]; - - _cache_hitpoints set [_index, _hitPointIndex]; - _cache_damages set [_index, _newDamage]; - _cache_params set[_index, _this]; - - _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; - _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(cachedDamages), _cache_damages]; - _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; - }; - }; - - private _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); - private _cache_damages = _unit getVariable QGVAR(cachedDamages); - private _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - - // This is an unhandled projectile - _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack _hitPointIndex; - _cache_damages pushBack _newDamage; - _cache_params pushBack _this; - - // Store the new cached values - _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; - _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(cachedDamages), _cache_damages]; - _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; -}; - -TRACE_8("ACE_DEBUG: HandleDamage_Caching",_unit, _newDamage, _cache_params, _cache_damages, _unit getVariable QGVAR(cachedProjectiles), _unit getVariable QGVAR(cachedHitPoints), _unit getVariable QGVAR(cachedDamages), _unit getVariable QGVAR(cachedHandleDamageParams)); - -_newDamage diff --git a/addons/medical/functions/fnc_handleDamage_fractures.sqf b/addons/medical/functions/fnc_handleDamage_fractures.sqf deleted file mode 100644 index cc36b698c2a..00000000000 --- a/addons/medical/functions/fnc_handleDamage_fractures.sqf +++ /dev/null @@ -1,70 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the fracture injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_handleDamage_fractures - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); - -private _fractureType = 1; -if (_amountOfDamage > 0.05) then { - - // TODO specify fractures based off typeOfInjury details better. - switch (_typeOfDamage) do { - case "Bullet": { - _fractureType = round(random(2)); - }; - case "Grenade": { - _fractureType = round(random(2)); - if (_fractureType < 1) then { - _fractureType = 1; - }; - }; - case "Explosive": { - _fractureType = round(random(2)); - if (_fractureType < 1) then { - _fractureType = 1; - }; - }; - case "Shell": { - _fractureType = round(random(2)); - if (_fractureType < 1) then { - _fractureType = 1; - }; - }; - case "Unknown": { - _fractureType = round(random(1)); - }; - case "VehicleCrash": { - _fractureType = round(random(0)); - }; - default { - _fractureType = round(random(1)); - }; - }; - - private _fractures = _unit getVariable[QGVAR(fractures), []]; - private _fractureID = 1; - private _amountOf = count _fractures; - if (_amountOf > 0) then { - _fractureID = (_fractures select (_amountOf - 1) select 0) + 1; - }; - _fractures pushBack [_fractureID, _fractureType, _bodyPartn, 1 /* percentage treated */]; - _unit setVariable [QGVAR(fractures), _fractures, true]; -}; diff --git a/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf b/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf deleted file mode 100644 index 6f96b138c26..00000000000 --- a/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the internal injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_handleDamage_internalInjuries - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); - -// TODO implement internal injuries diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf deleted file mode 100644 index fdc06621c50..00000000000 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ /dev/null @@ -1,67 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_handleDamage_wounds - * - * Public: No - */ - -params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; -TRACE_6("ACE_DEBUG: HandleDamage Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage); - -if (_typeOfDamage == "") then {_typeOfDamage = "unknown";}; - -// Administration for open wounds and ids -private _openWounds = _unit getVariable[QGVAR(openWounds), []]; -private _woundID = _unit getVariable[QGVAR(lastUniqueWoundID), 1]; - -private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID]; - -private _painToAdd = 0; -private _woundsCreated = []; - -call compile _extensionOutput; -{ - _x params ["", "_toAddClassID", "_bodyPartNToAdd"]; - _foundIndex = -1; - { - _x params ["", "_compareId", "_comparyBodyPartN"]; - // Check if we have an id of the given class on the given bodypart already - if (_compareId == _toAddClassID && {_comparyBodyPartN == _bodyPartNToAdd}) exitWith { - _foundIndex = _forEachIndex; - }; - } forEach _openWounds; - - if (_foundIndex < 0) then { - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushBack _x; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - private _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; -} forEach _woundsCreated; - -_unit setVariable [QGVAR(openWounds), _openWounds, true]; - -// Only update if new wounds have been created -if (count _woundsCreated > 0) then { - _unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true]; -}; - -private _painLevel = _unit getVariable [QGVAR(pain), 0]; -_unit setVariable [QGVAR(pain), _painLevel + _painToAdd]; -TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated); diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf deleted file mode 100644 index 4cc51ce38f1..00000000000 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ /dev/null @@ -1,134 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 1, kevin, "shot"] call ACE_medical_fnc_handleDamage_woundsOld - * - * Public: No - */ - -params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; -TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage); - -// Convert the selectionName to a number and ensure it is a valid selection. -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); -if (_bodyPartn < 0) exitWith {}; - -// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] -private _injuryTypeInfo = missionNamespace getVariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; - -// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] -private _allInjuriesForDamageType = _injuryTypeInfo select 2; -// It appears we are dealing with an unknown type of damage. - -if (count _allInjuriesForDamageType == 0) then { - // grabbing the configuration for unknown damage type - _injuryTypeInfo = missionNamespace getVariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; - _allInjuriesForDamageType = _injuryTypeInfo select 2; -}; - -// find the available injuries for this damage type and damage amount -private _highestPossibleSpot = -1; -private _highestPossibleDamage = -1; -private _allPossibleInjuries = []; -{ - private _damageLevels = _x select 4; - _damageLevels params ["_minDamage","_maxDamage"]; - - // Check if the damage is higher as the min damage for the specific injury - if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - //private _classType = _x select 0; - private _selections = _x select 1; - //private _bloodLoss = _x select 2; - //private _pain = _x select 3; - - // Check if the injury can be applied to the given selection name - if ("All" in _selections || _selectionName in _selections) then { - - // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries - if (_minDamage > _highestPossibleDamage) then { - _highestPossibleSpot = _forEachIndex; - _highestPossibleDamage = _minDamage; - }; - - // Store the valid possible injury for the damage type, damage amount and selection - _allPossibleInjuries pushBack _x; - }; - }; -} forEach _allInjuriesForDamageType; - -// No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitWith {}; - -// Administration for open wounds and ids -private _openWounds = _unit getVariable[QGVAR(openWounds), []]; -private _woundID = _unit getVariable[QGVAR(lastUniqueWoundID), 1]; - -private _painToAdd = 0; -private _woundsCreated = []; -{ - if (_x select 0 <= _damage) exitWith { - for "_i" from 0 to ((_x select 1)-1) do { - - // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] - private _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {selectRandom _allPossibleInjuries}; - private _toAddClassID = _toAddInjury select 0; - private _foundIndex = -1; - - private _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; - // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. - if ((_injuryTypeInfo select 1)) then { - { - // Check if we have an id of the given class on the given bodypart already - if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitWith { - _foundIndex = _forEachIndex; - }; - } forEach _openWounds; - }; - - private _injury = []; - if (_foundIndex < 0) then { - // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] - _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; - - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushBack _injury; - - // New injuries will also increase the wound ID - _woundID = _woundID + 1; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; - // Store the injury so we can process it later correctly. - _woundsCreated pushBack _injury; - - // Collect the pain that is caused by this injury - _painToAdd = _painToAdd + (_toAddInjury select 3); - }; - }; -} forEach (_injuryTypeInfo select 0); // forEach damage thresholds - -_unit setVariable [QGVAR(openWounds), _openWounds, true]; - -// Only update if new wounds have been created -if (count _woundsCreated > 0) then { - _unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true]; -}; - -private _painLevel = _unit getVariable [QGVAR(pain), 0]; -_unit setVariable [QGVAR(pain), _painLevel + _painToAdd]; -TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated); diff --git a/addons/medical/functions/fnc_handleInit.sqf b/addons/medical/functions/fnc_handleInit.sqf deleted file mode 100644 index 3431713d5df..00000000000 --- a/addons/medical/functions/fnc_handleInit.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Called when a unit is initialized via XEH_init - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleInit - * - * Public: No - */ - -params ["_unit"]; - -_unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; - -if (local _unit) then { - if (!EGVAR(common,settingsInitFinished)) exitWith { - EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(init), [_unit]]; - }; - [_unit] call FUNC(init); -}; diff --git a/addons/medical/functions/fnc_handleKilled.sqf b/addons/medical/functions/fnc_handleKilled.sqf deleted file mode 100644 index 9a2e8d2f637..00000000000 --- a/addons/medical/functions/fnc_handleKilled.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Called when a unit is killed - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleKilled - * - * Public: No - */ - -params ["_unit"]; -if (!local _unit) exitWith {}; - -_unit setVariable [QGVAR(pain), 0]; -if (GVAR(level) >= 2) then { - _unit setVariable [QGVAR(heartRate), 0]; - _unit setVariable [QGVAR(bloodPressure), [0, 0]]; - _unit setVariable [QGVAR(airwayStatus), 0]; -}; diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf deleted file mode 100644 index 06047f55456..00000000000 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Called when a unit switched locality - * - * Arguments: - * 0: The Unit - * 1: Is local - * - * Return Value: - * None - * - * Example: - * [bob, true] call ACE_medical_fnc_handleLocal - * - * Public: No - */ - -params ["_unit", "_local"]; -if (_local) then { - // If the unit had a loop tracking its vitals, restart it locally - if (_unit getVariable[QGVAR(addedToUnitLoop),false]) then { - [_unit, true] call FUNC(addVitalLoop); - }; - - if ((_unit getVariable ["ACE_isUnconscious",false]) && {count (_unit getVariable [QGVAR(unconsciousArguments), []]) >= 6}) then { - private _arguments = (_unit getVariable [QGVAR(unconsciousArguments), []]); - _arguments set [2, CBA_missionTime]; - - [DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler; - - _unit setVariable [QGVAR(unconsciousArguments), nil, true]; - }; -}; diff --git a/addons/medical/functions/fnc_handleRespawn.sqf b/addons/medical/functions/fnc_handleRespawn.sqf deleted file mode 100644 index be8f5f4f293..00000000000 --- a/addons/medical/functions/fnc_handleRespawn.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Called when a unit is Respawned - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleRespawn - * - * Public: No - */ - -params ["_unit"]; - -// reset all variables. @todo GROUP respawn? -[_unit] call FUNC(init); - -// Reset captive status for respawning unit -if (!(_unit getVariable ["ACE_isUnconscious", false])) then { - [_unit, "setHidden", "ace_unconscious", false] call EFUNC(common,statusEffect_set); -}; - -// Remove maximum unconsciousness time handler -_maxUnconHandle = _unit getVariable [QGVAR(maxUnconTimeHandle), -1]; -if (_maxUnconHandle > 0) then { - [_maxUnconHandle] call CBA_fnc_removePerFrameHandler; -}; diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf deleted file mode 100644 index a593c8e5799..00000000000 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ /dev/null @@ -1,146 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Updates the vitals. Is expected to be called every second. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleUnitVitals - * - * Public: No - */ - -params ["_unit", "_interval"]; -TRACE_3("ACE_DEBUG",_unit,_interval,_unit); -if (_interval == 0) exitWith {}; - -private _lastTimeValuesSynced = _unit getVariable [QGVAR(lastMomentValuesSynced), 0]; -private _syncValues = (CBA_missionTime - _lastTimeValuesSynced >= (10 + floor(random(10))) && GVAR(keepLocalSettingsSynced)); -if (_syncValues) then { - _unit setVariable [QGVAR(lastMomentValuesSynced), CBA_missionTime]; -}; - -private _bloodVolume = (_unit getVariable [QGVAR(bloodVolume), 100]) + ([_unit, _syncValues] call FUNC(getBloodVolumeChange)); -_bloodVolume = _bloodVolume max 0; - -_unit setVariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; - -TRACE_3("ACE_DEBUG",_bloodVolume,_syncValues,_unit); -// Set variables for synchronizing information across the net -if (_bloodVolume < 100) then { - if (_bloodVolume < 90) then { - TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); - if (_unit getVariable [QGVAR(hasLostBlood), 0] != 2) then { - _unit setVariable [QGVAR(hasLostBlood), 2, true]; - }; - } else { - TRACE_4("ACE_DEBUG", _bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); - if (_unit getVariable [QGVAR(hasLostBlood), 0] != 1) then { - _unit setVariable [QGVAR(hasLostBlood), 1, true]; - }; - }; -} else { - TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); - if (_unit getVariable [QGVAR(hasLostBlood), 0] != 0) then { - _unit setVariable [QGVAR(hasLostBlood), 0, true]; - }; -}; - -TRACE_3("ACE_DEBUG",[_unit] call FUNC(getBloodLoss),_unit getVariable QGVAR(isBleeding),_unit); -if (([_unit] call FUNC(getBloodLoss)) > 0) then { - if !(_unit getVariable [QGVAR(isBleeding), false]) then { - _unit setVariable [QGVAR(isBleeding), true, true]; - }; -} else { - if (_unit getVariable [QGVAR(isBleeding), false]) then { - _unit setVariable [QGVAR(isBleeding), false, true]; - }; -}; - -private _painStatus = _unit getVariable [QGVAR(pain), 0]; -TRACE_4("ACE_DEBUG",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(painSuppress),_unit); -if (_painStatus > (_unit getVariable [QGVAR(painSuppress), 0])) then { - if !(_unit getVariable [QGVAR(hasPain), false]) then { - _unit setVariable [QGVAR(hasPain), true, true]; - }; -} else { - if (_unit getVariable [QGVAR(hasPain), false]) then { - _unit setVariable [QGVAR(hasPain), false, true]; - }; -}; - -if (_bloodVolume < 30) exitWith { - [_unit] call FUNC(setDead); -}; - -if ([_unit] call EFUNC(common,isAwake)) then { - if (_bloodVolume < 60) then { - if (random(1) > 0.9) then { - [_unit, true, 15 + random(20)] call FUNC(setUnconscious); - }; - }; -}; - -if (GVAR(level) == 1) then { - TRACE_5("ACE_DEBUG_BASIC_VITALS",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); - // reduce pain - if (_painStatus > 0) then { - _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; - }; - - // reduce painkillers - if (_unit getVariable [QGVAR(morphine), 0] > 0) then { - _unit setVariable [QGVAR(morphine), ((_unit getVariable [QGVAR(morphine), 0]) - 0.0015 * _interval) max 0, _syncValues]; - }; -}; - -// handle advanced medical, with vitals -if (GVAR(level) >= 2) then { - TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, _unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); - - // Handle pain due tourniquets, that have been applied more than 120 s ago - private _oldTourniquets = (_unit getVariable [QGVAR(tourniquets), []]) select {_x > 0 && {CBA_missionTime - _x > 120}}; - // Increase pain at a rate of 0.001 units/s per old tourniquet - _painStatus = _painStatus + (count _oldTourniquets) * 0.001 * _interval; - - // Set the vitals - private _heartRate = (_unit getVariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval); - _unit setVariable [QGVAR(heartRate), _heartRate max 0, _syncValues]; - - private _bloodPressure = [_unit] call FUNC(getBloodPressure); - _unit setVariable [QGVAR(bloodPressure), _bloodPressure, _syncValues]; - - _painReduce = [0.001, 0.002] select (_painStatus > 5); - - // @todo: replace this and the rest of the setVariable with EFUNC(common,setApproximateVariablePublic) - _unit setVariable [QGVAR(pain), (_painStatus - _painReduce * _interval) max 0, _syncValues]; - - TRACE_8("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_painReduce,_heartRate,_bloodVolume,_bloodPressure,_interval,_syncValues,_unit); - - // Check vitals for medical status - // TODO check for in revive state instead of variable - _bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; - - if (!(_unit getVariable [QGVAR(inCardiacArrest),false])) then { - if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then { - [_unit, true, 10+ random(20)] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already. - }; - - if ((_bloodPressureH > 260) - || {_bloodPressureL < 40 && ({_heartRate > 190})} - || {(_bloodPressureH > 145 && {_heartRate > 150})}) then { - - if (random(1) > 0.7) then { - [_unit] call FUNC(setCardiacArrest); - }; - }; - if (_heartRate > 200 || (_heartRate < 20)) then { - [_unit] call FUNC(setCardiacArrest); - }; - }; -}; diff --git a/addons/medical/functions/fnc_hasItem.sqf b/addons/medical/functions/fnc_hasItem.sqf deleted file mode 100644 index 1174563dfca..00000000000 --- a/addons/medical/functions/fnc_hasItem.sqf +++ /dev/null @@ -1,43 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if the item is present between the patient and the medic - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Item - * - * Return Value: - * None - * - * Example: - * [bob, patient, "bandage"] call ace_medical_fnc_hasItem - * - * Public: Yes - */ - -params ["_medic", "_patient", "_item"]; - -if (isNil QGVAR(setting_allowSharedEquipment)) then { - GVAR(setting_allowSharedEquipment) = true; -}; -if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { - true -}; - -if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { - true -}; - -private _return = false; -if ((vehicle _medic != _medic) && {[vehicle _medic] call FUNC(isMedicalVehicle)}) then { - private _crew = crew vehicle _medic; - { - if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitWith { - _return = true; - }; - } forEach _crew; -}; - -_return diff --git a/addons/medical/functions/fnc_hasItems.sqf b/addons/medical/functions/fnc_hasItems.sqf deleted file mode 100644 index 1ea0f15b657..00000000000 --- a/addons/medical/functions/fnc_hasItems.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if all items are present between the patient and the medic. - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Items > - * - * Return Value: - * Has the items - * - * Example: - * [bob, patient, ["bandage", "morphine"]] call ace_medical_fnc_hasItems - * - * Public: Yes - */ - -params ["_medic", "_patient", "_items"]; - -private _return = true; -{ - // - if (_x isEqualType [] && {({[_medic, _patient, _x] call FUNC(hasItem)}count _x == 0)}) exitwith { - _return = false; - }; - if (_x isEqualType "" && {!([_medic, _patient, _x] call FUNC(hasItem))}) exitwith { - _return = false; - }; -}foreach _items; - -_return diff --git a/addons/medical/functions/fnc_hasMedicalEnabled.sqf b/addons/medical/functions/fnc_hasMedicalEnabled.sqf deleted file mode 100644 index c034648c335..00000000000 --- a/addons/medical/functions/fnc_hasMedicalEnabled.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if unit has CMS enabled - * - * Arguments: - * 0: unit - * - * Return Value: - * enabled - * - * Example: - * [Unit] call ace_medical_fnc_hasMedicalEnabled - * - * Public: No - */ - -params ["_unit"]; - -private _medicalEnabled = _unit getVariable QGVAR(enableMedical); -if (isNil "_medicalEnabled") exitWith { - (((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getVariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1) -}; - -_medicalEnabled diff --git a/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf deleted file mode 100644 index 852bddfa12c..00000000000 --- a/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if unit has a tourniquet applied to the specified bodypart - * - * Arguments: - * 0: The Unit - * 1: SelectionName - * - * Return Value: - * Has tourniquet applied - * - * Example: - * [bob, "leg"] call ace_medical_fnc_hasTourniquetAppliedTo - * - * Public: Yes - */ - -params ["_target", "_selectionName"]; - -(((_target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0); diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf deleted file mode 100644 index a9f164eb0f6..00000000000 --- a/addons/medical/functions/fnc_init.sqf +++ /dev/null @@ -1,88 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, commy2 - * Initializes unit variables. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_init - * - * Public: No - */ - -params ["_unit"]; - -// basic -_unit setVariable [QGVAR(pain), 0, true]; -_unit setVariable [QGVAR(morphine), 0, true]; -_unit setVariable [QGVAR(bloodVolume), 100, true]; -_unit setVariable ["ACE_isUnconscious", false, true]; - -// advanced -// tourniquets -_unit setVariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; - -//Delayed Medications (from tourniquets) -_unit setVariable [QGVAR(occludedMedications), nil, true]; - -// wounds and injuries -_unit setVariable [QGVAR(openWounds), [], true]; -_unit setVariable [QGVAR(bandagedWounds), [], true]; -_unit setVariable [QGVAR(internalWounds), [], true]; -_unit setVariable [QGVAR(lastUniqueWoundID), 1, true]; - -// vitals -_unit setVariable [QGVAR(heartRate), 80]; -_unit setVariable [QGVAR(heartRateAdjustments), []]; -_unit setVariable [QGVAR(bloodPressure), [80, 120]]; -_unit setVariable [QGVAR(peripheralResistance), 100]; - -// fractures -_unit setVariable [QGVAR(fractures), [], true]; - -// triage card and logs -_unit setVariable [QGVAR(triageLevel), 0, true]; -_unit setVariable [QGVAR(triageCard), [], true]; - -// IVs -_unit setVariable [QGVAR(ivBags), nil, true]; - -// damage storage -_unit setVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; - -// airway -_unit setVariable [QGVAR(airwayStatus), 100]; -_unit setVariable [QGVAR(airwayOccluded), false]; -_unit setVariable [QGVAR(airwayCollapsed), false]; - -// generic medical admin -_unit setVariable [QGVAR(addedToUnitLoop), false, true]; -_unit setVariable [QGVAR(inCardiacArrest), false, true]; -_unit setVariable [QGVAR(hasLostBlood), 0, true]; -_unit setVariable [QGVAR(isBleeding), false, true]; -_unit setVariable [QGVAR(hasPain), false, true]; -_unit setVariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; -_unit setVariable [QGVAR(painSuppress), 0, true]; - -// medication -private _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; -{ - _unit setVariable [_x select 0, nil]; -} forEach _allUsedMedication; -_unit setVariable [QGVAR(allUsedMedication), [], true]; - -private _logs = _unit getVariable [QGVAR(allLogs), []]; -{ - _unit setVariable [_x, nil]; -} forEach _logs; -_unit setVariable [QGVAR(allLogs), [], true]; - -// items -[{ - _this call FUNC(itemCheck); -}, [_unit], 0.5, 0.1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_isBeingCarried.sqf b/addons/medical/functions/fnc_isBeingCarried.sqf deleted file mode 100644 index 79a0f4ce9dd..00000000000 --- a/addons/medical/functions/fnc_isBeingCarried.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Returns if a target is being carried. (from ace_dragging) - * - * Arguments: - * 0: Target Unit - * - * Return Value: - * Is being carried - * - * Example: - * [bob] call ace_medical_fnc_isBeingCarried - * - * Public: No - */ - -params ["_target"]; - -private _owner = _target getVariable [QEGVAR(common,owner), objNull]; - -if (isNull _owner) exitWith {false}; - -(_owner getVariable [QEGVAR(dragging,carriedObject), objNull]) == _target diff --git a/addons/medical/functions/fnc_isBeingDragged.sqf b/addons/medical/functions/fnc_isBeingDragged.sqf deleted file mode 100644 index e10ba60b8f5..00000000000 --- a/addons/medical/functions/fnc_isBeingDragged.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Returns if a target is being dragged. (from ace_dragging) - * - * Arguments: - * 0: Target Unit - * - * Return Value: - * Is being dragged - * - * Example: - * [bob] call ace_medical_fnc_isBeingDragged - * - * Public: No - */ - -params ["_target"]; - -private _owner = _target getVariable [QEGVAR(common,owner), objNull]; - -if (isNull _owner) exitWith {false}; - -(_owner getVariable [QEGVAR(dragging,draggedObject), objNull]) == _target diff --git a/addons/medical/functions/fnc_isInMedicalFacility.sqf b/addons/medical/functions/fnc_isInMedicalFacility.sqf deleted file mode 100644 index 9d12bd96403..00000000000 --- a/addons/medical/functions/fnc_isInMedicalFacility.sqf +++ /dev/null @@ -1,63 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Checks if a unit is in a designated medical facility - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Is in medical facility - * - * Example: - * [player] call ace_medical_fnc_isInMedicalFacility - * - * Public: Yes - */ - -params ["_unit"]; - -//Cache the results as this function could be called rapidly -(_unit getVariable [QGVAR(cacheInFacility), [-9, false]]) params ["_expireTime", "_lastResult"]; -if (CBA_missionTime < _expireTime) exitWith {_lastResult}; - -private _eyePos = eyePos _unit; -private _isInBuilding = false; - -private _medicalFacility = - [ - "TK_GUE_WarfareBFieldhHospital_Base_EP1", - "TK_GUE_WarfareBFieldhHospital_EP1", - "TK_WarfareBFieldhHospital_Base_EP1", - "TK_WarfareBFieldhHospital_EP1", - "US_WarfareBFieldhHospital_Base_EP1", - "US_WarfareBFieldhHospital_EP1", - "MASH_EP1", - "MASH", - "Land_A_Hospital", - "CDF_WarfareBFieldhHospital", - "GUE_WarfareBFieldhHospital", - "INS_WarfareBFieldhHospital", - "RU_WarfareBFieldhHospital", - "USMC_WarfareBFieldhHospital" - ]; - -private _objects = (lineIntersectsWith [_unit modelToWorldVisual [0, 0, (_eyePos select 2)], _unit modelToWorldVisual [0, 0, (_eyePos select 2) +10], _unit]); -{ - if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitWith { - _isInBuilding = true; - }; -} forEach _objects; -if (!_isInBuilding) then { - _objects = _unit nearObjects 7.5; - { - if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitWith { - _isInBuilding = true; - }; - } forEach _objects; -}; - -//Save the results (with a 1 second expiry) -_unit setVariable [QGVAR(cacheInFacility), [CBA_missionTime + 1, _isInBuilding]]; - -_isInBuilding; diff --git a/addons/medical/functions/fnc_isInMedicalVehicle.sqf b/addons/medical/functions/fnc_isInMedicalVehicle.sqf deleted file mode 100644 index 77b36caa25b..00000000000 --- a/addons/medical/functions/fnc_isInMedicalVehicle.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Checks if a unit is in a medical vehicle. - * - * Arguments: - * 0: unit to be checked - * - * Return Value: - * Is unit in medical vehicle? - * - * Example: - * [player] call ace_medical_fnc_isInMedicalVehicle - * - * Public: Yes - */ - -params ["_unit"]; -private _vehicle = vehicle _unit; - -if (_unit == _vehicle) exitWith {false}; -if (_unit in [driver _vehicle, gunner _vehicle, commander _vehicle]) exitWith {false}; - -(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 diff --git a/addons/medical/functions/fnc_isInStableCondition.sqf b/addons/medical/functions/fnc_isInStableCondition.sqf deleted file mode 100644 index da56ea402ea..00000000000 --- a/addons/medical/functions/fnc_isInStableCondition.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if a unit is in a stable condition - * - * Arguments: - * 0: The patient - * - * Return Value: - * Is in stable condition - * - * Example: - * [bob] call ACE_medical_fnc_isInStableCondition - * - * Public: No - */ - -params ["_unit"]; - -private _totalBloodLoss = 0; -{ - // total bleeding ratio * percentage of injury left - _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); -} forEach (_unit getVariable [QGVAR(openWounds), []]); - -(_totalBloodLoss == 0); diff --git a/addons/medical/functions/fnc_isMedic.sqf b/addons/medical/functions/fnc_isMedic.sqf deleted file mode 100644 index 580733b4d5a..00000000000 --- a/addons/medical/functions/fnc_isMedic.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, KoffeinFlummi - * Check if a unit is any medical class - * - * Arguments: - * 0: The Unit - * 1: Class (default: 1) - * - * Return Value: - * Is in of medic class - * - * Example: - * [player] call ace_medical_fnc_isMedic - * - * Public: Yes - */ - -params ["_unit", ["_medicN", 1]]; - -private _class = _unit getVariable [QGVAR(medicClass), [0, 1] select (_unit getUnitTrait "medic")]; - -if (_class >= _medicN min GVAR(medicSetting)) exitWith {true}; -if (!GVAR(increaseTrainingInLocations)) exitWith {false}; - -if (([_unit] call FUNC(isInMedicalVehicle)) || {[_unit] call FUNC(isInMedicalFacility)}) then { - _class = _class + 1; //boost by one: untrained becomes medic, medic becomes doctor -}; - -_class >= _medicN min GVAR(medicSetting) diff --git a/addons/medical/functions/fnc_isMedicalVehicle.sqf b/addons/medical/functions/fnc_isMedicalVehicle.sqf deleted file mode 100644 index 26f2bd6850b..00000000000 --- a/addons/medical/functions/fnc_isMedicalVehicle.sqf +++ /dev/null @@ -1,20 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if vehicle is a medical vehicle - * - * Arguments: - * 0: The Vehicle - * - * Return Value: - * Is in of medic class - * - * Example: - * [car] call ace_medical_fnc_isMedicalVehicle - * - * Public: Yes - */ - -params ["_vehicle"]; - -(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 diff --git a/addons/medical/functions/fnc_itemCheck.sqf b/addons/medical/functions/fnc_itemCheck.sqf deleted file mode 100644 index 0290deeea81..00000000000 --- a/addons/medical/functions/fnc_itemCheck.sqf +++ /dev/null @@ -1,52 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Replaces vanilla items with ACE ones. - * - * Arguments: - * 0: The unit - * - * Return Value: - * None - * - * Example: - * [bob] call ace_medical_fnc_itemCheck - * - * Public: Yes - */ - -params ["_unit"]; - -while {({_x == "FirstAidKit"} count items _unit) > 0} do { - _unit removeItem "FirstAidKit"; - if (GVAR(level) >= 2) then { - _unit addItem "ACE_fieldDressing"; - _unit addItem "ACE_packingBandage"; - _unit addItem "ACE_morphine"; - _unit addItem "ACE_tourniquet"; - } else { - _unit addItem "ACE_fieldDressing"; - _unit addItem "ACE_fieldDressing"; - _unit addItem "ACE_morphine"; - }; -}; - -while {({_x == "Medikit"} count items _unit) > 0} do { - _unit removeItem "Medikit"; - if (GVAR(level) >= 2) then { - _unit addItemToBackpack "ACE_fieldDressing"; - _unit addItemToBackpack "ACE_packingBandage"; - _unit addItemToBackpack "ACE_packingBandage"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_morphine"; - _unit addItemToBackpack "ACE_salineIV_250"; - _unit addItemToBackpack "ACE_tourniquet"; - } else { - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_bloodIV"; - _unit addItemToBackpack "ACE_bloodIV"; - }; -}; diff --git a/addons/medical/functions/fnc_litterCleanupLoop.sqf b/addons/medical/functions/fnc_litterCleanupLoop.sqf deleted file mode 100644 index 539ca74e267..00000000000 --- a/addons/medical/functions/fnc_litterCleanupLoop.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Loop that cleans up litter - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_medical_fnc_litterCleanupLoop - * - * Public: No - */ - -{ - _x params ["_time", "_objects"]; - //Older elements are always at the begining of the array: - if ((CBA_missionTime - _time) < GVAR(litterCleanUpDelay)) exitWith {}; - TRACE_2("deleting",_time,_objects); - { - deleteVehicle _x; - } forEach _objects; - GVAR(allCreatedLitter) set [_forEachIndex, objNull]; -} forEach GVAR(allCreatedLitter); -GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; - -// If no more litter remaining, exit the loop -if (GVAR(allCreatedLitter) isEqualTo []) exitWith { - GVAR(litterPFHRunning) = false; -}; - -// Schedule the loop to be executed again 30 sec later -[DFUNC(litterCleanupLoop), [], 30] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_medicationEffectLoop.sqf b/addons/medical/functions/fnc_medicationEffectLoop.sqf deleted file mode 100644 index efef65ece9e..00000000000 --- a/addons/medical/functions/fnc_medicationEffectLoop.sqf +++ /dev/null @@ -1,44 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Medication effect loop for an injection. - * - * Arguments: - * 0: Unit - * 1: Name of the Variable that is affected - * 2: Proportion of the effect applied - * 3: Rate at which the effect is applied - * 4: Viscosity adjustment rate - * 5: Pain reduction rate - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 1, 2, 3, 4] call ACE_medical_fnc_medicationEffectLoop - * - * Public: No - */ - -params ["_unit", "_variableName", "_amountDecreased","_decreaseRate", "_viscosityAdjustmentRate", "_painReduceRate"]; - -// If the unit died the loop is finished -if (!alive _unit) exitWith {}; - -// If locality changed finish the local loop -if (!local _unit) exitWith {}; - -// Apply medicinal effect -private _usedMeds = (_unit getVariable [_variableName, 0]) - _decreaseRate; -_unit setVariable [_variableName, _usedMeds]; - -// Restore the viscosity while the medication is leaving the system -_unit setVariable [QGVAR(peripheralResistance), ((_unit getVariable [QGVAR(peripheralResistance), 100]) - _viscosityAdjustmentRate) max 0]; -_unit setVariable [QGVAR(painSuppress), ((_unit getVariable [QGVAR(painSuppress), 0]) - _painReduceRate) max 0]; - -// Exit if the medication has finished it's effect -_amountDecreased = _amountDecreased + _decreaseRate; -if (_amountDecreased >= 1 || (_usedMeds <= 0) || !alive _unit) exitWith {}; - -// Schedule the loop to be executed again 1 sec later -[DFUNC(medicationEffectLoop), [_unit, _variableName, _amountDecreased, _decreaseRate, _viscosityAdjustmentRate, _painReduceRate], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_modifyMedicalAction.sqf b/addons/medical/functions/fnc_modifyMedicalAction.sqf deleted file mode 100644 index 16ea718d727..00000000000 --- a/addons/medical/functions/fnc_modifyMedicalAction.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: esteldunedain - * Modify the visuals of a medical action point. - * On Basic medical: modify the icon color based on damage on that body part. - * - * Arguments: - * 0: The Patient Unit - * 1: The Diagnosing Unit - * 2: Selection Number - * 3: The action to modify - * - * Return Value: - * None - * - * Example: - * [bob, kevin, 2, "action"] call ACE_medical_fnc_modifyMedicalAction - * - * Public: No - */ - -params ["_target", "_player", "_partNumber", "_actionData"]; - -private _bloodLossOnSelection = 0; -// Add all bleeding from wounds on selection -{ - _x params ["", "", "_selectionX", "_amountOf", "_percentageOpen"]; - if (_selectionX == _partNumber) then { - _bloodLossOnSelection = _bloodLossOnSelection + (_amountOf * _percentageOpen); - }; -} forEach (_target getvariable [QGVAR(openWounds), []]); - -if (_bloodLossOnSelection >= 0.15) then { - _actionData set [2, QPATHTOF(UI\icons\medical_crossRed.paa)]; -} else { - if (_bloodLossOnSelection > 0 ) then { - _actionData set [2, QPATHTOF(UI\icons\medical_crossYellow.paa)]; - }; -}; diff --git a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf deleted file mode 100644 index e19f670b3a8..00000000000 --- a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical treatment settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleAdvancedMedicalSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(enableFor), "enableFor"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableAdvancedWounds), "enableAdvancedWounds"] call EFUNC(common,readSettingFromModule); -// TODO disabled until implemented -// [_logic, QGVAR(enableAirway), "enableAirway"] call EFUNC(common,readSettingFromModule); -// [_logic, QGVAR(enableFractures), "enableFractures"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(medicSetting_PAK), "medicSetting_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(medicSetting_SurgicalKit), "medicSetting_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(consumeItem_PAK), "consumeItem_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(consumeItem_SurgicalKit), "consumeItem_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useLocation_PAK), "useLocation_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useLocation_SurgicalKit), "useLocation_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useCondition_PAK), "useCondition_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useCondition_SurgicalKit), "useCondition_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(healHitPointAfterAdvBandage), "healHitPointAfterAdvBandage"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(painIsOnlySuppressed), "painIsOnlySuppressed"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf b/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf deleted file mode 100644 index d65afdf7cbe..00000000000 --- a/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Assign a medical role to a unit. - * - * Arguments: - * 0: The module logic - * 1: Synchronized units - * 2: Activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleAssignMedicRoles - * - * Public: No - */ - -params ["_logic"]; - -if (!isNull _logic) then { - private _list = _logic getVariable ["EnableList", ""]; - private _setting = _logic getVariable ["role", 0]; - - [_list, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList); - [synchronizedObjects _logic, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList); -}; diff --git a/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf b/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf deleted file mode 100644 index a1b6303b452..00000000000 --- a/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Register synchronized objects from passed object as a medical facility - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [kevin, bob], true] call ACE_medical_fnc_moduleAssignMedicalFacility - * - * Public: No - */ - -params [["_logic", objNull, [objNull]]]; -if (!isNull _logic) then { - private _setting = _logic getVariable ["class",0]; - private _objects = synchronizedObjects _logic; - { - if (local _x) then { - _x setVariable[QGVAR(isMedicalFacility), true, true]; - }; - } forEach _objects; -}; - -true; diff --git a/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf b/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf deleted file mode 100644 index 3eda8f01060..00000000000 --- a/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Assign vehicle as a medical vehicle. - * - * Arguments: - * 0: The module logic - * 1: Synchronized units - * 2: Activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleAssignMedicalVehicle - * - * Public: No - */ - -params ["_logic"]; - -if (!isNull _logic) then { - private _list = _logic getVariable ["EnableList", ""]; - private _setting = _logic getVariable ["enabled", 0]; - - [_list, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList); - [synchronizedObjects _logic, QGVAR(medicClass), _setting, true, true] call EFUNC(common,assignObjectsInList); -}; diff --git a/addons/medical/functions/fnc_moduleBasicMedicalSettings.sqf b/addons/medical/functions/fnc_moduleBasicMedicalSettings.sqf deleted file mode 100644 index 6d27cfe8036..00000000000 --- a/addons/medical/functions/fnc_moduleBasicMedicalSettings.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical treatment settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [Logic, [bob, kevin], true] call ACE_medical_fnc_moduleBasicMedicalSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(medicSetting_basicEpi), "medicSetting_basicEpi"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useLocation_basicEpi), "useLocation_basicEpi"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleMedicalSettings.sqf b/addons/medical/functions/fnc_moduleMedicalSettings.sqf deleted file mode 100644 index a843d8c1c1a..00000000000 --- a/addons/medical/functions/fnc_moduleMedicalSettings.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical damage settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleMedicalSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(level), "level"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(medicSetting), "medicSetting"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(increaseTrainingInLocations), "increaseTrainingInLocations"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(allowLitterCreation), "allowLitterCreation"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(litterCleanUpDelay), "litterCleanUpDelay"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableScreams), "enableScreams"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(playerDamageThreshold), "playerDamageThreshold"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(AIDamageThreshold), "AIDamageThreshold"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableUnconsciousnessAI), "enableUnconsciousnessAI"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(remoteControlledAI), "remoteControlledAI"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(preventInstaDeath), "preventInstaDeath"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(bleedingCoefficient), "bleedingCoefficient"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(painCoefficient), "painCoefficient"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(keepLocalSettingsSynced), "keepLocalSettingsSynced"] call EFUNC(common,readSettingFromModule); -// [_logic, QGVAR(delayUnconCaptive), "delayUnconCaptive"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleReviveSettings.sqf b/addons/medical/functions/fnc_moduleReviveSettings.sqf deleted file mode 100644 index d7f54583cf0..00000000000 --- a/addons/medical/functions/fnc_moduleReviveSettings.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical revive settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleReviveSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(maxReviveTime), "maxReviveTime"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(amountOfReviveLives), "amountOfReviveLives"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableRevive), "enableRevive"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_onMedicationUsage.sqf b/addons/medical/functions/fnc_onMedicationUsage.sqf deleted file mode 100644 index ee45d60a393..00000000000 --- a/addons/medical/functions/fnc_onMedicationUsage.sqf +++ /dev/null @@ -1,82 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the medication given to a patient. - * - * Arguments: - * 0: The patient - * 1: Medication Treatment classname - * 2: The medication treatment variablename - * 3: Max dosage - * 4: The time in the system - * 5: Incompatable medication > - * - * Return Value: - * None - * - * Example: - * [bob, "classname", "varname", 5, 6, ["stuff"]] call ACE_medical_fnc_onMedicationUsage - * - * Public: No - */ - -params ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_viscosityChange", "_painReduce"]; -TRACE_8("params",_target,_className,_variable,_maxDosage,_timeInSystem,_incompatabileMeds,_viscosityChange,_painReduce); - -private _foundEntry = false; -private _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; -{ - _x params ["_variableX", "_allMedsFromClassname"]; - if (_variableX== _variable) exitWith { - if !(_className in _allMedsFromClassname) then { - _allMedsFromClassname pushBack _className; - _x set [1, _allMedsFromClassname]; - _allUsedMedication set [_forEachIndex, _x]; - _target setVariable [QGVAR(allUsedMedication), _allUsedMedication]; - }; - _foundEntry = true; - }; -} forEach _allUsedMedication; - -if (!_foundEntry) then { - _allUsedMedication pushBack [_variable, [_className]]; - _target setVariable [QGVAR(allUsedMedication), _allUsedMedication]; -}; - - -private _usedMeds = _target getVariable [_variable, 0]; -if (_usedMeds >= floor (_maxDosage + round(random(2))) && _maxDosage >= 1 && GVAR(enableOverdosing)) then { - [_target] call FUNC(setDead); -}; - -private _hasOverDosed = 0; -{ - _x params ["_med", "_limit"]; - { - _x params ["", "_classNamesUsed"]; - if ({_x == _med} count _classNamesUsed > _limit) then { - _hasOverDosed = _hasOverDosed + 1; - }; - } forEach _allUsedMedication; -} forEach _incompatabileMeds; - -if (_hasOverDosed > 0 && GVAR(enableOverdosing)) then { - private _medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication"); - private _onOverDose = getText (_medicationConfig >> "onOverDose"); - if (isClass (_medicationConfig >> _className)) then { - _medicationConfig = (_medicationConfig >> _className); - if (isText (_medicationConfig >> "onOverDose")) then { _onOverDose = getText (_medicationConfig >> "onOverDose"); }; - }; - if (isNil _onOverDose) then { - _onOverDose = compile _onOverDose; - } else { - _onOverDose = missionNamespace getVariable _onOverDose; - }; - [_target, _className] call _onOverDose; -}; - -private _decreaseAmount = 1 / _timeInSystem; -private _viscosityAdjustment = _viscosityChange / _timeInSystem; - -// Run the loop that computes the effect of the medication over time -[_target, _variable, 0, _decreaseAmount, _viscosityAdjustment, _painReduce / _timeInSystem] call FUNC(medicationEffectLoop); diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf deleted file mode 100644 index c94a4f898f0..00000000000 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ /dev/null @@ -1,170 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Parse the ACE_Medical_Advanced config for all injury types. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_medical_fnc_parseConfigForInjuries - * - * Public: No - */ - -private _injuriesRootConfig = (configFile >> "ACE_Medical_Advanced" >> "Injuries"); -private _allFoundDamageTypes = []; -private _configDamageTypes = (_injuriesRootConfig >> "damageTypes"); - -// minimum lethal damage collection, mapped to damageTypes -private _defaultMinLethalDamage = getNumber (_configDamageTypes >> "lethalDamage"); -GVAR(minLethalDamages) = []; - -// Collect all available damage types from the config -for "_i" from 0 to (count _configDamageTypes -1) /* step +1 */ do { - // Only get the subclasses in damageType class - if (isClass(_configDamageTypes select _i)) then { - _allFoundDamageTypes pushBack (configName (_configDamageTypes select _i)); - private _minLethalDamage = if (isNumber((_configDamageTypes select _i) >> "lethalDamage")) then { - getNumber((_configDamageTypes select _i) >> "lethalDamage"); - } else { - _defaultMinLethalDamage - }; - - GVAR(minLethalDamages) pushBack _minLethalDamage; - }; -}; -GVAR(allAvailableDamageTypes) = _allFoundDamageTypes; -GVAR(woundClassNames) = []; -GVAR(fractureClassNames) = []; - -// Parsing the wounds -// function for parsing a sublcass of an injury -private _parseForSubClassWounds = { - private _subClass = _this select 0; - if (isClass (_entry >> _subClass)) exitWith { - private _subClassConfig = (_entry >> _subClass); - private _subClasstype = _classType + (configName _subClassConfig); - private _subClassselections = if (isArray(_subClassConfig >> "selections")) then { getArray(_subClassConfig >> "selections");} else { _selections }; - private _subClassbloodLoss = if (isNumber(_subClassConfig >> "bleedingRate")) then { getNumber(_subClassConfig >> "bleedingRate");} else { _bloodLoss }; - private _subClasspain = if (isNumber(_subClassConfig >> "pain")) then { getNumber(_subClassConfig >> "pain");} else { _pain }; - private _subClassminDamage = if (isNumber(_subClassConfig >> "minDamage")) then { getNumber(_subClassConfig >> "minDamage");} else { _minDamage }; - private _subClassmaxDamage = if (isNumber(_subClassConfig >> "maxDamage")) then { getNumber(_subClassConfig >> "maxDamage");} else { _maxDamage }; - private _subClasscauses = if (isArray(_subClassConfig >> "causes")) then { getArray(_subClassConfig >> "causes");} else { _causes }; - private _subClassDisplayName = if (isText(_subClassConfig >> "name")) then { getText(_subClassConfig >> "name");} else {_classDisplayName + " " + _subClass}; - if (count _selections > 0 && {count _causes > 0}) then { - GVAR(woundClassNames) pushBack _subClasstype; - _allWoundClasses pushBack [_classID, _subClassselections, _subClassbloodLoss, _subClasspain, [_subClassminDamage, _subClassmaxDamage], _subClasscauses, _subClassDisplayName]; - _classID = _classID + 1; - }; - true; - }; - false; -}; - -// TODO classTypes are strings currently. Convert them to unqiue IDs instead. -private _woundsConfig = (_injuriesRootConfig >> "wounds"); -private _allWoundClasses = []; -private _classID = 0; -if (isClass _woundsConfig) then { - private _amountOf = count _woundsConfig; - for "_i" from 0 to (_amountOf -1) /* step +1 */ do { - private _entry = _woundsConfig select _i; - if (isClass _entry) then { - private _classType = (ConfigName _entry); - private _selections = if (isArray(_entry >> "selections")) then { getArray(_entry >> "selections");} else {[]}; - private _bloodLoss = if (isNumber(_entry >> "bleedingRate")) then { getNumber(_entry >> "bleedingRate");} else {0}; - private _pain = if (isNumber(_entry >> "pain")) then { getNumber(_entry >> "pain");} else {0}; - private _minDamage = if (isNumber(_entry >> "minDamage")) then { getNumber(_entry >> "minDamage");} else {0}; - private _maxDamage = if (isNumber(_entry >> "maxDamage")) then { getNumber(_entry >> "maxDamage");} else {-1}; - private _causes = if (isArray(_entry >> "causes")) then { getArray(_entry >> "causes");} else {[]}; - private _classDisplayName = if (isText(_entry >> "name")) then { getText(_entry >> "name");} else {_classType}; - - // TODO instead of hardcoding minor, medium and large just go through all sub classes recursively until none are found - if (["Minor"] call _parseForSubClassWounds || ["Medium"] call _parseForSubClassWounds || ["Large"] call _parseForSubClassWounds) exitWith {}; // continue to the next one - - // There were no subclasses, so we will add this one instead. - if (count _selections > 0 && count _causes > 0) then { - GVAR(woundClassNames) pushBack _classType; - _allWoundClasses pushBack [_classID, _selections, _bloodLoss, _pain, [_minDamage, _maxDamage], _causes, _classDisplayName]; - _classID = _classID + 1; - }; - true; - }; - }; -}; -GVAR(AllWoundInjuryTypes) = _allWoundClasses; - -// Linking injuries to the woundInjuryType variables. -private _damageTypesConfig = (configFile >> "ACE_Medical_Advanced" >> "Injuries" >> "damageTypes"); -private _thresholds = getArray(_damageTypesConfig >> "thresholds"); -private _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); -{ - private _varName = format[QGVAR(woundInjuryType_%1),_x]; - private _woundTypes = []; - private _type = _x; - { - // Check if this type is in the causes of a wound class, if so, we will store the wound types for this damage type - if (_type in (_x select 5)) then { - _woundTypes pushBack _x; - }; - } forEach _allWoundClasses; - private _typeThresholds = _thresholds; - private _selectionSpecificType = _selectionSpecific; - if (isClass(_damageTypesConfig >> _x)) then { - if (isArray(_damageTypesConfig >> _x >> "thresholds")) then { _typeThresholds = getArray(_damageTypesConfig >> _x >> "thresholds");}; - if (isNumber(_damageTypesConfig >> _x >> "selectionSpecific")) then { _selectionSpecificType = getNumber(_damageTypesConfig >> _x >> "selectionSpecific");}; - }; - missionNamespace setVariable [_varName, [_typeThresholds, _selectionSpecificType > 0, _woundTypes]]; - - // extension loading - private _minDamageThresholds = ""; - private _amountThresholds = ""; - { - _minDamageThresholds = _minDamageThresholds + str(_x select 0); - _amountThresholds = _amountThresholds + str(_x select 1); - if (_forEachIndex < (count _typeThresholds) - 1) then { - _minDamageThresholds = _minDamageThresholds + ":"; - _amountThresholds = _amountThresholds + ":"; - }; - } forEach _typeThresholds; - - "ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _forEachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; - -} forEach _allFoundDamageTypes; - - -// Extension loading - -{ - // add shit to addInjuryType - _x params ["_classID", "_selections", "_bloodLoss", "_pain", "_damage", "_causesArray", "_classDisplayName"]; - _damage params ["_minDamage", "_maxDamage"]; - private _className = GVAR(woundClassNames) select _forEachIndex; - private _allowedSelections = ""; - - { - _allowedSelections = _allowedSelections + _x; - if (_forEachIndex < (count _selections) - 1) then { - _allowedSelections = _allowedSelections + ":"; - }; - } forEach _selections; - - private _causes = ""; - - { - _causes = _causes + _x; - if (_forEachIndex < (count _causesArray) - 1) then { - _causes = _causes + ":"; - }; - } forEach _causesArray; - _classDisplayName = _x select 6; - - "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; - -} forEach _allWoundClasses; - -"ace_medical" callExtension "ConfigComplete"; diff --git a/addons/medical/functions/fnc_playInjuredSound.sqf b/addons/medical/functions/fnc_playInjuredSound.sqf deleted file mode 100644 index 6955886659b..00000000000 --- a/addons/medical/functions/fnc_playInjuredSound.sqf +++ /dev/null @@ -1,83 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Play the injured sound for a unit if the unit is damaged. The sound broadcasted across MP. - * Will not play if the unit has already played a sound within to close a time frame. - * Delay: With minimal damage (below 1), the delay is (10 + random(50)) seconds. Otherwise it is 60 seconds / damage. - * - * Arguments: - * 0: The Unit - * 1: Amount of Pain - * - * Return Value: - * None - * - * Example: - * [bob, 5] call ACE_medical_fnc_playInjuredSound - * - * Public: No - */ - -params ["_unit", "_pain"]; -if (!local _unit || !GVAR(enableScreams)) exitWith{}; - -// Lock if the unit is already playing a sound. -if ((_unit getVariable [QGVAR(playingInjuredSound),false])) exitWith {}; -_unit setVariable [QGVAR(playingInjuredSound),true]; - -// Play the sound if there is any damage present. -if (_pain > 0 && {[_unit] call EFUNC(common,isAwake)}) exitWith { - // Classnames of the available sounds. - private _availableSounds_A = [ - "WoundedGuyA_01", - "WoundedGuyA_02", - "WoundedGuyA_03", - "WoundedGuyA_04", - "WoundedGuyA_05", - "WoundedGuyA_06", - "WoundedGuyA_07", - "WoundedGuyA_08" - ]; - private _availableSounds_B = [ - "WoundedGuyB_01", - "WoundedGuyB_02", - "WoundedGuyB_03", - "WoundedGuyB_04", - "WoundedGuyB_05", - "WoundedGuyB_06", - "WoundedGuyB_07", - "WoundedGuyB_08" - ]; - private _availableSounds_C = [ - "WoundedGuyC_01", - "WoundedGuyC_02", - "WoundedGuyC_03", - "WoundedGuyC_04", - "WoundedGuyC_05" - ]; - private _sound = ""; - - // Select the to be played sound based upon damage amount. - if (_pain > 0.5) then { - if (random(1) > 0.5) then { - _sound = selectRandom _availableSounds_A; - } else { - _sound = selectRandom _availableSounds_B; - }; - } else { - _sound = selectRandom _availableSounds_B; - }; - // Play the sound - playSound3D [(getArray(configFile >> "CfgSounds" >> _sound >> "sound") select 0) + ".wss", objNull, false, getPos _unit, 15, 1, 25]; // +2db, 15 meters. - - // Figure out what the delay will be before it is possible to play a sound again. - private _delay = (30 - (random(25) * _pain)) max (3.5 + random(2)); - - // Clean up the lock - [{ - (_this select 0) setVariable [QGVAR(playingInjuredSound), nil]; - }, [_unit], _delay, _delay] call CBA_fnc_waitAndExecute; -}; - -// Clean up in case there has not been played any sounds. -_unit setVariable [QGVAR(playingInjuredSound), nil]; diff --git a/addons/medical/functions/fnc_reviveStateLoop.sqf b/addons/medical/functions/fnc_reviveStateLoop.sqf deleted file mode 100644 index 7e662bdbb1f..00000000000 --- a/addons/medical/functions/fnc_reviveStateLoop.sqf +++ /dev/null @@ -1,58 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Loop that handles a unit in the revive state. - * - * Arguments: - * 0: Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_reviveStateLoop - * - * Public: No - */ - -params ["_unit"]; - -// If locality changed finish the local loop -// @todo: reinitiate the loop elsewhere -if (!local _unit) exitWith {}; - -private _startTime = _unit getVariable [QGVAR(reviveStartTime), 0]; - -// If we are in revive state in a blown up vehicle, try to unload so that people can access the body -if ((alive _unit) && {(vehicle _unit) != _unit} && {!alive (vehicle _unit)}) then { - TRACE_2("Unloading", _unit, vehicle _unit); - [_unit] call EFUNC(common,unloadPerson); -}; - -// If the timer run out, let the unit die and exit the loop -if (GVAR(maxReviveTime) > 0 && {CBA_missionTime - _startTime > GVAR(maxReviveTime)}) exitwith { - _unit setVariable [QGVAR(inReviveState), nil, true]; - _unit setVariable [QGVAR(reviveStartTime), nil]; - [_unit, true] call FUNC(setDead); -}; - -// If the unit was taken out from revive state, exit the loop -if !(_unit getVariable [QGVAR(inReviveState), false]) exitwith { - // Revived without dieing, so in case we have lifes, remove one. - if (GVAR(amountOfReviveLives) > 0) then { - _lifesLeft = _unit getVariable[QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; - _unit setVariable [QGVAR(amountOfReviveLives), _lifesLeft - 1, true]; - }; - - _unit setVariable [QGVAR(reviveStartTime), nil]; -}; - -// Remove heartbeat -if (GVAR(level) >= 2) then { - if (_unit getVariable [QGVAR(heartRate), 60] > 0) then { - _unit setVariable [QGVAR(heartRate), 0]; - }; -}; - -// Schedule the loop to be executed again 1 sec later -[DFUNC(reviveStateLoop), [_unit], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_selectionNameToNumber.sqf b/addons/medical/functions/fnc_selectionNameToNumber.sqf deleted file mode 100644 index c5c0ceb2ed9..00000000000 --- a/addons/medical/functions/fnc_selectionNameToNumber.sqf +++ /dev/null @@ -1,18 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the number representation of a selection name. - * - * Arguments: - * 0: The selection name of a unit - * - * Return Value: - * Number representation. -1 if invalid. - * - * Example: - * ["head"] call ace_medical_fnc_selectionNameToNumber - * - * Public: yes - */ - -(["head","body","hand_l","hand_r","leg_l","leg_r"] find (_this select 0)); diff --git a/addons/medical/functions/fnc_serverRemoveBody.sqf b/addons/medical/functions/fnc_serverRemoveBody.sqf deleted file mode 100644 index 3b85fb06a3e..00000000000 --- a/addons/medical/functions/fnc_serverRemoveBody.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Removes corpse. Idealy it is just deleted the next frame, - * but player bodies cannot be deleted until they respawn, so it is hidden and deleted later. - * - * Arguments: - * 0: Mr Body - * - * Return Value: - * None - * - * Example: - * [cursorTarget] call ace_medical_fnc_serverRemoveBody - * - * Public: No - */ - -params ["_target"]; -TRACE_2("",_target,isPlayer _target); - -//Hide the body globaly -[QEGVAR(common,hideObjectGlobal), [_target, true]] call CBA_fnc_serverEvent; - -if (isNil QGVAR(bodiesToDelete)) then {GVAR(bodiesToDelete) = [];}; -GVAR(bodiesToDelete) pushBack _target; - -// Start up a loop to wait for bodies to be free to delete -if ((count GVAR(bodiesToDelete)) == 1) then { - [] call FUNC(bodyCleanupLoop); -}; - -nil diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf deleted file mode 100644 index a8676c73425..00000000000 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ /dev/null @@ -1,44 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Triggers a unit into the Cardiac Arrest state from CMS. Will put the unit in an unconscious state and run a countdown timer until unit dies. - * Timer is a random value between 120 and 720 seconds. - * - * Arguments: - * 0: The unit that will be put in cardiac arrest state - * - * Return Value: - * None - * - * Example: - * [bob] call ace_medical_fnc_setCardiacArrest - * - * Public: yes - */ - -params ["_unit"]; - -if (_unit getVariable [QGVAR(inCardiacArrest),false]) exitWith {}; -_unit setVariable [QGVAR(inCardiacArrest), true,true]; -_unit setVariable [QGVAR(heartRate), 0]; - -["ace_cardiacArrestEntered", [_unit]] call CBA_fnc_localEvent; - -[_unit, true] call FUNC(setUnconscious); -private _timeInCardiacArrest = 120 + round(random(600)); - -[{ - params ["_args", "_idPFH"]; - _args params ["_unit", "_startTime", "_timeInCardiacArrest"]; - - private _heartRate = _unit getVariable [QGVAR(heartRate), 80]; - if (_heartRate > 0 || !alive _unit) exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(inCardiacArrest), nil,true]; - }; - if (CBA_missionTime - _startTime >= _timeInCardiacArrest) exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(inCardiacArrest), nil,true]; - [_unit] call FUNC(setDead); - }; -}, 1, [_unit, CBA_missionTime, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf deleted file mode 100644 index ce15a0b548d..00000000000 --- a/addons/medical/functions/fnc_setDead.sqf +++ /dev/null @@ -1,66 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Either kills a unit or puts the unit in a revivable state, depending on the settings. - * - * Arguments: - * 0: The unit that will be killed - * 1: Force Dead (ignore revive setting) (default: false) - * 1: Delay setDamage for a frame (default: false) - * - * Return Value: - * Did he died? - * - * Example: - * [bob, false, false] call ace_medical_fnc_setDead - * - * Public: yes - */ - -params ["_unit", ["_force", false], ["_delaySetDamage", false]]; - -if ((!alive _unit) || {_unit getVariable ["ACE_isDead", false]}) exitWith {true}; -if (!local _unit) exitwith { - [QGVAR(setDead), [_unit, _force], _unit] call CBA_fnc_targetEvent; - false; -}; - -private _reviveVal = _unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]; -if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == 2)) && !_force) exitwith { - if (_unit getVariable [QGVAR(inReviveState), false]) exitwith { - if (GVAR(amountOfReviveLives) > 0) then { - private _lifesLeft = _unit getVariable[QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; - if (_lifesLeft <= 0) then { - [_unit, true] call FUNC(setDead); - }; - }; - - false; - }; - - _unit setVariable [QGVAR(inReviveState), true, true]; - _unit setVariable [QGVAR(reviveStartTime), CBA_missionTime]; - [_unit, true] call FUNC(setUnconscious); - - // Run the loop that tracks the revive state - [_unit ] call FUNC(reviveStateLoop); - false; -}; - -_unit setVariable ["ACE_isDead", true, true]; -if (isPLayer _unit) then { - _unit setVariable ["isDeadPlayer", true, true]; -}; - -["ace_killed", [_unit]] call CBA_fnc_localEvent; - -//Delay a frame before killing the unit via scripted damage -//to avoid triggering the "Killed" Event twice (and having the wrong killer) - -if (!_delaySetDamage) then { - [_unit, 1] call FUNC(setStructuralDamage); -} else { - [FUNC(setStructuralDamage), [_unit, 1]] call CBA_fnc_execNextFrame; -}; - -true; diff --git a/addons/medical/functions/fnc_setHitPointDamage.sqf b/addons/medical/functions/fnc_setHitPointDamage.sqf deleted file mode 100644 index c68feb83c8d..00000000000 --- a/addons/medical/functions/fnc_setHitPointDamage.sqf +++ /dev/null @@ -1,102 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * My very own setHitPointDamage since BIS' one is buggy when affecting a remote unit. - * It also doesn't change the overall damage. This does. - * - * Arguments: - * 0: Unit - * 1: HitPoint - * 2: Damage - * 3: Disable overall damage adjustment (default: false) - * - * Return Value: - * None - * - * Example: - * [medic, "Leg", 2, false] call ace_medical_fnc_setHitPointDamage - * - * Public: Yes - */ -#define LEGDAMAGETRESHOLD1 1 -#define LEGDAMAGETRESHOLD2 1.7 -#define ARMDAMAGETRESHOLD1 1 -#define ARMDAMAGETRESHOLD2 1.7 - -params ["_unit", "_selection", "_damage", ["_disabled", false]]; - -// Unit isn't local, give function to machine where it is. -if !(local _unit) exitWith { - [QGVAR(setHitPointDamage), _this, _unit] call CBA_fnc_targetEvent; -}; - -// Check if overall damage adjustment is disabled -if (_disabled) exitWith { - _unit setHitPointDamage [_selection, _damage]; -}; - -private _selections = [ - "HitHead", - "HitBody", - "HitLeftArm", - "HitRightArm", - "HitLeftLeg", - "HitRightLeg" -]; - -if !(_selection in _selections) exitWith { - _unit setHitPointDamage [_selection, _damage]; -}; - -private _damages = _selections apply {_unit getHitPointDamage _x}; - -private _damageOld = damage _unit; -private _damageSumOld = 0; -{ - _damageSumOld = _damageSumOld + _x; -} forEach _damages; -_damageSumOld = _damageSumOld max 0.001; - -_damages set [_selections find _selection, _damage]; - -private _damageSumNew = 0; -{ - _damageSumNew = _damageSumNew + _x; -} forEach _damages; - -private _damageNew = _damageSumNew / 6; -if (_damageOld > 0) then { - _damageNew = _damageOld * (_damageSumNew / _damageSumOld); -}; - -// prevent death -if (_damageNew >= 0.9) then { - _unit setDamage 0.9; - [_unit] call FUNC(setDead); -} else { - _unit setDamage _damageNew; -}; - -{ - private _damageFinal = (_damages select _forEachIndex); - _unit setHitPointDamage [_x, _damageFinal]; -} forEach _selections; - -// Leg Damage -private _legdamage = (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg"); -if (_legdamage >= LEGDAMAGETRESHOLD1) then { - if (_unit getHitPointDamage "HitLegs" != 1) then {_unit setHitPointDamage ["HitLegs", 1]}; -} else { - if (_unit getHitPointDamage "HitLegs" != 0) then {_unit setHitPointDamage ["HitLegs", 0]}; -}; -// @todo: force prone for completely fucked up legs. - - -// Arm Damage -private _armdamage = (_unit getHitPointDamage "HitLeftArm") + (_unit getHitPointDamage "HitRightArm"); -if (_armdamage >= ARMDAMAGETRESHOLD1) then { - if (_unit getHitPointDamage "HitHands" != 1) then {_unit setHitPointDamage ["HitHands", 1]}; -} else { - if (_unit getHitPointDamage "HitHands" != 0) then {_unit setHitPointDamage ["HitHands", 0]}; -}; -// @todo: Drop weapon for full damage. diff --git a/addons/medical/functions/fnc_setStructuralDamage.sqf b/addons/medical/functions/fnc_setStructuralDamage.sqf deleted file mode 100644 index 4f8c6e26134..00000000000 --- a/addons/medical/functions/fnc_setStructuralDamage.sqf +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Author: commy2 - * Set the structural damage of a soldier without changing the individual hitpoints. Unit has to be local. Not safe to use with vehicles! - * - * Arguments: - * 0: The unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_setStructuralDamage - * - * Public: no? - */ - -params ["_unit", "_damage"]; - -if (!local _unit) exitWith {}; - -private _allHitPoints = getAllHitPointsDamage _unit select 2; - -_unit setDamage _damage; - -{ - _unit setHitIndex [_forEachIndex, _x]; -} forEach _allHitPoints; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index c2e43e702d3..f6f39b03c52 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -6,127 +6,69 @@ * Arguments: * 0: The unit that will be put in an unconscious state * 1: Set unconsciouns (default: true) - * 2: Minimum unconscious time (default: (round(random(10)+5))) - * 3: Force AI Unconscious (skip random death chance) (default: false) + * 2: Minimum unconscious time (set to 0 to ignore) (default: 0) + * 3: Force wakeup at given time if vitals are stable (default: false) * * Return Value: - * None + * Success? * * Example: * [bob, true] call ace_medical_fnc_setUnconscious; + * [player, true, 5, true] call ace_medical_fnc_setUnconscious; * - * Public: yes + * Public: Yes */ -#define DEFAULT_DELAY (round(random(10)+5)) - // only run this after the settings are initialized if !(EGVAR(common,settingsInitFinished)) exitWith { EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(setUnconscious), _this]; }; -params ["_unit", ["_set", true], ["_minWaitingTime", DEFAULT_DELAY], ["_force", false]]; - -// No change, fuck off. (why is there no xor?) -if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {}; +params [["_unit", objNull, [objNull]], ["_knockOut", true, [false]], ["_minWaitingTime", 0, [0]], ["_forcedWakup", false, [false]]]; +TRACE_4("setUnconscious",_unit,_knockOut,_minWaitingTime,_forcedWakup); -if !(_set) exitWith { - _unit setVariable ["ACE_isUnconscious", false, true]; - if (_unit getVariable [QGVAR(inReviveState), false]) then { - _unit setVariable [QGVAR(inReviveState), nil, true]; - }; +if ((isNull _unit) || {!alive _unit} || {!(_unit isKindOf "CAManBase")}) exitWith { + ERROR_3("Bad Unit %1 [Type: %2] [Alive: %3]",_unit,typeOf _unit,alive _unit); + false }; -if !(!(isNull _unit) && {(_unit isKindOf "CAManBase") && ([_unit] call EFUNC(common,isAwake))}) exitWith{}; - if (!local _unit) exitWith { - [QGVAR(setUnconscious), [_unit, _set, _minWaitingTime, _force], _unit] call CBA_fnc_targetEvent; + [QEGVAR(medical,setUnconscious), _this, _unit] call CBA_fnc_targetEvent; + true }; -_unit setVariable ["ACE_isUnconscious", true, true]; - -if (_unit == ACE_player) then { - if (visibleMap) then {openMap false}; - while {dialog} do { - closeDialog 0; - }; +if (_knockOut isEqualTo IS_UNCONSCIOUS(_unit)) exitWith { + WARNING_2("setUnconscious called with no change [Unit %1] [State [%2]", _unit, _knockOut); + false }; -// if we have unconsciousness for AI disabled, we will kill the unit instead -private _isDead = false; -if (!([_unit, GVAR(remoteControlledAI)] call EFUNC(common,isPlayer)) && !_force) then { - private _enableUncon = _unit getVariable [QGVAR(enableUnconsciousnessAI), GVAR(enableUnconsciousnessAI)]; - if (_enableUncon == 0 or {_enableUncon == 1 and (random 1) < 0.5}) then { - [_unit, true] call FUNC(setDead); - _isDead = true; - }; +if (currentWeapon _unit != primaryWeapon _unit) then { + _unit selectWeapon primaryWeapon _unit; }; -if (_isDead) exitWith {}; -// If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious, -// therefor we force it to select the primairy weapon before going unconscious -if ((vehicle _unit) isKindOf "StaticWeapon") then { - [_unit] call EFUNC(common,unloadPerson); -}; -if (animationState _unit in ["ladderriflestatic","laddercivilstatic"]) then { - _unit action ["ladderOff", (nearestBuilding _unit)]; -}; -if (vehicle _unit == _unit) then { - if (primaryWeapon _unit == "") then { - _unit addWeapon "ACE_FakePrimaryWeapon"; +if (_knockOut) then { + if (_minWaitingTime > 0) then { + if (_forcedWakup) then { + // If unit still has stable vitals at min waiting time, then force wake up + [{ + params [["_unit", objNull]]; + if ((alive _unit) && {_unit call EFUNC(medical_status,hasStableVitals)}) then { + TRACE_1("Doing delay wakeup",_unit); + [QGVAR(WakeUp), _unit] call CBA_fnc_localEvent; + } else { + TRACE_1("Skipping delay wakeup",_unit); + }; + }, [_unit], _minWaitingTime] call CBA_fnc_waitAndExecute; + }; + if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { + TRACE_1("setting lastWakeUpCheck",_minWaitingTime); + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime + _minWaitingTime - SPONTANEOUS_WAKE_UP_INTERVAL]; + }; }; - if (currentWeapon _unit != primaryWeapon _unit) then { - _unit selectWeapon primaryWeapon _unit; - }; -}; - -// We are storing the current animation, so we can use it later on when waking the unit up inside a vehicle -if (vehicle _unit != _unit) then { - _unit setVariable [QGVAR(vehicleAwakeAnim), [(vehicle _unit), (animationState _unit)]]; -}; - -//Save current stance: -private _originalPos = unitPos _unit; - -_unit setUnitPos "DOWN"; -[_unit, true] call EFUNC(common,disableAI); - -// So the AI does not get stuck, we are moving the unit to a temp group on its own. -//Unconscious units shouldn't be put in another group #527: -if (GVAR(moveUnitsFromGroupOnUnconscious)) then { - [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); -}; -// Delay Unconscious so the AI dont instant stop shooting on the unit #3121 -if (GVAR(delayUnconCaptive) == 0) then { - [_unit, "setHidden", "ace_unconscious", true] call EFUNC(common,statusEffect_set); + [QGVAR(knockOut), _unit] call CBA_fnc_localEvent; } else { - // when the Delay is so high that the unit can wake up and get uncon again we need to check if it is the correct wait that got executed - private _counter = _unit getVariable [QGVAR(unconsciousCounter), 0]; - _counter = _counter + 1; - _unit setVariable [QGVAR(unconsciousCounter), _counter]; - [{ - params ["_unit", "_counter"]; - if (_unit getVariable ["ACE_isUnconscious", false] && (_unit getVariable [QGVAR(unconsciousCounter), 0]) == _counter) then { - [_unit, "setHidden", "ace_unconscious", true] call EFUNC(common,statusEffect_set); - }; - },[_unit, _counter], GVAR(delayUnconCaptive)] call CBA_fnc_waitAndExecute; + [QGVAR(WakeUp), _unit] call CBA_fnc_localEvent; }; -private _anim = [_unit] call EFUNC(common,getDeathAnim); -[_unit, _anim, 1, true] call EFUNC(common,doAnimation); -[{ - params ["_unit", "_anim"]; - if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { - [_unit, _anim, 2, true] call EFUNC(common,doAnimation); - }; -}, [_unit, _anim], 0.5, 0] call CBA_fnc_waitAndExecute; - -private _startingTime = CBA_missionTime; - -[DFUNC(unconsciousPFH), 0.1, [_unit, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; - -// unconscious can't talk -[_unit, "isUnconscious"] call EFUNC(common,muteUnit); - -["ace_unconscious", [_unit, true]] call CBA_fnc_globalEvent; +true diff --git a/addons/medical/functions/fnc_showBloodEffect.sqf b/addons/medical/functions/fnc_showBloodEffect.sqf deleted file mode 100644 index 47abf0536ce..00000000000 --- a/addons/medical/functions/fnc_showBloodEffect.sqf +++ /dev/null @@ -1,162 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Does the blood screen effect, just like BIS_fnc_bloodeffect, but in non-sheduled environment. - * - * Arguments: - * 0: Effect multiplier - * - * Return Value: - * None - * - * Example: - * [2] call ace_medical_fnc_showBloodEffect - * - * Public: Yes - */ - -params ["_bloodRemaining"]; - -disableSerialization; - -// get already existing controls, or create them - -private _fxBloodControls = GETUVAR(GVAR(FXBloodControls),[]); - -private _bloodCtrl1 = controlNull; -private _bloodCtrl2 = controlNull; -private _bloodCtrl3 = controlNull; -if (count _fxBloodControls != 3) then { - _bloodCtrl1 = findDisplay 46 ctrlCreate ["RscPicture", -1]; - _bloodCtrl2 = findDisplay 46 ctrlCreate ["RscPicture", -1]; - _bloodCtrl3 = findDisplay 46 ctrlCreate ["RscPicture", -1]; - - // set their textures, screen position etc. - _bloodCtrl1 ctrlSetText "A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_lower_ca.paa"; - _bloodCtrl2 ctrlSetText "A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_middle_ca.paa"; - _bloodCtrl3 ctrlSetText "A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_upper_ca.paa"; - - // positions are from config - private _ctrlPosition = [ - ((0 * safezoneW) + safezoneX) + ((safezoneW - (2.125 * safezoneW * 3/4)) / 2), - (-0.0625 * safezoneH) + safezoneY, - 2.125 * safezoneW * 3/4, - 1.125 * safezoneH - ]; - - _bloodCtrl1 ctrlSetPosition _ctrlPosition; - _bloodCtrl2 ctrlSetPosition _ctrlPosition; - _bloodCtrl3 ctrlSetPosition _ctrlPosition; - - _fxBloodControls = [_bloodCtrl1, _bloodCtrl2, _bloodCtrl3]; - SETUVAR(GVAR(FXBloodControls),_fxBloodControls); -} else { - _bloodCtrl1 = _fxBloodControls select 0; - _bloodCtrl2 = _fxBloodControls select 1; - _bloodCtrl3 = _fxBloodControls select 2; -}; - -// reset everything -_bloodCtrl1 ctrlSetFade 1; -_bloodCtrl2 ctrlSetFade 1; -_bloodCtrl3 ctrlSetFade 1; - -_bloodCtrl1 ctrlCommit 0; -_bloodCtrl2 ctrlCommit 0; -_bloodCtrl3 ctrlCommit 0; - -if (_bloodRemaining < 5) exitWith { - // nothing -}; - -if (_bloodRemaining < 25) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl1 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; -}; - -if (_bloodRemaining < 40) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl2 ctrlSetFade 0.85; - _bloodCtrl1 ctrlCommit 0.2; - _bloodCtrl2 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 1) ctrlCommit 1; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 1.2] call CBA_fnc_waitAndExecute; -}; - -if (_bloodRemaining < 55) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl2 ctrlSetFade 0.7; - _bloodCtrl1 ctrlCommit 0.2; - _bloodCtrl2 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 2) ctrlSetFade 1; - (_this select 1) ctrlCommit 1; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 1.2] call CBA_fnc_waitAndExecute; -}; - -if (_bloodRemaining < 70) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl2 ctrlSetFade 0.7; - _bloodCtrl3 ctrlSetFade 0.85; - _bloodCtrl1 ctrlCommit 0.2; - _bloodCtrl2 ctrlCommit 0.2; - _bloodCtrl3 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 2) ctrlSetFade 1; - (_this select 2) ctrlCommit 1.5; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 1) ctrlCommit 1; - }, _fxBloodControls, 1.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 2.2] call CBA_fnc_waitAndExecute; -}; - -//default -_bloodCtrl1 ctrlSetFade 0.2; -_bloodCtrl2 ctrlSetFade 0.7; -_bloodCtrl3 ctrlSetFade 0.7; -_bloodCtrl1 ctrlCommit 0.2; -_bloodCtrl2 ctrlCommit 0.2; -_bloodCtrl3 ctrlCommit 0.2; - -[{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 2) ctrlSetFade 1; - (_this select 2) ctrlCommit 1.5; -}, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - -[{ - (_this select 1) ctrlCommit 1; -}, _fxBloodControls, 1.7] call CBA_fnc_waitAndExecute; - -[{ - (_this select 0) ctrlCommit 0.8; -}, _fxBloodControls, 2.2] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_translateSelections.sqf b/addons/medical/functions/fnc_translateSelections.sqf deleted file mode 100644 index 3990429e910..00000000000 --- a/addons/medical/functions/fnc_translateSelections.sqf +++ /dev/null @@ -1,96 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Translate selection names into medical usable hit selection names. - * Aims to deal with the new hitpoint system introduced in Arma3 v1.50 and later. - * - * Arguments: - * 0: Unit - * 1: selection name - * 2: HitPoint Index/True to get hitpoint - * - * Return Value: - * translated selection/hitpoint name - * - * Example: - * [bob, "pelvis", 4] call ace_medical_fnc_translateSelections - * Returns "body" - * - * [bob, "body", true] call ace_medical_fnc_translateSelections - * Returns "HitBody" - * - * Public: No - */ - -#define HEAD_SELECTIONS ["face_hub", "neck", "head"] -#define HEAD_HITPOINTS ["hitface", "hitneck", "hithead"] -#define TORSO_SELECTIONS ["pelvis", "spine1", "spine2", "spine3", "body"] -#define TORSO_HITPOINTS ["hitpelvis", "hitabdomen", "hitdiaphragm", "hitchest", "hitbody"] -#define L_ARM_SELECTIONS ["hand_l"] -#define L_ARM_HITPOINTS ["hitleftarm", "hand_l"] -#define R_ARM_SELECTIONS ["hand_r"] -#define R_ARM_HITPOINTS ["hitrightarm", "hand_r"] -#define L_LEG_SELECTIONS ["leg_l"] -#define L_LEG_HITPOINTS ["hitleftleg", "leg_l"] -#define R_LEG_SELECTIONS ["leg_r"] -#define R_LEG_HITPOINTS ["hitrightleg", "leg_r"] - -params ["_unit", "_selection", "_hitPointIndex"]; - -if (_selection == "") exitWith {""}; - -//Get Selection from standard selection ["head","body","hand_l","hand_r","leg_l","leg_r"] -if (_hitPointIndex isEqualTo true) exitWith { - private _returnHitPoint = GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selection); - //If the selection is a valid hitpoint just return it: - if (!isNil {_unit getHitPointDamage _returnHitPoint}) exitWith { - _returnHitPoint; - }; - - //Those VR fuckers have weird limb hitpoints - private _hitPoints = switch (_selection) do { - case ("hand_l"): {L_ARM_HITPOINTS}; - case ("hand_r"): {R_ARM_HITPOINTS}; - case ("leg_l"): {L_LEG_HITPOINTS}; - case ("leg_r"): {R_LEG_HITPOINTS}; - case ("head"): {HEAD_HITPOINTS}; - case ("body"): {TORSO_HITPOINTS}; - default {[]}; - }; - { - if (!isNil {_unit getHitPointDamage _x}) exitWith { - _returnHitPoint = _x; - }; - } forEach _hitPoints; - _returnHitPoint -}; - - -//Get Selection from Selection/HitIndex: - -if (_selection in HEAD_SELECTIONS) exitWith {"head"}; -if (_selection in TORSO_SELECTIONS) exitWith {"body"}; - -// Not necessary unless we get more hitpoints variants in an next arma update -/*if (_selection in L_ARM_SELECTIONS) exitWith {"hand_l"}; -if (_selection in R_ARM_SELECTIONS) exitWith {"hand_r"}; -if (_selection in L_LEG_SELECTIONS) exitWith {"leg_l"}; -if (_selection in R_LEG_SELECTIONS) exitWith {"leg_r"};*/ - -//Backup method to detect weird selections/hitpoints -if ((_selection == "?") || {!(_selection in GVAR(SELECTIONS))}) exitWith { - if (_hitPointIndex < 0) exitWith {_selection}; - private _hitPoint = toLower configName ((configProperties [(configFile >> "CfgVehicles" >> (typeOf _unit) >> "HitPoints")]) select _hitPointIndex); - TRACE_4("Weird sel/hit", _unit, _selection, _hitPointIndex, _hitPoint); - - if (_hitPoint in HEAD_HITPOINTS) exitWith {"head"}; - if (_hitPoint in TORSO_HITPOINTS) exitWith {"body"}; - if (_hitPoint in L_ARM_HITPOINTS) exitWith {"hand_l"}; - if (_hitPoint in R_ARM_HITPOINTS) exitWith {"hand_r"}; - if (_hitPoint in L_LEG_HITPOINTS) exitWith {"leg_l"}; - if (_hitPoint in R_LEG_HITPOINTS) exitWith {"leg_r"}; - - _selection -}; - -_selection; diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf deleted file mode 100644 index 0ed4694c2f1..00000000000 --- a/addons/medical/functions/fnc_treatment.sqf +++ /dev/null @@ -1,246 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, KoffeinFlummi - * Starts the treatment process - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "SelectionName","bandage"] call ace_medical_fnc_treatment - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className"]; - -// If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine -if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith { - [DFUNC(treatment), _this] call CBA_fnc_execNextFrame; -}; - -if !(_target isKindOf "CAManBase") exitWith {false}; - -private _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; - -if !(isClass _config) exitwith {false}; - -// Allow self treatment check -if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false}; - -private _medicRequired = if (isNumber (_config >> "requiredMedic")) then { - getNumber (_config >> "requiredMedic"); -} else { - // Check for required class - if (isText (_config >> "requiredMedic")) exitwith { - missionNamespace getVariable [(getText (_config >> "requiredMedic")), 0]; - }; - 0; -}; - -if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; - -private _allowedSelections = getArray (_config >> "allowedSelections"); -if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith {false}; - -// Check item -private _items = getArray (_config >> "items"); -if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; - -private _return = true; -if (isText (_config >> "Condition")) then { - private _condition = getText(_config >> "condition"); - if (_condition != "") then { - if (isnil _condition) then { - _condition = compile _condition; - } else { - _condition = missionNamespace getVariable _condition; - }; - if (_condition isEqualType false) then { - _return = _condition; - } else { - _return = [_caller, _target, _selectionName, _className] call _condition; - }; - }; -}; -if (!_return) exitwith {false}; - -private _patientStateCondition = if (isText(_config >> "patientStateCondition")) then { - missionNamespace getVariable [getText(_config >> "patientStateCondition"), 0] -} else { - getNumber(_config >> "patientStateCondition") -}; -if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; - -// Check allowed locations -private _locations = getArray (_config >> "treatmentLocations"); - -if ("All" in _locations) then { - _return = true; -} else { - private _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; - private _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isInMedicalVehicle))}; - - { - if (_x == "field") exitwith {_return = true;}; - if (_x == "MedicalFacility" && _medFacility) exitwith {_return = true;}; - if (_x == "MedicalVehicle" && _medVeh) exitwith {_return = true;}; - if !(isnil _x) exitwith { - private _val = missionNamespace getVariable _x; - if (_val isEqualType 0) then { - _return = switch (_val) do { - case 0: {true}; //AdvancedMedicalSettings_anywhere - case 1: {call _medVeh}; //AdvancedMedicalSettings_vehicle - case 2: {call _medFacility}; //AdvancedMedicalSettings_facility - case 3: {(call _medFacility) || {call _medVeh}}; //AdvancedMedicalSettings_vehicleAndFacility - default {false}; //Disabled - }; - }; - }; - } foreach _locations; -}; - -if !(_return) exitwith {false}; - -private _usersOfItems = []; -private _consumeItems = if (isNumber (_config >> "itemConsumed")) then { - getNumber (_config >> "itemConsumed"); -} else { - // Check for required class - if (isText (_config >> "itemConsumed")) exitwith { - missionNamespace getVariable [(getText (_config >> "itemConsumed")), 0]; - }; - 0; -}; -if (_consumeItems > 0) then { - _usersOfItems = ([_caller, _target, _items] call FUNC(useItems)) select 1; -}; - -// Parse the config for the progress callback -private _callbackProgress = getText (_config >> "callbackProgress"); -if (_callbackProgress == "") then { - _callbackProgress = "true"; -}; -if (isNil _callbackProgress) then { - _callbackProgress = compile _callbackProgress; -} else { - _callbackProgress = missionNamespace getVariable _callbackProgress; -}; - -// Patient Animation -private _patientAnim = getText (_config >> "animationPatient"); -if (_target getVariable ["ACE_isUnconscious", false] && GVAR(allowUnconsciousAnimationOnTreatment)) then { - if !(animationState _target in (getArray (_config >> "animationPatientUnconsciousExcludeOn"))) then { - _patientAnim = getText (_config >> "animationPatientUnconscious"); - }; -}; - -if (_caller != _target && {vehicle _target == _target} && {_patientAnim != ""}) then { - if (_target getVariable ["ACE_isUnconscious", false]) then { - [_target, _patientAnim, 2, true] call EFUNC(common,doAnimation); - } else { - [_target, _patientAnim, 1, true] call EFUNC(common,doAnimation); - }; -}; - -// Player Animation -private _callerAnim = [getText (_config >> "animationCaller"), getText (_config >> "animationCallerProne")] select (stance _caller == "PRONE"); -if (_caller == _target) then { - _callerAnim = [getText (_config >> "animationCallerSelf"), getText (_config >> "animationCallerSelfProne")] select (stance _caller == "PRONE"); -}; - -_caller setVariable [QGVAR(selectedWeaponOnTreatment), (weaponState _caller)]; - -// Cannot use secondairy weapon for animation -if (currentWeapon _caller == secondaryWeapon _caller) then { - _caller selectWeapon (primaryWeapon _caller); -}; - -private _wpn = ["non", "rfl", "pst"] select (1 + ([primaryWeapon _caller, handgunWeapon _caller] find (currentWeapon _caller))); -private _callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace; -if (vehicle _caller == _caller && {_callerAnim != ""}) then { - if (primaryWeapon _caller == "") then { - _caller addWeapon "ACE_FakePrimaryWeapon"; - }; - if (currentWeapon _caller == "") then { - _caller selectWeapon (primaryWeapon _caller); // unit always has a primary weapon here - }; - - if !(_caller call EFUNC(common,isSwimming)) then { - // Weapon on back also does not work underwater - if (isWeaponDeployed _caller) then { - TRACE_1("Weapon Deployed, breaking out first",(stance _caller)); - [_caller, "", 0] call EFUNC(common,doAnimation); - }; - - if ((stance _caller) == "STAND") then { - switch (_wpn) do {//If standing, end in a crouched animation based on their current weapon - case ("rfl"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWrflDnon"];}; - case ("pst"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWpstDnon"];}; - case ("non"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSnonWnonDnon"];}; - }; - } else { - _caller setVariable [QGVAR(treatmentPrevAnimCaller), animationState _caller]; - }; - [_caller, _callerAnim] call EFUNC(common,doAnimation); - }; -}; - -//Get treatment time -private _treatmentTime = if (isNumber (_config >> "treatmentTime")) then { - getNumber (_config >> "treatmentTime"); -} else { - if (isText (_config >> "treatmentTime")) exitwith { - private _treatmentTimeConfig = getText(_config >> "treatmentTime"); - if (isnil _treatmentTimeConfig) then { - _treatmentTimeConfig = compile _treatmentTimeConfig; - } else { - _treatmentTimeConfig = missionNamespace getVariable _treatmentTimeConfig; - }; - if (_treatmentTimeConfig isEqualType 0) exitwith { - _treatmentTimeConfig; - }; - [_caller, _target, _selectionName, _className] call _treatmentTimeConfig; - }; - 0; -}; - -// Start treatment -[ - _treatmentTime, - [_caller, _target, _selectionName, _className, _items, _usersOfItems], - DFUNC(treatment_success), - DFUNC(treatment_failure), - getText (_config >> "displayNameProgress"), - _callbackProgress, - ["isNotInside", "isNotSwimming"] -] call EFUNC(common,progressBar); - -// Display Icon -private _iconDisplayed = getText (_config >> "actionIconPath"); -if (_iconDisplayed != "") then { - [QGVAR(treatmentActionIcon), true, _iconDisplayed, [1,1,1,1], getNumber(_config >> "actionIconDisplayTime")] call EFUNC(common,displayIcon); -}; - -// handle display of text/hints -private _displayText = ""; -if (_target != _caller) then { - _displayText = getText(_config >> "displayTextOther"); -} else { - _displayText = getText(_config >> "displayTextSelf"); -}; - -if (_displayText != "") then { - [QEGVAR(common,displayTextStructured), [[_displayText, [_caller] call EFUNC(common,getName), [_target] call EFUNC(common,getName)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; -}; - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf deleted file mode 100644 index 5c673c080a2..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Callback for the CPR treatment action on success. - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "selectionName", "bandage"] call ace_medical_fnc_treatmentAdvanced_CPR - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (alive _target && {(_target getVariable [QGVAR(inCardiacArrest), false] || _target getVariable [QGVAR(inReviveState), false])}) then { - [_target, "activity_view", LSTRING(Activity_cpr), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); - - if (local _target) then { - [QGVAR(treatmentAdvanced_CPRLocal), [_caller, _target]] call CBA_fnc_localEvent; - } else { - [QGVAR(treatmentAdvanced_CPRLocal), [_caller, _target], _target] call CBA_fnc_targetEvent; - }; -}; -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf deleted file mode 100644 index 9659ee7481e..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * local Callback for the CPR treatment action on success. - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient] call ace_medical_fnc_treatmentAdvanced_CPRLocal - * - * Public: Yes - */ - -params ["_caller","_target"]; - -if (_target getVariable [QGVAR(inReviveState), false]) then { - private _reviveStartTime = _target getVariable [QGVAR(reviveStartTime),0]; - if (_reviveStartTime > 0) then { - _target setVariable [QGVAR(reviveStartTime), (_reviveStartTime + random(20)) min CBA_missionTime]; - }; -}; - -if (GVAR(level) > 1 && {(random 1) >= 0.6}) then { - _target setVariable [QGVAR(inCardiacArrest), nil,true]; - _target setVariable [QGVAR(heartRate), 40]; - _target setVariable [QGVAR(bloodPressure), [50,70]]; -}; - -[_target, "activity", LSTRING(Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf deleted file mode 100644 index 9cb4ac423bb..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Item - * 5: specific Spot (default: -1) - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "Selectionname", "bandage", "bandage", -1] call ace_medical_fnc_treatmentAdvanced_bandage - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items", "", ["_specificSpot", -1]]; - -[_target, "activity", LSTRING(Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -if (local _target) then { - [QGVAR(treatmentAdvanced_bandageLocal), [_target, _className, _selectionName, _specificSpot]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentAdvanced_bandageLocal), [_target, _className, _selectionName, _specificSpot], _target] call CBA_fnc_targetEvent; -}; - -/* { - if (_x != "") then { - [_target, _x] call FUNC(addToTriageCard); - }; -}forEach _items;*/ - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf deleted file mode 100644 index ba94eb2d01c..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ /dev/null @@ -1,187 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the bandage of a patient. - * - * Arguments: - * 0: The patient - * 1: Treatment classname - * - * - * Return Value: - * Succesful treatment started - * - * Example: - * [bob, "classname"] call ACE_medical_fnc_treatmentAdvanced_bandageLocal - * - * Public: No - */ - -params ["_target", "_bandage", "_selectionName", ["_specificClass", -1]]; - -// Ensure it is a valid bodypart -private _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part < 0) exitWith {false}; - -// Get the open wounds for this unit -private _openWounds = _target getVariable [QGVAR(openWounds), []]; -if (count _openWounds == 0) exitWith {false}; // nothing to do here! - -// Get the default effectiveness for the used bandage -private _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); -private _effectiveness = getNumber (_config >> "effectiveness"); -if (isClass (_config >> _bandage)) then { - _config = (_config >> _bandage); - if (isNumber (_config >> "effectiveness")) then { _effectiveness = getNumber (_config >> "effectiveness");}; -}; - -// Figure out which injury for this bodypart is the best choice to bandage -// TODO also use up the remainder on left over injuries -private _mostEffectiveSpot = 0; -private _effectivenessFound = -1; -private _mostEffectiveInjury = _openWounds select 0; -private _exit = false; -{ - _x params ["", "_classID", "_partX"]; - TRACE_2("OPENWOUND: ", _target, _x); - // Only parse injuries that are for the selected bodypart. - if (_partX == _part) then { - private _woundEffectiveness = _effectiveness; - - // Select the classname from the wound classname storage - private _className = GVAR(woundClassNames) select _classID; - - // Check if this wound type has attributes specified for the used bandage - if (isClass (_config >> _className)) then { - // Collect the effectiveness from the used bandage for this wound type - private _woundTreatmentConfig = (_config >> _className); - if (isNumber (_woundTreatmentConfig >> "effectiveness")) then { - _woundEffectiveness = getNumber (_woundTreatmentConfig >> "effectiveness"); - }; - } else { - //Basic medical bandage just has a base level config (same effectivenes for all wound types) - if (_bandage != "Bandage") then { - WARNING_2("No config for wound type [%1] config base [%2]", _className, _config); - }; - }; - - TRACE_2("Wound classes: ", _specificClass, _classID); - if (_specificClass == _classID) exitWith { - _effectivenessFound = _woundEffectiveness; - _mostEffectiveSpot = _forEachIndex; - _mostEffectiveInjury = _x; - _exit = true; - }; - - // Check if this is the currently most effective found. - if (_woundEffectiveness * ((_x select 4) * (_x select 3)) > _effectivenessFound * ((_mostEffectiveInjury select 4) * (_mostEffectiveInjury select 3))) then { - _effectivenessFound = _woundEffectiveness; - _mostEffectiveSpot = _forEachIndex; - _mostEffectiveInjury = _x; - }; - }; - if (_exit) exitWith {}; -} forEach _openWounds; - -if (_effectivenessFound == -1) exitWith {}; // Seems everything is patched up on this body part already.. - - -// TODO refactor this part -// Find the impact this bandage has and reduce the amount this injury is present -private _impact = if ((_mostEffectiveInjury select 3) >= _effectivenessFound) then {_effectivenessFound} else { (_mostEffectiveInjury select 3) }; -_mostEffectiveInjury set [ 3, ((_mostEffectiveInjury select 3) - _impact) max 0]; -_openWounds set [_mostEffectiveSpot, _mostEffectiveInjury]; - -_target setVariable [QGVAR(openWounds), _openWounds, true]; - -// Handle the reopening of bandaged wounds -if (_impact > 0 && {GVAR(level) >= 2} && {GVAR(enableAdvancedWounds)}) then { - [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); -}; - -// If all wounds to a body part have been bandaged, reset damage to that body part to zero -// so that the body part functions normally and blood is removed from the uniform. -// Arma combines left and right arms into a single body part (HitHands), same with left and right legs (HitLegs). -// Arms are actually hands. -if (GVAR(healHitPointAfterAdvBandage) || {GVAR(level) < 2}) then { - // Get the list of the wounds the target is currently suffering from. - private _currentWounds = _target getVariable [QGVAR(openWounds), []]; - - // Tally of unbandaged wounds to each body part. - private _headWounds = 0; - private _bodyWounds = 0; - private _leftArmWounds = 0; - private _leftLegWounds = 0; - private _rightArmWounds = 0; - private _rightLegWounds = 0; - - // Loop through all current wounds and add up the number of unbandaged wounds on each body part. - { - _x params ["", "", "_bodyPart", "_numOpenWounds", "_bloodLoss"]; - - // Use switch/case for early termination if wounded limb is found before all six are checked. - // Number of wounds multiplied by blood loss will return zero for a fully - // bandaged body part, not incrementing the wound counter; or it will return - // some other number which will increment the wound counter. - switch (_bodyPart) do { - // Head - case 0: { - _headWounds = _headWounds + (_numOpenWounds * _bloodLoss); - }; - - // Body - case 1: { - _bodyWounds = _bodyWounds + (_numOpenWounds * _bloodLoss); - }; - - // Left Arm - case 2: { - _leftArmWounds = _leftArmWounds + (_numOpenWounds * _bloodLoss); - }; - - // Right Arm - case 3: { - _rightArmWounds = _rightArmWounds + (_numOpenWounds * _bloodLoss); - }; - - // Left Leg - case 4: { - _leftLegWounds = _leftLegWounds + (_numOpenWounds * _bloodLoss); - }; - - // Right Leg - case 5: { - _rightLegWounds = _rightLegWounds + (_numOpenWounds * _bloodLoss); - }; - }; - } forEach _currentWounds; - - // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] - private _bodyStatus = _target getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - - // Any body part that has no wounds is healed to full health - if (_headWounds == 0) then { - _bodyStatus set [0, 0]; - }; - if (_bodyWounds == 0) then { - _bodyStatus set [1, 0]; - }; - if (_leftArmWounds == 0) then { - _bodyStatus set [2, 0]; - }; - if (_rightArmWounds == 0) then { - _bodyStatus set [3, 0]; - }; - if (_leftLegWounds == 0) then { - _bodyStatus set [4, 0]; - }; - if (_rightLegWounds == 0) then { - _bodyStatus set [5, 0]; - }; - - _target setVariable [QGVAR(bodyPartStatus), _bodyStatus, true]; - - [_target] call FUNC(handleDamage_advancedSetDamage); -}; - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf deleted file mode 100644 index d5c6427aa8f..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * - * - * Arguments: - * 0: Caller - * 1: Target - * 2: SelectionName - * 3: ClassName - * 4: Item - * - * Return Value: - * Boolean - * - * Example: - * [bob, kevin, "selection", "classname", ] call ACE_medical_fnc_treatmentAdvanced_fullHeal - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (local _target) then { - [QGVAR(treatmentAdvanced_fullHealLocal), [_caller, _target]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentAdvanced_fullHealLocal), [_caller, _target], _target] call CBA_fnc_targetEvent; -}; - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf deleted file mode 100644 index d2435e0ee0c..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf +++ /dev/null @@ -1,75 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * - * - * Arguments: - * 0: Caller - * 1: Target - * - * Return Value: - * Boolean - * - * Example: - * [bob, kevin] call ACE_medical_fnc_treatmentAdvanced_fullHealLocal - * - * Public: No - */ - -params ["_caller", "_target"]; - -if (alive _target) exitWith { - - _target setVariable [QGVAR(pain), 0, true]; - _target setVariable [QGVAR(morphine), 0, true]; - _target setVariable [QGVAR(bloodVolume), 100, true]; - - // tourniquets - _target setVariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; - - // wounds and injuries - _target setVariable [QGVAR(openWounds), [], true]; - _target setVariable [QGVAR(bandagedWounds), [], true]; - _target setVariable [QGVAR(internalWounds), [], true]; - - // vitals - _target setVariable [QGVAR(heartRate), 80]; - _target setVariable [QGVAR(heartRateAdjustments), []]; - _target setVariable [QGVAR(bloodPressure), [80, 120]]; - _target setVariable [QGVAR(peripheralResistance), 100]; - - // fractures - _target setVariable [QGVAR(fractures), []]; - - // IVs - _target setVariable [QGVAR(ivBags), nil, true]; - - // damage storage - _target setVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; - - // airway - _target setVariable [QGVAR(airwayStatus), 100, true]; - _target setVariable [QGVAR(airwayOccluded), false, true]; - _target setVariable [QGVAR(airwayCollapsed), false, true]; - - // generic medical admin - _target setVariable [QGVAR(inCardiacArrest), false, true]; - _target setVariable [QGVAR(inReviveState), false, true]; - _target setVariable ["ACE_isUnconscious", false, true]; - _target setVariable [QGVAR(hasLostBlood), 0, true]; - _target setVariable [QGVAR(isBleeding), false, true]; - _target setVariable [QGVAR(hasPain), false, true]; - _target setVariable [QGVAR(painSuppress), 0, true]; - - // medication - private _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; - { - _target setVariable [_x select 0, nil]; - } forEach _allUsedMedication; - - // Resetting damage - _target setDamage 0; - - [_target, "activity", LSTRING(Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); - [_target, "activity_view", LSTRING(Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message -}; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf deleted file mode 100644 index 35c9c5133f6..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Ruthberg - * Calculates the personal aid kit treatment time based on amount of damage to heal - * - * Arguments: - * unit - * - * Return Value: - * treatment time - * - * Example: - * [_target] call ace_medical_fnc_treatmentAdvanced_fullHealTreatmentTime - * - * Public: No - */ - -private _totalDamage = 0; - -{ - _totalDamage = _totalDamage + _x; -} forEach (_this getVariable [QGVAR(bodyPartStatus), []]); - -(10 max (_totalDamage * 10) min 120) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf deleted file mode 100644 index b48e2bb2da6..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Items Used - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "selectionName", "bandage", 2] call ace_medical_fnc_treatmentAdvanced_medication - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; -TRACE_5("params",_caller,_target,_selectionName,_className,_items); - -private _part = [_selectionName] call FUNC(selectionNameToNumber); - -[QGVAR(treatmentAdvanced_medicationLocal), [_target, _className, _part], [_target]] call CBA_fnc_targetEvent; - -{ - if (_x != "") then { - [_target, _x] call FUNC(addToTriageCard); - [_target, "activity", LSTRING(Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); - [_target, "activity_view", LSTRING(Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); - }; -} forEach _items; - - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf deleted file mode 100644 index 4435ae4f480..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf +++ /dev/null @@ -1,100 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the medication given to a patient. - * - * Arguments: - * 0: The patient - * 1: Treatment classname - * 2: Injection Site Part Number - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, "bandage", 2] call ace_medical_fnc_treatmentAdvanced_medicationLocal - * - * Public: Yes - */ - -params ["_target", "_className", "_partNumber"]; -TRACE_3("params",_target,_className,_partNumber); - -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -if ((_tourniquets select _partNumber) > 0) exitWith { - TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets); - private _delayedMedications = _target getVariable [QGVAR(occludedMedications), []]; - _delayedMedications pushBack _this; - _target setVariable [QGVAR(occludedMedications), _delayedMedications, true]; - true -}; - -// We have added a new dose of this medication to our system, so let's increase it -private _varName = format[QGVAR(%1_inSystem), _className]; -private _currentInSystem = _target getVariable [_varName, 0]; -_target setVariable [_varName, _currentInSystem + 1]; - -// Find the proper attributes for the used medication -private _medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication"); -private _painReduce = getNumber (_medicationConfig >> "painReduce"); -private _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); -private _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); -private _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); -private _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); -private _maxDose = getNumber (_medicationConfig >> "maxDose"); -private _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); -private _hrCallback = getText (_medicationConfig >> "hrCallback"); - -private _inCompatableMedication = []; -if (isClass (_medicationConfig >> _className)) then { - _medicationConfig = (_medicationConfig >> _className); - if (isNumber (_medicationConfig >> "painReduce")) then { _painReduce = getNumber (_medicationConfig >> "painReduce");}; - if (isArray (_medicationConfig >> "hrIncreaseLow")) then { _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); }; - if (isArray (_medicationConfig >> "hrIncreaseNormal")) then { _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); }; - if (isArray (_medicationConfig >> "hrIncreaseHigh")) then { _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); }; - if (isNumber (_medicationConfig >> "timeInSystem")) then { _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); }; - if (isNumber (_medicationConfig >> "maxDose")) then { _maxDose = getNumber (_medicationConfig >> "maxDose"); }; - if (isArray (_medicationConfig >> "inCompatableMedication")) then { _inCompatableMedication = getArray (_medicationConfig >> "inCompatableMedication"); }; - if (isNumber (_medicationConfig >> "viscosityChange")) then { _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); }; - if (isText (_medicationConfig >> "hrCallback")) then { _hrCallback = getText (_medicationConfig >> "hrCallback"); }; -}; -if (isNil _hrCallback) then { - _hrCallback = compile _hrCallback; -} else { - _hrCallback = missionNamespace getVariable _hrCallback; -}; -if (!(_hrCallback isEqualType {})) then {_hrCallback = {TRACE_1("callback was NOT code",_hrCallback)};}; - -// Adjust the heart rate based upon config entry -private _heartRate = _target getVariable [QGVAR(heartRate), 70]; -if (alive _target) then { - if (_heartRate > 0) then { - if (_heartRate <= 45) then { - [_target, ((_hrIncreaseLow select 0) + random ((_hrIncreaseLow select 1) - (_hrIncreaseLow select 0))), (_hrIncreaseLow select 2), _hrCallback] call FUNC(addHeartRateAdjustment); - } else { - if (_heartRate > 120) then { - [_target, ((_hrIncreaseHigh select 0) + random ((_hrIncreaseHigh select 1) - (_hrIncreaseHigh select 0))), (_hrIncreaseHigh select 2), _hrCallback] call FUNC(addHeartRateAdjustment); - } else { - [_target, ((_hrIncreaseNorm select 0) + random ((_hrIncreaseNorm select 1) - (_hrIncreaseNorm select 0))), (_hrIncreaseNorm select 2), _hrCallback] call FUNC(addHeartRateAdjustment); - }; - }; - }; -}; - -if (_painReduce > 0) then { - // Reduce pain - private _painSuppress = _target getVariable [QGVAR(painSuppress), 0]; - _target setVariable [QGVAR(painSuppress), (_painSuppress + _painReduce) max 0]; - if (!GVAR(painIsOnlySuppressed)) then { - _pain = _target getVariable [QGVAR(pain), 0]; - _target setVariable [QGVAR(pain), (_pain - _painReduce) max 0, true]; - }; -}; - -private _resistance = _target getVariable [QGVAR(peripheralResistance), 100]; -_target setVariable [QGVAR(peripheralResistance), (_resistance + _viscosityChange) max 0]; - -// Call back to ensure that the medication is decreased over time -[_target, _classname, _varName, _maxDose, _timeInSystem, _inCompatableMedication, _viscosityChange, _painReduce] call FUNC(onMedicationUsage); - -true diff --git a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf b/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf deleted file mode 100644 index 7f7cb481aae..00000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: BaerMitUmlaut - * Handles treatment via surgical kit per frame - * - * Arguments: - * 0: Arguments - * 0: Caller - * 1: Target - * 1: Elapsed Time - * 2: Total Time - * - * Return Value: - * Succesful treatment started - * - * Example: - * [[bob, kevin], 5, 5] call ACE_medical_fnc_treatmentAdvanced_surgicalKit_onProgress - * - * Public: No - */ - -params ["_args", "_elapsedTime", "_totalTime"]; -_args params ["_caller", "_target"]; - -private _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; - -//In case two people stitch up one patient and the last wound has already been closed we can stop already -if (count _bandagedWounds == 0) exitWith { false }; - -//Has enough time elapsed that we can close another wound? -if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then { - _bandagedWounds deleteAt 0; - _target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; -}; - -true diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf deleted file mode 100644 index 297e5a5e43d..00000000000 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Callback when the bloodbag treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Selection Name - * 3: Treatment classname - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentBasic_bloodbag - * - * Public: No - */ - -params ["_caller", "_target", "_treatmentClassname"]; - -if (local _target) then { - [QGVAR(treatmentBasic_bloodbagLocal), [_target, _treatmentClassname]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentBasic_bloodbagLocal), [_target, _treatmentClassname], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf deleted file mode 100644 index 91626095b56..00000000000 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Local callback when the bloodbag treatment is complete - * - * Arguments: - * 0: The patient - * 1: Treatment Classname - * - * Return Value: - * None - * - * Example: - * [bob, "classname"] call ACE_medical_fnc_treatmentBasic_bloodbagLocal - * - * Public: No - */ -#define BLOODBAGHEAL 70 - -params ["_target", "_treatmentClassname"]; - -private _bloodAdded = switch (true) do { - case (_treatmentClassname == "BloodIV_250"): {0.25 * BLOODBAGHEAL}; - case (_treatmentClassname == "BloodIV_500"): {0.5 * BLOODBAGHEAL}; - default {BLOODBAGHEAL}; -}; - -private _blood = ((_target getVariable [QGVAR(bloodVolume), 100]) + _bloodAdded) min 100; -_target setVariable [QGVAR(bloodVolume), _blood, true]; diff --git a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf b/addons/medical/functions/fnc_treatmentBasic_epipen.sqf deleted file mode 100644 index 4e67cfe6971..00000000000 --- a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf +++ /dev/null @@ -1,23 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Callback when the epipen treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Selection Name - * 3: Treatment classname - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentBasic_epipen - * - * Public: No - */ - -params ["_caller", "_target","_className"]; - -[_target, false] call FUNC(setUnconscious); diff --git a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf b/addons/medical/functions/fnc_treatmentBasic_morphine.sqf deleted file mode 100644 index dbfbecab7fb..00000000000 --- a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Callback when the morphine treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Selection Name - * 3: Treatment classname - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentBasic_morphine - * - * Public: No - */ -#define MORPHINEHEAL 0.4 - -params ["_caller", "_target"]; - -if (local _target) then { - [QGVAR(treatmentBasic_morphineLocal), [_target]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentBasic_morphineLocal), [_target], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf deleted file mode 100644 index 2a2c4358d51..00000000000 --- a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Local callback when the morphine treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_treatmentBasic_morphineLocal - * - * Public: No - */ -#define MORPHINEHEAL 0.4 - -params ["_target"]; - -// reduce pain, pain sensitivity -private _morphine = ((_target getVariable [QGVAR(morphine), 0]) + MORPHINEHEAL) min 1; -_target setVariable [QGVAR(morphine), _morphine, true]; - -private _pain = ((_target getVariable [QGVAR(pain), 0]) - MORPHINEHEAL) max 0; -_target setVariable [QGVAR(pain), _pain, true]; - -// @todo overdose diff --git a/addons/medical/functions/fnc_treatmentIV.sqf b/addons/medical/functions/fnc_treatmentIV.sqf deleted file mode 100644 index 8da7a3bcf6c..00000000000 --- a/addons/medical/functions/fnc_treatmentIV.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Patient IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "SelectionName", "bandage"] call ace_medical_fnc_treatmentIV - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (_items isEqualTo []) exitWith {false}; - -_items params ["_removeItem"]; -if (local _target) then { - [QGVAR(treatmentIVLocal), [_target, _className]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentIVLocal), [_target, _className], _target] call CBA_fnc_targetEvent; -}; - -[_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", LSTRING(Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf deleted file mode 100644 index 1f59edbc350..00000000000 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment local callback - * - * Arguments: - * 0: The medic - * 1: Treatment classname - * - * - * Return Value: - * None - * - * Example: - * [medic, "Classname"] call ace_medical_fnc_treatmentIVLocal - * - * Public: Yes - */ - -params ["_target", "_treatmentClassname"]; - -private _bloodVolume = _target getVariable [QGVAR(bloodVolume), 100]; -if (_bloodVolume >= 100) exitWith {}; - -// Find the proper attributes for the used IV -private _config = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "IV"); -private _volumeAdded = getNumber (_config >> "volume"); -private _typeOf = getText (_config >> "type"); - -if (isClass (_config >> _treatmentClassname)) then { - _config = (_config >> _treatmentClassname); - if (isNumber (_config >> "volume")) then { _volumeAdded = getNumber (_config >> "volume");}; - if (isText (_config >> "type")) then { _typeOf = getText (_config >> "type"); }; -} else { - ERROR("IV Treatment Classname not found"); -}; - -private _bloodBags = _target getVariable [QGVAR(ivBags), []]; -_bloodBags pushBack [_volumeAdded]; // Future BagType: [_volumeAdded, _typeOf] -_target setVariable [QGVAR(ivBags), _bloodBags, true]; diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf deleted file mode 100644 index 23de5f177a9..00000000000 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ /dev/null @@ -1,50 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Apply a tourniquet to the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * - * Return Value: - * Succesful treatment started - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentTourniquet - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (count _items == 0) exitWith {false}; - -private _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part == 0 || _part == 1) exitWith { - // [QEGVAR(common,displayTextStructured), ["You cannot apply a CAT on this body part!"], [_caller]] call CBA_fnc_targetEvent; - false; -}; - -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -if ((_tourniquets select _part) > 0) exitWith { - _output = "There is already a tourniquet on this body part!"; // TODO localization - [QEGVAR(common,displayTextStructured), [_output, 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; - false; -}; - -private _removeItem = _items select 0; -if (local _target) then { - [QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName], _target] call CBA_fnc_targetEvent; -}; - -[_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", LSTRING(Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf deleted file mode 100644 index dc05d6ce5f9..00000000000 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Apply a tourniquet to the patient, local callback. - * - * Arguments: - * 0: The patient - * 1: Item used classname - * - * Return Value: - * None - * - * Example: - * [bob, "classname"] call ACE_medical_fnc_treatmentTourniquetLocal - * - * Public: No - */ - -params ["_target", "_tourniquetItem", "_selectionName"]; - -//If we're not already tracking vitals, start: -[_target] call FUNC(addVitalLoop); - -private _part = [_selectionName] call FUNC(selectionNameToNumber); - -// Place a tourniquet on the bodypart -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -_tourniquets set [_part, CBA_missionTime]; -_target setVariable [QGVAR(tourniquets), _tourniquets, true]; diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf deleted file mode 100644 index 02d31532715..00000000000 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ /dev/null @@ -1,74 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Callback when the treatment fails - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Items available > - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selectionname", "classname", ["bandage"]] call ACE_medical_fnc_treatment_failure - * - * Public: No - */ - -params ["_args"]; -_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"]; - -if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { - _caller removeWeapon "ACE_FakePrimaryWeapon"; -}; -if (vehicle _caller == _caller && {!(_caller call EFUNC(common,isSwimming))}) then { - private _lastAnim = _caller getVariable [QGVAR(treatmentPrevAnimCaller), ""]; - //Don't play another medic animation (when player is rapidily treating) - TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch (toLower _lastAnim) do { - case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; - }; - [_caller, _lastAnim, 2] call EFUNC(common,doAnimation); -}; -_caller setVariable [QGVAR(treatmentPrevAnimCaller), nil]; - -private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnTreatment), []]); -if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") && {_previousWeapon in (weapons _caller)}}) then { - for "_index" from 0 to 299 do { - _caller action ["SwitchWeapon", _caller, _caller, _index]; - //Just check weapon, muzzle and mode (ignore ammo in case they were reloading) - if (((weaponState _caller) select [0,3]) isEqualTo (_weaponSelect select [0,3])) exitWith {TRACE_1("Restoring", (weaponState _caller));}; - if ((weaponState _caller) isEqualTo ["","","","",0]) exitWith {ERROR("weaponState not found");}; - }; -} else { - _caller action ["SwitchWeapon", _caller, _caller, 299]; -}; - -{ - _x params ["_unit", "_item"]; - _unit addItem _item; -} forEach _usersOfItems; - -// Record specific callback -private _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; - -private _callback = getText (_config >> "callbackFailure"); -_callback = if (isNil _callback) then { - compile _callback -} else { - missionNamespace getVariable _callback -}; -if (!(_callback isEqualType {})) then {_callback = {TRACE_1("callback was NOT code",_callback)};}; - -_args call _callback; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf deleted file mode 100644 index 17c9de62ba2..00000000000 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ /dev/null @@ -1,92 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Callback when the treatment is completed - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Items available > - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selectionname", "classname", ["bandage"]] call ACE_medical_fnc_treatment_success - * - * Public: No - */ - -params ["_args"]; -_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"]; - -if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { - _caller removeWeapon "ACE_FakePrimaryWeapon"; -}; -if (vehicle _caller == _caller && {!(_caller call EFUNC(common,isSwimming))}) then { - private _lastAnim = _caller getVariable [QGVAR(treatmentPrevAnimCaller), ""]; - //Don't play another medic animation (when player is rapidily treating) - TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch (toLower _lastAnim) do { - case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; - }; - [_caller, _lastAnim, 2] call EFUNC(common,doAnimation); -}; -_caller setVariable [QGVAR(treatmentPrevAnimCaller), nil]; - -private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnTreatment), []]); -if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") && {_previousWeapon in (weapons _caller)}}) then { - for "_index" from 0 to 299 do { - _caller action ["SwitchWeapon", _caller, _caller, _index]; - //Just check weapon, muzzle and mode (ignore ammo in case they were reloading) - if (((weaponState _caller) select [0,3]) isEqualTo (_weaponSelect select [0,3])) exitWith {TRACE_1("Restoring", (weaponState _caller));}; - if ((weaponState _caller) isEqualTo ["","","","",0]) exitWith {ERROR("weaponState not found");}; - }; -} else { - _caller action ["SwitchWeapon", _caller, _caller, 299]; -}; - -// Record specific callback -private _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; - -private _callback = getText (_config >> "callbackSuccess"); -if (isNil _callback) then { - _callback = compile _callback; -} else { - _callback = missionNamespace getVariable _callback; -}; -if (!(_callback isEqualType {})) then {_callback = {TRACE_1("callback was NOT code",_callback)};}; - -//Get current blood loose on limb (for "bloody" litter) -private _bloodLossOnSelection = 0; -private _partNumber = ([_selectionName] call FUNC(selectionNameToNumber)) max 0; - -// Add all bleeding from wounds on selection -private _openWounds = _target getvariable [QGVAR(openWounds), []]; -{ - _x params ["", "", "_selectionX", "_amountOf", "_percentageOpen"]; - if (_selectionX == _partNumber) then { - _bloodLossOnSelection = _bloodLossOnSelection + (_amountOf * _percentageOpen); - }; -} forEach _openWounds; -TRACE_1("advanced",_bloodLossOnSelection); - -_args call _callback; -_args pushBack _bloodLossOnSelection; -_args call FUNC(createLitter); - -//If we're not already tracking vitals, start: -if (!(_target getVariable [QGVAR(addedToUnitLoop),false])) then { - [_target] call FUNC(addVitalLoop); -}; - -["ace_treatmentSucceded", [_caller, _target, _selectionName, _className]] call CBA_fnc_localEvent; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf deleted file mode 100644 index 31f4d60d4b4..00000000000 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ /dev/null @@ -1,151 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * PFH logic for unconscious state - * - * Arguments: - * 0: PFEH - - * 0: The unit that will be put in an unconscious state - * 1: unitPos (stance) - * 2: Starting Time - * 3: Minimum Waiting Time - * 4: Has Moved Out - * 5: Parachute Check - * 1: PFEH ID - * - * Return Value: - * None - * - * Example: - * [[unit,"pos", 5, 5, true, false], 5], "classname"] call ace_medical_fnc_unconsciousPFH - * - * Public: yes - */ - -params ["_args", "_idPFH"]; -_args params ["_unit", "_originalPos", "_startingTime", "_minWaitingTime", "_hasMovedOut", "_parachuteCheck"]; - -TRACE_6("ACE_DEBUG_Unconscious_PFH",_unit, _originalPos, _startingTime, _minWaitingTime, _hasMovedOut, _parachuteCheck); - -if (!alive _unit) exitWith { - if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { - TRACE_1("Removing fake weapon [on death]",_unit); - _unit removeWeapon "ACE_FakePrimaryWeapon"; - }; - if (GVAR(moveUnitsFromGroupOnUnconscious)) then { - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - }; - [_unit, "setHidden", "ace_unconscious", false] call EFUNC(common,statusEffect_set); - [_unit, false] call EFUNC(common,disableAI); - //_unit setUnitPos _originalPos; - - [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); - ["ace_unconscious", [_unit, false]] call CBA_fnc_globalEvent; - - TRACE_3("ACE_DEBUG_Unconscious_Exit",_unit, (!alive _unit) , "ace_unconscious"); - - [_idPFH] call CBA_fnc_removePerFrameHandler; -}; - -// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation -if !(_unit getVariable ["ACE_isUnconscious",false]) exitWith { - TRACE_7("ACE_DEBUG_Unconscious_PFH",_unit, _args, [_unit] call FUNC(isBeingCarried), [_unit] call FUNC(isBeingDragged), _idPFH, _unit getVariable QGVAR(unconsciousArguments),animationState _unit); - - //Unmute the unit before the carry check - _unit setVariable ["tf_voiceVolume", 1, true]; - _unit setVariable ["tf_unable_to_use_radio", false, true]; - _unit setVariable ["acre_sys_core_isDisabled", false, true]; - - // TODO, handle this with carry instead, so we can remove the PFH here. - // Wait until the unit isn't being carried anymore, so we won't end up with wierd animations - if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then { - if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { - TRACE_1("Removing fake weapon [on wakeup]",_unit); - _unit removeWeapon "ACE_FakePrimaryWeapon"; - }; - - if (vehicle _unit == _unit) then { - if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then { - [_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation); - [_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation); - } else { - [_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation); - }; - } else { - private _vehicle = vehicle _unit; - private _oldVehicleAnimation = _unit getVariable [QGVAR(vehicleAwakeAnim), []]; - private _awakeInVehicleAnimation = ""; - if (((count _oldVehicleAnimation) > 0) && {(_oldVehicleAnimation select 0) == _vehicle}) then { - _awakeInVehicleAnimation = _oldVehicleAnimation select 1; - }; - //Make sure we have a valid, non-terminal animation: - if ((_awakeInVehicleAnimation != "") && {(getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> _awakeInVehicleAnimation >> "terminal")) == 0}) then { - [_unit, _awakeInVehicleAnimation, 2] call EFUNC(common,doAnimation); - } else { - //Don't have a valid animation saved, reset the unit animation with a moveInXXX - TRACE_1("No Valid Animation, doing seat reset", _awakeInVehicleAnimation); - private _slotInfo = []; - {if ((_x select 0) == _unit) exitWith {_slotInfo = _x;};} forEach (fullCrew _vehicle); - if (_slotInfo isEqualTo []) exitWith {ERROR("No _slotInfo?");}; - //Move the unit out: - _unit setPosASL ((getPosASL _unit) vectorAdd [0,0,100]); - //Move the unit back into old seat: - if ((_slotInfo select 1) == "driver") then { - _unit moveInDriver _vehicle; - } else { - if ((_slotInfo select 1) == "cargo") then { - _unit moveInCargo [_vehicle, (_slotInfo select 2)]; - } else { - _unit moveInTurret [_vehicle, (_slotInfo select 3)]; - }; - }; - }; - }; - _unit setVariable [QGVAR(vehicleAwakeAnim), nil]; - - ["ace_unconscious", [_unit, false]] call CBA_fnc_globalEvent; - // EXIT PFH - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - if (!_hasMovedOut) then { - // Reset the unit back to the previous captive state. - [_unit, "setHidden", "ace_unconscious", false] call EFUNC(common,statusEffect_set); - - // Swhich the unit back to its original group - //Unconscious units shouldn't be put in another group #527: - if (GVAR(moveUnitsFromGroupOnUnconscious)) then { - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - }; - [_unit, false] call EFUNC(common,disableAI); - _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) - - _unit setUnconscious false; - - [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); - - // ensure this statement runs only once - _args set [4, true]; - }; -}; - -if (_parachuteCheck) then { - if !(vehicle _unit isKindOf "ParachuteBase") then { - [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); - _args set [5, false]; - }; -}; - -if (!local _unit) exitWith { - TRACE_6("ACE_DEBUG_Unconscious_PFH",_unit, _args, _startingTime, _minWaitingTime, _idPFH, _unit getVariable QGVAR(unconsciousArguments)); - _args set [3, _minWaitingTime - (CBA_missionTime - _startingTime)]; - _unit setVariable [QGVAR(unconsciousArguments), _args, true]; - [_idPFH] call CBA_fnc_removePerFrameHandler; -}; - -// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs -if ((CBA_missionTime - _startingTime) >= _minWaitingTime) exitWith { - TRACE_2("ACE_DEBUG_Unconscious_Temp knock outs",_unit, [_unit] call FUNC(getUnconsciousCondition)); - if (!([_unit] call FUNC(getUnconsciousCondition))) then { - _unit setVariable ["ACE_isUnconscious", false, true]; - }; -}; diff --git a/addons/medical/functions/fnc_updateTourniquets.sqf b/addons/medical/functions/fnc_updateTourniquets.sqf deleted file mode 100644 index 3065ea4f07d..00000000000 --- a/addons/medical/functions/fnc_updateTourniquets.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: diwako - * Update tourniquets on the body image on the menu. - * - * Arguments: - * 0: Display - * 1: Tourniquets - * - * Return Value: - * None - * - * Example: - * [some_display, [0,0,0,0,0,0]] call ace_medical_fnc_updateTourniquets - * - * Public: No - */ - -params ["_display", "_tourniquets"]; - -// Handle tourniquets -private _availableSelections = [0, 0, 56, 57, 58, 59]; -for "_i" from 2 to 5 do { - private _tourn = _tourniquets select _i; - (_display displayCtrl (_availableSelections select _i)) ctrlSetTextColor [0, 0, 0.8, _tourn]; -}; diff --git a/addons/medical/functions/fnc_useItem.sqf b/addons/medical/functions/fnc_useItem.sqf deleted file mode 100644 index 49efceac05a..00000000000 --- a/addons/medical/functions/fnc_useItem.sqf +++ /dev/null @@ -1,60 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Use Equipment if any is available. Priority: 1) Medic, 2) Patient. If in vehicle: 3) Crew - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Item - * - * Return Value: - * 0: success - * 1: Unit - * - * Example: - * [unit, patient, "bandage"] call ace_repair_fnc_useItem - * - * Public: Yes - */ - -params ["_medic", "_patient", "_item"]; - -if (isNil QGVAR(setting_allowSharedEquipment)) then { - GVAR(setting_allowSharedEquipment) = true; -}; - -if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { - if (local _patient) then { - ["ace_useItem", [_patient, _item]] call CBA_fnc_localEvent; - } else { - ["ace_useItem", [_patient, _item], _patient] call CBA_fnc_targetEvent; - }; - [true, _patient]; -}; - -if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { - if (local _medic) then { - ["ace_useItem", [_medic, _item]] call CBA_fnc_localEvent; - } else { - ["ace_useItem", [_medic, _item], _medic] call CBA_fnc_targetEvent; - }; - [true, _medic]; -}; - -private _return = [false, objNull]; -if ([vehicle _medic] call FUNC(isMedicalVehicle) && {vehicle _medic != _medic}) then { - private _crew = crew vehicle _medic; - { - if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitWith { - _return = [true, _x]; - if (local _x) then { - ["ace_useItem", [_x, _item]] call CBA_fnc_localEvent; - } else { - ["ace_useItem", [_x, _item], _x] call CBA_fnc_targetEvent; - }; - }; - } forEach _crew; -}; - -_return diff --git a/addons/medical/functions/fnc_useItems.sqf b/addons/medical/functions/fnc_useItems.sqf deleted file mode 100644 index ef3dc78ab3e..00000000000 --- a/addons/medical/functions/fnc_useItems.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Use Equipment items if any is available. Priority: 1) Medic, 2) Patient. If in vehicle: 3) Crew - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Items > - * - * Return Value: - * None - * - * Example: - * [unit, patient, ["bandage"]] call ace_medical_fnc_useItems - * - * Public: Yes - */ - -params ["_medic", "_patient", "_items"]; - -private _itemsUsedBy = []; -{ - // handle a one of type use item - if (_x isEqualType []) then { - { - private _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); - if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushBack [(_itemUsedInfo select 1), _x]}; - } forEach _x; - }; - - // handle required item - if (_x isEqualType "") then { - private _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); - if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushBack [(_itemUsedInfo select 1), _x]}; - }; -} forEach _items; - -[count _items == count _itemsUsedBy, _itemsUsedBy]; diff --git a/addons/medical/functions/fnc_vitalLoop.sqf b/addons/medical/functions/fnc_vitalLoop.sqf deleted file mode 100644 index 44cd1e4d17a..00000000000 --- a/addons/medical/functions/fnc_vitalLoop.sqf +++ /dev/null @@ -1,50 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Vital loop for a unit. - * - * Arguments: - * 0: The Unit - * 1: Time of last computation - * - * Return Value: - * None - * - * Example: - * [bob, 5] call ACE_medical_fnc_vitalLoop - * - * Public: No - */ - -params ["_unit", "_lastTime"]; - -// If the unit died the loop is finished -if (!alive _unit) exitWith {}; - -// If locality changed, broadcast the last medical state and finish the local loop -if (!local _unit) exitWith { - if (GVAR(level) >= 2) then { - _unit setVariable [QGVAR(heartRate), _unit getVariable [QGVAR(heartRate), 80], true]; - _unit setVariable [QGVAR(bloodPressure), _unit getVariable [QGVAR(bloodPressure), [80, 120]], true]; - }; - _unit setVariable [QGVAR(bloodVolume), _unit getVariable [QGVAR(bloodVolume), 100], true]; -}; - -// Handle unit vitals -[_unit, CBA_missionTime - _lastTime] call FUNC(handleUnitVitals); - -// Play injured sounds -private _pain = _unit getVariable [QGVAR(pain), 0]; -if (_pain > (_unit getVariable [QGVAR(painSuppress), 0])) then { - // This introduces wierd unconscious behaviour for basic medical and possibly also advanced. - // TODO This is disabled as it's considered non critical code. - // We will need to decide if we want unconscious triggered on high pain levels or if we can get rid of this entirely. - /*if (_pain > 0.7 && {random(1) > 0.6}) then { - [_unit] call FUNC(setUnconscious); - };*/ - - [_unit, _pain] call FUNC(playInjuredSound); -}; - -// Schedule the loop to be executed again 1 sec later -[DFUNC(vitalLoop), [_unit, CBA_missionTime], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/script_component.hpp b/addons/medical/functions/script_component.hpp index 140463d68d1..ea579c04a5b 100644 --- a/addons/medical/functions/script_component.hpp +++ b/addons/medical/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\medical\script_component.hpp" +#include "\z\ace\addons\medical\script_component.hpp" \ No newline at end of file diff --git a/addons/medical/initSettings.sqf b/addons/medical/initSettings.sqf new file mode 100644 index 00000000000..367b4f56ba2 --- /dev/null +++ b/addons/medical/initSettings.sqf @@ -0,0 +1,48 @@ +[ + QGVAR(limping), + "LIST", + [LSTRING(Limping_DisplayName), LSTRING(Limping_Description)], + LSTRING(Category), + [[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(Limping_LimpOnOpenWounds), LSTRING(Limping_LimpRequiresStitching)], 1], + true, + {}, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(fractures), + "LIST", + [LSTRING(Fractures_DisplayName), LSTRING(Fractures_Description)], + LSTRING(Category), + [[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(Fractures_SplintHealsFully), LSTRING(Fractures_SplintHasEffects)], 1], + true, + {}, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(fractureChance), + "SLIDER", + [LSTRING(FractureChance_DisplayName), LSTRING(FractureChance_Description)], + LSTRING(Category), + [0, 1, 0.8, 2, true], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(spontaneousWakeUpChance), + "SLIDER", + [LSTRING(SpontaneousWakeUpChance_DisplayName), LSTRING(SpontaneousWakeUpChance_Description)], + LSTRING(Category), + [0, 1, 0.05, 2, true], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(spontaneousWakeUpEpinephrineBoost), + "SLIDER", + [LSTRING(spontaneousWakeUpEpinephrineBoost_DisplayName), LSTRING(spontaneousWakeUpEpinephrineBoost_Description)], + LSTRING(Category), + [1, 30, 1, 1], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index 5735f940f4b..1abe1433931 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT medical -#define COMPONENT_BEAUTIFIED Medical +#define COMPONENT_BEAUTIFIED Medical Core #include "\z\ace\addons\main\script_mod.hpp" // #define DEBUG_MODE_FULL @@ -14,6 +14,5 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL #endif +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" #include "\z\ace\addons\main\script_macros.hpp" - -#define USE_WOUND_EVENT_SYNC false diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index d78ae5c7868..ebb9f92622a 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,3761 +1,9 @@ - - INJURIES - VERLETZUNGEN - FERITE - ТРАВМЫ - BLESSURES - OBRAŻENIA - HERIDAS - SÉRÜLÉSEK - ZRANĚNÍ - FERIMENTOS - 負傷 - 부상 - 受伤 - 受傷 - - - No injuries on this bodypart... - Körperteil nicht verletzt... - Non ci sono ferite in questa parte del corpo... - Данная часть тела не повреждена... - Aucune blessure ici... - Brak obrażeń na tej części ciała... - Sin heridas en esta parte del cuerpo... - Ezen a testrészen nincs sérülés... - Žádné zranění na této části těla... - Nenhum ferimento nesta parte do corpo... - この身体は怪我をしていません・・・ - 이 부위에는 부상이 없습니다... - 此身体部位没有受伤 - 此身體部位沒有受傷 - - - Litter Simulation Detail - Detale zużytych medykamentów - Detalle de simulación de basura - Количество мусора от медицины - Dettagli Simulazione Rifiuti - Niveau de simulation des détritus - Abfall-Detaillevel - Hulladékszimuláció részletessége - Detalhe da simulação de sujeira - Počet zobrazených předmětů po použití zdravotnického materiálu - 医療廃棄物シミュレーション詳細度 - 의료폐기물 재현 상세도 - 模拟医疗废弃物细节 - 醫療廢棄物模擬細節 - - - Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. - Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. - Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. - Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента. - Il numero di rifiuti che verranno creati localmente. La creazione di troppi rifiuti in aree locali potrebbe causare lag e calo di FPS. Questo è un settaggio lato client. - Le niveau de simulation des détritus règle la quantité de déchets qui vont être créés localement chez le client. Des quantitées excessive chez certains clients peuvent causer des chutes de FPS, c'est donc une option client uniquement. - Die Einstellung für das Abfall-Detaillevel stellt die Menge des lokal angezeigten medizinischen Abfalls ein. Zuviel Abfall kann FPS-Einbrüche erzeugen, weswegen diese Einstellung nur clientseitig ist. - A hulladékszimuláció részletessége megszabja a kliens által megjelenített hulladékobjektumok mennyiségét. Súlyos mennyiségek izolált területeken alacsony FPS-t okozhatnak, így ez egy kliensoldali beállítás. - O nível de detalhe de sujeira determina o número de itens que irão aparecer no cliente. Quantidades excessivas em áreas locais podem aumentar o lag do FPS, então esta é uma opção somente para o cliente. - Počet zobrazených předmětů po použití zdravotnického materiálu ovlivňuje počet objektů, které budou zobrazeny klientovi v místě použití zdravotnického materiálu. Vyšší množství objektů může způsobovat poklesy FPS a proto je toto nastavení čistě na klientovi. - 医療廃棄物シミュレーションは各クライアントでローカルに作成される、医療廃棄物の詳細度を決定できます。ローカルで多くのアイテムがあると FPS の低下を引き起こすため、クライアント側のみの設定です。 - 의료폐기물 재현 상세도의 경우 얼마나 많은 수의 폐기물이 클라이언트 주변에 생성되는지를 정합니다. 매우 많은 수의 지역은 프레임드랍을 유발할 수 있습니다, 고로 이는 클라이언트 전용 설정입니다. - 设定医疗废弃物的最大产生数量,过多的数量会降低FPS,因此这由用户端性能来设定。 - 設定醫療廢棄物的最大產生數量,過多的數量會導致畫面更新率延遲,因此這由用戶端來設定 - - - Inject Adenosine - Adenosin injizieren - Inyectar Adenosina - Wstrzyknij adenozynę - Adénosine - Inietta andenosina - Aplikovat adenosine - Injetar adenosina - Ввести аденозин - アデノシンを投与 - 아데노신 주사 - 注射腺苷 - 注射腺苷 - - - Inject Atropine - Atropin injizieren - Inyectar Atropina - Aplikovat atropin - Wstrzyknij atropinę - Atropine - Ввести атропин - Atropin beadása - Inietta atropina - Injetar atropina - アトロピンを投与 - 아트로핀 주사 - 注射阿托品 - 注射阿托品 - - - Inject Epinephrine - Epinephrine injizieren - Inyectar Epinefrina - Wstrzyknij adrenalinę - Aplikovat adrenalin - Épinéphrine - Ввести адреналин - Epinefrin beadása - Injetar epinefrina - Inietta adrenalina - アドレナリンを投与 - 에피네프린 주사 - 注射肾上腺素 - 注射腎上腺素 - - - Inject Morphine - Morphin injizieren - Inyectar Morfina - Wstrzyknij morfinę - Aplikovat morfin - Ввести морфин - Morphine - Morfium beadása - Injetar morfina - Inietta morfina - モルヒネを投与 - 모르핀 주사 - 注射吗啡 - 注射嗎啡 - - - Transfuse Blood - Bluttransfusion - Transfundir sangre - Przetocz krew - Transfúze krve - Перелить кровь - Transfuser (sang) - Infúzió (vér) - Transfundir sangue - Trasfusione di sangue - 輸血する - 혈액 수혈 - 输血液 - 輸血液 - - - Transfuse Plasma - Plasmatransfusion - Transfundir plasma - Transfúze plazmy - Przetocz osocze - Transfuser (plasma) - Перелить плазму - Infúzió (vérplazma) - Trasfusione di plasma - Transfundir plasma - 血しょうを投与 - 혈장 수혈 - 输血浆 - 輸血漿 - - - Transfuse Saline - Salzlösungstransfusion - Transfundir salino - Transfúze fyziologického roztoku - Przetocz sól fizjologiczną - Transfuser (saline) - Перелить физраствор - Infúzió (sós víz) - Trasfusione di soluzione salina - Transfundir soro - 生理食塩水を投与 - 생리식염수 수혈 - 注射生理食盐水 - 注射生理食鹽水 - - - Apply Tourniquet - Tourniquet anwenden - Aplicar torniquete - Aplikovat škrtidlo - Załóż stazę - Poser garrot - Наложить жгут - Applica laccio emostatico - Aplicar torniquete - Érszorító alkalmazása - 止血帯を巻く - 지혈대 적용 - 使用军用止血带 - 使用軍用止血帶 - - - Bandage - Verbinden - Venda - Bandażuj - Obvázat - Panser - Benda - Kötözés - Atadura - Перевязать - 包帯 - 붕대 - 绷带 - 繃帶 - - - Bandage Head - Kopf verbinden - Vendar la cabeza - Bandażuj głowę - Obvázat hlavu - Перевязать голову - Panser Tête - Fej kötözése - Atar cabeça - Benda la testa - 包帯を頭へ - 머리에 붕대감기 - 绷带包扎 头部 - 繃帶包紮 頭部 - - - Bandage Torso - Torso verbinden - Vendar el torso - Bandażuj tors - Obvázat hruď - Перевязать торс - Panser Torse - Testtörzs kötözése - Atar tronco - Benda il torso - 包帯を胴体へ - 몸통에 붕대감기 - 绷带包扎 身体 - 繃帶包紮 身體 - - - Bandage Left Arm - Linken Arm verbinden - Vendar el brazo izquierdo - Bandażuj lewe ramię - Obvázat levou ruku - Перевязать левую руку - Panser Bras Gauche - Bal kar kötözése - Atar braço esquerdo - Benda il braccio sinistro - 包帯を左腕に - 왼팔에 붕대감기 - 绷带包扎 左手 - 繃帶包紮 左手 - - - Bandage Right Arm - Rechten Arm verbinden - Vendar el brazo derecho - Bandażuj prawe ramię - Obvázat pravou ruku - Перевязать правую руку - Panser Bras Droit - Jobb kar kötözése - Atar braço direito - Benda il braccio destro - 包帯を右腕に - 오른팔에 붕대감기 - 绷带包扎 右手 - 繃帶包紮 右手 - - - Bandage Left Leg - Linkes Bein verbinden - Vendar la pierna izquierda - Bandażuj lewą nogę - Obvázat levou nohu - Перевязать левую ногу - Panser Jambe Gauche - Bal láb kötözése - Atar perna esquerda - Benda la gamba sinistra - 包帯を左足へ - 왼쪽 다리에 붕대감기 - 绷带包扎 左脚 - 繃帶包紮 左腳 - - - Bandage Right Leg - Rechtes Bein verbinden - Vendar la pierna derecha - Bandażuj prawą nogę - Obvázat pravou nohu - Перевязать правую ногу - Panser Jambe Droite - Jobb láb kötözése - Atar perna direita - Benda la gamba destra - 包帯を右足へ - 오른쪽 다리에 붕대감기 - 绷带包扎 右脚 - 繃帶包紮 右腳 - - - Injecting Morphine... - Morphin injizieren... - Inyectando Morfina... - Wstrzykiwanie morfiny... - Aplikuji morfin... - Введение морфина... - Injection (morphine)... - Morfium beadása... - Injetando morfina... - Inietto la morfina... - モルヒネを投与しています・・・ - 모르핀 주사중... - 吗啡注射中... - 嗎啡注射中... - - - Injecting Epinephrine... - Epinephrin injizieren... - Inyectando Epinefrina... - Wstrzykiwanie adrenaliny... - Aplikuji adrenalin... - Введение адреналина... - Injection (épinéphrine)... - Epinefrin beadása... - Injetando epinefrina... - Inietto l'adrenalina... - アドレナリンを投与しています・・・ - 에피네프린 주사중... - 肾上腺素注射中... - 腎上腺素注射中... - - - Injecting Adenosine... - Adenosin injizieren... - Inyectando Adenosina... - Wstrzykiwanie adenozyny... - Injection (adénosine)... - Inietto l'andenosina - Aplikuji adenosine... - Injetando adenosina... - Введение аденозина... - アドネシンを投与しています・・・ - 아데노신 주사중... - 腺苷注射中... - 腺苷注射中... - - - Injecting Atropine... - Atropin injizieren... - Inyectando Atropina... - Aplikuji atropin... - Wstrzykiwanie atropiny... - Injection (atropine)... - Введение атропина... - Atropin beadása... - Inietto l'atropina... - Injetando atropina - アトロピンを投与しています・・・ - 아트리핀 주사중... - 阿托品注射中 ... - 阿托品注射中 ... - - - Transfusing Blood... - Bluttransfusion... - Transfusión de sangre... - Przetaczanie krwi... - Probíhá transfúze krve... - Переливание крови... - Transfusion (sang)... - Infúzió vérrel... - Transfundindo sangue... - Effettuo la trasfusione di sangue... - 輸血しています・・・ - 혈액 수혈중... - 输血液中 ... - 輸血液中 ... - - - Transfusing Saline... - Salzlösungtransfusion... - Transfusión de salino... - Probíha transfúze fyziologického roztoku... - Przetaczanie soli fizjologicznej... - Transfusion (solution saline)... - Переливание физраствора... - Infúzió sós vizzel... - Effettuo la rasfusione di soluzione salina - Transfundindo soro... - 生理食塩水を投与しています・・・ - 생리식염수 수혈중... - 施打生理食盐水中 ... - 施打生理食鹽水中 ... - - - Transfusing Plasma... - Plasmatransfusion... - Transfusión de plasma... - Probíha transfúze plazmy... - Przetaczanie osocza... - Transfusion (plasma)... - Переливание плазмы... - Infúzió vérplazmával... - Effettuo la trasfusione di plasma... - Transfundindo plasma... - 血しょうを投与しています・・・ - 혈장 수혈중... - 输血浆中 ... - 輸血漿中 ... - - - Bandaging... - Verbinden... - Vendando... - Bandażowanie... - Obvazuji... - Pansement... - Sto bendando... - Bekötözés... - Atando... - Перевязывание... - 包帯を巻いています・・・ - 붕대감는중... - 绷带包扎中 ... - 繃帶包紮中 ... - - - Applying Tourniquet... - Setze Tourniquet an... - Aplicando torniquete... - Aplikuji škrtidlo... - Zakładanie stazy... - Pose du garrot... - Наложение жгута... - Érszorító felhelyezése... - Sto applicando il laccio emostatico... - Applicando torniquete - 止血帯を巻いています・・・ - 지혈대 적용중... - 使用军用止血带中 ... - 使用軍用止血帶中 ... - - - Medical - Lékařské - Médical - Sanitäter - Medico - Medyczne - Médico - Медик - Médico - Orvosi - 治療 - 치료 - 医疗 - 醫療 - - - Field Dressing - Wundverband - Compresa de campaña - Бинтовая повязка - Obinadlo - Bandaż jałowy - Pansement individuel - Zárókötszer - Bendaggio rapido - Curativo de campo - 緊急圧迫包帯 - 필드 드레싱 - 基础绷带 - 基礎繃帶 - - - Packing Bandage - Mullbinde - Vendaje compresivo - Компресионный пакет - Bandaż uciskowy - Nyomókötszer - Bendaggio compressivo - Bande extensible - Atadura de compressão - Obvaz Tlakový - 弾性包帯 - 거즈 붕대 - 包扎绷带 - 包紮繃帶 - - - Elastic Bandage - Elastischer Verband - Vendaje elástico - Давящая повязка - Obavaz Elastický - Bandaż elastyczny - Bande compressive - Rögzitő kötszer - Bendaggio elastico - Atadura elástica - 伸縮包帯 - 압박 붕대 - 弹性绷带 - 彈性繃帶 - - - QuikClot - QuikClot - QuikClot - QuikClot - Opatrunek QuikClot - QuikClot - Bandage hémostatique - QuikClot - QuikClot (polvere emostatica) - QuikClot (Agente homeostático) - クイッククロット - 퀵 클롯 - 止血粉 - 止血粉 - - - Check Pulse - Puls überprüfen - Comprobar pulso - Проверить пульс - Zkontrolovat puls - Sprawdź tętno - Prendre le pouls - Pulzus ellenőrzése - Controlla il polso - Checar pulso - 心拍数をはかる - 맥박 확인 - 检查脉搏 - 檢查脈搏 - - - Check Blood Pressure - Blutdruck überprüfen - Comprobar presión arterial - Проверить давление - Zkontrolovat krevní tlak - Sprawdź ciśnienie krwi - Prendre la tension - Vérnyomás megmérése - Controlla pressionsa sanguigna - Chegar pressão sanguínea - 血圧をはかる - 혈압 확인 - 检查血压 - 檢查血壓 - - - Triage Card - Triagekarte - Tarjeta de clasificación - Медкарта - Karta segregacyjna - Štítek - Fiche de triage - Orvosi lap - Triage Card - Cartão de triagem - トリアージ カード - 부상자 분류 카드 - 检伤分类卡 - 檢傷分類卡 - - - No entries on this triage card. - Keine Einträge auf der Triagekarte - Nessuna voce sulla Triage Card - Нет записей. - Fiche vide - Brak wpisów w tej karcie segregacyjnej. - Sin entradas en esta tarjeta de clasificación. - Ez az orvosi lap nem tartalmaz bejegyzést. - Žádné záznamy na tomto štítku - Nenhuma entrada neste cartão de triagem. - トリアージ カードには何もありません。 - 부상자 분류 카드에 쓰여있는것이 없습니다. - 此检伤分类卡上没有任何资料 - 此檢傷分類卡上沒有任何資料 - - - Tourniquet - Tourniquet - Torniquete - Жгут - Škrtidlo - Staza - Garrot - Érszorító - Laccio emostatico - Torniquete - 止血帯 - 지혈대 - 军用止血带 - 軍用止血帶 - - - Remove Tourniquet - Tourniquet entfernen - Quitar torniquete - Снять жгут - Sundat škrtidlo - Zdejmij stazę - Enlever garrot - Érszorító leszedése - Rimuovi laccio emostatico - Remover torniquete - 止血帯をはずす - 지혈대 제거 - 移除军用止血带 - 移除軍用止血帶 - - - Diagnose - Diagnose - Diagnosi - Диагностика - Diagnostiquer - Diagnoza - Diagnosticar - Diagnosztizálás - Diagnóza - Diagnosticar - 診断する - 진단 - 诊断 - 診斷 - - - Diagnosing... - Diagnostizieren... - Diagnosi in corso... - Диагностика... - Diagnostic en cours - Diagnozowanie... - Diagnosticando... - Diagnózis folyamatban... - Diagnostika... - Diagnosticando... - 診断しています・・・ - 진단중... - 诊断中... - 診斷中... - - - CPR - HLW - RCP - Сердечно-лёгочная реанимация - RCP - RKO - RCP - Újraélesztés - CPR - SBV - 心肺蘇生 - 심폐소생술 - 心肺复苏术 - 心肺復甦術 - - - Performing CPR... - HLW durchführen... - Eseguendo RCP... - Сердечно-лёгочная реанимация... - RCP en cours - Przeprowadzanie RKO... - Realizando RCP... - Újraélesztés folyamatban... - Provádím CPR... - Realizando o SBV... - 心肺蘇生をしています・・・ - 심폐소생중... - 进行心肺复苏术中... - 進行心肺復甦術中... - - - Give Blood IV (1000ml) - Bluttransfusion IV (1000ml) - Dar Sangre IV (1000ml) - Перелить пакет крови (1000 мл) - Podaj krew IV (1000ml) - Sang en IV (1000ml) - Podat krev. transfúzi (1000ml) - Vér adása intravénásan (1000ml) - Effettua trasfusione sangue EV (1˙000ml) - Administrar sangue IV (1000ml) - 血液 IV (1000ml) をあたえる - IV 혈액 수혈 (1000ml) - 输血液 (1000ml) - 輸血液 (1000ml) - - - Give Blood IV (500ml) - Bluttransfusion IV (500ml) - Dar Sangre IV (500ml) - Перелить пакет крови (500 мл) - Podaj krew IV (500ml) - Sang en IV (500ml) - Podat krev. transfúzi (500ml) - Vér adása intravénásan (500ml) - Effettua trasfusione sangue EV (500ml) - Administrar sangue IV (500ml) - 血液 IV (500ml) をあたえる - IV 혈액 수혈 (500ml) - 输血液 (500ml) - 輸血液 (500ml) - - - Give Blood IV (250ml) - Bluttransfusion IV (250ml) - Dar Sangre IV (250ml) - Перелить пакет крови (250 мл) - Podaj krew IV (250ml) - Sang en IV (250ml) - Podat krev. transfúzi (250ml) - Vér adása intravénásan (250ml) - Effettua trasfusione sangue EV (250ml) - Administrar sangue IV (250ml) - 血液 IV (250ml) をあたえる - IV 혈액 수혈 (250ml) - 输血液 (250ml) - 輸血液 (250ml) - - - Give Plasma IV (1000ml) - Plasmatransfusion IV (1000ml) - Dar Plasma IV (1000ml) - Перелить пакет плазмы (1000 мл) - Podaj osocze IV (1000ml) - Plasma en IV (1000ml) - Podat plazmu (1000ml) - Vérplazma adása intravénásan (1000ml) - Effettua trasfusione plasma EV (1˙000ml) - Administrar plasma IV (1000ml) - 血しょう IV (1000ml) をあたえる - IV 혈장 수혈 (1000ml) - 输血浆 (1000ml) - 輸血漿 (1000ml) - - - Give Plasma IV (500ml) - Plasmatransfusion IV (500ml) - Dar Plasma IV (500ml) - Перелить пакет плазмы (500 мл) - Podaj osocze IV (500ml) - Plasma en IV (500ml) - Podat plazmu (500ml) - Vérplazma adása intravénásan (500ml) - Effettua trasfusione plasma EV (500ml) - Administrar plasma IV (500ml) - 血しょう IV (500ml) をあたえる - IV 혈장 수혈 (500ml) - 输血浆 (500ml) - 輸血漿 (500ml) - - - Give Plasma IV (250ml) - Plasmatransfusion IV (250ml) - Dar Plasma IV (250ml) - Перелить пакет плазмы (250 мл) - Podaj osocze IV (250ml) - Plasma en IV (250ml) - Podat plazmu (250ml) - Vérplazma adása intravénásan (250ml) - Effettua trasfusione plasma EV (250ml) - Administrar plasma IV (250ml) - 血しょう IV (250ml) をあたえる - IV 혈장 수혈 (250ml) - 输血浆 (250ml) - 輸血漿 (250ml) - - - Give Saline IV (1000ml) - Kochsalzlösung IV (1000ml) - Dar Salino IV (1000ml) - Перелить пакет физраствора (1000 мл) - Podaj sól fizjologiczną IV (1000ml) - Solution saline en IV (1000ml) - Podaz fyz. roztok (1000ml) - Sós víz adása intravénásan (1000ml) - Effettua trasfusione salina EV (1˙000ml) - Administrar soro IV (1000ml) - 生理食塩水 IV (1000ml) をあたえる - IV 생리식염수 수혈 (1000ml) - 注射生理食盐水 (1000ml) - 注射生理食鹽水 (1000ml) - - - Give Saline IV (500ml) - Kochsalzlösung IV (500ml) - Dar Salino IV (500ml) - Перелить пакет физраствора (500 мл) - Podaj sól fizjologiczną IV (500ml) - Solution saline en IV (500ml) - Podaz fyz. roztok (500ml) - Sós víz adása intravénásan (500ml) - Effettua trasfusione salina EV (500ml) - Administrar soro IV (500ml) - 生理食塩水 IV (500ml) をあたえる - IV 생리식염수 수혈 (500ml) - 注射生理食盐水 (500ml) - 注射生理食鹽水 (500ml) - - - Give Saline IV (250ml) - Kochsalzlösung IV (250ml) - Dar Salino IV (250ml) - Перелить пакет физраствора (250 мл) - Podaj sól fizjologiczną IV (250ml) - Solution saline en IV (250ml) - Podaz fyz. roztok (250ml) - Sós víz adása intravénásan (250ml) - Effettua trasfusione salina EV (250ml) - Administrar soro IV (250ml) - 生理食塩水 IV (250ml) をあたえる - IV 생리식염수 수혈 (250ml) - 注射生理食盐水 (250ml) - 注射生理食鹽水 (250ml) - - - Minor - Gering - Menor - Несрочная помощь - Normalny - Traitement en attente - Minimální - Enyhe - Minore - Leve - 保留群 - 경미 - 轻微 - 輕微 - - - Delayed - Retrasado - Срочная помощь - Opóźniony - Traitement urgent - Verzögert - Odložitelný - Késleltetett - Differito - Atrasado - 待機的治療群 - 늦어짐 - 延后 - 延後 - - - Immediate - Inmediato - Неотложная помощь - Natychmiastowy - Traitement immédiat - Sofort - Okamžitý - Azonnali - Immediata - Imediato - 再優先治療群 - 긴급 - 紧急 - 緊急 - - - Deceased - Fallecido - Труп - Nie żyje - Décédé - Verstorben - Mrtvý - Elhalálozott - Deceduto - Falecido - 死亡群 - 사망 - 死亡 - 死亡 - - - None - Ninguno - Отсутствует - Brak - Pas de fiche - Keine - Nic - Semmi - Nessuna - Nenhum - なし - 없음 - 未分类 - 未分類 - - - Normal breathing - Дыхание в норме - Respiración normal - Respiration normale - Normalny oddech - Normale Atmung - Dýchá normálně - Normális légzés - Respiro normale - Respiração normal - 通常の呼吸 - 정상 호흡 - 呼吸正常 - 呼吸正常 - - - No breathing - Keine Atmung - Дыхание отсутствует - No respira - Pas de respiration - Brak oddechu - Nedýchá - Nincs légzés - Mancanza di respiro - Não respira - 息をしていません - 호흡 불가 - 没有呼吸 - 沒有呼吸 - - - Difficult breathing - Дыхание затруднено - Dificultad para respirar - Difficulté respiratoire - Trudności z oddychaniem - Schwere Atmung - Dýchá s obtížemi - Nehéz légzés - Difficoltà a respirare - Dificuldade para respirar - 呼吸が苦しそうです - 호흡 곤란 - 呼吸困难 - 呼吸困難 - - - Almost no breathing - Beinahe keine Atmung - Дыхание очень слабое - Casi sin respiración - Respiration faible - Prawie brak oddechu - Skoro nedýchá - Alig van légzés - Respira a fatica - Quase não respira - ほとんど呼吸をしていません - 호흡이 없음 - 快要没呼吸 - 快要沒呼吸 - - - Bleeding - Blutet - Кровотечение - Sangrando - Saignement - Krwawienie zewnętrzne - Krvácí - Vérzik - Sanguinando - Sangrando - 出血しています - 출혈 - 流血中 - 流血中 - - - In pain - Hat Schmerzen - Испытывает боль - Con dolor - Douleur moyenne - W bólu - V bolestech - Fájdalom alatt - Con dolore - Com dor - 痛みがあります - 고통 - 疼痛中 - 疼痛中 - - - Lost a lot of Blood - Hat eine große Menge Blut verloren - Большая кровопотеря - Mucha sangre perdida - A perdu beaucoup de sang - Stracił dużo krwi - Ztratil hodně krve - Sok vért vesztett - Ha perso parecchio sangue - Perdeu muito sangue - 大量失血しています - 大量失血中 - 大量失血中 - 혈액 부족 - - - Tourniquet [CAT] - Tourniquet [CAT] - Жгут - Torniquete [CAT] - Garrot [CAT] - Staza [typ. CAT] - Škrtidlo [CAT] - Érszorító [CAT] - Laccio emostatico [CAT] - Torniquete [CAT] - 止血帯 [CAT] - 지혈대 [CAT] - 军用止血带 - 軍用止血帶 - - - Receiving IV [%1ml] - Erhalte IV [%1ml] - Recibiendo IV [%1ml] - Принимается переливание [%1 мл] - Otrzymywanie IV [pozostało %1ml] - Transfusion : [%1ml] - Přijímání transfúze [%1ml] - Infúzióra kötve [%1ml] - Ricevendo EV [%1ml] - Recebendo IV [%1ml] - IV で [%1ml] 投与されています - 接收静脉注射液中 [%1ml] - 接收靜脈注射液中 [%1ml] - IV처리 [%1ml] 수혈중 - - - Bandage (Basic) - Bandage (Einfach) - Повязка (обычная) - Vendaje (Básico) - Pansement adhésif - Bandaż (jałowy) - Obvaz (Standartní) - Kötszer (Általános) - Bendaggio (base) - Atadura (Básica) - 包帯 (緊急圧迫) - 붕대 (기본) - 基础绷带 - 基礎繃帶 - - - Used to cover a wound - Для перевязки ран - Utilizado para cubrir una herida - Utilisé pour couvrir une blessure - Używany w celu przykrycia i ochrony miejsca zranienia. Najczęściej stosowany bandaż na otarcia i draśnięcia. - Verwendet um Wunden abzudecken - Sebesülések befedésére alkalmas - Usato per coprire una ferita - Usado para cobrir um ferimento - Slouží k překrytí poranění - 傷口をおおう - 상처를 덮을때 씁니다 - 用于覆盖伤口 - 用於覆蓋傷口 - - - A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. - Ein Verband, der aus einem besonderen Material besteht um die Wunde zu schützen, nachdem die Blutung gestoppt wurde. - Повязка, накладываемая поверх раны после остановки кровотечения. - Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar. - Pansement utilisé pour couvrir une blessure lorsque le saignement a été stoppé. - Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. - Egy különleges anyagú kötszer sebek betakarására, amelyet a vérzés elállítása után helyeznek fel. - Una benda apposita, utilizzata per coprire una ferita, la quale viene applicata su di essa una volta fermata l'emorragia. - Um curativo, material específico usado para cobrir um ferimento assim que o sangramento é estancando. - Obvaz je vhodným způsobem upravený sterilní materiál, určený k překrytí rány, případně k fixaci poranění. - 緊急圧迫包帯は傷口を血液凝固剤でおおうようにできていて、つかうと出血の原因を取りさります。 - 드레싱, 출혈을 막고서 상처를 덮기위해 쓰는 물건입니다. - 用于覆盖伤口以防止出血,透过敷料的止血剂来让出血慢慢停止。 - 用於覆蓋傷口以防止出血,透過敷料的止血劑來讓出血慢慢停止 - - - Packing Bandage - Mullbinde - Тампонирующая повязка - Vendaje compresivo - Bande extensible - Bandaż (uciskowy) - Nyomókötszer - Bendaggio compressivo - Atadura de compressão - Obvaz (Tlakový) - 弾性包帯 - 거즈 붕대 - 包扎绷带 - 包紮繃帶 - - - Used to pack medium to large wounds and stem the bleeding - Wird verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen - Для тампонирования ран среднего и большого размера и остановки кровотечения. - Se utiliza para vendar heridas medianas o grandes y detener el sangrado - Utilisé pour couvrir des blessures moyennes et grandes, ralentit le saignement. - Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. Dobrze radzi sobie z tamowaniem ran płatowych oraz postrzałowych. - Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer - Usato su ferite medie o larghe per fermare emorragie. - Usado para atar ferimentos médios ou grandes e estancar sangramentos. - Používá se k zastavení středních až silnějších krvácení - 弾性包帯は粘着フィルム状で、普通から大きめなケガにつかい止血します。 - 중형 또는 대형 상처를 채우고 출혈을 막기위해 쓰입니다 - 用于包扎中到大型伤口,并防止出血 - 用於包紮中到大型傷口,並防止出血 - - - A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. - Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжёлых сочетанных ранениях возможно тампонирование раны. - Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. - Bandage servant à recouvrir les blessures pour arrêter les hémoragies et faciliter la guérison. Recouvrir une blessure est optionnel dans le cas de blessures polytraumatiques. - Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. - Egy kötszerfajta, melyet a sebek nyomására használnak a vérzés elállítása és sebgyógyulás érdekében. A nyomókötés egy lehetőség nagyobb polytraumatikus sérülések esetén. - Un bendaggio usato per coprire la ferita, fermare il sanguinamento e facilitarne la guarigione. Questa tecnica è opzionale su ferite multiple. - Ein Verband, um die Wunde abzudecken und die Wundheilung zu fördern. Wunden abdecken ist eine Option bei größeren Polytraumen - Atadura usada para atar o ferimento, estancando o sangramento e facilitando a cicatrização. Atar feridas é uma opção em ferimentos de politrauma grandes. - Tlakový obvaz se skládá se ze sterilní krycí vrstvy, na kterou je přiložena silná vrstva savého materiálu stlačující cévu v ráně a která je přitlačována k ráně a připevněna obinadlem. Slouží k zastavení silnějších krvácení. - 包帯をつかうと出血を防ぎ治療を促進させます。また大きめな多発性外傷にたいしても使えます。 - 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 채우는것도 한 가지 방법입니다. - 用于包扎中到大型伤口,并防止出血,为在大型多处性伤口的选项之一! - 用於包紮中到大型傷口,並防止出血,為在大型多處性傷口的選項之一! - - - Bandage (Elastic) - Bandage (Elastisch) - Повязка (давящая) - Vendaje (Elástico) - Bande compressive - Bandaż (elastyczny) - Obvaz (Elastický) - Rögzító kötszer - Benda (elastica) - Atadura (Elástica) - 包帯 (伸縮) - 붕대 (압박) - 弹性绷带 - 彈性繃帶 - - - Bandage kit, Elastic - Elastische Binde (Kompressionsbinde) - Давящая повязка - Kit de vendaje (Elástico) - Bande compressive - Bandaż elastyczny służy do opatrywania ran ciętych oraz kłutych. Dobrze radzi sobie również ze zgniecieniami tkanek miękkich oraz rozerwaniami powierzchni skóry. - Rugalmas kötszercsomag, "rögzítő" - Kit di bendaggio, elastico - Kit de ataduras elásticas - Sada obvazů, Elastická - 包帯キット (伸縮) - 붕대, 압박 - 弹性绷带 - 彈性繃帶 - - - Allows an even compression and extra support to the injured area. - Ermöglicht eine gleichmäßige Kompression und zusätzliche Unterstützung für den verletzten Bereich. - Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку повреждённой области - Ce bandage peut être utilisé pour compresser la plaie afin de ralentir le saignement et assurer la tenue du bandage lors de mouvement. - Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. - Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada - Egyenletes nyomást és támogatást biztosít a sebesült felületnek. - Permette di comprimere e aiutare la zone ferita. - Esta atadura pode ser utilizada para comprimir o ferimento e diminuir o sangramento e garantir que não se abra em movimento. - Hodí se k fixačním účelům a to i v oblastech kloubů. - 負傷部分へ最大の対応と止血を続けられます。 - 부상 부위를 골고루 압박해주면서 동시에 고정시켜 줍니다. - 可对伤口持续压迫并固定以防止伤口情况变严重 - 可對傷口持續壓迫並固定以防止傷口情況變嚴重 - - - Tourniquet (CAT) - Tourniquet [CAT] - Жгут - Torniquete (CAT) - Garrot (CAT) - Staza (typ. CAT) - Škrtidlo (CAT) - Érszorító (CAT) - Laccio emostatico (CAT) - Torniquete (CAT) - 止血帯 (CAT) - 지혈대 [CAT] - 军用止血带 - 軍用止血帶 - - - Slows down blood loss when bleeding - Замедляет кровопотерю при кровотечении - Reduce la velocidad de pérdida de sangre - Ralentit l'hémorragie - Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. Nie może być noszony zbyt długo ze względu na narastający ból z kończyny. - Verringert den Blutverlust - Lelassítja a vérvesztést vérzés esetén - Rallenta la perdita di sangue in caso di sanguinamento - Reduz a velocidade da perda de sangue - Zpomaluje ztráty krve při krvácení - 出血しているときに、失血量をおさえます。 - 출혈 시 혈액손실을 늦춰줍니다 - 减缓失血的速度 - 減緩失血的速度 - - - A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. - Жгут используется для прижатия сосудов к костным выступам, которое приводит к остановке или значительному уменьшению кровотечения - Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre - Un dispositif permettant de compresser les artères et veines afin de ralentir l'hémorragie. - Opaska uciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym krwawieniem tętniczym lub żylnym. - Ein Hilfsmittel, das Druck auf Venen und Arterien ausübt und so den Blutfluss verringert. - Egy szűkítőeszköz, mely a vénás és artériás nyomás keringés helyi összenyomására szolgál, ezzel lelassítva vagy megállítva az adott területen a vérkeringést. Ez csökkenti a vérvesztés mértékét. - Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. - Aparelho que comprime as artérias e veias para diminuir a perda de sangue. - Zařízení používané ke stlačení venózního a arteriálního oběhu. V důsledku dochází ke zpomalení toku krve a tedy i snížení ztrát krve. - 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れをおそくし、失血を防ぎます。 - 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. - 用于压迫静脉与动脉的血液流动,达到减缓失血速度的目的。 - 用於壓迫靜脈與動脈的血液流動,達到減緩失血速度的目的 - - - Morphine autoinjector - Morphium-Autoinjektor - Морфин в пневмошприце - Morfina auto-inyectable - Auto-injecteur de morphine - Autostrzykawka z morfiną - Auto-morfin - Morfium autoinjektor - Autoiniettore di morfina - Auto-injetor de morfina - モルヒネ注射器 - 모르핀 자동주사기 - 吗啡自动注射器 - 嗎啡自動注射器 - - - Used to combat moderate to severe pain experiences - Wird verwendet um moderate bis starke Schmerzen zu lindern. - Для снятия средних и сильных болевых ощущений - Usado para combatir los estados dolorosos de moderados a severos - Utilisé pour réduire les douleurs modérées à sévères. - Morfina. Ma silne działanie przeciwbólowe. Powoduje spowolnienie tętna oraz rozrzedzenie krwi, zwiększając tym samym ciśnienie tętnicze krwi. Działa przez ok. 15 minut. - Mérsékelttől erős fájdalomig, ellene alkalmazandó termék - Usato per combattere il dolore. - Usado para combater dores moderadas e severas - Slouží k tlumení středně těžkých a těžkých bolestí - 戦闘が収まったとき、痛みにたいしてつかいます。 - 심한 통증을 완화하는데 쓰입니다 - 减低中度至重度的疼痛感 - 減低中度至重度的疼痛感 - - - An analgesic used to combat moderate to severe pain experiences. - Обезболивающее для снятия средних и сильных болевых ощущений. - Analgésico usado para combatir los estados dolorosos de moderados a severos. - Un analgésique puissant servant à réduire les douleurs modérées à sévères. - Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. - Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln - Egy fájdalomcsillapító anyag, jellemzően mérsékelt vagy erős fájdalom esetén alkalmazandó. - Un analgesico usato per combattere il dolore. - Um analgésico usado para combater dores moderadas e fortes. - Analgetikum slouží k tlumení středně těžkých a těžkých bolestí - 戦闘が収まったとき、モルヒネを痛みにたいしてつかいます。 - 심한 통증을 완화하기 위해 쓰이는 진통제입니다. - 止痛药的一种,用于减低中度至重度的疼痛感。 - 止痛藥的一種,用於減低中度至重度的疼痛感 - - - Adenosine autoinjector - Adenosin-Autoinjektor - Asenosina auto-inyectable - Autostrzykawka z adenozyną - Auto-injecteur d'adénosine - Autoiniettore di adenosina - Auto-adenosine - Auto-injetor de adenosina - Аденозин в пневмошприце - アデノシン注射器 - 아데노신 자동주사기 - 腺苷自动注射器 - 腺苷自動注射器 - - - Used to counter effects of Epinephrine - Wird verwendet um die Symptome von Epiniphrin zu lindern - Utilizada para contrarrestar los effectos de la Epinefrina - Adenozyna. Stosowana do zwalczania efektów działania adrenaliny. - Utilisé pour contrer les effets de l'épinéphrine - Usato per contrastare l'effetto dell'epinefrina - Slouží jako protiváha Adrenalinu - Usado para combater os efeitos da epinefrina - Используется для купирования эффектов адреналина - アドレナリンの反対の効果としてつかいます。 - 에피네프린 대응책으로 쓰입니다 - 用来对付肾上腺素的影响 - 用來對付腎上腺素的影響 - - - A drug used to counter the effects of Epinephrine - Ein Medikament, das die Symptome von Epiniphrin bekämpft. - Medicamento usado para contrarrestar los efectos de la Epinefrina. - Organiczny związek chemiczny z grupy nukleozydów. Skuteczna w leczeniu częstoskurczu komorowego. Działa rozszerzająco na naczynia krwionośne. - Un composé utilisé pour contrer les effets de l'épinéphrine - Medicamento usato per contrastare l'effetto dell'epinefrina - Droga používaná k tlumení efektu Adrenalinu - Uma droga usada para combater os efeitos da epinefrina - Препарат используется для купирования эффектов адреналина - つかうと、アドレナリンと反対の効果がでます。 - 에피네프린에 대응용으로 쓰이는 약품 - 一种药物用于减低肾上腺素的效果 - 一種藥物用於減低腎上腺素的效果 - - - Atropine autoinjector - Атропин в пневмошприце - Atropina auto-inyectable - Auto-injecteur d'atropine - Autostrzykawka AtroPen - Atropin-Autoinjektor - Auto-atropine - Atropin autoinjektor - Autoiniettore di atropina - Auto-injetor de atropina - アトロピン注射器 - 아트로핀 자동주사기 - 阿托品自动注射器 - 阿托品自動注射器 - - - Used in NBC scenarios - Применяется для защиты от ОМП - Usado en escenarios NBQ - Utilisé en cas d'attaque CBRN - Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. - Verwendet bei ABC-Kontamination - NBK helyzetek esetén használandó - Usato in situazioni con gas nervino. - Usado em casos de ataque QBRN - Používá se v přítomnosti nervových plynů - 核・生物・化学兵器によ汚染環境下にてつかいます。 - 핵,생물,화학 상황에 쓰입니다 - 使用于核生化污染的情况 - 使用於核生化汙染的情況 - - - A drug used by the Military in NBC scenarios. - Препарат, используемый в войсках для защиты от оружия массового поражения. - Medicamento usado por militares en escenarios NBQ - Médicament utilisé par l'armée en cas d'attaque CBRN - Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC. - Ein Medikament, das vom Militär bei ABC-Kontamination verwendet wird. - Egy instabil alkaloid, NBK helyzetek esetén a katonai szervezetek veszik használatba. - E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. - Uma droga usada por militares em casos de ataque QBRN. - Atropin slouží jako protijed na otravu organofosfátovými insekticidy (diazinon) a nervovými plyny. - 核・生物・化学兵器がつかわれている条件下にてつかいます。 - 핵,생물,화학 상황에 쓰이는 군용 약품 - 军用神经解毒针,用来应付核生化污染的情况。 - 軍用神經解毒針,用來應付核生化汙染的情況 - - - Epinephrine autoinjector - Адреналин в пневмошприце - Epinefrina auto-inyectable - Auto-injecteur d'épinéphrine - Autostrzykawka EpiPen - Epiniphrin-Autoinjektor - Auto-adrenalin - Epinefrin autoinjektor - Autoiniettore di adrenalina - Auto-injetor de epinefrina - アドレナリン注射器 - 에피네프린 자동주사기 - 肾上腺素自动注射器 - 腎上腺素自動注射器 - - - Increase heart rate and counter effects given by allergic reactions - Стимулирует работу сердца и купирует аллергические реакции - Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas - Augmente la fréquence cadiaque et annule les effets d'une réaction anaphylactique - Adrenalina. Przyśpiesza tętno oraz zwiększa ciśnienie krwi a także przeciwdziała efektom wywołanym przez reakcje alergiczne. - Steigert die Herzfrequenz und bekämpft Symptome von allergischen Reaktionen. - Növeli a szívverést és ellenzi az allergiás reakciók hatásait - Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. - Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas - Zvyšuje srdeční frekvenci a chrání před alergickými reakcemi - 心拍数を増加させたり、アレルギー反応を収める効果もあります。 - 심박수를 높이며 알러지반응의 대응책입니다 - 增加心跳速率的一种药物 - 增加心跳速率的一種藥物 - - - A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. - Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшенной вероятностью благоприятного исхода. - Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos. - Medicament qui fonctionne sur le système nerveux sympathique créant une dilatation des bronches, augmente la fréquence cardiaque et annule les effets d'une réaction allergique (anaphylaxie). Utilisé lors d'arrêt cardio-respiratoire pour augmenter les chances de retrouver un pouls. - EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. - Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. - Ein Medikament, das die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen (Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. - Uma droga que trabalha dilatando os brônquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas (anáfilaticas). Usado em casos de parada cardíaca com poucas chances de recuperação. - Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. - Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. - 薬は気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります(アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにつかわれます。 - 기관지를 확장시키는 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과에 대응합니다(아나필락시스). 심폐가 정지하는 경우 호전이 되지않을때 사용합니다. - 俗称强心针,为一种支气管扩张药物,会增加心跳速率并减缓过敏反应(过敏性休克),在心跳骤停时有恢复心跳的效果! - 俗稱強心針,為一種支氣管擴張藥物,會增加心跳速率並減緩過敏反應(過敏性休克),在心跳驟停時有恢復心跳的效果! - - - Plasma IV (1000ml) - Плазма для в/в вливания (1000 мл) - Plasma IV (1000ml) - Plasma IV (1000ml) - Osocze IV (1000ml) - Plasma IV (1000ml) - Vérplazma-infúzió (1000ml) - Plasma EV (1000ml) - Plasma IV (1000ml) - Krevní plazma (1000ml) - 血しょう IV (1000ml) - 혈장 IV (250ml) - 血浆 (1000ml) - 血漿 (1000ml) - - - A volume-expanding blood supplement. - Дополнительный препарат, применяемый при возмещении объема крови. - Suplemento para expandir el volumen sanguíneo. - Supplément sanguin visant à remplacer les volumes perdus. - Składnik krwi, używany do zwiększenia jej objętości. - Egy térfogatnövelő vérkiegészítmény. - Aiuta ad aumentare il volume sanguigno. - Volumenerweiterungsmittel (künstliches Blutvolumen) - Suplemento para expandir o volume sanguíneo. - Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 - 혈액량을 늘리기위한 보조수단 입니다. - 可快速得到血液补充 - 可快速得到血液補充 - - - A volume-expanding blood supplement. - Дополнительный препарат, применяемый при возмещении объема крови. - Suplemento para expandir el volumen sanguíneo. - Supplément visant à remplacer le volume sanguin perdu et remplace les plaquettes. - Składnik krwi, używany do zwiększenia jej objętości. - Egy térfogatnövelő vérkiegészítmény. - Aiuta ad aumentare il volume sanguigno. - Volumenerweiterungsmittel (künstliches Blutvolumen) - Suplemento para expandir o volume sanguíneo. - Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 - 혈액량을 늘리기위한 보조수단 입니다. - 可快速得到血液补充 - 可快速得到血液補充 - - - Plasma IV (500ml) - Плазма для в/в вливания (500 мл) - Plasma IV (500ml) - Plasma IV (500ml) - Osocze IV (500ml) - Plasma IV (500ml) - Vérplazma-infúzió (500ml) - Plasma EV (500ml) - Plasma IV (500ml) - Krevní plazma (500ml) - 血しょう IV (500ml) - 혈장 IV (500ml) - 血浆 (500ml) - 血漿 (500ml) - - - Plasma IV (250ml) - Плазма для в/в вливания (250 мл) - Plasma IV (250ml) - Plasma (250ml) - Osocze IV (250ml) - Plasma IV (250ml) - Vérplazma-infúzió (250ml) - Plasma EV (250ml) - Plasma IV (250ml) - Krevní plazma (250ml) - 血しょう IV (250ml) - 혈장 IV (250ml) - 血浆 (250ml) - 血漿 (250ml) - - - Blood IV (1000ml) - Кровь для переливания (1000 мл) - Sangre IV (1000ml) - Culot sanguin IV (1000ml) - Krew IV (1000ml) - Blut IV (1000ml) - Vér-infúzió (1000ml) - Sangue EV (1000ml) - Sangue IV (1000ml) - Krevní transfúze (1000ml) - 血液 IV (1000ml) - 혈액 IV (1000ml) - 血液 (1000ml) - 血液 (1000ml) - - - Blood IV, for restoring a patients blood (keep cold) - Пакет крови для возмещения объёма потерянной крови (хранить в холодильнике) - Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) - Culot sanguin O-, utilisé seulement lors de perte sanguine majeure afin de remplacer le volume sanguin perdu. Habituellement utilisé lors du transport ou dans un établissement de soins. - Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych. - Vér-infúzió, intravénás bejuttatásra egy páciensnek (hidegen tárolandó) - Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue (conservare al fresco) - Blut IV, Bluthaushalt des Patienten wiederherstellen. (Kühl halten) - Sangue intravenoso, para restaurar o volume sanguíneo do paciente.(Manter frio) - Krevní transfuze pro doplnění pacientovi krve (skladujte v chladu) - 血液 IV は、患者へ血液を補給します。(要低温保存) - 혈액 IV, 환자에게 혈액을 공급합니다. (차갑게 할것) - 血液,用于补充伤者流失的血液 (需冷藏) - 血液,用於補充傷者流失的血液 (需冷藏) - - - O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. - Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. - Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. - Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. - Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. - Culot sanguin O- utilisé dans de rares et stricts cas pour compléter une perte de sang importante. Administré normalement lors d'un MEDEVAC. - O Negative Blutinfusion wird nur in seltenen Fällen verwendet, um den Bluthaushalt des Patienten zu ergänzen. Wird in der Regel wärend der Transportphase durchgeführt. - Sangue "O" de fator Rh negativo, utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento. - Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben. - 0 Rh negativní krev se používá v vzácných případech k doplnění pacientovy hladiny krve, obvykle při převozu zraněné osoby do nemocnice. - O 型への輸血はまれで厳格であり、通常は治療のための輸送段階で輸血をおこないます。 - O- 형 혈액 투여는 매우 엄격하고 드문 혈액보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. - O型负值注射用血液,在紧急情况时使用,用于补充伤者流失的血液。 - O型負值注射用血液,在緊急情況時使用,用於補充傷者流失的血液。 - - - Blood IV (500ml) - Кровь для переливания (500 мл) - Sangre IV (500ml) - Culot sanguin IV (500ml) - Krew IV (500ml) - Blut IV (500ml) - Vér-infúzió (500ml) - Sangue EV (500ml) - Sangue IV (500ml) - Krevní transfúze (500ml) - 血液 IV (500ml) - 혈액 IV (500ml) - 血液 (500ml) - 血液 (500ml) - - - Blood IV (250ml) - Кровь для переливания (250 мл) - Sangre IV (250ml) - Culot sanguin IV (250ml) - Krew IV (250ml) - Blut IV (250ml) - Vér-infúzió (250ml) - Sangue EV (250ml) - Sangue IV (250ml) - Krevní transfúze (250ml) - 血液 IV (250ml) - 혈액 IV (250ml) - 血液 (250ml) - 血液 (250ml) - - - Saline IV (1000ml) - Физраствор для в/в вливания (1000 мл) - Salino IV (1000ml) - Solution saline IV (1000ml) - Sól fizjologiczna IV (1000ml) - Kochsalzlösung (1000ml) - 0,9%-os sósvíz-infúzió (1000ml) - Soluzione salina EV (1˙000ml) - Soro IV (1000ml) - Fyziologický roztok (1000ml) - 生理食塩水 IV (1000ml) - 생리식염수 IV (1000ml) - 生理食盐水 (1000ml) - 生理食鹽水 (1000ml) - - - Saline IV, for restoring a patients blood - Пакет физраствора для возмещения объёма потерянной крови - Solución salina intravenosa, para restaurar el volumen sanguíneo - Solution saline, pour rétablir temporairement la tension artérielle - Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). - 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására - Soluzione salina, usata per ripristinare sangue nei pazienti. - Kochsalzlösung, ein medizinisches Volumenersatzmittel - Solução salina intravenosa, para restaurar o volume de sangue. - Fyziologický roztok se aplikuje intravenózně a slouží k obnově pacientovi krve - 生理食塩水 IV は、患者の血液量を補助します - 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 - 生理食盐水,用于恢复伤者血液 - 生理食鹽水,用於恢復傷者血液 - - - A medical volume-replenishing agent introduced into the blood system through an IV infusion. - Пакет физиологического раствора для возмещения объёма потерянной крови путем внутривенного вливания - Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. - Un remplacant temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse - Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). - Egy orvosi térfogat-helyreállító készítmény, melyet intravénás módon lehet a szervezetbe juttatni. - Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione EV. - Ein medizinisches Volumenersatzmittel, dass durch einen intravenösen Zugang in den Blutkreislauf verabreicht wird. - Uma reposição temporária para restaurar a pressão arterial perdida por perda de sangue. - Fyziologický roztok se využívá nejčastěji jako infuze při dehydrataci organismu. - 生理食塩水 IV を静脈へ投与し、血液量を増加させることができます。 - 혈류에 IV로 투여되는 의료 용적 대체 요법 - 利用静脉注射进入人体血液系统,帮助伤者血液恢复。 - 利用靜脈注射進入人體血液系統,幫助傷者血液恢復。 - - - Saline IV (500ml) - Физраствор для в/в вливания (500 мл) - Salino IV (500ml) - Solution saline IV (500ml) - Sól fizjologiczna IV (500ml) - Kochsalzlösung (500ml) - 0,9%-os sósvíz-infúzió (500ml) - Soluzione salina EV (500ml) - Soro IV (1000ml) - Fyziologický roztok (500ml) - 生理食塩水 IV (500ml) - 생리식염수 IV (500ml) - 生理食盐水 (500ml) - 生理食鹽水 (500ml) - - - Saline IV (250ml) - Физраствор для в/в вливания (250 мл) - Salino IV (250ml) - Solution saline IV (250ml) - Sól fizjologiczna IV (250ml) - Kochsalzlösung (250ml) - 0,9%-os sósvíz-infúzió (250ml) - Soluzione salina EV (250ml) - Soro IV (1000ml) - Fyziologický roztok (250ml) - 生理食塩水 IV (250ml) - 생리식염수 IV (250ml) - 生理食盐水 (250ml) - 生理食鹽水 (250ml) - - - Basic Field Dressing (QuikClot) - Первичный перевязочный пакет (QuikClot) - Vendaje básico (QuickClot) - Bandage basique (Hémostatique) - Opatrunek QuikClot ACS - Verbandpäckchen (QuikClot) - Általános zárókötszer (QuikClot) - Bendaggio emostatico (QuikClot) - Atadura básica (Coagulante) - Hemostatický obvaz (QuikClot) - 緊急圧迫止血包帯 (クイッククロット) - 필드 드레싱 (퀵 클롯) - 基本战地包扎 (止血粉) - 基本戰地包紮 (止血粉) - - - QuikClot bandage - Гемостатический пакет QuikClot - Vendaje QuikClot - Bandage hémostatique - Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. - Bandage mit Gerinnungsmittel - QuikClot kötszer - Bendaggio emostatico (QuikClot) - Atadura com agente coagulante - Hemostatický obvaz (QuikClot) - クイッククロット包帯 - 퀵 클롯 붕대 - 止血粉绷带 - 止血粉繃帶 - - - Hemostatic bandage with coagulant that stops bleeding. - Медицинский коагулянт для экстренной остановки кровотечения - Un bandage aidant à coaguler les saignements mineurs à moyens. - Proszkowy opatrunek adsorpcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. - Vendaje hemostático con coagulante que detiene el sangrado. - Verband mit Gerinnungsmittel, um starke Blutung zu behandeln. - Hemostatikus kötszer egy vérzésgátló anyaggal. - Bendaggio emostatico con coagulante che permette di arrestare perdite di sangue - Atadura homeostática com coagulante que controla hemorragias médias e grandes. - Hemostatický obvaz určený k zástavě krvácení - 血液凝固剤をふくむ包帯により、止血できます。 - 지혈시 사용하는 붕대로 혈액 응고제를 포함하고있습니다. - 包含止血粉成分的止血绷带,可用于止血。 - 包含止血粉成分的止血繃帶,可用於止血。 - - - Personal Aid Kit - Аптечка - Trousse sanitaire - Equipo de primeros auxilios - Apteczka osobista - Persönliches Erste-Hilfe-Set - Elsősegélycsomag - Pronto soccorso personale - Kit de Primeiros Socorros Pessoal - Osobní lékárnička (PAK) - 応急処置キット - 개인응급키트 - 个人急救包 - 個人急救包 - - - Includes various treatment kit needed for stitching or advanced treatment - Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. - Incluye material médico para tratamientos avanzados - Inclut du matériel medical pour les traitements délicats, tel les points de suture. - Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego. - Beinhaltet medizinisches Material für fortgeschrittene Behandlung und zum Nähen. - Változatos segédfelszereléseket tartalmaz sebvarráshoz és haladó elsősegélynyújtáshoz - Include vario materiale medico per trattamenti avanzati. - Inclui vários tratamentos materiais para costura e tratamento avançado - Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných - 縫合や高度な処置に必要とされる、さまざまな治療器具が含まれています。 - 봉합및 고급 조치에 필요한 다양한 치료 도구가 있습니다. - 包含各种医疗套件,以及进阶伤口系统需要的缝合用品 - 包含各種醫療套件,以及進階傷口系統需要的縫合用品 - - - Personal Aid Kit for in field stitching or advanced treatment - W znacznym stopniu poprawia stan pacjenta - Полевая аптчека для продвинутого лечения и зашивания ран - Persönliches Erste-Hilfe-Set zum ambulanten Nähen und fortgeschrittener Behandlung. - Inclut du matériel medical pour les traitements délicats, tel les points de suture. - Equipo de primeros auxilios para sutura de campaña o tratamientos avanzados - Elsősegélycsomag, terepen való sebvarráshoz és haladó ellátáshoz - Kit de primeiros socorros para sutura ou tratamentos avançados - Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných v poli - Pronto soccorso personale da campo per mettersi i punti o per trattamenti avanzati. - 戦場で縫合や高度な処置に必要とされる、さまざまな治療器具が含まれています。 - 야전에서 봉합및 고급 조치를 위한 개인응급키트 - 个人急救包可用于战地缝合手术或进阶伤口系统使用 - 個人急救包可用於戰地縫合手術或進階傷口系統使用 - - - Use Personal Aid Kit - Erste-Hilfe-Set benutzen - Использовать аптечку - Utiliser la trousse sanitaire - Użyj apteczki osobistej - Usar equipo de primeros auxilios - Elsősegélycsomag használata - Usar o kit de primeiros socorros - Použít osobní lékárničku (PAK) - Usa il pronto soccorso personale - 応急処置キットをつかう - 개인 응급 키트사용하기 - 使用个人急救包 - 使用個人急救包 - - - Surgical Kit - Trousse chirurgicale - Хирургический набор - Kit quirúrgico - Zestaw do szycia ran - Operationsset - Sebészeti készlet - Kit chirurgico - Kit Cirúrgico - Chirurgická sada - 縫合キット - 봉합 키트 - 手术包 - 手術包 - - - Surgical Kit for in field advanced medical treatment - Trousse chirurgicale pour le traitement sur le terrain - Набор для хирургической помощи в полевых условиях - Kit quirúrgico para el tratamiento avanzado en el campo de batalla - Zestaw pozwalający na zszywanie ran w polu - Operationsset für fortgeschrittene medizinische Feldversorgung - Sebészeti készlet komplex orvosi feladatok terepen való ellátására - Kit chirurgico per trattamenti avanzati sul campo. - Kit Cirurgico para uso de tratamento médico avançado em campo - Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli - 縫合キットは戦場で高度な処置をするためにつかわれます。 - 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) - 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) - - - Surgical Kit for in field advanced medical treatment - Набор для хирургической помощи в полевых условиях - Kit quirúrgico para el tratamiento avanzado en el campo de batalla - Zestaw pozwalający na zszywanie ran w polu - Operationsset für fortgeschrittene medizinische Feldversorgung - Trousse chirurgicale pour le traitement sur le terrain - Sebészeti készlet komplex orvosi feladatok terepen való ellátására - Kit chirurgico per trattamenti avanzati sul campo. - Kit Cirúrgico para tratamento médico avançado em campo. - Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli - 縫合キットは戦場で高度な処置をするためにつかわれます。 - 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) - 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) - - - Use Surgical Kit - Operationsset benutzen - Usa kit chirurgico - Использовать хирургический набор - Utiliser la trousse chirugicale - Zszyj rany - Usar equipo quirúrgico - Sebészeti készlet használata - Použít chirurgickou sadu - Usar kit cirúrgico - 縫合キットをつかう - 봉합키트 사용하기 - 使用手术包 - 使用手術包 - - - Bodybag - Housse mortuaire - Мешок для трупов - Bolsa para cadáveres - Worek na zwłoki - Leichensack - Hullazsák - Sacca per corpi - Saco mortuário - Pytel na mrtvoly - 死体袋 - 尸袋 - 屍袋 - 시체 운반 가방 - - - A bodybag for dead bodies - Housse de transport des corps - Мешок для упаковки трупов - Una bolsa para cadáveres - Worek do pakowania zwłok - Ein Leichensack für Tote - Egy hullazsák a holttestek számára - Una sacca nera per trasportare cadaveri. - Um saco para corpos mortos - Pytel na mrtvoly - 死体袋は死体を入れるためにつかいます - 시체를 운반할때 쓰는 가방입니다 - 用来装尸体用 - 用來裝屍體用 - - - A bodybag for dead bodies - Housse de transport des corps - Мешок для упаковки трупов - Una bolsa para cadáveres - Worek do pakowania zwłok - Ein Leichensack für Tote - Egy hullazsák a holttestek számára - Una sacca nera per trasportare cadaveri. - Um saco para corpos mortos. - Pytel na mrtvoly - 死体袋は死体を入れるためにつかいます - 시체를 운반할때 쓰는 가방입니다 - 用来装尸体用 - 用來裝屍體用 - - - Blood Pressure - Tension artérielle - Артериальное давление - Presión arterial - Ciśnienie krwi - Blutdruck - Vérnyomás - Pressione sanguigna - Pressão arterial - Krevní tlak - 血圧を測る - 혈압 - 血压 - 血壓 - - - Checking Blood Pressure.. - Prise de la tension... - Проверка артериального давления... - Comprobando presión arterial... - Sprawdzanie ciśnienia krwi... - Blutdruck kontrollieren... - Vérnyomás megmérése... - Controllando la pressione sanguigna.. - Aferindo pressão arterial... - Měřím krevní tlak... - 血圧を測定しています・・・ - 혈압 측정증... - 检查血压中... - 檢查血壓中... - - - %1 checked Blood Pressure: %2 - %1 kontrollierte Blutdruck: %2 - %1 controllata pressione sanguigna: %2 - %1 проверил артериальное давление: %2 - %1 a mesuré la tension: %2 - %1 sprawdził ciśnienie krwi: %2 - %1 verificada la presión arterial: %2 - %1 ellenőrizte a vérnyomást: %2 - %1 zkontroloval krevní tlak: %2 - %1 verificou pressão arterial: %2 - %1 が測った血圧は: %2 - %1 (이)가 혈압을 측정했습니다: %2 - 已由%1确认血压: %2 - 已由%1確認血壓: %2 - - - You checked %1 - Vous examinez %1 - Вы осмотрели раненого %1 - Examinando a %1 - Zbadałeś %1 - Kontrolliert %1 - A %1 ellenőrizve - Hai diagnosticato %1 - Você verificou o paciente %1 - Zkontroloval jsi %1 - 自分の血圧は %1 - 나의 혈압은 %1 이다 - 你已经检查 %1 - 你已經檢查 %1 - - - You find a blood pressure of %2/%3 - Vous avez mesuré une tension de %2/%3 - Артериальное давление %2/%3 - La Presión Arterial es %2/%3 - A vérnyomás %2/%3 - Hai riscontrato una pressione di %2/%3 - Wyczuwasz ciśnienie krwi o wartości %2/%3 - Der Blutdruck liegt bei %2/%3 - A pressão arterial é de %2/%3 - Naměřil si krevní tlak u %2/%3 - 血圧は %2/%3 - 혈압이 %2/%3 이다 - 血压为%2/%3 - 血壓為%2/%3 - - - You find a low blood pressure - Tension basse - Давление низкое - La presión arterial es baja - Wyczuwasz niskie ciśnienie krwi - Blutdruck ist niedrig - A vérnyomás alacsony - La pressione sanguigna è bassa - Pressão arterial baixa - Naměřil si nízký krevní tlak - 血圧はかなり低い - 发现到低血压 - 發現到低血壓 - 혈압이 낮음 - - - You find a normal blood pressure - Tension normale - Давление нормальное - La presión arterial es normal - Wyczuwasz normalne ciśnienie krwi - Blutdruck ist normal - A vérnyomás normális - La pressione sanguigna è normale - Pressão arterial normal - Naměřil si normální krevní tlak - 血圧は通常 - 发现到正常血压 - 發現到正常血壓 - 혈압이 정상 - - - You find a high blood pressure - Tension élevée - Давление высокое - La presión arterial es alta - Wyczuwasz wysokie ciśnienie krwi - Blutdruck ist hoch - A vérnyomás magas - La pressione sanguigna è alta - Pressão arterial alta - Naměřil si vysoký krevní tlak - 血圧はかなり高い - 发现到高血压 - 發現到高血壓 - 혈압이 높음 - - - You find no blood pressure - Pas de tension - Давления нет - No hay presión arterial - Nie wyczuwasz ciśnienia krwi - Patient hat keinen Blutdruck - Nem észlelhető vérnyomás - La pressione sanguigna è assente - Sem pressão arterial - Nenaměřil si žádný krevní tlak - 血圧を測れませんでした - 혈압이 잡히지 않는다 - 量不到血压 - 量不到血壓 - - - You fail to find a blood pressure - Vous n'avez pas pu mesurer de tension - Артериальное давление не определяется - No puedes encontrar presión arterial - Nie udało Ci się sprawdzić ciśnienia krwi - Du konntest keinen Blutdruck feststellen - Nem sikerült a vérnyomás megmérése - Manca strumento per misurare pressione sanguigna - Você falhou em aferir a pressão arterial - Nedokázal si změřit krevní tlak - 血圧を測るのに失敗しました - 혈압을 잡을 수 없었다 - 检查血压的动作失败 - 檢查血壓的動作失敗 - - - Low - Niedrig - Bassa - Низкое - basse - Niskie - Baja - Alacsony - Nízký - Baixa - 低い - 낮음 - - - - - Normal - Normal - Normale - Нормальное - normale - Normalne - Normal - Normális - Normální - Normal - 通常 - 보통 - 正常 - 正常 - - - High - Hoch - Alta - Высокое - élevée - Wysokie - Alta - Magas - Vysoký - Alta - 高い - 높음 - - - - - No Blood Pressure - Kein Blutdruck - Nessuna Pressione Sanguigna - Артериальное давление отсутствует - pas de tension - Brak ciśnienia krwi - Sin presión arterial - Nincs vérnyomás - Žádný krevní tlak - Sem pressão arterial - 血圧なし - 혈압 없음 - 无血压 - 無血壓 - - - Pulse - Пульс - Pouls - Pulso - Tętno - Puls - Pulzus - Polso - Pulso - Puls - 心拍数 - 맥박 - 脉搏 - 脈搏 - - - Checking Heart Rate... - Vérification du pouls... - Проверка пульса... - Comprobando ritmo cardíaco... - Sprawdzanie tętna... - Kontrolliere Herzfrequenz... - Szívverés-szám mérése... - Controllando il battito cardiaco... - Aferindo pulso... - Kontroluji srdeční tep... - 心拍数を測定しています・・・ - 맥박 확인중... - 检查心跳中... - 檢查心跳中... - - - You checked %1 - Вы осмотрели раненого %1 - Vous examinez %1 - Examinando a %1 - Zbadałeś %1 - Kontrolliert %1 - A %1 ellenőrizve - Hai diagnosticato %1 - Você aferiu o paciente %1 - Zkontroloval si %1 - 心拍数は %1 - 나의 맥박은 %1 이다 - 你已经检查 %1 - 你已經檢查 %1 - - - %1 checked Heart Rate: %2 - %1 kontrollierte Herzfrequenz: %2 - %1 Controllata Frequenza Cardiaca: %2 - %1 проверил пульс: %2 - %1 a vérifié le pouls de : %2 - %1 sprawdził tętno: %2 - %1 verificado el ritmo cardíaco: %2 - %1 ellenőrizte a szívverés-számot: %2 - %1 zkontroloval srdeční tep: %2 - %1 verificou a frequência cardíaca: %2 - %1 が測った心拍数は: %2 - %1 (이)가 맥박을 측정했습니다: %2 - 已由%1确认心跳: %2 - 已由%1確認心跳: %2 - - - None - Нет - Żadna - Nada - Keine - Žádný - Nada - aucun - Nincs - Niente - なし - 없음 - - - - - Weak - Schwach - Lento - Слабый - lent - Słabe - Débil - Gyenge - Slabý - Fraca - 弱い - 약함 - 微弱 - 微弱 - - - Normal - Normal - Normale - Нормальный - normal - Normalne - Normal - Normális - Normální - Normal - 通常 - 보통 - 正常 - 正常 - - - Strong - Stark - Veloce - Сильный - rapide - Silne - Fuerte - Erős - Silný - Forte - 強い - 강함 - 过快 - 過快 - - - You find a Heart Rate of %2 - %2 battements par minute - Пульс %2 уд./мин. - El ritmo cardíaco es de %2 - Wyczuwasz tętno o wartości %2 - Herzfrequenz ist %2 - A szívverés-szám %2 - Il battito cardiaco è %2 - A freqüência cardíaca é de %2 - Nahmatal jsi srdeční tep u %2 - 心拍数は %2 - 心跳为%2 - 心跳為%2 - 맥박 %2 - - - You find a weak Heart Rate - Poulslent - Пульс слабый - El ritmo cardíaco es débil - Wyczuwasz słabe tętno - Schwacher Puls - A szívverés-szám alacsony - Hai riscontrato un debole battito cardiaco - Freqüência cardíaca baixa - Nahmatal si slabý srdeční puls - 自分の心拍数は低い - 心跳微弱 - 心跳微弱 - 약한 맥박 - - - You find a strong Heart Rate - pouls rapide - Пульс учащенный - El ritmo cardíaco está acelerado - Wyczuwasz silne tętno - Starker Puls - A szívverés-szám magas - Hai riscontrato un forte battito cardiaco - Freqüência cardíaca normal - Nahmatal si silný srdeční puls - 自分の心拍数は強い - 心跳过快 - 心跳過快 - 강한 맥박 - - - You find a normal Heart Rate - pouls normal - Пульс в норме - El ritmo cardíaco es bueno - Wyczuwasz normalne tętno - Normaler Puls - A szívverés-szám normális - Hai riscontrato un normale battito cardiaco - Freqüência cardíaca alta - Nahmatal si normální srdeční puls - 自分の心拍数は通常 - 心跳正常 - 心跳正常 - 보통 맥박 - - - You find no Heart Rate - pas de pouls - Пульс не прощупывается - No tiene ritmo cardíaco - Wyczuwasz brak tętna - Kein Puls gefunden - Nem észlelhető szívverés - Hai riscontrato una assenza di battito cardiaco - Sem freqüência cardíaca - Žádný puls - 心拍数を測れませんでした - 量不到心跳 - 量不到心跳 - 맥박 없음 - - - Response - Conscience - Реакция - Respuesta - Przytomność - Ansprechbarkeit - Reagálóképesség - Risposta - Reação - Odezva - 反応を見る - 반응 - 反应 - 反應 - - - You check response of patient - Vous évaluez l'état de conscience - Вы проверяете реакцию раненого - Compruebas si el paciente reacciona - Sprawdzasz przytomność pacjenta - Du prüfst ob der Patient ansprechbar ist - Ellenőrzöd a páciens reagálóképességét - Controlli la risposta del paziente - Aferindo se o paciente tem reação - Zkontroloval jsi reakci pacienta - 患者からの反応を見る - 대상의 반응 확인중 - 检查伤者的反应 - 檢查傷者的反應 - - - %1 is responsive - %1 реагирует на раздражители - %1 est conscient - %1 ha reaccionado - %1 jest przytomny - %1 ist ansprechbar - %1 reakcióképes - %1 e' cosciente - %1 está respondendo - %1 odpovídá - %1 は反応あり - %1 有反应 - %1 有反應 - %1 은 반응이 있다 - - - %1 is not responsive - %1 не реагирует на раздражители - %1 est inconscient - %1 no reacciona - %1 jest nieprzytomny - %1 ist nicht ansprechbar - %1 nem reagál - %1 e' incosciente - %1 não está respondendo - %1 neodpovídá - %1 の反応なし - %1 没有反应 - %1 沒有反應 - %1 은 반응이 없다 - - - You checked %1 - Вы осмотрели раненого %1 - Vous avez examiné %1 - Examinas a %1 - Zbadałeś %1 - Du hast versucht, %1 anzusprechen - Megnézted %1-t - Hai controllato %1 - Você aferiu o paciente %1 - Zkontroloval jsi %1 - %1 を見ました - %1 을 확인함 - 你已经检查 %1 - 你已經檢查 %1 - - - Patient %1<br/>is %2.<br/>%3.<br/>%4 - Il paziente %1<br/>è %2.<br/>%3.<br/>%4 - Пациент %1<br/>%2.<br/>%3.<br/>%4 - Patient %1<br/>ist %2.<br/>%3.<br/>%4 - Patient %1<br/>est %2.<br/>%3.<br/> - Pacjent %1<br/>jest %2.<br/>%3.<br/>%4 - Paciente %1<br/>is %2.<br/>%3.<br/>%4 - A páciens, %1,<br/>%2.<br/>%3.<br/>%4 - Pacient %1<br/>je %2.<br/>%3.<br/>%4 - Paciente %1<br/>é %2.<br/>%3.<br/>%4 - 患者 %1<br/>は %2.<br/>%3.<br/>%4 - 환자 %1<br/>는 %2.<br/>%3.<br/>%4 - 伤者 %1<br/>is %2.<br/>%3.<br/>%4 - 傷者 %1<br/>is %2.<br/>%3.<br/>%4 - - - alive - vivo - жив - lebendig - vivant - żywy - vivo - élő - naživu - vivo - 生存 - 생존 - 活着 - 活著 - - - dead - morto - мёртв - muerto - tot - décédé - martwy - halott - mrtev - morto - 死亡 - 사망 - 死亡 - 死亡 - - - He's lost some blood - Ha perso poco sangue - Ha perdido un poco de sangre - Есть кровопотеря - Er hat etwas Blut verloren - Il a perdu du sang - Stracił trochę krwi - Valamennyi vért vesztett - Ztratil trochu krve - Ele perdeu um pouco de sangue - 出血しています - 적은 양의 피를 잃었다 - 他流失一些血液 - 他流失一些血液 - - - He's lost a lot of blood - Er hat viel Blut verloren - Sok vért vesztett - Stracił sporo krwi - Большая кровопотеря - Ha perdido mucha sangre - Il a perdu beaucoup de sang - Ztratil hodně krve - Ele perdeu muito sangue - Ha perso molto sangue - 大量失血しています - 많은 양의 피를 잃었다 - 他流失大量血液 - 他流失大量血液 - - - He hasn't lost blood - Non ha perso sangue - Нет кровопотери - Er hat kein Blut verloren - Il n'a pas perdu de sang - Nie stracił krwi - No ha perdido sangre - Nem vesztett vért - Neztratil žádnou krev - Ele não perdeu sangue - 失血していません - 피를 잃지 않았다 - 他并没有失血 - 他並沒有失血 - - - He is in pain - Sente dolori - Испытывает боль - Er hat Schmerzen - Il souffre - Odczuwa ból - Siente dolor - Fájdalmai vannak - Je v bolestech - Ele está com dor - 痛いようです - 통증이 있다 - 他感到疼痛 - 他感到疼痛 - - - He is not in pain - Non sente dolori - Не испытывает боли - Er hat keine Schmerzen - Il ne souffre pas - Nie odczuwa bólu - No siente dolor - Nincsenek fájdalmai - Nemá žádné bolesti - Ele não está com dor - 痛くないようです - 통증이 없다 - 他不会疼痛 - 他不會疼痛 - - - Bandaged - Pansé - Повязка наложена - Vendado - Zabandażowano - Bekötözve - Bendato - verbunden - Enfaixado - Obvázaný - 包帯 - 붕대 감음 - 绷带 - 繃帶 - - - You bandage %1 (%2) - Vous pansez %1 (%2) - Вы перевязали раненого %1 (%2) - Aplicas vendaje a %1 en %2 - Bandażujesz %1 (%2) - Bekötözöd %1-t (%2) - Stai bendando %1 (%2) - Du verbindest %1 (%2) - Você aplica atadura no paciente %1 (%2) - Obvazuješ %1 (%2) - %1 (%2) 包帯をつかいました - %1 (%2) 붕대를 감았다 - 你正在对 %1 (%2) 包扎绷带中 - 你正在對 %1 (%2) 包紮繃帶中 - - - %1 is bandaging you - %1 vous panse - %1 перевязывает вас - %1 te está vendando - %1 bandażuje Ciebie - %1 bekötöz téged - %1 ti sta bendando - %1 verbindet dich - %1 está aplicando uma bandagem em você - %1 tě obvazuje - %1 はあなたに包帯を巻いています - %1 (이)가 나에게 붕대를 감고있다 - %1 正在对你包扎绷带中 - %1 正在對你包紮繃帶中 - - - You start stitching injuries from %1 (%2) - Вы зашиваете ранения от %1 (%2) - Du nähst die Wunden von %1 (%2) - Vous suturez %1 (%2) - Estás suturando heridas de %1 en %2 - Zszywasz rany %1 (%2) - Elkezded összevarni %1 sérüléseit (%2) - Stai suturando le ferite di %1 (%2) - Você começa a suturar os ferimentos do %1 (%2) - Zašíváš rány %1 (%2) - %1 (%2) の外傷へ縫合を始めました - 나는 %1(%2) 상처로부터 봉합을 시작했다 - 你正开始对 %1 (%2) 缝合伤口中 - 你正開始對 %1 (%2) 縫合傷口中 - - - Stitching - Наложение швов - Suturando - Nähen - Sutures - Szycie - Összevarrás - Suturando - Suturando - Šití - 縫合中 - 붕합중 - 缝合中 - 縫合中 - - - You treat the airway of %1 - Вы интубируете раненого %1 - Estás intubando a %1 - Du behandelst die Atemwege von %1 - Vous traitez les voies respiratoires de %1 - Udrażniasz drogi oddechowe %1 - Kezeled %1 légútját - Controlli le vie respiratorie di %1 - Você entuba o %1 - Ošetřuješ dýchací cesty %1 - %1 の気道を診断する - %1의 기도를 확보했다 - 你治疗 %1 的呼吸道 - 你治療 %1 的呼吸道 - - - Airway - Дыхательные пути - Vías aéreas - Drogi oddechowe - Atemwege - Voies respiratoires - Légút - Vie respiratorie - Vias Aéreas - Dýchací cesty - 気道 - 기도 - 呼吸道 - 呼吸道 - - - %1 is treating your airway - %1 проводит вам интубацию - %1 traite vos voies respiratoires - %1 te está intubando - %1 udrażnia Twoje drogi oddechowe - %1 behandelt deine Atemwege - %1 kezeli a légútadat - %1 ti sta trattando le vie respiratorie - %1 está te entubando - %1 ošetřuje tvoje dýchací cesty - %1 はあなたの気道を見ています - %1 (이)가 나의 기도를 확보중이다 - %1 正在治疗你的呼吸道 - %1 正在治療你的呼吸道 - - - Drag - Ziehen - Arrastrar - Ciągnij - Táhnout - Тащить - Traîner - Húzás - Arrastar - Trascina - 引きずる - 끌다 - 拖拉 - 拖拉 - - - Carry - Tragen - Cargar - Nieś - Nést - Нести - Porter - Cipelés - Carregar - Trasporta - 運ぶ - 업다 - 背起 - 背起 - - - Release - Loslassen - Soltar - Połóż - Položit - Отпустить - Déposer - Elengedés - Soltar - Rrilascia - 離す - 내려놓기 - 放下 - 放下 - - - Load Patient Into - Patient einladen - Cargar al paciente en - Załaduj pacjenta - Naložit pacianta do - Погрузить пациента в - Embarquer le patient - Sebesült berakása - Carregar paciente em - Carica paziente nel - 患者を載せる - 환자 싣기 - 将伤者放入 - 將傷者放入 - - - Unload Patient - Patient ausladen - Descargar al paciente - Wyładuj pacjenta - Vyložit pacienta - Выгрузить пациента - Débarquer le patient - Sebesült kihúzása - Descarregar paciente - Scarica il paziente - 患者を降ろす - 환자 내리기 - 将伤者背出 - 將傷者背出 - - - Unload patient - Descargar al paciente - Выгрузить пациента - Patient ausladen - Wyładuj pacjenta - Le patient débarque - Sebesült kihúzása - Scarica il paziente - Descarregar paciente - Vyložit pacienta - 患者を降ろす - 환자 내리기 - 将伤者背出 - 將傷者背出 - - - Load patient - Cargar al paciente en - Погрузить пациента - Patient einladen - Załaduj pacjenta - Embarquer le patient - Sebesült berakása - Carica il paziente - Carregar paciente em - Naložit pacienta - 患者を載せる - 환자 싣기 - 将伤者放入 - 將傷者放入 - - - Place body in bodybag - Colocar cuerpo en bolsa para cadáveres - Поместить тело в мешок для трупов - Körper in Leichesack verstauen - Zapakuj ciało do worka na zwłoki - Mettre le corps dans la housse mortuaire - Test hullazsákba helyezése - Metti il corpo nella sacca per cadaveri - Colocar corpo dentro do saco mortuário - Umístni tělo do pytle na mrtvoly - 死体袋に入れる - 시체 가방에 담기 - 将尸体放入尸袋 - 將屍體放入屍袋 - - - Placing body in bodybag... - Colocando cuerpo en bolsa para cadáveres... - Упаковка тела... - Körper wird in Leichensack gepackt... - Pakowanie ciała do worka na zwłoki... - Placement du corps dans la housse... - Test hullazsákba helyezése... - Stai mettendo il corpo nella sacca... - Colocando corpo dentro do saco mortuário... - Umístňuji tělo do pytle na mrtvoly... - 死体袋へ入れています・・・ - 시체 가방에 담는중... - 将尸体放入尸袋中... - 將屍體放入屍袋中... - - - %1 has bandaged patient - %1 has vendado al paciente - %1 перевязал пациента - %1 hat den Patienten verbunden - %1 założył bandaż - %1 a pansé le patient - %1 bekötözte a pácienst - %1 ha bendato il paziente - %1 aplicou atadura no paciente - %1 již obvázal pacienta - %1 は包帯を巻きました - %1 已包扎伤者 - %1 已包紮傷者 - %1 (이)가 붕대를 감음 - - - %1 performed CPR - %1 wykonał cykl RKO - %1 provádí CPR - %1 hat eine HLW durchgeführt - %1 ha eseguito CPR - %1 realizou RCP - %1 провел сердечно-легочную реанимацию - %1 realicó RCP - %1 à fait une RCP - %1 は心肺蘇生をしました - %1 已执行心肺复苏术 - %1 已執行心肺復甦術 - %1 (이)가 심폐소생술을 실시함 - - - %1 used %2 - %1 usó %2 - %1 benutzt %2 - %1 использовал %2 - %1 użył %2 - %1 utilise %2 - %1 használta a %2-t - %1 ha usato %2 - %1 usou %2 - %1 použil %2 - %1 は %2 をつかいました - %1 已使用 %2 - %1 已使用 %2 - %1 (이)가 %2 을 사용함 - - - %1 has given an IV - %1 провёл переливание - %1 ha puesto una IV - %1 hat eine Infusion verabreicht - %1 podał IV - %1 a plaçé une IV - %1 infúziót adott - %1 ha somministrato una EV - %1 aplicou um intravenoso - %1 již aplikoval IV - %1 は IV をしました - %1 已经给予静脉注射液 - %1 已經給予靜脈注射液 - %1 (이)가 IV를 실시함 - - - %1 applied a tourniquet - %1 aplicado torniquete - %1 наложил жгут - %1 hat ein Tourniquet angelegt - %1 założył stazę - %1 a plaçé un garrot - %1 felhelyezett egy érszorítót - %1 ha applicato un laccio emostatico - %1 aplicou um torniquete - %1 použil škrtidlo - %1 は止血帯を巻きました - %1 已经绑上止血带 - %1 已經綁上止血帶 - %1 (이)가 지혈대를 적용함 - - - %1 used Personal Aid Kit - %1 hat das eigene Erste-Hilfe-Set verwendet - %1 użył apteczki - %1 utilizou KPS - %1 používá PAK - %1 использовал аптечку - %1 ha usato Kit Pronto Soccorso Personale - %1 usó Kit de Primeros Auxilios - %1 a utilisé une trousse - %1 は応急処置キットをつかいました - %1 已使用了个人急救包 - %1 已使用了個人急救包 - %1 (이)가 개인응급키트를 사용함 - - - Heavily wounded - Schwer verwundet: - Ciężko ranny - Тяжелые ранения - Gravemente ferito - Gravemente herido - Gravement blessé - Erősen sérült - Těžce raněn - Gravemente ferido - 重傷 - 중상 - 重伤 - 重傷 - - - Lightly wounded - Leicht verwundet: - Lekko ranny - Легкие ранения - Leggermente ferito - Levemente herido - Légèrement blessé - Enyhén sérült - Lehce raněn - Levemente ferido - 軽傷 - 경상 - 轻伤 - 輕傷 - - - Very lightly wounded - Sehr leicht verwundet: - B. lekko ranny - Царапины - Ferito lievemente - Muy levemente herido - Très légèrement blessé - Nagyon enyhén sérült - Velmi lehce raněn - Ferido muito levemente - かなり浅い傷 - 매우 가벼운 부상 - 小伤 - 小傷 - - - Head - Kopf - Głowa - Головы - Testa - Cabeza - Tête - Fej - Hlava - Cabeça - 頭部 - 머리 - 头部 - 頭部 - - - Torso - Torso - Tors - Торса - Torso - Torso - Torse - Testtörzs - Trup - Torso - 胴体 - 몸통 - 身体 - 身體 - - - Left Arm - Linker Arm - Lewe ramię - Левой руки - Braccio sinistro - Brazo izquierdo - Bras gauche - Bal kar - Levá ruka - Braço esquerdo - 左腕 - 왼쪽 팔 - 左手 - 左手 - - - Right Arm - Rechter Arm - Prawe ramię - Правой руки - Braccio destro - Brazo derecho - Bras droit - Jobb kar - Pravá ruka - Braço direito - 右腕 - 오른쪽 팔 - 右手 - 右手 - - - Left Leg - Linkes Bein - Lewa noga - Левой ноги - Gamba sinistra - Pierna izquierda - Jambe gauche - Bal láb - Levá noha - Perna esquerda - 左足 - 왼쪽 다리 - 左脚 - 左腳 - - - Right Leg - Rechtes Bein - Prawa noga - Правой ноги - Gamba destra - Pierna derecha - Jambe droite - Jobb láb - Pravá noha - Perna direita - 右足 - 오른쪽 다리 - 右脚 - 右腳 - - - Heal fully bandaged hitpoints - Lecz w pełni zabandażowane hitpointy - Curar miembros totalmente vendados - Исцелять полностью перебинтованные части тела - Curar pontos de vida totalmente enfaixados - Heal fully bandaged hitpoints - Cura hitpoints completamente bendati - Soigner les plaies entièrement bandées - Heilt vollständig bandagierte Trefferpunkte - 包帯は体力を完全に回復する - 붕대를 감은후 체력을 회복함 - 完全医疗包扎的部位至痊愈 - 完全醫療包紮的部位至痊癒 - - - Pain is only temporarily suppressed - Schmerzen werden nur vorübergehend unterdrückt - Ból jest tymczasowo zwalczany - Bolest je potlačena pouze dočasně - El dolor se suprime solo temporalmente - Dor é suprimida somente temporariamente - La douleur est temporairement calmée - A fájdalom csak ideiglenesen csökken - Боль приглушается только временно - Dolore è soppresso solo temporaneamente - 痛みは一時的な影響 - 疼痛只会暂时性压制 - 疼痛只會暫時性壓制 - 고통은 일시적으로만 회복 - - - Pain Effect Type - Schmerzeffekt-Typ - Rodzaj efektu bólu - Визуальный эффект боли - Pain Effect Type - Tipo de efecto de dolor - Type d'effet de douleur - Fájdalom-effekt típusa - Tipo do efeito da dor - Typ bolesti - efekt - 痛みの種類 - 고통 효과 종류 - 疼痛效果类型 - 疼痛效果類型 - - - Colour Flashing - Farbblinken - Pulsujące kolory - Пульсирующий свет - Colore lampeggiante - Parpadeo de color - Flash de couleur - Színvillódzás - Flash de cor - Blikající barva - 色の点滅 - 색 반짝임 - 闪烁颜色 - 閃爍顏色 - - - Chromatic Aberration - Chromatische Aberration - Aberracja chromatyczna - Хроматическая аберрация - Aberrazione cromatica - Aberración cromática - Aberration chromatique - Kromatikus aberráció - Chromatická aberace - Aberração cromática - 色の収差 - 색수차 - 色差 - 色差 - - - Style of menu (Medical) - Styl menu medycznego - Style de menu (médical) - Menüstil (Medizin) - Вид меню (медицина) - Tipo de menú (Medico) - Styl menu (Zdravotní) - Estilo do menu (Médico) - Menü stílusa (Orvosi) - Stile del menù (medico) - メニューの表示形式 (治療) - 메뉴의 스타일 (의료) - 选单样式 (医疗) - 選單樣式 (醫療) - - - Select the type of menu you prefer; default 3d selections or radial. - Wybierz rodzaj menu, który preferujesz: domyślne pozycje 3D lub radialne - Sélectionne le type de menu préféré; par défaut la sélection 3D ou radiale - Wähle den Menüstil: Standard 3D-Auswahl oder kreisförmig. - Выберите тип меню: стандартный вариант (3D) или радиальный - Selecciona el tipo de menú que prefieres: selecciones 3d por defecto o radial. - Selecione o tipo de menu que você prefere; seleções 3d padrão ou radial. - Válaszd ki a neked megfelelő menüt: Alapértelmezett 3D válogatás, vagy kerek. - Zvolte typ menu: základní 3D výběr nebo kruhový - Seleziona il tipo di menù che preferisci: selezione (3D), radiale o disabilitata. - メニューの表示形式を選んでください。標準では 3D 選択か円状です。 - 선호하는 종류의 메뉴를 고르세요; 기본 3d 선택형 혹은 다이얼형 - 选择你喜欢的选单样式; 预设为3D选项或放射状 - 選擇你喜歡的選單樣式; 預設為3D選項或放射狀 - - - Selections (3d) - Pozycje (3D) - Sélection (3D) - 3D-Auswahl - Стандартный (3D) - Selecciones (3d) - Seleção (3d) - Választékok (3D) - 3D výběr - Selezione (3D) - 選択 (3D) - 선택 (3d) - 选择 (3D) - 選擇 (3D) - - - Radial - Radialne - Radial - Kreisförmig - Радиальный - Radial - Radial - Kerek - Kruhový - Radiale - 円状 - 다이얼형 - 放射状 - 放射狀 - - - Scrape - Kratzer - Scorticatura - Ссадина - Abrasion - Draśnięcie - Arañazo - Horzsolás - Escoriação - Odřenina - 擦り傷 - 찰과상 - 擦伤 - 擦傷 - - - Minor Scrape - Kleiner Kratzer - Minima Scorticatura - Малая ссадина - Petite abrasion - Pomniejsze draśnięcie - Arañazo menor - Kis horzsolás - Escoriação leve - Malá odřenina - 小さな擦り傷 - 소형 찰과상 - 小擦伤 - 小擦傷 - - - Medium Scrape - Mittlerer Kratzer - Media Scorticatura - Средняя ссадина - Moyenne abrasion - Średnie draśnięcie - Arañazo medio - Közepes horzsolás - Escoriação média - Středně velká odřenina - 中くらいの擦り傷 - 중형 찰과상 - 中擦伤 - 中擦傷 - - - Large Scrape - Großer Kratzer - Alta Scorticatura - Большая ссадина - Grande abrasion - Duże draśnięcie - Arañazo severo - Nagy horzsolás - Escoriação grave - Velká odřenina - 大きな擦り傷 - 대형 찰과상 - 大擦伤 - 大擦傷 - - - Avulsion - Avulsion - Avulsione - Рваная рана - Avulsion - Rana płatowa - Avulsión - Leszakadás - Avulsão - Avulze - 剥離傷 - 적출상 - 撕脱伤 - 撕脫傷 - - - Minor Avulsion - Kleine Avulsion - Minima Avulsione - Малая рваная рана - Petite avulsion - Pomniejsza rana płatowa - Avulsión menor - Kis leszakadás - Avulsão leve - Malá avulze - 小さな剥離傷 - 소형 적출상 - 小撕脱伤 - 小撕脫傷 - - - Medium Avulsion - Mittlere Avulsion - Media Avulsione - Средняя рваная рана - Moyenne avulsion - Średnia rana płatowa - Avulsión media - Közepes leszakadás - Avulsão média - Střední avulze - 中くらいの剥離傷 - 중형 적출상 - 中撕脱伤 - 中撕脫傷 - - - Large Avulsion - Große Avulsion - Alta Avulsione - Большая рваная рана - Grande avulsion - Duża rana płatowa - Avulsión severa - Nagy leszakadás - Avulsão grave - Velká avulze - 大きな剥離傷 - 대형 적출상 - 大撕脱伤 - 大撕脫傷 - - - Bruise - Prellung - Contusione - Ушиб - Contusion - Stłuczenie - Contusión - Zúzódás - Contusão - Modřina - 打ち傷 - 타박상 - 挫伤 - 挫傷 - - - Minor Bruise - Kleine Prellung - Minima Contusione - Малый ушиб - Petite contusion - Pomniejsze stłuczenie - Contusión menor - Kis zúzódás - Hematoma leve - Malá modřina - 小さな打ち傷 - 소형 타박상 - 小挫伤 - 小挫傷 - - - Medium Bruise - Mittlere Prellung - Media Contusione - Средний ушиб - Moyenne contusion - Średnie stłuczenie - Contusión media - Közepes zúzódás - Hematoma médio - Středně velká modřina - 中くらいの打ち傷 - 중형 타박상 - 中挫伤 - 中挫傷 - - - Large Bruise - Große Prellung - Alta Contusione - Большой ушиб - Grande contusion - Duże stłuczenie - Contusión severa - Nagy zúzódás - Hematoma grande - Velká modřina - 大きな打撲傷 - 대형 타박상 - 大挫伤 - 大挫傷 - - - Crushed tissue - Quetschverletzung - Tessuto Schiacciato - Компресионная травма - Écrasement - Zgniecienie tkanek miękkich - Tejido triturado - Zúzott szövet - Contusão - Zhmoždění měkkých tkání - 圧挫傷 - 압궤상 - 撞伤 - 撞傷 - - - Minor crushed tissue - Kleine Quetschverletzung - Minimo Tessuto Schiacciato - Малая компрессионная травма - Petit écrasement - Pomniejsze zgniecienie tkanek miękkich - Tejido triturado menor - Kis zúzott szövet - Contusão leve - Malé zhmoždění měkkých tkání - 小さな圧挫傷 - 소형 압궤상 - 小撞伤 - 小撞傷 - - - Medium crushed tissue - Mittlere Quetschverletzung - Medio Tessuto Schiacciato - Средняя компрессионная травма - Moyen écrasement - Średnie zgniecienie tkanek miękkich - Tejido triturado medio - Közepes zúzott szövet - Contusão média - Střední zhmoždění měkkých tkání - 中くらいの圧挫傷 - 중형 압궤상 - 中撞伤 - 中撞傷 - - - Large crushed tissue - Große Quetschverletzung - Alto Tessuto Schiacciato - Большая компрессионная травма - Grand écrasement - Duże zgniecienie tkanek miękkich - Tejido triturado severo - Nagy zúzött szövet - Contusão grande - Velké zhmoždění měkkých tkání - 大きな圧挫傷 - 대형 압궤상 - 大撞伤 - 大撞傷 - - - Cut - Schnittwunde - Taglio - Резаная рана - Coupure - Rana cięta - Corte - Vágás - Corte - Řezná rána - 切り傷 - 절상 - 割伤 - 割傷 - - - Small Cut - Kleine Schnittwunde - Piccolo Taglio - Малая резаная рана - Pomniejsza rana cięta - Corte menor - Kis vágás - Petite coupure - Corte leve - Malá řezná rána - 小さな切り傷 - 소형 절상 - 小割伤 - 小割傷 - - - Medium Cut - Mittlere Schnittwunde - Medio Taglio - Средняя резаная рана - Średnia rana cięta - Corte mediano - Közepes vágás - Moyenne coupure - Corte médio - Střední řezná rána - 中くらいの切り傷 - 중형 절상 - 中割伤 - 中割傷 - - - Large Cut - Große Schnittwunde - Grande Taglio - Большая резаная рана - Duża rana cięta - Corte severo - Nagy vágás - Grande coupure - Corte grave - Velká řezná rána - 大きな切り傷 - 대형 절상 - 大割伤 - 大割傷 - - - Tear - Riss - Strappo - Рваная рана - Rozerwanie skóry - Lacération - Desgarro - Szakadás - Ruptura - Tržná rána - 裂傷 - 열상 - 撕裂伤 - 撕裂傷 - - - Small Tear - Kleiner Riss - Piccolo Strappo - Малая рваная рана - Pomniejsze rozerwanie skóry - Petite lacération - Desgarro menor - Kis szakadás - Ruptura leve - Malá tržná rána - 小さな裂傷 - 소형 열상 - 小撕裂伤 - 小撕裂傷 - - - Medium Tear - Mittlerer Riss - Medio Strappo - Средняя рваная рана - Średnie rozerwanie skóry - Desgarro medio - Közepes szakadás - Moyenne lacération - Ruptura média - Střední tržná rána - 中くらいの裂傷 - 중형 열상 - 中撕裂伤 - 中撕裂傷 - - - Large Tear - Großer Riss - Grande Strappo - Большая рваная рана - Duże rozerwanie skóry - Desgarro severo - Nagy szakadás - Grande lacération - Ruptura grave - Velká tržná rána - 大きな裂傷 - 대형 열상 - 大撕裂伤 - 大撕裂傷 - - - Velocity Wound - Ballistisches Trauma - Velocità Ferita - Огнестрельная рана - Rana postrzałowa - Plaie pénétrante - Herida de bala - Lőtt seb - Trauma balístico - Střelné poranění - 銃創 - 총상 - 穿透伤 - 穿透傷 - - - Small Velocity Wound - Kleines Ballistisches Trauma - Lenta Velocità Ferita - Малая огнестрельная рана - Pomniejsza rana postrzałowa - Herida de bala menor - Kis lőtt seb - Petite plaie pénétrante - Trauma balístico pequeno - Malé střelné poranění - 小さな銃創 - 소형 총상 - 小穿透伤 - 小穿透傷 - - - Medium Velocity Wound - Mittleres Ballistisches Trauma - Media Velocità Ferita - Средняя огнестрельная рана - Średnia rana postrzałowa - Herida de bala media - Közepes lőtt seb - Moyenne plaie pénétrante - Trauma balístico médio - Střední střelné poranění - 中くらいの銃創 - 중형 총상 - 中穿透伤 - 中穿透傷 - - - Large Velocity Wound - Großes Ballistisches Trauma - Alta Velocità Ferita - Большая огнестрельная рана - Duża rana postrzałowa - Herida de bala severa - Nagy lőtt seb - Grande plaie pénétrante - Trauma balístico grande - Velké střelné poranění - 大きな銃創 - 대형 총상 - 大穿透伤 - 大穿透傷 - - - Puncture Wound - Stichwunde - Puntura Ferita - Колотая рана - Rana kłuta - Perforation - Herida punzante - Szúrt seb - Ferimento perfurante - Bodná rána - 刺し傷 - 자상 - 穿刺伤 - 穿刺傷 - - - Minor Puncture Wound - Kleine Stichwunde - Piccola Puntura Ferita - Малая колотая рана - Pomniejsza rana kłuta - Herida punzante menor - Kis szúrt seb - Petite perforation - Ferimento perfurante leve - Malá bodná rána - 小さな刺し傷 - 소형 자상 - 小穿刺伤 - 小穿刺傷 - - - Medium Puncture Wound - Mittlere Stichwunde - Media Puntura Ferita - Средняя колотая рана - Średnia rana kłuta - Herida punzante media - Közepes szúrt seb - Moyenne perforation - Ferimento perfurante médio - Střední bodná rána - 中くらいの刺し傷 - 중형 자상 - 中穿刺伤 - 中穿刺傷 - - - Large Puncture Wound - Große Stichwunde - Grande Puntura Ferita - Большая колотая рана - Duża rana kłuta - Herida punzante severa - Nagy szúrt seb - Grande perforation - Ferimento perfurante grave - Velká bodná rána - 大きな刺し傷 - 대형 자상 - 大穿刺伤 - 大穿刺傷 - - - Broken Femur - Gebrochener Oberschenkelknochen - Femore Rotto - Перелом - Zkłamana kość udowa - Fémur cassé - Femur roto - Törött combcsont - Fêmur quebrado - Zlomená stehenní kost - 大腿骨の骨折 - 대퇴골 골절 - 大腿骨骨折 - 大腿骨骨折 - - - Treating... - Behandeln... - Ellátás... - Opatrywanie ran... - Traitement... - Лечение... - Tratando... - Tratando... - Ošetřuji... - Curando... - 治療しています・・・ - 치료중... - 治疗中... - 治療中... - - - Removing Tourniquet... - Tourniquet entfernen... - Zdejmowanie stazy... - Quitando torniquete... - Retire le garrot... - Removendo torniquete... - Érszorító eltávolítása... - Sundavám škrtidlo... - Снятие жгута... - Togliendo il laccio emostatico... - 止血帯を外しています・・・ - 지혈대 제거중... - 移除军用止血带中... - 移除軍用止血帶中... - - + ACE Medical - ACE: медицина + ACE Медицина ACE Opcje medyczne Médico ACE ACE-Medicsystem @@ -3764,569 +12,196 @@ ACE Médical ACE Orvosi Rendszer ACE Medical - ACE 医療 ACE 의료 ACE 医疗系统 ACE 醫療系統 + ACE Medikal + ACE 医療 - - Medical Settings [ACE] - Настройки медицины [ACE] - Ustawienia medyczne - Ajustes médicos [ACE] - Sanitätseinstellungen [ACE] - Lékařské nastavení [ACE] - Ajustes médicos [ACE] - Options médicales [ACE] - Orvosi beállítások [ACE] - Impostazioni Mediche [ACE] - 医療設定 [ACE] - 의료 설정 [ACE] - 医疗设定 [ACE] - 醫療設定 [ACE] - - - Medical Level - Сложность медицины - Poziom medyczny - Nivel médico - Stufe des Sanitätssystem - Úroveň medického - Nível médico - Niveau de simulation médicale - Orvosi szint - Livello Medico - 医療レベル - 의료 수준 - 医疗等级 - 醫療等級 - - - What is the medical simulation level? - Каков уровень сложности медицинской системы? - Jaki jest poziom symulacji medycznej? - ¿Cuál es el nivel de simulación médica? - Wie hoch soll das medizinische Simulationslevel sein? - Jaká je úroveň lékařské simulace? - Qual o nível de simulação médica? - Quel niveau de simulation médicale choisissez-vous? - Milyen komplex legyen az orvosi szimuláció? - Qual'è il livello di simulazione medica? - 治療の再現度 - 의료 시뮬레이션의 수준 - 选择需要的医疗模拟等级 - 選擇需要的醫療模擬等級 - - - Basic - Базовый - Podstawowy - Básico - Standard - Základní - Básica - Basique - Alap - Basico - ベーシック - 기본 - 基本 - 基本 - - - Advanced - Усложненный - Zaawansowany - Avanzado - Erweitert - Pokročilé - Avançada - Avancé - Fejlett - Avanzato - アドバンスド - 고급 - 进阶 - 進階 - - - Medics setting - Настройки медиков - Poziom medyków - Configuración médica - Sanitätseinstellungen - Úroveň zdravotníků - Configuração médica - Règlage des infirmiers - Orvosok beállítása - Parametri Medici - 治療の設定 - 의료 설정 - 医护兵等级 - 醫護兵等級 - - - What is the level of detail prefered for medics? - Wie hoch soll das Simulationslevel für Sanitäter sein? - Каков уровень подробностей для медиков? - Jaki jest poziom detali medycznych wyświetlanych dla medyków? - ¿Cuál es el nivel de detalle preferido para los médicos? - Jaká úroveň detailů je preferována pro zdravotníky? - Qual o nível de detalhe preferido para os médicos? - Quel niveau de détail voulez-vous pour les infirmiers? - Mi a javasolt részletesség orvosok számára? - Qual'è il livello di dettagli preferito per i medici? - 衛生兵への再現度をどのくらいに設定しますか? - 의무병의 시뮬레이션 정도? - 设定医护兵的预设医疗水平(医疗兵,军医) - 設定醫護兵的預設醫療水平(醫療兵,軍醫) - - - Locations boost training - Místa pro vylepšení zkušeností - Località aumentano addestramento - Örtliche Trainingssteigerung - Ubicación mejora entrenamiento. - Miejsca zwiększają wyszkolenie - Localização melhora treinamento - Le lieu améliore l'efficacité - Места ускоренного обучения - 衛生兵としての能力を与える場所 - 受所在位置影响提升医疗能力 - 受所在位置影響提升醫療能力 - 의료 효과 증가 지역 - - - Boost medic rating in medical vehicles or near medical facilities [untrained becomes medic, medic becomes doctor] - Zlepšit zkušenosti zdravotníka v medickém vozidle nebo poblíž zdravotního zařízení [nezkušení se stane zdravotníkem, zdravotník se stane doktorem] - Aumenta il rating medico in veicoli medici o vicino strutture mediche [non addestrato diventa medico, medico diventa dottore] - Steigert die medizinische Einstufung eines Soldaten in Sanitätsfarhzeugen oder in der Nähe von Sanitätseinrichtungen [untrainiert wird zu Sanitäter, Sanitäter zu Doktor] - Mejora el entrenamiento médico dentro de vehículos médicos o cerca de instalaciones médicas (no entrenados se convierten en médicos, médicos se convierten en doctores) - Zwiększa poziom wyszkolenia medyków wewnątrz pojazdów medycznych lub w pobliżu budynków medycznych [niedoświadczony zostaje medykiem, medyk zostaje doktorem] - Aumenta a classificação do médico dentro de veículos médicos ou perto de instalações médicas [sem treinamento vira médico, médico vira doutor] - Améliore l'efficacité des soins dans les véhicules ou structures de soins [non formés deviennent médecins, médecins deviennent docteurs] - Улучшает медицинскую подготовку в мед. транспорте и около мед. строений [нетренированные становятся медиками, медики становятся врачами] - 医療車両や医療施設の近くは衛生兵としての能力を与える場所となり、衛生兵の訓練を受けていないのに衛生兵としてなる (未訓練は衛生兵に、衛生兵は医師に) - 의무병의 수준이 주변의 차량이나 의료시설에 따라 증가합니다. [비교육자가 의무병이되고, 의무병이 의사가 됩니다] - 当人员在医疗载具或是医护设施旁进行医疗时,该员医疗能力将会有所提升 (未受训人员提升为医疗兵,医疗兵提升为军医) - 當人員在醫療載具或是醫護設施旁進行醫療時,該員醫療能力將會有所提升 (未受訓人員提升為醫療兵,醫療兵提升為軍醫) - - - Disable medics - Отключить медиков - Wyłącz medyków - Desactivar médicos - Sanitäter deaktivieren - Zakázat zdravotníky - Desativar médicos - Désactiver les infirmiers - Orvosok letiltása - Disabilita medici - 衛生兵を無効化 - 의무병 비활성화 - 关闭医护兵 - 關閉醫護兵 - - - Enable Litter - Включить мусор - Aktywuj odpadki - Activar restos médicos - Abfälle aktivieren - Povolit odpadky - Ativar lixo médico - Activer les détritus - Szemét engedélyezése - Abilita Barella - 医療廃棄物の表示を有効化 - 의료폐기물 활성화 - 启用医疗废弃物 - 啟用醫療廢棄物 - - - Enable litter being created upon treatment - Включить появление мусора после лечения - Twórz odpadki medyczne podczas leczenia - Activar los restos médicos que se crean en el tratamiento - Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde - Vytváří odpad zdravotnického materiálu pří léčení - Ativar lixo a ser criado após tratamento - Activer la création de détrimus au début des traitements - Engedélyezi a szemét keletkezését ellátáskor - Abilita la creazione della barella dopo trattamento - 治療を始めると、医療廃棄物の作成を有効化する - 의료폐기물이 치료중 주변에 생성되는것을 활성화 합니다 - 本功能启用后,当每次医疗动作结束时,地上会产生相应的医疗废弃物 - 本功能啟用後,當每次醫療動作結束時,地上會產生相應的醫療廢棄物 - - - Life time of litter objects - Время удаления мусора - Długość życia odpadków - Tiempo de vida de los restos médicos - Dauer des angezeigten Abfalls - Životnost pro odpadky - Tempo de vida do lixo médico - Durée d'affichage des détritus - Szemétobjektumok élettartama - Tempo di vita delle barelle - 医療廃棄物の作成限界数を設定 - 의료폐기물 시간제한 - 医疗废弃物存在时间 - 醫療廢棄物存在時間 - - - How long should litter objects stay? In seconds. -1 is forever. - Как долго мусор будет оставаться на земле? В секундах. -1 означает бесконечное время. - Ile czasu musi upłynąć, aby odpadki zaczęły znikać? W sekundach. -1 dla nieskończoności. - ¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre. - Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. - Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. - Quanto tempo o lixo médico deve permanecer? Em segundos. -1 é para sempre. - Combien de temps doivent rester affiché les détritus? En secondes. -1 pour tout le temps - Milyen sokáig legyenek jelen a szemétobjektumok (másodpercben)? A -1 végtelen időt jelent. - Per quanto devono restare le barelle? In secondi. -1 è permanente - 医療廃棄物オブジェクトが表示されつづける時間を設定しますか? -1 は永遠です。 - 얼마동안 폐기물이 존재합니까? 초 단위. -1 은 영구적. - 定义医疗废弃物存在时间,以秒为单位,-1为永远存在。 - 定義醫療廢棄物存在時間,以秒為單位,-1為永遠存在。 - - - Enable Screams - Включить крики - Aktywuj wrzaski - Activar gritos - Schreie aktivieren - Povolit křik - Ativar gritos - Activer les hurlements - Kiáltások engedélyezése - Abilita Grida - 叫びを有効化 - 비명 활성화 - 启用尖叫 - 啟用尖叫 - - - Enable screaming by injured units - Включить крики раненных бойцов - Aktywuj wrzeszczenie z bólu przez ranne jednostki - Activar gritos para unidades heridas - Aktiviere Schreie bei verletzten Einheiten - Povolit křičení zraněných jednotek - Ativa gritos para unidades feridas - Active les hurlements d'unités blessées - Engedélyezi a sérült egységek kiáltásait - Abilita Grida da parte delle unità ferite - 負傷したユニットが叫ぶように - 부상당한 인원이 소리지르는것을 활성화합니다 - 启用伤者的尖叫声 - 啟用傷者的尖叫聲 - - - Player Damage - Урон игроку - Próg obrażeń graczy - Daño de jugador - Spielerschaden - Poškození hráče - Dano do jogador - Dégats du joueur - Játékos sérülés - Danno Giocatore - プレイヤーへの損傷 - 플레이어 부상 - 玩家伤害 - 玩家傷害 - - - What is the damage a player can take before being killed? - Какой уровень урона необходим, чтобы убить игрока? - Jaki jest próg obrażeń, jakie gracz może otrzymać zanim zostanie zabity? - ¿Cuál es el daño que un jugador puede sufrir antes de morir? - Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird? - Jaké poškození může hráč dostat než bude zabit? - Qual é o dano que um jogador pode sofrer antes de morrer? - Quels dégâts peut subir un joueur avant d'être tué - Mennyi sérülést szenvedhet el egy játékos, mielőtt meghal? - Quanto è il danno che un giocatore può sostenere prima di essere ucciso? - プレイヤーが死に始める前に損傷を受けるようにしますか? - 얼마정도의 부상을 플레이어가 죽기 전까지 버틸 수 있습니까? - 玩家死亡前所能承受的伤害程度 - 玩家死亡前所能承受的傷害程度 - - - AI Damage - Урон ботам - Próg obrażeń AI - Daño IA - KI-Schaden - Poškození AI - Dano da IA - Dégâts des IA - AI sérülés - Danno AI - AI への損傷 - 인공지능 부상 - AI伤害 - AI傷害 - - - What is the damage an AI can take before being killed? - Какой уровень урона необходим, чтобы убить бота? - Jaki jest próg obrażeń, jakie AI może otrzymać zanim zostanie zabite? - ¿Cuál es el daño que la IA puede sufrir antes de morir? - Wie viel Schaden kann eine KI erleiden, bis sie getötet wird? - Jaké poškození může AI dostat než bude zabito? - Qual é o dano que uma IA pode sofrer antes de morrer? - Quels dégâts peut subir une IA avant d'être tuée - Mennyi sérülést szenvedhet el egy AI, mielőtt meghal? - Quanto è il danno che un'IA può sostenere prima di essere uccisa? - AI が死に始める前に損傷を受けるようにしますか? - 얼마정도의 부상을 인공지능이 죽기 전까지 버틸 수 있습니까? - AI 死亡前所能承受的伤害程度 - AI 死亡前所能承受的傷害程度 - - - AI Unconsciousness - Потеря сознания ботами - Nieprzytomność AI - Inconsciencia IA - KI-Bewusstlosigkeit - Bezvědomí AI - Inconsciência da IA - Inconscience des IA - AI eszméletlenség - Incoscienza IA - AI の気絶 - 인공지능 기절 - AI无意识 - AI無意識 - - - Allow AI to go unconscious - Позволить ботам терять сознание - Czy AI może być nieprzytomne od odniesionych obrażeń? - Permita a la IA caer inconsciente - KI kann bewusstlos werden - Umožňuje AI upadnout do bezvědomí - Permite IA ficar inconsciente - Autoriser les IA à tomber inconscients - Engedélyezi az AI eszméletének elvesztését - Permetti alle IA di diventare incoscienti - AI が気絶をするように - 인공지능도 기절에 빠지게 합니다 - 允许AI进入无意识状态 - 允許AI進入無意識狀態 - - - Remote Controlled AI - Ferngesteuerte KI-Einheiten - IA controlada remotamente - IA controlada remotamente - Zdalnie sterowane AI - Vzdáleně ovládané AI - Contrôle à distance des IA - Távvezérelt AI - Зевса считать ботом - IA Controllate in Remoto - 遠隔操作された AI - 인공지능 원격조종 - 遥控AI - 遙控AI - - - Treat remote controlled units as AI not players? - Legt fest, ob ferngesteuerte Einheiten als KI anstatt als Spieler behandelt werden sollen. - ¿Tratar unidades remotamente controladas como IA? - Tratar unidades remotamente controladas como IA? - Traktuj jednostki zdalnie sterowane (przez Zeusa) jako AI, nie jako graczy? - Ošetřit vzdáleně ovládané jednotky jako AI, ne jako hráče? - Soigner les unitées controlées à distance comme des IA et non comme des joueurs? - Távvezérelt egységek AI-ként, nem játékosként való kezelése? - Обрабатывать дистанционно управляемых юнитов как ботов, а не как игроков? - Considera le unità controllate in remoto come IA e non come giocatori? - 遠隔操作された AI は、非プレイヤーとして扱いますか? - 원격 조작하는 AI는 비 플레이어로 취급합니까? - 以医疗AI的方式医疗被遥控的单位 - 以醫療AI的方式醫療被遙控的單位 - - - Prevent instant death - Откл. мгновенную смерть - Wyłącz natychmiastową śmierć - Prevenir muerte instantánea - Verhindere direkten Tod - Zabránit okamžité smrti - Previnir morte instantânea - Empêcher la mort instantanée - Azonnali halál kiiktatása - Previeni morte istantanea - 即死の防止 - 즉사 방지 - 防止当场死亡 - 防止當場死亡 - - - Have a unit move to unconscious instead of death - Бойцы теряют сознание вместо того, чтобы умирать - Spraw, aby jednostka została przeniesiona do stanu nieprzytomności zamiast ginąć na miejscu od śmiertelnych obrażeń - Mover una unidad a inconsciente en vez de a muerta - Lässt eine Einheit bewusstlos werden anstatt zu sterben - Jednotka upadne do bezvědomí namísto smrti - Fazer a unidade ficar inconsciente ao invés de morrer - Forcer l'inconscience au lieu de la mort instantanée - Egy egység kerüljön eszméletlen állapotba a halott helyett - Imposta un'unità come incosciente invece di morta - ユニットの即死を防止するために、気絶へ移行させます - 인원의 즉사를 방지코자 즉사 대신 기절시킵니다 - 伤者最严重只会立即进入昏迷,而非立即死亡 - 傷者最嚴重只會立即進入昏迷,而非立即死亡 - - - Bleeding coefficient - Коэффициент кровопотери - Mnożnik krwawienia - Coeficiente de sangrado - Verblutungsmultiplikator - Koeficient krvácení - Coeficiente de sangramento - Coéfficient de saignement - Vérzési koefficiens - Coefficiente sanguinamento - 出血の係数 - 출혈 계수 - 流血系数 - 流血係數 - - - Coefficient to modify the bleeding speed - Коэффициент, изменяющий скорость потери крови - Mnożnik modyfikujący prędkość wykrwawiania się - Coeficiente para modificar la velocidad de sangrado - Multiplikator um die Verblutungsgeschwindigkeit zu verändern - Koeficient rychlosti krvácení - Coeficiente para modificar a velocidade do sangramento - Modifie le débit des saignements - Egy szorzó a vérzés sebességének szabályozására - Coefficiente che modifica la velocità di sanguinamento - この係数では出血速度を変更できます - 출혈의 속도를 계수만큼 변경합니다 - 修改流血速度 - 修改流血速度 - - - Pain coefficient - Коэффициент боли - Mnożnik bólu - Coeficiente de dolor - Schmerzmultiplikator - Koeficient bolesti - Coeficiente de dor - Coéfficient de douleur - Fájdalmi koefficiens - Coefficiente dolore - 痛みの係数 - 고통 계수 - 疼痛系数 - 疼痛係數 - - - Coefficient to modify the pain intensity - Коэффициент, изменяющий уровень боли - Mnożnik modyfikujący intensywność bólu - Coeficiente para modificar la intensidad del dolor - Multiplikator um die Schmerzintensität zu verändern - Koeficient intenzity bolesti - Coeficiente para modificar a instensidade de dor - Modifie l'intensité de la douleur - Egy szorzó a fájdalom erősségének szabályozására - Coefficiente che modifica l'intensità del dolore - この係数では痛みの強さを変更できます - 고통의 정도를 계수만큼 변경합니다 - 修改疼痛强度的系数 - 修改疼痛強度的係數 - - - Sync status - Синхронизация статуса - Synchronizuj status - Sincronizador estado - Status synchronisieren - Synchronizovat status - Sincronizar estado - Synchronisation du status - Szinkronizációs állapot - Sincronizza stato - 同期状態 - 상태 동기화 - 同步状态 - 同步狀態 - - - Keep unit status synced. Recommended on. - Синхронизировать статус юнитов. Рекомендуется включить. - Utrzymuj synchronizację statusu jednostek. Zalecane zostawienie tej opcji włączonej. - Mantener el estado de la unidad sincronizado. Recomendado activado - Status der Einheit synchron halten. Sollte aktiviert bleiben. - Udržuje status jednotky synchronizovaný. Doporučeno zapnout. - Mater o estado da unidade sincronizado. Recomendado ativado. - Garder l'unité synchronisée. Activation recommandée. - Egységállapotok szinkronizálása. Javasolt a bekapcsolása. - Mantieni lo stato delle unità sincronizzato. Consigliato attivo. - ユニット状態の同期を続けます。有効化を推奨。 - 인원의 상태를 동기화합니다. 켜기를 권장합니다. - 保持单位状态同步,建议启用! - 保持單位狀態同步,建議啟用! - - - Provides a medical system for both players and AI. - Включает медицинскую систему как для игроков, так и для ботов. - Moduł ten dostarcza system medyczny dla graczy oraz AI. - Proporciona un sistema médico para jugadores e IA. - Aktiviert ein Sanitätssystem für Spieler und KI. - Poskytuje zdravotní systém pro hráče a AI. - Proporciona o sistema médico para os jogadores e a IA. - Fourni un système médical pour les joueurs et les IA. - Egy orvosi rendszert ad játékosok és AI-k számára. - Fornisce un sistema medico sia per giocatori che IA. - プレイヤーと AI の両方へ医療システムを提供します。 - 의료 시스템을 플레이어 및 인공지능에게 제공합니다. - 医疗系统将同时对玩家与AI发生作用。 - 醫療系統將同時對玩家與AI發生作用。 - - - Basic Medical Settings [ACE] - Standard Sanitätseinstellungen [ACE] - Podstawowe ustawienia medyczne - Ajustes médicos básicos [ACE] - Paramètres des soins basiques [ACE] - Impostazioni Mediche Di Base [ACE] - Základní zdravotnické nastavení [ACE] - Ajustes médicos básicos [ACE] - Настройки базовой медицины [ACE] - ベーシック医療設定 [ACE] - 기본 의료 설정 [ACE] - 基本医疗设定 [ACE] - 基本醫療設定 [ACE] - - - Advanced Medical Settings [ACE] - Настройки усложненной медицины [ACE] - Zaawansowane ustawienia medyczne - Ajustes médicos avanzados [ACE] - Erweiterte Sanitätseinstellungen [ACE] - Pokročilé zdravotnické nastavení [ACE] - Ajustes médicos avançados [ACE] - Paramètres des soins avancés - Fejlett orvosi beállítások [ACE] - Impostazioni Mediche Avanzate [ACE] - アドバンスド医療設定 [ACE] - 고급 의료 설정 [ACE] - 进阶医疗设定 [ACE] - 進階醫療設定 [ACE] - - + + Unconscious Wake Up Chance + Wahrscheinlichkeit um aufzuwachen + 気絶から覚醒の可能性 + Шанс очнуться при потере сознания + Chance de reprendre connaissance + Chance de recuperar consciência + 從無意識中甦醒機率 + ACE 从无意识中苏醒概率 + Chance di rialzarsi + Pravděpodobnost probuzení se z bezvědomí + Szansa na wybudzenie nieprzytomnego + Posibilidad de recuperar la conciencia + + + The probability that a person with stable vitals will wake up from unconsciousness (checked every 15 seconds). + Wahrscheinlichkeit, dass eine bewusstlose Person mit stabilen Vitalwerten wieder aufwacht (Überprüfung alle 15 Sekunden) + 容体が安定しているユニットが気絶する確率を決定できます。(15 秒毎に確認) + Вероятность, что стабилизированный юнит очнется от потери сознания (Проверяется каждые 15 сек) + La probabilité pour qu'une unité inconsciente en état stable reprenne conscience spontanément (état vérifié toutes les 15 secondes). + A probabilidade que uma unidade com vitais estabilizados possa recuperar consciências (verificado a cada 15 segundos) + 生命跡象穩定的單位從無意識狀態中甦醒的機率(每十五秒確認一次) + 生命迹象稳定的单位从无意识状态中苏醒的概率(每十五秒确认一次) + La probabilità che un'unità con i segni vitali stabili si risvegli dall'incoscienza (controllata ogni 15 secondi). + Pravděpodobnost, že se jednotka se stabilními životními známkami probudí z bezvědomí (zkoušeno každých 15 vteřin). + Prawdopodobieństwo, że jednostka ze stabilnymi parametrami życiowymi obudzi się z nieprzytomności (sprawdzane co 15 sekund). + La probabilidad de que una unidad estabilizada recupere la conciencia y se levante (se comprueba cada 15 segundos) + + + Epinephrine Wake Up Chance Boost + L'épinéphrine augmente les chances de réveil + Zwiększenie szansy na wybudzenie po podaniu epinefryny + 腎上腺素甦醒率加成 + 肾上腺素苏醒概率加成 + Erhöhung der Aufwachüberprüfungsrate durch Epinephrin + アドレナリン覚醒率の上昇 + Zvýšení pravděpodobnosti probuzení s Epinefrinem + Увеличение шанса очнуться от адреналина + + + Increases how often spontaneous wake up checks happen when patient has Epinephrine in their system. + 患者がアドレナリンを投与されると自発的に覚醒する確率を上昇させます。 + 增加因病患的循環系統裡面的腎上腺素自我甦醒的機率。 + 增加因病患的循环系统里面的肾上腺素自我苏醒的机率。 + Augmente la fréquence des tests de réveil lorsque le patient a de l'épinéphrine dans son système sanguin.\n(L'épinéphrine n'accélère pas la reprise de conscience si la valeur est définie sur 1.) + Aumenta la frequenza dei controlli al risveglio spontaneo quando il paziente ha l'Epinefrina nel suo corpo + Zvyšuje jak často je proveden test na probuzení z bezvědomí pokud má pacient Epinefrin ve svém krevním oběhu. + Zwiększa częstotliwość spontanicznych wybudzeń, gdy pacjent ma epinefrynę w swoim organizmie. + Aumenta o quão frequentemente checagens de acordar acontecem quando o paciente possui epinefrina no seu sistema + Incrementa con que frecuencia se comprueba el despertar cuando el paciente tiene epinefrina en su sistema + Erhöht wie oft Aufwachprüfungen passieren, wenn ein Patient Epinephrin im Blutkreislauf hat. + Увеличивает частоту проверок на спонтанное пробуждение, когда пациент под действием адреналина. + + + Limping + Хромота + 跛行 + Boitement + Mancando + 跛腳 + 跛脚 + Zoppicare + Kulhání + Kuśtykanie + Cojera + Humpeln + + + Controls whether open or bandaged wounds cause a person to limp. + 創傷開放か傷があると跛行するかどうかを決定できます。 + 控制裂開或者已包紮傷口是否會讓人跛腳。 + 控制裂开或者已包扎伤口是否会让人跛脚。 + Permet de définir si les plaies ouvertes ou pansées font boiter une personne. + Controlla se le ferite aperte o bendate fanno zoppicare una persona. + Nastavuje zda otevřená nebo zavázaná zranění způsobují kulhání. + Kontroluje, czy otwarte lub zabandażowane rany powodują utykanie jednostki. + Controla se ferimentos abertos ou enfaixados causam a pessoa a mancar + Controla si las heridas abiertas o vendadas hacen que una persona cojee. + Stellt ein, ob offene oder bandagierte Wunden eine Person zum Humpeln bringen. + Контролирует хромоту в случае открытых или забинтованных ран. + + + Limp on Open Wounds + Хромота при открытых ранах + 創傷開放時に跛行 + Boiter si plaies ouvertes + Mancar se possuir feridas abertas + 傷口裂開時跛腳 + 伤口裂开时跛脚 + Zoppo per via delle ferite aperte + Kulhat s otevřeným zraněním + Kuśtykanie przy otwartych ranach + Cojera en heridas abiertas + Humpeln bei offenen Wunden + + + Limp on Open or Bandaged Wounds + Хромота при открытых или забинтованых ранах + 手当した傷か創傷開放すると跛行 + Boiter si plaies ouvertes ou pansées + Mancar se possuir feridas abertas ou atadas + 使裂開或者包紮過的傷口讓人跛腳 + 使裂开或者包扎过的伤口让人跛脚 + Zoppicare su ferite aperte o bendate + Kulhat s otevřeným i zavázaným zraněním + Kuśtykanie przy otwartych ranach lub zabandażowanych ranach + Cojera en heridas abiertas o vendadas + Humpeln bei offenen oder bandagierten Wunden + + + Fractures + Переломы + 骨折 + Fractures + Fraturas + 骨折 + 骨折 + Fratture + Zlomeniny + Złamania + Fracturas + Brüche + + + Controls the effect of using splints to treat fractures.\nWhen disabled, injuries will not cause fractures. + 医療機能で骨折に添え木効果を使うかどうかを決定できます。\n無効化すると、骨折効果は表れません。 + 控制是否讓固定版能夠治療骨折。\n當停用時,受傷時不會導致骨折發生。 + 控制是否让固定版能够治疗骨折。 \n当停用时,受伤时不会导致骨折发生。 + Permet de définir le niveau d'efficacité des attelles pour le traitement des fractures.\nSi l'option est désactivée, les blessures ne causent pas de fractures. + Controlla l'effetto dell'utilizzo di stecche per curare le fratture. Quando disabilitato, le lesioni non causano fratture. + Nastavuje efekt dlahy při léčení zlomenin.\nPokud je tato možnost vypnuta, zranění nebudou způsobovat zlomeniny. + Kontroluje efekt użycia szyn do leczenia złamań.\n Po wyłączeniu obrażenia nie powodują złamań. + Controla o efeito de uso de talas para tratar fraturas. \nQunado desabilitado, ferimentos não causam fraturas. + Controla el efecto del uso de férulas para tratar fracturas. \n Cuando está desactivado, las lesiones no causan fracturas. + Kontrolliert den Effekt wenn Schienen verwendet werden, um Knochenbrüche zu behandeln.\nWenn diese Einstellung nicht aktiviert ist, verursachen Verletzungen keine Knochenbrüche. + Управляет эффектом использования шин для лечения переломов.\nПри отключении травмы не вызывают переломов. + + + Splints Fully Heal Fractures + Шины полностью лечат перелом + 添え木で骨折完治 + Les attelles guérissent complètement les fractures + Tala cura fraturas completamente + 固定板完全治癒骨折 + 固定板完全治愈骨折 + Le gessature curano al massimo le fratture + Dlahy kompletně léčí zlomeniny + Szyny leczą zupełnie złamania + Férulas sanan completamente las fracturas + Schienen heilen Knochenbrüche vollständig + + + Splints Heal, but Cannot Sprint + Шины вылечивают, но не дают бегать + 添え木で治癒可能、走れないように + Les attelles guérissent les fractures, mais empêchent de sprinter + Talas curam (mas não consegue correr) + 固定版能治癒骨折,但無法奔跑 + 固定版能治愈骨折,但无法奔跑 + Le gessature curano, ma non puoi correre + Dlahy léčí, ale zněmožňují sprintování + Szyny leczą, ale uniemożliwiają sprint + Las férulas sanan, pero no pueden correr + Schienen heilen, aber ermöglichen kein Sprinten + + + Fracture Chance + Chance de fracture + 骨折確率 + 骨折概率 + Šance na zlomeninu + Шанс перелома + Szansa na złamanie + + + The probability of a fracture causing wound resulting in a fracture. + La probabilité pour qu'une blessure pouvant causer une fracture en crée effectivement une. + 骨折の原因となる負傷で骨折する確率を決定します。 + 骨折导致的伤口再次骨折的可能性。 + Výška šance kdy zranění způsobující zlomeniny skutečně způsobí zlomeninu. + Вероятность перелома при получении соответствующих ран. + Prawdopodobieństwo złamania kości w wyniku rany mogącej powodować złamania. + + Enabled for Включено для Aktywne dla @@ -4342,7 +217,7 @@ 被启用给 被啟用給 - + Select what units the advanced medical system will be enabled for Выберите, на кого будет распространяться усложненная система медицины Wybierz dla kogo zaawansowany system medyczny będzie aktywny @@ -4350,9 +225,9 @@ Wähle aus, welche Einheiten unter das erweiterte Sanitätssystem fallen Vyberte, pro jaké jednotky bude pokročilý zdravotní systém povolen Selecione quais unidades o sistema médico avançado será habilitado - Sélectionne pour quelles unités les soins avancés seront activés + Sélectionne pour quelles unités les soins avancés seront actifs. Kiválasztható, mely egységek számára legyen engedélyezve a fejlett orvosi rendszer - Seleziona per quali unità verrà abilitato i sistema medico avanzato + Seleziona per quali unità verrà abilitato il sistema medico avanzato 選択されたユニットが、アドバンスド医療が使えるようになります 어느 인원에게 고급 의료 시스템을 적용시킬지 선택하십시요. 选择进阶医疗系统影响的对象 @@ -4390,47 +265,15 @@ 玩家与AI 玩家與AI - - Enable Advanced wounds - Усложненные раны - Aktywuj zaawansowane rany - Activa heridas avanzadas - Aktiviere erweiterte Wunden - Povolit pokročilé zranění - Ativar ferimentos avançados - Activer les plaies compliquées - Komplex sebek engedélyezése - Abilita ferite Avanzate - アドバンスドな傷を有効化 - 고급 부상 활성화 - 启用进阶伤口系统 - 啟用進階傷口系統 - - - Allow reopening of bandaged wounds? - Будут ли открываться уже перевязанные раны? - Pozwól na otwieranie się zabandażowanych ran? - Permitir la reapertura de las heridas vendadas? - Erlaube das Öffnen von bandagierten Wunden? - Umožnit znovuotevření zavázané rány? - Permitr reabertura de ferimentos enfaixados? - Les plaies peuvent se rouvrir - Visszanyílhatnak a bekötözött sebek? - Permetti la riapertura di ferite bendate? - 包帯で巻かれた傷を再び開くようにしますか? - 붕대가 풀리는것을 활성화합니까? - 启用进阶伤口系统会使已被包扎的伤口有机率裂开 - 啟用進階傷口系統會使已被包紮的傷口有機率裂開 - - + Vehicle Crashes Аварии транспорта Obrażenia od kolizji Accidentes de vehículos Fahrzeugunfälle Poškození z kolize - Colisão de veículos - Accident en véhicule + Batidas de veículos + Accidents en véhicule Járműbalesetek Schianto Veicoli 車両の衝突 @@ -4438,15 +281,15 @@ 载具碰撞 載具碰撞 - + Do units take damage from a vehicle crash? Должны ли юниты получать повреждения от аварий на транспорте? Czy jednostki otrzymują obrażenia w wyniku kolizji pojazdów? ¿Las unidades reciben daño de un accidente de tráfico? Verursacht ein Fahrzeugunfall Verletzungen Dostane jednotka poškození při autonehodě? - As unidades recebem dano de uma colisão de veículo? - Les unités subissent des dégats lors d'accident + As unidades recebem dano de uma batida de veículo? + Définit si les unités subissent des dégâts en cas d'accidents en véhicule. Sérülnek-e az egységek autós ütközés során? Le unità sostengono danni da incidenti con veicoli? ユニットは車両の衝突による損傷を受けるようにしますか? @@ -4454,1006 +297,6 @@ 设定人员是否会因为载具冲撞别的物件而产生伤害? 設定人員是否會因為載具衝撞別的物件而產生傷害? - - Allow Epinephrine - Erlaube Epiniphrin - Permitir Epinefrina - Ograniczenia adrenaliny - Activer l'épinéphrine - Permette epinefrina - Povolit adrenalin - Permitir epinefrina - Разрешить Адреналин - アドレナリンの許可 - 에피네프린 활성화 - 允许使用肾上腺素 - 允許使用腎上腺素 - - - Who can use Epinephrine for full heal? (Basic medical only) - Wer darf Epiniphrin zur vollständigen Heilung benutzen? (Standard Sanitätseinstellungen) - Configura quienes pueden usar Epinefrina (Solo sistema médico básico) - Kto może skorzystać z adrenaliny w celu pełnego uleczenia? (Tylko podstawowy system medyczny) - Qui peut utiliser l'adrénaline pour les soins complets ? (Médical basique seulement) - Chi può usare l'epinefrina per la cura completa? (solo per sistema medico di base) - Kdo může použít adrenalin k úplnému vyléčení? (Pouze základní zdravotní systém) - Quem pode usar epinefrina para cura completa? (Somente sistema médico básico) - Кому разрешено использовать адреналин для полного излечения? (Только для базовой медицины) - 完全に回復できるよう誰しもがアドレナリンを使えるようにしますか? (ベーシック医療のみ) - 완전한 체력회복을 위해 어느 인원이 에피네프린을 쓸 수 있습니까? (기본 의료 전용) - 谁可以使用肾上腺素完整医治? (仅适用于基本医疗) - 誰可以使用腎上腺素完整醫治? (僅適用於基本醫療) - - - Allow PAK - Использование аптечки - Ustawienie apteczek osobistych - Permitir EPA - Erlaube Erste-Hilfe-Set - Povolit osobní lékárničky (PAK) - Permitir Kit de Primeiros Socorros - Activer la trousse sanitaire - Elsősegélycsomag engedélyezése - Consenti Kit di Pronto Soccorso - 応急処置キットの許可 - 개인응급키트 활성화 - 允许使用个人急救包 - 允許使用個人急救包 - - - Who can use the PAK for full heal? - Кому разрешено выполнять полное лечение с помощью аптечки? - Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? - ¿Quién puede utilizar el EPA para una cura completa? - Wer kann das Erste-Hilfe-Set für eine Endheilung verwenden? - Kdo může použít osobní lékárničku pro plné vyléčení? - Quem pode usar o KPS para cura completa? - Qui peut utilier la trousse sanitaire pour des soins complets? - Ki használhatja az elsősegélycsomagot teljes gyógyításra? - Chi può usare il KPS per cura completa? - 完全に回復できるよう誰しもが応急処置キットを使えるようにしますか? - 완전한 체력회복을 위해 어느 인원이 개인응급키트을 쓸 수 있습니까? (기본 의료 전용) - 谁能够使用个人急救包来达到完整医疗? - 誰能夠使用個人急救包來達到完整醫療? - - - Anyone - Кем угодно - Wszyscy - Nadie - Jeder - Kdokoliv - Qualquer um - Tous - Akárki - Chiunque - だれでも - 모두 - 任何人 - 任何人 - - - Medics only - Только медиками - Tylko medycy - Solo médicos - Nur Sanitäter - Pouze zdravotník - Somente médicos - Infirmiers uniquement - Csak orvosok - Solo medici - 衛生兵のみ - 의무병만 - 只限医疗兵 - 只限醫療兵 - - - Doctors only - Только врачами - Tylko doktorzy - Solo doctores - Nur Ärzte - Pouze doktor - Somente doutores - Médecins uniquement - Csak doktorok - Solo dottori - 医師のみ - 의사만 - 只限军医 - 只限軍醫 - - - Remove PAK on use - Удалять аптечки после использования - Usuń apteczkę po użyciu - Eliminar EPA después del uso - Entf. Erste-Hilfe-Set bei Verwendung - Odebrat osobní lékárničku po použití - Remover o KPS após uso - Utilisation unique de la trousse sanitaire - Elsősegélycsomag eltávolítása használatkor - Rimuovi Kit Pronto Soccorso dopo l'uso - 応急処置キットの削除 - 개인응급키트 사용후 사라짐 - 在使用后删除个人急救包 - 在使用後刪除個人急救包 - - - Should PAK be removed on usage? - Нужно ли удалять аптечки после использования? - Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? - El EPA será eliminado después de usarlo - Sollen Erste-Hilfe-Sets bei Verwendung entfernt werden? - Má se osobní lékárnička odstranit po použití? - Deve o KPS ser removido após seu uso? - La trousse sanitaire doit être consommée à l'utilisation? - Eltávolítódjon az elsősegélycsomag használatkor? - Il Kit Pronto Soccorso dev'essere rimosso dopo l'utilizzo? - 応急処置キットを使うと削除しますか? - 개인응급키트를 사용하고 나서 제거합니까? - 要在使用后删除个人急救包吗? - 要在使用後刪除個人急救包嗎? - - - Locations Epinephrine - Orte für Epiniphrin - Ubicaciones epinefrina - Ograniczenia adrenaliny - Utilisation de l'épinéphrine - Ubicazione epinefrina - Oblast k použití adrenalinu - Localizações de epinefrina - Место использования адреналина - アドレナリンをつかう場所 - 에피네프린 사용 장소 - 肾上腺素使用地点 - 腎上腺素使用地點 - - - Where can the Epinephrine be used? (Basic Medical) - Wo kann Epiniphrin verwendet werden? (Standard Sanitätseinstellungen) - Configura donde puede usarse Epinefrina (Solo sistema médico básico) - Gdzie można korzystać z adrenaliny? (Podstawowy system medyczny) - Où peut être utilisé l'épinéphrine ? (Médical basique) - Dove si può usare l'epinefrina? (Sistema medico di base) - Kde může být použit adrenalin? (Pouze základní zdravotní systém) - Onde pode-se usar a epinefrina? (Somente sistema médico básico) - Где может использоваться адреналин? (Базовая медицина) - どこでもアドレナリンをつかえるようにしますか? (ベーシック医療のみ) - 어디에서 에피네프린을 사용할 수 있습니까? (기본 의료) - 在哪里可以使用肾上腺素? (基本医疗) - 在哪裡可以使用腎上腺素? (基本醫療) - - - Locations PAK - Место использования аптечки - Ograniczenie apteczek osobistych - Ubicaciones del EPA - Orte für Erste-Hilfe-Set - Oblast k použití PAK - Localizações do KPS - Lieu d'utilisation da trousse sanitaire - Elsősegélycsomag helyek - Locazioni Kit Pronto Soccorso - 応急処置キットをつかう場所 - 개인응급키트 사용 장소 - 个人急救包使用地点 - 個人急救包使用地點 - - - Where can the PAK be used? - Где может использоваться аптечка? - Gdzie można korzystać z apteczek osobistych? - ¿Dónde se puede utilizar el equipo de primeros auxilios? - Wo kann das Erste-Hilfe-Set verwendet werden? - Kde může být použita osobní lékárnička (PAK)? - Onde o kit de primeiros socorros pode ser utilizado? - Où la trousse sanitaire peut être utilisée ? - Hol lehet az elsősegélycsomagot használni? - Dove può essere usato il Kit Pronto Soccorso? - どこでも応急処置キットをつかえるようにしますか? - 어디에서 개인응급키트를 사용할 수 있습니까? - 在哪里可以使用个人急救包? - 在哪裡可以使用個人急救包? - - - Condition PAK - Bedingungen für d. Erste-Hilfe-Set - Podmínky pro použití osobní lékárničky - Condición EPA - Condition d'utilisation de la trousse sanitaire - Warunek apteczek - Elsősegélycsomag állapot - Condição do KPS - Условие использования аптечки - Condizioni Kit Pronto Soccorso - 応急処置キットの状態 - 개인응급키트 상태 - 个人急救包使用条件 - 個人急救包使用條件 - - - When can the PAK be used? - Wann kann das Erste-Hilfe-Set verwendet werden? - Kdy může být použita osobní lékárnička? - ¿Cuando se puede utilizar el Equipo de primeros auxilios? - Quand peut être utilisé la trousse sanitaire? - Po spełnieniu jakich warunków apteczka osobista może zostać zastosowana na pacjencie? - Mikor lehet az elsősegélycsomagot használni? - Onde o kit de primeiros socorros pode ser utilizado? - Когда может использоваться аптечка? - Quando può essere usato il Kit Pronto Soccorso? - どこでも応急処置キットをつかえるようにしますか? - 언제 개인응급키트를 사용할 수 있습니까? - 何时可以使用个人急救包? - 何時可以使用個人急救包? - - - Anywhere - Где угодно - Wszędzie - Donde sea - Überall - Kdekoliv - Qualquer lugar - Partout - Akárhol - Ovunque - どこでも - 어디서나 - 任何地方 - 任何地方 - - - Medical vehicles - В медицинском транспорте - Pojazdy medyczne - Vehiculos médicos - Sanitätsfahrzeuge - Zdravotnická vozidla - Veículos médicos - Dans les véhicules sanitaires - Orvosi járművek - Veicoli medici - 医療車両のみ - 의료차량 - 医疗载具 - 醫療載具 - - - Medical facility - В госпитале - Budynki medyczne - Centro médico - Medizinische Einrichtungen - Zdravotnické zařízení - Instalação médica - Dans les structures sanitaires - Orvosi létesítmény - Strutture mediche - 医療施設でのみ - 의료시설 - 医疗设施 - 醫療設施 - - - Vehicles & facility - В транспорте и госпитале - Pojazdy i budynki medyczne - Vehículos y centros - Fahrzeuge & Einrichtungen - Vozidla a zařízení - Veículos e instalações - Dans les véhicules et les structures sanitaires - Járművek & létesítmény - Veicoli e Strutture - 車両 & 施設 - 차량 및 시설 - 医疗载具 & 医疗设施 - 醫療載具 & 醫療設施 - - - Allow Surgical Kit (Adv) - Хирургический набор может использоваться (усл.) - Ustawienia zestawu chirurgicznego - Permitir equipo quirúrgico (Avanzado) - Erlaube Operationskasten - Povolit chirurgickou soupravu (Pokr.) - Permite kit cirúrgico (avançado) - Permettre les trousses chirurgicales (Avancé) - Sebészkészlet (Fejlett) engedélyezése - Permetti Kit Chirurgico (Avanzato) - 縫合キットの許可 (アド) - 봉합키트 활성화 (고급) - 允许使用手术包 (进阶伤口) - 允許使用手術包 (進階傷口) - - - Who can use the Surgical Kit? - Кто может использовать хирургический набор? - Kto może skorzystać z zestawu chirurgicznego w celu zszycia ran? - ¿Quién puede utilizar el equipo quirúrgico? - Wer kann den Operationskasten verwenden? - Kdo může použít chirurgickou soupravu? - Quem pode usar o kit cirúrgico? - Qui peut utiliser les trousses chirurgicales? - Ki használhatja a sebészkészletet? - Chi può usare il Kit Chirurgico? - だれでも縫合キットをつかえるようにしますか? - 어느 인원이 봉합키트를 사용할 수 있습니까? - 谁能够使用手术包? - 誰能夠使用手術包? - - - Remove Surgical Kit (Adv) - Удалять хирургический набор (усл.) - Usuń zestaw chirurgiczny po użyciu - Eliminar equipo quirúrgico (Avanzado) - Entferne Operationskasten (erweitert) - Odebrat chirurgickou soupravu (Pokr.) - Remover kit cirúrgico (avançado) - Consommer les trousses chirurgicales (Av.) - Sebészkészlet (Fejlett) eltávolítása - Rimuovi Kit Chirurgico (Avanzato) - 縫合キットを削除 (アド) - 봉합키트 제거 (고급) - 在使用后删除手术包 (进阶伤口) - 在使用後刪除手術包 (進階傷口) - - - Should Surgical kit be removed on usage? - Нужно ли удалять хирургический набор после использования? - Czy zestaw chirurgiczny powinien zniknąć z ekwipunku po jego użyciu? - Eliminar el equipo quirúrgico después del uso - Entferne Operationskästen bei Verwendung? - Odebrat chirurgickou soupravu po použití? - Deve o kit cirúrgico ser removido após seu uso? - La trousse chirurgicale doit être consommée à l'utilisation? - Eltávolítódjon a sebészkészlet használatkor? - Il Kit Chirurgico dev'essere rimosso dopo l'uso? - 縫合キットをつかった後に削除しますか? - 봉합키트를 사용하고 나서 제거합니까? - 手术包会在使用后被删除吗? - 手術包會在使用後被刪除嗎? - - - Locations Surgical Kit (Adv) - Место использования хирургического набора (усл.) - Ograniczenie zestawu chirurgicznego - Ubicaciones del equipo quirúrgico (Avanzado) - Orte für Operationskästen (erweitert) - Lokace chirurgické soupravy (Pokr.) - Localizações do kit cirúrgico (avançado) - Lieu d'utilisation des trousses chirurgicales - Sebészkészlet (Fejlett) helyei - Località Kit Chirurgico (Avanzato) - 縫合キットをつかう場所 (アド) - 봉합키트 사용 장소 (고급) - 手术包使用地点 (进阶伤口) - 手術包使用地點 (進階傷口) - - - Where can the Surgical Kit be used? - Где может использоваться хирургический набор? - Gdzie można korzystać z zestawu chirurgicznego? - Dónde se puede utilizar el equipo quirúrgico - Wo kann der Operationskasten verwendet werden? - Kde může být použita chirurgická souprava? - Onde o kit cirúrgico pode ser utilizado? - Où peut être utilisé les trousses chirurgicales? - Hol lehet a sebészkészletet használni? - Dove può essere usato il Kit Chirurgico? - どこでも縫合キットをつかえるようにしますか? - 어디에서 봉합키트를 사용할 수 있게 합니까? - 定义手术包可被使用的地方? - 定義手術包可被使用的地方? - - - Condition Surgical Kit (Adv) - Beding. für d. Operationskasten (erw.) - Podmínka chirurgické soupravy (Pokr.) - Condición de equipo quirúrgico (Av) - Conditions d'utilisation de la trousse chirurgicale (Av.) - Warunek zestawu chirurgicznego - Sebészkészlet állapot - Condição do Kit Cirúrgico (Avançado) - Условие использования хирургического набора (усл.) - Condizioni Kit Chirurgico (Avanzato) - 縫合キットの状態 (アド) - 봉합키트 상태 (고급) - 使用手术包的条件 (进阶伤口) - 使用手術包的條件 (進階傷口) - - - When can the Surgical Kit be used? - Wann kann der Operationskasten verwendet werden? - Kde může být použita chirurgická souprava? - ¿Cuando se puede utilizar el equipo quirúrgico? - Quand peut être utilisé la trousse chirurgicale - Po spełnieniu jakich warunków zestaw chirurgiczny może zostać zastosowany na pacjencie? - Mikor lehet a sebészkészletet használni? - Onde o kit cirúrgico pode ser utilizado? - Когда может использоваться хирургический набор? - Quando può essere usato il Kit Chirurgico? - いつでも縫合キットをつかえるようにしますか? - 언제 봉합키트를 사용할 수 있습니까? - 何时可以使用手术工具包? - 何時可以使用手術工具包? - - - Heal hitpoints - Heile Trefferpunkte - Lecz hitpointy - Curar puntos de vida - Исцелять части тела - Curar pontos de vida - Léčit hitponty - Cura Hitpoints - Soigner les blessures - ヒットポイントの回復 - 체력 회복 - 完整治疗 - 完整治療 - - - Heal fully bandaged hitpoints - Heile verbundene Trefferpunkte - Po bandażowaniu ulecz hitpointy, usuwając z nich ślady krwi i przywracając im pełną sprawność. - Curar miembros totalmente vendados - Исцелять полностью перебинтованные части тела - Curar totalmente pontos de vida enfaixados - Heal fully bandaged hitpoints - Cura Hitpoints completamente bendati - Soigner les plaies entièrement bandées. - 包帯によりヒットポイントを完全に回復する - 붕대를 감아서 체력을 회복 - 完全医疗包扎的部位至痊愈 - 完全醫療包紮的部位至痊癒 - - - Pain suppression - Schmerzunterdrückung - Zwalczanie bólu - Potlačení bolesti - Supresión del dolor - Supressão de dor - Traitement de la douleur - Fájdalomcsillapítás - Приглушение боли - Soppressione dolore - 痛みの継続 - 고통 억제 - 疼痛抑制 - 疼痛抑制 - - - Pain is only temporarily suppressed, not removed - Schmerzen werden nur vorübergehend unterdrückt, nicht deren Ursache geheilt. - Ból jest tylko tymczasowo zwalczany, nie jest usuwany trwale - Bolest je potlačena, ale jen dočastně - El dolor se suprime solo temporalmente, no se elimina. - Dor é somente temporariamente suprimida, não removida - La douleur est seulement temporairement calmée - A fájdalom csak ideiglenesen csökken, nem távolítódik el - Боль приглушается только временно - Dolore è solo temporaneamente soppresso, non rimosso - 痛みを一時的に継続させ、取り除かない - 고통은 제거가 아닌 일시적으로 억제만 가능합니다. - 疼痛只会被暂时抑制,而不能完全消除 - 疼痛只會被暫時抑制,而不能完全消除 - - - Configure the treatment settings from ACE Basic Medical - Behandlungseinstellungen der Standard ACE-Medizin konfigurieren - Configure las opciones de tratamiento del sistema médico básico de ACE - Skonfiguruj ustawienia leczenia podstawowego systemu medycznego ACE - Configure les réglages de traitement dans ACE médical basique - Configura le impostazioni trattamenti per ACE Medical di base - Configura as opções de tratamento do sistema médico básico do ACE - Настройка лечения в базовой медицинской системе ACE - ACE ベーシック医療による設定で、治療を設定する - ACE 기본 의료에 대한 치료 설정 수정 - 设定ACE基本医疗的规则 - 設定ACE基本醫療的規則 - - - Configure the treatment settings from ACE Advanced Medical - Настройка лечения в усложненной медицинской системе ACE - Skonfiguruj zaawansowane ustawienia leczenia systemu medycznego ACE - Configure las opciones de tratamiento del sistema médico avanzado de ACE - Behandlungseinstellungen vom ACE-Medizin konfigurieren - Konfigurace nastavení léčby ze zdravotnické systému ACE - Configure as opções de tratamento do ACE Médico - Configure les réglages de traitement dans dans ACE médical avancé - Kezelési lehetőségek konfigurálása az ACE Orvosi rendszerből - Configura le impostazioni trattamenti per ACE Medical - ACE アドバンスド医療による設定で、治療を設定する - ACE 고급 의료에 대한 치료 설정 수정 - 设定ACE进阶医疗的规则 - 設定ACE進階醫療的規則 - - - Revive Settings [ACE] - Настройки реанимации [ACE] - Ustawienia wskrzeszania - Sistema de resucitado [ACE] - Wiederbelebungseinstellungen [ACE] - Nastavení oživení [ACE] - Sistema de reavivamento [ACE] - Paramètre du revive [ACE] - Újraélesztés beállításai [ACE] - Impostazioni Revive [ACE] - リバイブ設定 [ACE] - 소생 설정 [ACE] - 复苏设定 [ACE] - 復甦設定 [ACE] - - - Enable Revive - Включить реанимацию - Aktywuj wskrzeszanie - Habilitar resucitado - Erlaube Wiederbelebung - Povolit oživení - Habilitar reavivamento - Activer le revive - Újraélesztés engedélyezése - Abilita Revive - リバイブを有効化 - 소생 활성화 - 启用复苏 - 啟用復甦 - - - Enable a basic revive system - Включить базовую систему реанимации - Aktywuj podstawowy system wskrzeszania - Habilitar un sistema básico de resucitado - Aktiviere Standard-Wiederbelebungssystem - Povolit základní systém oživení - Habilitar um sistema básico de reavivamento - Active un système de revive basique - Egy alap újraélesztési rendszer engedélyezése - Abilita un sistema revive basico - ベーシックなリバイブを有効化 - 기본 소생 시스템 활성화 - 启用基本复苏系统 - 啟用基本復甦系統 - - - Max Revive time - Макс. время реанимации - Maksymalny czas agonii - Tiempo máximo de resucitado - Maximale Wiederbelebungszeit - Maximální čas pro oživení - Tempo máximo de reavivamento - Délai maximum pour le revive - Maximum újraélesztési idő - Tempo massimo Revive - 最大リバイブ時間 - 최대 소생 시간 - 最大复苏时间 - 最大復甦時間 - - - Max amount of seconds a unit can spend in revive state - Максимальное время в секундах, в течение которого бойца можно реанимировать - Maksymalna długość agonii w sekundach (czas na wskrzeszenie) - Cantidad máxima de segundos que una unidad puede gastar en estado de resucitación - Maximale Zeitspanne in Sekunden die eine Einheit im Wiederbelebungszustand verbringen kann - Maximální doba v agónii v sekundách - Quantidade máxima de segundos que uma unidade pode gastar em um estado de reavivamento - Délai d'attente maximum pour un revive - Maximum másodperc, amit egy egység újraélesztési állapotban tölthet - Numero massimo di secondi che un'unità può spendere in stato revive - ユニットがリバイブ状態になっている最大時間を設定できます - 소생상태에서 인원이 버틸 수 있는 최대 시간을 초 단위로 정합니다 - 人员在等待复苏状态下能够等待的最大时间(秒) - 人員在等待復甦狀態下能夠等待的最大時間(秒) - - - Max Revive lives - Макс. кол-во жизней - Maks. ilość wskrzeszeń - Vidas máximas de resucitado - Maximale Anzahl der Wiederbelebungen - Maximální počet oživení - Vidas máximas do reavivado - Nombre maximum de revive - Maximum újraélesztési lehetőségek - Numero massimo Revives - 最大リバイブ数 - 최대 소생 횟수 - 最大被救活次数 - 最大被救活次數 - - - Max amount of lives a unit. 0 or -1 is disabled. - Максимальное количество жизней у бойца. Чтобы отключить, укажите 0 или -1. - Maksymalna ilość wskrzeszeń. Wpisz 0 lub -1 aby wyłączyć. - Cantidad máxima de vidas por unidad. 0 o -1 es desactivado. - Anzahl der Leben einer Einheit. 0 oder -1 bedeutet deaktiviert. - Maximální počet životu pro jednotku. 0 nebo -1 je zakázáno. - Quantidade máxima de vidas por unidade. 0 ou -1 é desativado. - Nombre de vie maximum d'une unité. 0 ou -1 désactive - Egy egység maximum "életei". 0 vagy -1 letiltja. - Numero massimo di vite di un'unità. 0 o -1 per disabilitare. - ユニットの最大リバイブ数を設定できます。0 または -1 は無効化になります - 소생 가능한 횟수입니다. 0 혹은 -1 로 비활성화 합니다 - 一个人员最大可被救活次数,0或-1为关闭 (无限救活) - 一個人員最大可被救活次數,0或-1為關閉 (無限救活) - - - Provides a medical system for both players and AI. - Включает медицинскую систему как для игроков, так и для ботов. - Moduł ten aktywuje podstawowy system wskrzeszania. Jednostka po otrzymaniu śmiertelnych obrażeń przechodzi do stanu agonii, która trwa określoną długość czasu. W tym czasie aby wskrzesić i jednocześnie odratować jednostkę należy opatrzeć jej rany i wykonać RKO. - Proporciona un sistema médico para jugadores e IA. - Aktiviert das Sanitätssystem für Spieler und KI. - Poskytuje zdravotní systém pro hráče a AI. - Proporciona um sistema médico para jogadores e IA. - Fourni un sytème médical pour les joueurs et les IA. - Egy orvosi rendszert ad játékosok és AI-k számára. - Fornisce un sistema medico sia per giocatori che IA - プレイヤーと AI の両方へ医療システムを提供します。 - 플레이어와 인공지능 모두에게 의료 시스템을 지원합니다. - 医疗系统将同时作用在玩家与AI - 醫療系統將同時作用在玩家與AI - - - Set Medic Class [ACE] - Сделать медиком [ACE] - Ustaw klasę medyka - Establecer case médica [ACE] - Setze Sanitäterklassen [ACE] - Určit třídu medika [ACE] - Definir classe médica [ACE] - Définir classe médicale [ACE] - Orvos beállítása [ACE] - Imposta Classe Medico [ACE] - 衛生兵クラスとして設定 [ACE] - 의무병 보직 설정 [ACE] - 设定医疗兵单位 [ACE] - 設定醫療兵單位 [ACE] - - - List - Список - Lista - Lista - Liste - Seznam - Lista - Liste - Lista - Lista - 一覧 - 목록 - 列表 - 列表 - - - List of unit names that will be classified as medic, separated by commas. - Список имен юнитов, которые будут считаться медиками (через запятую). - Lista nazw jednostek, które są sklasyfikowane jako medycy, oddzielone przecinkami. - Lista de los nombres de las unidades que se clasifican como médico, separados por comas. - Aufzählung von Einheiten, die als Sanitäter gelten. Werden durch Kommata getrennt. - Seznam osob které budou klasifikovány jako zdravotník, oddělené čárkami. - Lista dos nomes das unidades que se classificam como médicos, separados por vírgulas. - Liste d'unité qui seront qualifiés comme infirmier, séparation par virgule. - Azon egységek nevei, melyek orvosként vannak meghatározva, vesszővel elválasztva. - Lista di nomi unità che verranno classificati come medici, separati da virgole. - 衛生兵として設定されるユニット名を一覧で指定でき、コンマで区切りを付けられます。 - 보직 이름 목록으로 의무병이 구분됩니다, 쉼표로 구분. - 列出的单位名字将被指派为医疗兵,记得用逗号隔开! - 列出的單位名字將被指派為醫療兵,記得用逗號隔開! - - - Is Medic - Является медиком - Klasa medyczna - Es médico - Ist Sanitäter - Je zdravotník - É médico - Est infirmier - Orvos-e - E' Medico - 衛生兵として - 의무병 - 是医疗兵 - 是醫療兵 - - - This module allows you to assign the medic class to selected units. - Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. - Dieses Modul legt fest, welche Einheiten Sanitäter sind. - Tento modul určuje, která jednotka je zdravotník. - Este módulo determina qual unidade é um paramédico. - Ce module permet d'assigner la classe médicale à une unité sélectionnée - Ez a modul engedélyezi az orvosi jelző hozzárendelését kiválasztott egységekhez. - Этот модуль позволяет назначить класс медика выбранным юнитам. - Este módulo permite asignar la clase médico a las unidades seleccionadas. - Questo modulo ti permette di assegnare la classe Medico alle unità selezionate. - 選択されたユニットを衛生兵として指定します。 - 이 모듈은 선택한 보직이 의무병을 할 수 있게 해줍니다. - 本模块可让被同步的单位成为医疗兵 - 本模塊可讓被同步的單位成為醫療兵 - - - None - Нет - Żadna - Nada - Keine - Žádný - Nada - Aucun - Nincs - Nessuno - なし - 없음 - - - - - Regular medic - Обычный медик - Zwykły medyk - Médico regular - Normaler Sanitäter - Řadový zdravotník - Médico regular - Infirmier - Hagyományos orvos - Medico Regolare - 通常の衛生兵 - 일반 의무병 - 普通医疗兵 - 普通醫療兵 - - - Doctor (Only Advanced Medics) - Врач (только усложн.) - Doktor (tylko zaawansowani medycy) - Doctor (Solo medicina avanzada) - Arzt (Nur erweitertes Sanitätssystem) - Doktor (Pouze pokročilý zdravotníci) - Doutor (Somente médicos avançados) - Médecin (traitements avancés uniquement) - Doktor (csak fejlett orvosok) - Dottore (Solo Medici Avanzati) - 医師 (アドバンスド医療のみ) - 의사 (오직 고급 의료에서만) - 军医 (只限进阶医疗系统) - 軍醫 (只限進階醫療系統) - - - Doctor - Врач - Doktor - Doctor - Arzt - Doktor - Doutor - Médecin - Doktor - Dottore - 医師 - 의사 - 军医 - 軍醫 - - - Assigns the ACE medic class to a unit - Задает юниту класс медика - Moduł ten przypisuje klasę medyka ACE do jednostek. - Asigna la clase médico ACE a una unidad - Weise die ACE-Sanitäterklasse einer Einheit zu. - Přiřadí ACE třídu zdravotníka do jednotky - Atribui a classe médica do ACE a uma unidade - Assigner la classe médicale à une unité - Az ACE orvosi jelző hozzárendelése egy egységhez - Assegna la classe medico ACE ad un'unità - ユニットを ACE の衛生兵として割り当てる - 인원에게 ACE 의무병 보직 선정 - 指派ACE医疗职位给该单位 - 指派ACE醫療職位給該單位 - - - Set Medical Vehicle [ACE] - Сделать мед. транспортом [ACE] - Ustaw pojazd medyczny - Establecer vehículos médicos [ACE] - Setze Sanitätsfahrzeug [ACE] - Určit zdravotnické vozidlo [ACE] - Definir veículo médico [ACE] - Définir comme véhicule médical [ACE] - Orvosi jármű beállítása [ACE] - Imposta Veicolo Medico [ACE] - 医療車両を設定 [ACE] - 의료 차랑 선정 [ACE] - 设定医疗载具 [ACE] - 設定醫療載具 [ACE] - - - List - Список - Lista - Lista - Liste - Seznam - Lista - Liste - Lista - Lista - 一覧 - 목록 - 列表 - 列表 - - - List of vehicles that will be classified as medical vehicle, separated by commas. - Список транспортных средств, которые будут считаться медицинским транспортом (через запятую). - Lista nazw pojazdów, które są sklasyfikowane jako pojazdy medyczne, oddzielone przecinkami. - Lista de los vehículos que se clasifican como vehículo médicos, separados por comas. - Aufzählung von Fahrzeugen, die als Sanitätsfahrzeug gelten. Werden durch Kommata getrennt. - Seznam vozidel které budou klasifikovány jako zdravotnická vozidla, oddělené čárkami. - Lista de veículos que serão classificados como veículos médicos, separados por vírgulas. - Liste de véhicule classé comme véhicule médical, séparation par virgule. - Orvosi járműveknek tekintett járművek listája, vesszővel elválasztva. - Lista di veicoli che verranno classificati come veicoli medici, separati da virgole. - 医療車両として設定されるクラス名を一覧で指定でき、コンマで区切りを付けられます - 차량 명칭 목록으로 의료차량이 구분됩니다, 쉼표로 구분. - 列出的载具将被指定为医疗载具,记得用逗号隔开! - 列出的載具將被指定為醫療載具,記得用逗號隔開! - - - Is Medical Vehicle - Является медицинским транспортом - Jest pojazdem medycznym - Es vehículo médico - Ist medizinisches Fahrzeug - Zdravotnické vozidlo - É um veículo médico - Véhicule médical - Orvosi jármű-e - E' Veicolo Medico - 医療車両として - 의료 차량 - 是医疗载具 - 是醫療載具 - - - Whatever or not the objects in the list will be a medical vehicle. - Будут ли объекты в списке считаться медицинским транспортом. - Czy pojazdy z tej listy są pojazdami medycznymi? - Cualquiera de la lista o fuera de ella será un vehículo médico. - Legt fest, ob das Objekt in der Liste ein Sanitätsfahrzeug ist. - Ať už jsou nebo nejsou objekty v seznamu budou zdravotnická vozidla. - Se serão ou não os objetos dessa lista veículos médicos. - Quoi qu'il arrive les objets de la liste seront des véhicules médical - A listában lévő objektumok orvosi járművek-e, vagy sem. - Gli oggetti nella lista verranno considerati veicoli medici o meno. - どれでも、またはこの一覧にないオブジェクトを医療車両として割り当てる。 - 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. - 列表中的载具将会变成医疗载具 - 列表中的載具將會變成醫療載具 - - - Assigns the ACE medic class to a unit - Задает юниту класс медика - Moduł ten pozwala na przypisanie danym pojazdom statusu pojazdów medycznych. Wewnątrz takiego pojazdu można wykonywać zaawansowane zabiegi medyczne. - Asigna la clase médico ACE a una unidad - Weist die ACE-Sanitäterklasse einer Einheit zu - Přiřadí ACE třídu zdravotníka do jednotky - Atribui a classe médica ACE a uma unidade - Assigne la classe médicale à une unité - Hozzárendeli az ACE orvosi jelzőt egy egységhez - Assegna la classe medico ACE ad un'unità - ユニットを ACE の衛生兵として割り当てる - 指派ACE医疗职位给该单位 - 指派ACE醫療職位給該單位 - 병력에 ACE 의무병 보직 선정 - - - Set Medical Facility [ACE] - Сделать госпиталем [ACE] - Ustaw budynek medyczny - Establece el centro médico [ACE] - Setze medizinische Einrichtung [ACE] - Určit zdravotnické zařízení [ACE] - Definir instalação médica [ACE] - Définir comme installation médical [ACE] - Orvosi létesítmény beállítása [ACE] - Imposta Struttura Medica [ACE] - 医療施設を設定 [ACE] - 의료시설 선정 [ACE] - 设定医疗设施 [ACE] - 設定醫療設施 [ACE] - - - Is Medical Facility - Является госпиталем - Jest budynkiem medycznym - Es centro médico - Ist eine medizinische Einrichtung - Zdravotnické zařízení - É uma instalação médica - Est une installation médical - Orvosi létesítmény-e - E' Struttura Medica - 医療施設として - 의료시설 - 是医疗设施 - 是醫療設施 - - - Registers an object as a medical facility - Определяет объект в качестве госпиталя - Przypisuje danemu obiektowi status budynku medycznego - Registra un objeto como un centro médico - Definiert ein Objekt als medizinische Einrichtung - Registruje objekt jako zdravotnické zařízení - Registra um objeto como instalacão médica - Enregistrer un objet comme une installation médical - Egy objektum orvosi létesítményként való regisztrálása - Registra un oggetto come struttura medica - オブジェクトを医療施設として割り当てる - 물체를 의료시설로 등록합니다 - 指定一个物件作为医疗设施 - 指定一個物件作為醫療設施 - - - Defines an object as a medical facility. This allows for more advanced treatments. Can be used on buildings and vehicles. - Определяет объект в качестве госпиталя. Позволяет оказывать более сложную помощь. Может применяться к зданиям и технике. - Moduł ten pozwala przypisać status budynku medycznego danemu obiektowi. Budynek taki pozwala na wykonywanie zaawansowanych zabiegów medycznych. Może być użyte na pojazdach i budynkach. - Define un objeto como un centro médico. Esto permite tratamientos más avanzados. Se puede utilizar en edificios y vehículos. - Definiert ein Objekt als medizinische Einrichtung. Hier werden weitere, tiefgreifende Behandlungen ermöglicht. Kann Fahrzeugen oder Gebäuden zugewiesen werden. - Definuje objekt jako zdravotnické zařízení. To umožňuje více pokročilé léčení. Může být použito na budovy nebo na vozidla. - Define um objeto como instalação médica. Isso permite tratamentos mais avançados. Pode ser utilizado em edifícios e veículos. - Définir un objet comme installation médical. Cela permet les traitements avancés. Peut être utilisé sur les batiments et les véhicules - Egy objektumot orvosi létesítményként határoz meg. Ez fejlett ellátási lehetőségeket engedélyez. Használható járműveken és épületeken. - Definisce un oggetto come struttura medica. Questo permette cure più avanzate. Può essere usato su edifici e veicoli. - オブジェクトを医療施設として割り当てます。建物と車両へ割り当てられた場合、より高度な治療が可能になります。 - 물체를 의료시설로 정의합니다. 건물 혹은 차량이 될 수 있습니다. 이는 고급 의료 조치를 할 수 있게해줍니다. - 定义一个物件作为医疗设施,此医疗设施将被允许使用更进阶的医疗方法。此功能可用于建筑物或是载具上! - 定義一個物件作為醫療設施,此醫療設施將被允許使用更進階的醫療方法。此功能可用於建築物或是載具上! - - - [ACE] Medical Supply Crate (Basic) - [ACE] Ящик с медикаментами (базовая медицина) - [ACE] Skrzynka z zapasami medycznymi (podstawowa) - [ACE] Caja de suministros médicos (Básica) - [ACE] Sanitätskiste (Standard) - [ACE] Zdravotnické zásoby (základní) - [ACE] Caixa com suprimentos médicos - [ACE] Caisse médicale (basique) - [ACE] Orvosi láda (Alap) - [ACE] Cassa Rifornimenti Medici (Basico) - [ACE] 医療物資箱 (ベーシック) - [ACE] 의료 물자 (기본) - [ACE] 医疗补给箱(基本) - [ACE] 醫療補給箱(基本) - - - [ACE] Medical Supply Crate (Advanced) - [ACE] Ящик с медикаментами (усложн. медицина) - [ACE] Skrzynka z zapasami medycznymi (zaawansowana) - [ACE] Caja de suministros médicos (Avanzada) - [ACE] Sanitätskiste (erweitert) - [ACE] Zdravotnické zásoby (pokročilé) - [ACE] Caixa com suprimentos médicos (Avançados) - [ACE] Caisse médicale (avancée) - [ACE] Orvosi láda (Fejlett) - [ACE] Cassa Rifornimenti Medici (Avanzato) - [ACE] 医療物資箱 (アドバンスド) - [ACE] 의료 물자 (고급) - [ACE] 医疗补给箱(进阶) - [ACE] 醫療補給箱(進階) - Anytime Jederzeit @@ -5485,6 +328,7 @@ 안정된 稳定状态下 穩定狀態下 + Dengeli Medical @@ -5501,9 +345,10 @@ 의료 医疗设定 醫療設定 + Medikal - Distance to %1 has become to far for treatment + Distance to %1 has become too far for treatment Die Entfernung zu %1 ist zu groß für eine Behandlung %1 odszedł zbyt daleko, nie można kontynuować leczenia Расстояние до %1 стало слишком большим для лечения @@ -5511,167 +356,41 @@ La distancia hasta %1 se ha agrandado demasiado para el tratamiento %1 je příliš daleko, léčba není možná Distanza da %1 è diventata troppo alta per permettere trattamento - %1 est trop loin pour être soigné - %1 は治療をできない所まで離れました + %1 est trop loin pour être soigné. + %1 は治療をできない所まで離れた %1 부터의 거리가 너무 멀어 치료할 수 없습니다 设定当距离超过%1将不能使用治疗动作 設定當距離超過%1將不能使用治療動作 - - This person (%1) is awake and cannot be loaded - Diese Person (%1) ist wach und kann nicht verladen werden - Ta osoba (%1) jest przytomna i nie może zostać załadowana - Esta persona (%1) está despierto y no puede ser cargado - Боец (%1) в сознании и не может быть погружен - Esta pessoa (%1) está acordada e não pode ser carregada - Tato osoba (%1) je vzhůru a nemůže být naložena - Questa persona (%1) è sveglia e non può essere caricata. - %1 est conscient et ne peut être embarqué. - 患者 (%1) は意識があり、積み込めません - 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 - 此人(%1)是清醒且不能被装载 - 此人(%1)是清醒且不能被裝載 - - - There is no tourniquet on this body part! - An diesem Körperteil befindet sich kein Tourniquet! - Na tej części ciała nie ma stazy! - No hay torniquete en esta parte del cuerpo! - Нет жгута на этой части тела! - Não existe nenhum torniquete nesta parte do corpo! - Žádné škrtidlo na této části těla! - Non c'è nessun laccio emostatico su questa parte del corpo! - Il n'y a pas de garrot sur ce membre ! - 身体には止血帯が無い! - 이 부위에는 지혈대가 없습니다! - 这部位没有止血带! - 這部位沒有止血帶! - - - Medical training - Wyszkolenie medyczne - Addestramento Medico - Sanitätsausbildung - Entrenamiento médico - Entraînement médical - Lékařský výcvik - Treino médico - Медицинская подготовка - 治療の訓練 - 의료 훈련 - 医疗训练 - 醫療訓練 - - - Whether or not the object will be a medical vehicle. - Czy pojazd ma być pojazdem medycznym? - L'oggetto in questione sarà un veicolo medico o meno. - Legt fest, ob das Objekt ein Sanitätsfahrzeug ist. - Es un vehículo médico? - Détermine si c'est un véhicule sanitaire. - Se o objeto será ou não um veículo médico - Будет ли объект считаться медицинским транспортом. - どれでも、またはオブジェクトを医療車両として割り当てます。 - 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. - 是否使该载具为医疗载具? - 是否使該載具為醫療載具? - - - Delay cease fire of AI while player is unconscious for medical reasons. - Verzögert das Ende des KI-Beschusses auf einen Spieler, wenn dieser aus medizinischen Gründen bewustlos wird. - Ritarda il cessate il fuoco dell'IA quando il giocatore è svenuto per motivi medici. - Prodleva zastavení palby pro AI, pokud je hráč v bezvědomí ze zdravotních důvodů. - Atraso durante cessar fogo da AI durante inconsciência médica - Délai de cessez le feu pour l'IA pendant que le joueur est inconscient pour des raisons médicales. - Задержка прекращения огня ботами, когда игрок теряет сознание по медицинским причинам. - AI はプレイヤーが医療的な理由で気絶している場合にかぎり、撃つのをためらいます。 - Opóźnij stan wstrzymania ognia u AI kiedy gracz jest nieprzytomny z powodów medycznych. - 의료상의 이유로 플레이어가 기절할 경우 인공지능이 발사를 지연합니다. - 当玩家为无意识的状态时, 延长AI的开火时间 - 當玩家為無意識的狀態時, 延長AI的停火時間 - - - Delay cease fire of AI for unconsciousness - Verzögert Ende des KI-Beschusses bei medizinischer Bewustlosigkeit - Demora antes de volverse neutral al caer inconsciente - Opóźnij wstrzymanie ognia AI dla nieprzytomnych osób - Ritarda il cessate il fuoco dell'IA quando si è svenuti - Prodleva zastavení palby AI na bezvědomé - Atraso durante cessar fogo da AI durante inconsciência - Délai de cessez le feu de l'IA pour la perte de conscience - Задержка прекращения огня ботами при потере сознания - AI が気絶者へためらってから射撃 - 기절할 경우 인공지능이 발사를 지연합니다 - 延长AI对已无意识玩家的开火时间 - 延長AI對已無意識玩家的停火時間 - Open lid Deckel aufklappen - フタをあける + フタを開ける Apri lid 打開蓋子 打开盖子 뚜껑 열기 Otwórz pokrywę + Открыть крышку + Ouvrir le couvercle + Abrir Tampa + Otevřít víko + Abrir tapa Close lid Deckel zuklappen - フタをしめる + フタを閉める Chiudi lid 關閉蓋子 关闭盖子 뚜껑 닫기 Zamknij pokrywę - - - Unconscious animation during treatment - 処置中に気絶アニメーション - 治疗时死亡动画 - 醫療時加入的昏迷動作 - Animazione da svenuto durante la cura - Nieprzytomne animacje podczas leczenia - - - Allow animation of unconscious patients during treatment. - 患者の処置中に気絶アニメーションを許可します。 - 在无意识患者治疗时死亡,会播放死亡动画? - 允許醫療時加入昏迷的動作 - Permette l'animazione da svenuto dei pazioenti durante loro la cura. - Zezwalaj na animacje nieprzytomnych pacjentów podczas leczenia. - - - Move unconscious units from group - グループから気絶ユニットを移動 - 从小队中移除无意识伤者 - 從小隊中移動昏迷的單位 - Toglie le unità svenute dal grouppo - Przenieś nieprzytomne jednostki z grupy - - - When a group member goes unconscious, removes them from their group. - グループのメンバーが気絶すると、グループから退出させます。 - 当一个队员失去意识时,他将被移除出小队 - 當隊員昏迷時,將被他的小組中刪除 - Quando un membro del gruppo sviene, viene tolto dal gruppo. - Kiedy członek grupy straci przytomność, usuwa ich z ich grupy. - - - Overdosing - 過剰投与 - 过量 - 過量 - Overdose - Przedawkowanie - - - Makes patient vulnerable to Morphine/Epinephrine/Atropine overdosing. - モルヒネ/アドレナリン/アトロピンの過剰投与により患者を脆弱にします。 - 当队员处于吗啡/肾上腺素/阿托品过量时再次受伤,他的伤害会更重 - 當隊員對嗎啡/腎上腺素/阿托品過量時,會使他的傷害更重 - Rende il paziente suscettibile di overdose da morfina, epinefrina o atropina. - Sprawia, że pacjent jest podatny na przedawkowanie morfiny/epinefryny. + Закрыть крышку + Fermer le couvercle + Fechar Tampa + Zavřít víko + Cerrar tapa diff --git a/addons/medical/ui/CfgInGameUI.hpp b/addons/medical/ui/CfgInGameUI.hpp deleted file mode 100644 index 5a09a114146..00000000000 --- a/addons/medical/ui/CfgInGameUI.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class CfgInGameUI { - class PeripheralVision { - bloodTexture = ""; //"A3\ui_f\data\igui\cfg\PeripheralVision\bloodTexture_ca.paa"; - }; -}; diff --git a/addons/medical/ui/Icon_Module_Medical_ca.paa b/addons/medical/ui/Icon_Module_Medical_ca.paa deleted file mode 100644 index d66921dfcc7..00000000000 Binary files a/addons/medical/ui/Icon_Module_Medical_ca.paa and /dev/null differ diff --git a/addons/medical/ui/RscTitles.hpp b/addons/medical/ui/RscTitles.hpp deleted file mode 100644 index 00182d24dd8..00000000000 --- a/addons/medical/ui/RscTitles.hpp +++ /dev/null @@ -1,145 +0,0 @@ -class ACE_gui_backgroundBase; -class ACE_gui_listBoxBase; - -class Rsctitles { - class GVAR(DisplayInformation) { - duration = 10e10; - idd = 1111; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(DisplayInformation))), _this select 0)]); - onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(DisplayInformation))), nil)]); - class controlsBackground { - class bodyImgBackground: ACE_gui_backgroundBase { - idc = -1; - x = "safezoneX + (2.5 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "8.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "8.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOF(ui\body_background.paa); - }; - class bodyImgHead: bodyImgBackground { - idc = 50; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOF(ui\body_head.paa); - }; - class bodyImgTorso: bodyImgHead { - idc = 51; - text = QPATHTOF(ui\body_torso.paa); - }; - class bodyImgArms_l: bodyImgHead { - idc = 52; - text = QPATHTOF(ui\body_arm_left.paa); - }; - class bodyImgArms_r: bodyImgHead { - idc = 53; - text = QPATHTOF(ui\body_arm_right.paa); - }; - class bodyImgLegs_l: bodyImgHead { - idc = 54; - text = QPATHTOF(ui\body_leg_left.paa); - }; - class bodyImgLegs_r: bodyImgHead { - idc = 55; - text = QPATHTOF(ui\body_leg_right.paa); - }; - class bodyImgTournAL: bodyImgHead { - idc = 56; - text = QPATHTOF(ui\tourniquet_arm_left.paa); - }; - class bodyImgTournAR: bodyImgHead { - idc = 57; - text = QPATHTOF(ui\tourniquet_arm_right.paa); - }; - class bodyImgTournLL: bodyImgHead { - idc = 58; - text = QPATHTOF(ui\tourniquet_leg_left.paa); - }; - class bodyImgTournLR: bodyImgHead { - idc = 59; - text = QPATHTOF(ui\tourniquet_leg_right.paa); - }; - class InjuryListLabel { - idc = 199; - type = CT_STATIC; - x = "safezoneX + (2 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "10.2 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "9 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - style = 0x00 + 0x100; // ST_LEFT + ST_SHADOW - font = "RobotoCondensed"; - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {"(profilenamespace getVariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getVariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getVariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - text = CSTRING(Injuries); - }; - class InjuryList: ACE_gui_listBoxBase { - idc = 200; - x = "safezoneX + (2 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "11 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "9 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - colorBackground[] = {0, 0, 0, 0.2}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {0.95, 0.95, 0.95, 1}; - colorSelect2[] = {0.95, 0.95, 0.95, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.5}; - }; - class ActivityLog: InjuryList { - idc = 302; - y = "21.3 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - h = "7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - shadow = 2; - colorBackground[] = {0, 0, 0, 0}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {1,1,1,1}; - colorSelect2[] = {1,1,1,1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0}; - }; - class TriageStatus { - idc = 303; - type = CT_STATIC; - x = "safezoneX + (2 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "20.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "9 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - style = 0x00 + 0x100; // ST_LEFT + ST_SHADOW - font = "RobotoCondensed"; - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {0,0,0,0.9}; - text = ""; - }; - }; - }; - - // disables blood texture overlay - class RscHealthTextures { - class controls { - class Flame_1; - class Blood_1: Flame_1 { - text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_lower_ca.paa"; - }; - class Blood_2: Flame_1 { - text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_middle_ca.paa"; - }; - class Blood_3: Flame_1 { - text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_upper_ca.paa"; - }; - }; - }; -}; diff --git a/addons/medical/ui/icons/medical_cross.paa b/addons/medical/ui/icons/medical_cross.paa deleted file mode 100644 index 656ebc000ba..00000000000 Binary files a/addons/medical/ui/icons/medical_cross.paa and /dev/null differ diff --git a/addons/medical/ui/icons/medical_crossRed.paa b/addons/medical/ui/icons/medical_crossRed.paa deleted file mode 100644 index 5a0c8e9f9cc..00000000000 Binary files a/addons/medical/ui/icons/medical_crossRed.paa and /dev/null differ diff --git a/addons/medical/ui/icons/medical_crossYellow.paa b/addons/medical/ui/icons/medical_crossYellow.paa deleted file mode 100644 index 74ddefd8379..00000000000 Binary files a/addons/medical/ui/icons/medical_crossYellow.paa and /dev/null differ diff --git a/addons/medical/ui/moduleIcon.paa b/addons/medical/ui/moduleIcon.paa deleted file mode 100644 index 9cb6c4782de..00000000000 Binary files a/addons/medical/ui/moduleIcon.paa and /dev/null differ diff --git a/addons/medical/ui/triagecard.hpp b/addons/medical/ui/triagecard.hpp deleted file mode 100644 index 43a64625eb7..00000000000 --- a/addons/medical/ui/triagecard.hpp +++ /dev/null @@ -1,191 +0,0 @@ -class ACE_gui_buttonBase; - -class GVAR(triageCard) { - idd = 7010; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(triageCard))), _this select 0)]); - onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(triageCard))), nil)]); - class controlsBackground { - class Background: ACE_gui_backgroundBase { - idc = -1; - type = CT_STATIC; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "19 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_LEFT + ST_SHADOW; - font = "RobotoCondensed"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.0, 0.0, 0.0, 1}; - colorBackground[] = {1,1,1,1}; - text = ""; - }; - class cornor_top_l: ACE_gui_backgroundBase { - idc = -1; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - font = "RobotoCondensed"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {1,1,0,1}; - colorBackground[] = {0,0,0,0}; - text = QPATHTOF(ui\triage_card_corner_l.paa); - }; - class cornor_top_r: cornor_top_l { - x = "20 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(ui\triage_card_corner_r.paa); - }; - - class TriageCardLabel { - idc = 199; - type = CT_STATIC; - x = "14.25 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "7.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - style = 0x02 + 0x100; // ST_LEFT + ST_SHADOW - font = "RobotoCondensed"; - colorText[] = {0,0,0,1}; - colorBackground[] = {0,0,0,0}; - text = CSTRING(Actions_TriageCard); - }; - class TriageList: ACE_gui_listBoxBase { - idc = 200; - x = "11 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "13 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "13 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - colorBackground[] = {0, 0, 0, 0}; - colorText[] = {0,0,0, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 0}; - colorSelect[] = {0.0, 0.0, 0.0, 1}; - colorSelect2[] = {0.0, 0.0, 0.0, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - }; - class TriageTextBottom: TriageCardLabel { - idc = 2000; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "20 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = 0x02; - colorText[] = {1, 1, 1.0, 1}; - colorBackground[] = {0,0.0,0.0,0.7}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - }; - class selectTriageStatus: ACE_gui_buttonBase { - idc = 2001; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "20 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE([true] call FUNC(dropDownTriageCard);); - text = ""; - }; - class selectTriageStatusNone: selectTriageStatus { - idc = 2002; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_None); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel),0,true)];); - }; - class selectTriageStatusMinor: selectTriageStatus { - idc = 2003; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Minor); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel),1,true)];); - }; - class selectTriageStatusDelayed: selectTriageStatus { - idc = 2004; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Delayed); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel),2,true)];); - }; - class selectTriageStatusImmediate: selectTriageStatus { - idc = 2005; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Immediate); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureOver = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel), 3, true)];); - }; - class selectTriageStatusDeceased: selectTriageStatus { - idc = 2006; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Deceased); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel), 4, true)];); - }; - }; -}; diff --git a/addons/medical_ai/ACE_Settings.hpp b/addons/medical_ai/ACE_Settings.hpp index fc24f6dc2fc..e9702654671 100644 --- a/addons/medical_ai/ACE_Settings.hpp +++ b/addons/medical_ai/ACE_Settings.hpp @@ -1,10 +1,5 @@ class ACE_Settings { class GVAR(enabledFor) { - category = ECSTRING(medical,Category_Medical); - displayName = CSTRING(enabledFor_DisplayName); - description = CSTRING(enabledFor_Description); - value = 2; - typeName = "SCALAR"; - values[] = {ECSTRING(Common,Disabled), CSTRING(enabledFor_OnlyServerAndHC), ECSTRING(Common,Enabled)}; + movedToSQF = 1; }; }; diff --git a/addons/medical_ai/StateMachine.hpp b/addons/medical_ai/StateMachine.hpp deleted file mode 100644 index 36642fbab3a..00000000000 --- a/addons/medical_ai/StateMachine.hpp +++ /dev/null @@ -1,86 +0,0 @@ -class GVAR(stateMachine) { - list = "allUnits select {local _x}"; - skipNull = 1; - - class Initial { - class Injured { - targetState = "Injured"; - condition = QUOTE(call FUNC(isInjured)); - }; - class HealUnit { - targetState = "HealUnit"; - condition = QUOTE((call FUNC(isSafe)) && {call FUNC(wasRequested)}); - }; - }; - - class Injured { - #ifdef DEBUG_MODE_FULL - onState = "systemChat format [""%1 is injured"", _this]"; - #endif - - class InSafety { - targetState = "Safe"; - condition = QUOTE(call FUNC(isSafe)); - }; - }; - - class Safe { - #ifdef DEBUG_MODE_FULL - onState = "systemChat format [""%1 is injured, but safe"", _this]"; - #endif - - class RequestMedic { - targetState = "HealSelf"; - condition = QUOTE(call FUNC(canRequestMedic)); - onTransition = QUOTE(call FUNC(requestMedic)); - }; - class HealSelf { - targetState = "HealSelf"; - condition = "true"; - }; - }; - - class HealSelf { - onState = QUOTE(call FUNC(healSelf)); - onStateLeaving = QUOTE(_this setVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),nil)]); - - class Initial { - // Go back to initial state when done healing - targetState = "Initial"; - condition = QUOTE( \ - !(call FUNC(isInjured)) \ - && {_this getVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),CBA_missionTime)] <= CBA_missionTime} \ - ); - }; - class Injured { - // Stop treating when it's no more safe - targetState = "Injured"; - condition = QUOTE( \ - !(call FUNC(isSafe)) \ - && {_this getVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),CBA_missionTime)] <= CBA_missionTime} \ - ); - }; - }; - - class HealUnit { - onState = QUOTE(call FUNC(healUnit)); - onStateLeaving = QUOTE(_this setVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),nil)]); - - class Initial { - // Go back to initial state when done healing or it's no more safe to treat - targetState = "Initial"; - condition = QUOTE( \ - !((call FUNC(wasRequested)) && {call FUNC(isSafe)}) \ - && {_this getVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),CBA_missionTime)] <= CBA_missionTime} \ - ); - }; - class Injured { - // Treating yourself has priority - targetState = "Injured"; - condition = QUOTE( \ - (call FUNC(isInjured)) \ - && {_this getVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),CBA_missionTime)] <= CBA_missionTime} \ - ); - }; - }; -}; diff --git a/addons/medical_ai/XEH_PREP.hpp b/addons/medical_ai/XEH_PREP.hpp index f55636612ac..9300f0cbb3a 100644 --- a/addons/medical_ai/XEH_PREP.hpp +++ b/addons/medical_ai/XEH_PREP.hpp @@ -1,4 +1,5 @@ PREP(canRequestMedic); +PREP(healingLogic); PREP(healSelf); PREP(healUnit); PREP(isInjured); diff --git a/addons/medical_ai/XEH_postInit.sqf b/addons/medical_ai/XEH_postInit.sqf index 075a972c25d..d8676e96956 100644 --- a/addons/medical_ai/XEH_postInit.sqf +++ b/addons/medical_ai/XEH_postInit.sqf @@ -5,31 +5,10 @@ if (GVAR(enabledFor) == 0) exitWith {}; // 0: disabled if ((GVAR(enabledFor) == 1) && {!isServer} && {hasInterface}) exitWith {}; // 1: Don't Run on non-hc Clients - // Only run for AI that does not have to deal with advanced medical - if (EGVAR(medical,level) == 2 && {EGVAR(medical,enableFor) == 1 || hasInterface}) exitWith {}; - ["ace_firedNonPlayer", { _unit setVariable [QGVAR(lastFired), CBA_missionTime]; }] call CBA_fnc_addEventHandler; - if (hasInterface) then { - ["ace_unconscious", { - params ["_unit", "_unconscious"]; - if (!_unconscious || {_unit != ACE_player}) exitWith {}; - - private _medic = objNull; - { - if ((!isPlayer _x) && {[_x] call EFUNC(medical,isMedic)}) exitWith { - _medic = _x; - }; - } forEach (units _unit); - if (isNull _medic) exitWith {}; - - private _healQueue = _medic getVariable [QGVAR(healQueue), []]; - _healQueue pushBack _unit; - _medic setVariable [QGVAR(healQueue), _healQueue]; - }] call CBA_fnc_addEventHandler; - }; - - GVAR(statemachine) = [configFile >> "ACE_Medical_AI_StateMachine"] call CBA_statemachine_fnc_createFromConfig; + #include "stateMachine.sqf" }] call CBA_fnc_addEventHandler; + diff --git a/addons/medical_ai/XEH_preInit.sqf b/addons/medical_ai/XEH_preInit.sqf index b47cf6628db..9361d05015e 100644 --- a/addons/medical_ai/XEH_preInit.sqf +++ b/addons/medical_ai/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/medical_ai/config.cpp b/addons/medical_ai/config.cpp index 07f9e3b0508..c42fc98f959 100644 --- a/addons/medical_ai/config.cpp +++ b/addons/medical_ai/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_medical"}; + requiredAddons[] = {"ace_medical_treatment"}; author = ECSTRING(common,ACETeam); authors[] = {"BaerMitUmlaut"}; url = ECSTRING(main,URL); @@ -16,4 +16,3 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" -#include "StateMachine.hpp" diff --git a/addons/medical_ai/functions/fnc_canRequestMedic.sqf b/addons/medical_ai/functions/fnc_canRequestMedic.sqf index ab030428991..c2a29c1c9fd 100644 --- a/addons/medical_ai/functions/fnc_canRequestMedic.sqf +++ b/addons/medical_ai/functions/fnc_canRequestMedic.sqf @@ -10,7 +10,7 @@ * Can request medic * * Example: - * call ACE_medical_ai_fnc_canRequestMedic + * player call ACE_medical_ai_fnc_canRequestMedic * * Public: No */ @@ -19,12 +19,16 @@ // we ignore this here. We need to "notice" the medic that he should // treat other units, or else he won't do anything on his own. -if ([_this] call EFUNC(medical,isMedic) || {vehicle _this != _this}) exitWith {false}; +if ([_this] call EFUNC(medical_treatment,isMedic) || {vehicle _this != _this}) exitWith {false}; +// Search for a medic, prioritize unitReady +private _medic = objNull; { - if ([_x] call EFUNC(medical,isMedic) && {!([_x] call EFUNC(common,isPlayer))}) exitWith { - _this setVariable [QGVAR(assignedMedic), _x]; - true - }; - false + if ([_x] call EFUNC(medical_treatment,isMedic) && {!([_x] call EFUNC(common,isPlayer))} && { + _medic = _x; + (unitReady _medic) + }) exitWith {}; } forEach (units _this); + +_this setVariable [QGVAR(assignedMedic), _medic]; +!isNull _medic diff --git a/addons/medical_ai/functions/fnc_healSelf.sqf b/addons/medical_ai/functions/fnc_healSelf.sqf index 6cb0c3257f8..524625f3c3f 100644 --- a/addons/medical_ai/functions/fnc_healSelf.sqf +++ b/addons/medical_ai/functions/fnc_healSelf.sqf @@ -18,41 +18,8 @@ // Player will have to do this manually of course if ([_this] call EFUNC(common,isPlayer)) exitWith {}; // Can't heal self when unconscious -if (_this getVariable ["ACE_isUnconscious", false]) exitWith {}; -// Check if we're still treating -if ((_this getVariable [QGVAR(treatmentOverAt), CBA_missionTime]) > CBA_missionTime) exitWith {}; - -private _needsBandaging = ([_this] call EFUNC(medical,getBloodLoss)) > 0; -private _needsMorphine = (_this getVariable [QEGVAR(medical,pain), 0]) > 0.2; - -switch (true) do { - case _needsBandaging: { - // Select first wound and bandage it - private _openWounds = _this getVariable [QEGVAR(medical,openWounds), []]; - private _partIndex = { - _x params ["", "", "_index", "_amount", "_percentage"]; - if (_amount * _percentage > 0) exitWith { - _index - }; - } forEach _openWounds; - private _selection = ["head","body","hand_l","hand_r","leg_l","leg_r"] select _partIndex; - [_this, "Bandage", _selection] call EFUNC(medical,treatmentAdvanced_bandageLocal); - - #ifdef DEBUG_MODE_FULL - systemChat format ["%1 is bandaging selection %2", _this, _selection]; - #endif - - // Play animation - [_this, true, true] call FUNC(playTreatmentAnim); - _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 5]; - }; - case _needsMorphine: { - [_this] call EFUNC(medical,treatmentBasic_morphineLocal); - [_this, false, true] call FUNC(playTreatmentAnim); - _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; - - #ifdef DEBUG_MODE_FULL - systemChat format ["%1 is giving himself morphine", _this]; - #endif - }; +if IS_UNCONSCIOUS(_this) exitWith { + _this setVariable [QGVAR(currentTreatment), nil]; }; + +[_this, _this] call FUNC(healingLogic); diff --git a/addons/medical_ai/functions/fnc_healUnit.sqf b/addons/medical_ai/functions/fnc_healUnit.sqf index 2d9116be4f4..158de90f36f 100644 --- a/addons/medical_ai/functions/fnc_healUnit.sqf +++ b/addons/medical_ai/functions/fnc_healUnit.sqf @@ -14,11 +14,12 @@ * * Public: No */ - +// Player will have to do this manually of course +if ([_this] call EFUNC(common,isPlayer)) exitWith {}; // Can't heal other units when unconscious -if (_this getVariable ["ACE_isUnconscious", false]) exitWith {}; -// Check if we're still treating -if ((_this getVariable [QGVAR(treatmentOverAt), CBA_missionTime]) > CBA_missionTime) exitWith {}; +if IS_UNCONSCIOUS(_this) exitWith { + _this setVariable [QGVAR(currentTreatment), nil]; +}; // Find next unit to treat private _healQueue = _this getVariable [QGVAR(healQueue), []]; @@ -26,73 +27,34 @@ private _target = _healQueue select 0; // If unit died or was healed, be lazy and wait for the next tick if (isNull _target || {!alive _target} || {!(_target call FUNC(isInjured))}) exitWith { + _this forceSpeed -1; _target forceSpeed -1; _healQueue deleteAt 0; - _this getVariable [QGVAR(healQueue), _healQueue]; - _this forceSpeed -1; + _this setVariable [QGVAR(healQueue), _healQueue]; // return to formation instead of going where the injured unit was if it healed itself in the mean time _this doFollow leader _this; - _this setVariable [QGVAR(movingToInjured), false]; + _this setVariable [QGVAR(nextMoveOrder), nil]; + _this setVariable [QGVAR(currentTreatment), nil]; #ifdef DEBUG_MODE_FULL - systemChat format ["%1 finished healing %2", _this, _target]; + systemChat format ["%1 finished healing %2", _this, _target]; #endif }; // Move to target... -if (_this distance _target > 2) exitWith { - if !(_this getVariable [QGVAR(movingToInjured), false]) then { - _this setVariable [QGVAR(movingToInjured), true]; +if (_this distance _target > 2.5) exitWith { + _this setVariable [QGVAR(currentTreatment), nil]; + if (CBA_missionTime >= (_this getVariable [QGVAR(nextMoveOrder), CBA_missionTime])) then { + _this setVariable [QGVAR(nextMoveOrder), CBA_missionTime + 10]; _this doMove getPosATL _target; + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 moving to %2", _this, _target]; + #endif }; }; -_this setVariable [QGVAR(movingToInjured), false]; // ...and make sure medic and target don't move _this forceSpeed 0; _target forceSpeed 0; -private _needsBandaging = ([_target] call EFUNC(medical,getBloodLoss)) > 0; -private _needsMorphine = (_target getVariable [QEGVAR(medical,pain), 0]) > 0.2; -private _needsEpinephrine = _target getVariable ["ACE_isUnconscious", false]; - -switch (true) do { - case _needsBandaging: { - // Select first wound and bandage it - private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; - private _partIndex = { - _x params ["", "", "_index", "_amount", "_percentage"]; - if (_amount * _percentage > 0) exitWith { - _index - }; - } forEach _openWounds; - private _selection = ["head","body","hand_l","hand_r","leg_l","leg_r"] select _partIndex; - [_this, _target, _selection, "Bandage"] call EFUNC(medical,treatmentAdvanced_bandage); - - #ifdef DEBUG_MODE_FULL - systemChat format ["%1 is bandaging selection %2 on %3", _this, _selection, _target]; - #endif - - // Play animation - [_this, true, false] call FUNC(playTreatmentAnim); - _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 5]; - }; - case _needsMorphine: { - [_this, _target] call EFUNC(medical,treatmentBasic_morphine); - [_this, false, false] call FUNC(playTreatmentAnim); - _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; - - #ifdef DEBUG_MODE_FULL - systemChat format ["%1 is giving %2 morphine", _this, _target]; - #endif - }; - case _needsEpinephrine: { - [_this, _target] call EFUNC(medical,treatmentBasic_epipen); - [_this, false, false] call FUNC(playTreatmentAnim); - _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; - - #ifdef DEBUG_MODE_FULL - systemChat format ["%1 is using an epipen on %2", _this, _target]; - #endif - }; -}; +[_this, _target] call FUNC(healingLogic); diff --git a/addons/medical_ai/functions/fnc_healingLogic.sqf b/addons/medical_ai/functions/fnc_healingLogic.sqf new file mode 100644 index 00000000000..136b6927dad --- /dev/null +++ b/addons/medical_ai/functions/fnc_healingLogic.sqf @@ -0,0 +1,128 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut, PabstMirror + * Applies healing to target + * + * Arguments: + * 0: Healer + * 1: Target + * + * Return Value: + * Nothing + * + * Example: + * [a, b] call ACE_medical_ai_fnc_healingLogic + * + * Public: No + */ + +params ["_healer", "_target"]; +(_healer getVariable [QGVAR(currentTreatment), [-1]]) params ["_finishTime", "_treatmentTarget", "_treatmentEvent", "_treatmentArgs"]; + +// Treatment in progress, check if finished and apply +if (_finishTime > 0) exitWith { + if (CBA_missionTime >= _finishTime) then { + TRACE_4("treatment finished",_finishTime,_treatmentTarget,_treatmentEvent,_treatmentArgs); + _healer setVariable [QGVAR(currentTreatment), nil]; + if ((_treatmentTarget == _target) && {(_treatmentEvent select [0, 1]) != "#"}) then { + [_treatmentEvent, _treatmentArgs, _target] call CBA_fnc_targetEvent; + #ifdef DEBUG_MODE_FULL + INFO_4("%1->%2: %3 - %4",_healer,_target,_treatmentEvent,_treatmentArgs); + systemChat format ["Applying [%1->%2]: %3", _healer, _treatmentTarget, _treatmentEvent]; + #endif + }; + }; +}; + +private _isMedic = [_healer] call EFUNC(medical_treatment,isMedic); +private _heartRate = GET_HEART_RATE(_target); +private _fractures = GET_FRACTURES(_target); + +private _treatmentEvent = "#none"; +private _treatmentArgs = []; +private _treatmentTime = 6; +switch (true) do { + case (GET_WOUND_BLEEDING(_target) > 0): { + // Select first bleeding wound and bandage it + private _openWounds = GET_OPEN_WOUNDS(_target); + private _selection = "?"; + { + _x params ["", "_index", "_amount", "_percentage"]; + if ((_amount * _percentage) > 0) exitWith { _selection = ALL_BODY_PARTS select _index; }; + } forEach _openWounds; + _treatmentEvent = QEGVAR(medical_treatment,bandageLocal); + _treatmentTime = 5; + _treatmentArgs = [_target, _selection, "FieldDressing"]; + }; + case (IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChance) > 0}): { + _treatmentEvent = QEGVAR(medical_treatment,cprLocal); + _treatmentArgs = [_healer, _target]; + _treatmentTime = 15; + }; + case (_isMedic && {GET_BLOOD_VOLUME(_target) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE}): { + // Check if patient's blood volume + remaining IV volume is enough to allow the patient to wake up + private _totalIvVolume = 0; //in ml + { + _x params ["_volumeRemaining"]; + _totalIvVolume = _totalIvVolume + _volumeRemaining; + } forEach (_target getVariable [QEGVAR(medical,ivBags), []]); + + if (GET_BLOOD_VOLUME(_target) + (_totalIvVolume / 1000) > BLOOD_VOLUME_CLASS_2_HEMORRHAGE) exitWith { + _treatmentEvent = "#waitForBlood"; + }; + _treatmentEvent = QEGVAR(medical_treatment,ivBagLocal); + _treatmentTime = 5; + _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "SalineIV"]; + }; + case ((count (_target getVariable [VAR_MEDICATIONS, []])) >= 6): { + _treatmentEvent = "#tooManyMeds"; + }; + case ((_fractures select 4) == 1): { + _treatmentEvent = QEGVAR(medical_treatment,splintLocal); + _treatmentTime = 6; + _treatmentArgs = [_healer, _target, "leftleg"]; + }; + case ((_fractures select 5) == 1): { + _treatmentEvent = QEGVAR(medical_treatment,splintLocal); + _treatmentTime = 6; + _treatmentArgs = [_healer, _target, "rightleg"]; + }; + case (IS_UNCONSCIOUS(_target) || {_heartRate <= 50}): { + if (CBA_missionTime < (_target getVariable [QGVAR(nextEpinephrine), -1])) exitWith { + _treatmentEvent = "#waitForEpinephrineToTakeEffect"; + }; + if (_heartRate > 180) exitWith { + _treatmentEvent = "#waitForSlowerHeart"; + }; + _target setVariable [QGVAR(nextEpinephrine), CBA_missionTime + 10]; + _treatmentEvent = QEGVAR(medical_treatment,medicationLocal); + _treatmentTime = 2.5; + _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "Epinephrine"]; + }; + case ((GET_PAIN_PERCEIVED(_target) > 0.25) || {_heartRate >= 180}): { + if (CBA_missionTime < (_target getVariable [QGVAR(nextMorphine), -1])) exitWith { + _treatmentEvent = "#waitForMorphineToTakeEffect"; + }; + if (_heartRate < 60) exitWith { + _treatmentEvent = "#waitForFasterHeart"; + }; + _target setVariable [QGVAR(nextMorphine), CBA_missionTime + 30]; + _treatmentEvent = QEGVAR(medical_treatment,medicationLocal); + _treatmentTime = 2.5; + _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "Morphine"]; + }; +}; + +_healer setVariable [QGVAR(currentTreatment), [CBA_missionTime + _treatmentTime, _target, _treatmentEvent, _treatmentArgs]]; + +// Play animation +if ((_treatmentEvent select [0,1]) != "#") then { + private _treatmentClassname = _treatmentArgs select 2; + if (_treatmentEvent == QEGVAR(medical_treatment,splintLocal)) then { _treatmentClassname = "Splint" }; + [_healer, _treatmentClassname, (_healer == _target)] call FUNC(playTreatmentAnim); +}; + +#ifdef DEBUG_MODE_FULL +TRACE_4("treatment started",_treatmentTime,_target,_treatmentEvent,_treatmentArgs); +systemChat format ["Treatment [%1->%2]: %3", _healer, _target, _treatmentEvent]; +#endif diff --git a/addons/medical_ai/functions/fnc_isInjured.sqf b/addons/medical_ai/functions/fnc_isInjured.sqf index 8cbe280914b..d022770f6d7 100644 --- a/addons/medical_ai/functions/fnc_isInjured.sqf +++ b/addons/medical_ai/functions/fnc_isInjured.sqf @@ -4,17 +4,23 @@ * Checks if a unit needs treatment. * * Arguments: - * None + * Unit * * Return Value: * Does unit need treatment * * Example: - * call ACE_medical_ai_fnc_isInjured + * player call ACE_medical_ai_fnc_isInjured * * Public: No */ if !(alive _this) exitWith {false}; -((_this getVariable [QEGVAR(medical,pain), 0] > 0.2) || {[_this] call EFUNC(medical,getBloodLoss) > 0 || {_this getVariable ["ACE_isUnconscious", false]}}) +(GET_WOUND_BLEEDING(_this) > 0) +|| {GET_PAIN_PERCEIVED(_this) > 0.25} +|| {IS_UNCONSCIOUS(_this)} +|| { + private _fractures = GET_FRACTURES(_this); + ((_fractures select 4) == 1) || {(_fractures select 5) == 1} +} diff --git a/addons/medical_ai/functions/fnc_isSafe.sqf b/addons/medical_ai/functions/fnc_isSafe.sqf index b18adbdc1cb..3c6c9f5dca2 100644 --- a/addons/medical_ai/functions/fnc_isSafe.sqf +++ b/addons/medical_ai/functions/fnc_isSafe.sqf @@ -4,7 +4,7 @@ * Checks if a unit is currently considered safe enough to treat itself. * * Arguments: - * None + * Unit * * Return Value: * Is unit safe enough @@ -15,4 +15,6 @@ * Public: No */ -(getSuppression _this == 0) && {CBA_missionTime - (_this getVariable [QGVAR(lastFired), -30]) > 30} +(getSuppression _this == 0) +&& {CBA_missionTime - (_this getVariable [QGVAR(lastFired), -30]) > 30} +&& {!(_this getVariable [QEGVAR(captives,isHandcuffed), false])} diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf index 92d5460dafd..5b594edae2c 100644 --- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf +++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf @@ -5,7 +5,7 @@ * * Arguments: * 0: Unit - * 1: Is bandage + * 1: Treatment name * 2: Is self treatment * * Return Value: @@ -16,17 +16,12 @@ * * Public: No */ -params ["_unit", "_isBandage", "_isSelfTreatment"]; +params ["_unit", "_actionName", "_isSelfTreatment"]; +TRACE_3("playTreatmentAnim",_unit,_actionName,_isSelfTreatment); if (vehicle _unit != _unit) exitWith {}; -private _animConfig = if (_isBandage) then { - configFile >> "ACE_Medical_Actions" >> "Basic" >> "Bandage"; -} else { - configFile >> "ACE_Medical_Actions" >> "Basic" >> "Morphine"; -}; - -private _configProperty = "animationCaller"; +private _configProperty = "animationMedic"; if (_isSelfTreatment) then { _configProperty = _configProperty + "Self"; }; @@ -34,7 +29,9 @@ if (stance _unit == "PRONE") then { _configProperty = _configProperty + "Prone"; }; -private _anim = getText (_animConfig >> _configProperty); +private _anim = getText (configFile >> QEGVAR(medical_treatment,Actions) >> _actionName >> _configProperty); +if (_anim == "") exitWith { WARNING_2("no anim [%1, %2]",_actionName,_configProperty); }; + private _wpn = switch (true) do { case ((currentWeapon _unit) == ""): {"non"}; case ((currentWeapon _unit) == (primaryWeapon _unit)): {"rfl"}; diff --git a/addons/medical_ai/initSettings.sqf b/addons/medical_ai/initSettings.sqf new file mode 100644 index 00000000000..6fada00db52 --- /dev/null +++ b/addons/medical_ai/initSettings.sqf @@ -0,0 +1,17 @@ +// CBA Settings [ADDON: ace_medical_ai]: + +private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"]; + +[ + QGVAR(enabledFor), "LIST", + [LLSTRING(enableFor_title), LLSTRING(enableFor_desc)], + _categoryArray, + [ + [0, 1, 2], + [LELSTRING(Common,Disabled), LLSTRING(enabledFor_OnlyServerAndHC), LELSTRING(Common,Enabled)], + 2 + ], + true, // isGlobal + {[QGVAR(enabledFor), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical_ai/script_component.hpp b/addons/medical_ai/script_component.hpp index cd0c0477514..006c21ac2a3 100644 --- a/addons/medical_ai/script_component.hpp +++ b/addons/medical_ai/script_component.hpp @@ -14,4 +14,5 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_AI #endif +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" #include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/medical_ai/stateMachine.sqf b/addons/medical_ai/stateMachine.sqf new file mode 100644 index 00000000000..48d5a6ef8e7 --- /dev/null +++ b/addons/medical_ai/stateMachine.sqf @@ -0,0 +1,67 @@ +GVAR(stateMachine) = [{call EFUNC(common,getLocalUnits)}, true] call CBA_statemachine_fnc_create; + +// Add states [statemachine, onState, onStateEntered, onStateLeaving, name] +[GVAR(stateMachine), {}, {}, {}, "Initial"] call CBA_statemachine_fnc_addState; + +[GVAR(stateMachine), { + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 is injured", _this]; + #endif +}, {}, {}, "Injured"] call CBA_statemachine_fnc_addState; + +[GVAR(stateMachine), { + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 is injured and safe", _this]; + #endif +}, {}, {}, "Safe"] call CBA_statemachine_fnc_addState; + +[GVAR(stateMachine), LINKFUNC(healSelf), {}, { + _this setVariable [QGVAR(treatmentOverAt), nil]; +}, "HealSelf"] call CBA_statemachine_fnc_addState; + +[GVAR(stateMachine), LINKFUNC(healUnit), {}, { + _this setVariable [QGVAR(treatmentOverAt), nil]; +}, "HealUnit"] call CBA_statemachine_fnc_addState; + +// Add Transistions [statemachine, originalState, targetState, condition, onTransition, name] +[GVAR(stateMachine), "Initial", "Injured", LINKFUNC(isInjured), {}, "Injured"] call CBA_statemachine_fnc_addTransition; +[GVAR(stateMachine), "Initial", "HealUnit", {(call FUNC(isSafe)) && FUNC(wasRequested)}, {}, "HealUnit"] call CBA_statemachine_fnc_addTransition; + +[GVAR(stateMachine), "Injured", "Safe", LINKFUNC(isSafe), {}, "InSafety"] call CBA_statemachine_fnc_addTransition; + +[GVAR(stateMachine), "Safe", "HealSelf", LINKFUNC(canRequestMedic), LINKFUNC(requestMedic), "RequestMedic"] call CBA_statemachine_fnc_addTransition; +[GVAR(stateMachine), "Safe", "HealSelf", {true}, {}, "HealSelf"] call CBA_statemachine_fnc_addTransition; + + +[GVAR(stateMachine), "HealSelf", "Initial", { // Go back to initial state when done healing + !(call FUNC(isInjured)) && {isNil {_this getVariable QGVAR(currentTreatment)}} +}, { + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 finished healing themself", _this]; + #endif +}, "Initial"] call CBA_statemachine_fnc_addTransition; + +[GVAR(stateMachine), "HealSelf", "Injured", { // Stop treating when it's no more safe + !(call FUNC(isSafe)) && {isNil {_this getVariable QGVAR(currentTreatment)}} +}, { + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 is no longer safe", _this]; + #endif +}, "Injured"] call CBA_statemachine_fnc_addTransition; + + +[GVAR(stateMachine), "HealUnit", "Initial", { // Go back to initial state when done healing or it's no more safe to treat + !((call FUNC(wasRequested)) && FUNC(isSafe)) && {isNil {_this getVariable QGVAR(currentTreatment)}} +}, { + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 finished healing someone", _this]; + #endif +}, "Initial"] call CBA_statemachine_fnc_addTransition; + +[GVAR(stateMachine), "HealUnit", "Injured", { // Treating yourself has priority + (call FUNC(isInjured)) && {isNil {_this getVariable QGVAR(currentTreatment)}} +}, { + #ifdef DEBUG_MODE_FULL + systemChat format ["%1 was injured while healing someone", _this]; + #endif +}, "Injured"] call CBA_statemachine_fnc_addTransition; diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index c5c24a53e18..e8b73e56b3d 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -1,34 +1,48 @@ - - - Medical AI enabled for - 次に AI 治療を有効 - AI医疗启用 - AI醫療啟用 - AI medica abilitata per: - Medyczna SI aktywowana dla + + + Medic AI + Sanitäts KI + AI 衛生兵 + ИИ Медик + Médecine IA + IA Médico + AI醫療兵 + Medico AI + Zdravotnická AI + Medyk AI + Médico para IA + Medikal AI - - Enable AI units to heal themselves and each other. - AI ユニットの自己や相互治療を有効化します。 - 使AI单位能够彼此治疗自己 - 啟用AI能夠彼此醫療自己 - Permette alle unità AI di curare se stesse e fra di loro. - Zezwala jednostki SI do leczenia siebie samych i siebie nawzajem. + + AI will respond to injury and unconsciousness + KI reagiert auf Verletzungen und Bewusstlosigkeit + AI が負傷者と気絶している人に対して行動するようになります。 + ИИ будет реагировать на травмы и потерю сознания + Les unités IA seront sensibles aux blessures, ainsi qu'à la perte de connaissance. + A IA irá responder a ferimentos e perdas de consciência + AI對於受傷及無意識單位會有所反應 + L'intelligenza artificiale risponderà a lesioni e perdita di coscienza + UI reaguje na zranění a bezvědomí + AI zareaguje na obrażenia i utratę przytomności + La IA responderá a heridas e inconsciencia - + Only Server and HC Nur Server und HC Sólo Server y HC - Нур сервера унд HC + Только сервер и HC サーバーと HC のみ Tylko serwer i HC - Seulement sur le server ou le HC + Seulement sur le serveur ou le HC Solo Server e HC 只在伺服器或无头客户端 只在伺服器或無頭客戶端 서버와 헤드리스만 + Apenas Servidor e HC + Pouze Server a HC + Sadece Sunucu ve HC de diff --git a/addons/medical_blood/ACE_Settings.hpp b/addons/medical_blood/ACE_Settings.hpp index b5e1f0db21b..e9702654671 100644 --- a/addons/medical_blood/ACE_Settings.hpp +++ b/addons/medical_blood/ACE_Settings.hpp @@ -1,10 +1,5 @@ class ACE_Settings { class GVAR(enabledFor) { - category = ECSTRING(medical,Category_Medical); - displayName = CSTRING(MedicalBloodSettings_enabledFor_DisplayName); - description = CSTRING(MedicalBloodSettings_enabledFor_Description); - value = 2; - typeName = "SCALAR"; - values[] = {ECSTRING(Common,Disabled), CSTRING(enabledFor_OnlyPlayers), ECSTRING(Common,Enabled)}; + movedToSQF = 1; }; }; diff --git a/addons/medical_blood/CfgEventHandlers.hpp b/addons/medical_blood/CfgEventHandlers.hpp index becf3950523..0d3301d6e0a 100644 --- a/addons/medical_blood/CfgEventHandlers.hpp +++ b/addons/medical_blood/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); diff --git a/addons/medical_blood/README.md b/addons/medical_blood/README.md index 29632ffd29e..848f8f0308c 100644 --- a/addons/medical_blood/README.md +++ b/addons/medical_blood/README.md @@ -1,7 +1,7 @@ ace_medical_blood -=============== +================= -Adds blood visual effect on the ground near a bleeding player. +Creates blood drops on the ground near bleeding units. ## Maintainers diff --git a/addons/medical_blood/XEH_PREP.hpp b/addons/medical_blood/XEH_PREP.hpp index 64ebbae911c..ebed657cc57 100644 --- a/addons/medical_blood/XEH_PREP.hpp +++ b/addons/medical_blood/XEH_PREP.hpp @@ -1,6 +1,7 @@ - -PREP(hit); +PREP(cleanupLoop); +PREP(createBlood); +PREP(handleWoundReceived); +PREP(init); PREP(isBleeding); PREP(onBleeding); -PREP(createBlood); PREP(spurt); diff --git a/addons/medical_blood/XEH_postInit.sqf b/addons/medical_blood/XEH_postInit.sqf index ceff7f074ce..02201f5506f 100644 --- a/addons/medical_blood/XEH_postInit.sqf +++ b/addons/medical_blood/XEH_postInit.sqf @@ -3,44 +3,25 @@ GVAR(useAceMedical) = ["ace_medical"] call EFUNC(common,isModLoaded); // To support public API regardless of component settings -[QGVAR(spurt), { - _this call FUNC(spurt); -}] call CBA_fnc_addEventHandler; +[QGVAR(spurt), FUNC(spurt)] call CBA_fnc_addEventHandler; if (isServer) then { GVAR(bloodDrops) = []; [QGVAR(bloodDropCreated), { params ["_bloodDrop"]; - GVAR(bloodDrops) pushBack _bloodDrop; - if (count GVAR(bloodDrops) >= MAX_BLOOD_OBJECTS) then { - private _deletedBloodDrop = GVAR(bloodDrops) deleteAt 0; + + // Add to created queue with format: [expire time, blood object] + private _index = GVAR(bloodDrops) pushBack [CBA_missionTime + GVAR(bloodLifetime), _bloodDrop]; + + if (count GVAR(bloodDrops) >= GVAR(maxBloodObjects)) then { + (GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; deleteVehicle _deletedBloodDrop; }; - [{deleteVehicle _this}, _bloodDrop, BLOOD_OBJECT_LIFETIME] call CBA_fnc_waitAndExecute; + // Start the cleanup loop + if (_index == 0) then { + [FUNC(cleanupLoop), [], GVAR(bloodLifetime)] call CBA_fnc_waitAndExecute; + }; }] call CBA_fnc_addEventHandler; }; - -["ace_settingsInitialized", { - TRACE_1("settingsInitialized", GVAR(enabledFor)); - if (GVAR(enabledFor) == 0) exitWith {}; // 0: disabled - if ((GVAR(enabledFor) == 1) && {!hasInterface}) exitWith {}; // 1: enabledFor_OnlyPlayers - - private _listcode = if (GVAR(enabledFor) == 1) then { - {[ACE_player] select {[_x] call FUNC(isBleeding)}} // ace_player is only possible local player - } else { - {allUnits select {(local _x) && {[_x] call FUNC(isBleeding)}}}; // filter all local bleeding units - }; - - private _stateMachine = [_listcode, true] call CBA_statemachine_fnc_create; - [_stateMachine, {call FUNC(onBleeding)}, {}, {}, "Bleeding"] call CBA_statemachine_fnc_addState; - - - ["CAManBase", "hit", { - params ["_unit"]; - if (GVAR(enabledFor) == 1 && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; - _this call FUNC(hit); - }] call CBA_fnc_addClassEventHandler; - -}] call CBA_fnc_addEventHandler; diff --git a/addons/medical_blood/XEH_preInit.sqf b/addons/medical_blood/XEH_preInit.sqf index 9cf50a1b608..ae4de9d0260 100644 --- a/addons/medical_blood/XEH_preInit.sqf +++ b/addons/medical_blood/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + // blood object model namespace GVAR(models) = [] call CBA_fnc_createNamespace; diff --git a/addons/medical_blood/config.cpp b/addons/medical_blood/config.cpp index 65b2a698094..3e5d5227daa 100644 --- a/addons/medical_blood/config.cpp +++ b/addons/medical_blood/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_main"}; + requiredAddons[] = {"ace_medical_status"}; author = ECSTRING(common,ACETeam); authors[] = {"Glowbal","Sickboy","commy2"}; url = ECSTRING(main,URL); @@ -14,5 +14,5 @@ class CfgPatches { }; }; -#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" +#include "ACE_Settings.hpp" diff --git a/addons/medical_blood/functions/fnc_cleanupLoop.sqf b/addons/medical_blood/functions/fnc_cleanupLoop.sqf new file mode 100644 index 00000000000..e8461b2e316 --- /dev/null +++ b/addons/medical_blood/functions/fnc_cleanupLoop.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Handles cleaning up blood objects that have reached the end of their lifetime. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_blood_fnc_cleanupLoop + * + * Public: No + */ + +(GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; +deleteVehicle _deletedBloodDrop; + +// Exit the loop if we have cleaned out the array +if (GVAR(bloodDrops) isEqualTo []) exitWith {}; + +// Wait until the next blood drop in the queue will expire +(GVAR(bloodDrops) select 0) params ["_expireTime"]; +[FUNC(cleanupLoop), [], _expireTime - CBA_missionTime] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_blood/functions/fnc_createBlood.sqf b/addons/medical_blood/functions/fnc_createBlood.sqf index 8d3fbc8776e..e54247d02ef 100644 --- a/addons/medical_blood/functions/fnc_createBlood.sqf +++ b/addons/medical_blood/functions/fnc_createBlood.sqf @@ -1,15 +1,15 @@ #include "script_component.hpp" /* * Author: Glowbal - * Spawn a blood drop. + * Creates a blood object and handles its cleanup. * Available blood drop classes are blooddrop_1 through blooddrop_4. * * Arguments: - * 0: classname of blood drop + * 0: Blood Drop Type * 1: Position * * Return Value: - * Created blood drop + * Blood Drop * * Example: * ["blooddrop_2", getPos player] call ace_medical_blood_fnc_createBlood @@ -17,15 +17,15 @@ * Public: No */ -params ["_type", "_pos"]; -TRACE_2("creating blood",_type,_pos); +params ["_type", "_position"]; +TRACE_2("Creating blood",_type,_position); private _model = GVAR(models) getVariable _type; -private _object = createSimpleObject [_model, [0,0,0]]; -_object setDir random 360; -_object setPos _pos; +private _bloodDrop = createSimpleObject [_model, [0, 0, 0]]; +_bloodDrop setDir random 360; +_bloodDrop setPos _position; -[QGVAR(bloodDropCreated), [_object]] call CBA_fnc_serverEvent; +[QGVAR(bloodDropCreated), _bloodDrop] call CBA_fnc_serverEvent; -_object +_bloodDrop diff --git a/addons/medical_blood/functions/fnc_handleWoundReceived.sqf b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf new file mode 100644 index 00000000000..7447cac52fb --- /dev/null +++ b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handles the wounds received event by triggering any needed blood creation. + * + * Arguments: + * 0: Unit + * 1: Body Part (not used) + * 2: Damage + * 3: Shooter + * + * Return Value: + * None + * + * Example: + * [player, "Body", 0.5, badGuy] call ace_medical_blood_fnc_handleWoundReceived + * + * Public: No + */ + +params ["_unit", "", "_damage", "_shooter"]; + +// Don't bleed when players only and a non-player unit is wounded +if (GVAR(enabledFor) == BLOOD_ONLY_PLAYERS && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; + +// Don't bleed on the ground if in a vehicle +if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")}) exitWith {}; + +private _bulletDir = if (isNull _shooter) then { + random 360 // Cannot calculate the direction properly, pick a random direction +} else { + _shooter getDir _unit // Calculate the bullet direction +}; + +[QGVAR(spurt), [_unit, _bulletDir, _damage min 1]] call CBA_fnc_serverEvent; diff --git a/addons/medical_blood/functions/fnc_hit.sqf b/addons/medical_blood/functions/fnc_hit.sqf deleted file mode 100644 index 17df627f1f2..00000000000 --- a/addons/medical_blood/functions/fnc_hit.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handle unit hit eventhandler - * - * Arguments: - * 0: unit - * 1: caused by - * 2: damage - * - * Return Value: - * None - * - * Example: - * [bob, kevin, 5] call ACE_medical_blood_fnc_hit - * - * Public: No - */ - -params ["_unit", "_causedBy", "_damage"]; - -if (((vehicle _unit) != _unit) && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted - -if (isNull _causedBy) exitWith { // won't be able to calculate the direction properly, so instead we pick something at random - [QGVAR(spurt), [_unit, random 360, _damage]] call CBA_fnc_serverEvent; -}; - -// Calculate bulletDirection -private _bulletDir = _unit getDir _causedBy; - -[QGVAR(spurt), [_unit, _bulletDir, _damage]] call CBA_fnc_serverEvent; diff --git a/addons/medical_blood/functions/fnc_init.sqf b/addons/medical_blood/functions/fnc_init.sqf new file mode 100644 index 00000000000..336d964de76 --- /dev/null +++ b/addons/medical_blood/functions/fnc_init.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Initializes the medical blood system based on the given mode. + * Should only be called from the CBA setting changed script. + * + * Arguments: + * 0: Mode + * + * Return Value: + * None + * + * Example: + * [2] call ace_medical_blood_fnc_init + * + * Public: No + */ + +params ["_mode"]; + +// Exit if setting is refreshed to the same value +if (!isNil QGVAR(currentSetup) && {_mode == GVAR(currentSetup)}) exitWith { + TRACE_2("Setting refreshed to current setup",GVAR(currentSetup),_mode); +}; + +// Track this new configuration that will be set up +GVAR(currentSetup) = _mode; + +// Delete current state machine if it exists +if (!isNil QGVAR(stateMachine)) then { + GVAR(stateMachine) call CBA_statemachine_fnc_delete; + GVAR(stateMachine) = nil; +}; + +// Remove wound received if it was previously added +if (!isNil QGVAR(woundReceivedEH)) then { + [QEGVAR(medical,woundReceived), GVAR(woundReceivedEH)] call CBA_fnc_removeEventHandler; + GVAR(woundReceivedEH) = nil; +}; + +// Don't need to set up anything if blood is disabled or players only on a non-player machine +if (_mode == BLOOD_DISABLED || {_mode == BLOOD_ONLY_PLAYERS && {!hasInterface}}) exitWith { + TRACE_1("Mode does not require any setup",_mode); +}; + +private _listCode = if (_mode == BLOOD_ONLY_PLAYERS) then { + // ACE_player is the only possible local player + { + if (alive ACE_player) then { + [ACE_player] + } else { + [] + }; + } +} else { + // Filter all local units + EFUNC(common,getLocalUnits) +}; + +GVAR(stateMachine) = [_listCode, true] call CBA_statemachine_fnc_create; +[GVAR(stateMachine), LINKFUNC(onBleeding), {}, {}, "Bleeding"] call CBA_statemachine_fnc_addState; + +GVAR(woundReceivedEH) = [QEGVAR(medical,woundReceived), FUNC(handleWoundReceived)] call CBA_fnc_addEventHandler; + +TRACE_3("Set up state machine and wounds event",_mode,GVAR(stateMachine),GVAR(woundReceivedEH)); diff --git a/addons/medical_blood/functions/fnc_isBleeding.sqf b/addons/medical_blood/functions/fnc_isBleeding.sqf index 73e5c10e6f9..14aecbb55b6 100644 --- a/addons/medical_blood/functions/fnc_isBleeding.sqf +++ b/addons/medical_blood/functions/fnc_isBleeding.sqf @@ -1,16 +1,16 @@ #include "script_component.hpp" /* * Author: Glowbal - * Check if is bleeding + * Checks if the given unit is bleeding. Handles both ACE Medical and Vanilla. * * Arguments: - * 0: unit + * 0: Unit * * Return Value: - * is Bleeding + * Is Bleeding * * Example: - * [UNIT] call ace_medical_blood_fnc_isBleeding + * [player] call ace_medical_blood_fnc_isBleeding * * Public: No */ @@ -18,6 +18,7 @@ params ["_unit"]; if (GVAR(useAceMedical)) exitWith { - _unit getVariable [QEGVAR(medical,isBleeding), false]; + IS_BLEEDING(_unit); }; -alive _unit && {getDammage _unit > 0.3}; + +alive _unit && {getDammage _unit > 0.3} diff --git a/addons/medical_blood/functions/fnc_onBleeding.sqf b/addons/medical_blood/functions/fnc_onBleeding.sqf index e21f68f02fb..8b6bcbb8f6b 100644 --- a/addons/medical_blood/functions/fnc_onBleeding.sqf +++ b/addons/medical_blood/functions/fnc_onBleeding.sqf @@ -1,38 +1,39 @@ #include "script_component.hpp" /* * Author: Glowbal - * handle bleeding state (state machine) + * Handles periodically creating blood for a bleeding unit. + * Called from the medical_blood state machine. * * Arguments: - * 0: unit + * 0: Unit * * Return Value: - * is Bleeding + * None * * Example: - * [UNIT] call ace_medical_blood_fnc_onBleeding + * [player] call ace_medical_blood_fnc_onBleeding * * Public: No */ params ["_unit"]; -if (((vehicle _unit) != _unit) && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted +// Nothing to do if unit is not bleeding +if !(_unit call FUNC(isBleeding)) exitWith {}; -private _lastTime = _unit getVariable [QGVAR(lastTime), -10]; -private _bloodLoss = (if (GVAR(useAceMedical)) then {([_unit] call EFUNC(medical,getBloodLoss)) * 2.5} else {getDammage _unit * 2}) min 6; +// Don't bleed on the ground if in a vehicle +if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")}) exitWith {}; -if ((CBA_missionTime - _lastTime) + _bloodLoss >= 8 + random 2) then { - _unit setVariable [QGVAR(lastTime), CBA_missionTime]; +if (CBA_missionTime > (_unit getVariable [QGVAR(nextTime), -10])) then { + private _bloodLoss = (if (GVAR(useAceMedical)) then {GET_BLOOD_LOSS(_unit) * 2.5} else {getDammage _unit * 2}) min 6; + _unit setVariable [QGVAR(nextTime), CBA_missionTime + 8 + random 2 - _bloodLoss]; + + TRACE_2("Creating blood drop for bleeding unit",_unit,_bloodLoss); private _position = getPosASL _unit; - _position = _position vectorAdd [ - random 0.4 - 0.2, - random 0.4 - 0.2, - 0 - ]; + _position = _position vectorAdd [random 0.4 - 0.2, random 0.4 - 0.2, 0]; _position set [2, 0]; private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss min 3); - [_bloodDrop, _position, getDir _unit] call FUNC(createBlood); + [_bloodDrop, _position] call FUNC(createBlood); }; diff --git a/addons/medical_blood/functions/fnc_spurt.sqf b/addons/medical_blood/functions/fnc_spurt.sqf index 6f1dbaaa1db..fd5c7a9fc0d 100644 --- a/addons/medical_blood/functions/fnc_spurt.sqf +++ b/addons/medical_blood/functions/fnc_spurt.sqf @@ -1,18 +1,18 @@ #include "script_component.hpp" /* * Author: Sickboy - * Spurt blood on the ground + * Spurts blood on the ground based on the direction and damage. * * Arguments: - * 0: unit - * 1: direction - * 2: damage + * 0: Unit + * 1: Direction + * 2: Damage * * Return Value: * None * * Example: - * [UNIT, random 360, 1] call ace_medical_blood_fnc_spurt + * [player, random 360, 1] call ace_medical_blood_fnc_spurt * * Public: No */ @@ -21,18 +21,20 @@ #define DISTANCE_BETWEEN_DROPS 0.20 #define OFFSET 0.25 -params ["_unit", "_dir", "_damage"]; -_damage = _damage min 1; +params ["_unit", "_direction", "_damage"]; private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage; private _offset = OFFSET + _distanceBetweenDrops; -private _pos = _unit getPos [_offset, _dir]; -["blooddrop_2", _pos, _dir] call FUNC(createBlood); +private _position = _unit getPos [_offset, _direction]; + +["blooddrop_2", _position, _direction] call FUNC(createBlood); private _dropAmount = ceil (MAXIMUM_DROPS * _damage); +TRACE_2("Spurting blood",_dropAmount,_damage); + if (_dropAmount > 1) then { for "_i" from 2 to _dropAmount do { - _pos = _pos getPos [_distanceBetweenDrops, _dir]; - ["blooddrop_1", _pos, _dir] call FUNC(createBlood); + _position = _position getPos [_distanceBetweenDrops, _direction]; + ["blooddrop_1", _position, _direction] call FUNC(createBlood); }; }; diff --git a/addons/medical_blood/initSettings.sqf b/addons/medical_blood/initSettings.sqf new file mode 100644 index 00000000000..c2c52f93b89 --- /dev/null +++ b/addons/medical_blood/initSettings.sqf @@ -0,0 +1,27 @@ +[ + QGVAR(enabledFor), + "LIST", + [LSTRING(EnabledFor_DisplayName), LSTRING(EnabledFor_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [[BLOOD_DISABLED, BLOOD_ONLY_PLAYERS, BLOOD_ENABLED], [ELSTRING(Common,Disabled), LSTRING(OnlyPlayers), ELSTRING(Common,Enabled)], 2], + true, + LINKFUNC(init) +] call CBA_settings_fnc_init; + +[ + QGVAR(maxBloodObjects), + "LIST", + [LSTRING(MaxBloodObjects_DisplayName), LSTRING(MaxBloodObjects_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [[50, 100, 200, 300, 400, 500, 1000, 2000, 3000, 4000, 5000], [/* settings function will auto create names */], 5], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(bloodLifetime), + "TIME", + [LSTRING(BloodLifetime_DisplayName), LSTRING(BloodLifetime_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [1, 3600, 900], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_blood/script_component.hpp b/addons/medical_blood/script_component.hpp index 335cdc44c5f..d2bcbf9599b 100644 --- a/addons/medical_blood/script_component.hpp +++ b/addons/medical_blood/script_component.hpp @@ -2,7 +2,7 @@ #define COMPONENT_BEAUTIFIED Medical Blood #include "\z\ace\addons\main\script_mod.hpp" -// #define DEBUG_ENABLED_MEDICAL_BLOOD +// #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS @@ -14,7 +14,9 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_BLOOD #endif +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" #include "\z\ace\addons\main\script_macros.hpp" -#define MAX_BLOOD_OBJECTS 500 -#define BLOOD_OBJECT_LIFETIME 900 +#define BLOOD_DISABLED 0 +#define BLOOD_ONLY_PLAYERS 1 +#define BLOOD_ENABLED 2 diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index d58f41bfc49..79f8f7ba75d 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -1,38 +1,122 @@ - - - Only Players - プレイヤーのみ - Nur Spieler - 오직 플레이어만 - Tylko gracze - Joueurs seulement - Solo Giocatori - 只有玩家 - 只有玩家 + + + Blood + Sang + Sangre + Sangue + Krew + Кровь + Blut + Krev + Sangue + 혈흔 + 血痕 + 血跡 + Kan - + Enable Blood Drops 血痕を有効化 Aktiviere Blutspritzer 피흘리기 활성화 Włącz ślady krwi na ziemi - Active les gouttes de sang + Activer les gouttes de sang Abilita Perdite di Sangue 开启血液滴落效果 開啟血液滴落效果 + Разрешить капли крови + Permitir gotas de sangue + Povolit kapky krve + Habilitar manchas de sangre + Kan Damlalarıı Etkinleştir + + + Enables the creation of blood drops when units are bleeding or take damage. + ユニットが出血かダメージを受けた時に、血痕を残すようにします。 + Si une unité saigne, elle laissera des traces de sang derrière elle. + Разрешает создание капель крови при кровотечении или получении урона + Permitir a criação de gotas de sangue quando as unidades recebem ferimentos ou estão sangrando. + 啟用出血效果當單位失血或受傷的時候。 + Povoluje vytváření kapek krve na zemi když jednotka krvácí nebo utrpí zranění. + Umożliwia tworzenie śladów krwi, gdy jednostki krwawią lub otrzymują obrażenia. + Habilita la creación de sangrecuando la unidad está sangrando o recibe daño + Kişiler kanarken veya hasar alırken kan damlası oluşumunu sağlar. + Abilita la creazione di chiazze di sangue quando un'unità sta sanguinando o viene ferita. + Ermöglicht das Erstellen von Blutstropfen, wenn Einheiten am Bluten sind oder Schaden nehmen. + + + Max Blood Objects + 最大血痕数 + Quantité de sang à afficher + Макс. кол-во капель крови + Limite de objetos de sangue + 最大血跡數 + Massimo numero di chiazze di sangue + Maximum objektů krve + Maksymalna ilość śladów krwi + Máxima cantidad de objetos de sangre + Maksimum Kan Objeleri + Maximale Anzahl an Blutstropfen-Objekten + + + Sets the maximum number of blood drop objects which can be spawned, excessive amounts can cause FPS lag. + 生成される血痕オブジェクト数を設定できます。極端に増やすと FPS ラグを引き起こします。 + Définit le nombre maximal de traces de sangs pouvant être affichées.\nUne quantité excessive peut engendrer une baisse de FPS. + Задает макс. количество создаваемых объектов капель крови. Чрезмерное количество может вызвать задержку FPS + Define o limite máximo de objetos de gota de sangue que podem ser criados, quantidades excessivas podem causar lag de FPS. + 設定最大可存在的血跡數量。太極端的數量會導致幀數低落或卡頓 + Imposta il numero massimo di chiazze di sangue che possono essere depositate, quantità eccessive possono causare del lag di FPS. + Nastavuje maximum objektů krve na zemi, příliš mnoho může způsobit pokles FPS + Definiuje maksymalną ilość śladów krwi, które mogą zostać stworzone, nadmierne ilości mogą powodować spadki FPS. + Fija el límite de objetos de sangre que aparecerán, cantidades excesivas pueden causar caídas de FPS + Ortaya çıkabilecek maksimum kan damlası sayısını ayarlar, aşırı miktarlar FPS düşmesine neden olabilir. + Legt die maximale Anzahl an Blutstropfen-Objekten fest, die erscheinen können. Eine zu hoch eingestellte Anzahl kann Lags verursachen. - - Enable or disable Blood Drops created on bleeding and taking damage - ダメージを受けたり、出血していると出る血痕の有効か無効化 - Aktiviere oder deaktiviere Blutspritzer, die durch Blutungen oder bei Schadensnahme entstehen. - Włącz lub wyłącz pozostawianie śladów krwi na ziemi kiedy postać odnosi obrażenia bądź krwawi - (Dés)active les gouttes de sang lors d'un saignement ou de blessure - Abilita o disabilita la Perdite di Sangue create sanguinando e prendendo danno - 开启后, 会让受伤时伤口有血液滴落的效果 - 開啟後, 會讓受傷時傷口有血液滴落的效果 - 출혈이나 부상을 입었을 때, 떨어지는 혈액을 활성화 하거나 비활성화 합니다. + + Blood Lifetime + 血痕の寿命 + Durée d'affichage du sang + Время жизни капель крови + Duração do Sangue + 血跡時長 + Durata del sangue + Životnost krve + Czas trwania śladów krwi + Duración de la sangre + Kan Ömrü + Anzeigedauer der Blutstropfen + + + Controls the lifetime of blood drop objects. + 血痕オブジェクトの寿命を決定します。 + Définit la durée d'affichage des traces de sang. + Управляет временем жизни объектов капель крови. + Controla o tempo de vida que um objeto de gota de sangue tem. + 控制血跡在地上的時長 + Controlla la durata delle chiazze di sangue. + Nastavuje jak dlouho objekty krve na zemi vydrží. + Kontroluje czas trwania śladów krwi. + Controla el tiempo de vida que tendrán los objetos de sangre + Kan objelerinin silinme süresini belirler. + Kontrolliert die Anzeigedauer der Blutstropfen-Objekte. + + + Only Players + プレイヤーのみ + Nur Spieler + 오직 플레이어만 + Tylko gracze + Joueurs seulement + Solo Giocatori + 只有玩家 + 只有玩家 + Только игроки + Apenas Jogadores + Pouze hráči + Solo jugadores + Sadece Oyuncular diff --git a/addons/medical_damage/$PBOPREFIX$ b/addons/medical_damage/$PBOPREFIX$ new file mode 100644 index 00000000000..188701b5602 --- /dev/null +++ b/addons/medical_damage/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_damage \ No newline at end of file diff --git a/addons/medical_damage/ACE_Medical_Injuries.hpp b/addons/medical_damage/ACE_Medical_Injuries.hpp new file mode 100644 index 00000000000..fd03981398d --- /dev/null +++ b/addons/medical_damage/ACE_Medical_Injuries.hpp @@ -0,0 +1,131 @@ +// bleeding - maximum possible percentage of cardiac output bled for a given wound type (0 .. 1) +// pain - maximum possible pain level for a given wound type (0 .. 1) + +class ACE_Medical_Injuries { + // Defines all the possible injury types + class wounds { + // Source: Scarle + // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). + class Abrasion { + causes[] = {"falling", "ropeburn", "vehiclecrash", "collision", "unknown"}; + bleeding = 0.001; + pain = 0.4; + minDamage = 0.01; + maxDamage = 0.30; + }; + // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. + class Avulsion { + causes[] = {"explosive", "vehiclecrash", "collision", "grenade", "shell", "bullet", "backblast", "bite"}; + bleeding = 0.1; + pain = 1.0; + minDamage = 0.01; + causeLimping = 1; + }; + // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. + class Contusion { + causes[] = {"bullet", "backblast", "punch", "vehiclecrash", "collision", "falling"}; + bleeding = 0; + pain = 0.3; + minDamage = 0.02; + maxDamage = 0.35; + }; + // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. + class Crush { + causes[] = {"falling", "vehiclecrash", "collision", "punch", "unknown"}; + bleeding = 0.05; + pain = 0.8; + minDamage = 0.1; + causeLimping = 1; + causeFracture = 1; + }; + // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. + class Cut { + causes[] = {"vehiclecrash", "collision", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; + bleeding = 0.01; + pain = 0.1; + minDamage = 0.1; + }; + // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. + class Laceration { + causes[] = {"vehiclecrash", "collision", "punch"}; + bleeding = 0.05; + pain = 0.2; + minDamage = 0.01; + }; + // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. + class VelocityWound { + causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; + bleeding = 0.2; + pain = 0.9; + minDamage = 0.35; + causeLimping = 1; + causeFracture = 1; + }; + // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. + class PunctureWound { + causes[] = {"stab", "grenade"}; + bleeding = 0.05; + pain = 0.4; + minDamage = 0.02; + causeLimping = 1; + }; + }; + class damageTypes { + // thresholds[] {{, }, {...}} + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + + class bullet { + // above damage, amount. Put the highest threshold to the left and lower the threshold with the elements to the right of it. + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + class grenade { + thresholds[] = {{0.1, 3}, {0, 1}}; + selectionSpecific = 0; + }; + class explosive { + thresholds[] = {{1, 6}, {0.1, 4}, {0, 1}}; + selectionSpecific = 0; + }; + class shell { + thresholds[] = {{1, 7}, {0.1, 5}, {0, 1}}; + selectionSpecific = 0; + }; + class vehiclecrash { + thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + selectionSpecific = 0; + }; + class collision { + thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + selectionSpecific = 0; + }; + class backblast { + thresholds[] = {{1, 6}, {0.55, 5}, {0, 2}}; + selectionSpecific = 0; + }; + class stab { + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + class punch { + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + class falling { + thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + selectionSpecific = 0; + }; + class ropeburn { + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + //No related wounds as drowning should not cause wounds/bleeding. Can be extended for internal injuries if they are added. + class drowning { + thresholds[] = {{0, 0}}; + }; + class unknown { + thresholds[] = {{0.1, 1}}; + }; + }; +}; diff --git a/addons/medical_damage/ACE_Settings.hpp b/addons/medical_damage/ACE_Settings.hpp new file mode 100644 index 00000000000..d9356d8244b --- /dev/null +++ b/addons/medical_damage/ACE_Settings.hpp @@ -0,0 +1,8 @@ +class ACE_Settings { + class EGVAR(medical,playerDamageThreshold) { + movedToSQF = 1; + }; + class EGVAR(medical,AIDamageThreshold) { + movedToSQF = 1; + }; +}; diff --git a/addons/medical_damage/CfgAmmo.hpp b/addons/medical_damage/CfgAmmo.hpp new file mode 100644 index 00000000000..89dfb486bbb --- /dev/null +++ b/addons/medical_damage/CfgAmmo.hpp @@ -0,0 +1,93 @@ +class CfgAmmo { + class BulletCore; + class BulletBase: BulletCore { + ACE_damageType = "bullet"; + }; + class ShotgunCore; + class ShotgunBase: ShotgunCore { + ACE_damageType = "bullet"; + }; + + class Default; + class FuelExplosion: Default { + ACE_damageType = "explosive"; + }; + class Grenade: Default { + ACE_damageType = "grenade"; + }; + class GrenadeCore; + class GrenadeBase: GrenadeCore { + ACE_damageType = "grenade"; + }; + + class MineCore; + class MineBase: MineCore { + ACE_damageType = "explosive"; + }; + class PipeBombCore; + class PipeBombBase: PipeBombCore { + ACE_damageType = "explosive"; + }; + class DirectionalBombCore; + class DirectionalBombBase: DirectionalBombCore { + ACE_damageType = "explosive"; + }; + class BoundingMineCore; + class BoundingMineBase: BoundingMineCore { + ACE_damageType = "explosive"; + }; + + class RocketCore; + class RocketBase: RocketCore { + ACE_damageType = "explosive"; + }; + class MissileCore; + class MissileBase: MissileCore { + ACE_damageType = "explosive"; + }; + + class SubmunitionCore; + class SubmunitionBase: SubmunitionCore { + ACE_damageType = "explosive"; + }; + class SubmunitionBullet: SubmunitionBase { + ACE_damageType = "bullet"; + }; + + class ShellCore; + class ShellBase: ShellCore { + ACE_damageType = "shell"; + }; + + // There is no BombBase so we modify these separately + class BombCore; + class Bo_Mk82: BombCore { + ACE_damageType = "explosive"; + }; + class LaserBombCore; + class ammo_Bomb_LaserGuidedBase: LaserBombCore { + ACE_damageType = "explosive"; + }; + class BombDemine_01_Ammo_F: BombCore { + ACE_damageType = "explosive"; + }; + + // Autocannon rounds are special (#7401) + class B_19mm_HE: BulletBase { + ACE_damageType = "explosive"; + }; + class B_20mm: BulletBase { + ACE_damageType = "explosive"; + }; + class B_25mm: BulletBase { + ACE_damageType = "explosive"; + }; + class B_35mm_AA: BulletBase { + ACE_damageType = "explosive"; + }; + + // These are also special + class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase { + ACE_damageType = "explosive"; + }; +}; diff --git a/addons/medical_damage/CfgEden.hpp b/addons/medical_damage/CfgEden.hpp new file mode 100644 index 00000000000..23c6ea6762d --- /dev/null +++ b/addons/medical_damage/CfgEden.hpp @@ -0,0 +1,49 @@ +class Cfg3DEN { + class Attributes { + class Slider; + class GVAR(slider): Slider { + attributeLoad = "params [""_ctrlGroup""];\ + private _slider = _ctrlGroup controlsGroupCtrl 100;\ + private _edit = _ctrlGroup controlsGroupCtrl 101;\ + _slider sliderSetPosition _value;\ + _edit ctrlSetText (if (_value < 0.1) then {localize ""str_disp_default""} else {[_value, 1, 1] call CBA_fnc_formatNumber});"; + attributeSave = "params [""_ctrlGroup""];\ + sliderPosition (_ctrlGroup controlsGroupCtrl 100); "; + onLoad = "params [""_ctrlGroup""];\ + private _slider = _ctrlGroup controlsGroupCtrl 100;\ + private _edit = _ctrlGroup controlsGroupCtrl 101;\ + _slider sliderSetRange [0, 10];\ + _slider ctrlAddEventHandler [""SliderPosChanged"", {\ + params [""_slider""];\ + private _edit = (ctrlParentControlsGroup _slider) controlsGroupCtrl 101;\ + private _value = sliderPosition _slider;\ + _edit ctrlSetText (if (_value < 0.1) then {localize ""str_disp_default""} else {[_value, 1, 1] call CBA_fnc_formatNumber});\ + }];\ + _edit ctrlAddEventHandler [""KillFocus"", {\ + params [""_edit""];\ + private _slider = (ctrlParentControlsGroup _edit) controlsGroupCtrl 100;\ + private _value = ((parseNumber ctrlText _edit) min 10) max 0;\ + _slider sliderSetPosition _value;\ + _edit ctrlSetText (if (_value < 0.1) then { localize ""str_disp_default"" } else {[_value, 1, 1] call CBA_fnc_formatNumber});\ + }];"; + }; + }; + class Object { + class AttributeCategories { + class ace_attributes { + class Attributes { + class GVAR(threshold) { + property = QUOTE(threshold); + control = QGVAR(slider); + displayName = CSTRING(Eden_threshold_DisplayName); + tooltip = CSTRING(Eden_threshold_Description); + expression = QUOTE(if (_value >= 0.1) then {_this setVariable [ARR_3(QQEGVAR(medical,damageThreshold),_value,true)]}); + typeName = "NUMBER"; + condition = "objectControllable"; + defaultValue = 0; + }; + }; + }; + }; + }; +}; diff --git a/addons/medical_damage/CfgEventHandlers.hpp b/addons/medical_damage/CfgEventHandlers.hpp new file mode 100644 index 00000000000..93e3311cf2b --- /dev/null +++ b/addons/medical_damage/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/medical_damage/XEH_PREP.hpp b/addons/medical_damage/XEH_PREP.hpp new file mode 100644 index 00000000000..7f3a5b11021 --- /dev/null +++ b/addons/medical_damage/XEH_PREP.hpp @@ -0,0 +1,6 @@ +PREP(determineIfFatal); +PREP(getTypeOfDamage); +PREP(handleIncapacitation); +PREP(parseConfigForInjuries); +PREP(woundsHandler); +PREP(woundsHandlerSQF); diff --git a/addons/medical_damage/XEH_preInit.sqf b/addons/medical_damage/XEH_preInit.sqf new file mode 100644 index 00000000000..b649db67cf2 --- /dev/null +++ b/addons/medical_damage/XEH_preInit.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +call FUNC(parseConfigForInjuries); + +addMissionEventHandler ["Loaded",{ + INFO("Mission Loaded - Reloading medical configs for extension"); + // Reload configs into extension (handle full game restart) + call FUNC(parseConfigForInjuries); +}]; + +// decide which woundsHandler to use by whether the extension is present or not +// if ("ace_medical" callExtension "version" != "") then { + + // DFUNC(woundsHandlerActive) = LINKFUNC(woundsHandler); +// } else { + // INFO("Using woundsHandlerSQF"); + DFUNC(woundsHandlerActive) = LINKFUNC(woundsHandlerSQF); +// }; + +[QEGVAR(medical,woundReceived), { + params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo", "_damageSelectionArray"]; + + private _typeOfDamage = _ammo call FUNC(getTypeOfDamage); + [_unit, _woundedHitPoint, _receivedDamage, _typeOfDamage, _damageSelectionArray] call FUNC(woundsHandlerActive); +}] call CBA_fnc_addEventHandler; + +ADDON = true; diff --git a/addons/medical_damage/XEH_preStart.sqf b/addons/medical_damage/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_damage/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_damage/config.cpp b/addons/medical_damage/config.cpp new file mode 100644 index 00000000000..5edaa691b3d --- /dev/null +++ b/addons/medical_damage/config.cpp @@ -0,0 +1,29 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_engine"}; + author = ECSTRING(common,ACETeam); + authors[] = {""}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_Settings.hpp" +#include "ACE_Medical_Injuries.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgAmmo.hpp" +#include "CfgEden.hpp" + +/* +class ACE_Extensions { + class ace_medical { + // Not yet used + }; +}; + */ diff --git a/addons/medical_damage/functions/fnc_determineIfFatal.sqf b/addons/medical_damage/functions/fnc_determineIfFatal.sqf new file mode 100644 index 00000000000..097ec66ed65 --- /dev/null +++ b/addons/medical_damage/functions/fnc_determineIfFatal.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror, Glowbal + * Determines if damage is fatal + * + * Arguments: + * 0: The Unit + * 1: Part No + * 2: Damage Array - QGVAR(medical,bodyPartDamage) + * 3: New Damage + * + * ReturnValue: + * Was Fatal + * + * Example: + * [player, 0, 1.4, 0.7] call ace_medical_damage_fnc_determineIfFatal + * + * Public: No + */ + +params ["_unit", "_part", "_bodyPartDamage", "_woundDamage"]; + +if (_part > 1) exitWith { false }; + +scopeName "main"; + +if (EGVAR(medical,fatalDamageSource) in [0, 2]) then { + // Emulate damage to vital organs - Original rewrite logic, only powerfull headshots or random torso shots + if (_part == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}) exitWith { + // Fatal damage to the head is guaranteed death + TRACE_1("determineIfFatal: lethal headshot",_woundDamage); + true breakOut "main"; + }; + if (_part == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD} && {random 1 < HEART_HIT_CHANCE}) exitWith { + // Fatal damage to torso has various results based on organ hit - Heart shot is lethal + TRACE_1("determineIfFatal: lethal heartshot",_woundDamage); + true breakOut "main"; + }; +}; +if (EGVAR(medical,fatalDamageSource) in [1, 2]) then { + // Sum of trauma to critical areas can be fatal (e.g. many small hits) + private _damageThreshold = GET_DAMAGE_THRESHOLD(_unit); + private _headThreshhold = 1.25 * _damageThreshold; + private _bodyThreshhold = 1.5 * _damageThreshold; + + _bodyPartDamage params ["_headDamage", "_bodyDamage"]; + + private _vitalDamage = ((_headDamage - _headThreshhold) max 0) + ((_bodyDamage - _bodyThreshhold) max 0); + private _chanceFatal = 1 - exp -((_vitalDamage/FATAL_SUM_DAMAGE_WEIBULL_L)^FATAL_SUM_DAMAGE_WEIBULL_K); + TRACE_3("",_bodyPartDamage,_vitalDamage,_chanceFatal); + + if (_chanceFatal > random 1) exitWith { + TRACE_1("determineIfFatal: lethal trauma",_woundDamage); + true breakOut "main"; + }; +}; + +false + diff --git a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf new file mode 100644 index 00000000000..f73edf580f0 --- /dev/null +++ b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Get the type of damage based upon the projectile. + * + * Arguments: + * 0: The projectile classname OR the name of a damage type + * + * Return Value: + * Type of damage + * + * Example: + * ["bullet"] call ace_medical_damage_fnc_getTypeOfDamage + * + * Public: No + */ + +params ["_typeOfProjectile"]; + +private _damageType = GVAR(damageTypeCache) getVariable _typeOfProjectile; + +if (isNil "_damageType") then { + if (isText (configFile >> "CfgAmmo" >> _typeOfProjectile >> "ACE_damageType")) then { + _damageType = getText (configFile >> "CfgAmmo" >> _typeOfProjectile >> "ACE_damageType"); + } else { + WARNING_1("Ammo type [%1] has no ACE_damageType",_typeOfProjectile); + _damageType = "unknown"; + }; + + // config may define an invalid damage type + if (isNil {GVAR(allDamageTypesData) getVariable _damageType}) then { + WARNING_2("Damage type [%1] for ammo [%2] not found",_typeOfDamage,_typeOfProjectile); + _damageType = "unknown"; + }; + + TRACE_2("getTypeOfDamage caching",_typeOfProjectile,_damageType); + GVAR(damageTypeCache) setVariable [_typeOfProjectile, _damageType]; +}; + +_damageType // return diff --git a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf new file mode 100644 index 00000000000..bdfa3fe4dea --- /dev/null +++ b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: Ruthberg + * Handle incapacitation due to damage and pain + * + * Arguments: + * 0: The Unit + * + * ReturnValue: + * None + * + * Example: + * [player] call ace_medical_damage_fnc_handleIncapacitation + * + * Public: No + */ + +params ["_unit"]; + +private _painLevel = GET_PAIN_PERCEIVED(_unit); +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; + +_bodyPartDamage params ["_headDamage", "_bodyDamage", "_leftArmDamage", "_rightArmDamage", "_leftLegDamage", "_rightLegDamage"]; + +// Exclude non penetrating body damage +{ + _x params ["", "_bodyPartN", "_amountOf", "", "_damage"]; + if (_bodyPartN == 1 && {_damage < PENETRATION_THRESHOLD}) then { + _bodyDamage = _bodyDamage - (_amountOf * _damage); + }; +} forEach GET_OPEN_WOUNDS(_unit); + +private _damageThreshold = GET_DAMAGE_THRESHOLD(_unit); + +if ((_headDamage > _damageThreshold / 2) || {_bodyDamage > _damageThreshold} || {(_painLevel >= PAIN_UNCONSCIOUS) && {random 1 < 0.1}}) then { + [QEGVAR(medical,CriticalInjury), _unit] call CBA_fnc_localEvent; +}; diff --git a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf new file mode 100644 index 00000000000..8618a41b5df --- /dev/null +++ b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf @@ -0,0 +1,138 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Parse the ACE_Medical_Advanced config for all injury types. + * + * Arguments: + * None + * + * ReturnValue: + * None + * + * Example: + * [] call ace_medical_damage_fnc_parseConfigForInjuries + * + * Public: No + */ + +private _injuriesConfigRoot = configFile >> "ACE_Medical_Injuries"; + +// --- parse wounds +GVAR(woundClassNames) = []; +GVAR(woundClassNamesComplex) = []; // index = 10 * classID + category; [will contain nils] e.g. ["aMinor", "aMed", "aLarge", nil, nil..."bMinor"] +GVAR(woundsData) = []; + +private _woundsConfig = _injuriesConfigRoot >> "wounds"; +private _classID = 0; + +{ + private _entry = _x; + private _className = configName _entry; + + private _selections = GET_ARRAY(_entry >> "selections",["All"]); + private _bleeding = GET_NUMBER(_entry >> "bleeding",0); + private _pain = GET_NUMBER(_entry >> "pain",0); + private _minDamage = GET_NUMBER(_entry >> "minDamage",0); + private _maxDamage = GET_NUMBER(_entry >> "maxDamage",-1); + private _causes = GET_ARRAY(_entry >> "causes",[]); + private _causeLimping = GET_NUMBER(_entry >> "causeLimping",0) == 1; + private _causeFracture = GET_NUMBER(_entry >> "causeFracture",0) == 1; + + if !(_causes isEqualTo []) then { + GVAR(woundClassNames) pushBack _className; + GVAR(woundsData) pushBack [_classID, _selections, _bleeding, _pain, [_minDamage, _maxDamage], _causes, _className, _causeLimping, _causeFracture]; + { + GVAR(woundClassNamesComplex) set [10 * _classID + _forEachIndex, format ["%1%2", _className, _x]]; + } forEach ["Minor", "Medium", "Large"]; + _classID = _classID + 1; + }; +} forEach configProperties [_woundsConfig, "isClass _x"]; + +// --- parse damage types +GVAR(allDamageTypesData) = [] call CBA_fnc_createNamespace; +// cache for ammunition -> damageType +GVAR(damageTypeCache) = [] call CBA_fnc_createNamespace; + +// minimum lethal damage collection, mapped to damageTypes +private _damageTypesConfig = _injuriesConfigRoot >> "damageTypes"; +private _thresholdsDefault = getArray (_damageTypesConfig >> "thresholds"); +private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionSpecific"); + +// Collect all available damage types from the config +{ + private _entry = _x; + private _className = configName _entry; + + // Check if this type is in the causes of a wound class, if so, we will store the wound types for this damage type + private _woundTypes = []; + { + if (_className in (_x select 5)) then { + _woundTypes pushBack _x; + }; + } forEach GVAR(woundsData); + + private _damageTypeSubClassConfig = _damageTypesConfig >> _className; + + private _thresholds = GET_ARRAY(_damageTypeSubClassConfig >> "thresholds",_thresholdsDefault); + private _selectionSpecific = GET_NUMBER(_damageTypeSubClassConfig >> "selectionSpecific",_selectionSpecificDefault); + + GVAR(allDamageTypesData) setVariable [_className, [_thresholds, _selectionSpecific > 0, _woundTypes]]; + GVAR(damageTypeCache) setVariable [_className, _className]; + GVAR(damageTypeCache) setVariable ["#"+_className, _className]; + + /* + // extension loading + private _minDamageThresholds = (_thresholds apply {str (_x select 0)}) joinString ":"; + private _amountThresholds = (_thresholds apply {str (_x select 1)}) joinString ":"; + + // load in the damage types into the medical extension + private _extensionArgs = format [ + "addDamageType,%1,%2,%3,%4,%5", + _className, + 1, //@todo remove 'minLethalDamage' from extension + _minDamageThresholds, + _amountThresholds, + _selectionSpecific + ]; + TRACE_1("",_extensionArgs); + + // private _extensionRes = "ace_medical" callExtension _extensionArgs; + // TRACE_1("",_extensionRes); + */ +} forEach configProperties [_damageTypesConfig, "isClass _x"]; + +/* +// extension loading +{ + _x params ["_classID", "_selections", "_bleedingRate", "_pain", "_damageExtrema", "_causes", "_displayName"]; + _damageExtrema params ["_minDamage", "_maxDamage"]; + + private _className = GVAR(woundClassNames) select _forEachIndex; + + if (_displayName isEqualTo "") then { + _displayName = _className; + }; + + private _selections = _selections joinString ":"; + private _causes = _causes joinString ":"; + + private _extensionArgs = format [ + "addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", + _classID, + _className, + _selections, + _bleedingRate, + _pain, + _minDamage, + _maxDamage, + _causes, + _displayName + ]; + TRACE_1("",_extensionArgs); + + // private _extensionRes = "ace_medical" callExtension _extensionArgs; + // TRACE_1("",_extensionRes); +} forEach GVAR(woundsData); + +// "ace_medical" callExtension "ConfigComplete"; +*/ diff --git a/addons/medical_damage/functions/fnc_woundsHandler.sqf b/addons/medical_damage/functions/fnc_woundsHandler.sqf new file mode 100644 index 00000000000..049437fdf5b --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandler.sqf @@ -0,0 +1,141 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Body Part + * 2: Amount Of Damage + * 3: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, "Body", 0.5, "bullet"] call ace_medical_damage_fnc_woundsHandler + * + * Public: No + */ + +WARNING("this function needs to be updated for changes to woundsHandlerSQF"); + +params ["_unit", "_bodyPart", "_damage", "_typeOfDamage"]; +TRACE_4("start",_unit,_bodyPart,_damage,_typeOfDamage); + +if (_typeOfDamage isEqualTo "") then { + _typeOfDamage = "unknown"; +}; + +if (isNil {GVAR(allDamageTypesData) getVariable _typeOfDamage} ) then { + _typeOfDamage = "unknown"; +}; + +// Administration for open wounds and ids +private _openWounds = GET_OPEN_WOUNDS(_unit); +private _woundID = _unit getVariable [QEGVAR(medical,lastUniqueWoundID), 1]; // Unique wound ids are not used anywhere: ToDo Remove from openWounds array + +TRACE_4("extension call",_bodyPart,_damage,_typeOfDamage,_woundID); +private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _bodyPart, _damage, _typeOfDamage, _woundID]; +TRACE_1("",_extensionOutput); + +// these are default values and modified by _extensionOutput +(parseSimpleArray _extensionOutput) params ["_woundsCreated", "_painToAdd"]; + +// todo: Make the pain and bleeding calculations part of the extension again +private _woundDamage = _damage / ((count _woundsCreated) max 1); // If the damage creates multiple wounds +private _painLevel = 0; +private _critialDamage = false; +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; +private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); +{ + _x params ["", "_woundClassIDToAdd", "_bodyPartNToAdd", "", "_bleeding"]; + + _bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage]; + _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating + + // The higher the nastiness likelihood the higher the change to get a painful and bloody wound + private _nastinessLikelihood = linearConversion [0, 20, _woundDamage, 0.5, 30, true]; + private _bleedingModifier = 0.25 + 8 * exp ((random [-4.5, -5, -6]) / _nastinessLikelihood); + private _painModifier = 0.05 + 2 * exp (-2 / _nastinessLikelihood); + + TRACE_3("",_nastinessLikelihood,_bleedingModifier,_painModifier); + + _bleeding = _bleeding * _bleedingModifier; + private _pain = (((GVAR(woundsData) select _woundClassIDToAdd) select 3) * _painModifier); + _painLevel = _painLevel + _pain; + + // wound category (minor [0..0.5], medium[0.5..1.0], large[1.0+]) + private _category = floor linearConversion [0, 1, _bleedingModifier, 0, 2, true]; + + _x set [4, _bleeding]; + _x set [5, _woundDamage]; + _x set [6, _category]; + + + if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { + _critialDamage = true; + }; +#ifdef DEBUG_MODE_FULL + systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; +#endif + + // Emulate damage to vital organs + switch (true) do { + // Fatal damage to the head is guaranteed death + case (_bodyPartNToAdd == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}): { + TRACE_1("lethal headshot",_woundDamage toFixed 2); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + // Fatal damage to torso has various results based on organ hit + case (_bodyPartNToAdd == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD}): { + // Heart shot is lethal + if (random 1 < HEART_HIT_CHANCE) then { + TRACE_1("lethal heartshot",_woundDamage toFixed 2); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + }; + }; + + // todo `forceWalk` based on leg damage + private _causeLimping = (GVAR(woundsData) select _woundClassIDToAdd) select 7; + if (_causeLimping == 1 && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} && {_bodyPartNToAdd > 3}) then { + [_unit, true] call EFUNC(medical_engine,setLimping); + }; + + // if possible merge into existing wounds + private _createNewWound = true; + { + _x params ["", "_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage", "_oldCategory"]; + if (_woundClassIDToAdd == _classID && {_bodyPartNToAdd == _bodyPartN && {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}}) then { + if (_oldCategory == _category) exitWith { + private _newAmountOf = _oldAmountOf + 1; + _x set [3, _newAmountOf]; + private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; + _x set [4, _newBleeding]; + private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; + _x set [5, _newDamage]; + _createNewWound = false; + }; + }; + } forEach _openWounds; + + if (_createNewWound) then { + _openWounds pushBack _x; + }; +} forEach _woundsCreated; + +_unit setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; +_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; + +[_unit] call EFUNC(medical_status,updateWoundBloodLoss); + +_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); + +[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; + +if (_critialDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { + [_unit] call FUNC(handleIncapacitation); +}; + +TRACE_5("exit",_unit,_painLevel,GET_PAIN(_unit),GET_OPEN_WOUNDS(_unit),_woundsCreated); diff --git a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf new file mode 100644 index 00000000000..93472f1d7ae --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf @@ -0,0 +1,206 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Body Part + * 2: Amount Of Damage + * 3: Type of the damage done + * 4: Weighted array of damaged selections + * + * Return Value: + * None + * + * Example: + * [player, "Body", 0.5, "bullet", [1, 1]] call ace_medical_damage_fnc_woundsHandlerSQF + * + * Public: No + */ + +params ["_unit", "_bodyPart", "_damage", "_typeOfDamage", "_damageSelectionArray"]; +TRACE_5("woundsHandlerSQF",_unit,_bodyPart,_damage,_typeOfDamage,_damageSelectionArray); + +// Convert the selectionName to a number and ensure it is a valid selection. +private _bodyPartN = ALL_BODY_PARTS find toLower _bodyPart; +if (_bodyPartN < 0) exitWith { ERROR_1("invalid body part %1",_bodyPart); }; + +if ((_typeOfDamage isEqualTo "") || {isNil {GVAR(allDamageTypesData) getVariable _typeOfDamage}}) then { + WARNING_1("damage type [%1] not found",_typeOfDamage); + _typeOfDamage = "unknown"; +}; + +// Get the damage type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] +// WoundTypes are the available wounds for this damage type. Format [[classID, selections, bleedingRate, pain], ..] +private _damageTypeInfo = [GVAR(allDamageTypesData) getVariable _typeOfDamage] param [0, [[], false, []]]; +_damageTypeInfo params ["_thresholds", "_isSelectionSpecific", "_woundTypes"]; + +// find the available injuries for this damage type and damage amount +private _highestPossibleSpot = -1; +private _highestPossibleDamage = -1; +private _allPossibleInjuries = []; + +{ + _x params ["", "_selections", "", "", "_damageExtrema"]; + _damageExtrema params ["_minDamage", "_maxDamage"]; + + // Check if the damage is higher as the min damage for the specific injury + if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { + // Check if the injury can be applied to the given selection name + // if ("All" in _selections || {_bodyPart in _selections}) then { // @todo, this is case sensitive! [we have no injuries that use this, disabled for now] + + // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries + if (_minDamage > _highestPossibleDamage) then { + _highestPossibleSpot = _forEachIndex; + _highestPossibleDamage = _minDamage; + }; + + // Store the valid possible injury for the damage type, damage amount and selection + _allPossibleInjuries pushBack _x; + // }; + }; +} forEach _woundTypes; + +// No possible wounds available for this damage type or damage amount. +if (_highestPossibleSpot < 0) exitWith { TRACE_2("no wounds possible",_damage,_highestPossibleSpot); }; + +// Administration for open wounds and ids +private _openWounds = GET_OPEN_WOUNDS(_unit); + +private _updateDamageEffects = false; +private _painLevel = 0; +private _critialDamage = false; +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; +private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); + +{ + _x params ["_thresholdMinDam", "_thresholdWoundCount"]; + if (_damage > _thresholdMinDam) exitWith { + private _woundDamage = _damage / (_thresholdWoundCount max 1); // If the damage creates multiple wounds + for "_i" from 1 to _thresholdWoundCount do { + // Find the injury we are going to add. Format [ classID, allowedSelections, bleedingRate, injuryPain] + private _oldInjury = if (random 1 < 0.15) then { + _woundTypes select _highestPossibleSpot + } else { + selectRandom _allPossibleInjuries + }; + + _oldInjury params ["_woundClassIDToAdd", "", "_injuryBleedingRate", "_injuryPain", "", "", "", "_causeLimping", "_causeFracture"]; + + private _bodyPartNToAdd = if (_isSelectionSpecific) then {_bodyPartN} else {selectRandomWeighted _damageSelectionArray}; + + _bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage]; + _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating + + + // Damage to limbs/head is scaled higher than torso by engine + // Anything above this value is guaranteed worst wound possible + private _worstDamage = [2, 1, 4, 4, 4, 4] select _bodyPartNToAdd; + + // More wounds means more likely to get nasty wound + private _countModifier = 1 + random(_i - 1); + + // Config specifies bleeding and pain for worst possible wound + // Worse wound correlates to higher damage, damage is not capped at 1 + private _bleedModifier = linearConversion [0.1, _worstDamage, _woundDamage * _countModifier, 0.25, 1, true]; + private _painModifier = (_bleedModifier * random [0.7, 1, 1.3]) min 1; // Pain isn't directly scaled to bleeding + + private _bleeding = _injuryBleedingRate * _bleedModifier; + private _pain = _injuryPain * _painModifier; + _painLevel = _painLevel + _pain; + + // wound category (minor [0.25-0.5], medium [0.5-0.75], large [0.75+]) + private _category = floor linearConversion [0.25, 0.75, _bleedModifier, 0, 2, true]; + + private _classComplex = 10 * _woundClassIDToAdd + _category; + + // Create a new injury. Format [0:classComplex, 1:bodypart, 2:amountOf, 3:bleedingRate, 4:woundDamage] + private _injury = [_classComplex, _bodyPartNToAdd, 1, _bleeding, _woundDamage]; + + if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { + _critialDamage = true; + }; + if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then { + TRACE_1("determineIfFatal returned true",_woundDamage); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + + #ifdef DEBUG_MODE_FULL + systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; + #endif + + switch (true) do { + case ( + _causeFracture + && {EGVAR(medical,fractures) > 0} + && {_bodyPartNToAdd > 1} + && {_woundDamage > FRACTURE_DAMAGE_THRESHOLD} + && {random 1 < EGVAR(medical,fractureChance)} + ): { + private _fractures = GET_FRACTURES(_unit); + _fractures set [_bodyPartNToAdd, 1]; + _unit setVariable [VAR_FRACTURES, _fractures, true]; + + [QEGVAR(medical,fracture), [_unit, _bodyPartNToAdd]] call CBA_fnc_localEvent; + TRACE_1("Limb fracture",_bodyPartNToAdd); + + _updateDamageEffects = true; + }; + case ( + _causeLimping + && {EGVAR(medical,limping) > 0} + && {_bodyPartNToAdd > 3} + && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} + ): { + _updateDamageEffects = true; + }; + }; + + // if possible merge into existing wounds + private _createNewWound = true; + { + _x params ["_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage"]; + if ( + (_classComplex == _classID) && + {_bodyPartNToAdd == _bodyPartN} && + {(_bodyPartNToAdd != 1) || {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}} && // penetrating body damage is handled differently + {(_bodyPartNToAdd > 3) || {!_causeLimping} || {(_woundDamage <= LIMPING_DAMAGE_THRESHOLD) isEqualTo (_oldDamage <= LIMPING_DAMAGE_THRESHOLD)}} // ensure limping damage is stacked correctly + ) exitWith { + TRACE_2("merging with existing wound",_injury,_x); + private _newAmountOf = _oldAmountOf + 1; + _x set [2, _newAmountOf]; + private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; + _x set [3, _newBleeding]; + private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; + _x set [4, _newDamage]; + _createNewWound = false; + }; + } forEach _openWounds; + + if (_createNewWound) then { + TRACE_1("adding new wound",_injury); + _openWounds pushBack _injury; + }; + }; + }; +} forEach _thresholds; + +if (_updateDamageEffects) then { + [_unit] call EFUNC(medical_engine,updateDamageEffects); +}; + +_unit setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; +_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; + +[_unit] call EFUNC(medical_status,updateWoundBloodLoss); + +_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); + +[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; + +if (_critialDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { + [_unit] call FUNC(handleIncapacitation); +}; + +TRACE_4("exit",_unit,_painLevel,GET_PAIN(_unit),GET_OPEN_WOUNDS(_unit)); diff --git a/addons/medical_damage/functions/script_component.hpp b/addons/medical_damage/functions/script_component.hpp new file mode 100644 index 00000000000..66d3d51283e --- /dev/null +++ b/addons/medical_damage/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_damage\script_component.hpp" \ No newline at end of file diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf new file mode 100644 index 00000000000..e508f74621a --- /dev/null +++ b/addons/medical_damage/initSettings.sqf @@ -0,0 +1,26 @@ +[ + QEGVAR(medical,fatalDamageSource), + "LIST", + [LSTRING(fatalDamageSource_DisplayName), LSTRING(fatalDamageSource_Description)], + [ELSTRING(medical,Category)], + [[0, 1, 2], [LSTRING(fatalDamageSource_vitalShotsOnly), LSTRING(fatalDamageSource_trauma), LSTRING(fatalDamageSource_both)], 0], + true +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,playerDamageThreshold), + "SLIDER", + [LSTRING(PlayerDamageThreshold_DisplayName), LSTRING(PlayerDamageThreshold_Description)], + ELSTRING(medical,Category), + [0, 25, 1, 2], + true +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,AIDamageThreshold), + "SLIDER", + [LSTRING(AIDamageThreshold_DisplayName), LSTRING(AIDamageThreshold_Description)], + ELSTRING(medical,Category), + [0, 25, 1, 2], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_damage/script_component.hpp b/addons/medical_damage/script_component.hpp new file mode 100644 index 00000000000..272dc7d565b --- /dev/null +++ b/addons/medical_damage/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_damage +#define COMPONENT_BEAUTIFIED Medical Damage +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_DAMAGE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_DAMAGE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_DAMAGE +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml new file mode 100644 index 00000000000..335c8a401a5 --- /dev/null +++ b/addons/medical_damage/stringtable.xml @@ -0,0 +1,688 @@ + + + + + Player Critical Damage Threshold + プレイヤーのクリティカル ダメージしきい値 + Seuil de dégât critique du joueur + Порог критического урона игрока + Limite de Dano Crítico do Jogador + 玩家重擊承受量 + Soglia danni critici del giocatore + Kritická míra poškození pro hráče + Próg Obrażeń Krytycznych Gracza + Límite de daño crítico al jugador + Schwelle für kritischen Spielerschaden + + + Sets the amount of damage a player can receive before going unconscious (and dying if "Sum of Trauma" is enabled). + プレイヤーが気絶になる前に受けられるダメージ量を決定できます。 + Définit la quantité de dégâts qu'un joueur peut subir avant de perdre connaissance (ou mourir, si l'option "Somme des traumatismes" est sélectionnée). + Устанавливает количество урона, которое может получить игрок, прежде чем потеряет сознание. + Define a quantidade de dano que um jogador pode receber antes de ficar inconsciente. + 設定玩家在無意識前能承受多少傷害。 + Imposta la quantità di danno che un giocatore può ricevere prima di perdere conoscenza. + Nastavuje kolik poškození hráč může obdržet než upadne do bezvědomí. + Definiuje ilość obrażeń jaką może przyjąć gracz przed straceniem przytomności (oraz śmierci gdy "Suma urazów" jest włączona). + Fijar la cantidad de daño que un jugador puede recivir antes de caer inconsciente + Legt die Höhe des Schadens fest, den ein Spieler erhalten kann, bevor er ohnmächtig wird (oder stirbt, wenn "Summe aller Traumata" aktiviert ist). + Bir oyuncunun bayılmadan önce alabileceği hasar miktarını belirler. + + + AI Critical Damage Threshold + AI のクリティカル ダメージしきい値 + Seuil de dégât critique de l'IA + Порог критического урона AI + Limite de Dano Crítico da IA + AI重擊承受量 + Soglia dei danni critici dell AI + Kritická míra poškození pro AI + Próg Obrażeń Krytycznych AI + Límite de daño crítico de la IA + Schwelle für kritischen KI-Schaden + + + Sets the amount of damage an AI unit can receive before going unconscious (or dying when "Sum of Trauma" is enabled). + AI が気絶になる前に受けられるダメージ量を決定できます。 + Définit la quantité de dégâts qu'une unité IA peut subir avant de perdre connaissance (ou mourir, si l'option "Somme des traumatismes" est sélectionnée). + Устанавливает количество урона, которое может получить ИИ, прежде чем потеряет сознание. + Define a quantidade de dano que uma IA pode receber antes de ficar inconsciente. + 設定AI在無意識之前能承受多少傷害 + Imposta la quantità di danno che un'unità AI può ricevere prima di perdere conoscenza. + Nastavuje kolik poškození AI může obdržet než upadne do bezvědomí. + Definiuje ilość obrażeń jaką może przyjąć AI przed straceniem przytomności (oraz śmierci gdy "Suma urazów" jest włączona). + Fijar la cantidad de daño que la IA puede recivir antes de caer inconsciente + Legt die Höhe des Schadens fest, den eine KI-Einheit erhalten kann, bevor sie ohnmächtig wird (oder stirbt, wenn "Summe aller Traumata" aktiviert ist). + + + Scrape + Kratzer + Scorticatura + Ссадина + Écorchure + Draśnięcie + Arañazo + Horzsolás + Raspão + Odřenina + 擦り傷 + 긁힘 + 擦傷 + Sıyrık + 擦伤 + + + Minor Scrape + Kleiner Kratzer + Minima Scorticatura + Малая ссадина + Petite écorchure + Pomniejsze draśnięcie + Arañazo menor + Kis horzsolás + Raspão leve + Malá odřenina + 小さな擦り傷 + 조금 긁힘 + 小擦傷 + Küçük Sıyrık + 轻度擦伤 + + + Medium Scrape + Mittlerer Kratzer + Media Scorticatura + Средняя ссадина + Moyenne écorchure + Średnie draśnięcie + Arañazo medio + Közepes horzsolás + Raspão médio + Středně velká odřenina + 中くらいの擦り傷 + 꽤 긁힘 + 中度擦傷 + Orta Sıyrık + 中度擦伤 + + + Large Scrape + Großer Kratzer + Alta Scorticatura + Большая ссадина + Grande écorchure + Duże draśnięcie + Arañazo severo + Nagy horzsolás + Raspão grave + Velká odřenina + 大きな擦り傷 + 심하게 긁힘 + 嚴重擦傷 + Büyük Sıyrık + 重度擦伤 + + + Avulsion + Avulsion + Avulsione + Авульсия + Avulsion + Rana płatowa + Avulsión + Leszakadás + Avulsão + Avulze + 剥離傷 + 떨어져나감 + 撕除傷 + Kopma + 撕脱伤 + + + Minor Avulsion + Kleine Avulsion + Minima Avulsione + Малая Авульсия + Petite avulsion + Pomniejsza rana płatowa + Avulsión menor + Kis leszakadás + Avulsão leve + Malá avulze + 小さな剥離傷 + 조금 떨어져나감 + 小撕除傷 + Küçük Kopuk + 轻度撕脱伤 + + + Medium Avulsion + Mittlere Avulsion + Media Avulsione + Средняя Авульсия + Moyenne avulsion + Średnia rana płatowa + Avulsión media + Közepes leszakadás + Avulsão média + Střední avulze + 中くらいの剥離傷 + 꽤 떨어져나감 + 中度撕除傷 + Orta Kopuk + 中度撕脱伤 + + + Large Avulsion + Große Avulsion + Alta Avulsione + Большая Авульсия + Grande avulsion + Duża rana płatowa + Avulsión severa + Nagy leszakadás + Avulsão grave + Velká avulze + 大きな剥離傷 + 크게 떨어져나감 + 嚴重撕除傷 + Büyük Kopuk + 重度撕脱伤 + + + Bruise + Prellung + Contusione + Ушиб + Hématome + Stłuczenie + Contusión + Zúzódás + Contusão + Modřina + 打ち傷 + + 挫傷 + Yara + 挫伤 + + + Minor Bruise + Kleine Prellung + Minima Contusione + Слабый ушиб + Petit hématome + Pomniejsze stłuczenie + Contusión menor + Kis zúzódás + Contusão leve + Malá modřina + 小さな打ち傷 + 조금 멍듬 + 小挫傷 + Küçük Yara + 轻度挫伤 + + + Medium Bruise + Mittlere Prellung + Media Contusione + Средний ушиб + Moyen hématome + Średnie stłuczenie + Contusión media + Közepes zúzódás + Contusão média + Středně velká modřina + 中くらいの打ち傷 + 꽤 멍듬 + 中度挫傷 + Orta Yara + 中度挫伤 + + + Large Bruise + Große Prellung + Alta Contusione + Сильный ушиб + Grand hématome + Duże stłuczenie + Contusión severa + Nagy zúzódás + Contusão grave + Velká modřina + 大きな打撲傷 + 심하게 멍듬 + 嚴重挫傷 + Büyük Yara + 重度挫伤 + + + Crushed tissue + Quetschverletzung + Tessuto Schiacciato + Компрессионная травма + Tissu écrasé + Zgniecienie tkanek miękkich + Tejido triturado + Zúzott szövet + Tecido esmagado + Zhmoždění měkkých tkání + 圧挫傷 + 뭉개짐 + 壓迫傷 + Ezilmiş Doku + 挤压伤 + + + Minor crushed tissue + Kleine Quetschverletzung + Minimo Tessuto Schiacciato + Слабая компрессионная травма + Tissu légèrement écrasé + Pomniejsze zgniecienie tkanek miękkich + Tejido triturado menor + Kis zúzott szövet + Tecido esmagado leve + Malé zhmoždění měkkých tkání + 小さな圧挫傷 + 조금 뭉개짐 + 小壓迫傷 + Küçük Ezilmiş Doku + 轻度挤压伤 + + + Medium crushed tissue + Mittlere Quetschverletzung + Medio Tessuto Schiacciato + Умеренная компрессионная травма + Tissu moyennement écrasé + Średnie zgniecienie tkanek miękkich + Tejido triturado medio + Közepes zúzott szövet + Tecido esmagado médio + Střední zhmoždění měkkých tkání + 中くらいの圧挫傷 + 꽤 뭉개짐 + 中度壓迫傷 + Orta Ezilmiş Doku + 中度挤压伤 + + + Large crushed tissue + Große Quetschverletzung + Alto Tessuto Schiacciato + Сильная компрессионная травма + Tissu fortement écrasé + Duże zgniecienie tkanek miękkich + Tejido triturado severo + Nagy zúzött szövet + Tecido esmagado grave + Velké zhmoždění měkkých tkání + 大きな圧挫傷 + 심하게 뭉개짐 + 嚴重壓迫傷 + Büyük Ezilmiş Doku + 重度挤压伤 + + + Cut + Schnittwunde + Taglio + Порез + Coupure + Rana cięta + Corte + Vágás + Corte + Řezná rána + 切り傷 + 베임 + 割傷 + Kesik + 割伤 + + + Small Cut + Kleine Schnittwunde + Piccolo Taglio + Мелкий порез + Pomniejsza rana cięta + Corte menor + Kis vágás + Petite coupure + Corte leve + Malá řezná rána + 小さな切り傷 + 조금 베임 + 小割傷 + Küçük Kesik + 轻度割伤 + + + Medium Cut + Mittlere Schnittwunde + Medio Taglio + Средний порез + Średnia rana cięta + Corte mediano + Közepes vágás + Coupure moyenne + Corte médio + Střední řezná rána + 中くらいの切り傷 + 꽤 베임 + 中度割傷 + Orta Kesik + 中度割伤 + + + Large Cut + Große Schnittwunde + Grande Taglio + Сильный порез + Duża rana cięta + Corte severo + Nagy vágás + Large coupure + Corte grave + Velká řezná rána + 大きな切り傷 + 심하게 베임 + 嚴重割傷 + Büyük Kesik + 重度割伤 + + + Tear + Riss + Strappo + Рваная рана + Rozerwanie skóry + Lacération + Desgarro + Szakadás + Ruptura + Tržná rána + 裂傷 + 찢어짐 + 撕裂傷 + Yırtık + 裂伤 + + + Small Tear + Kleiner Riss + Piccolo Strappo + Малая рваная рана + Pomniejsze rozerwanie skóry + Petite lacération + Desgarro menor + Kis szakadás + Ruptura leve + Malá tržná rána + 小さな裂傷 + 조금 찢어짐 + 小撕裂傷 + Küçük Yırtık + 轻度裂伤 + + + Medium Tear + Mittlerer Riss + Medio Strappo + Средняя рваная рана + Średnie rozerwanie skóry + Desgarro medio + Közepes szakadás + Moyenne lacération + Ruptura média + Střední tržná rána + 中くらいの裂傷 + 꽤 찢어짐 + 中度撕裂傷 + Orta Yırtık + 中度裂伤 + + + Large Tear + Großer Riss + Grande Strappo + Большая рваная рана + Duże rozerwanie skóry + Desgarro severo + Nagy szakadás + Grande lacération + Ruptura grave + Velká tržná rána + 大きな裂傷 + 심하게 찢어짐 + 嚴重撕裂傷 + 重度裂伤 + + + Velocity Wound + Ballistisches Trauma + Velocità Ferita + Огнестрельная рана + Rana postrzałowa + Plaie pénétrante + Herida de bala + Lőtt seb + Ferimento por projétil de arma de fogo + Střelné poranění + 銃創 + 총상 + 槍傷 + Hız Yarası + 穿透伤 + + + Small Velocity Wound + Kleines Ballistisches Trauma + Lenta Velocità Ferita + Малая огнестрельная рана + Pomniejsza rana postrzałowa + Herida de bala menor + Kis lőtt seb + Petite plaie pénétrante + Ferimento leve por projétil de arma de fogo + Malé střelné poranění + 小さな銃創 + 소형 총상 + 小槍傷 + Küçük Hız Yarası + 轻度穿透伤 + + + Medium Velocity Wound + Mittleres Ballistisches Trauma + Media Velocità Ferita + Средняя огнестрельная рана + Średnia rana postrzałowa + Herida de bala media + Közepes lőtt seb + Plaie moyenne pénétrante + Ferimento médio por projétil de arma de fogo + Střední střelné poranění + 中くらいの銃創 + 중형 총상 + 中度槍傷 + Orta Hız Yarası + 中度穿透伤 + + + Large Velocity Wound + Großes Ballistisches Trauma + Alta Velocità Ferita + Большая огнестрельная рана + Duża rana postrzałowa + Herida de bala severa + Nagy lőtt seb + Grande plaie pénétrante + Ferimento grave por projétil de arma de fogo + Velké střelné poranění + 大きな銃創 + 대형 총상 + 嚴重槍傷 + Büyük Hız Yarası + 重度穿透伤 + + + Puncture Wound + Stichwunde + Puntura Ferita + Колотая рана + Rana kłuta + Blessure par perforation + Herida punzante + Szúrt seb + Ferimento por perfuração + Bodná rána + 刺し傷 + 관통상 + 刺傷 + Delinme Yarası + 刺伤 + + + Minor Puncture Wound + Kleine Stichwunde + Piccola Puntura Ferita + Малая колотая рана + Pomniejsza rana kłuta + Herida punzante menor + Kis szúrt seb + Petite perforation + Ferimento leve por perfuração + Malá bodná rána + 小さな刺し傷 + 소형 관통상 + 小刺傷 + Küçük Delinme Yarası + 轻度刺伤 + + + Medium Puncture Wound + Mittlere Stichwunde + Media Puntura Ferita + Средняя колотая рана + Średnia rana kłuta + Herida punzante media + Közepes szúrt seb + Moyenne perforation + Ferimento médio por perfuração + Střední bodná rána + 中くらいの刺し傷 + 중형 관통상 + 中度刺傷 + Orta Delinme Yarası + 中度刺伤 + + + Large Puncture Wound + Große Stichwunde + Grande Puntura Ferita + Большая колотая рана + Duża rana kłuta + Herida punzante severa + Nagy szúrt seb + Grande perforation + Ferimento grave por perfuração + Velká bodná rána + 大きな刺し傷 + 대형 관통상 + 嚴重刺傷 + Büyük Delinme Yarası + 重度刺伤 + + + Fatal Damage Source + Причина смертельного урона + 致命傷の原因 + 致命傷來源 + Cause de blessure mortelle + Fonte del danno fatale + Zdroj smrtelné škody + Źródło obrażeń krytycznych + Fonte de Dano Fatal + Origen de daño fatal + Ölümcül Hasar Kaynağı + Quelle für tödlichen Schaden + + + Determines what damage can be fatal + Определяет какой урон будет смертельным + 致命傷となるダメージの種類を決定します。 + 決定何種傷害為致命 + Determina quali danni possono essere fatali + Détermine le type de blessures pouvant être fatales. + Nastavuje jaké poškození může být smrtelné + Określa jakie obrażenia mogą być śmiertelne + Determina qual dano pode ser fatal + Determina qué daño puede ser fatal + Hangi hasarın ölümcül olabileceğini belirler + Bestimmt welcher Schaden tödlich ist. + + + Only large hits to vital organs + Только серьезные попадания в жизненно важные органы + 重要器官に大きなダメージを受けた時のみ + 只有重要器官之重傷 + Grosses blessures sur organes vitaux + Solo grandi colpi agli organi vitali + Pouze zásahy do životně důležitých orgánů + Tylko duże trafienia w ważne narządy + Apenas danos largos a órgãos vitais + Solo grandes heridas en organos vitales + Sadece hayati organlara büyük vuruşlar + Nur schwere Treffer an lebenswichtigen Organen + + + Sum of trauma + Совокупность травмы + 外傷の数 + 外部創傷累計 + Somme des traumatismes + Somma dei traumi + Celkové množství úrazů + Suma urazów + Soma do trauma + Suma de traumatismos + Summe aller Traumata + + + Either + Оба + 両方 + 兩者都是 + Les deux + o + Kterýkoliv ze dvou + Zarówno + Ou + Ambos + Ikisinden biri + Beide + + + Unit Damage Threshold + Schwelle für Schaden + Seuil de dégâts + ユニットのダメージしきい値 + Práh poškození + Порог урона + Próg obrażeń jednostki + + + Sets the amount of damage a unit can receive before going unconscious. (0 for mission default) + Legt die Höhe des Schadens fest, den eine Einheit erhalten kann, bevor diese ohnmächtig wird. (0 für Misionsnormalwert) + Définit la quantité de dégâts que l'unité peut subir avant de perdre connaissance (ou mourir, si l'option "Somme des traumatismes" est sélectionnée).\n(0 utilise la valeur définie dans la mission.) + ユニットが気絶するまで許容できるダメージ値を設定できます。標準: 0 + Určuje kolik poškození může jednotka utrpět než upadne do bezvědomí. (pro použití standardní hodnoty mise zadejte 0) + Устанавливает количество урона, которое может получить юнит перед тем, как потерять сознание. (0 для значения миссии) + Ustawia próg obrażeń jakie może otrzymać jednostka przed utratą przytomności. (0 jako ustawienie domyślne misji) + + + diff --git a/addons/medical_engine/$PBOPREFIX$ b/addons/medical_engine/$PBOPREFIX$ new file mode 100644 index 00000000000..6dc35db6f9e --- /dev/null +++ b/addons/medical_engine/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_engine diff --git a/addons/medical_engine/CfgActions.hpp b/addons/medical_engine/CfgActions.hpp new file mode 100644 index 00000000000..64ecf717dbd --- /dev/null +++ b/addons/medical_engine/CfgActions.hpp @@ -0,0 +1,16 @@ + +class CfgActions { + class None; + class Heal: None { + show = 0; + }; + class HealSoldier: None { + show = 0; + }; + class HealSoldierSelf: None { + show = 0; + }; + class FirstAid: None { + show = 0; + }; +}; diff --git a/addons/medical_engine/CfgEventHandlers.hpp b/addons/medical_engine/CfgEventHandlers.hpp new file mode 100644 index 00000000000..becf3950523 --- /dev/null +++ b/addons/medical_engine/CfgEventHandlers.hpp @@ -0,0 +1,18 @@ + +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_engine/CfgExtendedAnimation.hpp b/addons/medical_engine/CfgExtendedAnimation.hpp new file mode 100644 index 00000000000..596418bb7b1 --- /dev/null +++ b/addons/medical_engine/CfgExtendedAnimation.hpp @@ -0,0 +1,9 @@ + +class CfgExtendedAnimation { + class Revive { + left = QGVAR(faceLeft_unconscious); + right = QGVAR(faceRight_unconscious); + front = QGVAR(faceDown_unconscious); + back = QGVAR(faceUp_unconscious); + }; +}; diff --git a/addons/medical_engine/CfgMoves.hpp b/addons/medical_engine/CfgMoves.hpp new file mode 100644 index 00000000000..0bf6ac4b569 --- /dev/null +++ b/addons/medical_engine/CfgMoves.hpp @@ -0,0 +1,97 @@ + +class CfgMovesBasic; +class CfgMovesMaleSdr: CfgMovesBasic { + class States { + // fixes hand being stuck at rifle which is on the back + class AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon; + class AinvPknlMstpSlayWnonDnon_medicOther: AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon { + weaponIK = 0; + }; + + class Unconscious; + class DeadState; + class ace_unconscious_1: DeadState { + file = QPATHTO_T(data\ace_unconscious_1.rtm); + }; + class ace_unconscious_2: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_2.rtm); + }; + class ace_unconscious_3: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_3.rtm); + }; + class ace_unconscious_4: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_4.rtm); + }; + class ace_unconscious_5: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_5.rtm); + }; + class ace_unconscious_6: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_6.rtm); + }; + class ace_unconscious_7: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_7.rtm); + }; + class ace_unconscious_8: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_8.rtm); + }; + class ace_unconscious_1_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_1_1.rtm); + }; + class ace_unconscious_2_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_2_1.rtm); + }; + class ace_unconscious_3_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_3_1.rtm); + }; + class ace_unconscious_4_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_4_1.rtm); + }; + class ace_unconscious_5_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_5_1.rtm); + }; + class ace_unconscious_6_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_6_1.rtm); + }; + class ace_unconscious_7_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_7_1.rtm); + }; + class ace_unconscious_8_1: ace_unconscious_1 { + file = QPATHTO_T(data\ace_unconscious_8_1.rtm); + }; + /* added for the "ace_unc" part */ + class KIA_passenger_boat_holdleft; + class ace_unconscious_9: KIA_passenger_boat_holdleft { + }; + class KIA_driver_boat01; + class ace_unconscious_10: KIA_driver_boat01 { + }; + + class GVAR(faceDown_unconscious): Unconscious { + }; + + class GVAR(faceLeft_unconscious): Unconscious { + }; + + class GVAR(faceRight_unconscious): Unconscious { + }; + + class GVAR(faceUp_unconscious): Unconscious { + }; + + class AmovPpneMstpSnonWnonDnon; + class ACE_UnconsciousOutProne: AmovPpneMstpSnonWnonDnon { + //file = "\A3\anims_f\Data\Anim\Sdr\dth\pne\stp\ras\Rfl\AdthPpneMstpSrasWrflDnon_1"; + looped = 0; + canBlendStep = 0; + blockMobileSwitching = 1; + forceAim = 1; + interpolationRestart = 1; + variantsPlayer[] = {}; + variantsAI[] = {}; + useIdles = 0; + InterpolateTo[] = {"Unconscious",0.2}; + ConnectTo[] = {"AmovPpneMstpSnonWnonDnon",0.2}; + speed = 100; + }; + }; +}; diff --git a/addons/medical_engine/CfgVehicles.hpp b/addons/medical_engine/CfgVehicles.hpp new file mode 100644 index 00000000000..b17ca15a98a --- /dev/null +++ b/addons/medical_engine/CfgVehicles.hpp @@ -0,0 +1,124 @@ + +class CfgVehicles { + class Man; + class CAManBase: Man { + // General + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // BluFor + class B_Soldier_base_F; + class B_Soldier_04_f: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class B_Soldier_05_f: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + + // Indep + class I_Soldier_base_F; + class I_Soldier_03_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class I_Soldier_04_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + + // OpFor + class SoldierEB; + class O_Soldier_base_F: SoldierEB { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class O_Soldier_02_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class O_officer_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,2); + }; + }; + class O_Soldier_diver_base_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // Virtual Reality + class B_Soldier_VR_F: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class B_Protagonist_VR_F: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class O_Soldier_VR_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class I_Soldier_VR_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class I_Protagonist_VR_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class O_Protagonist_VR_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class C_man_1; + class C_Protagonist_VR_F: C_man_1 { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // Civilians + class C_Soldier_VR_F: C_man_1 { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // APEX + class O_V_Soldier_Viper_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(3,3); + }; + }; + class O_V_Soldier_base_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(3,3); + }; + }; + + // Enoch + class I_E_Man_Base_F; + class I_E_Uniform_01_coveralls_F: I_E_Man_Base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; +}; diff --git a/addons/medical_engine/CfgWeapons.hpp b/addons/medical_engine/CfgWeapons.hpp new file mode 100644 index 00000000000..b4e3572620e --- /dev/null +++ b/addons/medical_engine/CfgWeapons.hpp @@ -0,0 +1,11 @@ + +class CfgWeapons { + // Remove items from Virtual Arsenal. + class ItemCore; + class FirstAidKit: ItemCore { + type = 0; + }; + class Medikit: ItemCore { + type = 0; + }; +}; diff --git a/addons/medical_engine/README.md b/addons/medical_engine/README.md new file mode 100644 index 00000000000..c609f506cc5 --- /dev/null +++ b/addons/medical_engine/README.md @@ -0,0 +1,11 @@ +ace_medical_engine +=============== + +Links Arma 3 soldier health simulation to ACE medical system. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/medical_engine/XEH_PREP.hpp b/addons/medical_engine/XEH_PREP.hpp new file mode 100644 index 00000000000..cb6874c5b6f --- /dev/null +++ b/addons/medical_engine/XEH_PREP.hpp @@ -0,0 +1,9 @@ +PREP(handleDamage); +PREP(damageBodyPart); +PREP(updateBodyPartVisuals); +PREP(updateDamageEffects); +PREP(setStructuralDamage); +PREP(setUnconsciousAnim); +PREP(getHitpointArmor); +PREP(getItemArmor); +PREP(applyAnimAfterRagdoll); diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf new file mode 100644 index 00000000000..0467202b884 --- /dev/null +++ b/addons/medical_engine/XEH_postInit.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" + +[QGVAR(updateDamageEffects), LINKFUNC(updateDamageEffects)] call CBA_fnc_addEventHandler; +["unit", { + params ["_new"]; + [_new] call FUNC(updateDamageEffects); // Run on new controlled unit to update QGVAR(aimFracture) +}, true] call CBA_fnc_addPlayerEventHandler; + + +["CAManBase", "init", { + params ["_unit"]; + + // Check if last hit point is our dummy. + private _allHitPoints = getAllHitPointsDamage _unit param [0, []]; + reverse _allHitPoints; + + if (_allHitPoints param [0, ""] != "ACE_HDBracket") then { + private _config = [_unit] call CBA_fnc_getObjectConfig; + if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);}; + if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)}; + ERROR_1("Bad hitpoints for unit type ""%1""",typeOf _unit); + } else { + // Calling this function inside curly brackets allows the usage of + // "exitWith", which would be broken with "HandleDamage" otherwise. + _unit setVariable [ + QEGVAR(medical,HandleDamageEHID), + _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}] + ]; + }; +}, nil, [IGNORE_BASE_UAVPILOTS], true] call CBA_fnc_addClassEventHandler; + +#ifdef DEBUG_MODE_FULL +[QEGVAR(medical,woundReceived), { + params ["_unit", "_woundedHitPoint", "_receivedDamage", "_shooter", "_ammo"]; + TRACE_5("wound",_unit,_woundedHitPoint, _receivedDamage, _shooter, _ammo); + //systemChat str _this; +}] call CBA_fnc_addEventHandler; +#endif + + +// this handles moving units into vehicles via load functions or zeus +// needed, because the vanilla INCAPACITATED state does not handle vehicles +["CAManBase", "GetInMan", { + params ["_unit"]; + if (!local _unit) exitWith {}; + + if (lifeState _unit == "INCAPACITATED") then { + [_unit, true] call FUNC(setUnconsciousAnim); + }; +}] call CBA_fnc_addClassEventHandler; + +// Guarantee aircraft crashes are more lethal +["Air", "Killed", { + params ["_vehicle", "_killer"]; + TRACE_3("air killed",_vehicle,typeOf _vehicle,velocity _vehicle); + if ((getText (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "destrType")) == "") exitWith {}; + if (unitIsUAV _vehicle) exitWith {}; + + private _lethality = linearConversion [0, 25, (vectorMagnitude velocity _vehicle), 0.5, 1]; + TRACE_2("air crash",_lethality,crew _vehicle); + { + [QEGVAR(medical,woundReceived), [_x, "Head", _lethality, _killer, "#vehiclecrash", [HITPOINT_INDEX_HEAD,1]], _x] call CBA_fnc_targetEvent; + } forEach (crew _vehicle); +}, true, ["ParachuteBase"]] call CBA_fnc_addClassEventHandler; + +// Fixes units being stuck in unconscious animation when being knocked over by a PhysX object +["CAManBase", "AnimDone", { + params ["_unit", "_anim"]; + if (local _unit && {_anim find QGVAR(face) != -1 && {lifeState _unit != "INCAPACITATED"}}) then { + [_unit, false] call FUNC(setUnconsciousAnim); + }; +}] call CBA_fnc_addClassEventHandler; diff --git a/addons/medical_engine/XEH_preInit.sqf b/addons/medical_engine/XEH_preInit.sqf new file mode 100644 index 00000000000..87a74dd7aad --- /dev/null +++ b/addons/medical_engine/XEH_preInit.sqf @@ -0,0 +1,81 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// Define "Constants" variables (both are macros defined in script_macros_medical.hpp, look there for actual variable names) +if (isNil QUOTE(HEAD_DAMAGE_THRESHOLD)) then {HEAD_DAMAGE_THRESHOLD = HEAD_DAMAGE_THRESHOLD_DEFAULT}; +if (isNil QUOTE(ORGAN_DAMAGE_THRESHOLD)) then {ORGAN_DAMAGE_THRESHOLD = ORGAN_DAMAGE_THRESHOLD_DEFAULT}; +if (isNil QUOTE(HEART_HIT_CHANCE)) then {HEART_HIT_CHANCE = HEART_HIT_CHANCE_DEFAULT}; +if (isNil QUOTE(PENETRATION_THRESHOLD)) then {PENETRATION_THRESHOLD = PENETRATION_THRESHOLD_DEFAULT}; +if (isNil QUOTE(BLOOD_LOSS_KNOCK_OUT_THRESHOLD)) then {BLOOD_LOSS_KNOCK_OUT_THRESHOLD = BLOOD_LOSS_KNOCK_OUT_THRESHOLD_DEFAULT}; +if (isNil QUOTE(PAIN_UNCONSCIOUS)) then {PAIN_UNCONSCIOUS = PAIN_UNCONSCIOUS_DEFAULT}; +if (isNil QUOTE(PAIN_FADE_TIME)) then {PAIN_FADE_TIME = PAIN_FADE_TIME_DEFAULT}; +if (isNil QUOTE(LIMPING_DAMAGE_THRESHOLD)) then {LIMPING_DAMAGE_THRESHOLD = LIMPING_DAMAGE_THRESHOLD_DEFAULT}; +if (isNil QUOTE(FRACTURE_DAMAGE_THRESHOLD)) then {FRACTURE_DAMAGE_THRESHOLD = FRACTURE_DAMAGE_THRESHOLD_DEFAULT}; +// Derive the alternate fatal damage coefficents +if (isNil QUOTE(FATAL_SUM_DAMAGE_WEIBULL_K) || isNil QUOTE(FATAL_SUM_DAMAGE_WEIBULL_L)) then { + private _x1 = 0.5; + private _y1 = 0.1; + private _x2 = 0.8; + private _y2 = 0.9; + private _b1 = -ln (1-_y1); + private _b2 = -ln (1-_y2); + FATAL_SUM_DAMAGE_WEIBULL_K = ln(_b1/_b2) / ln(_x1/_x2); + FATAL_SUM_DAMAGE_WEIBULL_L = _x1 / _b1^(1/FATAL_SUM_DAMAGE_WEIBULL_K); +}; + +// Cache for armor values of equipped items (vests etc) +GVAR(armorCache) = false call CBA_fnc_createNamespace; + +// Hack for #3168 (units in static weapons do not take any damage): +// Doing a manual pre-load with a small distance seems to fix the LOD problems +// with handle damage not returning full results. +GVAR(fixedStatics) = []; + +GVAR(animations) = [] call CBA_fnc_createNamespace; +GVAR(animations) setVariable [QGVAR(faceUp_unconscious), ["ace_unconscious_2","ace_unconscious_2_1","ace_unconscious_7_1","ace_unconscious_8_1","ace_unconscious_5_1","ace_unconscious_6_1"]]; +GVAR(animations) setVariable [QGVAR(faceDown_unconscious), ["ace_unconscious_1", "ace_unconscious_3", "ace_unconscious_4","unconscious","ace_unconscious_9","ace_unconscious_3_1","ace_unconscious_4_1"]]; +GVAR(animations) setVariable [QGVAR(faceLeft_unconscious), ["ace_unconscious_7","ace_unconscious_8","ace_unconscious_1_1","ace_unconscious_7_1","ace_unconscious_8_1"]]; +GVAR(animations) setVariable [QGVAR(faceRight_unconscious), ["ace_unconscious_5","ace_unconscious_6","ace_unconscious_10","ace_unconscious_5_1","ace_unconscious_6_1"]]; + +private _fnc_fixStatic = { + params ["_vehicle"]; + private _type = typeOf _vehicle; + + if !(_type in GVAR(fixedStatics)) then { + GVAR(fixedStatics) pushBack _type; + PRELOAD_CLASS(_type); + }; +}; + +["StaticWeapon", "init", _fnc_fixStatic] call CBA_fnc_addClassEventHandler; +["Car", "init", _fnc_fixStatic] call CBA_fnc_addClassEventHandler; + +addMissionEventHandler ["Loaded", { + { + PRELOAD_CLASS(_x); + } forEach GVAR(fixedStatics); +}]; + +["ace_unconscious", { + params ["_unit", "_active"]; + if (_active) then { + if (_unit getVariable [QGVAR(waitForAnim), true]) then { + [{(animationState _this) find QGVAR(face) != -1}, { + [_this, animationState _this] call FUNC(applyAnimAfterRagdoll); + }, _unit, 20] call CBA_fnc_waitUntilAndExecute; + _unit setVariable [QGVAR(waitForAnim), false]; + }; + } else { + _unit setVariable [QGVAR(waitForAnim), nil]; + if (local _unit) then { + [_unit, _active] call FUNC(setUnconsciousAnim); + }; + }; +}] call CBA_fnc_addEventhandler; + +ADDON = true; diff --git a/addons/medical_engine/XEH_preStart.sqf b/addons/medical_engine/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_engine/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_engine/config.cpp b/addons/medical_engine/config.cpp new file mode 100644 index 00000000000..698428a6327 --- /dev/null +++ b/addons/medical_engine/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal","KoffeinFlummi","commy2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" + +#include "CfgActions.hpp" +#include "CfgMoves.hpp" +#include "CfgExtendedAnimation.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/medical_engine/data/ace_unconscious_1.rtm b/addons/medical_engine/data/ace_unconscious_1.rtm new file mode 100644 index 00000000000..8480d5381f3 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_1_1.rtm b/addons/medical_engine/data/ace_unconscious_1_1.rtm new file mode 100644 index 00000000000..0dc232fad79 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_1_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_2.rtm b/addons/medical_engine/data/ace_unconscious_2.rtm new file mode 100644 index 00000000000..c6d539ce654 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_2.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_2_1.rtm b/addons/medical_engine/data/ace_unconscious_2_1.rtm new file mode 100644 index 00000000000..8f44925a2d8 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_2_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_3.rtm b/addons/medical_engine/data/ace_unconscious_3.rtm new file mode 100644 index 00000000000..8eedf66e5f0 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_3.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_3_1.rtm b/addons/medical_engine/data/ace_unconscious_3_1.rtm new file mode 100644 index 00000000000..110e048697a Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_3_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_4.rtm b/addons/medical_engine/data/ace_unconscious_4.rtm new file mode 100644 index 00000000000..9f10d57b815 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_4.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_4_1.rtm b/addons/medical_engine/data/ace_unconscious_4_1.rtm new file mode 100644 index 00000000000..814049bfbc4 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_4_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_5.rtm b/addons/medical_engine/data/ace_unconscious_5.rtm new file mode 100644 index 00000000000..08d5bd81df9 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_5.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_5_1.rtm b/addons/medical_engine/data/ace_unconscious_5_1.rtm new file mode 100644 index 00000000000..ba46efca6a3 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_5_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_6.rtm b/addons/medical_engine/data/ace_unconscious_6.rtm new file mode 100644 index 00000000000..6d967d036db Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_6.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_6_1.rtm b/addons/medical_engine/data/ace_unconscious_6_1.rtm new file mode 100644 index 00000000000..98cd1c3a49c Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_6_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_7.rtm b/addons/medical_engine/data/ace_unconscious_7.rtm new file mode 100644 index 00000000000..b2761050724 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_7.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_7_1.rtm b/addons/medical_engine/data/ace_unconscious_7_1.rtm new file mode 100644 index 00000000000..acd00207043 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_7_1.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_8.rtm b/addons/medical_engine/data/ace_unconscious_8.rtm new file mode 100644 index 00000000000..26602d26c8f Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_8.rtm differ diff --git a/addons/medical_engine/data/ace_unconscious_8_1.rtm b/addons/medical_engine/data/ace_unconscious_8_1.rtm new file mode 100644 index 00000000000..a80c72c32b7 Binary files /dev/null and b/addons/medical_engine/data/ace_unconscious_8_1.rtm differ diff --git a/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf b/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf new file mode 100644 index 00000000000..5d45d35a430 --- /dev/null +++ b/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf @@ -0,0 +1,34 @@ +#include "script_component.hpp" +/* + * Author: diwako + * Apply a fitting unconscious animation to a knocked out unit + * + * Arguments: + * 0: Unit + * 1: Animation + * + * Return Value: + * None + * + * Example: + * [_unit, _anim] call ace_medical_engine_fnc_applyAnimAfterRagdoll; + * + * Public: No + */ + +params ["_unit", "_anim"]; +if !(IS_UNCONSCIOUS(_unit) && // do not run if unit is conscious + {alive _unit && // do not run if unit is dead + {isNull objectParent _unit}}) exitWith {}; // do not run if unit in any vehicle + +private _unconsciousAnimation = selectRandom (GVAR(animations) getVariable [_anim, [""]]); + +if (_unconsciousAnimation isEqualTo "") exitWith { + // not a valid animation found + ERROR("No valid animation found!"); +}; + +// Apply the animation only locally on the machine and do not broadcast it to others +// Reason is the nature of setUnconscious' end of ragdoll animation is not synced on all machines either +// Not synced animations are preferred over units snapping from one to another animation +_unit switchMove _unconsciousAnimation; diff --git a/addons/medical_engine/functions/fnc_damageBodyPart.sqf b/addons/medical_engine/functions/fnc_damageBodyPart.sqf new file mode 100644 index 00000000000..a435632801b --- /dev/null +++ b/addons/medical_engine/functions/fnc_damageBodyPart.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Damages a body part of a local unit. Does not kill the unit. + * + * Arguments: + * 0: Unit + * 1: Selection, can be "Head", "Body", "Arms" or "Legs" + * 2: Damaged + * + * Return Value: + * None + * + * Example: + * [player, "HEAD", true] call ace_medical_engine_fnc_damageBodyPart + * + * Notes: + * Head: Blood visuals @ 0.45 + * Body: Blood visuals @ 0.45 + * Arms: Blood visuals @ 0.35, increases weapon sway linerarly + * Legs: Blood visuals @ 0.35, limping @ 0.5 + * + * Public: No + */ + +params ["_unit", "_selection", "_damage"]; +TRACE_3("damageBodyPart",_unit,_selection,_damage); + +_damage = [0, DAMAGED_MIN_THRESHOLD] select _damage; + +switch (toLower _selection) do { + case ("head"): { + _unit setHitPointDamage ["HitHead", _damage]; + }; + case ("body"): { + _unit setHitPointDamage ["HitBody", _damage]; + }; + case ("arms"): { + _unit setHitPointDamage ["HitHands", _damage]; + }; + case ("legs"): { + _unit setHitPointDamage ["HitLegs", _damage + ([0, LIMPING_MIN_DAMAGE] select (_unit getVariable [QEGVAR(medical,isLimping), false]))]; + }; +}; diff --git a/addons/medical_engine/functions/fnc_getHitpointArmor.sqf b/addons/medical_engine/functions/fnc_getHitpointArmor.sqf new file mode 100644 index 00000000000..1f6f3c05505 --- /dev/null +++ b/addons/medical_engine/functions/fnc_getHitpointArmor.sqf @@ -0,0 +1,47 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Checks a unit's equipment to calculate the total armor on a hitpoint. + * + * Arguments: + * 0: Unit + * 1: Hitpoint + * + * Return Value: + * Total armor for the given hitpoint + * + * Example: + * [player, "HitChest"] call ace_medical_engine_fnc_getHitpointArmor + * + * Public: No + */ + +params ["_unit", "_hitpoint"]; + +private _uniform = uniform _unit; +// If unit is naked, use its underwear class instead +if (_uniform isEqualTo "") then { + _uniform = getText (configFile >> "CfgVehicles" >> typeOf _unit >> "nakedUniform"); +}; + +private _gear = [ + _uniform, + vest _unit, + headgear _unit +]; + +private _rags = _gear joinString "$"; +private _var = format [QGVAR(armorCache$%1), _hitpoint]; +_unit getVariable [_var, [""]] params ["_prevRags", "_armor"]; + +if (_rags != _prevRags) then { + _armor = 0; + + { + _armor = _armor + ([_x, _hitpoint] call FUNC(getItemArmor)); + } forEach _gear; + + _unit setVariable [_var, [_rags, _armor]]; +}; + +_armor // return diff --git a/addons/medical_engine/functions/fnc_getItemArmor.sqf b/addons/medical_engine/functions/fnc_getItemArmor.sqf new file mode 100644 index 00000000000..9457c54c6ef --- /dev/null +++ b/addons/medical_engine/functions/fnc_getItemArmor.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Returns the armor value the given item provides to a particular hitpoint, either from a cache or by reading the item config. + * + * Arguments: + * 0: Item Class + * 1: Hitpoint + * + * Return Value: + * Item armor for the given hitpoint + * + * Example: + * ["V_PlateCarrier_rgr", "HitChest"] call ace_medical_engine_fnc_getItemArmor + * + * Public: No + */ + +params ["_item", "_hitpoint"]; + +private _key = format ["%1$%2", _item, _hitpoint]; +private _armor = GVAR(armorCache) getVariable _key; + +if (isNil "_armor") then { + TRACE_2("Cache miss",_item,_hitpoint); + if ("" in [_item, _hitpoint]) exitWith { + _armor = 0; + GVAR(armorCache) setVariable [_key, _armor]; + }; + + private _itemInfo = configFile >> "CfgWeapons" >> _item >> "ItemInfo"; + + if (getNumber (_itemInfo >> "type") == TYPE_UNIFORM) then { + private _unitCfg = configFile >> "CfgVehicles" >> getText (_itemInfo >> "uniformClass"); + private _entry = _unitCfg >> "HitPoints" >> _hitpoint; + + _armor = getNumber (_unitCfg >> "armor") * getNumber (_entry >> "armor") + } else { + private _condition = format ["getText (_x >> 'hitpointName') == '%1'", _hitpoint]; + private _entry = configProperties [_itemInfo >> "HitpointsProtectionInfo", _condition] param [0, configNull]; + + _armor = getNumber (_entry >> "armor"); + }; + + GVAR(armorCache) setVariable [_key, _armor]; +}; + +_armor // return diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf new file mode 100644 index 00000000000..1975bde0c56 --- /dev/null +++ b/addons/medical_engine/functions/fnc_handleDamage.sqf @@ -0,0 +1,224 @@ +#include "script_component.hpp" +/* + * Author: commy2, SilentSpike + * HandleDamage EH where wound events are raised based on incoming damage. + * Be aware that for each source of damage, the EH can fire multiple times (once for each hitpoint). + * We store these incoming damages and compare them on our final hitpoint: "ace_hdbracket". + * + * Arguments: + * Handle damage EH + * + * Return Value: + * Damage to be inflicted + * + * Public: No + */ +// for travis +#define HIT_STRUCTURAL QGVAR($#structural) + +params ["_unit", "_selection", "_damage", "_shooter", "_ammo", "_hitPointIndex", "_instigator", "_hitpoint"]; + +// HD sometimes triggers for remote units - ignore. +if !(local _unit) exitWith {nil}; + +// Get missing meta info +private _oldDamage = 0; + +if (_hitPoint isEqualTo "") then { + _hitPoint = "#structural"; + _oldDamage = damage _unit; +} else { + _oldDamage = _unit getHitIndex _hitPointIndex; +}; + +// Damage can be disabled with old variable or via sqf command allowDamage +if !(isDamageAllowed _unit && {_unit getVariable [QEGVAR(medical,allowDamage), true]}) exitWith {_oldDamage}; + +private _newDamage = _damage - _oldDamage; +// Get armor value of hitpoint and calculate damage before armor +private _armor = [_unit, _hitpoint] call FUNC(getHitpointArmor); +private _realDamage = _newDamage * _armor; +// Damages are stored for "ace_hdbracket" event triggered last +_unit setVariable [format [QGVAR($%1), _hitPoint], [_realDamage, _newDamage]]; +TRACE_3("Received hit",_hitpoint,_newDamage,_realDamage); + +// Engine damage to these hitpoints controls blood visuals, limping, weapon sway +// Handled in fnc_damageBodyPart, persist here +if (_hitPoint in ["hithead", "hitbody", "hithands", "hitlegs"]) exitWith {_oldDamage}; + +// This hitpoint is set to trigger last, evaluate all the stored damage values +// to determine where wounds are applied +if (_hitPoint isEqualTo "ace_hdbracket") exitWith { + _unit setVariable [QEGVAR(medical,lastDamageSource), _shooter]; + _unit setVariable [QEGVAR(medical,lastInstigator), _instigator]; + + private _damageStructural = _unit getVariable [HIT_STRUCTURAL, 0]; + + // --- Head + private _damageHead = [ + _unit getVariable [QGVAR($HitFace), [0,0]], + _unit getVariable [QGVAR($HitNeck), [0,0]], + _unit getVariable [QGVAR($HitHead), [0,0]] + ]; + _damageHead sort false; + _damageHead = _damageHead select 0; + + // --- Body + private _damageBody = [ + _unit getVariable [QGVAR($HitPelvis), [0,0]], + _unit getVariable [QGVAR($HitAbdomen), [0,0]], + _unit getVariable [QGVAR($HitDiaphragm), [0,0]], + _unit getVariable [QGVAR($HitChest), [0,0]] + // HitBody removed as it's a placeholder hitpoint and the high armor value (1000) throws the calculations off + ]; + _damageBody sort false; + _damageBody = _damageBody select 0; + + // --- Arms and Legs + private _damageLeftArm = _unit getVariable [QGVAR($HitLeftArm), [0,0]]; + private _damageRightArm = _unit getVariable [QGVAR($HitRightArm), [0,0]]; + private _damageLeftLeg = _unit getVariable [QGVAR($HitLeftLeg), [0,0]]; + private _damageRightLeg = _unit getVariable [QGVAR($HitRightLeg), [0,0]]; + + // Find hit point that received the maxium damage + // Priority used for sorting if incoming damage is equivalent (e.g. max which is 4) + private _allDamages = [ + _damageHead + [PRIORITY_HEAD, "Head"], + _damageBody + [PRIORITY_BODY, "Body"], + _damageLeftArm + [PRIORITY_LEFT_ARM, "LeftArm"], + _damageRightArm + [PRIORITY_RIGHT_ARM, "RightArm"], + _damageLeftLeg + [PRIORITY_LEFT_LEG, "LeftLeg"], + _damageRightLeg + [PRIORITY_RIGHT_LEG, "RightLeg"] + ]; + TRACE_2("incoming",_allDamages,_damageStructural); + + // represents all incoming damage for selecting a non-selectionSpecific wound location, (used for selectRandomWeighted [value1,weight1,value2....]) + private _damageSelectionArray = [ + HITPOINT_INDEX_HEAD, _damageHead select 1, HITPOINT_INDEX_BODY, _damageBody select 1, HITPOINT_INDEX_LARM, _damageLeftArm select 1, + HITPOINT_INDEX_RARM, _damageRightArm select 1, HITPOINT_INDEX_LLEG, _damageLeftLeg select 1, HITPOINT_INDEX_RLEG, _damageRightLeg select 1 + ]; + + _allDamages sort false; + (_allDamages select 0) params ["", "_receivedDamage", "", "_woundedHitPoint"]; + private _receivedDamageHead = _damageHead select 1; + if (_receivedDamageHead >= HEAD_DAMAGE_THRESHOLD) then { + TRACE_3("reporting fatal head damage instead of max",_receivedDamageHead,_receivedDamage,_woundedHitPoint); + _receivedDamage = _receivedDamageHead; + _woundedHitPoint = "Head"; + }; + + // We know it's structural when no specific hitpoint is damaged + if (_receivedDamage == 0) then { + _receivedDamage = _damageStructural select 1; + _woundedHitPoint = "Body"; + _damageSelectionArray = [1, 1]; // sum of weights would be 0 + }; + + // Environmental damage sources all have empty ammo string + // No explicit source given, we infer from differences between them + if (_ammo isEqualTo "") then { + // Any collision with terrain/vehicle/object has a shooter + // Check this first because burning can happen at any velocity + if !(isNull _shooter) then { + _ammo = "collision"; // non-selectionSpecific so only _damageSelectionArray matters + + /* + If shooter != unit then they hit unit, otherwise it could be: + - Unit hitting anything at speed + - An empty vehicle hitting unit + - A physX object hitting unit + Assume fall damage for downward velocity because it's most common + */ + if (_shooter == _unit && {(velocity _unit select 2) < -2}) then { + _ammo = "falling"; // non-selectionSpecific so only _damageSelectionArray matters + _damageSelectionArray = [HITPOINT_INDEX_RLEG, 1, HITPOINT_INDEX_LLEG, 1]; + TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_receivedDamage); + } else { + _damageSelectionArray = [HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1]; + TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_receivedDamage); + }; + + // Significant damage suggests high relative velocity + // Momentum transfers to body/head for worse wounding + // Higher momentum results in higher chance for head to be hit for more lethality + if (_receivedDamage > 0.35) then { + private _headHitWeight = (_receivedDamage / 2) min 1; + if (_receivedDamage < 0.6) then { + _damageSelectionArray append [0, (1 - _headHitWeight), 1, _headHitWeight]; + } else { + _damageSelectionArray = [0, (1 - _headHitWeight), 1, _headHitWeight]; + } + }; + } else { + // Anything else is almost guaranteed to be fire damage + _damageSelectionArray = [HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1];; + _ammo = "unknown"; // non-selectionSpecific so only _damageSelectionArray matters + + // Fire damage can occur as lots of minor damage events + // Combine these until significant enough to wound + private _combinedDamage = _receivedDamage + (_unit getVariable [QGVAR(trivialDamage), 0]); + if (_combinedDamage > 0.1) then { + _unit setVariable [QGVAR(trivialDamage), 0]; + _receivedDamage = _combinedDamage; + TRACE_5("Burning",_unit,_shooter,_instigator,_damage,_receivedDamage); + } else { + _unit setVariable [QGVAR(trivialDamage), _combinedDamage]; + _receivedDamage = 0; + }; + }; + }; + + // No wounds for minor damage + if (_receivedDamage > 1E-3) then { + TRACE_3("received",_receivedDamage,_woundedHitPoint,_damageSelectionArray); + [QEGVAR(medical,woundReceived), [_unit, _woundedHitPoint, _receivedDamage, _shooter, _ammo, _damageSelectionArray]] call CBA_fnc_localEvent; + }; + + // Clear stored damages otherwise they will influence future damage events + // (aka wounds will pile onto the historically most damaged hitpoint) + { + _unit setVariable [_x, nil]; + } forEach [ + QGVAR($HitFace),QGVAR($HitNeck),QGVAR($HitHead), + QGVAR($HitPelvis),QGVAR($HitAbdomen),QGVAR($HitDiaphragm),QGVAR($HitChest),QGVAR($HitBody), + QGVAR($HitLeftArm),QGVAR($HitRightArm),QGVAR($HitLeftLeg),QGVAR($HitRightLeg) + ]; + + 0 +}; + +// Drowning doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs +// Damage occurs in consistent increments +if ( + _hitPoint isEqualTo "#structural" && + {getOxygenRemaining _unit <= 0.5} && + {_damage isEqualTo (_oldDamage + 0.005)} +) exitWith { + [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "drowning", [HITPOINT_INDEX_BODY, 1]]] call CBA_fnc_localEvent; + TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage); + + 0 +}; + +// Crashing a vehicle doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs +// It does fire the EH multiple times, but this seems to scale with the intensity of the crash +private _vehicle = vehicle _unit; +if ( + _hitPoint isEqualTo "#structural" && + {_ammo isEqualTo ""} && + {_vehicle != _unit} && + {vectorMagnitude (velocity _vehicle) > 5} + // todo: no way to detect if stationary and another vehicle hits you +) exitWith { + private _damageSelectionArray = [ + HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1, + HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1 + ]; + [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "vehiclecrash", _damageSelectionArray]] call CBA_fnc_localEvent; + TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage); + + 0 +}; + +// We store our own damage values so engine damage is unnecessary +0 diff --git a/addons/medical_engine/functions/fnc_setStructuralDamage.sqf b/addons/medical_engine/functions/fnc_setStructuralDamage.sqf new file mode 100644 index 00000000000..4f2888ff71a --- /dev/null +++ b/addons/medical_engine/functions/fnc_setStructuralDamage.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Set structural damage of an object without modifying the individual hit points. + * + * Arguments: + * 0: Unit + * 1: New damage value + * + * Return Value: + * None + * + * Example: + * [player, 0.5] call ace_medical_engine_fnc_setStructuralDamage + * + * Public: No + */ + +params [["_unit", objNull, [objNull]], ["_damage", 0, [0]]]; + +if (!local _unit) exitWith { ERROR_2("setStructuralDamage: Unit not local or null [%1:%2]",_unit,typeOf _unit); }; + +private _hitPointDamages = getAllHitPointsDamage _unit param [2, []]; + +private _damageDisabled = !isDamageAllowed _unit; +if (_damageDisabled) then { + _unit allowDamage true; +}; + +_unit setDamage _damage; + +{ + _unit setHitIndex [_forEachIndex, _x]; +} forEach _hitPointDamages; + +if (_damageDisabled) then { + _unit allowDamage false; +}; diff --git a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf new file mode 100644 index 00000000000..27ed364bf5d --- /dev/null +++ b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf @@ -0,0 +1,68 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Force local unit into ragdoll / unconsciousness animation. + * + * Arguments: + * 0: Unit + * 1: Is unconscious (optional, default: true) + * + * Return Value: + * None + * + * Example: + * [player, true] call ace_medical_engine_fnc_setUnconsciousAnim + * + * Public: No + */ + +params [["_unit", objNull, [objNull]], ["_isUnconscious", true, [false]]]; +TRACE_2("setUnconsciousAnim",_unit,_isUnconscious); + +if (!local _unit) exitWith { + ERROR_1("Unit %1 not local or null",_unit); +}; + +_unit setUnconscious _isUnconscious; + +if (_isUnconscious) then { + // eject from static weapon + if (vehicle _unit isKindOf "StaticWeapon") then { + TRACE_2("ejecting from static weapon",_unit,vehicle _unit); + [_unit] call EFUNC(common,unloadPerson); + }; + + // set animation inside vehicles + if (vehicle _unit != _unit) then { + private _unconAnim = _unit call EFUNC(common,getDeathAnim); + TRACE_2("inVehicle - playing death anim",_unit,_unconAnim); + [_unit, _unconAnim] call EFUNC(common,doAnimation); + }; +} else { + // reset animation inside vehicles + if (vehicle _unit != _unit) then { + private _awakeAnim = _unit call EFUNC(common,getAwakeAnim); + TRACE_2("inVehicle - playing awake anim",_unit,_awakeAnim); + [_unit, _awakeAnim, 2] call EFUNC(common,doAnimation); + } else { + // and on foot + TRACE_1("onfoot - playing standard anim",_unit); + [_unit, "AmovPpneMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + + if (currentWeapon _unit == secondaryWeapon _unit && {currentWeapon _unit != ""}) then { + [_unit, "AmovPknlMstpSrasWlnrDnon", 2] call EFUNC(common,doAnimation); + }; + + [{ + params ["_unit"]; + TRACE_3("after delay",_unit,animationState _unit,lifeState _unit); + if (!alive _unit) exitWith {}; + // Fix unit being in locked animation with switchMove (If unit was unloaded from a vehicle, they may be in deadstate instead of unconscious) + private _animation = animationState _unit; + if ((_animation == "unconscious" || {_animation == "deadstate" || {_animation find "ace_unconscious_" != -1}}) && {lifeState _unit != "INCAPACITATED"}) then { + [_unit, "AmovPpneMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + TRACE_1("forcing SwitchMove",animationState _unit); + }; + }, _unit, 0.5] call CBA_fnc_waitAndExecute; + }; +}; diff --git a/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf new file mode 100644 index 00000000000..3e240b807b7 --- /dev/null +++ b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Damages a body part of a local unit. Does not kill the unit. + * + * Arguments: + * 0: Unit + * 1: Update Head + * 2: Update Body + * 3: Update Arms + * 4: Update Legs + * + * Return Value: + * None + * + * Example: + * [player, true, true, true, true] call ace_medical_engine_fnc_updateBodyPartVisuals + * + * Public: No + */ + +params ["_unit", "_updateHead", "_updateBody", "_updateArms", "_updateLegs"]; +TRACE_5("updateBodyPartVisuals",_unit,_updateHead,_updateBody,_updateArms,_updateLegs); + +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; + +if (_updateHead) then { + [_unit, "head", (_bodyPartDamage select 0) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart); +}; +if (_updateBody) then { + [_unit, "body", (_bodyPartDamage select 1) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart); +}; +if (_updateArms) then { + [_unit, "arms", ((_bodyPartDamage select 2) max (_bodyPartDamage select 3)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart); +}; +if (_updateLegs) then { + [_unit, "legs", ((_bodyPartDamage select 4) max (_bodyPartDamage select 5)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart); +}; diff --git a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf new file mode 100644 index 00000000000..b58faf4057c --- /dev/null +++ b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" +/* + * Author: commy2, PabstMirror + * Updates damage effects for limping and fractures + * + * Arguments: + * 0: Unit + * 1: Limping (optional, default: true) + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_engine_fnc_updateDamageEffects + * + * Public: No + */ + +params [["_unit", objNull, [objNull]]]; + +if (!local _unit) exitWith { ERROR_2("updateDamageEffects: Unit not local or null [%1:%2]",_unit,typeOf _unit); }; + +private _isLimping = false; + +if (EGVAR(medical,fractures) > 0) then { + private _fractures = GET_FRACTURES(_unit); + TRACE_1("",_fractures); + if (((_fractures select 4) == 1) || {(_fractures select 5) == 1}) then { + TRACE_1("limping because of fracture",_fractures); + _isLimping = true; + }; + private _aimFracture = 0; + if ((_fractures select 2) == 1) then { _aimFracture = _aimFracture + 4; }; + if ((_fractures select 3) == 1) then { _aimFracture = _aimFracture + 4; }; + + if (EGVAR(medical,fractures) == 2) then { // the limp with a splint will still cause effects + private _isSprintBlocked = ((_fractures select 4) == -1) || {(_fractures select 5) == -1}; // block sprinting if we have a leg splint on + if (_isSprintBlocked || {!isSprintAllowed _unit}) then { // only update status effect if we need to + TRACE_1("updating status effect",_isSprintBlocked); + [_unit, "blockSprint", QEGVAR(medical,fracture), _isSprintBlocked] call EFUNC(common,statusEffect_set); + }; + if ((_fractures select 2) == -1) then { _aimFracture = _aimFracture + 2; }; + if ((_fractures select 3) == -1) then { _aimFracture = _aimFracture + 2; }; + }; + _unit setVariable [QGVAR(aimFracture), _aimFracture, false]; // local only var, used in ace_medical's postInit to set ACE_setCustomAimCoef +}; + +if (!_isLimping && {EGVAR(medical,limping) > 0}) then { + private _woundsToCheck = GET_OPEN_WOUNDS(_unit); + if (EGVAR(medical,limping) == 2) then { + _woundsToCheck = _woundsToCheck + GET_BANDAGED_WOUNDS(_unit); // do not append + }; + { + _x params ["_xClassID", "_xBodyPartN", "_xAmountOf", "", "_xDamage"]; + if ((_xBodyPartN > 3) && {_xAmountOf > 0} && {_xDamage > LIMPING_DAMAGE_THRESHOLD} && { + (EGVAR(medical_damage,woundsData) select (_xClassID / 10)) select 7}) exitWith { // select _causeLimping from woundsData + TRACE_1("limping because of wound",_x); + _isLimping = true; + }; + } forEach _woundsToCheck; +}; +_unit setVariable [QEGVAR(medical,isLimping), _isLimping, true]; + +// refresh +private _isDamaged = _unit getHitPointDamage "HitLegs" >= DAMAGED_MIN_THRESHOLD && {_unit getHitPointDamage "HitLegs" != LIMPING_MIN_DAMAGE}; + +[_unit, "Legs", _isDamaged] call FUNC(damageBodyPart); diff --git a/addons/medical_engine/functions/script_component.hpp b/addons/medical_engine/functions/script_component.hpp new file mode 100644 index 00000000000..c28da622f06 --- /dev/null +++ b/addons/medical_engine/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_engine\script_component.hpp" diff --git a/addons/medical_engine/script_component.hpp b/addons/medical_engine/script_component.hpp new file mode 100644 index 00000000000..5166324b1ec --- /dev/null +++ b/addons/medical_engine/script_component.hpp @@ -0,0 +1,38 @@ +#define COMPONENT medical_engine +#define COMPONENT_BEAUTIFIED Medical Engine +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_ENGINE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_ENGINE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_ENGINE +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_config.hpp" + +#define PRELOAD_CLASS(class) \ + INFO_1("Starting preload for (%1)",class);\ + [{\ + 1 preloadObject _this;\ + }, {\ + INFO_1("Preload done for (%1)",_this);\ + }, class] call CBA_fnc_waitUntilAndExecute + +#define PRIORITY_HEAD 3 +#define PRIORITY_BODY 4 +#define PRIORITY_LEFT_ARM (1 + random 1) +#define PRIORITY_RIGHT_ARM (1 + random 1) +#define PRIORITY_LEFT_LEG (1 + random 1) +#define PRIORITY_RIGHT_LEG (1 + random 1) + +// don't change, these reflect hard coded engine behaviour +#define DAMAGED_MIN_THRESHOLD 0.45 +#define LIMPING_MIN_DAMAGE 0.5 diff --git a/addons/medical_engine/script_macros_config.hpp b/addons/medical_engine/script_macros_config.hpp new file mode 100644 index 00000000000..b29f9dd958a --- /dev/null +++ b/addons/medical_engine/script_macros_config.hpp @@ -0,0 +1,64 @@ +/* + Usage: + + #include "\z\ace\addons\medical_engine\script_macros_config.hpp" + + class CfgVehicles { + class My_AwesomeUnit_base; + class My_AwesomeUnit: My_AwesomeUnit_base { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + }; +*/ + +// Our method for adding left and right arm and leg armor. Uses those selections +// that are used for animations and therefore exist in all third party units +// usage: arm_armor and leg_armor are the armor values of of HitHands and +// HitLegs respectively. +// "ACE_HDBracket" is a special hit point. It is designed in a way where the +// "HandleDamage" event handler will compute it at the end of every damage +// calculation step. This way we can figure out which hit point took the most +// damage from one projectile and should be receiving the ACE medical wound. +// the hit point itself should not take any damage +// It is important that the "ACE_HDBracket" hit point is the last in the config, +// but has the same selection as the first one (always "HitHead" for soldiers). +#define ADD_ACE_HITPOINTS(arm_armor,leg_armor)\ + class HitLeftArm {\ + armor = arm_armor;\ + material = -1;\ + name = "hand_l";\ + passThrough = 1;\ + radius = 0.08;\ + explosionShielding = 1;\ + visual = "injury_hands";\ + minimalHit = 0.01;\ + };\ + class HitRightArm: HitLeftArm {\ + name = "hand_r";\ + };\ + class HitLeftLeg {\ + armor = leg_armor;\ + material = -1;\ + name = "leg_l";\ + passThrough = 1;\ + radius = 0.1;\ + explosionShielding = 1;\ + visual = "injury_legs";\ + minimalHit = 0.01;\ + };\ + class HitRightLeg: HitLeftLeg {\ + name = "leg_r";\ + };\ + class ACE_HDBracket {\ + armor = 1;\ + material = -1;\ + name = "head";\ + passThrough = 0;\ + radius = 1;\ + explosionShielding = 1;\ + visual = "";\ + minimalHit = 0;\ + depends = "HitHead";\ + } diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp new file mode 100644 index 00000000000..d93baf4f2a5 --- /dev/null +++ b/addons/medical_engine/script_macros_medical.hpp @@ -0,0 +1,198 @@ +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"] +#define ALL_SELECTIONS ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] +#define ALL_HITPOINTS ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] + +#define HITPOINT_INDEX_HEAD 0 +#define HITPOINT_INDEX_BODY 1 +#define HITPOINT_INDEX_LARM 2 +#define HITPOINT_INDEX_RARM 3 +#define HITPOINT_INDEX_LLEG 4 +#define HITPOINT_INDEX_RLEG 5 + +// Damage threshold above which fatal organ damage can occur +#define HEAD_DAMAGE_THRESHOLD EGVAR(medical,const_headDamageThreshold) +#define HEAD_DAMAGE_THRESHOLD_DEFAULT 1 +#define ORGAN_DAMAGE_THRESHOLD EGVAR(medical,const_organDamageThreshold) +#define ORGAN_DAMAGE_THRESHOLD_DEFAULT 0.6 +// Consts for determineIfFatal: sum of damage (values are calcualted at runtime in preInit) +#define FATAL_SUM_DAMAGE_WEIBULL_K EGVAR(medical,const_fatalSumDamageWeibull_K) +#define FATAL_SUM_DAMAGE_WEIBULL_L EGVAR(medical,const_fatalSumDamageWeibull_L) + +// Chance to hit heart based on ratio of 70kg (approx. 70L) body to 70mL stroke volume of heart +// Assuming torso is 50% of the body volume (35L) +#define HEART_HIT_CHANCE EGVAR(medical,const_heartHitChance) +#define HEART_HIT_CHANCE_DEFAULT 0.05 + +#define MEDICAL_ACTION_DISTANCE 1.75 + +// scale received pain to 0-2 level to select type of scream +// below 0.25: 0, from 0.25 to 0.5: 1, more than 0.5: 2 +#define PAIN_TO_SCREAM(pain) (floor (4 * pain) min 2) + +// scale received pain to 0-2 level to select type of scream +// below 0.33: 0, from 0.34 to 0.66: 1, more than 0.67: 2 +#define PAIN_TO_MOAN(pain) (floor (3 * pain) min 2) + +#define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) +#define GET_STRING(config,default) (if (isText (config)) then {getText (config)} else {default}) +#define GET_ARRAY(config,default) (if (isArray (config)) then {getArray (config)} else {default}) + +#define DEFAULT_HEART_RATE 80 +#define DEFAULT_PERIPH_RES 100 + +// --- blood +// 0.077 l/kg * 80kg = 6.16l +#define DEFAULT_BLOOD_VOLUME 6.0 // in liters + +#define BLOOD_VOLUME_CLASS_1_HEMORRHAGE 6.000 // lost less than 15% blood, Class I Hemorrhage +#define BLOOD_VOLUME_CLASS_2_HEMORRHAGE 5.100 // lost more than 15% blood, Class II Hemorrhage +#define BLOOD_VOLUME_CLASS_3_HEMORRHAGE 4.200 // lost more than 30% blood, Class III Hemorrhage +#define BLOOD_VOLUME_CLASS_4_HEMORRHAGE 3.600 // lost more than 40% blood, Class IV Hemorrhage +#define BLOOD_VOLUME_FATAL 3.0 // Lost more than 50% blood, Unrecoverable + +// IV Change per second calculation: +// 250 ml should take 60 seconds to fill. 250 ml / 60 s ~ 4.1667 ml/s. +#define IV_CHANGE_PER_SECOND 4.1667 // in milliliters per second + +// Minimum amount of damage required for penetrating wounds (also minDamage for velocity wounds) +#define PENETRATION_THRESHOLD EGVAR(medical,const_penetrationThreshold) +#define PENETRATION_THRESHOLD_DEFAULT 0.35 + +// To be replaced by a proper blood pressure calculation +#define BLOOD_LOSS_KNOCK_OUT_THRESHOLD EGVAR(medical,const_bloodLossKnockOutThreshold) +#define BLOOD_LOSS_KNOCK_OUT_THRESHOLD_DEFAULT 0.5 // 50% of cardiac output + +// Used to color interaction icons and body image selections +#define BLOOD_LOSS_RED_THRESHOLD 0.5 +#define BLOOD_LOSS_TOTAL_COLORS 10 +#define DAMAGE_BLUE_THRESHOLD 0.8 +#define DAMAGE_TOTAL_COLORS 10 + +// --- pain +#define PAIN_UNCONSCIOUS EGVAR(medical,const_painUnconscious) +#define PAIN_UNCONSCIOUS_DEFAULT 0.5 + +// Pain fade out time (time it takes until pain is guaranteed to be completly gone) +#define PAIN_FADE_TIME EGVAR(medical,const_painFadeTime) +#define PAIN_FADE_TIME_DEFAULT 900 + +// Only relevant when advanced medication is disabled +// Morphine pain suppression fade out time (time it takes until pain suppression is guaranteed to be completly gone) +#define PAIN_SUPPRESSION_FADE_TIME 1800 + +// Chance to wake up when vitals are stable (checked once every SPONTANEOUS_WAKE_UP_INTERVAL seconds) +#define SPONTANEOUS_WAKE_UP_INTERVAL 15 + +// Minimum leg damage required for limping +#define LIMPING_DAMAGE_THRESHOLD EGVAR(medical,const_limpingDamageThreshold) +#define LIMPING_DAMAGE_THRESHOLD_DEFAULT 0.30 + +// Minimum limb damage required for fracture +#define FRACTURE_DAMAGE_THRESHOLD EGVAR(medical,const_fractureDamageThreshold) +#define FRACTURE_DAMAGE_THRESHOLD_DEFAULT 0.50 + +// Minimum body part damage required for blood effect on uniform +#define VISUAL_BODY_DAMAGE_THRESHOLD 0.35 + +// Empty wound data, used for some default return values +// [classID, bodypartIndex, amountOf, bloodloss, damage] +#define EMPTY_WOUND [-1, -1, 0, 0, 0] + +// Base time to bandage each wound category +#define BANDAGE_TIME_S 4 +#define BANDAGE_TIME_M 6 +#define BANDAGE_TIME_L 8 +#define BANDAGE_TIME_MOD_MEDIC -2 +#define BANDAGE_TIME_MOD_SELF 4 + +#define DEFAULT_BANDAGE_REOPENING_CHANCE 0.1 +#define DEFAULT_BANDAGE_REOPENING_MIN_DELAY 120 +#define DEFAULT_BANDAGE_REOPENING_MAX_DELAY 200 + +// Time it takes to stitch one wound +#define WOUND_STITCH_TIME 5 + +#define DEFAULT_TOURNIQUET_VALUES [0,0,0,0,0,0] + +#define DEFAULT_FRACTURE_VALUES [0,0,0,0,0,0] + +// Triage colors, for consistency across UIs and functions +#define TRIAGE_COLOR_NONE 0, 0, 0, 0.9 +#define TRIAGE_COLOR_MINIMAL 0, 0.5, 0, 0.9 +#define TRIAGE_COLOR_DELAYED 1, 0.84, 0, 0.9 +#define TRIAGE_COLOR_IMMEDIATE 1, 0, 0, 0.9 +#define TRIAGE_COLOR_DECEASED 0, 0, 0, 0.9 + +#define TRIAGE_TEXT_COLOR_NONE 1, 1, 1, 1 +#define TRIAGE_TEXT_COLOR_MINIMAL 1, 1, 1, 1 +#define TRIAGE_TEXT_COLOR_DELAYED 0, 0, 0, 1 +#define TRIAGE_TEXT_COLOR_IMMEDIATE 1, 1, 1, 1 +#define TRIAGE_TEXT_COLOR_DECEASED 1, 1, 1, 1 + +// Medical activity logs +#define MED_LOG_MAX_ENTRIES 8 +#define MED_LOG_VARNAME(type) (format [QEGVAR(medical,log_%1), type]) + +// - Unit Variables ---------------------------------------------------- +// These variables get stored in object space and used across components +// Defined here for easy consistency with GETVAR/SETVAR (also a list for reference) +#define VAR_BLOOD_PRESS QEGVAR(medical,bloodPressure) +#define VAR_BLOOD_VOL QEGVAR(medical,bloodVolume) +#define VAR_WOUND_BLEEDING QEGVAR(medical,woundBleeding) +#define VAR_CRDC_ARRST QEGVAR(medical,inCardiacArrest) +#define VAR_HEART_RATE QEGVAR(medical,heartRate) +#define VAR_PAIN QEGVAR(medical,pain) +#define VAR_PAIN_SUPP QEGVAR(medical,painSuppress) +#define VAR_PERIPH_RES QEGVAR(medical,peripheralResistance) +#define VAR_UNCON "ACE_isUnconscious" +#define VAR_OPEN_WOUNDS QEGVAR(medical,openWounds) +#define VAR_BANDAGED_WOUNDS QEGVAR(medical,bandagedWounds) +#define VAR_STITCHED_WOUNDS QEGVAR(medical,stitchedWounds) +// These variables track gradual adjustments (from medication, etc.) +#define VAR_MEDICATIONS QEGVAR(medical,medications) +// These variables track the current state of status values above +#define VAR_HEMORRHAGE QEGVAR(medical,hemorrhage) +#define VAR_IN_PAIN QEGVAR(medical,inPain) +#define VAR_TOURNIQUET QEGVAR(medical,tourniquets) +#define VAR_FRACTURES QEGVAR(medical,fractures) + +// - Unit Functions --------------------------------------------------- +// Retrieval macros for common unit values +// Defined for easy consistency and speed +#define GET_SM_STATE(_unit) ([_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState) +#define GET_BLOOD_VOLUME(unit) (unit getVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME]) +#define GET_WOUND_BLEEDING(unit) (unit getVariable [VAR_WOUND_BLEEDING, 0]) +#define GET_HEART_RATE(unit) (unit getVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE]) +#define GET_HEMORRHAGE(unit) (unit getVariable [VAR_HEMORRHAGE, 0]) +#define GET_PAIN(unit) (unit getVariable [VAR_PAIN, 0]) +#define GET_PAIN_SUPPRESS(unit) (unit getVariable [VAR_PAIN_SUPP, 0]) +#define GET_TOURNIQUETS(unit) (unit getVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES]) +#define GET_FRACTURES(unit) (unit getVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES]) +#define IN_CRDC_ARRST(unit) (unit getVariable [VAR_CRDC_ARRST, false]) +#define IS_BLEEDING(unit) (GET_WOUND_BLEEDING(unit) > 0) +#define IS_IN_PAIN(unit) (unit getVariable [VAR_IN_PAIN, false]) +#define IS_UNCONSCIOUS(unit) (unit getVariable [VAR_UNCON, false]) +#define GET_OPEN_WOUNDS(unit) (unit getVariable [VAR_OPEN_WOUNDS, []]) +#define GET_BANDAGED_WOUNDS(unit) (unit getVariable [VAR_BANDAGED_WOUNDS, []]) +#define GET_STITCHED_WOUNDS(unit) (unit getVariable [VAR_STITCHED_WOUNDS, []]) +#define GET_DAMAGE_THRESHOLD(unit) (unit getVariable [QEGVAR(medical,damageThreshold), [EGVAR(medical,AIDamageThreshold),EGVAR(medical,playerDamageThreshold)] select (isPlayer unit)]) + +// The following function calls are defined here just for consistency +#define GET_BLOOD_LOSS(unit) ([unit] call EFUNC(medical_status,getBloodLoss)) +#define GET_BLOOD_PRESSURE(unit) ([unit] call EFUNC(medical_status,getBloodPressure)) + +// Derivative unit values commonly used +#define GET_PAIN_PERCEIVED(unit) (0 max (GET_PAIN(unit) - GET_PAIN_SUPPRESS(unit)) min 1) + +#define HAS_TOURNIQUET_APPLIED_ON(unit,index) ((GET_TOURNIQUETS(unit) select index) > 0) + +// Cache expiry values, in seconds +#define IN_MEDICAL_FACILITY_CACHE_EXPIRY 1 +#define CAN_TREAT_CONDITION_CACHE_EXPIRY 2 + +// Ignore UAV/Drone AI Base Classes +#define IGNORE_BASE_UAVPILOTS "B_UAV_AI", "O_UAV_AI", "UAV_AI_base_F" diff --git a/addons/medical_feedback/$PBOPREFIX$ b/addons/medical_feedback/$PBOPREFIX$ new file mode 100644 index 00000000000..410e7d12997 --- /dev/null +++ b/addons/medical_feedback/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_feedback diff --git a/addons/medical_feedback/CfgEventHandlers.hpp b/addons/medical_feedback/CfgEventHandlers.hpp new file mode 100644 index 00000000000..0d3301d6e0a --- /dev/null +++ b/addons/medical_feedback/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_feedback/CfgInGameUI.hpp b/addons/medical_feedback/CfgInGameUI.hpp new file mode 100644 index 00000000000..d18024e0a64 --- /dev/null +++ b/addons/medical_feedback/CfgInGameUI.hpp @@ -0,0 +1,8 @@ + +#ifdef DISABLE_VANILLA_BLOOD_TEXTURES +class CfgInGameUI { + class PeripheralVision { + bloodTexture = ""; //"A3\ui_f\data\igui\cfg\PeripheralVision\bloodTexture_ca.paa"; + }; +}; +#endif diff --git a/addons/medical_feedback/CfgSounds.hpp b/addons/medical_feedback/CfgSounds.hpp new file mode 100644 index 00000000000..6c390e1f7ab --- /dev/null +++ b/addons/medical_feedback/CfgSounds.hpp @@ -0,0 +1,2260 @@ +class CfgSounds { + // Heartbeats ------------------------------------------------------------- + class ACE_heartbeat_fast_1 { + name = "ACE_heartbeat_fast_1"; + sound[] = {QPATHTOF(sounds\fast_1.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_heartbeat_fast_2 { + name = "ACE_heartbeat_fast_2"; + sound[] = {QPATHTOF(sounds\fast_2.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_heartbeat_fast_3 { + name = "ACE_heartbeat_fast_3"; + sound[] = {QPATHTOF(sounds\fast_3.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_heartbeat_norm_1 { + name = "ACE_heartbeat_norm_1"; + sound[] = {QPATHTOF(sounds\norm_1.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_heartbeat_norm_2 { + name = "ACE_heartbeat_norm_2"; + sound[] = {QPATHTOF(sounds\norm_2.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_heartbeat_slow_1 { + name = "ACE_heartbeat_slow_1"; + sound[] = {QPATHTOF(sounds\slow_1.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_heartbeat_slow_2 { + name = "ACE_heartbeat_slow_2"; + sound[] = {QPATHTOF(sounds\slow_2.wav), "db+1", 1}; + titles[] = {}; + }; + + // Fractures -------------------------------------------------------------- + class ACE_fracture_1 { + name = "ACE_fracture_1"; + sound[] = {QPATHTOF(sounds\fracture_1.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_fracture_2 { + name = "ACE_fracture_2"; + sound[] = {QPATHTOF(sounds\fracture_2.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_fracture_3 { + name = "ACE_fracture_3"; + sound[] = {QPATHTOF(sounds\fracture_3.wav), "db+1", 1}; + titles[] = {}; + }; + class ACE_fracture_4 { + name = "ACE_fracture_4"; + sound[] = {QPATHTOF(sounds\fracture_4.wav), "db+1", 1}; + titles[] = {}; + }; + + // Moans ------------------------------------------------------------------ + class ACE_moan_Male08ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_6 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_7 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_7", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_low_8 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_8", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_6 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_7 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_7", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_mid_8 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_8", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_6 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_7 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_7", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male08ENG_high_8 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_8", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_6 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_7 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_7", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_low_8 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_8", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_6 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_7 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_7", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_mid_8 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_8", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_6 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_7 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_7", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06ENG_high_8 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_8", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male09ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male07ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03GRE_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENGB_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01ENGB_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male01GRE_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male02GRE_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male03ENGB_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05GRE_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male06GRE_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male04GRE_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENGB_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_low_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_low_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_low_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_low_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_low_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_mid_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_mid_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_mid_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_mid_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_mid_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_high_1 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_high_2 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_high_3 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_high_4 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_moan_Male05ENG_high_5 { + sound[] = {"A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_5", "db+1", 1}; + titles[] = {}; + }; + + // Screams ---------------------------------------------------------------- + class ACE_hit_Male08ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Low_hit_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Low_hit_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Low_hit_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Low_hit_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Low_hit_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Mid_hit_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Mid_hit_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Mid_hit_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Mid_hit_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Max_hit_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Max_hit_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Max_hit_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Max_hit_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male08ENG_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P01\Max_hit_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Low_hit_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Low_hit_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Low_hit_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Low_hit_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Low_hit_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_low_6 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Low_hit_6", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Mid_hit_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Mid_hit_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Mid_hit_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Mid_hit_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Max_hit_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Max_hit_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Max_hit_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P02\Max_hit_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male09ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P03\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male07ENG_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P04\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03GRE_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P05\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENGB_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P06\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01ENGB_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P07\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male01GRE_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P08\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02ENG_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P09\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male02GRE_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P10\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENG_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P11\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male03ENGB_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P12\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04ENG_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P13\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05GRE_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P14\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male06GRE_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P15\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male04GRE_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P16\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENGB_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P17\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_low_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Low_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_low_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Low_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_low_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Low_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_low_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Low_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_low_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Low_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_mid_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Mid_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_mid_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Mid_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_mid_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Mid_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_mid_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Mid_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_mid_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Mid_5", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_high_1 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Max_1", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_high_2 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Max_2", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_high_3 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Max_3", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_high_4 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Max_4", "db+1", 1}; + titles[] = {}; + }; + class ACE_hit_Male05ENG_high_5 { + sound[] = {"A3\sounds_f\characters\human-sfx\P18\Hit_Max_5", "db+1", 1}; + titles[] = {}; + }; +}; diff --git a/addons/medical_feedback/CfgVehicles.hpp b/addons/medical_feedback/CfgVehicles.hpp new file mode 100644 index 00000000000..3c1f114411a --- /dev/null +++ b/addons/medical_feedback/CfgVehicles.hpp @@ -0,0 +1,62 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + // Delete base game sounds. + // These are never played for ai and remote players. + #ifdef DISABLE_VANILLA_SCREAMS + class SoundHitScream { + person1[] = {{"Male08ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person2[] = {{"Male06ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person3[] = {{"Male09ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person4[] = {{"Male07ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person5[] = {{"Male03GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person6[] = {{"Male02ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person7[] = {{"Male01ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person8[] = {{"Male01GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person9[] = {{"Male02ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person10[] = {{"Male02GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person11[] = {{"Male03ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person12[] = {{"Male03ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person13[] = {{"Male04ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person14[] = {{"Male05GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person15[] = {{"Male06GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person16[] = {{"Male04GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person17[] = {{"Male05ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person18[] = {{"Male05ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + }; + #endif + #ifdef DISABLE_VANILLA_MOANS + class SoundInjured { + person_moan1[] = {{"Male08ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan2[] = {{"Male06ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan3[] = {{"Male09ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan4[] = {{"Male07ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan5[] = {{"Male03GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan6[] = {{"Male02ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan7[] = {{"Male01ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan8[] = {{"Male01GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan9[] = {{"Male02ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan10[] = {{"Male02GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan11[] = {{"Male03ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan12[] = {{"Male03ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan13[] = {{"Male04ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan14[] = {{"Male05GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan15[] = {{"Male06GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan16[] = {{"Male04GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan17[] = {{"Male05ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan18[] = {{"Male05ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + }; + #endif + // Can't overwrite these with empty sounds -> CTD + // Assume lock up if sound duration is 0 seconds. + // We mute the sounds instead + #ifdef DISABLE_VANILLA_HEARTBEAT + class PulsationSound { + sample0[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_1",0,0.7},1}}}; + sample1[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_3",0,0.7},1}}}; + sample2[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_4",0,0.7},1}}}; + sample3[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_5",0,0.7},1}}}; + }; + #endif + }; +}; diff --git a/addons/medical_feedback/RscInGameUI.hpp b/addons/medical_feedback/RscInGameUI.hpp new file mode 100644 index 00000000000..275117ca8ef --- /dev/null +++ b/addons/medical_feedback/RscInGameUI.hpp @@ -0,0 +1,13 @@ +class RscPictureKeepAspect; +class RscInGameUI { + class RscStanceInfo { + controls[] += {QGVAR(bloodVolumeIndicator)}; + class GVAR(bloodVolumeIndicator): RscPictureKeepAspect { + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(bloodVolumeIndicator),_this select 0)]); + x = IGUI_GRID_STANCE_X; + y = IGUI_GRID_STANCE_Y; + w = IGUI_GRID_STANCE_WAbs / 4; + h = IGUI_GRID_STANCE_HAbs / 4; + }; + }; +}; diff --git a/addons/medical_feedback/RscTitles.hpp b/addons/medical_feedback/RscTitles.hpp new file mode 100644 index 00000000000..9a9eb43e73b --- /dev/null +++ b/addons/medical_feedback/RscTitles.hpp @@ -0,0 +1,20 @@ + +#ifdef DISABLE_VANILLA_BLOOD_TEXTURES +class RscTitles { + // Disables blood texture overlay + class RscHealthTextures { + class controls { + class Flame_1; + class Blood_1: Flame_1 { + text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_lower_ca.paa"; + }; + class Blood_2: Flame_1 { + text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_middle_ca.paa"; + }; + class Blood_3: Flame_1 { + text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_upper_ca.paa"; + }; + }; + }; +}; +#endif diff --git a/addons/medical_feedback/XEH_PREP.hpp b/addons/medical_feedback/XEH_PREP.hpp new file mode 100644 index 00000000000..e6c48d65069 --- /dev/null +++ b/addons/medical_feedback/XEH_PREP.hpp @@ -0,0 +1,10 @@ +PREP(effectBleeding); +PREP(effectBloodVolume); +PREP(effectBloodVolumeIcon); +PREP(effectHeartBeat); +PREP(effectIncapacitated); +PREP(effectPain); +PREP(effectUnconscious); +PREP(handleEffects); +PREP(initEffects); +PREP(playInjuredSound); diff --git a/addons/medical_feedback/XEH_postInit.sqf b/addons/medical_feedback/XEH_postInit.sqf new file mode 100644 index 00000000000..f57478f88c2 --- /dev/null +++ b/addons/medical_feedback/XEH_postInit.sqf @@ -0,0 +1,120 @@ +#include "script_component.hpp" + +[QEGVAR(medical,injured), { + params ["_unit", "_painLevel"]; + [_unit, "hit", PAIN_TO_SCREAM(_painLevel)] call FUNC(playInjuredSound); + + if (hasInterface && {_unit == ace_player}) then { + [true] call FUNC(handleEffects); + }; +}] call CBA_fnc_addEventHandler; + +[QEGVAR(medical,moan), { + params ["_unit", "_painLevel"]; + [_unit, "moan", PAIN_TO_MOAN(_painLevel)] call FUNC(playInjuredSound); +}] call CBA_fnc_addEventHandler; + +if (!hasInterface) exitWith {}; + +[QEGVAR(medical,fracture), { + params ["_unit"]; + if (_unit == ACE_player) then { + playSound SND_FRACTURE; + }; +}] call CBA_fnc_addEventHandler; + +GVAR(nextFadeIn) = 0; +GVAR(heartBeatEffectRunning) = false; +GVAR(lastHeartBeatSound) = 0; +GVAR(bloodTickCounter) = 0; + +[false] call FUNC(initEffects); +[true] call FUNC(handleEffects); +[FUNC(handleEffects), 1, false] call CBA_fnc_addPerFrameHandler; + +["ace_unconscious", { + params ["_unit", "_unconscious"]; + + if (_unit != ACE_player) exitWith {}; + TRACE_1("player unconscious eh",_unconscious); + + if (_unconscious && {cameraView == "GUNNER"} && {(vehicle _unit) != _unit} && {cameraOn == vehicle _unit}) then { + TRACE_2("exiting gunner view",cameraOn,cameraView); + ACE_player switchCamera "INTERNAL"; + }; + + [!_unconscious, _unit] call EFUNC(common,setVolume); + + // Greatly reduce player's hearing ability while unconscious (affects radio addons) + private _volume = missionNamespace getVariable [QEGVAR(hearing,unconsciousnessVolume), VOL_UNCONSCIOUS]; + [QUOTE(ADDON), _volume, _unconscious] call EFUNC(common,setHearingCapability); + + [true] call FUNC(handleEffects); + ["unconscious", _unconscious] call EFUNC(common,setDisableUserInputStatus); +}] call CBA_fnc_addEventHandler; + +// Reset volume upon death for spectators +[QEGVAR(medical,death), { + params ["_unit"]; + + if (_unit != ACE_player) exitWith {}; + // Players always able to hear for any systems that might run while dead (e.g. spectator) + [true, _unit] call EFUNC(common,setVolume); + + [QUOTE(ADDON), 1, false] call EFUNC(common,setHearingCapability); +}] call CBA_fnc_addEventHandler; + +// Update effects to match new unit's current status (this also handles respawn) +["unit", { + params ["_new"]; + private _status = IS_UNCONSCIOUS(_new); + + [!_status, _new] call EFUNC(common,setVolume); + + private _volume = missionNamespace getVariable [QEGVAR(hearing,unconsciousnessVolume), VOL_UNCONSCIOUS]; + [QUOTE(ADDON), _volume, _status] call EFUNC(common,setHearingCapability); + [true] call FUNC(handleEffects); + ["unconscious", _status] call EFUNC(common,setDisableUserInputStatus); +}] call CBA_fnc_addPlayerEventHandler; + +// Forced say3D +[QGVAR(forceSay3D), { + params ["_unit", "_sound", "_distance"]; + + if (ACE_player distance _unit > _distance) exitWith {}; + + if (vehicle _unit == _unit) then { + // say3D waits for the previous sound to finish, so use a dummy instead + private _dummy = "#dynamicsound" createVehicleLocal [0, 0, 0]; + _dummy attachTo [_unit, [0, 0, 0], "camera"]; + _dummy say3D [_sound, _distance, 1, false]; + + [{ + detach _this; + deleteVehicle _this; + }, _dummy, 5] call CBA_fnc_waitAndExecute; + } else { + // Fallback: attachTo doesn't work within vehicles + _unit say3D [_sound, _distance, 1, false]; + }; +}] call CBA_fnc_addEventHandler; + +// Kill vanilla bleeding feedback effects. +#ifdef DISABLE_VANILLA_DAMAGE_EFFECTS +TRACE_1("disabling vanilla bleeding feedback effects",_this); +[{ + {isNil _x} count [ + "BIS_fnc_feedback_damageCC", + "BIS_fnc_feedback_damageRadialBlur", + "BIS_fnc_feedback_damageBlur" + ] == 0 +}, { + { + ppEffectDestroy _x; + } forEach [ + BIS_fnc_feedback_damageCC, + BIS_fnc_feedback_damageRadialBlur, + BIS_fnc_feedback_damageBlur + ]; +}] call CBA_fnc_waitUntilAndExecute; +#endif diff --git a/addons/medical_feedback/XEH_preInit.sqf b/addons/medical_feedback/XEH_preInit.sqf new file mode 100644 index 00000000000..9361d05015e --- /dev/null +++ b/addons/medical_feedback/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/medical_feedback/XEH_preStart.sqf b/addons/medical_feedback/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_feedback/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_feedback/config.cpp b/addons/medical_feedback/config.cpp new file mode 100644 index 00000000000..50eb2bbab3a --- /dev/null +++ b/addons/medical_feedback/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_status"}; + author = ECSTRING(common,ACETeam); + authors[] = {""}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgInGameUI.hpp" +#include "CfgSounds.hpp" +#include "CfgVehicles.hpp" +#include "RscTitles.hpp" +#include "RscInGameUI.hpp" diff --git a/addons/medical_feedback/data/blood1.paa b/addons/medical_feedback/data/blood1.paa new file mode 100644 index 00000000000..47a160172e3 Binary files /dev/null and b/addons/medical_feedback/data/blood1.paa differ diff --git a/addons/medical_feedback/data/blood2.paa b/addons/medical_feedback/data/blood2.paa new file mode 100644 index 00000000000..b58e0bbc77d Binary files /dev/null and b/addons/medical_feedback/data/blood2.paa differ diff --git a/addons/medical_feedback/data/bloodVolume_1.paa b/addons/medical_feedback/data/bloodVolume_1.paa new file mode 100644 index 00000000000..04ddeaae2cd Binary files /dev/null and b/addons/medical_feedback/data/bloodVolume_1.paa differ diff --git a/addons/medical_feedback/data/bloodVolume_2.paa b/addons/medical_feedback/data/bloodVolume_2.paa new file mode 100644 index 00000000000..550d5102710 Binary files /dev/null and b/addons/medical_feedback/data/bloodVolume_2.paa differ diff --git a/addons/medical_feedback/data/bloodVolume_3.paa b/addons/medical_feedback/data/bloodVolume_3.paa new file mode 100644 index 00000000000..8a24a5692a5 Binary files /dev/null and b/addons/medical_feedback/data/bloodVolume_3.paa differ diff --git a/addons/medical_feedback/data/bloodVolume_4.paa b/addons/medical_feedback/data/bloodVolume_4.paa new file mode 100644 index 00000000000..c8595768810 Binary files /dev/null and b/addons/medical_feedback/data/bloodVolume_4.paa differ diff --git a/addons/medical_feedback/data/bloodVolume_5.paa b/addons/medical_feedback/data/bloodVolume_5.paa new file mode 100644 index 00000000000..7f2061a31a0 Binary files /dev/null and b/addons/medical_feedback/data/bloodVolume_5.paa differ diff --git a/addons/medical_feedback/data/bloodVolume_6.paa b/addons/medical_feedback/data/bloodVolume_6.paa new file mode 100644 index 00000000000..22e3b0c3041 Binary files /dev/null and b/addons/medical_feedback/data/bloodVolume_6.paa differ diff --git a/addons/medical_feedback/functions/fnc_effectBleeding.sqf b/addons/medical_feedback/functions/fnc_effectBleeding.sqf new file mode 100644 index 00000000000..0f04ffd333e --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectBleeding.sqf @@ -0,0 +1,78 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the bleeding effect. + * + * Arguments: + * 0: Enable effect + * 1: Current bloodloss (in l/s) + * 2: Instant change (optional, default false) + * + * Return Value: + * None + * + * Example: + * [false, 0.5] call ace_medical_feedback_fnc_effectBleeding + * + * Public: No + */ + +params ["_enable", "_bloodloss", ["_instant", false]]; +if (isNull findDisplay 46) exitWith {}; + +private _controls = uiNamespace getVariable [QGVAR(bloodControls), [controlNull, controlNull]]; +_controls params ["_blood1", "_blood2"]; + +if (!_enable) exitWith { + _blood1 ctrlSetFade 1; + _blood2 ctrlSetFade 1; + + _blood1 ctrlCommit 0; + _blood2 ctrlCommit 0; +}; + +// Initialize controls +if (isNull _blood1) then { + TRACE_1("Creating Blood Controls",_controls); + _blood1 = findDisplay 46 ctrlCreate ["RscPicture", -1]; + _blood2 = findDisplay 46 ctrlCreate ["RscPicture", -1]; + + _blood1 ctrlSetText QPATHTOF(data\blood1.paa); + _blood2 ctrlSetText QPATHTOF(data\blood2.paa); + + private _pos = [safeZoneXAbs, safeZoneY, safeZoneWAbs, safeZoneH]; + _blood1 ctrlSetPosition _pos; + _blood2 ctrlSetPosition _pos; + + _blood1 ctrlSetFade 1; + _blood2 ctrlSetFade 1; + + _blood1 ctrlCommit 0; + _blood2 ctrlCommit 0; + + uiNamespace setVariable [QGVAR(bloodControls), [_blood1, _blood2]]; +}; + +private _fade = linearConversion [0, 0.002, _bloodloss, 1, 0, true]; + +if (GVAR(bloodTickCounter) == 2 || _instant) then { + if (ctrlFade _blood1 > ctrlFade _blood2) then { + _blood1 ctrlSetFade _fade; + _blood2 ctrlSetFade 1; + } else { + _blood1 ctrlSetFade 1; + _blood2 ctrlSetFade _fade; + }; + + if (_instant) then { + _blood1 ctrlCommit 0.3; + _blood2 ctrlCommit 0.3; + } else { + _blood1 ctrlCommit 3; + _blood2 ctrlCommit 3; + }; + + GVAR(bloodTickCounter) = 0; +} else { + GVAR(bloodTickCounter) = GVAR(bloodTickCounter) + 1; +}; diff --git a/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf b/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf new file mode 100644 index 00000000000..ae2dcc1e741 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the blood volume effect. + * + * Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [false, 0.5] call ace_medical_feedback_fnc_effectBloodVolume + * + * Public: No + */ + +params ["_enable", "_intensity"]; + +if (isNil QGVAR(ppBloodVolume)) exitWith {}; +if ((!_enable) || {_intensity == 0}) exitWith { + GVAR(ppBloodVolume) ppEffectEnable false; +}; + +GVAR(ppBloodVolume) ppEffectEnable true; +GVAR(ppBloodVolume) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1 - _intensity], [0.2, 0.2, 0.2, 0]]; +GVAR(ppBloodVolume) ppEffectCommit 1; diff --git a/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf b/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf new file mode 100644 index 00000000000..2ba1e5b6653 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf @@ -0,0 +1,41 @@ +#include "script_component.hpp" +/* + * Author: 10Dozen + * Handles the blood volume icon. + * + * Arguments: + * 0: Enable + * 1: Intensity 0...6 + * + * Return Value: + * None + * + * Example: + * [true, 4] call ace_medical_feedback_fnc_effectBloodVolumeIcon + * + * Public: No + */ + +params ["_enable", "_intensity"]; + +private _indicatorCtrl = uiNamespace getVariable [QGVAR(bloodVolumeIndicator), controlNull]; + +if (!_enable || !GVAR(showBloodVolumeIcon)) exitWith { + _indicatorCtrl ctrlSetText ""; +}; + +private _text = ""; +private _color = ICON_BLOODVOLUME_COLOR_NONE; + +if (_intensity > 0) then { + _text = ICON_BLOODVOLUME_PATH(_intensity); + if (_intensity > 2) then { + _color = [ICON_BLOODVOLUME_COLOR_ORANGE, ICON_BLOODVOLUME_COLOR_RED] select (_intensity > 4); + } else { + _color = ICON_BLOODVOLUME_COLOR_WHITE; + }; +}; + +// --- Affecting UI icon with proper image and color +_indicatorCtrl ctrlSetText _text; +_indicatorCtrl ctrlSetTextColor _color; diff --git a/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf new file mode 100644 index 00000000000..6156adb4f60 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the hear beat sound. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_feedback_fnc_effectHeartBeat + * + * Public: No + */ + +private _heartRate = GET_HEART_RATE(ACE_player); + +if (_heartRate == 0) exitWith { + TRACE_1("Ending heart beat effect - zero",_heartRate); + GVAR(heartBeatEffectRunning) = false; +}; +private _waitTime = 60 / _heartRate; + +// TRACE_2("",_heartRate,_waitTime); + +switch (true) do { + case (_heartRate > 160): { + // playSound SND_HEARBEAT_FAST; // Array doesn't blend together well, just play one file consistently + if (isGameFocused) then { playSound "ACE_heartbeat_fast_1"; }; + [FUNC(effectHeartBeat), [], _waitTime] call CBA_fnc_waitAndExecute; + }; + case (_heartRate < 60): { + if (isGameFocused) then { playSound SND_HEARBEAT_SLOW; }; + [FUNC(effectHeartBeat), [], _waitTime] call CBA_fnc_waitAndExecute; + }; + default { + TRACE_1("Ending heart beat effect - normal",_heartRate); + GVAR(heartBeatEffectRunning) = false; + }; +}; diff --git a/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf b/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf new file mode 100644 index 00000000000..73526d462a0 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Creates the incapacitation effect. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_feedback_fnc_effectIncapacitated + * + * Public: No + */ + +GVAR(ppIncapacitationBlur) ppEffectEnable true; +GVAR(ppIncapacitationGlare) ppEffectEnable true; + +GVAR(ppIncapacitationBlur) ppEffectAdjust [6]; +GVAR(ppIncapacitationGlare) ppEffectAdjust [1.2, 2, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]]; +GVAR(ppIncapacitationBlur) ppEffectCommit 0; +GVAR(ppIncapacitationGlare) ppEffectCommit 0; + +GVAR(ppIncapacitationBlur) ppEffectAdjust [0]; +GVAR(ppIncapacitationGlare) ppEffectAdjust [1.0, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]]; +GVAR(ppIncapacitationBlur) ppEffectCommit 5; +GVAR(ppIncapacitationGlare) ppEffectCommit 5; diff --git a/addons/medical_feedback/functions/fnc_effectPain.sqf b/addons/medical_feedback/functions/fnc_effectPain.sqf new file mode 100644 index 00000000000..96f233a4b94 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectPain.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Triggers the pain effect (single flash). + * + * Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [true, 0.5] call ace_medical_feedback_fnc_effectPain + * + * Public: No + */ + +params ["_enable", "_intensity"]; + +if (!_enable || {_intensity == 0}) exitWith { + GVAR(ppPain) ppEffectEnable false; + GVAR(ppPainBlur) ppEffectEnable false; +}; +GVAR(ppPain) ppEffectEnable true; +GVAR(ppPainBlur) ppEffectEnable true; + +// Trigger effect every 2s +private _showNextTick = missionNamespace getVariable [QGVAR(showPainNextTick), true]; +GVAR(showPainNextTick) = !_showNextTick; +if (_showNextTick) exitWith {}; + +private _blurIntensity = linearConversion [0.8, 1, _intensity, 0, 1, true]; +GVAR(ppPainBlur) ppEffectAdjust [_blurIntensity]; +GVAR(ppPainBlur) ppEffectCommit 0.1; + +if (GVAR(painEffectType) == FX_PAIN_ONLY_BASE) exitWith {}; + +private _initialAdjust = []; +private _delayedAdjust = []; + +switch (GVAR(painEffectType)) do { + case FX_PAIN_WHITE_FLASH: { + _intensity = linearConversion [0, 1, _intensity, 0, 0.6, true]; + _initialAdjust = [1, 1, 0, [1, 1, 1, _intensity ], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]; + _delayedAdjust = [1, 1, 0, [1, 1, 1, _intensity * 0.3], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]; + }; + case FX_PAIN_PULSATING_BLUR: { + _intensity = linearConversion [0, 1, _intensity, 0, 0.008, true]; + _initialAdjust = [_intensity , _intensity , 0.15, 0.15]; + _delayedAdjust = [_intensity * 0.2, _intensity * 0.2, 0.25, 0.25]; + }; + case FX_PAIN_CHROMATIC_ABERRATION: { + _intensity = linearConversion [0, 1, _intensity, 0, 0.06, true]; + _initialAdjust = [_intensity , _intensity , true]; + _delayedAdjust = [_intensity * 0.15, _intensity * 0.15, true]; + }; +}; + +GVAR(ppPain) ppEffectAdjust _initialAdjust; +GVAR(ppPain) ppEffectCommit FX_PAIN_FADE_IN; +[{ + params ["_adjust", "_painEffectType"]; + if (GVAR(painEffectType) != _painEffectType) exitWith {TRACE_1("Effect type changed",_this);}; + GVAR(ppPain) ppEffectAdjust _adjust; + GVAR(ppPain) ppEffectCommit FX_PAIN_FADE_OUT; +}, [_delayedAdjust, GVAR(painEffectType)], FX_PAIN_FADE_IN] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_feedback/functions/fnc_effectUnconscious.sqf b/addons/medical_feedback/functions/fnc_effectUnconscious.sqf new file mode 100644 index 00000000000..3cd15bd405c --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectUnconscious.sqf @@ -0,0 +1,114 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the unconscious effect. + * + * Arguments: + * 0: Enable + * 1: Mode (0: instant, 1: animation, 2: fx handler) + * + * Return Value: + * None + * + * Example: + * [true, 0] call ace_medical_feedback_fnc_effectUnconscious + * + * Public: No + */ + +params ["_enable", "_mode"]; + +switch (_mode) do { + // Instant (for Zeus or death) + case 0: { + GVAR(ppUnconsciousBlur) ppEffectEnable _enable; + GVAR(ppUnconsciousBlackout) ppEffectEnable _enable; + }; + // Animated (triggered on unconscious event) + case 1: { + if (_enable) then { + ACE_player setVariable [QGVAR(effectUnconsciousTimeout), CBA_missionTime + FX_UNCON_FADE_IN]; + GVAR(ppUnconsciousBlur) ppEffectEnable true; + GVAR(ppUnconsciousBlackout) ppEffectEnable true; + + GVAR(ppUnconsciousBlur) ppEffectAdjust [0]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + GVAR(ppUnconsciousBlackout) ppEffectCommit 0; + + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit FX_UNCON_FADE_IN; + GVAR(ppUnconsciousBlackout) ppEffectCommit FX_UNCON_FADE_IN; + + // Handle next fade in + GVAR(nextFadeIn) = CBA_missionTime + 15 + random 5; + } else { + ACE_player setVariable [QGVAR(effectUnconsciousTimeout), CBA_missionTime + FX_UNCON_FADE_OUT]; + GVAR(ppUnconsciousBlur) ppEffectEnable true; + GVAR(ppUnconsciousBlackout) ppEffectEnable true; + + // Step 1: Widen eye "hole" + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.9], [0, 0, 0, 1], [0, 0, 0, 0], [0.51, 0.17, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + + // Step 2: Open it + [{ + if (!isNull curatorCamera || {!alive ACE_player}) exitWith {}; + + GVAR(ppUnconsciousBlur) ppEffectAdjust [0]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.8], [0, 0, 0, 1], [0, 0, 0, 0], [0.7, 0.78, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit (FX_UNCON_FADE_OUT * 2/3); + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + }, [], FX_UNCON_FADE_OUT * 1/3] call CBA_fnc_waitAndExecute; + + // Step 3: Fade away vignette + [{ + if (!isNull curatorCamera || {!alive ACE_player}) exitWith {}; + + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0.7, 0.78, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + }, [], FX_UNCON_FADE_OUT * 2/3] call CBA_fnc_waitAndExecute; + }; + }; + // Raised by effectsHandler (blocked if animation in progress) + case 2: { + private _animatedTimeOut = ACE_player getVariable [QGVAR(effectUnconsciousTimeout), 0]; + if (_animatedTimeOut > CBA_missionTime) exitWith {}; + + if (_enable) then { + if (GVAR(nextFadeIn) < CBA_missionTime) then { + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.9], [0, 0, 0, 1], [0, 0, 0, 0], [0.51, 0.17, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 2/3); + + [{ + if (!isNull curatorCamera || {!alive ACE_player}) exitWith {}; + + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + }, [], FX_UNCON_FADE_OUT * 2/3] call CBA_fnc_waitAndExecute; + + ACE_player setVariable [QGVAR(effectUnconsciousTimeout), CBA_missionTime + FX_UNCON_FADE_OUT]; + GVAR(nextFadeIn) = CBA_missionTime + FX_UNCON_FADE_OUT + 15 + random 5; + } else { + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + GVAR(ppUnconsciousBlackout) ppEffectCommit 0; + }; + } else { + GVAR(ppUnconsciousBlur) ppEffectAdjust [0]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + GVAR(ppUnconsciousBlackout) ppEffectCommit 0; + }; + + GVAR(ppUnconsciousBlur) ppEffectEnable _enable; + GVAR(ppUnconsciousBlackout) ppEffectEnable _enable; + }; +}; diff --git a/addons/medical_feedback/functions/fnc_handleEffects.sqf b/addons/medical_feedback/functions/fnc_handleEffects.sqf new file mode 100644 index 00000000000..77c8d9f1ae8 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_handleEffects.sqf @@ -0,0 +1,61 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles any visual effects of medical. + * Note: Heart beat sounds run in a different PFH - see fnc_effectHeartBeat. + * + * Arguments: + * 0: Manual, instant update (optional, default false) + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_feedback_fnc_handleEffects + * + * Public: No + */ +params [["_manualUpdate", false]]; + +if (EGVAR(common,OldIsCamera) || {!alive ACE_player}) exitWith { + [false, 0] call FUNC(effectUnconscious); + [false] call FUNC(effectPain); + [false] call FUNC(effectBloodVolume); + [false] call FUNC(effectBloodVolumeIcon); + [false] call FUNC(effectBleeding); +}; + +BEGIN_COUNTER(handleEffects); + +// - Current state info ------------------------------------------------------- +private _bleedingStrength = GET_BLOOD_LOSS(ACE_player); +private _bloodVolume = GET_BLOOD_VOLUME(ACE_player); +private _unconscious = IS_UNCONSCIOUS(ACE_player); +private _heartRate = GET_HEART_RATE(ACE_player); +private _pain = GET_PAIN_PERCEIVED(ACE_player); + +if ((!GVAR(heartBeatEffectRunning)) && {_heartRate != 0} && {(_heartRate > 160) || {_heartRate < 60}}) then { + TRACE_1("Starting heart beat effect",_heartRate); + GVAR(heartBeatEffectRunning) = true; + [] call FUNC(effectHeartBeat); +}; + +// - Visual effects ----------------------------------------------------------- +[_unconscious, 2] call FUNC(effectUnconscious); +[ + true, + linearConversion [BLOOD_VOLUME_CLASS_2_HEMORRHAGE, BLOOD_VOLUME_CLASS_4_HEMORRHAGE, _bloodVolume, 0, 1, true] +] call FUNC(effectBloodVolume); +[ + true, + ceil linearConversion [ + BLOOD_VOLUME_CLASS_2_HEMORRHAGE, BLOOD_VOLUME_CLASS_4_HEMORRHAGE, + _bloodVolume, + ICON_BLOODVOLUME_IDX_MIN, ICON_BLOODVOLUME_IDX_MAX, true + ] +] call FUNC(effectBloodVolumeIcon); + +[!_unconscious, _pain] call FUNC(effectPain); +[!_unconscious, _bleedingStrength, _manualUpdate] call FUNC(effectBleeding); + +END_COUNTER(handleEffects); diff --git a/addons/medical_feedback/functions/fnc_initEffects.sqf b/addons/medical_feedback/functions/fnc_initEffects.sqf new file mode 100644 index 00000000000..1d908c529d8 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_initEffects.sqf @@ -0,0 +1,124 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Initializes visual effects of medical. + * + * Arguments: + * 0: Update pain and low blood volume effects only + * + * Return Value: + * None + * + * Example: + * [false] call ace_medical_feedback_fnc_initEffects + * + * Public: No + */ + +params [["_updateOnly", false]]; + +TRACE_1("initEffects",_updateOnly); + +private _fnc_createEffect = { + params ["_type", "_layer", "_default"]; + + private _effect = ppEffectCreate [_type, _layer]; + _effect ppEffectForceInNVG true; + _effect ppEffectAdjust _default; + _effect ppEffectCommit 0; + + _effect +}; + +// - Pain --------------------------------------------------------------------- +if (!isNil QGVAR(ppPain)) then { + TRACE_1("delete pain",GVAR(ppPain)); + ppEffectDestroy GVAR(ppPain) +}; +switch (GVAR(painEffectType)) do { + case FX_PAIN_WHITE_FLASH: { + GVAR(ppPain) = [ + "ColorCorrections", + 13502, + [1, 1, 0, [1, 1, 1, 0], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]] + ] call _fnc_createEffect; + }; + case FX_PAIN_PULSATING_BLUR: { + GVAR(ppPain) = [ + "RadialBlur", // "Will not do anything if RADIAL BLUR is disabled in Video Options." + 13502, + [0, 0, 0.25, 0.25] + ] call _fnc_createEffect; + }; + case FX_PAIN_CHROMATIC_ABERRATION: { + GVAR(ppPain) = [ + "ChromAberration", + 13502, + [0, 0, false] + ] call _fnc_createEffect; + }; +}; +// Base blur on high pain +if (isNil QGVAR(ppPainBlur)) then { + GVAR(ppPainBlur) = [ + "DynamicBlur", + 813, // 135xx does not work + [0] + ] call _fnc_createEffect; +}; + +TRACE_1("created pain",GVAR(ppPain)); + +// - Blood volume ------------------------------------------------------------- +private _ppBloodVolumeSettings = [ + "ColorCorrections", + 13503, + [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0.2, 0.2, 0.2, 0]] +]; +GVAR(showBloodVolumeIcon) = false; + +if (!isNil QGVAR(ppBloodVolume)) then { + TRACE_1("delete blood volume",GVAR(ppBloodVolume)); + ppEffectDestroy GVAR(ppBloodVolume); + GVAR(ppBloodVolume) = nil; +}; +switch (GVAR(bloodVolumeEffectType)) do { + case FX_BLOODVOLUME_COLOR_CORRECTION: { + GVAR(ppBloodVolume) = _ppBloodVolumeSettings call _fnc_createEffect; + }; + case FX_BLOODVOLUME_ICON: { + GVAR(showBloodVolumeIcon) = true; + }; + case FX_BLOODVOLUME_BOTH: { + GVAR(showBloodVolumeIcon) = true; + GVAR(ppBloodVolume) = _ppBloodVolumeSettings call _fnc_createEffect; + }; +}; + +if (_updateOnly) exitWith {}; + +// - Unconscious -------------------------------------------------------------- +GVAR(ppUnconsciousBlur) = [ + "DynamicBlur", + 814, // 135xx does not work + [0] +] call _fnc_createEffect; + +GVAR(ppUnconsciousBlackout) = [ + "ColorCorrections", + 13500, + [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] +] call _fnc_createEffect; + +// - Incapacitation ----------------------------------------------------------- +GVAR(ppIncapacitationGlare) = [ + "ColorCorrections", + 13504, + [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]] +] call _fnc_createEffect; + +GVAR(ppIncapacitationBlur) = [ + "DynamicBlur", + 815, // 135xx does not work + [0] +] call _fnc_createEffect; diff --git a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf new file mode 100644 index 00000000000..5773f904ff7 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf @@ -0,0 +1,69 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Play random injured sound for a unit. The sound is broadcasted across MP. + * Will not play if the unit has already played a sound within to close a time frame. + * + * Arguments: + * 0: Unit + * 1: Type (optional) ["hit" (default) or "moan"] + * 2: Severity (optional) [0 (default), 1, 2] + * + * Return Value: + * None + * + * Example: + * [player, "hit", 1] call ace_medical_feedback_fnc_playInjuredSound + * + * Public: No + */ +#define TIME_OUT_HIT 1 +#define TIME_OUT_MOAN [12, 7.5, 5] + +params [["_unit", objNull, [objNull]], ["_type", "hit", [""]], ["_severity", 0, [0]]]; +// TRACE_3("",_unit,_type,_severity); + +if (!local _unit) exitWith { ERROR_2("playInjuredSound: Unit not local or null [%1:%2]",_unit,typeOf _unit); }; + +if !(_unit call EFUNC(common,isAwake)) exitWith {}; + +// Limit network traffic by only sending the event to players who can potentially hear it +private _distance = if (_type == "hit") then { + [50, 60, 70] select _severity; +} else { + [10, 15, 20] select _severity; +}; +private _targets = allPlayers inAreaArray [getPosWorld _unit, _distance, _distance, 0, false, _distance]; +if (_targets isEqualTo []) exitWith {}; + +// Handle timeout +if (_unit getVariable [QGVAR(soundTimeout) + _type, -1] > CBA_missionTime) exitWith {}; +private _timeOut = if (_type == "moan") then { TIME_OUT_MOAN # _severity } else { TIME_OUT_HIT }; +_unit setVariable [QGVAR(soundTimeout) + _type, CBA_missionTime + _timeOut]; + +// Get units speaker +private _speaker = speaker _unit; +if (_speaker == "ACE_NoVoice") then { + _speaker = _unit getVariable "ace_originalSpeaker"; +}; + +// Fallback if speaker has no associated scream/moan sound +if (isNull (configFile >> "CfgSounds" >> format ["ACE_moan_%1_low_1", _speaker])) then { + _speaker = "Male08ENG"; +}; + +// Select actual sound +private _variation = ["low", "mid", "high"] select _severity; + +private _cfgSounds = configFile >> "CfgSounds"; +private _targetClass = format ["ACE_%1_%2_%3_", _type, _speaker, _variation]; +private _index = 1; +private _sounds = []; +while {isClass (_cfgSounds >> (_targetClass + str _index))} do { + _sounds pushBack (_cfgSounds >> (_targetClass + str _index)); + _index = _index + 1; +}; +private _sound = configName selectRandom _sounds; +if (isNil "_sound") exitWith { WARNING_1("no sounds for target [%1]",_targetClass); }; + +[QGVAR(forceSay3D), [_unit, _sound, _distance], _targets] call CBA_fnc_targetEvent; diff --git a/addons/medical_feedback/functions/script_component.hpp b/addons/medical_feedback/functions/script_component.hpp new file mode 100644 index 00000000000..ff9d04881cf --- /dev/null +++ b/addons/medical_feedback/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_feedback\script_component.hpp" diff --git a/addons/medical_feedback/initSettings.sqf b/addons/medical_feedback/initSettings.sqf new file mode 100644 index 00000000000..128f1f6b911 --- /dev/null +++ b/addons/medical_feedback/initSettings.sqf @@ -0,0 +1,41 @@ +[ + QGVAR(painEffectType), + "LIST", + [LSTRING(PainEffectType_DisplayName), LSTRING(PainEffectType_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [ + [FX_PAIN_WHITE_FLASH, FX_PAIN_PULSATING_BLUR, FX_PAIN_CHROMATIC_ABERRATION, FX_PAIN_ONLY_BASE], + [LSTRING(painEffectType_whiteFlashing), LSTRING(painEffectType_pulsingBlur), LSTRING(painEffectType_chromAberration), LSTRING(painEffectType_onlyBase)], + 0 + ], + false, + { + if (isNil QGVAR(ppPain)) exitWith { + TRACE_1("painEffectType setting - before postInit",_this); + }; + + TRACE_1("painEffectType setting - resetting effect",_this); + [true] call FUNC(initEffects); + } +] call CBA_fnc_addSetting; + +[ + QGVAR(bloodVolumeEffectType), + "LIST", + [LSTRING(BloodVolumeEffectType_DisplayName), LSTRING(BloodVolumeEffectType_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [ + [FX_BLOODVOLUME_COLOR_CORRECTION, FX_BLOODVOLUME_ICON, FX_BLOODVOLUME_BOTH], + [LSTRING(BloodVolumeEffectType_colorCorrection), LSTRING(BloodVolumeEffectType_icon), LSTRING(BloodVolumeEffectType_both)], + 0 + ], + false, + { + if (isNil QGVAR(showBloodVolumeIcon)) exitWith { + TRACE_1("bloodVolumeEffect setting - before postInit",_this); + }; + + TRACE_1("bloodVolumeEffect setting - resetting effect",_this); + [true] call FUNC(initEffects); + } +] call CBA_fnc_addSetting; diff --git a/addons/medical_feedback/script_component.hpp b/addons/medical_feedback/script_component.hpp new file mode 100644 index 00000000000..54127b6619b --- /dev/null +++ b/addons/medical_feedback/script_component.hpp @@ -0,0 +1,57 @@ +#define COMPONENT medical_feedback +#define COMPONENT_BEAUTIFIED Medical Feedback +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_FEEDBACK + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_FEEDBACK + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_FEEDBACK +#endif + +#include "\a3\ui_f\hpp\defineCommonGrids.inc" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" + +#define EMPTY_SOUND {"A3\Sounds_F\dummysound.wss",1,1} +#define NAMESPACE_NULL locationNull + +#define DISABLE_VANILLA_SCREAMS +#define DISABLE_VANILLA_MOANS +#define DISABLE_VANILLA_HEARTBEAT +#define DISABLE_VANILLA_BLOOD_TEXTURES +#define DISABLE_VANILLA_DAMAGE_EFFECTS + +#define FX_PAIN_FADE_IN 0.3 +#define FX_PAIN_FADE_OUT 0.7 +#define FX_UNCON_FADE_IN 2.0 +#define FX_UNCON_FADE_OUT 5.0 + +#define SND_HEARBEAT_FAST (selectRandom ["ACE_heartbeat_fast_1", "ACE_heartbeat_fast_2", "ACE_heartbeat_fast_3"]) +#define SND_HEARBEAT_NORMAL (selectRandom ["ACE_heartbeat_norm_1", "ACE_heartbeat_norm_2"]) +#define SND_HEARBEAT_SLOW (selectRandom ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]) +#define SND_FRACTURE (selectRandom ["ACE_fracture_1", "ACE_fracture_2", "ACE_fracture_3", "ACE_fracture_4"]) + +#define VOL_UNCONSCIOUS 0.25 + +#define FX_PAIN_WHITE_FLASH 0 +#define FX_PAIN_PULSATING_BLUR 1 +#define FX_PAIN_CHROMATIC_ABERRATION 2 +#define FX_PAIN_ONLY_BASE 3 + +#define FX_BLOODVOLUME_COLOR_CORRECTION 0 +#define FX_BLOODVOLUME_ICON 1 +#define FX_BLOODVOLUME_BOTH 2 + +#define ICON_BLOODVOLUME_IDX_MIN 0 +#define ICON_BLOODVOLUME_IDX_MAX 6 +#define ICON_BLOODVOLUME_PATH(num) format [QPATHTOF(data\bloodVolume_%1.paa), num] +#define ICON_BLOODVOLUME_COLOR_NONE [0, 0, 0, 0] +#define ICON_BLOODVOLUME_COLOR_WHITE [1, 1, 1, 1] +#define ICON_BLOODVOLUME_COLOR_ORANGE [1, 0.6, 0, 1] +#define ICON_BLOODVOLUME_COLOR_RED [0.8, 0.2, 0, 1] diff --git a/addons/medical/sounds/heart_beats/fast_1.wav b/addons/medical_feedback/sounds/fast_1.wav similarity index 100% rename from addons/medical/sounds/heart_beats/fast_1.wav rename to addons/medical_feedback/sounds/fast_1.wav diff --git a/addons/medical/sounds/heart_beats/fast_2.wav b/addons/medical_feedback/sounds/fast_2.wav similarity index 100% rename from addons/medical/sounds/heart_beats/fast_2.wav rename to addons/medical_feedback/sounds/fast_2.wav diff --git a/addons/medical/sounds/heart_beats/fast_3.wav b/addons/medical_feedback/sounds/fast_3.wav similarity index 100% rename from addons/medical/sounds/heart_beats/fast_3.wav rename to addons/medical_feedback/sounds/fast_3.wav diff --git a/addons/medical_feedback/sounds/fracture_1.wav b/addons/medical_feedback/sounds/fracture_1.wav new file mode 100644 index 00000000000..b68a71da55e Binary files /dev/null and b/addons/medical_feedback/sounds/fracture_1.wav differ diff --git a/addons/medical_feedback/sounds/fracture_2.wav b/addons/medical_feedback/sounds/fracture_2.wav new file mode 100644 index 00000000000..2725a8769e0 Binary files /dev/null and b/addons/medical_feedback/sounds/fracture_2.wav differ diff --git a/addons/medical_feedback/sounds/fracture_3.wav b/addons/medical_feedback/sounds/fracture_3.wav new file mode 100644 index 00000000000..c96126b15c6 Binary files /dev/null and b/addons/medical_feedback/sounds/fracture_3.wav differ diff --git a/addons/medical_feedback/sounds/fracture_4.wav b/addons/medical_feedback/sounds/fracture_4.wav new file mode 100644 index 00000000000..0ff6a9e0084 Binary files /dev/null and b/addons/medical_feedback/sounds/fracture_4.wav differ diff --git a/addons/medical/sounds/heart_beats/norm_1.wav b/addons/medical_feedback/sounds/norm_1.wav similarity index 100% rename from addons/medical/sounds/heart_beats/norm_1.wav rename to addons/medical_feedback/sounds/norm_1.wav diff --git a/addons/medical/sounds/heart_beats/norm_2.wav b/addons/medical_feedback/sounds/norm_2.wav similarity index 100% rename from addons/medical/sounds/heart_beats/norm_2.wav rename to addons/medical_feedback/sounds/norm_2.wav diff --git a/addons/medical/sounds/heart_beats/slow_1.wav b/addons/medical_feedback/sounds/slow_1.wav similarity index 100% rename from addons/medical/sounds/heart_beats/slow_1.wav rename to addons/medical_feedback/sounds/slow_1.wav diff --git a/addons/medical/sounds/heart_beats/slow_2.wav b/addons/medical_feedback/sounds/slow_2.wav similarity index 100% rename from addons/medical/sounds/heart_beats/slow_2.wav rename to addons/medical_feedback/sounds/slow_2.wav diff --git a/addons/medical_feedback/stringtable.xml b/addons/medical_feedback/stringtable.xml new file mode 100644 index 00000000000..36856588be2 --- /dev/null +++ b/addons/medical_feedback/stringtable.xml @@ -0,0 +1,184 @@ + + + + + Feedback + Feedback + 感触 + Реакция на ранения + Réaction aux blessures + Reação a Lesões + 視覺回饋 + Commenti + Zpětná vazba + Informacje Zwrotne + Reacción + Geri Bildirim + + + Pain Effect Type + Schmerzeffekt-Typ + Rodzaj efektu bólu + Визуальный эффект боли + Effetto del dolore + Tipo de efecto de dolor + Effet de douleur + Fájdalom-effekt típusa + Tipo do efeito de dor + Efekt pro bolest + 痛み効果種類 + 고통 효과 종류 + 疼痛效果類型 + Ağrı Etkisi Türü + + + Selects the used pain effect type. + 痛みの効果を選択できます。 + Permet de choisir quel effet provoque la douleur. + Выбирает тип визуализации болевого эффекта. + Selecione o tipo de efeito de dor. + 選擇哪一個視覺效果用於回饋疼痛 + Seleziona il tipo di effetto del dolore usato. + Nastavuje který efekt bolesti bude používán. + Wybiera rodzaj efektu bólu. + Selecciona el tipo de efecto de dolor + Kullanılan ağrı efekti tipini seçer. + Wählt den zu benutzenden Schmerzeffekt aus. + + + White Flashing + Weißes blinken + 白く点滅 + Белые вспышки + Flash blancs + Flashes Brancos + 白光閃爍 + Bianco lampeggiante + Blikání bílé barvy + Miganie na biało + Destello blanco + Beyaz Yanıp Sönüyor + + + Pulsing Blur + Wiederkehrende Unschärfe + ボケの強弱 + Пульсирующее размытие + Pulsations floues + Borrão Pulsante + 脈動模糊 + Sfocatura pulsante + Pulzující rozmazání + Pulsujące rozmycie + Enborronamiento pulsante + Titreşimli Bulanıklık + + + Chromatic Aberration + Chromatische Aberration + Aberracja chromatyczna + Хроматическая аберрация + Aberrazione cromatica + Aberración cromática + Aberration chromatique + Kromatikus aberráció + Chromatická aberace + Aberração cromática + 色の収差 + 색수차 + 色差 + 色差 + Renk sapmaları + + + Only high pain effect + 強い痛みの時のみ + 只有在強烈疼痛時使用 + Juste un fort effet douloureux + Solo elevato effetto di dolore + Pouze efekt vysoké bolesti + Tylko efekt mocnego bólu + Apenas efeito de dor alta + Solo efecto de dolor fuerte + Sadece yüksek ağrı etkisi + Nur bei starken Schmerzen + Эффект только сильной боли + + + Low Blood Volume Effect Type + Визуальный эффект низкого объема крови + Effet de faible volume sanguin + 低血液量時の効果種類 + Efekt pro nízké množství krve + Efekt po utracie znacznej ilości krwi + + + Selects the used low blood volume effect type. + Выбирает тип визуализации эффекта низкого объема крови. + Permet de choisir quel effet provoque un faible volume sanguin. + 低血液量時の効果を選択できます。 + Nastavuje který efekt pro nízké množství krve bude používán. + Wybiera efekt ktory będzie pokazywany po utracie znacznej ilości krwi. + + + Color Fading + Потеря цветности + Atténuation des couleurs + 退色 + Ztráta barev + Zanikanie kolorów + + + Icon + Иконка + Icône + アイコン + Ikona + Ikona + + + Icon + Color Fading + Иконка + Потеря цветности + Icône + Atténuation des couleurs + アイコンと退色 + Ikona + Ztráta barev + Ikona + Zanikanie kolorów + + + + Enable Screams + Включить крики + Aktywuj wrzaski + Activar gritos + Schreie aktivieren + Povolit křik + Ativar gritos + Activer les cris + Kiáltások engedélyezése + Abilita Grida + 叫びを有効化 + 비명 활성화 + 启用尖叫 + 啟用尖叫 + Çığlıkları Etkinleştir + + + Enable screaming by injured units + Включить крики раненных бойцов + Aktywuj wrzeszczenie z bólu przez ranne jednostki + Activar gritos para unidades heridas + Aktiviere Schreie bei verletzten Einheiten + Povolit křičení zraněných jednotek + Ativa gritos para unidades feridas + Si cette option est activée, les unités blessées crieront, voire hurleront sous l'effet de la douleur. + Engedélyezi a sérült egységek kiáltásait + Abilita Grida da parte delle unità ferite + 負傷したユニットを叫ぶようにします。 + 부상당한 인원이 소리지르는것을 활성화합니다 + 启用伤者的尖叫声 + 啟用傷者的尖叫聲 + Yaralı birimler tarafından çığlık atmayı etkinleştir + + + + diff --git a/addons/medical_gui/$PBOPREFIX$ b/addons/medical_gui/$PBOPREFIX$ new file mode 100644 index 00000000000..8eca0a3cfe5 --- /dev/null +++ b/addons/medical_gui/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_gui diff --git a/addons/medical_menu/CfgEventHandlers.hpp b/addons/medical_gui/CfgEventHandlers.hpp similarity index 100% rename from addons/medical_menu/CfgEventHandlers.hpp rename to addons/medical_gui/CfgEventHandlers.hpp diff --git a/addons/medical_gui/CfgUIGrids.hpp b/addons/medical_gui/CfgUIGrids.hpp new file mode 100644 index 00000000000..b0835fe7098 --- /dev/null +++ b/addons/medical_gui/CfgUIGrids.hpp @@ -0,0 +1,30 @@ +class CfgUIGrids { + class IGUI { + class Presets { + class Arma3 { + class Variables { + GVAR(patientInfo)[] = { + { + PATIENT_INFO_IGUI_BASE_X, + PATIENT_INFO_IGUI_BASE_Y, + POS_W(9), + POS_H(20) + }, + GUI_GRID_W, + GUI_GRID_H + }; + }; + }; + }; + + class Variables { + class GVAR(patientInfo) { + displayName = ECSTRING(medical,Category); + description = CSTRING(IGUI_PatientInfo); + preview = QPATHTOF(ui\patient_info_preview_ca.paa); + saveToProfile[] = {0, 1}; + canResize = 0; + }; + }; + }; +}; diff --git a/addons/medical_gui/CfgVehicles.hpp b/addons/medical_gui/CfgVehicles.hpp new file mode 100644 index 00000000000..eecae9a3596 --- /dev/null +++ b/addons/medical_gui/CfgVehicles.hpp @@ -0,0 +1,65 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Medical { + displayName = CSTRING(Medical); + condition = QGVAR(enableSelfActions); + exceptions[] = {"isNotInside", "isNotSitting"}; + statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); + runOnHover = 1; + icon = QPATHTOF(ui\cross.paa); + #define ACTION_CONDITION condition = "true"; + #include "InteractionBodyParts.hpp" + #undef ACTION_CONDITION + }; + class ACE_Medical_Menu { + displayName = CSTRING(MedicalMenu); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canOpenMenu)); + exceptions[] = {"isNotInside", "isNotSwimming"}; + statement = QUOTE(_target call FUNC(openMenu)); + icon = QPATHTOF(ui\cross.paa); + }; + }; + class ACE_Actions { + #define ACTION_CONDITION condition = QUOTE(GVAR(enableActions) == 0); + #include "InteractionBodyParts.hpp" + #undef ACTION_CONDITION + class ACE_MainActions { + class ACE_Medical_Menu { + displayName = CSTRING(MedicalMenu); + condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); + exceptions[] = {"isNotInside", "isNotSwimming"}; + statement = QUOTE(_target call FUNC(openMenu)); + icon = QPATHTOF(ui\cross.paa); + }; + class ACE_Medical_Radial { + displayName = CSTRING(Medical); + condition = QUOTE((GVAR(enableActions) == 1 || {GVAR(enableActions) != 2 && {vehicle _target != _target && {vehicle _target == vehicle _player}}})); + exceptions[] = {"isNotInside", "isNotSitting"}; + statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); + runOnHover = 1; + icon = QPATHTOF(ui\cross.paa); + #define ACTION_CONDITION condition = "true"; + #include "InteractionBodyParts.hpp" + #undef ACTION_CONDITION + }; + class ACE_LoadPatient { + displayName = CSTRING(LoadPatient); + condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {alive _target} && {vehicle _target == _target}); + exceptions[] = {"isNotDragging", "isNotCarrying"}; + statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,loadUnit)); + icon = QPATHTOF(ui\cross.paa); + insertChildren = QUOTE(call DEFUNC(medical_treatment,addLoadPatientActions)); + }; + class ACE_UnloadPatient { + displayName = CSTRING(UnloadPatient); + condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {vehicle _target != _target} && {vehicle _player == _player}); + exceptions[] = {"isNotDragging", "isNotCarrying", "isNotInside"}; + statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,unloadUnit)); + icon = QPATHTOF(ui\cross.paa); + }; + }; + }; + }; +}; diff --git a/addons/medical_gui/InteractionBodyParts.hpp b/addons/medical_gui/InteractionBodyParts.hpp new file mode 100644 index 00000000000..b06e24c2e7a --- /dev/null +++ b/addons/medical_gui/InteractionBodyParts.hpp @@ -0,0 +1,67 @@ +class ACE_Head { + displayName = ECSTRING(interaction,Head); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,0,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; +class ACE_Torso { + displayName = ECSTRING(interaction,Torso); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,1)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,1,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; + class TriageCard { + displayName = CSTRING(Actions_TriageCard); + exceptions[] = {"isNotInside", "isNotSitting"}; + condition = "true"; + statement = QUOTE(_target call FUNC(displayTriageCard)); + icon = QPATHTOF(ui\triage_card.paa); + }; +}; +class ACE_ArmLeft { + displayName = ECSTRING(interaction,ArmLeft); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,2)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,2,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; +class ACE_ArmRight { + displayName = ECSTRING(interaction,ArmRight); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,3)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,3,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; +class ACE_LegLeft { + displayName = ECSTRING(interaction,LegLeft); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,4)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,4,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; +class ACE_LegRight { + displayName = ECSTRING(interaction,LegRight); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,5)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,5,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; diff --git a/addons/medical_gui/README.md b/addons/medical_gui/README.md new file mode 100644 index 00000000000..37bd6250fda --- /dev/null +++ b/addons/medical_gui/README.md @@ -0,0 +1,11 @@ +ace_medical_gui +=============== + +Implements the interaction menu actions, medical menu, information display, and triage card. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Glowbal](https://github.com/Glowbal) +- [mharis001](https://github.com/mharis001) diff --git a/addons/medical_gui/XEH_PREP.hpp b/addons/medical_gui/XEH_PREP.hpp new file mode 100644 index 00000000000..c53b693bdf2 --- /dev/null +++ b/addons/medical_gui/XEH_PREP.hpp @@ -0,0 +1,22 @@ +PREP(addTreatmentActions); +PREP(bloodLossToRGBA); +PREP(canOpenMenu); +PREP(collectActions); +PREP(damageToRGBA); +PREP(displayPatientInformation); +PREP(displayTriageCard); +PREP(handleToggle); +PREP(handleTriageSelect); +PREP(menuPFH); +PREP(modifyAction); +PREP(onMenuClose); +PREP(onMenuOpen); +PREP(openMenu); +PREP(toggleTriageSelect); +PREP(updateActions); +PREP(updateBodyImage); +PREP(updateCategories); +PREP(updateInjuryList); +PREP(updateLogList); +PREP(updateTriageCard); +PREP(updateTriageStatus); diff --git a/addons/medical_gui/XEH_postInit.sqf b/addons/medical_gui/XEH_postInit.sqf new file mode 100644 index 00000000000..c6dd4e27221 --- /dev/null +++ b/addons/medical_gui/XEH_postInit.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +GVAR(target) = objNull; +GVAR(previousTarget) = objNull; +GVAR(selectedBodyPart) = 0; +GVAR(selectedCategory) = "triage"; + +GVAR(lastOpenedOn) = -1; +GVAR(pendingReopen) = false; + +GVAR(menuPFH) = -1; + +GVAR(selfInteractionActions) = []; +[] call FUNC(addTreatmentActions); +[] call FUNC(collectActions); + +[QEGVAR(interact_menu,newControllableObject), { + params ["_type"]; // string of the object's classname + if (!(_type isKindOf "CAManBase")) exitWith {}; + { + _x set [0, _type]; + _x call EFUNC(interact_menu,addActionToClass); + } forEach GVAR(selfInteractionActions); +}] call CBA_fnc_addEventHandler; + +["ace_treatmentSucceded", { + if (GVAR(openAfterTreatment) && {GVAR(pendingReopen)}) then { + GVAR(pendingReopen) = false; + [FUNC(openMenu), GVAR(target)] call CBA_fnc_execNextFrame; + }; +}] call CBA_fnc_addEventHandler; + +["ACE3 Common", QGVAR(openMedicalMenuKey), localize LSTRING(OpenMedicalMenu), { + // Get target (cursorTarget and cursorObject), if not valid then target is ACE_player + TRACE_3("Open menu key",cursorTarget,cursorObject,ACE_player); + private _target = cursorTarget; + if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then { + _target = cursorObject; + if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then { + _target = ACE_player; + }; + }; + + // Check conditions: canInteract and canOpenMenu + if !([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, _target] call FUNC(canOpenMenu)) exitWith {false}; + + // Statement + [_target] call FUNC(openMenu); + false +}, { + // Close menu if enough time passed from opening + if (CBA_missionTime - GVAR(lastOpenedOn) > 0.5) exitWith { + [objNull] call FUNC(openMenu); + }; + false +}, [DIK_H, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + + +// Close patient information display when interaction menu is closed +["ace_interactMenuClosed", { + QGVAR(RscPatientInfo) cutFadeOut 0.3; +}] call CBA_fnc_addEventHandler; diff --git a/addons/medical_gui/XEH_preInit.sqf b/addons/medical_gui/XEH_preInit.sqf new file mode 100644 index 00000000000..9361d05015e --- /dev/null +++ b/addons/medical_gui/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/medical_gui/XEH_preStart.sqf b/addons/medical_gui/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_gui/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_gui/config.cpp b/addons/medical_gui/config.cpp new file mode 100644 index 00000000000..b09143a6c98 --- /dev/null +++ b/addons/medical_gui/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_treatment", "ace_interaction"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "mharis001"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgUIGrids.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "gui.hpp" diff --git a/addons/medical/ui/body_arm_left.paa b/addons/medical_gui/data/body_image/arm_left.paa similarity index 100% rename from addons/medical/ui/body_arm_left.paa rename to addons/medical_gui/data/body_image/arm_left.paa diff --git a/addons/medical_gui/data/body_image/arm_left_b.paa b/addons/medical_gui/data/body_image/arm_left_b.paa new file mode 100644 index 00000000000..9d4cefd89b5 Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_left_b.paa differ diff --git a/addons/medical_gui/data/body_image/arm_left_t.paa b/addons/medical_gui/data/body_image/arm_left_t.paa new file mode 100644 index 00000000000..0f8ac03f2e8 Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_left_t.paa differ diff --git a/addons/medical/ui/body_arm_right.paa b/addons/medical_gui/data/body_image/arm_right.paa similarity index 100% rename from addons/medical/ui/body_arm_right.paa rename to addons/medical_gui/data/body_image/arm_right.paa diff --git a/addons/medical_gui/data/body_image/arm_right_b.paa b/addons/medical_gui/data/body_image/arm_right_b.paa new file mode 100644 index 00000000000..c5ae90dcbf5 Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_right_b.paa differ diff --git a/addons/medical_gui/data/body_image/arm_right_t.paa b/addons/medical_gui/data/body_image/arm_right_t.paa new file mode 100644 index 00000000000..5e64adf0f24 Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_right_t.paa differ diff --git a/addons/medical/ui/body_background.paa b/addons/medical_gui/data/body_image/background.paa similarity index 100% rename from addons/medical/ui/body_background.paa rename to addons/medical_gui/data/body_image/background.paa diff --git a/addons/medical/ui/body_head.paa b/addons/medical_gui/data/body_image/head.paa similarity index 100% rename from addons/medical/ui/body_head.paa rename to addons/medical_gui/data/body_image/head.paa diff --git a/addons/medical/ui/body_leg_left.paa b/addons/medical_gui/data/body_image/leg_left.paa similarity index 100% rename from addons/medical/ui/body_leg_left.paa rename to addons/medical_gui/data/body_image/leg_left.paa diff --git a/addons/medical_gui/data/body_image/leg_left_b.paa b/addons/medical_gui/data/body_image/leg_left_b.paa new file mode 100644 index 00000000000..f8780749959 Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_left_b.paa differ diff --git a/addons/medical_gui/data/body_image/leg_left_t.paa b/addons/medical_gui/data/body_image/leg_left_t.paa new file mode 100644 index 00000000000..035586906d1 Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_left_t.paa differ diff --git a/addons/medical/ui/body_leg_right.paa b/addons/medical_gui/data/body_image/leg_right.paa similarity index 100% rename from addons/medical/ui/body_leg_right.paa rename to addons/medical_gui/data/body_image/leg_right.paa diff --git a/addons/medical_gui/data/body_image/leg_right_b.paa b/addons/medical_gui/data/body_image/leg_right_b.paa new file mode 100644 index 00000000000..3b0dc02605e Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_right_b.paa differ diff --git a/addons/medical_gui/data/body_image/leg_right_t.paa b/addons/medical_gui/data/body_image/leg_right_t.paa new file mode 100644 index 00000000000..3a1f397e39b Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_right_t.paa differ diff --git a/addons/medical/ui/body_torso.paa b/addons/medical_gui/data/body_image/torso.paa similarity index 100% rename from addons/medical/ui/body_torso.paa rename to addons/medical_gui/data/body_image/torso.paa diff --git a/addons/medical_menu/data/icons/advanced_treatment_small.paa b/addons/medical_gui/data/categories/advanced_treatment.paa similarity index 100% rename from addons/medical_menu/data/icons/advanced_treatment_small.paa rename to addons/medical_gui/data/categories/advanced_treatment.paa diff --git a/addons/medical_menu/data/icons/airway_management_small.paa b/addons/medical_gui/data/categories/airway_management.paa similarity index 100% rename from addons/medical_menu/data/icons/airway_management_small.paa rename to addons/medical_gui/data/categories/airway_management.paa diff --git a/addons/medical_menu/data/icons/bandage_fracture_small.paa b/addons/medical_gui/data/categories/bandage_fracture.paa similarity index 100% rename from addons/medical_menu/data/icons/bandage_fracture_small.paa rename to addons/medical_gui/data/categories/bandage_fracture.paa diff --git a/addons/medical_menu/data/icons/icon_carry.paa b/addons/medical_gui/data/categories/carry.paa similarity index 100% rename from addons/medical_menu/data/icons/icon_carry.paa rename to addons/medical_gui/data/categories/carry.paa diff --git a/addons/medical_menu/data/icons/examine_patient_small.paa b/addons/medical_gui/data/categories/examine_patient.paa similarity index 100% rename from addons/medical_menu/data/icons/examine_patient_small.paa rename to addons/medical_gui/data/categories/examine_patient.paa diff --git a/addons/medical_menu/data/icons/medication_small.paa b/addons/medical_gui/data/categories/medication.paa similarity index 100% rename from addons/medical_menu/data/icons/medication_small.paa rename to addons/medical_gui/data/categories/medication.paa diff --git a/addons/medical_menu/data/icons/toggle_self_small.paa b/addons/medical_gui/data/categories/toggle_self.paa similarity index 100% rename from addons/medical_menu/data/icons/toggle_self_small.paa rename to addons/medical_gui/data/categories/toggle_self.paa diff --git a/addons/medical_menu/data/icons/triage_card_small.paa b/addons/medical_gui/data/categories/triage_card.paa similarity index 100% rename from addons/medical_menu/data/icons/triage_card_small.paa rename to addons/medical_gui/data/categories/triage_card.paa diff --git a/addons/medical/ui/triage_card_corner_l.paa b/addons/medical_gui/data/triage_card/corner_left.paa similarity index 100% rename from addons/medical/ui/triage_card_corner_l.paa rename to addons/medical_gui/data/triage_card/corner_left.paa diff --git a/addons/medical/ui/triage_card_corner_r.paa b/addons/medical_gui/data/triage_card/corner_right.paa similarity index 100% rename from addons/medical/ui/triage_card_corner_r.paa rename to addons/medical_gui/data/triage_card/corner_right.paa diff --git a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf new file mode 100644 index 00000000000..541c308ff0a --- /dev/null +++ b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut, mharis001 + * Creates actions for treatments from config and adds them to the interaction menu. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_addTreatmentActions + * + * Public: No + */ + +private _actionsConfig = configFile >> QEGVAR(medical_treatment,actions); +private _actionPaths = ["ACE_Head", "ACE_Torso", "ACE_ArmLeft", "ACE_ArmRight", "ACE_LegLeft", "ACE_LegRight"]; + +private _fnc_statement = { + params ["_target", "_player", "_args"]; + _args params ["_bodyPart", "_treatmentName"]; + [_player, _target, _bodyPart, _treatmentName] call EFUNC(medical_treatment,treatment); +}; + +private _fnc_condition = { + params ["_target", "_player", "_args"]; + _args params ["_bodyPart", "_treatmentName"]; + [_player, _target, _bodyPart, _treatmentName] call EFUNC(medical_treatment,canTreatCached); +}; + +{ + private _configName = configName _x; + private _actionName = format [QGVAR(_%1), _configName]; + private _displayName = getText (_x >> "displayName"); + private _icon = getText (_x >> "icon"); + + private _allowedBodyParts = getArray (_x >> "allowedSelections") apply {toLower _x}; + if (_allowedBodyParts isEqualTo ["all"]) then { + _allowedBodyParts = ALL_BODY_PARTS apply {toLower _x}; + }; + + { + private _bodyPart = _x; + private _actionPath = _actionPaths select (ALL_BODY_PARTS find toLower _bodyPart); + + private _action = [ + _actionName, + _displayName, + _icon, + _fnc_statement, + _fnc_condition, + {}, + [_bodyPart, _configName], + {[0, 0, 0]}, + 2, + [false, true, false, false, false] + ] call EFUNC(interact_menu,createAction); + + ["CAManBase", 0, [_actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); + ["CAManBase", 0, ["ACE_MainActions", "ACE_Medical_Radial", _actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); + GVAR(selfInteractionActions) pushBack ["", 1, ["ACE_SelfActions", "ACE_Medical", _actionPath], _action]; + } forEach _allowedBodyParts; +} forEach configProperties [_actionsConfig, "isClass _x"]; diff --git a/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf new file mode 100644 index 00000000000..b2852e1a2a0 --- /dev/null +++ b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: ShackTac, SilentSpike + * Converts a blood loss value into a representative RGBA colour. + * Blood loss colouring follows a "white, yellow, red" colour scale with 10 steps, Bezier interpolation and Correct lightness gradient. + * See: https://gka.github.io/palettes + * + * Arguments: + * 0: The blood loss value (range [0,1]) + * + * Return Value: + * Representative RGBA colour + * + * Example: + * [0.4] call ace_medical_gui_fnc_bloodLossToRGBA + * + * Public: No + */ + +params ["_bloodLoss"]; + +private _frBL = 0 max (_bloodLoss / BLOOD_LOSS_RED_THRESHOLD) min 1; +private _colorInt = ceil (_frBL * (BLOOD_LOSS_TOTAL_COLORS - 1)); + +[ + [1.00, 1.00, 1.00, 1], // #ffffff + [1.00, 0.95, 0.63, 1], // #fff1a1 + [1.00, 0.88, 0.46, 1], // #ffe075 + [1.00, 0.80, 0.33, 1], // #ffcb55 + [1.00, 0.72, 0.24, 1], // #ffb73c + [1.00, 0.63, 0.15, 1], // #ffa127 + [1.00, 0.53, 0.08, 1], // #ff8815 + [1.00, 0.43, 0.02, 1], // #ff6d05 + [1.00, 0.29, 0.00, 1], // #ff4b00 + [1.00, 0.00, 0.00, 1] // #ff0000 +] select _colorInt; diff --git a/addons/medical_gui/functions/fnc_canOpenMenu.sqf b/addons/medical_gui/functions/fnc_canOpenMenu.sqf new file mode 100644 index 00000000000..f94c73bb9ee --- /dev/null +++ b/addons/medical_gui/functions/fnc_canOpenMenu.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Checks if the player can open the Medical Menu for the target. + * + * Arguments: + * 0: Player + * 1: Target + * + * Return Value: + * Can open + * + * Example: + * [player, cursorTarget] call ace_medical_gui_fnc_canOpenMenu + * + * Public: No + */ + +params ["_player", "_target"]; + +alive _player +&& {!IS_UNCONSCIOUS(_player)} +&& {!isNull _target} +&& {_player distance _target < GVAR(maxDistance) || {vehicle _player == vehicle _target}} +&& {GVAR(enableMedicalMenu) == 1 || {GVAR(enableMedicalMenu) == 2 && {vehicle _player != _player || {vehicle _target != _target}}}} diff --git a/addons/medical_gui/functions/fnc_collectActions.sqf b/addons/medical_gui/functions/fnc_collectActions.sqf new file mode 100644 index 00000000000..cfc5dc5a037 --- /dev/null +++ b/addons/medical_gui/functions/fnc_collectActions.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Collect treatment actions for medical menu from config. + * Adds dragging actions if it exists. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_collectActions + * + * Public: No + */ + +GVAR(actions) = []; + +{ + private _configName = configName _x; + private _displayName = getText (_x >> "displayName"); + private _category = getText (_x >> "category"); + private _condition = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,canTreatCached)), ALL_BODY_PARTS, _configName]; + private _statement = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,treatment)), ALL_BODY_PARTS, _configName]; + + GVAR(actions) pushBack [_displayName, _category, _condition, _statement]; +} forEach configProperties [configFile >> QEGVAR(medical_treatment,actions), "isClass _x"]; + + +if ("ace_dragging" call EFUNC(common,isModLoaded)) then { + GVAR(actions) pushBack [ + localize ELSTRING(dragging,Drag), "drag", + {ACE_player != GVAR(target) && {[ACE_player, GVAR(target)] call EFUNC(dragging,canDrag)}}, + { + GVAR(pendingReopen) = false; + [ACE_player, GVAR(target)] call EFUNC(dragging,startDrag); + } + ]; + + GVAR(actions) pushBack [ + localize ELSTRING(dragging,Carry), "drag", + {ACE_player != GVAR(target) && {[ACE_player, GVAR(target)] call EFUNC(dragging,canCarry)}}, + { + GVAR(pendingReopen) = false; + [ACE_player, GVAR(target)] call EFUNC(dragging,startCarry); + } + ]; +}; diff --git a/addons/medical_gui/functions/fnc_damageToRGBA.sqf b/addons/medical_gui/functions/fnc_damageToRGBA.sqf new file mode 100644 index 00000000000..f487a332d15 --- /dev/null +++ b/addons/medical_gui/functions/fnc_damageToRGBA.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: ShackTac, SilentSpike + * Converts a damage value into a representative RGBA colour. + * Damage colouring follows a "white, cyan, blue" colour scale with 10 steps, Bezier interpolation and Correct lightness gradient. + * See: https://gka.github.io/palettes + * + * Arguments: + * 0: The damage value (range [0,1]) + * + * Return Value: + * Representative RGBA colour + * + * Example: + * [0.4] call ace_medical_gui_fnc_damageToRGBA + * + * Public: No + */ + +params ["_damage"]; + +private _frD = 0 max (_damage / DAMAGE_BLUE_THRESHOLD) min 1; +private _colorInt = ceil (_frD * (DAMAGE_TOTAL_COLORS - 1)); + +[ + [1.00, 1.00, 1.00, 1], // #ffffff + [0.75, 0.95, 1.00, 1], // #bff2ff + [0.63, 0.87, 1.00, 1], // #a0ddff + [0.54, 0.77, 1.00, 1], // #8ac4ff + [0.48, 0.67, 1.00, 1], // #7aacff + [0.42, 0.57, 1.00, 1], // #6c91ff + [0.37, 0.47, 1.00, 1], // #5e77ff + [0.31, 0.35, 1.00, 1], // #4e5aff + [0.22, 0.23, 1.00, 1], // #383bff + [0.00, 0.00, 1.00, 1] // #0000ff +] select _colorInt diff --git a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf new file mode 100644 index 00000000000..ac76d340125 --- /dev/null +++ b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Opens the patient information display for given target. + * + * Arguments: + * 0: Target + * 1: Body part + * + * Return Value: + * None + * + * Example: + * [_target, 0] call ace_medical_gui_fnc_displayPatientInformation + * + * Public: No + */ + +#define MAX_DISTANCE 4 + +params ["_target", "_selectionN"]; + +private _display = uiNamespace getVariable [QGVAR(RscPatientInfo), displayNull]; + +if (isNull _display) then { + QGVAR(RscPatientInfo) cutRsc [QGVAR(RscPatientInfo), "PLAIN", -1, false]; + _display = uiNamespace getVariable [QGVAR(RscPatientInfo), displayNull]; + + [{ + params ["_display", "_pfhID"]; + + if (isNull _display) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + + private _target = _display getVariable [QGVAR(target), objNull]; + private _selectionN = _display getVariable [QGVAR(selectionN), 0]; + + // Close display if target moved too far away (ignore if in same vehicle) + if (ACE_player distance _target > MAX_DISTANCE && {vehicle _target != vehicle ACE_player}) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + QGVAR(RscPatientInfo) cutFadeOut 0.3; + [[ELSTRING(medical,DistanceToFar), _target call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); + }; + + // Update body image + private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP; + [_ctrlBodyImage, _target] call FUNC(updateBodyImage); + + // Update injury list + private _ctrlInjuries = _display displayCtrl IDC_INJURIES; + [_ctrlInjuries, _target, _selectionN] call FUNC(updateInjuryList); + + // Update activity log + private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; + private _activityLog = _target getVariable [MED_LOG_VARNAME("activity"), []]; + [_ctrlActivityLog, _activityLog] call FUNC(updateLogList); + + // Update triage status + [_display, _target] call FUNC(updateTriageStatus); + }, 0, _display] call CBA_fnc_addPerFrameHandler; +}; + +_display setVariable [QGVAR(target), _target]; +_display setVariable [QGVAR(selectionN), _selectionN]; diff --git a/addons/medical_gui/functions/fnc_displayTriageCard.sqf b/addons/medical_gui/functions/fnc_displayTriageCard.sqf new file mode 100644 index 00000000000..3a7f8c4adfb --- /dev/null +++ b/addons/medical_gui/functions/fnc_displayTriageCard.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Displays the triage card for the target. + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [_target] call ace_medical_gui_fnc_displayTriageCard + * + * Public: No + */ + +params ["_target"]; + +createDialog QGVAR(RscTriageCard); +private _display = uiNamespace getVariable [QGVAR(RscTriageCard), displayNull]; + +// Set global target variable for triage buttons +GVAR(target) = _target; + +// Initially hide the triage select buttons +[_display] call FUNC(toggleTriageSelect); + +[{ + params ["_args", "_pfhID"]; + _args params ["_display", "_target"]; + + if (isNull _display) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + + // Update triage card + private _ctrlTriageCard = _display displayCtrl IDC_TRIAGE_CARD; + [_ctrlTriageCard, _target] call FUNC(updateTriageCard); + + // Update triage status + [_display, _target] call FUNC(updateTriageStatus); +}, 0, [_display, _target]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical_gui/functions/fnc_handleToggle.sqf b/addons/medical_gui/functions/fnc_handleToggle.sqf new file mode 100644 index 00000000000..c2634affdbe --- /dev/null +++ b/addons/medical_gui/functions/fnc_handleToggle.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles toggling of Medical Menu between the player and previous target. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_handleToggle + * + * Public: No + */ + +// Find new target to switch to +private _target = if ( + GVAR(target) == ACE_player + && {[ACE_player, GVAR(previousTarget)] call EFUNC(common,canInteractWith)} + && {[ACE_player, GVAR(previousTarget)] call FUNC(canOpenMenu)} +) then { + GVAR(previousTarget); +} else { + ACE_player; +}; + +// Exit if new target is same as old +if (GVAR(target) == _target) exitWith {}; +GVAR(previousTarget) = GVAR(target); + +// Close and reopen dialog for new target +closeDialog 0; +[FUNC(openMenu), _target, 0.1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_gui/functions/fnc_handleTriageSelect.sqf b/addons/medical_gui/functions/fnc_handleTriageSelect.sqf new file mode 100644 index 00000000000..31a25e18ee8 --- /dev/null +++ b/addons/medical_gui/functions/fnc_handleTriageSelect.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles clicking the triage select buttons. + * + * Arguments: + * 0: Display + * 1: Target + * 2: Triage status + * + * Return Value: + * None + * + * Example: + * [DISPLAY, _target, 0] call ace_medical_gui_fnc_handleTriageSelect + * + * Public: No + */ + +params ["_display", "_target", "_triageLevel"]; + +[_display] call FUNC(toggleTriageSelect); +[_target, _triageLevel] call EFUNC(medical_treatment,setTriageStatus); diff --git a/addons/medical_gui/functions/fnc_menuPFH.sqf b/addons/medical_gui/functions/fnc_menuPFH.sqf new file mode 100644 index 00000000000..c2dc7a277fe --- /dev/null +++ b/addons/medical_gui/functions/fnc_menuPFH.sqf @@ -0,0 +1,55 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles updating the Medical Menu UI for the current target. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_menuPFH + * + * Public: No + */ + +// Check if menu should stay open for target +if !([ACE_player, GVAR(target), ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith) && {[ACE_player, GVAR(target)] call FUNC(canOpenMenu)}) then { + closeDialog 0; + // Show hint if distance condition failed + if ((ACE_player distance GVAR(target) > GVAR(maxDistance)) && {vehicle ACE_player != vehicle GVAR(target)}) then { + [[ELSTRING(medical,DistanceToFar), GVAR(target) call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); + }; +}; + +// Get the Medical Menu display +private _display = uiNamespace getVariable [QGVAR(menuDisplay), displayNull]; +if (isNull _display) exitWith {}; + +// Update treatment category buttons +[_display] call FUNC(updateCategories); + +// Update treatment actions for current category +[_display] call FUNC(updateActions); + +// Update injury list +private _ctrlInjuries = _display displayCtrl IDC_INJURIES; +[_ctrlInjuries, GVAR(target), GVAR(selectedBodyPart)] call FUNC(updateInjuryList); + +// Update body image +private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP; +[_ctrlBodyImage, GVAR(target)] call FUNC(updateBodyImage); + +// Update activity and quick view logs +private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; +private _activityLog = GVAR(target) getVariable [MED_LOG_VARNAME("activity"), []]; +[_ctrlActivityLog, _activityLog] call FUNC(updateLogList); + +private _ctrlQuickView = _display displayCtrl IDC_QUICKVIEW; +private _quickView = GVAR(target) getVariable [MED_LOG_VARNAME("quick_view"), []]; +[_ctrlQuickView, _quickView] call FUNC(updateLogList); + +// Update triage status +[_display, GVAR(target)] call FUNC(updateTriageStatus); diff --git a/addons/medical_gui/functions/fnc_modifyAction.sqf b/addons/medical_gui/functions/fnc_modifyAction.sqf new file mode 100644 index 00000000000..422c73a4753 --- /dev/null +++ b/addons/medical_gui/functions/fnc_modifyAction.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +/* + * Author: esteldunedain, SilentSpike, mharis001 + * Modifies the medical action icons to show blood loss and tourniquets. + * + * Arguments: + * 0: Unit + * 1: Body part index + * 2: Action data + * + * Return Value: + * None + * + * Example: + * [_target, 0, _actionData] call ace_medical_gui_fnc_modifyAction + * + * Public: No + */ + +#define COLOR_SCALE ["#ffffff", "#fff1a1", "#ffe075", "#ffcb55", "#ffb73c", "#ffa127", "#ff8815", "#ff6d05", "#ff4b00", "#ff0000"] + +params ["_target", "_partIndex", "_actionData"]; + +private _bloodLossOnBodyPart = 0; + +// Add all bleeding from wounds on selection +{ + _x params ["", "_bodyPartN", "_amountOf", "_bleeding"]; + + if (_bodyPartN == _partIndex) then { + _bloodLossOnBodyPart = _bloodLossOnBodyPart + (_amountOf * _bleeding); + }; +} forEach GET_OPEN_WOUNDS(_target); + +private _frBL = 0 max (_bloodLossOnBodyPart / BLOOD_LOSS_RED_THRESHOLD) min 1; +private _colorInt = ceil (_frBL * (BLOOD_LOSS_TOTAL_COLORS - 1)); // ceil because any bleeding more than zero shouldn't be white + +if (HAS_TOURNIQUET_APPLIED_ON(_target,_partIndex)) then { + _actionData set [2, format [QPATHTOF(ui\cross_t_%1.paa), _colorInt]]; +} else { + _actionData set [2, [QPATHTOF(ui\cross.paa), COLOR_SCALE select _colorInt]]; +}; diff --git a/addons/medical_gui/functions/fnc_onMenuClose.sqf b/addons/medical_gui/functions/fnc_onMenuClose.sqf new file mode 100644 index 00000000000..a531eca4e80 --- /dev/null +++ b/addons/medical_gui/functions/fnc_onMenuClose.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: joko // Jonas + * Handles closing the Medical Menu. Called from onUnload event. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_onMenuClose + * + * Public: No + */ + +if (EGVAR(interact_menu,menuBackground) == 1) then {[QGVAR(id), false] call EFUNC(common,blurScreen)}; +if (EGVAR(interact_menu,menuBackground) == 2) then {(uiNamespace getVariable [QEGVAR(interact_menu,menuBackground), displayNull]) closeDisplay 0}; + +GVAR(pendingReopen) = false; +GVAR(menuPFH) call CBA_fnc_removePerFrameHandler; +GVAR(menuPFH) = -1; diff --git a/addons/medical_gui/functions/fnc_onMenuOpen.sqf b/addons/medical_gui/functions/fnc_onMenuOpen.sqf new file mode 100644 index 00000000000..b6c326f5901 --- /dev/null +++ b/addons/medical_gui/functions/fnc_onMenuOpen.sqf @@ -0,0 +1,73 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Handles opening the Medical Menu. Called from onLoad event. + * + * Arguments: + * 0: Medical Menu display + * + * Return Value: + * None + * + * Example: + * [DISPLAY] call ace_medical_gui_fnc_onMenuOpen + * + * Public: No + */ + +params ["_display"]; + +// Create background effects based on interact menu setting +if (EGVAR(interact_menu,menuBackground) == 1) then {[QGVAR(id), true] call EFUNC(common,blurScreen)}; +if (EGVAR(interact_menu,menuBackground) == 2) then {0 cutRsc [QEGVAR(interact_menu,menuBackground), "PLAIN", 1, false]}; + +// Fix mouse moving randomly +[{ + [{setMousePosition _this}, _this] call CBA_fnc_execNextFrame; +}, getMousePosition] call CBA_fnc_execNextFrame; + +// Set target name as title +private _ctrlTitle = _display displayCtrl IDC_TITLE; +_ctrlTitle ctrlSetText ([GVAR(target)] call EFUNC(common,getName)); + +// Initially hide the triage select buttons +[_display] call FUNC(toggleTriageSelect); + +// Store display and add PFH to update it +uiNamespace setVariable [QGVAR(menuDisplay), _display]; +["ace_medicalMenuOpened", [ACE_player, GVAR(target), _display]] call CBA_fnc_localEvent; + +if (GVAR(menuPFH) != -1) exitWith { + TRACE_1("Menu PFH already running",GVAR(menuPFH)); +}; + +GVAR(menuPFH) = [FUNC(menuPFH), 0, []] call CBA_fnc_addPerFrameHandler; + +// Hide categories if they don't have any actions (airway) +private _list = [ + [IDC_TRIAGE, true], + [IDC_EXAMINE, true], + [IDC_BANDAGE, "bandage"], + [IDC_MEDICATION, "medication"], + [IDC_AIRWAY, "airway"], + [IDC_ADVANCED, "advanced"], + [IDC_DRAG, "drag"], + [IDC_TOGGLE, true] +]; +private _countEnabled = { + _x params ["", "_category"]; + if (_category isEqualType "") then { _x set [1, (GVAR(actions) findIf {_category == _x select 1}) > -1]; }; + _x select 1 +} count _list; +private _offsetX = POS_X(1.5) + 0.5 * (POS_X(12) - POS_X(_countEnabled * 1.5)); +{ + _x params ["_idc", "_enabled"]; + private _ctrl = _display displayCtrl _idc; + if (_enabled) then { + _ctrl ctrlSetPositionX _offsetX; + _ctrl ctrlCommit 0; + _offsetX = _offsetX + POS_W(1.5); + } else { + _ctrl ctrlShow false; + }; +} forEach _list; diff --git a/addons/medical_gui/functions/fnc_openMenu.sqf b/addons/medical_gui/functions/fnc_openMenu.sqf new file mode 100644 index 00000000000..cd8f71274cc --- /dev/null +++ b/addons/medical_gui/functions/fnc_openMenu.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Opens the Medical Menu for given target. + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [ACE_player] call ace_medical_gui_fnc_openMenu + * + * Public: No + */ + +params ["_target"]; + +if (dialog || {isNull _target}) exitWith { + private _display = uiNamespace getVariable [QGVAR(menuDisplay), displayNull]; + if (!isNull _display) then {closeDialog 0}; +}; + +// Store current target +GVAR(target) = _target; + +// Create the menu display +createDialog "ACE_Medical_Menu"; +GVAR(lastOpenedOn) = CBA_missionTime; diff --git a/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf b/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf new file mode 100644 index 00000000000..11281692e31 --- /dev/null +++ b/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Toggles showing of the triage select buttons. + * + * Arguments: + * 0: Display + * + * Return Value: + * None + * + * Example: + * [DISPLAY] call ace_medical_gui_fnc_toggleTriageSelect + * + * Public: No + */ + +params ["_display"]; + +private _ctrlTriageSelect = _display displayCtrl IDC_TRIAGE_SELECT; +private _show = !ctrlShown _ctrlTriageSelect; + +_ctrlTriageSelect ctrlEnable _show; +_ctrlTriageSelect ctrlShow _show; diff --git a/addons/medical_gui/functions/fnc_updateActions.sqf b/addons/medical_gui/functions/fnc_updateActions.sqf new file mode 100644 index 00000000000..def2466009c --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateActions.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the action buttons based currently avaiable treatments. + * + * Arguments: + * 0: Medical Menu display + * + * Return Value: + * None + * + * Example: + * [_display] call ace_medical_gui_fnc_updateActions + * + * Public: No + */ + +params ["_display"]; + +private _selectedCategory = GVAR(selectedCategory); + +// Clear all action buttons +{ + private _ctrl = _display displayCtrl _x; + _ctrl ctrlRemoveAllEventHandlers "ButtonClick"; + _ctrl ctrlShow false; +} forEach IDCS_ACTION_BUTTONS; + +// Handle triage list (no actions shown) +private _ctrlTriage = _display displayCtrl IDC_TRIAGE_CARD; +private _showTriage = _selectedCategory == "triage"; +_ctrlTriage ctrlEnable _showTriage; + +lbClear _ctrlTriage; + +if (_showTriage) exitWith { + [_ctrlTriage, GVAR(target)] call FUNC(updateTriageCard); +}; + +// Show treatment options on action buttons +private _idcIndex = 0; + +{ + _x params ["_displayName", "_category", "_condition", "_statement"]; + + // Check action category and condition + if (_category == _selectedCategory && {call _condition}) then { + private _ctrl = _display displayCtrl (IDCS_ACTION_BUTTONS select _idcIndex); + _ctrl ctrlSetText _displayName; + _ctrl ctrlShow true; + + _ctrl ctrlAddEventHandler ["ButtonClick", _statement]; + _ctrl ctrlAddEventHandler ["ButtonClick", {GVAR(pendingReopen) = true}]; + + _idcIndex = _idcIndex + 1; + }; +} forEach GVAR(actions); diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf new file mode 100644 index 00000000000..c522f95a637 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf @@ -0,0 +1,82 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, SilentSpike, mharis001 + * Updates the body image for given target. + * + * Arguments: + * 0: Body image controls group + * 1: Target + * + * Return Value: + * None + * + * Example: + * [CONTROL, _target] call ace_medical_gui_fnc_updateBodyImage + * + * Public: No + */ + +params ["_ctrlGroup", "_target"]; + +// Get tourniquets, damage, and blood loss for target +private _tourniquets = GET_TOURNIQUETS(_target); +private _fractures = GET_FRACTURES(_target); +private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0]]; +private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; + +{ + _x params ["", "_bodyPartN", "_amountOf", "_bleeding"]; + _bodyPartBloodLoss set [_bodyPartN, (_bodyPartBloodLoss select _bodyPartN) + (_bleeding * _amountOf)]; +} forEach GET_OPEN_WOUNDS(_target); + +{ + _x params ["_bodyPartIDC", ["_tourniquetIDC", -1], ["_fractureIDC", -1]]; + + // Show or hide the tourniquet icon + if (_tourniquetIDC != -1) then { + private _hasTourniquet = _tourniquets select _forEachIndex > 0; + private _ctrlTourniquet = _ctrlGroup controlsGroupCtrl _tourniquetIDC; + _ctrlTourniquet ctrlShow _hasTourniquet; + }; + + // Show or hide fractrue/bones + if (_fractureIDC != -1) then { + private _ctrlBone = _ctrlGroup controlsGroupCtrl _fractureIDC; + switch (_fractures select _forEachIndex) do { + case 0: { + _ctrlBone ctrlShow false; + }; + case 1: { + _ctrlBone ctrlShow true; + _ctrlBone ctrlSetTextColor [1, 0, 0, 1]; + }; + case -1: { + if (EGVAR(medical,fractures) == 2) then { + _ctrlBone ctrlShow true; + _ctrlBone ctrlSetTextColor [0, 0, 1, 1]; + } else { + _ctrlBone ctrlShow false; + }; + }; + }; + }; + + // Update body part color based on blood loss and damage + private _bloodLoss = _bodyPartBloodLoss select _forEachIndex; + private _bodyPartColor = if (_bloodLoss > 0) then { + [_bloodLoss] call FUNC(bloodLossToRGBA); + } else { + private _damage = _bodyPartDamage select _forEachIndex; + [_damage] call FUNC(damageToRGBA); + }; + + private _ctrlBodyPart = _ctrlGroup controlsGroupCtrl _bodyPartIDC; + _ctrlBodyPart ctrlSetTextColor _bodyPartColor; +} forEach [ + [IDC_BODY_HEAD], + [IDC_BODY_TORSO], + [IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_T, IDC_BODY_ARMLEFT_B], + [IDC_BODY_ARMRIGHT, IDC_BODY_ARMRIGHT_T, IDC_BODY_ARMRIGHT_B], + [IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_T, IDC_BODY_LEGLEFT_B], + [IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_T, IDC_BODY_LEGRIGHT_B] +]; diff --git a/addons/medical_gui/functions/fnc_updateCategories.sqf b/addons/medical_gui/functions/fnc_updateCategories.sqf new file mode 100644 index 00000000000..ac1c068fb77 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateCategories.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the category buttons based currently avaiable treatments. + * + * Arguments: + * 0: Medical Menu display + * + * Return Value: + * None + * + * Example: + * [_display] call ace_medical_gui_fnc_updateCategories + * + * Public: No + */ + +params ["_display"]; + +{ + _x params ["_idc", "_category"]; + + private _ctrl = _display displayCtrl _idc; + private _enable = GVAR(actions) findIf {_category == _x select 1 && {call (_x select 2)}} > -1; + _ctrl ctrlEnable _enable; + + private _color = [[0.4, 0.4, 0.4, 1], [1, 1, 1, 1]] select _enable; + _ctrl ctrlSetTextColor _color; +} forEach [ + [IDC_EXAMINE, "examine"], + [IDC_BANDAGE, "bandage"], + [IDC_MEDICATION, "medication"], + [IDC_AIRWAY, "airway"], + [IDC_ADVANCED, "advanced"], + [IDC_DRAG, "drag"] +]; diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf new file mode 100644 index 00000000000..ef186242544 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf @@ -0,0 +1,152 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates injury list for given body part for the target. + * + * Arguments: + * 0: Injury list + * 1: Target + * 2: Body part + * + * Return Value: + * None + * + * Example: + * [_ctrlInjuries, _target, 0] call ace_medical_gui_fnc_updateInjuryList + * + * Public: No + */ + +params ["_ctrl", "_target", "_selectionN"]; + +private _entries = []; + +// Add selected body part name +private _bodyPartName = [ + LSTRING(Head), + LSTRING(Torso), + LSTRING(LeftArm), + LSTRING(RightArm), + LSTRING(LeftLeg), + LSTRING(RightLeg) +] select _selectionN; + +_entries pushBack [localize _bodyPartName, [1, 1, 1, 1]]; + +// Indicate if unit is bleeding at all +if (IS_BLEEDING(_target)) then { + _entries pushBack [localize LSTRING(Status_Bleeding), [1, 0, 0, 1]]; +}; + +// Give a qualitative description of the blood volume lost +switch (GET_HEMORRHAGE(_target)) do { + case 1: { + _entries pushBack [localize LSTRING(Lost_Blood1), [1, 0, 0, 1]]; + }; + case 2: { + _entries pushBack [localize LSTRING(Lost_Blood2), [1, 0, 0, 1]]; + }; + case 3: { + _entries pushBack [localize LSTRING(Lost_Blood3), [1, 0, 0, 1]]; + }; + case 4: { + _entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]]; + }; +}; + +// Indicate if a tourniquet is applied +if (HAS_TOURNIQUET_APPLIED_ON(_target,_selectionN)) then { + _entries pushBack [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; +}; + +// Indicate current body part fracture status +switch (GET_FRACTURES(_target) select _selectionN) do { + case 1: { + _entries pushBack [localize LSTRING(Status_Fractured), [1, 0, 0, 1]]; + }; + case -1: { + if (EGVAR(medical,fractures) == 2) then { // Ignore if the splint has no effect + _entries pushBack [localize LSTRING(Status_SplintApplied), [1, 1, 1, 1]]; + }; + }; +}; + +// Indicate the amount of pain the unit is in +if (_target call EFUNC(common,isAwake)) then { + private _pain = GET_PAIN_PERCEIVED(_target); + if (_pain > 0) then { + private _painText = switch (true) do { + case (_pain > 0.5): { + ELSTRING(medical_treatment,Status_SeverePain); + }; + case (_pain > 0.1): { + ELSTRING(medical_treatment,Status_Pain); + }; + default { + ELSTRING(medical_treatment,Status_MildPain); + }; + }; + _entries pushBack [localize _painText, [1, 1, 1, 1]]; + }; +}; + +// Show receiving IV volume remaining +private _totalIvVolume = 0; +{ + _x params ["_volumeRemaining"]; + _totalIvVolume = _totalIvVolume + _volumeRemaining; +} forEach (_target getVariable [QEGVAR(medical,ivBags), []]); + +if (_totalIvVolume >= 1) then { + _entries pushBack [format [localize ELSTRING(medical_treatment,receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; +}; + +// Add entries for open, bandaged, and stitched wounds +private _woundEntries = []; + +private _fnc_processWounds = { + params ["_wounds", "_format", "_color"]; + + { + _x params ["_woundClassID", "_bodyPartN", "_amountOf"]; + + if (_selectionN == _bodyPartN && {_amountOf > 0}) then { + private _classIndex = _woundClassID / 10; + private _category = _woundClassID % 10; + + private _className = EGVAR(medical_damage,woundsData) select _classIndex select 6; + private _suffix = ["Minor", "Medium", "Large"] select _category; + private _woundName = localize format [ELSTRING(medical_damage,%1_%2), _className, _suffix]; + + private _woundDescription = if (_amountOf >= 1) then { + format ["%1x %2", ceil _amountOf, _woundName] + } else { + format [localize LSTRING(PartialX), _woundName] + }; + + _woundEntries pushBack [format [_format, _woundDescription], _color]; + }; + } forEach _wounds; +}; + +[GET_OPEN_WOUNDS(_target), "%1", [1, 1, 1, 1]] call _fnc_processWounds; +[GET_BANDAGED_WOUNDS(_target), "[B] %1", [0.88, 0.7, 0.65, 1]] call _fnc_processWounds; +[GET_STITCHED_WOUNDS(_target), "[S] %1", [0.7, 0.7, 0.7, 1]] call _fnc_processWounds; + +// Handle no wound entries +if (_woundEntries isEqualTo []) then { + _entries pushBack [localize ELSTRING(medical_treatment,NoInjuriesBodypart), [1, 1, 1, 1]]; +} else { + _entries append _woundEntries; +}; + +// Add all entries to injury list +lbClear _ctrl; + +{ + _x params ["_text", "_color"]; + + _ctrl lbSetColor [_ctrl lbAdd _text, _color]; +} forEach _entries; + +_ctrl lbSetCurSel -1; diff --git a/addons/medical_gui/functions/fnc_updateLogList.sqf b/addons/medical_gui/functions/fnc_updateLogList.sqf new file mode 100644 index 00000000000..fb836406989 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateLogList.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates list control with given logs. + * + * Arguments: + * 0: Log list + * 1: Log to add + * + * Return Value: + * None + * + * Example: + * [_ctrlActivityLog, _activityLog] call ace_medical_gui_fnc_updateLogList + * + * Public: No + */ + +params ["_ctrl", "_logs"]; + +lbClear _ctrl; + +{ + _x params ["_message", "_timeStamp", "_arguments"]; + + // Localize message and arguments + if (isLocalized _message) then { + _message = localize _message; + }; + + _arguments = _arguments apply {if (_x isEqualType "" && {isLocalized _x}) then {localize _x} else {_x}}; + + // Format message with arguments + _message = format ([_message] + _arguments); + + _ctrl lbAdd format ["%1 %2", _timeStamp, _message]; +} forEach _logs; diff --git a/addons/medical_gui/functions/fnc_updateTriageCard.sqf b/addons/medical_gui/functions/fnc_updateTriageCard.sqf new file mode 100644 index 00000000000..b4e1977d423 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateTriageCard.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the triage card for the given target. + * + * Arguments: + * 0: Triage list + * 1: Target + * + * Return Value: + * None + * + * Example: + * [_ctrlTriage, _target] call ace_medical_gui_fnc_updateTriageCard + * + * Public: No + */ + +params ["_ctrl", "_target"]; + +private _triageCard = _target getVariable [QEGVAR(medical,triageCard), []]; +lbClear _ctrl; + +{ + _x params ["_item", "_amount", "_time"]; + + // Check for item displayName or localized text + if (isClass (configFile >> "CfgWeapons" >> _item)) then { + _item = getText (configFile >> "CfgWeapons" >> _item >> "displayName"); + } else { + if (isLocalized _item) then { + _item = localize _item; + }; + }; + + // Convert time to minutes ago + _time = round ((CBA_missionTime - _time) / 60); + + _ctrl lbAdd format ["%1x - %2 (%3m)", _amount, _item, _time]; +} forEach _triageCard; + +// Handle no triage card entries +if (lbSize _ctrl == 0) then { + _ctrl lbAdd localize ELSTRING(medical_treatment,TriageCard_NoEntry); +}; diff --git a/addons/medical_gui/functions/fnc_updateTriageStatus.sqf b/addons/medical_gui/functions/fnc_updateTriageStatus.sqf new file mode 100644 index 00000000000..9a50e4f6c04 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateTriageStatus.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the triage status control for the given target. + * + * Arguments: + * 0: Display + * 1: Target + * + * Return Value: + * None + * + * Example: + * [_display, _target] call ace_medical_gui_fnc_updateTriageStatus + * + * Public: No + */ + +params ["_display", "_target"]; + +private _triageStatus = [_target] call EFUNC(medical_treatment,getTriageStatus); +_triageStatus params ["", "_triageText", "_triageColor", "_triageTextColor"]; + +private _ctrlTriage = _display displayCtrl IDC_TRIAGE_STATUS; +_ctrlTriage ctrlSetText _triageText; +_ctrlTriage ctrlSetBackgroundColor _triageColor; +_ctrlTriage ctrlSetTextColor _triageTextColor; diff --git a/addons/medical_gui/functions/script_component.hpp b/addons/medical_gui/functions/script_component.hpp new file mode 100644 index 00000000000..d2302a99203 --- /dev/null +++ b/addons/medical_gui/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_gui\script_component.hpp" diff --git a/addons/medical_gui/gui.hpp b/addons/medical_gui/gui.hpp new file mode 100644 index 00000000000..6aa6c7d3541 --- /dev/null +++ b/addons/medical_gui/gui.hpp @@ -0,0 +1,657 @@ +class RscText; +class RscButton; +class RscPicture; +class RscListBox; +class RscActivePicture; +class RscButtonMenu; +class RscControlsGroupNoScrollbars; + +class GVAR(BodyImage): RscControlsGroupNoScrollbars { + idc = IDC_BODY_GROUP; + x = POS_X(13.33); + y = POS_Y(2.73); + w = POS_W(12.33); + h = POS_H(12.33); + class controls { + class Background: RscPicture { + idc = -1; + text = QPATHTOF(data\body_image\background.paa); + x = 0; + y = 0; + w = POS_W(12.33); + h = POS_H(12.33); + }; + class Head: Background { + idc = IDC_BODY_HEAD; + text = QPATHTOF(data\body_image\head.paa); + }; + class Torso: Background { + idc = IDC_BODY_TORSO; + text = QPATHTOF(data\body_image\torso.paa); + }; + class ArmLeft: Background { + idc = IDC_BODY_ARMLEFT; + text = QPATHTOF(data\body_image\arm_left.paa); + }; + class ArmRight: Background { + idc = IDC_BODY_ARMRIGHT; + text = QPATHTOF(data\body_image\arm_right.paa); + }; + class LegLeft: Background { + idc = IDC_BODY_LEGLEFT; + text = QPATHTOF(data\body_image\leg_left.paa); + }; + class LegRight: Background { + idc = IDC_BODY_LEGRIGHT; + text = QPATHTOF(data\body_image\leg_right.paa); + }; + class ArmLeftB: Background { + idc = IDC_BODY_ARMLEFT_B; + text = QPATHTOF(data\body_image\arm_left_b.paa); + colorText[] = {0, 0, 0.8, 1}; + show = 0; + }; + class ArmRightB: ArmLeftB { + idc = IDC_BODY_ARMRIGHT_B; + text = QPATHTOF(data\body_image\arm_right_b.paa); + }; + class LegLeftB: ArmLeftB { + idc = IDC_BODY_LEGLEFT_B; + text = QPATHTOF(data\body_image\leg_left_b.paa); + }; + class LegRightB: ArmLeftB { + idc = IDC_BODY_LEGRIGHT_B; + text = QPATHTOF(data\body_image\leg_right_b.paa); + }; + class ArmLeftT: Background { + idc = IDC_BODY_ARMLEFT_T; + text = QPATHTOF(data\body_image\arm_left_t.paa); + colorText[] = {0, 0, 0.8, 1}; + show = 0; + }; + class ArmRightT: ArmLeftT { + idc = IDC_BODY_ARMRIGHT_T; + text = QPATHTOF(data\body_image\arm_right_t.paa); + }; + class LegLeftT: ArmLeftT { + idc = IDC_BODY_LEGLEFT_T; + text = QPATHTOF(data\body_image\leg_left_t.paa); + }; + class LegRightT: ArmLeftT { + idc = IDC_BODY_LEGRIGHT_T; + text = QPATHTOF(data\body_image\leg_right_t.paa); + }; + }; +}; + +class GVAR(TriageToggle): RscButton { + idc = -1; + onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(toggleTriageSelect)); + x = POS_X(13.33); + y = POS_Y(15.5); + w = POS_W(12.33); + h = POS_H(1.1); + colorFocused[] = {0, 0, 0, 0}; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {0, 0, 0, 0}; +}; + +class GVAR(TriageSelect): RscControlsGroupNoScrollbars { + idc = IDC_TRIAGE_SELECT; + x = POS_X(13.33); + y = POS_Y(16.6); + w = POS_W(12.33); + h = POS_H(5.5); + class controls { + class None: RscButton { + idc = -1; + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),0)] call FUNC(handleTriageSelect)); + style = ST_CENTER; + text = ECSTRING(medical_treatment,Triage_Status_None); + x = 0; + y = 0; + w = POS_W(12.33); + h = POS_H(1.1); + shadow = 0; + colorText[] = {TRIAGE_TEXT_COLOR_NONE}; + colorFocused[] = {TRIAGE_COLOR_NONE}; + colorBackground[] = {TRIAGE_COLOR_NONE}; + colorBackgroundActive[] = {TRIAGE_COLOR_NONE}; + }; + class Minimal: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),1)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Minimal); + y = POS_H(1.1); + colorText[] = {TRIAGE_TEXT_COLOR_MINIMAL}; + colorFocused[] = {TRIAGE_COLOR_MINIMAL}; + colorBackground[] = {TRIAGE_COLOR_MINIMAL}; + colorBackgroundActive[] = {TRIAGE_COLOR_MINIMAL}; + }; + class Delayed: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),2)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Delayed); + y = POS_H(2.2); + colorText[] = {TRIAGE_TEXT_COLOR_DELAYED}; + colorFocused[] = {TRIAGE_COLOR_DELAYED}; + colorBackground[] = {TRIAGE_COLOR_DELAYED}; + colorBackgroundActive[] = {TRIAGE_COLOR_DELAYED}; + }; + class Immediate: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),3)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Immediate); + y = POS_H(3.3); + colorText[] = {TRIAGE_TEXT_COLOR_IMMEDIATE}; + colorFocused[] = {TRIAGE_COLOR_IMMEDIATE}; + colorBackground[] = {TRIAGE_COLOR_IMMEDIATE}; + colorBackgroundActive[] = {TRIAGE_COLOR_IMMEDIATE}; + }; + class Deceased: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),4)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Deceased); + y = POS_H(4.4); + colorText[] = {TRIAGE_TEXT_COLOR_DECEASED}; + colorFocused[] = {TRIAGE_COLOR_DECEASED}; + colorBackground[] = {TRIAGE_COLOR_DECEASED}; + colorBackgroundActive[] = {TRIAGE_COLOR_DECEASED}; + }; + }; +}; + +class ACE_Medical_Menu { + idd = IDD_MEDICAL_MENU; + movingEnable = 1; + enableSimulation = 1; + onLoad = QUOTE(_this call FUNC(onMenuOpen)); + onUnload = QUOTE(_this call FUNC(onMenuClose)); + class controlsBackground { + class Title: RscText { + idc = IDC_TITLE; + x = POS_X(1); + y = POS_Y(0); + w = POS_W(38); + h = POS_H(1); + colorBackground[] = GUI_BCG_COLOR; + moving = 1; + }; + class Center: RscText { + idc = -1; + x = POS_X(1); + y = POS_Y(1.1); + w = POS_W(38); + h = POS_H(16); + colorBackground[] = {0, 0, 0, 0.7}; + }; + class Bottom: Center { + y = POS_Y(17.6); + h = POS_H(9); + }; + }; + class controls { + class TreatmentHeader: RscText { + idc = -1; + style = ST_CENTER; + text = CSTRING(EXAMINE_TREATMENT); + x = POS_X(1); + y = POS_Y(1.5); + w = POS_W(12.33); + h = POS_H(1); + sizeEx = POS_H(1.2); + colorText[] = {1, 1, 1, 0.9}; + }; + class StatusHeader: TreatmentHeader { + text = CSTRING(STATUS); + x = POS_X(13.33); + }; + class OverviewHeader: TreatmentHeader { + text = CSTRING(OVERVIEW); + x = POS_X(25.66); + }; + class HeaderLine: RscText { + idc = -1; + x = POS_X(1.5); + y = POS_Y(2.6); + w = POS_W(37); + h = POS_H(0.03); + colorBackground[] = {1, 1, 1, 0.5}; + }; + class Triage: RscActivePicture { + idc = IDC_TRIAGE; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'triage'); + text = QPATHTOF(data\categories\triage_card.paa); + tooltip = CSTRING(ViewTriageCard); + x = POS_X(1.5); + y = POS_Y(2.73); + w = POS_W(1.5); + h = POS_H(1.5); + color[] = {1, 1, 1, 1}; + soundClick[] = {"\a3\ui_f\data\sound\rscbutton\soundClick", 0.09, 1}; + soundEnter[] = {"\a3\ui_f\data\sound\rscbutton\soundEnter", 0.09, 1}; + soundEscape[] = {"\a3\ui_f\data\sound\rscbutton\soundEscape", 0.09, 1}; + soundPush[] = {"\a3\ui_f\data\sound\rscbutton\soundPush", 0.09, 1}; + }; + class Examine: Triage { + idc = IDC_EXAMINE; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'examine'); + text = QPATHTOF(data\categories\examine_patient.paa); + tooltip = CSTRING(ExaminePatient); + x = POS_X(3); + }; + class Bandage: Triage { + idc = IDC_BANDAGE; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'bandage'); + text = QPATHTOF(data\categories\bandage_fracture.paa); + tooltip = CSTRING(BandageFractures); + x = POS_X(4.5); + }; + class Medication: Triage { + idc = IDC_MEDICATION; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'medication'); + text = QPATHTOF(data\categories\medication.paa); + tooltip = CSTRING(Medication); + x = POS_X(6); + }; + class Airway: Triage { + idc = IDC_AIRWAY; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'airway'); + text = QPATHTOF(data\categories\airway_management.paa); + tooltip = CSTRING(AirwayManagement); + x = POS_X(7.5); + }; + class Advanced: Triage { + idc = IDC_ADVANCED; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'advanced'); + text = QPATHTOF(data\categories\advanced_treatment.paa); + tooltip = CSTRING(AdvancedTreatment); + x = POS_X(9); + }; + class Drag: Triage { + idc = IDC_DRAG; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'drag'); + text = QPATHTOF(data\categories\carry.paa); + tooltip = CSTRING(DragCarry); + x = POS_X(10.5); + }; + class Toggle: Triage { + idc = IDC_TOGGLE; + onButtonClick = QUOTE(call FUNC(handleToggle)); + text = QPATHTOF(data\categories\toggle_self.paa); + tooltip = CSTRING(ToggleSelf); + x = POS_X(12); + }; + class TriageCard: RscListBox { + idc = IDC_TRIAGE_CARD; + x = POS_X(1.5); + y = POS_Y(4.4); + w = POS_W(12); + h = POS_H(10); + sizeEx = POS_H(0.7); + colorSelect[] = {1, 1, 1, 1}; + colorSelect2[] = {1, 1, 1, 1}; + colorBackground[] = {0, 0, 0, 0.2}; + colorSelectBackground[] = {0, 0, 0, 0}; + colorSelectBackground2[] = {0, 0, 0, 0}; + colorScrollbar[] = {0.9, 0.9, 0.9, 1}; + }; + class Action1: RscButtonMenu { + idc = IDC_ACTION_1; + style = ST_LEFT; + x = POS_X(1.5); + y = POS_Y(4.4); + w = POS_W(12); + h = POS_H(1); + size = POS_H(0.9); + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + class Action2: Action1 { + idc = IDC_ACTION_2; + y = POS_Y(5.5); + }; + class Action3: Action1 { + idc = IDC_ACTION_3; + y = POS_Y(6.6); + }; + class Action4: Action1 { + idc = IDC_ACTION_4; + y = POS_Y(7.7); + }; + class Action5: Action1 { + idc = IDC_ACTION_5; + y = POS_Y(8.8); + }; + class Action6: Action1 { + idc = IDC_ACTION_6; + y = POS_Y(9.9); + }; + class Action7: Action1 { + idc = IDC_ACTION_7; + y = POS_Y(11); + }; + class Action8: Action1 { + idc = IDC_ACTION_8; + y = POS_Y(12.1); + }; + class Action9: Action1 { + idc = IDC_ACTION_9; + y = POS_Y(13.2); + }; + class BodyImage: GVAR(BodyImage) {}; + class SelectHead: RscButton { + idc = -1; + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 0); + tooltip = CSTRING(SelectHead); + x = POS_X(18.8); + y = POS_Y(3.2); + w = POS_W(1.4); + h = POS_H(1.8); + colorFocused[] = {0, 0, 0, 0}; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {0, 0, 0, 0}; + }; + class SelectTorso: SelectHead { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 1); + tooltip = CSTRING(SelectTorso); + x = POS_X(18.4); + y = POS_Y(5); + w = POS_W(2.2); + h = POS_H(3.8); + }; + class SelectArmLeft: SelectHead { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 2); + tooltip = CSTRING(SelectLeftArm); + x = POS_X(20.6); + y = POS_Y(5.1); + w = POS_W(1.1); + h = POS_H(4.6); + }; + class SelectArmRight: SelectArmLeft { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 3); + tooltip = CSTRING(SelectRightArm); + x = POS_X(17.4); + }; + class SelectLegLeft: SelectHead { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 4); + tooltip = CSTRING(SelectLeftLeg); + x = POS_X(19.5); + y = POS_Y(8.8); + w = POS_W(1.1); + h = POS_H(5.8); + }; + class SelectLegRight: SelectLegLeft { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 5); + tooltip = CSTRING(SelectRightLeg); + x = POS_X(18.4); + }; + class Injuries: TriageCard { + idc = IDC_INJURIES; + x = POS_X(25.66); + w = POS_W(12.33); + }; + class ActivityHeader: TreatmentHeader { + text = CSTRING(ACTIVITY_LOG); + y = POS_Y(17.6); + w = POS_W(18.5); + sizeEx = POS_H(1); + colorText[] = {0.6, 0.7, 1, 1}; + }; + class QuickViewHeader: ActivityHeader { + text = CSTRING(QUICK_VIEW); + x = POS_X(19.5); + }; + class LowerLine: HeaderLine { + y = POS_Y(18.5); + }; + class Activity: Injuries { + idc = IDC_ACTIVITY; + x = POS_X(1.5); + y = POS_Y(18.5); + w = POS_W(18.5); + h = POS_H(6.5); + colorBackground[] = {0, 0, 0, 0}; + }; + class QuickView: Activity { + idc = IDC_QUICKVIEW; + x = POS_X(21.5); + }; + class TriageStatus: RscText { + idc = IDC_TRIAGE_STATUS; + style = ST_CENTER; + x = POS_X(13.33); + y = POS_Y(15.5); + w = POS_W(12.33); + h = POS_H(1.1); + shadow = 0; + }; + class TriageToggle: GVAR(TriageToggle) {}; + class TriageSelect: GVAR(TriageSelect) {}; + }; +}; + +class GVAR(RscTriageCard) { + idd = -1; + movingEnable = 1; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(RscTriageCard), _this select 0)]); + class controls { + class Background: RscText { + idc = -1; + x = POS_X(12.5); + y = POS_Y(0); + w = POS_W(15); + h = POS_H(19); + colorBackground[] = {1, 1, 1, 1}; + moving = 1; + }; + class CornerLeft: RscPicture { + idc = -1; + text = QPATHTOF(data\triage_card\corner_left.paa); + x = POS_X(12.5); + y = POS_Y(0); + w = POS_W(5); + h = POS_H(5); + colorText[] = {1, 1, 0, 1}; + }; + class CornerRight: CornerLeft { + text = QPATHTOF(data\triage_card\corner_right.paa); + x = POS_X(22.5); + }; + class Title: RscText { + idc = -1; + style = ST_CENTER; + text = CSTRING(Actions_TriageCard); + x = POS_X(12.5); + y = POS_Y(3); + w = POS_W(15); + h = POS_H(0.9); + sizeEx = POS_H(0.9); + shadow = 0; + colorText[] = {0, 0, 0, 1}; + }; + class TriageCard: RscListBox { + idc = IDC_TRIAGE_CARD; + x = POS_X(13.5); + y = POS_Y(5); + w = POS_W(13); + h = POS_H(13); + sizeEx = POS_H(0.7); + colorText[] = {0, 0, 0, 1}; + colorSelect[] = {0, 0, 0, 1}; + colorSelect2[] = {0, 0, 0, 1}; + colorBackground[] = {0, 0, 0, 0}; + colorSelectBackground[] = {0, 0, 0, 0}; + colorSelectBackground2[] = {0, 0, 0, 0}; + colorScrollbar[] = {0, 0, 0, 1}; + }; + class TriageStatus: RscText { + idc = IDC_TRIAGE_STATUS; + style = ST_CENTER; + x = POS_X(12.5); + y = POS_Y(19); + w = POS_W(15); + h = POS_H(1.1); + shadow = 0; + }; + class TriageToggle: GVAR(TriageToggle) { + x = POS_X(12.5); + y = POS_Y(19); + w = POS_W(15); + }; + class TriageSelect: GVAR(TriageSelect) { + x = POS_X(12.5); + y = POS_Y(20); + w = POS_W(15); + class controls: controls { + class None: None { + w = POS_W(15); + }; + class Minimal: Minimal { + w = POS_W(15); + }; + class Delayed: Delayed { + w = POS_W(15); + }; + class Immediate: Immediate { + w = POS_W(15); + }; + class Deceased: Deceased { + w = POS_W(15); + }; + }; + }; + }; +}; + +class RscTitles { + class GVAR(RscPatientInfo) { + idd = -1; + fadeIn = 0.3; + fadeOut = 0.3; + duration = 999999; + movingEnable = 0; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(RscPatientInfo), _this select 0)]); + class controls { + class PatientInfoContainer: RscControlsGroupNoScrollbars { + idc = -1; + x = safeZoneX + PATIENT_INFO_IGUI_OFFSET_X; + y = safeZoneY + PATIENT_INFO_IGUI_OFFSET_Y; + w = safeZoneW; + h = safeZoneH; + class controls { + class BodyImage: GVAR(BodyImage) { + x = POS_W(2.25); + y = POS_H(1.5); + w = POS_W(8.5); + h = POS_H(8.5); + class controls: controls { + class Background: Background { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class Head: Head { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class Torso: Torso { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmLeft: ArmLeft { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmRight: ArmRight { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegLeft: LegLeft { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegRight: LegRight { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmLeftB: ArmLeftB { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmRightB: ArmRightB { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegLeftB: LegLeftB { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegRightB: LegRightB { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmLeftT: ArmLeftT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmRightT: ArmRightT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegLeftT: LegLeftT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegRightT: LegRightT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + }; + }; + class InjuriesLabel: RscText { + idc = -1; + text = CSTRING(INJURIES); + x = POS_W(2); + y = POS_H(10.2); + w = POS_W(9); + h = POS_H(0.7); + sizeEx = POS_H(0.7); + colorBackground[] = GUI_BCG_COLOR; + }; + class Injuries: RscListBox { + idc = IDC_INJURIES; + x = POS_W(2); + y = POS_H(11); + w = POS_W(9); + h = POS_H(9); + sizeEx = POS_H(0.7); + colorSelect[] = {1, 1, 1, 1}; + colorSelect2[] = {1, 1, 1, 1}; + colorBackground[] = {0, 0, 0, 0.2}; + colorSelectBackground[] = {0, 0, 0, 0}; + colorSelectBackground2[] = {0, 0, 0, 0}; + colorScrollbar[] = {0.9, 0.9, 0.9, 1}; + }; + class TriageStatus: RscText { + idc = IDC_TRIAGE_STATUS; + x = POS_W(2); + y = POS_H(20.2); + w = POS_W(9); + h = POS_H(0.7); + sizeEx = POS_H(0.7); + shadow = 0; + }; + class Activity: Injuries { + idc = IDC_ACTIVITY; + x = POS_W(1.75); + y = POS_H(21); + w = POS_W(15); + h = POS_H(7); + shadow = 2; + colorBackground[] = {0, 0, 0, 0}; + }; + }; + }; + }; + }; +}; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf new file mode 100644 index 00000000000..be7dc60fa65 --- /dev/null +++ b/addons/medical_gui/initSettings.sqf @@ -0,0 +1,44 @@ +[ + QGVAR(enableActions), + "LIST", + [LSTRING(EnableActions_DisplayName), LSTRING(EnableActions_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [[0, 1, 2], [LSTRING(Selections3D), LSTRING(Radial), ELSTRING(common,Disabled)], 0], + false +] call CBA_settings_fnc_init; + +[ + QGVAR(enableSelfActions), + "CHECKBOX", + [LSTRING(EnableSelfActions_DisplayName), LSTRING(EnableSelfActions_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(enableMedicalMenu), + "LIST", + [LSTRING(EnableMedicalMenu_DisplayName), LSTRING(EnableMedicalMenu_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), ELSTRING(common,VehiclesOnly)], 1], + false +] call CBA_settings_fnc_init; + +[ + QGVAR(openAfterTreatment), + "CHECKBOX", + [LSTRING(OpenAfterTreatment_DisplayName), LSTRING(OpenAfterTreatment_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(maxDistance), + "SLIDER", + [LSTRING(MaxDistance_DisplayName), LSTRING(MaxDistance_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [0, 10, 3, 1], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp new file mode 100644 index 00000000000..48382ed6fa0 --- /dev/null +++ b/addons/medical_gui/script_component.hpp @@ -0,0 +1,83 @@ +#define COMPONENT medical_gui +#define COMPONENT_BEAUTIFIED Medical GUI +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_GUI + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_GUI + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_GUI +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" + +#include "\a3\ui_f\hpp\defineResincl.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineCommonGrids.inc" +#include "\a3\ui_f\hpp\defineCommonColors.inc" + +#define POS_X(N) ((N) * GUI_GRID_W + GUI_GRID_CENTER_X) +#define POS_Y(N) ((N) * GUI_GRID_H + GUI_GRID_CENTER_Y) +#define POS_W(N) ((N) * GUI_GRID_W) +#define POS_H(N) ((N) * GUI_GRID_H) + +#define PATIENT_INFO_IGUI_BASE_X (safeZoneX + POS_W(2)) +#define PATIENT_INFO_IGUI_BASE_Y (safeZoneY + POS_H(1)) +#define PATIENT_INFO_IGUI_X (profilenamespace getVariable ['TRIPLES(IGUI,GVAR(patientInfo),X)', 0]) +#define PATIENT_INFO_IGUI_Y (profilenamespace getVariable ['TRIPLES(IGUI,GVAR(patientInfo),Y)', 0]) +#define PATIENT_INFO_IGUI_OFFSET_X (PATIENT_INFO_IGUI_X - PATIENT_INFO_IGUI_BASE_X) +#define PATIENT_INFO_IGUI_OFFSET_Y (PATIENT_INFO_IGUI_Y - PATIENT_INFO_IGUI_BASE_Y) + +#define IDD_MEDICAL_MENU 38580 + +#define IDC_TITLE 1200 +#define IDC_TRIAGE 1300 +#define IDC_EXAMINE 1310 +#define IDC_BANDAGE 1320 +#define IDC_MEDICATION 1330 +#define IDC_AIRWAY 1340 +#define IDC_ADVANCED 1350 +#define IDC_DRAG 1360 +#define IDC_TOGGLE 1370 + +#define IDC_TRIAGE_CARD 1400 +#define IDC_INJURIES 1410 +#define IDC_ACTIVITY 1420 +#define IDC_QUICKVIEW 1430 + +#define IDC_ACTION_1 1500 +#define IDC_ACTION_2 1510 +#define IDC_ACTION_3 1520 +#define IDC_ACTION_4 1530 +#define IDC_ACTION_5 1540 +#define IDC_ACTION_6 1550 +#define IDC_ACTION_7 1560 +#define IDC_ACTION_8 1570 +#define IDC_ACTION_9 1580 + +#define IDCS_ACTION_BUTTONS [IDC_ACTION_1, IDC_ACTION_2, IDC_ACTION_3, IDC_ACTION_4, IDC_ACTION_5, IDC_ACTION_6, IDC_ACTION_7, IDC_ACTION_8, IDC_ACTION_9] + +#define IDC_BODY_GROUP 6000 +#define IDC_BODY_HEAD 6005 +#define IDC_BODY_TORSO 6010 +#define IDC_BODY_ARMLEFT 6015 +#define IDC_BODY_ARMRIGHT 6020 +#define IDC_BODY_LEGLEFT 6025 +#define IDC_BODY_LEGRIGHT 6030 +#define IDC_BODY_ARMLEFT_T 6035 +#define IDC_BODY_ARMRIGHT_T 6040 +#define IDC_BODY_LEGLEFT_T 6045 +#define IDC_BODY_LEGRIGHT_T 6050 +#define IDC_BODY_ARMLEFT_B 6055 +#define IDC_BODY_ARMRIGHT_B 6060 +#define IDC_BODY_LEGLEFT_B 6065 +#define IDC_BODY_LEGRIGHT_B 6070 + +#define IDC_TRIAGE_STATUS 7000 +#define IDC_TRIAGE_SELECT 7100 diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml new file mode 100644 index 00000000000..25ae8239deb --- /dev/null +++ b/addons/medical_gui/stringtable.xml @@ -0,0 +1,1092 @@ + + + + + GUI + GUI + Interface graphique + Медицинский интерфейс + GUI + 界面 + GUI + GUI + Graficzny Interfejs Użytkownika + Interfaz gráfica + GUI + Graphische Benutzeroberfläche + + + Enable Medical Actions + Aktiviere Sanitätsaktionen + 医療行為を有効化 + Разрешить Медицинские действия + Activer les actions médicales + Ativar Ações Médicas + 啟用醫療行為 + Attivare azioni mediche + Povolit zdravotnické akce + Włącza opcje medyczne + Habilitar acciones médicas + Medikal hareketleri etkinleştir + + + Enables medical actions for the Interaction Menu and selects their style. + Aktiviert die Sanitätsaktionen für das Interaktionsmenü und legt das Aussehen fest + インタラクション メニューから選択した表示方式で医療行為をできるようになります。 + Включает медицинские действия для меню взаимодействия и выбирает их стиль. + Permet d'afficher les actions médicales dans le menu d'interaction, et de définir leur style visuel. + Ativa as ações médicas para o menu de interação e seleciona seus estilos. + 為互動選單啟用醫療行為以及選擇其風格。 + Abilita le azioni mediche per il Menu Interazione e seleziona il loro stile. + Povolit zdravotnické akce pro menu interakcí a vybrat jejich styl. + Umożliwia akcje medyczne w menu interakcji i wybiera ich styl. + Habilita acciones médicas para el menú de interacción y selecciona su estilo. + + + Selections (3D) + Pozycje (3D) + Sélection (3D) + 3D-Auswahl + Стандартный (3D) + Selecciones (3d) + Seleção (3d) + Választékok (3D) + 3D výběr + Selezione (3D) + 選択 (3D) + 선택 (3d) + 选择 (3D) + 選擇 (3D) + Seçimler (3D) + + + Radial + Radialne + Radial + Kreisförmig + Радиальный + Radial + Radial + Kerek + Kruhový + Radiale + 円状 + 다이얼형 + 放射状 + 放射狀 + Radyal + + + Enable Medical Self Actions + Medizinische Selbst-Interaktionen anzeigen + 自分への医療行為を有効化 + Разрешить Медицинские действия на себе + Activer les actions médicales sur soi-même + Ativar ações médicas em si mesmo + 啟用自我醫療行為 + Abilitare le azioni di automedicazione + Povolit zdravotnické vlastní akce + Włącza akcje medyczne na sobie + Habilitar las acciones médicas en uno mismo + Kendine Tıbbi Müdahele Etmeyi Etkinleştir + + + Enables medical actions for the Self Interaction Menu. + Medizinische Interaktionen bei Selbst-Interaktionen anzeigen + セルフ インタラクション メニューで医療行為をできるようになります。 + Включает медицинские действия для меню взаимодействия с собой. + Active les actions médicales du menu d'interaction personnel. + Ativa as ações médicas do menu de interação pessoal. + 為自我互動選單啟用醫療行為。 + Abilita il menu per le interazioni mediche personali + Povoluje zdravotnické akce v menu vlastních interakcí. + Umożliwia działania medyczne w menu własnej interakcji. + Activa las acciones médicas para el menú de interacción personal + + + Enable Medical Menu + Aktiviere das Sanitätsmenü + 医療メニューを有効化 + Разрешить Медицинское меню + Activer le menu médical + Ativar Menu Médico + 啟用醫療選單 + Abilita il menu medico + Povolit Zdravotnické menu + Włącz Menu Medyczne + Activar menú médico + Medikal Menüyü Etkinleştir + + + Enables the use of the Medical Menu through the keybind or interaction menu. + Aktiviere die Nutzung des Sanitätsmenüs durch eine Tastenkombination oder durch das Interaktionsmenü + 割り当てられたキーかインタラクション メニューから医療メニューを使えるようになります。 + Позволяет использовать Медицинское меню через связку клавиш или меню взаимодействия. + Permet l'utilisation du menu médical via le menu d'interaction ou l'appui d'une touche. + Ativa o uso do Menu Médico atráves da Tecla ou Menu de Interação. + 啟用以互動選單或者按鍵綁定所呼出的高效醫療選單 + Abilita l'uso del Menu Medico attraverso il menu tastiera o il menu di interazione. + Povoluje používání Zdravotnického menu klávesovou zkratku nebo skrze menu interakcí. + Umożliwia korzystanie z menu medycznego poprzez skrót lub menu interakcji. + Activa el uso del menú médico a través de la tecla o del menú de interacción + + + Reopen Medical Menu + Sanitätsmenü wieder öffnen + 医療メニューの再使用 + Открывать меню после лечения + Rouvrir le menu médical + Reabrir Menu Médico + 醫療選單二度開啟 + Riaprire il menù medico + Znovu otevřít Zdravotnické menu + Otwiera ponownie menu medyczne + Reabrir menú médico + + + Reopen the Medical Menu after successful treatment. + Öffne das Sanitätsmenü nach einer Behandlung + 治療が成功した後に、再度医療メニューを開きます。 + Открывает Медицинское меню после успешного лечения + Réouvre le menu médical suite à l'application d'un soin. + Reabrir Menu Médico após um tratamento com sucesso + 當治療完成後二度打開醫療選單 + Riaprire il menu medico dopo il trattamento con successo. + Otevře Zdravotnické menu po úspěšném dokončení zdravotnické akce. + Otwiera ponownie menu medyczne po udanym leczeniu. + Reabrir menú médico después de completar un tratamiento + + + Maximum Distance + Maximale Entfernung + 最大距離 + Макс. дистанция + Distance maximale + Distância Máxima + 最大醫療距離 + Massima distanza + Maximální vzdálenost + Maksymalny dystans + Distancia máxima + + + Maximum distance from which the Medical Menu can be opened. + Maximale Entfernung, um das Sanitätsmenü zu öffnen. + 治療メニューを開いたままにできる最大距離を決定します。 + Максимальное расстояние, с которого можно открыть Медицинское меню. + Définit la distance (en mètres) à partir de laquelle il n'est plus possible d'activer le menu médical pour traiter un patient. + A Distância máxima do paciente para que o Menu Médico possa ser aberto. + 設定距離多遠以內可以對目標使用醫療選單 + Distanza massima da cui si può aprire il Menu Medico. + Maximální vzdálenost ze které je možné otevřít Zdravotnické menu. + Maksymalny dystans w którym menu medyczne może zostać otwarte. + Distancia máxima desde el paciente para que el menú pueda ser abierto + + + Medical + Lékařské + Médical + Sanitäter + Medico + Medyczne + Médico + Медик + Médico + Orvosi + 治療 + 치료 + 医疗 + 醫療 + Medikal + + + Medical Menu + Sanitätsmenü + Menu medyczne + Menu Médico + Медицинское меню + Menú médico + Zdravotnická nabídka + Menù Medico + Menu médical + 治療メニュー + 의료 메뉴 + 医疗菜单 + 醫療選單 + Medikal Menü + + + Open Medical Menu + Öffne Sanitätsmenü + Otwórz menu medyczne + Abrir menu médico + Открыть медицинское меню + Abrir menú médico + Otevřít zdravotnickou nabídku + Apri Menù Medico + Ouvir le menu médical + 治療メニューを開く + 의료 메뉴 열기 + 打开医疗菜单 + 開起醫療選單 + Medikal Menüyü Aç + + + Load Patient + Cargar al paciente en + Погрузить пациента + Patient einladen + Załaduj pacjenta + Embarquer le patient + Sebesült berakása + Carica il paziente + Carregar Paciente Em + Naložit pacienta + 患者を載せる + 환자 싣기 + 将伤者装入 + 將傷者放入 + Kişiyi Bindir + + + Unload Patient + Descargar al paciente + Выгрузить пациента + Patient ausladen + Wyładuj pacjenta + Débarquer le patient + Sebesült kihúzása + Scarica il paziente + Descarregar Paciente + Vyložit pacienta + 患者を降ろす + 환자 내리기 + 将伤者背出 + 將傷者背出 + Kişiyi Indir + + + EXAMINE & TREATMENT + Untersuchung & Behandlung + ОСМОТР И ЛЕЧЕНИЕ + EXAMINAR & TRATAMIENTO + EXAMENS & TRAITEMENTS + BADANIE & LECZENIE + EXAMINAR & TRATAMENTO + VYŠETŘENÍ & LÉČBA + ESAMINA & TRATTA + 診断 & 治療 + 검사 / 치료 + 检查 & 治疗 + 檢查 & 治療 + + + STATUS + STATUS + СОСТОЯНИЕ + ESTADO + ÉTAT + STATUS + ESTADO + STAV + STATO + 状態 + 상태 + 状态 + 狀態 + DURUM + + + OVERVIEW + ÜBERSICHT + ОБЩАЯ ИНФОРМАЦИЯ + DESCRIPCIÓN + APERÇU + OPIS + VISÃO GERAL + PŘEHLED + PANORAMICA + オーバービュー + 개요 + 总览 + 概述 + GENEL BAKIŞ + + + ACTIVITY LOG + AKTIVITÄTSVERLAUF + ПРОВЕДЕННЫЕ МАНИПУЛЯЦИИ + REGISTRO DE ACTIVIDAD + REGISTRE D'ACTIVITÉ + LOGI AKTYWNOŚCI + REGISTRO DE ATIVIDADE + PROTOKOL + LOG ATTIVITA' + 治療履歴 + 활동 로그 + 医疗记录 + 醫療紀錄 + AKTIVITE GÜNLÜĞÜ + + + QUICK VIEW + SCHNELLANSICHT + БЫСТРЫЙ ОСМОТР + VISTA RÁPIDA + VUE RAPIDE + SZYBKI PODGLĄD + VISÃO RÁPIDA + RYCHLÝ NÁHLED + VISTA RAPIDA + クイック ビュー + 퀵 뷰 + 快速检查 + 快速檢查 + HIZLI GÖRÜNÜM + + + INJURIES + VERLETZUNGEN + FERITE + ТРАВМЫ + BLESSURES + OBRAŻENIA + HERIDAS + SÉRÜLÉSEK + ZRANĚNÍ + FERIMENTOS + 負傷 + 부상 + 负伤 + 受傷 + YARALANMALARI + + + View Triage Card + Zeige Triagekarte + Смотреть первичную карточку + Ver Triage + Voir Fiche de Triage + Pokaż kartę segregacyjną + Ver cartão de triagem + Zkontrolovat štítek + Guarda Triage Card + トリアージ カードを見る + 부상자 카드 보기 + 查看分诊卡 + 查看診斷卡 + Triyaj Kartını Görüntüle + + + Examine Patient + Untersuche Patient + Осмотреть пациента + Examinar Paciente + Examiner Patient + Zbadaj pacjenta + Examinar paciente + Zkontrolovat pacienta + Esamina Paziente + 患者を調べる + 환자 검사하기 + 检查伤员 + 檢查傷者 + Hastayı Incele + + + Bandage / Fractures + Bandagen / Brüche + Раны / переломы + Vendajes/Fracturas + Bandages/Attelles + Bandaże / Złamania + Bandagens / Fraturas + Bandáž / Zlomeniny + Bendaggi/Fratture + 包帯 / 骨折 + 붕대 / 골절 + 包扎 / 骨折 + 繃帶 / 骨折 + Bandaj / Kırıklar + + + Medication + Medikamentation + Медикаменты + Medicación + Médication + Leki + Medicação + Léky + Medicazione + 薬物による治療 + 약물 치료 + 药物 + 藥物 + Ilaç + + + Airway Management + Дыхательные пути + Vías Aéreas + Gestion des voies respiratoires + Drogi oddechowe + Vias aéreas + Dýchací systém + Gestione Vie Respiratorie + Atemwegssicherung + 気道を確保 + 기도 관리 + 呼吸道管理 + 呼吸道管理 + Hava Yolu Yönetimi + + + Advanced Treatments + Erweiterte Behandlungen + Специальная медпомощь + Tratamientos Avanzados + Traitements Avancés + Zaawansowane zabiegi + Tratamentos avançados + Pokročilé ošetření + Trattamenti Avanzati + 高度な治療 + 고급 치료 + 进阶治疗 + 進階治療 + + + Drag / Carry + Ziehen / Tragen + Тащить / нести + Arrastrar / Cargar + Traîner/Porter + Ciągnij / Nieś + Arrastar / Carregar + Táhnout / Nést + Trascina / Trasporta + 引きずる / 担ぐ + 끌기 / 들기 + 拖 / 背 + 拖 / 背 + Sürükle / Taşı + + + Toggle (Self) + Umschalter (Selbst) + Лечить себя/другого раненого + Basculer (soi-même) + Przełącz (na siebie) + Alternar + Alternar (Si mesmo) + Přepnout (na sebe) + Attiva (Te Stesso) + 切り替え (自分) + 토글 (자신) + 切换 (自己) + 切換 (自己) + + + Head + Kopf + Голова + Cabeza + Tête + Głowa + Caebça + Hlava + Testa + 頭部 + 머리 + 头部 + 頭部 + Kafa + + + Torso + Torso + Торс + Torse + Tors + Torso + Trup + Torso + Torso + 胴体 + 몸통 + 躯干 + 身體 + Gövde + + + Left Arm + Linker Arm + Левая рука + Brazo Izquierdo + Bras gauche + Lewa ręka + Braço Esquerdo + Levá Ruka + Braccio Sinistro + 左腕 + 왼쪽 팔 + 左臂 + 左手 + Sol Kol + + + Right Arm + Rechter Arm + Правая рука + Brazo Derecho + Bras droit + Prawa ręka + Braço Direito + Pravá Ruka + Braccio Destro + 右腕 + 오른쪽 팔 + 右臂 + 右手 + Sağ Kol + + + Left Leg + Linkes Bein + Левая нога + Pierna Izquierda + Jambe gauche + Lewa noga + Perna Esquerda + Levá Noha + Gamba Sinistra + 左足 + 왼쪽 다리 + 左腿 + 左腳 + Sol Bacak + + + Right Leg + Rechtes Bein + Правая нога + Pierna Derecha + Jambe droite + Prawa noga + Perna Direita + Pravá Noha + Gamba Destra + 右足 + 오른쪽 다리 + 右腿 + 右腳 + Sağ Bacak + + + Select Head + Wähle Kopf + Выбрать голову + Seleccionar Cabeza + Sélectionner la tête + Wybierz głowę + Selecionar Cabeça + Vybrat Hlavu + Seleziona Testa + 頭部を選ぶ + 머리 선택 + 选择头部 + 選擇頭部 + Kafayı Seç + + + Select Torso + Wähle Torso + Выбрать торс + Seleccionar Torso + Sélectionner le torse + Wybierz tors + Selecionar Torso + Vybrat Trup + Seleziona Torso + 胴体を選ぶ + 몸통 선택 + 选择躯干 + 選擇身體 + Gövdeyi Seç + + + Select Left Arm + Wähle linken Arm + Выбрать левую руку + Seleccionar Brazo Izquierdo + Sélectionner le bras gauche + Wybierz lewą rękę + Selecionar Braço Esquerdo + Vybrat Levou ruku + Seleziona Braccio Sinistro + 左腕を選ぶ + 왼쪽 팔 선택 + 选择左臂 + 選擇左手 + Sol Kolu Seç + + + Select Right Arm + Wähle rechten Arm + Выбрать правую руку + Seleccionar Brazo Derecho + Sélectionner le bras droit + Wybierz prawą rękę + Selecionar Braço Direito + Vybrat Pravou ruku + Seleziona Braccio Destro + 右腕を選ぶ + 오른쪽 팔 선택 + 选择右臂 + 選擇右手 + Sağ Kolu Seç + + + Select Left Leg + Wähle linkes Bein + Выбрать левую ногу + Seleccionar Pierna Izquierda + Sélectionner la jambe gauche + Wybierz lewą nogę + Selecionar Perna Esquerda + Vybrat Levou nohu + Seleziona Gamba Sinistra + 左足を選ぶ + 왼쪽 다리 선택 + 选择左腿 + 選擇左腳 + Sol Bacağı Seç + + + Select Right Leg + Wähle rechtes Bein + Выбрать правую ногу + Seleccionar Pierna Derecha + Sélectionner la jambe droite + Wybierz prawą nogę + Selecionar Perna Direita + Vybrat Pravou nohu + Seleziona Gamba Destra + 右足を選ぶ + 오른쪽 다리 선택 + 选择右腿 + 選擇右腳 + Sağ Bacağı Seç + + + Small + Klein + малого размера + Pequeña + Petite + małym + Pequeno + Malý + Piccolo + 小さい + + + + Küçük + + + Medium + Mittel + среднего размера + Mediana + Moyenne + średnim + Médio + Střední + Medio + 中くらい + + + + Orta + + + Large + Groß + большого размера + Grande + Grande + dużym + Grande + Velký + Grande + 大きい + + + + Büyük + + + There are %2 %1 Open Wounds + Er hat %2 offene Wunden (%1) + %2 открытые раны %1 + Hay %2 Heridas Abiertas %1 + Il y a %2 blessures ouvertes (%1). + Widzisz otwarte rany w ilości %2 o %1 rozmiarze + Existem %2 ferimentos abertos %1 + Jsou zde %2 %1 otevřené rány + Ci sono %2 %1 Ferite Aperte + 開いている傷口が %2 %1 ほどある + 여기 %2 %1 크기의 열린 상처가 있다 + 有 %2 处未处理的 %1 伤口 + 有 %2 %1 開放性傷口 + + + There is 1 %1 Open Wound + Er hat 1 offene Wunde (%1) + Открытая рана %1 + Hay 1 Herida Abierta %1 + Il y a 1 blessure ouverte (%1). + Widzisz 1 otwartą ranę o %1 rozmiarze + Existe 1 %1 ferimento aberto + Je zde 1 %1 otevřená rána + C'è 1 %1 Ferita Aperta + 1 つの空いている %1 傷口 + 여기 %1 크기의 열린 상처가 있다 + 有 1 处未处理的 %1 伤口 + 有 1 %1 開放性傷口 + + + There is a partial %1 Open wound + Er hat eine zum Teil offene Wunde (%1) + Частично открытая рана %1 + Hay una herida parcial abierta %1 + Il y a une blessure partiellement ouverte (%1). + Widzisz częściowo otwartą ranę o %1 rozmiarze + Existe um ferimento parcial aberto %1 + Je zde částečně %1 otevřená rána + C'è 1 parziale %1 Ferita Aperta + 部分的に開いている %1 の傷口がある + 여기 부분적으로 %1 크기의 상처가 있다 + 有未完全处理的 %1 伤口 + 有部分 %1 開放性傷口 + + + There are %2 %1 Bandaged Wounds + Er hat %2 verbundene Wunden (%1) + %2 перевязанные раны %1 + Hay %2 Heridas %1 Vendadas + Il y a %2 blessures pansées (%1). + Widzisz %2 zabandażowanych ran o %1 rozmiarze + Existem %2 ferimentos %1 tratados + Jsou zde %2 %1 ovázané rány + Ci sono %2 %1 Ferite Bendate + ここには %2 %1 の処置された傷がある + 여기에 붕대를 감은 %2 %1 크기의 상처가 있다 + 有 %2 处包扎过的 %1 伤口 + 有 %2 %1 包紮過傷口 + + + There is 1 %1 Bandaged Wound + Er hat 1 verbundene Wunde (%1) + 1 перевязанная рана %1 + Hay 1 Herida Vendada %1 + Il y a 1 blessure pansée (%1). + Widzisz 1 zabandażowaną ranę o %1 rozmiarze + Existe 1 ferimento %1 tratado + Je zde 1 %1 ovázaná rána + C'è 1 %1 Ferita Bendata + 1 つの包帯で巻かれている %1 傷 + 여기에 붕대를 감은 %1 크기의 상처가 있다 + 有 1 处包扎过的 %1 伤口 + 有 1 %1 包紮過傷口 + + + There is a partial %1 Bandaged wound + Er hat eine zum Teil verbundene Wunde (%1) + Частично перевязанная рана %1 + Hay una Herida parcial %1 Vendada + Il y a 1 blessure partiellement bandée (%1). + Widzisz 1 częściowo zabandażowaną ranę o %1 rozmiarze + Existe um ferimento parcial tratado %1 + Je zde částěčně %1 ovázaná rána + C'è 1 parziale %1 Ferita Bendata + 患者には %1 の包帯で処置された傷がある + 여기 부분적으로 붕대질한 %1 크기의 상처가 있다 + 有未包扎完全的 %1 伤口 + 有部分 %1 包紮過傷口 + + + Normal breathing + Normale Atmung + Дыхание в норме + Respiración normal + Respiration normale + Normalny oddech + Respiração normal + Normální dýchání + Respirazione Normale + 通常の呼吸 + 정상 호흡 + 呼吸正常 + 正常呼吸 + Normal solunum + + + No breathing + Keine Atmung + Дыхания нет + No respira + Aucune respiration + Brak oddechu + Sem respiração + Nedýchá + Nessuna Respirazione + 息をしていない + 호흡이 없음 + 没有呼吸 + 沒有呼吸 + Solunum yok + + + Difficult breathing + Schwere Atmung + Дыхание затруднено + Dificultad para respirar + Respiration difficile + Trudności z oddychaniem + Dificuldade para respirar + Potíže s dýcháním + Difficoltà Respiratorie + 呼吸が難しそうだ + 호흡 곤란 + 呼吸困难 + 呼吸困難 + Nefes almada zorluk + + + Almost no breathing + Beinahe keine Atmung + Дыхания почти нет + Casi sin respirar + Respiration très faible + Prawie brak oddechu + Quase sem respiração + Téměř nedýchá + Quasi nessuna Respirazione + ほとんど呼吸していない + 호흡이 거의 없음 + 呼吸微弱 + 幾乎沒有呼吸 + Neredeyse hiç nefes almıyor + + + Bleeding + Blutung + Кровотечение + Sangrando + Saignement + Krwawienie zewnętrzne + Sangrando + Krvácí + Sanguinamento + 出血中 + 출혈 + 流血中 + 出血中 + Kanama var + + + in Pain + hat Schmerzen + Испытывает боль + Con Dolor + Souffre + W bólu + Com dor + v bolestech + in Dolore + 痛みがある + 고통 + 疼痛中 + 疼痛中 + Ağrısı var + + + Lost a lot of Blood + hat sehr viel Blut verloren + Большая кровопотеря + Mucha Sangre perdida + A perdu beaucoup de sang + Stracił dużo krwi + Perdeu muito sangue + Ztratil hodně krve + Perso molto Sangue + 大量失血した + 많은 피를 흘림 + 失血 + 大量失血 + Çok fazla kan kaybı var + + + Fractured + Перелом + 骨折している + Fracturé + Fraturado + 骨折 + Frattura + Zlomené + Złamanie + Fracturada + 骨折 + + + Splint Applied + Наложена шина + 添え木を当てている + Attelle appliquée + Tala Aplicada + 已使用固定板 + Gessatura applicata + Dlaha aplikována + Szyna założona + Tablilla aplicada + 已用夹板固定 + + + + Lost some blood + Hat etwas Blut verloren + いくらか失血した + Небольшая кровопотеря + A perdu une faible quantité de sang + Perdeu um pouco de Sangue + 輕微失血 + Ha perso un po' di sangue + Ztratil trochu krve + Stracił trochę krwi + Algo de sangre perdida + Az kan kaybı var + 轻微失血 + + + Lost a lot of blood + Hat eine große Menge Blut verloren + Большая кровопотеря + Mucha sangre perdida + A perdu une quantité modérée de sang + Stracił dużo krwi + Ztratil hodně krve + Sok vért vesztett + Ha perso parecchio sangue + Perdeu muito sangue + 大量失血した + 많은 양의 혈액을 잃음 + 大量失血 + 大量失血中 + Çok fazla kan kaybı var + + + Lost a large amount of blood + Hat eine sehr große Menge Blut verloren + かなり酷く大量失血した + Огромная кровопотеря + A perdu une importante quantité de sang + Perdeu uma quantidade grande de sangue + 極大量失血中 + Ha perso una grande quantità di sangue + Ztratil velké množství krve + Stracił dużą ilość krwi + Perdida gran cantidad de sangre + Çok miktarda kan kaybetti + 严重失血 + + + Lost a fatal amount of blood + Hat eine kritische Menge an Blut verloren + 致命的な程失血した + Фатальная кровопотеря + A perdu une quantité critique de sang + Perdeu uma quantidade fatal de sangue + 致命性失血中 + Ha perso una quantità fatale di sangue + Vykrvácel + Stracił krytyczną ilość krwi + Perdida una cantidad fatal de sangre + Ölümcül miktarda kan kaybetti + 致命失血 + + + Tourniquet [CAT] + Tourniquet [CAT] + Жгут + Torniquete [CAT] + Garrot [CAT] + Staza Taktyczna [CAT] + Torniquete [CAT] + Škrtidlo [CAT] + Laccio Emostatico [CAT] + 止血帯 [CAT] + 지혈대 [CAT] + 止血带 (军用型) + 軍用止血帶 + Turnike [CAT] + + + Nasopharyngeal Tube [NPA] + Nasen-Rachen-Rohr + Назотрахеальная трубка + Torniquete [CAT] + Canule Nasopharyngée [NPA] + Rurka nosowo-gardłowa [NPA] + Tubo nasofaríngeo [NPA] + Nasofaryngeální trubice [NPA] + Tubo Nasofaringeo [NPA] + 鼻咽頭チューブ [NPA] + 비-인두 기도기 [NPA] + 鼻咽管 + 鼻咽管 + + + Triage Card + Triagekarte + Tarjeta de clasificación + Медкарта + Karta segregacyjna + Štítek + Fiche de triage + Orvosi lap + Triage Card + Cartão de Triagem + トリアージ カード + 부상자 분류 카드 + 分诊卡 + 檢傷分類卡 + Triyaj Kartı + + + Partial %1 + 部分的な%1 + 部分 %1 + Partiel %1 + Parziale %1 + Parciální %1 + Częściowe %1 + Parcial%1 + Parcial %1 + Partiell %1 + Parsiyel %1 + Частичное %1 + 未完全处理的 %1 + + + Patient Info + Informacje o pacjencie + Informations patient + Информация о пациенте + 伤员信息 + + + diff --git a/addons/medical/ui/icons/autoInjector.paa b/addons/medical_gui/ui/auto_injector.paa similarity index 100% rename from addons/medical/ui/icons/autoInjector.paa rename to addons/medical_gui/ui/auto_injector.paa diff --git a/addons/medical/ui/icons/bandage.paa b/addons/medical_gui/ui/bandage.paa similarity index 100% rename from addons/medical/ui/icons/bandage.paa rename to addons/medical_gui/ui/bandage.paa diff --git a/addons/medical/ui/icons/bodybag.paa b/addons/medical_gui/ui/bodybag.paa similarity index 100% rename from addons/medical/ui/icons/bodybag.paa rename to addons/medical_gui/ui/bodybag.paa diff --git a/addons/medical_gui/ui/cross.paa b/addons/medical_gui/ui/cross.paa new file mode 100644 index 00000000000..b9b4015eb68 Binary files /dev/null and b/addons/medical_gui/ui/cross.paa differ diff --git a/addons/medical_gui/ui/cross_t_0.paa b/addons/medical_gui/ui/cross_t_0.paa new file mode 100644 index 00000000000..7e5697efe02 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_0.paa differ diff --git a/addons/medical_gui/ui/cross_t_1.paa b/addons/medical_gui/ui/cross_t_1.paa new file mode 100644 index 00000000000..921887e2011 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_1.paa differ diff --git a/addons/medical_gui/ui/cross_t_2.paa b/addons/medical_gui/ui/cross_t_2.paa new file mode 100644 index 00000000000..708055d56b2 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_2.paa differ diff --git a/addons/medical_gui/ui/cross_t_3.paa b/addons/medical_gui/ui/cross_t_3.paa new file mode 100644 index 00000000000..f6988c60cef Binary files /dev/null and b/addons/medical_gui/ui/cross_t_3.paa differ diff --git a/addons/medical_gui/ui/cross_t_4.paa b/addons/medical_gui/ui/cross_t_4.paa new file mode 100644 index 00000000000..80aa8ea785c Binary files /dev/null and b/addons/medical_gui/ui/cross_t_4.paa differ diff --git a/addons/medical_gui/ui/cross_t_5.paa b/addons/medical_gui/ui/cross_t_5.paa new file mode 100644 index 00000000000..5fbab99bbab Binary files /dev/null and b/addons/medical_gui/ui/cross_t_5.paa differ diff --git a/addons/medical_gui/ui/cross_t_6.paa b/addons/medical_gui/ui/cross_t_6.paa new file mode 100644 index 00000000000..e93da27307f Binary files /dev/null and b/addons/medical_gui/ui/cross_t_6.paa differ diff --git a/addons/medical_gui/ui/cross_t_7.paa b/addons/medical_gui/ui/cross_t_7.paa new file mode 100644 index 00000000000..53599cb2f8e Binary files /dev/null and b/addons/medical_gui/ui/cross_t_7.paa differ diff --git a/addons/medical_gui/ui/cross_t_8.paa b/addons/medical_gui/ui/cross_t_8.paa new file mode 100644 index 00000000000..b1c26afe7cf Binary files /dev/null and b/addons/medical_gui/ui/cross_t_8.paa differ diff --git a/addons/medical_gui/ui/cross_t_9.paa b/addons/medical_gui/ui/cross_t_9.paa new file mode 100644 index 00000000000..003c2bcb603 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_9.paa differ diff --git a/addons/medical/ui/icons/iv.paa b/addons/medical_gui/ui/iv.paa similarity index 100% rename from addons/medical/ui/icons/iv.paa rename to addons/medical_gui/ui/iv.paa diff --git a/addons/medical/ui/icons/packingBandage.paa b/addons/medical_gui/ui/packing_bandage.paa similarity index 100% rename from addons/medical/ui/icons/packingBandage.paa rename to addons/medical_gui/ui/packing_bandage.paa diff --git a/addons/medical_gui/ui/patient_info_preview_ca.paa b/addons/medical_gui/ui/patient_info_preview_ca.paa new file mode 100644 index 00000000000..17c974a436e Binary files /dev/null and b/addons/medical_gui/ui/patient_info_preview_ca.paa differ diff --git a/addons/medical_gui/ui/splint.paa b/addons/medical_gui/ui/splint.paa new file mode 100644 index 00000000000..8cd9866d5e9 Binary files /dev/null and b/addons/medical_gui/ui/splint.paa differ diff --git a/addons/medical/ui/icons/surgicalKit.paa b/addons/medical_gui/ui/surgical_kit.paa similarity index 100% rename from addons/medical/ui/icons/surgicalKit.paa rename to addons/medical_gui/ui/surgical_kit.paa diff --git a/addons/medical/ui/icons/tourniquet.paa b/addons/medical_gui/ui/tourniquet.paa similarity index 100% rename from addons/medical/ui/icons/tourniquet.paa rename to addons/medical_gui/ui/tourniquet.paa diff --git a/addons/medical/ui/icons/triageCard.paa b/addons/medical_gui/ui/triage_card.paa similarity index 100% rename from addons/medical/ui/icons/triageCard.paa rename to addons/medical_gui/ui/triage_card.paa diff --git a/addons/medical_menu/$PBOPREFIX$ b/addons/medical_menu/$PBOPREFIX$ deleted file mode 100644 index 6ca7434932f..00000000000 --- a/addons/medical_menu/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\medical_menu \ No newline at end of file diff --git a/addons/medical_menu/ACE_Settings.hpp b/addons/medical_menu/ACE_Settings.hpp deleted file mode 100644 index b180157b3ae..00000000000 --- a/addons/medical_menu/ACE_Settings.hpp +++ /dev/null @@ -1,36 +0,0 @@ -class ACE_Settings { - class GVAR(allow) { - displayName = CSTRING(allow); - description = CSTRING(allow_Descr); - value = 1; - typeName = "SCALAR"; - values[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled), ECSTRING(common,VehiclesOnly)}; - category = ECSTRING(medical,Category_Medical); - }; - class GVAR(useMenu) { - displayName = CSTRING(useMenu); - description = CSTRING(useMenu_Descr); - value = 0; - typeName = "SCALAR"; - values[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled), ECSTRING(common,VehiclesOnly)}; - isClientSettable = 1; - category = ECSTRING(medical,Category_Medical); - }; - class GVAR(openAfterTreatment) { - displayName = CSTRING(openAfterTreatment); - description = CSTRING(openAfterTreatment_Descr); - typeName = "BOOL"; - value = 1; - isClientSettable = 1; - category = ECSTRING(medical,Category_Medical); - }; - class GVAR(maxRange) { - displayName = CSTRING(maxRange); - description = CSTRING(maxRange_Descr); - //for ref: 3d interaction (MEDICAL_ACTION_DISTANCE) is 1.75 - value = 3; - typeName = "SCALAR"; - category = ECSTRING(medical,Category_Medical); - sliderSettings[] = {0, 10, 3, 1}; - }; -}; diff --git a/addons/medical_menu/CfgVehicles.hpp b/addons/medical_menu/CfgVehicles.hpp deleted file mode 100644 index d152077f472..00000000000 --- a/addons/medical_menu/CfgVehicles.hpp +++ /dev/null @@ -1,71 +0,0 @@ - -class CfgVehicles { - - class ACE_Module; - class ACE_moduleMedicalMenuSettings: ACE_Module { - scope = 1; - displayName = CSTRING(module_DisplayName); - icon = QPATHTOEF(medical,UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QUOTE(DFUNC(module)); - functionPriority = 1; - isGlobal = 1; - isSingular = 1; - isTriggerActivated = 0; - author = ECSTRING(common,ACETeam); - class Arguments { - class allow { - displayName = CSTRING(allow); - description = CSTRING(allow_Descr); - typeName = "NUMBER"; - class values { - class disable { - name = ECSTRING(common,Disabled); - value = 0; - }; - class enable { - name = ECSTRING(common,Enabled); - value = 1; - default = 1; - }; - class VehiclesOnly { - name = ECSTRING(common,VehiclesOnly); - value = 2; - }; - }; - }; - }; - class ModuleDescription { - description = CSTRING(module_Desc); - sync[] = {}; - }; - }; - - class Man; - class CAManBase: Man { - class ACE_SelfActions { - class Medical_Menu { - displayName = CSTRING(OpenMenu); - runOnHover = 0; - exceptions[] = {"isNotInside", "isNotSwimming"}; - condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); - statement = QUOTE([_target] call DFUNC(openMenu)); - icon = QPATHTOEF(medical,UI\icons\medical_cross.paa); - }; - }; - - class ACE_Actions { - // Create a consolidates medical menu for treatment while boarded - class ACE_MainActions { - class Medical_Menu { - displayName = CSTRING(OpenMenu); - runOnHover = 0; - exceptions[] = {"isNotInside", "isNotSwimming"}; - condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); - statement = QUOTE([_target] call DFUNC(openMenu)); - icon = QPATHTOEF(medical,UI\icons\medical_cross.paa); - }; - }; - }; - }; -}; diff --git a/addons/medical_menu/README.md b/addons/medical_menu/README.md deleted file mode 100644 index 86ae2039eab..00000000000 --- a/addons/medical_menu/README.md +++ /dev/null @@ -1,11 +0,0 @@ -ace_medical_menu -=============== - -Provides the CSE medical menu for the advanced medical system. - - -## Maintainers - -The people responsible for merging changes to this component or answering potential questions. - -- [Glowbal](https://github.com/Glowbal) diff --git a/addons/medical_menu/XEH_PREP.hpp b/addons/medical_menu/XEH_PREP.hpp deleted file mode 100644 index 8a44bd2bdc2..00000000000 --- a/addons/medical_menu/XEH_PREP.hpp +++ /dev/null @@ -1,18 +0,0 @@ - -PREP(onMenuOpen); -PREP(onMenuClose); -PREP(openMenu); - -PREP(canOpenMenu); -PREP(updateIcons); -PREP(updateUIInfo); -PREP(handleUI_DisplayOptions); -PREP(handleUI_dropDownTriageCard); -PREP(getTreatmentOptions); -PREP(updateActivityLog); -PREP(updateQuickViewLog); -PREP(updateBodyImage); -PREP(updateInformationLists); -PREP(setTriageStatus); -PREP(collectActions); -PREP(module); diff --git a/addons/medical_menu/XEH_postInit.sqf b/addons/medical_menu/XEH_postInit.sqf deleted file mode 100644 index fcf2dbfd667..00000000000 --- a/addons/medical_menu/XEH_postInit.sqf +++ /dev/null @@ -1,41 +0,0 @@ -#include "script_component.hpp" - -if (!hasInterface) exitWith {}; - -GVAR(MenuPFHID) = -1; -GVAR(lastOpenedOn) = -1; -GVAR(pendingReopen) = false; - -["ace_treatmentSucceded", { - if (GVAR(openAfterTreatment) && {GVAR(pendingReopen)}) then { - GVAR(pendingReopen) = false; - [{ - [GVAR(INTERACTION_TARGET)] call FUNC(openMenu); - }, []] call CBA_fnc_execNextFrame; - }; -}] call CBA_fnc_addEventHandler; - -["ACE3 Common", QGVAR(displayMenuKeyPressed), localize LSTRING(DisplayMenuKey), -{ - TRACE_3("keyDown",cursorTarget,cursorObject,ACE_player); - private _target = cursorTarget; - if (!((_target isKindOf "CAManBase") && {[ACE_player, _target] call FUNC(canOpenMenu)})) then { - _target = cursorObject; - if (!((_target isKindOf "CAManBase") && {[ACE_player, _target] call FUNC(canOpenMenu)})) then { _target = ACE_player; }; - }; - - // Conditions: canInteract - if !([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; - if !([ACE_player, _target] call FUNC(canOpenMenu)) exitWith {false}; - - // Statement - [_target] call FUNC(openMenu); - false -}, -{ - if (CBA_missionTime - GVAR(lastOpenedOn) > 0.5) exitWith { - [objNull] call FUNC(openMenu); - }; - false -}, -[35, [false, false, false]], false, 0] call CBA_fnc_addKeybind; diff --git a/addons/medical_menu/XEH_preInit.sqf b/addons/medical_menu/XEH_preInit.sqf deleted file mode 100644 index 16e448fc388..00000000000 --- a/addons/medical_menu/XEH_preInit.sqf +++ /dev/null @@ -1,16 +0,0 @@ -#include "script_component.hpp" - -ADDON = false; - -PREP_RECOMPILE_START; -#include "XEH_PREP.hpp" -PREP_RECOMPILE_END; - -GVAR(INTERACTION_TARGET) = objNull; -GVAR(actionsOther) = []; -GVAR(actionsSelf) = []; -GVAR(selectedBodyPart) = 0; - -call FUNC(collectActions); - -ADDON = true; diff --git a/addons/medical_menu/config.cpp b/addons/medical_menu/config.cpp deleted file mode 100644 index 633323c2cf2..00000000000 --- a/addons/medical_menu/config.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - name = COMPONENT_NAME; - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_medical"}; - author = ECSTRING(common,ACETeam); - authors[] = {"Glowbal"}; - url = ECSTRING(main,URL); - VERSION_CONFIG; - }; -}; - -#include "CfgEventHandlers.hpp" -#include "ui\menu.hpp" -#include "ACE_Settings.hpp" -#include "CfgVehicles.hpp" - -class ACE_newEvents { - Medical_onMenuOpen = "ace_medicalMenuOpened"; -}; diff --git a/addons/medical_menu/data/background_img.paa b/addons/medical_menu/data/background_img.paa deleted file mode 100644 index de59065e3b5..00000000000 Binary files a/addons/medical_menu/data/background_img.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_advanced_treatment.paa b/addons/medical_menu/data/icons/icon_advanced_treatment.paa deleted file mode 100644 index d6bf6effd95..00000000000 Binary files a/addons/medical_menu/data/icons/icon_advanced_treatment.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_airway_management.paa b/addons/medical_menu/data/icons/icon_airway_management.paa deleted file mode 100644 index f444f5f385d..00000000000 Binary files a/addons/medical_menu/data/icons/icon_airway_management.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_bandage_fracture.paa b/addons/medical_menu/data/icons/icon_bandage_fracture.paa deleted file mode 100644 index df8d1de571b..00000000000 Binary files a/addons/medical_menu/data/icons/icon_bandage_fracture.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_bleeding.paa b/addons/medical_menu/data/icons/icon_bleeding.paa deleted file mode 100644 index d11c2ed496e..00000000000 Binary files a/addons/medical_menu/data/icons/icon_bleeding.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_examine_patient.paa b/addons/medical_menu/data/icons/icon_examine_patient.paa deleted file mode 100644 index 12eb06c8908..00000000000 Binary files a/addons/medical_menu/data/icons/icon_examine_patient.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_medication.paa b/addons/medical_menu/data/icons/icon_medication.paa deleted file mode 100644 index 98893ad8634..00000000000 Binary files a/addons/medical_menu/data/icons/icon_medication.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_toggle_self.paa b/addons/medical_menu/data/icons/icon_toggle_self.paa deleted file mode 100644 index 3078eb5dd5e..00000000000 Binary files a/addons/medical_menu/data/icons/icon_toggle_self.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_tourniquet.paa b/addons/medical_menu/data/icons/icon_tourniquet.paa deleted file mode 100644 index 8b34a7bfbbb..00000000000 Binary files a/addons/medical_menu/data/icons/icon_tourniquet.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_tourniquet_small.paa b/addons/medical_menu/data/icons/icon_tourniquet_small.paa deleted file mode 100644 index a457e2c0d52..00000000000 Binary files a/addons/medical_menu/data/icons/icon_tourniquet_small.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_triage_card.paa b/addons/medical_menu/data/icons/icon_triage_card.paa deleted file mode 100644 index 850ab0f4ce4..00000000000 Binary files a/addons/medical_menu/data/icons/icon_triage_card.paa and /dev/null differ diff --git a/addons/medical_menu/data/ui_background.paa b/addons/medical_menu/data/ui_background.paa deleted file mode 100644 index f1c42c7d7d3..00000000000 Binary files a/addons/medical_menu/data/ui_background.paa and /dev/null differ diff --git a/addons/medical_menu/functions/fnc_canOpenMenu.sqf b/addons/medical_menu/functions/fnc_canOpenMenu.sqf deleted file mode 100644 index f69cf80d125..00000000000 --- a/addons/medical_menu/functions/fnc_canOpenMenu.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if ACE_player can Open the medical menu - * - * Arguments: - * 0: Caller - * 1: Target - * - * Return Value: - * Can open - * - * Example: - * [player, cursorTarget] call ace_medical_menu_fnc_canOpenMenu - * - * Public: No - */ - -params ["_caller", "_target"]; - -(alive _caller) -&& {!isNull _target} -&& {((_caller distance _target) < GVAR(maxRange)) || {(vehicle _caller) == (vehicle _target)}} //for now, ignore range when in same vehicle -&& {(GVAR(allow) == 1) || {(GVAR(allow) == 2) && {(vehicle _caller != _caller) || {vehicle _target != _target}}}} -&& {(GVAR(useMenu) == 1) || {(GVAR(useMenu) == 2) && {(vehicle _caller != _caller) || {vehicle _target != _target}}}} diff --git a/addons/medical_menu/functions/fnc_collectActions.sqf b/addons/medical_menu/functions/fnc_collectActions.sqf deleted file mode 100644 index 5353582fb25..00000000000 --- a/addons/medical_menu/functions/fnc_collectActions.sqf +++ /dev/null @@ -1,63 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Collect treatment actions from medical config - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_medical_menu_fnc_collectActions - * - * Public: No - */ - -private _configBasic = (configFile >> "ACE_Medical_Actions" >> "Basic"); -private _configAdvanced = (configFile >> "ACE_Medical_Actions" >> "Advanced"); - -private _fnc_compileActionsLevel = { - params ["_config"]; - private _actions = []; - - { - if (isClass _x) then { - private _displayName = getText (_x >> "displayName"); - private _category = getText (_x >> "category"); - private _condition = format[QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical,canTreatCached)), configName _x]; - private _statement = format[QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical,treatment)), configName _x]; - _actions pushBack [_displayName, _category, compile _condition, compile _statement]; - }; - nil - } count ("true" configClasses _config); - - _actions; -}; - -GVAR(actionsBasic) = [_configBasic] call _fnc_compileActionsLevel; -GVAR(actionsAdvanced) = [_configAdvanced] call _fnc_compileActionsLevel; - -//Manually add the drag actions, if dragging exists. -if (["ace_dragging"] call EFUNC(common,isModLoaded)) then { - private _condition = { - (ACE_player != GVAR(INTERACTION_TARGET)) && {[ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,canDrag)} - }; - private _statement = { - GVAR(pendingReopen) = false; //No medical_treatmentSuccess event after drag, so don't want this true - [ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,startDrag); - }; - GVAR(actionsBasic) pushBack [localize ELSTRING(dragging,Drag), "drag", _condition, _statement]; - GVAR(actionsAdvanced) pushBack [localize ELSTRING(dragging,Drag), "drag", _condition, _statement]; - - private _condition = { - (ACE_player != GVAR(INTERACTION_TARGET)) && {[ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,canCarry)} - }; - private _statement = { - GVAR(pendingReopen) = false; //No medical_treatmentSuccess event after drag, so don't want this true - [ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,startCarry); - }; - GVAR(actionsBasic) pushBack [localize ELSTRING(dragging,Carry), "drag", _condition, _statement]; - GVAR(actionsAdvanced) pushBack [localize ELSTRING(dragging,Carry), "drag", _condition, _statement]; -}; diff --git a/addons/medical_menu/functions/fnc_getTreatmentOptions.sqf b/addons/medical_menu/functions/fnc_getTreatmentOptions.sqf deleted file mode 100644 index eac639c4d55..00000000000 --- a/addons/medical_menu/functions/fnc_getTreatmentOptions.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Grab available treatment options for given category - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Category name - * - * Return Value: - * Available actions - * - * Example: - * [ACE_player, poor_dude, "some category"] call ace_medical_menu_fnc_getTreatmentOptions - * - * Public: No - */ - -params ["_player", "_target", "_name"]; - -if (!([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith))) exitWith {[]}; - -private _actions = if (EGVAR(medical,level) == 2) then { - GVAR(actionsAdvanced); -} else { - GVAR(actionsBasic); -}; - -private _collectedActions = []; -private _bodyPart = EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart); -{ - _x params ["", "_currentCategory", "_currentCondition"]; - if (_name == _currentCategory && {call _currentCondition}) then { - _collectedActions pushBack _x; - }; - nil -} count _actions; - -_collectedActions; diff --git a/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf b/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf deleted file mode 100644 index 55de1339d03..00000000000 --- a/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf +++ /dev/null @@ -1,109 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Display the available treatment options in category - * - * Arguments: - * 0: Category name - * - * Return Value: - * None - * - * Example: - * ["some category"] call ace_medical_menu_fnc_handleUI_DisplayOptions - * - * Public: No - */ - -#define START_IDC 20 -#define END_IDC 27 -#define AMOUNT_OF_ENTRIES (count _entries) - -if (!hasInterface) exitWith{}; - -params ["_name"]; - -disableSerialization; - -private _display = uiNamespace getVariable QGVAR(medicalMenu); -if (isNil "_display") exitWith {}; // no valid dialog present - -if (_name isEqualTo "toggle") exitWith { - private _newTarget = ACE_player; - //If we are on the player, and only if our old target is still valid, switch to it: - if ((GVAR(INTERACTION_TARGET) == ACE_player) && - {[ACE_player, GVAR(INTERACTION_TARGET_PREVIOUS), ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)} && - {[ACE_player, GVAR(INTERACTION_TARGET_PREVIOUS)] call FUNC(canOpenMenu)}) then { - _newTarget = GVAR(INTERACTION_TARGET_PREVIOUS); - }; - - GVAR(INTERACTION_TARGET_PREVIOUS) = GVAR(INTERACTION_TARGET); - - closeDialog 0; - [{ - [_this select 0] call FUNC(openMenu); - }, [_newTarget], 0.1] call CBA_fnc_waitAndExecute; -}; - -// Clean the dropdown options list from all actions -for [{_x = START_IDC}, {_x <= END_IDC}, {_x = _x + 1}] do { - private _ctrl = (_display displayCtrl (_x)); - _ctrl ctrlSetText ""; - _ctrl ctrlShow false; - _ctrl ctrlSetEventHandler ["ButtonClick",""]; - _ctrl ctrlSetTooltip ""; - _ctrl ctrlCommit 0; -}; - -GVAR(LatestDisplayOptionMenu) = _name; - -// The triage card has no options available -lbClear 212; -if (_name isEqualTo "triage") exitWith { - - ctrlEnable [212, true]; - private _log = GVAR(INTERACTION_TARGET) getVariable [QEGVAR(medical,triageCard), []]; - private _triageCardTexts = []; - { - _x params ["_item", "_amount", "_time"]; - private _message = _item; - if (isClass(configFile >> "CfgWeapons" >> _item)) then { - _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); - } else { - if (isLocalized _message) then { - _message = localize _message; - }; - }; - _triageCardTexts pushBack format["%1x - %2 (%3m)", _amount, _message, round((CBA_missionTime - _time) / 60)]; - nil; - } count _log; - - if (count _triageCardTexts == 0) exitWith { - lbAdd [212,(localize ELSTRING(medical,TriageCard_NoEntry))]; - }; - { - lbAdd [212,_x]; - nil; - }count _triageCardTexts; -}; - -ctrlEnable [212, false]; - -_entries = [ACE_player, GVAR(INTERACTION_TARGET), _name] call FUNC(getTreatmentOptions); - -{ - //player sidechat format["TRIGGERED: %1",_x]; - if (_forEachIndex > END_IDC) exitWith {}; - _ctrl = (_display displayCtrl (START_IDC + _forEachIndex)); - if (!(_forEachIndex > AMOUNT_OF_ENTRIES)) then { - _ctrl ctrlSetText (_x select 0); - private _code = format ["ace_medical_menu_pendingReopen = true; call %1;", (_x select 3)]; - _ctrl ctrlSetEventHandler ["ButtonClick", _code]; - _ctrl ctrlSetTooltip (_x select 0); // TODO implement - _ctrl ctrlShow true; - } else { - _ctrl ctrlSetText ""; - _ctrl ctrlSetEventHandler ["ButtonClick", ""]; - }; - _ctrl ctrlCommit 0; -} forEach _entries; diff --git a/addons/medical_menu/functions/fnc_handleUI_dropDownTriageCard.sqf b/addons/medical_menu/functions/fnc_handleUI_dropDownTriageCard.sqf deleted file mode 100644 index 988022d7a66..00000000000 --- a/addons/medical_menu/functions/fnc_handleUI_dropDownTriageCard.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handle the triage card display - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_medical_menu_fnc_handleUI_dropDownTriageCard - * - * Public: No - */ - -disableSerialization; - -private _display = uiNamespace getVariable QGVAR(medicalMenu); -private _pos = [0, 0, 0, 0]; -private _currentPos = ctrlPosition (_display displayCtrl 2002); -_currentPos params ["_currentPosX", "_currentPosY"]; -if (_currentPosX == 0 && _currentPosY == 0) then { - _pos = ctrlPosition (_display displayCtrl 2001); -}; - -for "_idc" from 2002 to 2006 step 1 do { - _pos set [1, (_pos select 1) + (_pos select 3)]; - private _ctrl = _display displayCtrl _idc; - _ctrl ctrlSetPosition _pos; - _ctrl ctrlCommit 0; -}; diff --git a/addons/medical_menu/functions/fnc_module.sqf b/addons/medical_menu/functions/fnc_module.sqf deleted file mode 100644 index bdb6f33086b..00000000000 --- a/addons/medical_menu/functions/fnc_module.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical menu settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_menu_fnc_module - * - * Public: No - */ - -params ["_logic", "", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(allow), "allow"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical_menu/functions/fnc_onMenuClose.sqf b/addons/medical_menu/functions/fnc_onMenuClose.sqf deleted file mode 100644 index f6318263ddf..00000000000 --- a/addons/medical_menu/functions/fnc_onMenuClose.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "script_component.hpp" -/* - * Author: joko // Jonas - * Handle medical menu closed - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ace_medical_menu_fnc_onMenuClosed - * - * Public: No - */ - -if (EGVAR(interact_menu,menuBackground)==1) then {[QGVAR(id), false] call EFUNC(common,blurScreen);}; -if (EGVAR(interact_menu,menuBackground)==2) then {(uiNamespace getVariable [QEGVAR(interact_menu,menuBackground), displayNull]) closeDisplay 0;}; - -[GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler; -GVAR(MenuPFHID) = -1; diff --git a/addons/medical_menu/functions/fnc_onMenuOpen.sqf b/addons/medical_menu/functions/fnc_onMenuOpen.sqf deleted file mode 100644 index 991529712a4..00000000000 --- a/addons/medical_menu/functions/fnc_onMenuOpen.sqf +++ /dev/null @@ -1,88 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handle medical menu opened - * - * Arguments: - * 0: Medical Menu display - * - * Return Value: - * None - * - * Example: - * [medical_menu] call ace_medical_menu_fnc_onMenuOpen - * - * Public: No - */ -#define MAX_DISTANCE 10 - -params ["_display"]; - -if (isNil "_display") exitWith {}; - -if (EGVAR(interact_menu,menuBackground)==1) then {[QGVAR(id), true] call EFUNC(common,blurScreen);}; -if (EGVAR(interact_menu,menuBackground)==2) then {0 cutRsc[QEGVAR(interact_menu,menuBackground), "PLAIN", 1, false];}; - -if (isNil QGVAR(LatestDisplayOptionMenu)) then { - GVAR(LatestDisplayOptionMenu) = "triage"; -} else { - if (GVAR(LatestDisplayOptionMenu) == "toggle") then { - GVAR(LatestDisplayOptionMenu) = "triage"; - GVAR(INTERACTION_TARGET) = GVAR(INTERACTION_TARGET_PREVIOUS); - }; -}; - -private _target = GVAR(INTERACTION_TARGET); -if (isNil QGVAR(INTERACTION_TARGET_PREVIOUS)) then { - GVAR(INTERACTION_TARGET_PREVIOUS) = _target; -}; -[GVAR(LatestDisplayOptionMenu)] call FUNC(handleUI_DisplayOptions); - -disableSerialization; - -[_target, _display] call FUNC(updateUIInfo); - -(_display displayCtrl 11) ctrlSetTooltip localize LSTRING(VIEW_TRIAGE_CARD); -(_display displayCtrl 12) ctrlSetTooltip localize LSTRING(EXAMINE_PATIENT); -(_display displayCtrl 13) ctrlSetTooltip localize LSTRING(BANDAGE_FRACTURES); -(_display displayCtrl 14) ctrlSetTooltip localize LSTRING(MEDICATION); -(_display displayCtrl 15) ctrlSetTooltip localize LSTRING(AIRWAY_MANAGEMENT); -(_display displayCtrl 16) ctrlSetTooltip localize LSTRING(ADVANCED_TREATMENT); -(_display displayCtrl 17) ctrlSetTooltip localize LSTRING(DRAG_CARRY); -(_display displayCtrl 18) ctrlSetTooltip localize LSTRING(TOGGLE_SELF); - -(_display displayCtrl 301) ctrlSetTooltip localize LSTRING(SELECT_HEAD); -(_display displayCtrl 302) ctrlSetTooltip localize LSTRING(SELECT_TORSO); -(_display displayCtrl 303) ctrlSetTooltip localize LSTRING(SELECT_ARM_R); -(_display displayCtrl 304) ctrlSetTooltip localize LSTRING(SELECT_ARM_L); -(_display displayCtrl 305) ctrlSetTooltip localize LSTRING(SELECT_LEG_R); -(_display displayCtrl 306) ctrlSetTooltip localize LSTRING(SELECT_LEG_L); -(_display displayCtrl 2001) ctrlSetTooltip localize LSTRING(SELECT_TRIAGE_STATUS); - -(_display displayCtrl 1) ctrlSetText format ["%1", [_target] call EFUNC(common,getName)]; -setMousePosition [0.4, 0.4]; - -if (GVAR(MenuPFHID) != -1) exitWith {ERROR("PFID already running");}; - -GVAR(MenuPFHID) = [{ - - (_this select 0) params ["_display"]; - if (isNull GVAR(INTERACTION_TARGET)) then { - GVAR(INTERACTION_TARGET) = ACE_player; - }; - [GVAR(INTERACTION_TARGET), _display] call FUNC(updateUIInfo); - [GVAR(INTERACTION_TARGET)] call FUNC(updateIcons); - [GVAR(LatestDisplayOptionMenu)] call FUNC(handleUI_DisplayOptions); - - //Check that it's valid to stay open: - if !(([ACE_player, GVAR(INTERACTION_TARGET), ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) && {[ACE_player, GVAR(INTERACTION_TARGET)] call FUNC(canOpenMenu)}) then { - closeDialog 314412; - //If we failed because of distance check, show UI message: - if ((ACE_player distance GVAR(INTERACTION_TARGET)) > GVAR(maxRange)) then { - [[ELSTRING(medical,DistanceToFar), [GVAR(INTERACTION_TARGET)] call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); - }; - }; - -}, 0, [_display]] call CBA_fnc_addPerFrameHandler; - -["ace_medicalMenuOpened", [ACE_player, _target]] call CBA_fnc_localEvent; diff --git a/addons/medical_menu/functions/fnc_openMenu.sqf b/addons/medical_menu/functions/fnc_openMenu.sqf deleted file mode 100644 index a492da8c43d..00000000000 --- a/addons/medical_menu/functions/fnc_openMenu.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Open the medical menu for target - * - * Arguments: - * 0: Target - * - * Return Value: - * If action was taken - * - * Example: - * [some_player] call ace_medical_menu_fnc_openMenu - * - * Public: No - */ - -params ["_interactionTarget"]; - -if (dialog || {isNull _interactionTarget}) exitWith { - disableSerialization; - - private _display = uiNamespace getVariable QGVAR(medicalMenu); - if (!isNil "_display") then { - closeDialog 314412; - }; -}; - -GVAR(INTERACTION_TARGET) = _interactionTarget; - -createDialog QGVAR(medicalMenu); -GVAR(lastOpenedOn) = CBA_missionTime; - -true diff --git a/addons/medical_menu/functions/fnc_setTriageStatus.sqf b/addons/medical_menu/functions/fnc_setTriageStatus.sqf deleted file mode 100644 index 9580a051e85..00000000000 --- a/addons/medical_menu/functions/fnc_setTriageStatus.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Set the triage status of object - * - * Arguments: - * 0: Target - * 1: Status - * - * Return Value: - * None - * - * Example: - * [bob, 2] call ACE_medical_menu_fnc_setTriageStatus - * - * Public: No - */ - -params ["_target", "_status"]; - -_target setVariable [QEGVAR(medical,triageLevel), _status, true]; diff --git a/addons/medical_menu/functions/fnc_updateActivityLog.sqf b/addons/medical_menu/functions/fnc_updateActivityLog.sqf deleted file mode 100644 index c99bc1ef4f9..00000000000 --- a/addons/medical_menu/functions/fnc_updateActivityLog.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the activity log - * - * Arguments: - * 0: display - * 1: log collection - * - * Return Value: - * None - * - * Example: - * [some_display, log] call ace_medical_menu_fnc_updateActivityLog - * - * Public: No - */ - -params ["_display", "_logs"]; - -private _logCtrl = _display displayCtrl 214; -lbClear _logCtrl; - -{ - _x params ["_message", "_moment", "", "_arguments"]; - - if (isLocalized _message) then { - _message = localize _message; - }; - - { - if (_x isEqualType "" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; - }; - } forEach _arguments; - - _message = format ([_message] + _arguments); - _logCtrl lbAdd format ["%1 %2", _moment, _message]; - nil -} count _logs; diff --git a/addons/medical_menu/functions/fnc_updateBodyImage.sqf b/addons/medical_menu/functions/fnc_updateBodyImage.sqf deleted file mode 100644 index 234556a9690..00000000000 --- a/addons/medical_menu/functions/fnc_updateBodyImage.sqf +++ /dev/null @@ -1,41 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the body image on the menu - * - * Arguments: - * 0: selection bloodloss - * 1: damaged (array of bools) - * 2: display - * - * Return Value: - * None - * - * Example: - * [0.3, some_display] call ace_medical_menu_fnc_updateBodyImage - * - * Public: No - */ - -params ["_selectionBloodLoss", "_damaged", "_display"]; - -// Handle the body image coloring -private _availableSelections = [50, 51, 52, 53, 54, 55]; -{ - private _red = 1; - private _green = 1; - private _blue = 1; - - if (_x > 0) then { - if (_damaged select _forEachIndex) then { - _green = (0.9 - _x) max 0; - _blue = _green; - } else { - _green = (0.9 - _x) max 0; - _red = _green; - //_blue = _green; - }; - }; - - (_display displayCtrl (_availableSelections select _forEachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; -} forEach _selectionBloodLoss; diff --git a/addons/medical_menu/functions/fnc_updateIcons.sqf b/addons/medical_menu/functions/fnc_updateIcons.sqf deleted file mode 100644 index 2d437612d74..00000000000 --- a/addons/medical_menu/functions/fnc_updateIcons.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the category icons - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_medical_menu_fnc_updateIcons - * - * Public: No - */ - -#define START_IDC 111 -#define END_IDC 118 - -disableSerialization; - -private _display = uiNamespace getVariable QGVAR(medicalMenu); -private _options = ["triage" , "examine", "bandage", "medication", "airway", "advanced", "drag", "toggle"]; - -for "_idc" from START_IDC to END_IDC step 1 do { - private _amount = [ACE_player, GVAR(INTERACTION_TARGET), _options select (_idc - START_IDC)] call FUNC(getTreatmentOptions); - if ((count _amount) > 0 || _idc == START_IDC || _idc == END_IDC) then { - (_display displayCtrl _idc) ctrlSettextColor [1, 1, 1, 1]; - } else { - (_display displayCtrl _idc) ctrlSettextColor [0.4, 0.4, 0.4, 1]; - }; -}; diff --git a/addons/medical_menu/functions/fnc_updateInformationLists.sqf b/addons/medical_menu/functions/fnc_updateInformationLists.sqf deleted file mode 100644 index 25f457503c9..00000000000 --- a/addons/medical_menu/functions/fnc_updateInformationLists.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the treatment information list - * - * Arguments: - * 0: display - * 1: message collection - * 2: injury collection - * - * Return Value: - * None - * - * Example: - * [DISPLAY, [messagecollection], [injurycollection]] call ACE_medical_menu_fnc_updateInformationLists - * - * Public: No - */ - -params ["_display", "_genericMessages", "_allInjuryTexts"]; - -private _lbCtrl = _display displayCtrl 213; -lbClear _lbCtrl; -{ - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_forEachIndex, _color]; -} forEach _genericMessages; - -private _amountOfGeneric = count _genericMessages; -{ - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_forEachIndex + _amountOfGeneric, _color]; -} forEach _allInjuryTexts; - -if (_allInjuryTexts isEqualTo []) then { - _lbCtrl lbAdd localize ELSTRING(medical,NoInjuriesBodypart); -}; diff --git a/addons/medical_menu/functions/fnc_updateQuickViewLog.sqf b/addons/medical_menu/functions/fnc_updateQuickViewLog.sqf deleted file mode 100644 index c398faaf142..00000000000 --- a/addons/medical_menu/functions/fnc_updateQuickViewLog.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the quick view log - * - * Arguments: - * 0: display - * 1: log collection - * - * Return Value: - * None - * - * Example: - * [some_display, log] call ace_medical_menu_fnc_updateQuickViewLog - * - * Public: No - */ - -params ["_display", "_logs"]; - -private _logCtrl = _display displayCtrl 215; -lbClear _logCtrl; - -{ - _x params ["_message", "_moment", "", "_arguments"]; - - { - if (_x isEqualType "" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; - }; - } forEach _arguments; - - _message = format ([([_message, localize _message] select (isLocalized _message))] + _arguments); - _logCtrl lbAdd format ["%1 %2", _moment, _message]; - nil -} count _logs; diff --git a/addons/medical_menu/functions/fnc_updateUIInfo.sqf b/addons/medical_menu/functions/fnc_updateUIInfo.sqf deleted file mode 100644 index f1341bf6937..00000000000 --- a/addons/medical_menu/functions/fnc_updateUIInfo.sqf +++ /dev/null @@ -1,153 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update all UI information in the medical menu - * - * Arguments: - * 0: target - * 1: display - * - * Return Value: - * None - * - * Example: - * [some_player, some_display] call ace_medical_menu_fnc_updateUIInfo - * - * Public: No - */ - -params ["_target", "_display"]; - -if (isNil "_display" || {isNull _display}) exitWith {ERROR("No display");}; - -private _selectionN = GVAR(selectedBodyPart); -if (_selectionN < 0 || {_selectionN > 5}) exitWith {}; - -private _genericMessages = []; -private _partText = [ELSTRING(medical,Head), ELSTRING(medical,Torso), ELSTRING(medical,LeftArm) ,ELSTRING(medical,RightArm) ,ELSTRING(medical,LeftLeg), ELSTRING(medical,RightLeg)] select _selectionN; -_genericMessages pushBack [localize _partText, [1, 1, 1, 1]]; - -if (_target getVariable [QEGVAR(medical,isBleeding), false]) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Bleeding), [1, 0.1, 0.1, 1]]; -}; - -if (_target getVariable [QEGVAR(medical,hasLostBlood), 0] > 1) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Lost_Blood), [1, 0.1, 0.1, 1]]; -}; - -if (((_target getVariable [QEGVAR(medical,tourniquets), [0, 0, 0, 0, 0, 0]]) select _selectionN) > 0) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; -}; - -if (_target getVariable [QEGVAR(medical,hasPain), false]) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Pain), [1, 1, 1, 1]]; -}; - -private _totalIvVolume = 0; -private _bloodBags = _target getVariable [QEGVAR(medical,ivBags), []]; -{ - _x params ["_bagVolumeRemaining"]; - _totalIvVolume = _totalIvVolume + _bagVolumeRemaining; -} foreach _bloodBags; - -if (_totalIvVolume >= 1) then { - _genericMessages pushBack [format [localize ELSTRING(medical,receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; -}; - -private _damaged = [false, false, false, false, false, false]; -private _selectionBloodLoss = [0, 0, 0, 0, 0, 0]; - -private _allInjuryTexts = []; -if ((EGVAR(medical,level) >= 2) && {([_target] call EFUNC(medical,hasMedicalEnabled))}) then { - private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if (_amountOf > 0) then { - _damaged set [_x select 2, true]; - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - - if (_selectionN == (_x select 2)) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushBack [format["%2x %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6, ceil _amountOf], [1,1,1,1]]; - } else { - // TODO localization - _allInjuryTexts pushBack [format["Partial %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6], [1,1,1,1]]; - }; - }; - }; - } forEach _openWounds; - - private _bandagedwounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if !(_damaged select (_x select 2)) then { - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - }; - if (_selectionN == (_x select 2)) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf > 0) then { - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushBack [format ["[B] %2x %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6, ceil _amountOf], [0.88,0.7,0.65,1]]; - } else { - // TODO localization - _allInjuryTexts pushBack [format ["[B] Partial %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6], [0.88,0.7,0.65,1]]; - }; - }; - }; - } forEach _bandagedwounds; -} else { - - // Add all bleeding from wounds on selection - private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if (_amountOf > 0) then { - _damaged set [_x select 2, true]; - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - }; - } forEach _openWounds; - - private _bandagedwounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if !(_damaged select (_x select 2)) then { - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - }; - } forEach _bandagedwounds; - - private _bloodLossOnSelection = _selectionBloodLoss select _selectionN; - if (_bloodLossOnSelection > 0) then { - private _severity = switch (true) do { - case (_bloodLossOnSelection > 0.5): {localize ELSTRING(medical,HeavilyWounded)}; - case (_bloodLossOnSelection > 0.1): {localize ELSTRING(medical,LightlyWounded)}; - default {localize ELSTRING(medical,VeryLightlyWounded)}; - }; - private _part = localize ([ - ELSTRING(medical,Head), - ELSTRING(medical,Torso), - ELSTRING(medical,LeftArm), - ELSTRING(medical,RightArm), - ELSTRING(medical,LeftLeg), - ELSTRING(medical,RightLeg) - ] select _selectionN); - _allInjuryTexts pushBack [format ["%1 %2", _severity, toLower _part], [1,1,1,1]]; - }; -}; - -[_selectionBloodLoss, _damaged, _display] call FUNC(updateBodyImage); -[_display, _genericMessages, _allInjuryTexts] call FUNC(updateInformationLists); -[_display, _target getVariable [QEGVAR(medical,tourniquets), [0,0,0,0,0,0]]] call EFUNC(medical,updateTourniquets); - -[_display, _target getVariable [QEGVAR(medical,logFile_activity_view), []]] call FUNC(updateActivityLog); -[_display, _target getVariable [QEGVAR(medical,logFile_quick_view), []]] call FUNC(updateQuickViewLog); - -private _triageStatus = [_target] call EFUNC(medical,getTriageStatus); -(_display displayCtrl 2000) ctrlSetText (_triageStatus select 0); -(_display displayCtrl 2000) ctrlSetBackgroundColor (_triageStatus select 2); diff --git a/addons/medical_menu/functions/script_component.hpp b/addons/medical_menu/functions/script_component.hpp deleted file mode 100644 index 8c2e4191665..00000000000 --- a/addons/medical_menu/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_menu\script_component.hpp" diff --git a/addons/medical_menu/script_component.hpp b/addons/medical_menu/script_component.hpp deleted file mode 100644 index 28ab0311b35..00000000000 --- a/addons/medical_menu/script_component.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#define COMPONENT medical_menu -#define COMPONENT_BEAUTIFIED Medical Menu -#include "\z\ace\addons\main\script_mod.hpp" - -// #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE -// #define ENABLE_PERFORMANCE_COUNTERS - -#ifdef DEBUG_ENABLED_MEDICAL_MENU - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_MEDICAL_MENU - #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_MENU -#endif - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/medical_menu/stringtable.xml b/addons/medical_menu/stringtable.xml deleted file mode 100644 index 7b273febc65..00000000000 --- a/addons/medical_menu/stringtable.xml +++ /dev/null @@ -1,846 +0,0 @@ - - - - - Medical Menu - Sanitätsmenü - Menu medyczne - Menu médico - Медицинское меню - Menú médico - Zdravotnikcá nabídka - Menù Medico - Menu médical - 治療メニュー - 의료 메뉴 - 医疗选单 - 醫療選單 - - - Allow Medical Menu - Erlaube Sanitätsmenü - Akt. menu medyczne - Permitir menu médico - Разрешить мед. меню - Permitir menú médico - Povolit zdravotnickou nabídku - Consenti Menù Medico - Autoriser le menu médical - 治療メニューを有効化 - 의료 메뉴 활성화 - 允许医疗选单 - 允許醫療選單 - - - Allow clients to use the medical menu - Erlaube Clients das Sanitätsmenü zu verwenden - Zezwalaj graczom korzystać z menu medycznego - Permite que clientes utilizem o menu médico - Разрешает клиентам использовать медицинское меню - Permitir a los clientes utilizar el menú médico - Povolit klientům používat zdravotnickou nabídku - Consenti ai clients di usare il Menù Medico - Autoriser les clients à utiliser le menu médical - 全クライアントが治療メニューを使えるようにします - 클라이언트가 의료 메뉴를 쓰는것을 허락합니다 - 允许客户端使用医疗选单 - 允許客戶端使用醫療選單 - - - Use Medical menu - Verwende Sanitätsmenü - Użyj menu medycznego - Usar o menu médico - Использовать медицинское меню - Utiliza el menú médico - Použít zdravotnickou nabídku - Usa Menù Medico - Utiliser le menu médical - 治療メニューを使う - 의료 메뉴 사용 - 使用医疗选单 - 使用醫療選單 - - - If allowed by server, enable the option to use the Medical Menu through keybinding and interaction menu - Wenn vom Server erlaubt, aktiviert diese Einstellung das Sanitätsmenü, welches durch Tastenkombination oder Interaktionsmenü aufgerufen werden kann. - Jeżeli zezwolone przez serwer, aktywuj menu medyczne poprzez skrót klawiszowy i menu interakcji. - Se permitido pelo servidor, ativa a opção de usar o menu médico por atalhos de teclas e menu de interação - Если разрешено сервером, включает опцию использования медицинского меню с помощью горячих главиш или меню взаимодействия - Si está permitido por el servidor, active la opción de utilizar el menú médico a través del menú de las teclas - Pokud je povoleno serverem, umožní použít zdravotnickou nabídku skrze kláv. zkratku a interakční menu - Se consentito dal server, abilita l'opzione di usare il Menù Medico attraverso hotkeys e menù interazione - Si autorisé par le serveur, active l'option d'utiliser le menu médical à travers les raccourcis clavier et le menu d'interaction. - サーバーが有効化を許可している場合はオプションから有効化でき、治療メニューはキー割り当てとインタラクション メニューを無視できます - 서버 허가하에 단축키와 상호작용 메뉴로 의료 메뉴사용을 허가합니다 - 如果伺服器允许,只需透过按键即可叫出医疗选单 - 如果伺服器允許,只需透過按鍵即可叫出醫療選單 - - - Re-open Medical menu - Sanitätsmenü offen lassen - Otwieraj ponownie menu medyczne - Reabrir menu médico - Переоткрывать мед. меню - Reabrir menú médico - Znovu otevřít zdravotnickou nabídku - Ri-apri Menù Medico - Ré-ouvrir le menu médical - 治療メニューを再び開く - 의료 메뉴 다시 열기 - 重新开启医疗选单 - 重新開啟醫療選單 - - - Re-open the medical menu after succesful treatment - Öffnet das Sanitätsmenü nach einer erfolgreichen Behandlung erneut - Otwórz ponownie menu medyczne po udanym zakończeniu leczenia - Reabre o menu médico depois de um tratamento bem sucedido - Переоткрывать медицинское меню после удачного лечения - Reabre el menú médico despues de un tratamiento con éxito - Znovu otevřít zdravotnickou nabídku po úspěšné léčbě - Ri-Apri il Menù Medico dopo un trattamento riuscito - Ré-ouvrir le menu médical après un traitement réussi - 治療が終わった後、再び治療メニューを開きます - 성공적으로 치료한후에 의료 메뉴를 다시 엽니다 - 当治疗成功后重新打开医疗选单 - 當治療成功後重新打開醫療選單 - - - Open Medical Menu - Öffne Sanitätsmenü - Otwórz menu medyczne - Abrir menu médico - Открыть медицинское меню - Abrir menú médico - Otevřít zdravotnickou nabídku - Apri Menù Medico - Ouvir le menu médical - 治療メニューを開く - 의료 메뉴 열기 - 开起医疗选单 - 開起醫療選單 - - - Medical Menu Settings - Sanitätsmenü Einstellungen - Ustawienia menu medycznego - Preferências do menu médico - Настройки медицинского меню - Ajustes del mení médico - Nastavení zdravotnické nabídky - Impostazioni Menù Medico - Réglages du menu médical - 治療メニューの設定 - 의료 메뉴 설정 - 医疗选单设定 - 醫療選單設定 - - - Configure the usage of the Medical Menu - Stelle die Verwendung des Sanitätsmenüs ein - Skonfiguruj opcje menu medycznego - Configura o uso do menu médico - Настройки использования медицинского меню - Configurar el uso del menú médico - Konfigurace využití zdravotnické nabídky - Configura l'uso del Menù Medico - Configurer l'utilisation du menu médical - 治療メニュー用の設定 - 의료 메뉴 사용의 설정 - 设置医疗选单的使用 - 設置醫療選單的使用 - - - EXAMINE & TREATMENT - Untersuchung & Behandlung - ОСМОТР И ЛЕЧЕНИЕ - EXAMINAR & TRATAMIENTO - EXAMINER & TRAITEMENTS - BADANIE & LECZENIE - EXAMINAR & TRATAMENTO - VYŠETŘENÍ & LÉČBA - ESAMINA & TRATTA - 診断 & 治療 - 검사 / 치료 - 检查 & 治疗 - 檢查 & 治療 - - - STATUS - STATUS - СОСТОЯНИЕ - ESTADO - ÉTAT - STATUS - ESTADO - STAV - STATO - 状態 - 상태 - 状态 - 狀態 - - - OVERVIEW - ÜBERSICHT - ОБЩАЯ ИНФОРМАЦИЯ - DESCRIPCIÓN - APERÇU - OPIS - VISÃO GERAL - PŘEHLED - PANORAMICA - オーバービュー - 개요 - 概述 - 概述 - - - ACTIVITY LOG - AKTIVITÄTSVERLAUF - ПРОВЕДЕННЫЕ МАНИПУЛЯЦИИ - REGISTRO DE ACTIVIDAD - REGISTRE D'ACTIVITÉ - LOGI AKTYWNOŚCI - REGISTRO DE ATIVIDADE - PROTOKOL - LOG ATTIVITA' - 治療履歴 - 활동 로그 - 医疗纪录 - 醫療紀錄 - - - QUICK VIEW - SCHNELLANSICHT - БЫСТРЫЙ ОСМОТР - VISTA RÁPIDA - VUE RAPIDE - SZYBKI PODGLĄD - VISÃO RÁPIDA - RYCHLÝ NÁHLED - VISTA RAPIDA - クイック ビュー - 퀵 뷰 - 快速检查 - 快速檢查 - - - View triage Card - Zeige Triagekarte - Смотреть первичную карточку - Ver Triage - Voir Carte de Triage - Pokaż kartę segregacyjną - Ver cartão de triagem - Zkontrolovat štítek - Guarda Triage Card - トリアージ カードを見る - 부상자 카드 보기 - 查看诊断卡 - 查看診斷卡 - - - Examine Patient - Untersuche Patient - Осмотреть пациента - Examinar Paciente - Examiner Patient - Zbadaj pacjenta - Examinar paciente - Zkontrolovat pacienta - Esamina Paziente - 患者を調べる - 환자 검사하기 - 检查伤者 - 檢查傷者 - - - Bandage / Fractures - Bandagen / Brüche - Раны / переломы - Vendajes/Fracturas - Bandages / Fractures - Bandaże / Złamania - Bandagens / Fraturas - Bandáž / Zlomeniny - Bendaggi/Fratture - 包帯 / 骨折 - 붕대 / 골절 - 绷带 / 骨折 - 繃帶 / 骨折 - - - Medication - Medikamentation - Медикаменты - Medicación - Médications - Leki - Medicação - Léky - Medicazione - 薬物による治療 - 약물 치료 - 药物 - 藥物 - - - Airway Management - Дыхательные пути - Vías Aéreas - Gestion des voies respiratoires - Drogi oddechowe - Vias aéreas - Dýchací systém - Gestione Vie Respiratorie - Atemwegssicherung - 気道を確保 - 기도 관리 - 呼吸道管理 - 呼吸道管理 - - - Advanced Treatments - Erweiterte Behandlungen - Специальная медпомощь - Tratamientos Avanzados - Traitements Avancés - Zaawansowane zabiegi - Tratamentos avançados - Pokročilé ošetření - Trattamenti Avanzati - 高度な治療 - 고급 치료 - 进阶治疗 - 進階治療 - - - Drag/Carry - Ziehen/Tragen - Тащить/нести - Arrastrar/Cargar - Traîner/Porter - Ciągnij/Nieś - Arrastar/Carregar - Táhnout/Nést - Trascina/Trasporta - 引きずる / 運ぶ - 끌기 / 들기 - 拖 / 背 - 拖 / 背 - - - Toggle (Self) - Umschalter (Selbst) - Лечить себя/другого раненого - Basculer (soi) - Przełącz (na siebie) - Alternar - Alternar (Si mesmo) - Přepnout (na sebe) - Attiva (Te Stesso) - 切り替え (自分) - 토글 (자신) - 切换 (自己) - 切換 (自己) - - - Select triage status - Setze Status auf der Triagekarte - Сортировка - Seleccionar estado de Triage - Sélectionner l'état de triage - Wybierz priorytet - Selecionar estado de triagem - Vybrat prioritu - Seleziona stato Triage - トリアージによる状態を選択 - 부상 상태 고르기 - 选择分诊状态 - 選擇分診狀態 - - - Select Head - Wähle Kopf - Выбрать голову - Seleccionar Cabeza - Sélectionner la tête - Wybierz głowę - Selecionar Cabeça - Vybrat Hlavu - Seleziona Testa - 頭部を選ぶ - 머리 선택 - 选择头部 - 選擇頭部 - - - Select Torso - Wähle Torso - Выбрать торс - Seleccionar Torso - Sélectionner le torse - Wybierz tors - Selecionar Torso - Vybrat Trup - Seleziona Torso - 胴体を選ぶ - 몸통 선택 - 选择身体 - 選擇身體 - - - Select Left Arm - Wähle linken Arm - Выбрать левую руку - Seleccionar Brazo Izquierdo - Sélectionner le bras gauche - Wybierz lewą rękę - Selecionar Braço Esquerdo - Vybrat Levou ruku - Seleziona Braccio Sinistro - 左腕を選ぶ - 왼쪽 팔 선택 - 选择左手 - 選擇左手 - - - Select Right Arm - Wähle rechten Arm - Выбрать правую руку - Seleccionar Brazo Derecho - Sélectionner le bras droit - Wybierz prawą rękę - Selecionar Braço Direito - Vybrat Pravou ruku - Seleziona Braccio Destro - 右腕を選ぶ - 오른쪽 팔 선택 - 选择右手 - 選擇右手 - - - Select Left Leg - Wähle linkes Bein - Выбрать левую ногу - Seleccionar Pierna Izquierda - Sélectionner la jambe gauche - Wybierz lewą nogę - Selecionar Perna Esquerda - Vybrat Levou nohu - Seleziona Gamba Sinistra - 左足を選ぶ - 왼쪽 다리 선택 - 选择左脚 - 選擇左腳 - - - Select Right Leg - Wähle rechtes Bein - Выбрать правую ногу - Seleccionar Pierna Derecha - Sélectionner la jambe droite - Wybierz prawą nogę - Selecionar Perna Direita - Vybrat Pravou nohu - Seleziona Gamba Destra - 右足を選ぶ - 오른쪽 다리 선택 - 选择右脚 - 選擇右腳 - - - Head - Kopf - Голова - Cabeza - Tête - Głowa - Caebça - Hlava - Testa - 頭部 - 머리 - 头部 - 頭部 - - - Torso - Torso - Торс - Torse - Tors - Torso - Trup - Torso - Torso - 胴体 - 몸통 - 身体 - 身體 - - - Left Arm - Linker Arm - Левая рука - Brazo Izquierdo - Bras gauche - Lewa ręka - Braço Esquerdo - Levá Ruka - Braccio Sinistro - 左腕 - 왼쪽 팔 - 左手 - 左手 - - - Right Arm - Rechter Arm - Правая рука - Brazo Derecho - Bras droit - Prawa ręka - Braço Direito - Pravá Ruka - Braccio Destro - 右腕 - 오른쪽 팔 - 右手 - 右手 - - - Left Leg - Linkes Bein - Левая нога - Pierna Izquierda - Jambe gauche - Lewa noga - Perna Esquerda - Levá Noha - Gamba Sinistra - 左足 - 왼쪽 다리 - 左脚 - 左腳 - - - Right Leg - Rechtes Bein - Правая нога - Pierna Derecha - Jambe droite - Prawa noga - Perna Direita - Pravá Noha - Gamba Destra - 右足 - 오른쪽 다리 - 右脚 - 右腳 - - - Body Part: %1 - Körperteil: %1 - Часть тела: %1 - Parte del cuerpo: %1 - Partie du corps : %1 - Część ciała: %1 - Parte do corpo: %1 - Část těla: %1 - Parte del Corpo: %1 - 身体の一部: %1 - 신체 부위: %1 - 身体部位: %1 - 身體部位: %1 - - - Small - Klein - малого размера - Pequeña - Petite - małym - Pequeno - Malý - Piccolo - 小さい - - - - - - Medium - Mittel - среднего размера - Mediana - Moyenne - średnim - Médio - Střední - Medio - 中くらい - - - - - - Large - Groß - большого размера - Grande - Grande - dużym - Grande - Velký - Grande - 大きい - - - - - - There are %2 %1 Open Wounds - Er hat %2 offene Wunden (%1) - %2 открытые раны %1 - Hay %2 Heridas Abiertas %1 - Il y a %2 %1 blessure(s) ouverte(s) - Widzisz otwarte rany w ilości %2 o %1 rozmiarze - Existem %2 ferimentos abertos %1 - Jsou zde %2 %1 otevřené rány - Ci sono %2 %1 Ferite Aperte - 開いている傷口が %2 %1 ほどあります - 여기 %2 %1 크기의 열린 상처가 있다 - 有 %2 %1 开放性伤口 - 有 %2 %1 開放性傷口 - - - There is 1 %1 Open Wound - Er hat 1 offene Wunde (%1) - Открытая рана %1 - Hay 1 Herida Abierta %1 - Il y a 1 blessure ouverte %1 - Widzisz 1 otwartą ranę o %1 rozmiarze - Existe 1 %1 ferimento aberto - Je zde 1 %1 otevřená rána - C'è 1 %1 Ferita Aperta - 1 つの空いている %1 傷口 - 여기 %1 크기의 열린 상처가 있다 - 有 1 %1 开放性伤口 - 有 1 %1 開放性傷口 - - - There is a partial %1 Open wound - Er hat eine zum Teil offene Wunde (%1) - Частично открытая рана %1 - Hay una herida parcial abierta %1 - Il y a une blessure partiellement ouverte %1 - Widzisz częściowo otwartą ranę o %1 rozmiarze - Existe um ferimento parcial aberto %1 - Je zde částečně %1 otevřená rána - C'è 1 parziale %1 Ferita Aperta - 部分的に開いている %1 の傷口があります - 여기 부분적으로 %1 크기의 상처가 있다 - 有部分 %1 开放性伤口 - 有部分 %1 開放性傷口 - - - There are %2 %1 Bandaged Wounds - Er hat %2 verbundene Wunden (%1) - %2 перевязанные раны %1 - Hay %2 Heridas %1 Vendadas - Il y a %2 %1 blessure(s) bandée(s) - Widzisz %2 zabandażowanych ran o %1 rozmiarze - Existem %2 ferimentos %1 tratados - Jsou zde %2 %1 ovázané rány - Ci sono %2 %1 Ferite Bendate - ここには %2 %1 の処置された傷があります - 여기에 붕대를 감은 %2 %1 크기의 상처가 있다 - 有 %2 %1 包扎过伤口 - 有 %2 %1 包紮過傷口 - - - There is 1 %1 Bandaged Wound - Er hat 1 verbundene Wunde (%1) - 1 перевязанная рана %1 - Hay 1 Herida Vendada %1 - Il y a 1 %1 blessure bandée - Widzisz 1 zabandażowaną ranę o %1 rozmiarze - Existe 1 ferimento %1 tratado - Je zde 1 %1 ovázaná rána - C'è 1 %1 Ferita Bendata - 1 つの包帯で巻かれている %1 傷 - 여기에 붕대를 감은 %1 크기의 상처가 있다 - 有 1 %1 包扎过伤口 - 有 1 %1 包紮過傷口 - - - There is a partial %1 Bandaged wound - Er hat eine zum Teil verbundene Wunde (%1) - Частично перевязанная рана %1 - Hay una Herida parcial %1 Vendada - Il y a %1 blessure partiellement bandée - Widzisz 1 częściowo zabandażowaną ranę o %1 rozmiarze - Existe um ferimento parcial tratado %1 - Je zde částěčně %1 ovázaná rána - C'è 1 parziale %1 Ferita Bendata - 患者には %1 の包帯で処置された傷があります - 여기 부분적으로 붕대질한 %1 크기의 상처가 있다 - 有部分 %1 包扎过伤口 - 有部分 %1 包紮過傷口 - - - Normal breathing - Normale Atmung - Дыхание в норме - Respiración normal - Respiration normale - Normalny oddech - Respiração normal - Normální dýchání - Respirazione Normale - 通常の呼吸 - 정상 호흡 - 正常呼吸 - 正常呼吸 - - - No breathing - Keine Atmung - Дыхания нет - No respira - Aucune respiration - Brak oddechu - Sem respiração - Nedýchá - Nessuna Respirazione - 息をしていません - 호흡이 없음 - 没有呼吸 - 沒有呼吸 - - - Difficult breathing - Schwere Atmung - Дыхание затруднено - Dificultad para respirar - Respiration difficile - Trudności z oddychaniem - Dificuldade para respirar - Potíže s dýcháním - Difficoltà Respiratorie - 呼吸が難しそうです - 호흡 곤란 - 呼吸困难 - 呼吸困難 - - - Almost no breathing - Beinahe keine Atmung - Дыхания почти нет - Casi sin respirar - Respiration faible - Prawie brak oddechu - Quase sem respiração - Téměř nedýchá - Quasi nessuna Respirazione - ほとんど呼吸していません - 호흡이 거의 없음 - 几乎没有呼吸 - 幾乎沒有呼吸 - - - Bleeding - Blutung - Кровотечение - Sangrando - Saignement - Krwawienie zewnętrzne - Sangrando - Krvácí - Sanguinamento - 出血中 - 출혈 - 出血中 - 出血中 - - - in Pain - hat Schmerzen - Испытывает боль - Con Dolor - Souffre - W bólu - Com dor - v bolestech - in Dolore - 痛みがある - 고통 - 疼痛中 - 疼痛中 - - - Lost a lot of Blood - hat sehr viel Blut verloren - Большая кровопотеря - Mucha Sangre perdida - A perdu beaucoup de sang - Stracił dużo krwi - Perdeu muito sangue - Ztratil hodně krve - Perso molto Sangue - 大量失血しています - 많은 피를 흘림 - 大量失血 - 大量失血 - - - Tourniquet [CAT] - Tourniquet [CAT] - Жгут - Torniquete [CAT] - Garrot [CAT] - Opaska uciskowa [CAT] - Torniquete [CAT] - Škrtidlo [CAT] - Laccio Emostatico [CAT] - 止血帯 [CAT] - 지혈대 [CAT] - 军用止血带 - 軍用止血帶 - - - Nasopharyngeal Tube [NPA] - Nasen-Rachen-Rohr - Назотрахеальная трубка - Torniquete [CAT] - Canule Naseaupharyngée [NPA] - Rurka nosowo-gardłowa [NPA] - Tubo nasofaríngeo [NPA] - Nasofaryngeální trubice [NPA] - Tubo Nasofaringeo [NPA] - 鼻咽頭チューブ [NPA] - 비-인두 기도기 [NPA] - 鼻咽管 - 鼻咽管 - - - Medical Menu maximum range - 治療メニューの最大範囲 - 医疗菜单最大范围 - 醫療選單最大範圍 - Dirstanza menù medico - Maksymalny zasięg menu medycznego - - - Maximum distance from where the Medical Menu can be opened. - 你可以打开医疗菜单的最大范围 - 醫療選單可以開啟的最大距離 - 医疗选单可以开启的最大距离 - Massima distanza dalla quale si può aprire il menù medico. - Maksymalny dystans skąd menu medyczne może być otwarte. - - - diff --git a/addons/medical_menu/ui/menu.hpp b/addons/medical_menu/ui/menu.hpp deleted file mode 100644 index 0743dc93d53..00000000000 --- a/addons/medical_menu/ui/menu.hpp +++ /dev/null @@ -1,586 +0,0 @@ -#include "\z\ace\addons\common\define.hpp" - -class GVAR(medicalMenu) { - idd = 314412; - movingEnable = true; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([] call FUNC(onMenuClose)); - class controlsBackground { - class HeaderBackground: ACE_gui_backgroundBase { - idc = -1; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(0,0,0,0)"; - }; - class CenterBackground: HeaderBackground { - y = "2.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - h = "16 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(0,0,0,0.8)"; - colorText[] = {0, 0, 0, "(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - colorBackground[] = {0,0,0,"(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - }; - class BottomBackground: CenterBackground { - y = "(18.6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))"; - h = "9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - }; - }; - - class controls { - class HeaderName { - idc = 1; - type = CT_STATIC; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_LEFT + ST_SHADOW; - font = "RobotoCondensed"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {"(profilenamespace getVariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getVariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getVariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - text = ""; - }; - - class IconsBackGroundBar: ACE_gui_backgroundBase{ - idc = -1; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "2.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "3.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = QPATHTOF(data\background_img.paa); - colorText[] = {1, 1, 1, 0.0}; - }; - class CatagoryLeft: HeaderName { - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - colorText[] = {1, 1, 1.0, 0.9}; - colorBackground[] = {0,0,0,0}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; - text = CSTRING(EXAMINE_TREATMENT); - }; - class CatagoryCenter: CatagoryLeft { - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = CSTRING(STATUS); - }; - class CatagoryRight: CatagoryCenter{ - x = "25.66 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = CSTRING(OVERVIEW); - }; - class Line: ACE_gui_backgroundBase { - idc = -1; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "37 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.03 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(1,1,1,0.5)"; - }; - - class iconImg1: ACE_gui_backgroundBase { - idc = 111; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.1)"; - colorBackground[] = {0,0,0,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOF(data\icons\triage_card_small.paa); - }; - class iconImg2: iconImg1 { - idc = 112; - x = "3 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\examine_patient_small.paa); - }; - class iconImg3: iconImg1 { - idc = 113; - x = "4.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\bandage_fracture_small.paa); - }; - class iconImg4: iconImg1 { - idc = 114; - x = "6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\medication_small.paa); - }; - class iconImg5: iconImg1 { - idc = 115; - x = "7.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\airway_management_small.paa); - }; - class iconImg6: iconImg1 { - idc = 116; - x = "9 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\advanced_treatment_small.paa); - }; - class iconImg7: iconImg1 { - idc = 117; - x = "10.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\icon_carry.paa); - }; - class iconImg8: iconImg1 { - idc = 118; - x = "12 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\toggle_self_small.paa); - }; - - - class BtnIconLeft1: ACE_gui_buttonBase { - idc = 11; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE(['triage'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft2: BtnIconLeft1 { - idc = 12; - x = "3 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['examine'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft3: BtnIconLeft1 { - idc = 13; - x = "4.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['bandage'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft4: BtnIconLeft1 { - idc = 14; - x = "6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['medication'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft5: BtnIconLeft1 { - idc = 15; - x = "7.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['airway'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft6: BtnIconLeft1 { - idc = 16; - x = "9 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['advanced'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft7: BtnIconLeft1 { - idc = 17; - x = "10.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['drag'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft8: BtnIconLeft1 { - idc = 18; - x = "12 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['toggle'] call FUNC(handleUI_DisplayOptions);); - }; - - class TriageCardList: ACE_gui_listBoxBase { - idc = 212; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "10 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - colorBackground[] = {0, 0, 0, 0.2}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {0.95, 0.95, 0.95, 1}; - colorSelect2[] = {0.95, 0.95, 0.95, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - }; - - // Left side - class BtnMenu1: BtnIconLeft1 { - idc = 20; - y = "5.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = ""; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.9)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.8)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.5)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - color[] = {1, 1, 1, 1}; - color2[] = {0,0,0, 1}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground[] = {1,1,1,1}; - colorbackground2[] = {1,1,1,1}; - colorDisabled[] = {0.5,0.5,0.5,0.8}; - colorFocused[] = {0,0,0,1}; - periodFocus = 1; - periodOver = 1; - action = ""; - }; - class BtnMenu2: BtnMenu1 { - idc = 21; - y = "6.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu3: BtnMenu1 { - idc = 22; - y = "7.6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu4: BtnMenu1 { - idc = 23; - y = "8.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text =""; - }; - class BtnMenu5: BtnMenu1 { - idc = 24; - y = "9.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu6: BtnMenu1 { - idc = 25; - y = "10.9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu7: BtnMenu1 { - idc = 26; - y = "12 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu8: BtnMenu1 { - idc = 27; - y = "13.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - // center - - class bodyImgBackground: ACE_gui_backgroundBase { - idc = -1; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "12.33 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOEF(medical,ui\body_background.paa); - }; - class bodyImgHead: bodyImgBackground { - idc = 50; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "12.33 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,0.75}; - colorText[] = {1,1,1,0.75}; - text = QPATHTOEF(medical,ui\body_head.paa); - }; - - class bodyImgTorso: bodyImgHead { - idc = 51; - text = QPATHTOEF(medical,ui\body_torso.paa); - }; - class bodyImgArms_l: bodyImgHead { - idc = 52; - text = QPATHTOEF(medical,ui\body_arm_left.paa); - }; - class bodyImgArms_r: bodyImgHead { - idc = 53; - text = QPATHTOEF(medical,ui\body_arm_right.paa); - }; - class bodyImgLegs_l: bodyImgHead { - idc = 54; - text = QPATHTOEF(medical,ui\body_leg_left.paa); - }; - class bodyImgLegs_r: bodyImgHead { - idc = 55; - text = QPATHTOEF(medical,ui\body_leg_right.paa); - }; - class bodyImgTournAL: bodyImgHead { - idc = 56; - text = QPATHTOEF(medical,ui\tourniquet_arm_left.paa); - }; - class bodyImgTournAR: bodyImgHead { - idc = 57; - text = QPATHTOEF(medical,ui\tourniquet_arm_right.paa); - }; - class bodyImgTournLL: bodyImgHead { - idc = 58; - text = QPATHTOEF(medical,ui\tourniquet_leg_left.paa); - }; - class bodyImgTournLR: bodyImgHead { - idc = 59; - text = QPATHTOEF(medical,ui\tourniquet_leg_right.paa); - }; - - - class selectHead: ACE_gui_buttonBase { - idc = 301; - x = "18.8 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.4 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE(GVAR(selectedBodyPart) = 0;); - }; - class selectTorso : selectHead { - idc = 302; - x = "18.4 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "2.2 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "4.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - action = QUOTE(GVAR(selectedBodyPart) = 1;); - }; - class selectLeftArm: selectHead{ - idc = 303; - x = "17.4 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.1 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "4.3 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - action = QUOTE(GVAR(selectedBodyPart) = 3;); - }; - class selectRightArm: selectLeftArm{ - idc = 304; - x = "20.6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(GVAR(selectedBodyPart) = 2;); - }; - class selectLeftLeg :selectHead { - idc = 305; - x = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "9.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.1 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - action = QUOTE(GVAR(selectedBodyPart) = 5;); - }; - class selectRightLeg :selectLeftLeg { - idc = 306; - x = "19.6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(GVAR(selectedBodyPart) = 4;); - }; - - - class TriageTextBottom: HeaderName { - idc = 2000; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "16.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - colorText[] = {1, 1, 1.0, 1}; - colorBackground[] = {0,0.0,0.0,0.7}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - }; - - // Right side - class InjuryList: ACE_gui_listBoxBase { - idc = 213; - x = "25.66 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "10 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - colorBackground[] = {0, 0, 0, 0.2}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {0.95, 0.95, 0.95, 1}; - colorSelect2[] = {0.95, 0.95, 0.95, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.5}; - }; - // bottom - - class ActivityLogHeader: CatagoryLeft { - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "18.6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - colorText[] = {0.6, 0.7, 1.0, 1}; - colorBackground[] = {0,0,0,0}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = CSTRING(ACTIVITY_LOG); - }; - class QuickViewHeader: ActivityLogHeader { - x = "19.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = CSTRING(QUICK_VIEW); - }; - class LineBottomHeaders: Line { - y = "19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - }; - class ActivityLog: InjuryList { - idc = 214; - //style = 16; - //type = 102; - //rows=1; - colorBackground[] = {0, 0, 0, 0}; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "(19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))"; - w = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "6.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - //colorSelectBackground[] = {0, 0, 0, 0.0}; - //colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - //columns[] = {0.0, 0.08}; - //canDrag=true; - //arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; - // arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; - drawSideArrows = 0; - //idcLeft = -1; - //idcRight = -1; - }; - - class QuikViewLog: InjuryList { - idc = 215; - //style = 16; - //type = 102; - //rows=1; - colorBackground[] = {0, 0, 0, 0}; - x = "21.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "(19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))"; - w = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "6.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - - //columns[] = {0.0, 0.08}; - //canDrag=true; - //arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; - // arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; - drawSideArrows = 0; - //idcLeft = -1; - //idcRight = -1; - }; - - class selectTriageStatus: ACE_gui_buttonBase { - idc = 2001; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "16.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard);); - }; - class selectTriageStatusNone: selectTriageStatus { - idc = 2002; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_None); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),0)] call FUNC(setTriageStatus);); - }; - - class selectTriageStatusMinor: selectTriageStatus { - idc = 2003; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Minor); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),1)] call FUNC(setTriageStatus);); - }; - class selectTriageStatusDelayed: selectTriageStatus { - idc = 2004; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Delayed); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),2)] call FUNC(setTriageStatus);); - }; - class selectTriageStatusImmediate: selectTriageStatus { - idc = 2005; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Immediate); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureOver = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),3)] call FUNC(setTriageStatus);); - }; - class selectTriageStatusDeceased: selectTriageStatus { - idc = 2006; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Deceased); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),4)] call FUNC(setTriageStatus);); - }; - }; -}; diff --git a/addons/medical_statemachine/$PBOPREFIX$ b/addons/medical_statemachine/$PBOPREFIX$ new file mode 100644 index 00000000000..08235272dc3 --- /dev/null +++ b/addons/medical_statemachine/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_statemachine diff --git a/addons/medical_statemachine/CfgEventHandlers.hpp b/addons/medical_statemachine/CfgEventHandlers.hpp new file mode 100644 index 00000000000..7196bf8aaf5 --- /dev/null +++ b/addons/medical_statemachine/CfgEventHandlers.hpp @@ -0,0 +1,29 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_Respawn_EventHandlers { + class CAManBase { + class ADDON { + respawn = QUOTE(call FUNC(resetStateDefault)); + exclude[] = {IGNORE_BASE_UAVPILOTS}; + }; + }; +}; + +class Extended_Local_EventHandlers { + class CAManBase { + class ADDON { + local = QUOTE(call FUNC(localityChangedEH)); + exclude[] = {IGNORE_BASE_UAVPILOTS}; + }; + }; +}; diff --git a/addons/medical_statemachine/Statemachine.hpp b/addons/medical_statemachine/Statemachine.hpp new file mode 100644 index 00000000000..17a4baaf076 --- /dev/null +++ b/addons/medical_statemachine/Statemachine.hpp @@ -0,0 +1,113 @@ +// Manual transitions applied to this statemachine +// - fnc_resetStateDefault on unit respawn +class ACE_Medical_StateMachine { + list = QUOTE(call EFUNC(common,getLocalUnits)); + skipNull = 1; + class Default { + onState = QFUNC(handleStateDefault); + class Injury { + targetState = "Injured"; + events[] = {QEGVAR(medical,injured), QEGVAR(medical,LoweredVitals)}; + }; + class CriticalInjuryOrVitals { + targetState = "Unconscious"; + events[] = {QEGVAR(medical,CriticalInjury), QEGVAR(medical,CriticalVitals), QEGVAR(medical,knockOut)}; + }; + class FatalVitals { + targetState = "CardiacArrest"; + events[] = {QEGVAR(medical,FatalVitals), QEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QEGVAR(medical,FatalInjury)}; + }; + }; + class Injured { + onState = QFUNC(handleStateInjured); + class FullHeal { + targetState = "Default"; + events[] = {QEGVAR(medical,FullHeal)}; + }; + class CriticalInjuryOrVitals { + targetState = "Unconscious"; + events[] = {QEGVAR(medical,CriticalInjury), QEGVAR(medical,CriticalVitals), QEGVAR(medical,knockOut)}; + }; + class FatalVitals { + targetState = "CardiacArrest"; + events[] = {QEGVAR(medical,FatalVitals), QEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QEGVAR(medical,FatalInjury)}; + }; + }; + class Unconscious { + onState = QFUNC(handleStateUnconscious); + onStateEntered = QUOTE([ARR_2(_this,true)] call EFUNC(medical_status,setUnconsciousState)); + class DeathAI { + targetState = "Dead"; + condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this}); + }; + class WakeUp { + targetState = "Injured"; + condition = QEFUNC(medical_status,hasStableVitals); + events[] = {QEGVAR(medical,WakeUp)}; + onTransition = QUOTE([ARR_2(_this,false)] call EFUNC(medical_status,setUnconsciousState)); + }; + class FatalTransitions { + targetState = "CardiacArrest"; + events[] = {QEGVAR(medical,FatalVitals), QEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QEGVAR(medical,FatalInjury)}; + }; + }; + class FatalInjury { + // Transition state for handling instant death from fatal injuries + // This state raises the next transition in the same frame + onStateEntered = QFUNC(enteredStateFatalInjury); + class SecondChance { + events[] = {QEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "CardiacArrest"; + condition = QFUNC(conditionSecondChance); + onTransition = QFUNC(transitionSecondChance); + }; + class Death { + events[] = {QEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "Dead"; + }; + }; + class CardiacArrest { + onState = QFUNC(handleStateCardiacArrest); + onStateEntered = QFUNC(enteredStateCardiacArrest); + onStateLeaving = QFUNC(leftStateCardiacArrest); + class DeathAI { + // If an AI unit reanimates, they will immediately die upon entering unconsciousness if AI Unconsciousness is disabled + // As a result, we immediately kill the AI unit since cardiac arrest is effectively useless for it + targetState = "Dead"; + condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this}); + }; + class Timeout { + targetState = "Dead"; + condition = QFUNC(conditionCardiacArrestTimer); + }; + class Reanimation { + targetState = "Unconscious"; + events[] = {QEGVAR(medical,CPRSucceeded)}; + }; + class Execution { + targetState = "Dead"; + condition = QFUNC(conditionExecutionDeath); + events[] = {QEGVAR(medical,FatalInjury)}; + }; + class Bleedout { + targetState = "Dead"; + events[] = {QEGVAR(medical,Bleedout)}; + }; + }; + class Dead { + // When the unit is killed it's no longer handled by the statemachine + onStateEntered = QFUNC(enteredStateDeath); + }; +}; diff --git a/addons/medical_statemachine/XEH_PREP.hpp b/addons/medical_statemachine/XEH_PREP.hpp new file mode 100644 index 00000000000..38d0cb573a9 --- /dev/null +++ b/addons/medical_statemachine/XEH_PREP.hpp @@ -0,0 +1,14 @@ +PREP(conditionCardiacArrestTimer); +PREP(conditionExecutionDeath); +PREP(conditionSecondChance); +PREP(enteredStateCardiacArrest); +PREP(enteredStateDeath); +PREP(enteredStateFatalInjury); +PREP(handleStateCardiacArrest); +PREP(handleStateDefault); +PREP(handleStateInjured); +PREP(handleStateUnconscious); +PREP(leftStateCardiacArrest); +PREP(localityChangedEH); +PREP(resetStateDefault); +PREP(transitionSecondChance); diff --git a/addons/medical_statemachine/XEH_preInit.sqf b/addons/medical_statemachine/XEH_preInit.sqf new file mode 100644 index 00000000000..d77d8067a81 --- /dev/null +++ b/addons/medical_statemachine/XEH_preInit.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +EGVAR(medical,STATE_MACHINE) = (configFile >> "ACE_Medical_StateMachine") call CBA_statemachine_fnc_createFromConfig; + +ADDON = true; diff --git a/addons/medical_statemachine/XEH_preStart.sqf b/addons/medical_statemachine/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_statemachine/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_statemachine/config.cpp b/addons/medical_statemachine/config.cpp new file mode 100644 index 00000000000..23a55f52587 --- /dev/null +++ b/addons/medical_statemachine/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_vitals"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "Statemachine.hpp" +#include "CfgEventHandlers.hpp" diff --git a/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf b/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf new file mode 100644 index 00000000000..b28459db53e --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Checks if the cardiac arrest timer ran out. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_conditionCardiacArrestTimer + * + * Public: No + */ + +params ["_unit"]; + +(_unit getVariable [QGVAR(cardiacArrestTimeLeft), -1]) <= 0 diff --git a/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf b/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf new file mode 100644 index 00000000000..26ff20c42a5 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Condition for an execution caused death (fatal injury received in cardiac arrest). + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_conditionExecutionDeath + * + * Public: No + */ + +params ["_unit"]; + +(if (isPlayer _unit) then { + GVAR(fatalInjuriesPlayer) != FATAL_INJURIES_NEVER +} else { + GVAR(fatalInjuriesAI) != FATAL_INJURIES_NEVER +}) +&& {!(_unit getVariable [QEGVAR(medical,deathBlocked), false])} diff --git a/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf b/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf new file mode 100644 index 00000000000..660ea84ac11 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Condition for going into cardiac arrest upon receiving a fatal injury. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_conditionSecondChance + * + * Public: No + */ + +params ["_unit"]; + +if (isPlayer _unit) then { + GVAR(fatalInjuriesPlayer) != FATAL_INJURIES_ALWAYS +} else { + GVAR(fatalInjuriesAI) != FATAL_INJURIES_ALWAYS +} diff --git a/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf new file mode 100644 index 00000000000..b2bcde8071f --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles a unit entering cardiac arrest (calls for a status update). + * Sets required variables for countdown timer until death. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateCardiacArrest + * + * Public: No + */ + +params ["_unit"]; + +// 10% possible variance in cardiac arrest time +private _time = GVAR(cardiacArrestTime); +_time = _time + _time * random [-0.1, 0, 0.1]; + +_unit setVariable [QGVAR(cardiacArrestTimeLeft), _time]; +_unit setVariable [QGVAR(cardiacArrestTimeLastUpdate), CBA_missionTime]; + +TRACE_3("enteredStateCardiacArrest",_unit,_time,CBA_missionTime); + +// Update the unit status to reflect cardiac arrest +[_unit, true] call EFUNC(medical_status,setCardiacArrestState); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf new file mode 100644 index 00000000000..cb6f63c39a5 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Handles a unit reaching the point of death (calls for a status update). + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateDeath + * + * Public: No + */ + +params ["_unit"]; +if (isNull _unit) exitWith {}; + +//IGNORE_PRIVATE_WARNING ["_thisOrigin", "_thisTransition"]; // vars provided by CBA_statemachine +TRACE_3("enteredStateDeath",_this,_thisOrigin,_thisTransition); + +private _causeOfDeath = format ["%1:%2", _thisOrigin, _thisTransition]; + +// could delay a frame here to fix the double killed EH, but we lose it being a "native" kill (scoreboard / rating) +[_unit, _causeOfDeath] call EFUNC(medical_status,setDead); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf new file mode 100644 index 00000000000..04121b1c959 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Raises the transition to the next state instantly when fatally injured. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateFatalInjury + * + * Public: No + */ + +params ["_unit"]; + +[QEGVAR(medical,FatalInjuryInstantTransition), _unit] call CBA_fnc_localEvent; diff --git a/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf new file mode 100644 index 00000000000..b9e49adfe33 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the unconscious state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateCardiacArrest + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit) exitWith {}; +if (!local _unit) exitWith {}; + +[_unit] call EFUNC(medical_vitals,handleUnitVitals); + +private _timeDiff = CBA_missionTime - (_unit getVariable [QGVAR(cardiacArrestTimeLastUpdate), 0]); +if (_timeDiff >= 1) then { + _timeDiff = _timeDiff min 10; + _unit setVariable [QGVAR(cardiacArrestTimeLastUpdate), CBA_missionTime]; + private _recieveingCPR = alive (_unit getVariable [QEGVAR(medical,CPR_provider), objNull]); + private _timeLeft = _unit getVariable [QGVAR(cardiacArrestTimeLeft), -1]; + TRACE_3("cardiac arrest life tick",_unit,_recieveingCPR,_timeDiff); + if (_recieveingCPR) then { _timeDiff = _timeDiff * 0.5; }; // if being cpr'ed, then time decrease is reduced + _timeLeft = _timeLeft - _timeDiff; // negative values are fine + _unit setVariable [QGVAR(cardiacArrestTimeLeft), _timeLeft]; +}; + diff --git a/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf new file mode 100644 index 00000000000..f1fdada8dc0 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the default state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateDefault + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit) exitWith {}; +if (!local _unit) exitWith {}; + +if ([_unit] call EFUNC(medical_vitals,handleUnitVitals)) then { // returns true when update ran + private _painLevel = GET_PAIN_PERCEIVED(_unit); + if (_painLevel > 0) then { + [QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent; + }; +}; diff --git a/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf new file mode 100644 index 00000000000..6bdd3e07d3b --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the injured state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateInjured + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit) exitWith {}; +if (!local _unit) exitWith {}; + +if ([_unit] call EFUNC(medical_vitals,handleUnitVitals)) then { // returns true when update ran + private _painLevel = GET_PAIN_PERCEIVED(_unit); + if (_painLevel > 0) then { + [QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent; + }; +}; diff --git a/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf b/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf new file mode 100644 index 00000000000..0cdc4e1d944 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the unconscious state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateUnconscious + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit || {!local _unit}) exitWith {}; + +[_unit] call EFUNC(medical_vitals,handleUnitVitals); + +// Handle spontaneous wake up from unconsciousness +if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { + if (_unit call EFUNC(medical_status,hasStableVitals)) then { + private _lastWakeUpCheck = _unit getVariable QEGVAR(medical,lastWakeUpCheck); + + // Handle setting being changed mid-mission and still properly check + // already unconscious units, should handle locality changes as well + if (isNil "_lastWakeUpCheck") exitWith { + TRACE_1("undefined lastWakeUpCheck: setting to current time",_lastWakeUpCheck); + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; + }; + + private _wakeUpCheckInterval = SPONTANEOUS_WAKE_UP_INTERVAL; + if (EGVAR(medical,spontaneousWakeUpEpinephrineBoost) > 1) then { + private _epiEffectiveness = [_unit, "Epinephrine", false] call EFUNC(medical_status,getMedicationCount); + _wakeUpCheckInterval = _wakeUpCheckInterval * linearConversion [0, 1, _epiEffectiveness, 1, 1 / EGVAR(medical,spontaneousWakeUpEpinephrineBoost), true]; + TRACE_2("epiBoost",_epiEffectiveness,_wakeUpCheckInterval); + }; + if (CBA_missionTime - _lastWakeUpCheck > _wakeUpCheckInterval) then { + TRACE_2("Checking for wake up",_unit,EGVAR(medical,spontaneousWakeUpChance)); + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; + + if (random 1 <= EGVAR(medical,spontaneousWakeUpChance)) then { + TRACE_1("Spontaneous wake up!",_unit); + [QEGVAR(medical,WakeUp), _unit] call CBA_fnc_localEvent; + }; + }; + } else { + // Unstable vitals, procrastinate the next wakeup check + private _lastWakeUpCheck = _unit getVariable [QEGVAR(medical,lastWakeUpCheck), 0]; + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), _lastWakeUpCheck max CBA_missionTime]; + }; +}; diff --git a/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf new file mode 100644 index 00000000000..2f0793f7c75 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: RedBery + * Handles a unit leaving cardiac arrest (calls for a status update). + * Clears countdown timer variables. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_leftStateCardiacArrest + * + * Public: No + */ + +params ["_unit"]; +TRACE_1("leftStateCardiacArrest",_unit); + +_unit setVariable [QGVAR(cardiacArrestTimeLeft), nil]; +_unit setVariable [QGVAR(cardiacArrestTimeLastUpdate), nil]; + +[_unit, false] call EFUNC(medical_status,setCardiacArrestState); diff --git a/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf b/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf new file mode 100644 index 00000000000..9e5fb3c9b50 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf @@ -0,0 +1,69 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Handles locality switch. Will also be called at unit init. + * Because state machine state is local only, when a unit transfers locality we need to manually transition to it's current state + * + * Arguments: + * 0: Unit + * 1: isLocal + * + * Return Value: + * None + * + * Example: + * [player, true] call ace_medical_statemachine_fnc_localityChangedEH + * + * Public: No + */ + +params ["_unit", "_isLocal"]; +TRACE_2("localityChangedEH",_unit,_isLocal); + +if (!alive _unit) exitWith {}; + +if (_isLocal) then { + private _currentState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + TRACE_1("local",_currentState); + + switch (true) do { + case (IN_CRDC_ARRST(_unit)): { + if (_currentState == "CardiacArrest") exitWith {}; + _unit setVariable [VAR_CRDC_ARRST, false]; // force reset vars so setCardiacArrestState can run (enteredStateCardiacArrest will also be called) + _unit setVariable [VAR_UNCON, false]; + TRACE_1("manually changing state to CardiacArrest",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "CardiacArrest", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IS_UNCONSCIOUS(_unit)): { + if (_currentState == "Unconscious") exitWith {}; + _unit setVariable [VAR_UNCON, false]; // force reset var so ace_medical_status_fnc_setUnconsciousState can run + TRACE_1("manually changing state to Unconscious",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Unconscious", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IS_BLEEDING(_unit) || {IS_IN_PAIN(_unit)}): { + if (_currentState == "Injured") exitWith {}; + TRACE_1("manually changing state to Injured",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Injured", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + default { + // If locality transfers back and forth, we could be in an old state and should transfer back to default + if (_currentState == "Default") exitWith {}; + TRACE_1("manually changing state to Default",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Default", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + }; +} else { + /* + // Not sure if this is even needed, idea is that on locality transfer we broadcast more up to date info + + private _lastTimeUpdated = _unit getVariable [QEGVAR(medical_vitals,lastTimeUpdated), 1e99]; + private _deltaT = CBA_missionTime - _lastTimeUpdated; + TRACE_1("not local",_deltaT); + if (_deltaT < 5) then { + // If locality changed and we have recently updated vitals, broadcast globally now + _unit setVariable [VAR_HEART_RATE, GET_HEART_RATE(_unit), true]; + _unit setVariable [VAR_BLOOD_PRESS, _unit getVariable [VAR_BLOOD_PRESS, [80, 120]], true]; + _unit setVariable [VAR_BLOOD_VOL, GET_BLOOD_VOLUME(_unit), true]; + }; + */ +}; diff --git a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf new file mode 100644 index 00000000000..4cffd470769 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Resets the default state on a unit after respawning. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_resetStateDefault + * + * Public: No + */ + +params ["_unit"]; + +// Statemachine only handles local units +if !(local _unit) exitWith {}; + +[_unit, EGVAR(medical,STATE_MACHINE), "Dead", "Default"] call CBA_statemachine_fnc_manualTransition; diff --git a/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf b/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf new file mode 100644 index 00000000000..bdee0f94327 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Gives the unit a second chance and prevents death for 1 second. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_transitionSecondChance + * + * Public: No + */ + +params ["_unit"]; + +_unit setVariable [QEGVAR(medical,deathBlocked), true]; +[{ + _this setVariable [QEGVAR(medical,deathBlocked), false]; +}, _unit, 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_statemachine/functions/script_component.hpp b/addons/medical_statemachine/functions/script_component.hpp new file mode 100644 index 00000000000..5dd15bb8b41 --- /dev/null +++ b/addons/medical_statemachine/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_statemachine\script_component.hpp" diff --git a/addons/medical_statemachine/initSettings.sqf b/addons/medical_statemachine/initSettings.sqf new file mode 100644 index 00000000000..df66002ff9e --- /dev/null +++ b/addons/medical_statemachine/initSettings.sqf @@ -0,0 +1,43 @@ +[ + QGVAR(fatalInjuriesPlayer), + "LIST", + [LSTRING(FatalInjuriesPlayer_DisplayName), LSTRING(FatalInjuriesPlayer_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [ + [FATAL_INJURIES_ALWAYS, FATAL_INJURIES_CRDC_ARRST, FATAL_INJURIES_NEVER], + [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], + 0 + ], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(fatalInjuriesAI), + "LIST", + [LSTRING(FatalInjuriesAI_DisplayName), LSTRING(FatalInjuriesAI_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [ + [FATAL_INJURIES_ALWAYS, FATAL_INJURIES_CRDC_ARRST, FATAL_INJURIES_NEVER], + [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], + 0 + ], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(AIUnconsciousness), + "CHECKBOX", + [LSTRING(AIUnconsciousness_DisplayName), LSTRING(AIUnconsciousness_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(cardiacArrestTime), + "TIME", + [LSTRING(CardiacArrestTime_DisplayName), LSTRING(CardiacArrestTime_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [1, 3600, 300], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_statemachine/script_component.hpp b/addons/medical_statemachine/script_component.hpp new file mode 100644 index 00000000000..82ee57e12a9 --- /dev/null +++ b/addons/medical_statemachine/script_component.hpp @@ -0,0 +1,22 @@ +#define COMPONENT medical_statemachine +#define COMPONENT_BEAUTIFIED Medical State Machine +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_STATEMACHINE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_STATEMACHINE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_STATEMACHINE +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" + +#define FATAL_INJURIES_ALWAYS 0 +#define FATAL_INJURIES_CRDC_ARRST 1 +#define FATAL_INJURIES_NEVER 2 diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml new file mode 100644 index 00000000000..b4439308090 --- /dev/null +++ b/addons/medical_statemachine/stringtable.xml @@ -0,0 +1,137 @@ + + + + + States + Zustände + 状態 + Состояния + États + Estados + 狀態 + Stato + Stavy + Stany + Devletler + + + Player Fatal Injuries + Lesões Fatais do Jogador + プレイヤーの致命傷 + 玩家致命傷 + Décès si blessure mortelle (joueurs) + Smrtelná zranění hráčů + Śmiertelne Obrażenia Gracza + Lesioni mortali del giocatore + Oyuncu Ölümcül Yaralanmaları + Tödliche Spielerverletzungen + Смертельные травмы игрока + + + Controls when players can receive fatal injuries. A fatal injury is caused by significant damage to the head or torso. + Controla quando os jogadores podem receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco. + プレイヤーが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。 + 控制當玩家受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。 + Détermine si les joueurs décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur. + Oyuncuların ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafaya veya vücuda önemli hasar verir. + Nastavuje zda hráči mohou utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu. + Controlla quando i giocatori possono ricevere infortuni mortali. Una lesione mortale è causata da un danno significativo alla testa o al busto. + Definiuje, kiedy gracze mogą otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu. + Legt fest, wann Spieler tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Torso verursacht. + Определяет, могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища. + + + AI Fatal Injuries + Lesões Fatais da IA + AI の致命傷 + AI致命傷 + Décès si blessure mortelle (IA) + Smrtelná zranění AI + Śmiertelne obrażenia AI. + AI Lesioni mortali + AI Ölümcül Yaralanmaları + Tödliche KI-Verletzungen + Смертельные травмы ИИ + + + Controls when AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or troso.\nWhen set to "Always", this effectively produces "AI Instant Death" behaviour as AI will immediately die from any fatal injury.\nNOTE: Any mode other than "Always" requires AI Unconsciousness to be enabled. + Controla quando a IA pode receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco.\nQuando definido para "Sempre", isso efetivamente causa a "Morte Instantânea da IA", pois a IA irá imediatamente morrer para qualquer lesão fatal.\nNOTA: Qualquer opção além de "Sempre" requer que Inconsciência de IA esteja ativada. + AI が致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。\n"常に"に設定されていると、いかなる致命傷でも "AI の即死" 効果が生まれます。\n注: "常に"以外のモードでは AI の無意識化を有効化させる必要があります。 + 控制當AI受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。\n當設置為"總是"時,這會使其與"AI 瞬間死亡"同一個效果,在AI受到致命傷時瞬間死亡。\n備註:選了"總是"以外的選項的話必須開啟「AI無意識」的選項。 + Détermine si les unités IA décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur.\nSi réglé sur "Toujours", cela produit effectivement un comportement de "Mort instantanée" car les unités IA mourront immédiatement de toute blessure mortelle.\nNOTE : Tout mode autre que "Toujours" nécessite l'activation de l'option "Inconscience IA". + AI'nın ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafa veya vücudun önemli hasar görmesinden kaynaklanır. \"Her zaman" olarak ayarlandığında, AI herhangi bir ölümcül yaralanmadan hemen öleceği için bu etkili bir şekilde "AI Anında Ölüm" davranışı üretir.\ NOT: "Her zaman" "Yapay Zeka Bilinci'nin etkinleştirilmesini gerektirir. + Nastavuje zda AI může utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu.\nPokud je tato možnost nastavena na "Vždy", efektivně nastává stav "Povolit okamžitou smrt AI", protože AI okamžitě zemře při jakémkoliv smrtelném zranění.\nPOZNÁMKA: Jakýkoliv jiný stav než "Vždy" potřebuje zapnutou možnost "Bezvědomí AI". + Controlla quando l'IA può ricevere ferite mortali. Una lesione mortale è causata da un danno significativo alla testa o al torso.\nSe impostato su "Sempre", questo produce efficacemente il comportamento "Morte istantanea AI", poiché l'IA morirà immediatamente a causa di qualsiasi lesione mortale.\nNOTA: Qualsiasi modalità diversa da "Sempre" richiede l'attivazione dell'Incoscienza AI. + Definiuje, kiedy AI może otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu.\n Ustawienie "Zawsze" powoduje "Natychmiastową śmierć AI", ponieważ AI natychmiast umiera z powodu śmiertelnych obrażeń.\n UWAGA: Każdy inny tryb niż "Zawsze" wymaga włączenia nieprzytomności AI. + Legt fest, wann KI-Einheiten tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Körper verursacht.\nWenn "Immer" eingestellt ist, erzeugt diese Einstellung das "KI Sofort-Tod" Verhalten. KI-Einheiten sterben sofort durch jede tödliche Verletzung.\nBEACHTE: Eine andere Einstellung als "Immer" bedingt, dass "KI-Bewusstlosigkeit" verwendet wird. + Определяет могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища.\nКогда установлено «Всегда», это вызывает поведение «Мгновенной смерти ИИ», так как ИИ немедленно умрет от любой смертельной травмы.\nПРИМЕЧАНИЕ: Любой режим, кроме «Всегда», требует включения функции «Потеря сознания». + + + AI Unconsciousness + Потеря сознания ботами + Nieprzytomność AI + Inconsciencia IA + KI-Bewusstlosigkeit + Bezvědomí AI + Inconsciência da IA + Inconscience IA + AI eszméletlenség + Incoscienza IA + AI の気絶 + 인공지능 기절 + AI无意识 + AI無意識 + Yapay Zeka Bilinci + + + Controls whether AI can go unconscious instead of immediately dying.\nThis setting works together with the "AI Fatal Injuries" setting since, going into cardiac arrest requires that the unit is able to go unconscious.\nHowever, these settings are separated because units can go unconscious from critical vitals resulting from non-fatal injuries.\nIn essence, this means that in order to enable cardiac arrest for AI units, this setting must be enabled. + Controla se a IA pode ficar inconsciente ao invés de morrer imediatamente.\nEssa configuração funciona com "Lesões Fatais de IA", pois para uma unidade ter uma parada cardíaca é necessário que a IA possa fica inconsciente.\nContudo, essas configurações são separadas pois unidades podem ficar inconscientes por vitais críticos causados por ferimentos não-fatais.\nEssencialmente, isso significa que para ativar uma parada cardíaca em IA, essa configuração precisa estar ativa. + AI が即死する代わりに気絶するかどうかを決定できます。\nこれは "AI の致命傷" 設定と連動します。これは AI の進呈しを起こすにはユニットが気絶する必要がある為です。\nしかしながら、これらの設定はユニットが非致死性の負傷により重体となって気絶できるよう分離されています。\n本質的にはこの設定は AI ユニットの心停止を可能にするものであり、有効化されておくべきです。 + 控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「AI致命傷」的選項聯動,使單位心搏停止的話必須先讓其無意識。\n然而,兩個設定分開之原因是使單位能因從非致命傷的攻擊情況下進入生命危險的狀態。\n簡單來說,你想要讓AI單位有心搏停止可能的話,該選項必須啟用。 + Définit si les unités IA peuvent perdre connaissance au lieu de mourir immédiatement.\nCe paramètre fonctionne conjointement avec l'option "Décès si blessure mortelle (IA)" car, pour qu'une unité IA subisse un arrêt cardiaque, elle doit également pouvoir perdre connaissance.\nCependant, ces paramètres sont séparés car les unités peuvent s'évanouir suite à des signes vitaux critiques résultant de blessures non mortelles.\nEn résumé, cela signifie que ce paramètre doit absolument être activé pour qu'une unité IA puisse entrer en état d'arrêt cardiaque. + Nastavuje zda AI může upadnout do bezvědomí namísto okamžité smrti.\nToto nastavení funguje společně s "Smrtelná zranění AI" protože srdeční zástava potřebuje možnost upadnout do bezvědomí.\nTyto možnosti jsou separované, protože jednotky mohou upadnout do bezvědomí kvůli kritickému stavu způsobenému ne smrtelnými zraněními.\nV podstatě to znamená, že pokud chcete zapnout srdeční zástavu pro AI, tato možnost musí být zapnutá. + Definiuje, czy AI może stracić przytomność zamiast natychmiast zginąć.\n Ta opcja działa razem z ustawieniem "Śmiertelne urazy AI", ponieważ przejście do zatrzymania akcji serca wymaga, aby jednostka mogła stracić przytomność.\n Jednak te ustawienia są rozdzielone, ponieważ jednostki mogą stracić przytomność z powodu krytycznych czynności życiowych powstałych w wyniku urazów innych niż śmiertelne.\n W istocie oznacza to, że aby umożliwić zatrzymanie akcji serca dla jednostek AI, to ustawienie musi być włączone. + Controlla se l'IA può perdere i sensi invece di morire immediatamente. Questa impostazione funziona insieme all'impostazione "AI Fatal Injuries" poiché, per andare in arresto cardiaco, è necessario che l'unità sia in grado di perdere i sensi. Tuttavia, queste impostazioni sono separate perché le unità possono perdere i sensi da segni vitali critici derivanti da lesioni non mortali. + Kontrolliert, ob KI bewusstlos werden kann anstatt sofort zu sterben.\nDiese Einstellung funktioniert zusammen mit der Einstellung "Tödliche KI-Verletzungen". Denn wenn eine Einheit einen Herzstillstand erleiden soll, muss diese auch in der Lage sein, bewusstlos zu werden.\nDennoch sind diese beiden Einstellungen voneinander getrennt, da Einheiten auch durch kritische Vitalwerte bewusstlos werden können, die durch nicht tödliche Verletzungen aufgetreten sind.\nZusammengefasst bedeutet das, dass wenn KI-Einheiten einen Herzstillstand erleiden sollen, diese Einstellung aktiviert sein muss. + Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен. + + + Cardiac Arrest Time + Zeit bis zum Herzstillstand + 心停止時間 + Длительность остановки сердца + Durée de l'arrêt cardiaque + Tempo de Parada Cardíaca + 心搏停止時間 + Tempo d'arresto cardiaco + Délka srdeční zástavy + Czas Zatrzymania Akcji Serca + Kalp Durma Süresi + + + Controls how long it takes to die from cardiac arrest. + どのくらいの時間、心停止すると死亡するかを決定します。 + Définit le temps qu'il faut pour mourir d'un arrêt cardiaque. + Контролирует, сколько времени требуется, чтобы умереть от остановки сердца. + Controla o tempo necessário para morrer para uma parada cardíaca. + 控制心搏停止後多久死亡 + Controlla quanto tempo ci vuole per morire di arresto cardiaco. + Nastavuje po jak dlouhé době pacient zemře kvůli srdeční zástavě. + Definiuje czas potrzebny na śmierć z powodu zatrzymania akcji serca. + Ne kadar süre de kalbi durarak ölmesini belirleyin. + + + In Cardiac Arrest + Herzstillstand + 心停止中 + При остановке сердца + Provoquer un arrêt cardiaque + Em Parada Cardíaca + 心搏停止中 + In arresto cardiaco + V srdeční zástavě + Zatrzymanie Akcji Serca + Kalbi Durdu + + + diff --git a/addons/medical_status/$PBOPREFIX$ b/addons/medical_status/$PBOPREFIX$ new file mode 100644 index 00000000000..c21e7332eb1 --- /dev/null +++ b/addons/medical_status/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_status diff --git a/addons/medical_status/ACE_settings.hpp b/addons/medical_status/ACE_settings.hpp new file mode 100644 index 00000000000..8613092861e --- /dev/null +++ b/addons/medical_status/ACE_settings.hpp @@ -0,0 +1,11 @@ +class ACE_Settings { + class EGVAR(medical,bleedingCoefficient) { + movedToSQF = 1; + }; + class EGVAR(medical,painCoefficient) { + movedToSQF = 1; + }; + class EGVAR(medical,ivFlowRate) { + movedToSQF = 1; + }; +}; diff --git a/addons/medical_status/CfgEventHandlers.hpp b/addons/medical_status/CfgEventHandlers.hpp new file mode 100644 index 00000000000..94a04d1af39 --- /dev/null +++ b/addons/medical_status/CfgEventHandlers.hpp @@ -0,0 +1,26 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; + +class Extended_Init_EventHandlers { + class CAManBase { + class ADDON { + init = QUOTE([ARR_2((_this select 0), false)] call FUNC(initUnit)); + exclude[] = {IGNORE_BASE_UAVPILOTS}; + }; + }; +}; diff --git a/addons/medical_status/XEH_PREP.hpp b/addons/medical_status/XEH_PREP.hpp new file mode 100644 index 00000000000..811c49c1031 --- /dev/null +++ b/addons/medical_status/XEH_PREP.hpp @@ -0,0 +1,18 @@ +PREP(addMedicationAdjustment); +PREP(adjustPainLevel); +PREP(getBloodLoss); +PREP(getBloodPressure); +PREP(getBloodVolumeChange); +PREP(getCardiacOutput); +PREP(getMedicationCount); +PREP(handleKilled); +PREP(handleKilledMission); +PREP(hasStableVitals); +PREP(initUnit); +PREP(isBeingCarried); +PREP(isBeingDragged); +PREP(isInStableCondition); +PREP(setCardiacArrestState); +PREP(setDead); +PREP(setUnconsciousState); +PREP(updateWoundBloodLoss); diff --git a/addons/medical_status/XEH_postInit.sqf b/addons/medical_status/XEH_postInit.sqf new file mode 100644 index 00000000000..9b7d186b46f --- /dev/null +++ b/addons/medical_status/XEH_postInit.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" + +// Handle pain changes on injury +[QEGVAR(medical,injured), LINKFUNC(adjustPainLevel)] call CBA_fnc_addEventHandler; diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf new file mode 100644 index 00000000000..aab312470dd --- /dev/null +++ b/addons/medical_status/XEH_preInit.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +// Add vanilla killed EH to unit to set correct killer +["CAManBase", "init", { + params ["_unit"]; + + private _config = [_unit] call CBA_fnc_getObjectConfig; + if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);}; + if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)}; + + // Hopefully this EH gets added first as it can only effect other EH called after it + private _ehIndex = _unit addEventHandler ["Killed", {_this call FUNC(handleKilled)}]; + #ifdef DEBUG_MODE_FULL + if (_ehIndex != 0) then { WARNING_1("killed EH not first [%1]",_ehIndex); }; + #endif +}, nil, [IGNORE_BASE_UAVPILOTS], true] call CBA_fnc_addClassEventHandler; + +addMissionEventHandler ["EntityKilled", {_this call FUNC(handleKilledMission)}]; + +ADDON = true; diff --git a/addons/medical_status/XEH_preStart.sqf b/addons/medical_status/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_status/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_status/config.cpp b/addons/medical_status/config.cpp new file mode 100644 index 00000000000..69c1b2fd277 --- /dev/null +++ b/addons/medical_status/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_engine"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_settings.hpp" +#include "CfgEventHandlers.hpp" diff --git a/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf b/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf new file mode 100644 index 00000000000..524b242b1a7 --- /dev/null +++ b/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut, PabstMirror + * Adds a medication and it's effects + * + * Arguments: + * 0: The Unit + * 1: Medication + * 2: Time in system for the adjustment to reach its peak + * 3: Duration the adjustment will have an effect + * 4: Heart Rate Adjust + * 5: Pain Suppress Adjust + * 6: Flow Adjust + * + * Return Value: + * None + * + * Example: + * [player, "Morphine", 120, 60, -10, 0.8, -10] call ace_medical_status_fnc_addMedicationAdjustment + */ +params ["_unit", "_medication", "_timeToMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust"]; +TRACE_7("addMedicationAdjustment",_unit,_medication,_timeToMaxEffect,_maxTimeInSystem,_hrAdjust,_painAdjust,_flowAdjust); + +if (_maxTimeInSystem <= 0) exitWith { WARNING_1("bad value for _maxTimeInSystem - %1",_this); }; +_timeToMaxEffect = _timeToMaxEffect max 1; + + +private _adjustments = _unit getVariable [VAR_MEDICATIONS, []]; + +_adjustments pushBack [_medication, CBA_missionTime, _timeToMaxEffect, _maxTimeInSystem, _hrAdjust, _painAdjust, _flowAdjust]; + +_unit setVariable [VAR_MEDICATIONS, _adjustments, true]; diff --git a/addons/medical_status/functions/fnc_adjustPainLevel.sqf b/addons/medical_status/functions/fnc_adjustPainLevel.sqf new file mode 100644 index 00000000000..c6df1adda38 --- /dev/null +++ b/addons/medical_status/functions/fnc_adjustPainLevel.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Interface to allow external modules to affect the pain level + * Sets the new pain level to the max between the input and current level + * + * Arguments: + * 0: The patient + * 1: Desired pain level (0 .. 1) + * + * Return Value: + * None + * + * Example: + * [guy, 0.5] call ace_medical_status_fnc_adjustPainLevel + * + * Public: No + */ + +params ["_unit", "_desiredPainLevel"]; + +if (!local _unit) exitWith { ERROR("unit is not local"); }; + +TRACE_2("adjustPainLevel",_unit,_desiredPainLevel); + +_desiredPainLevel = _desiredPainLevel * EGVAR(medical,painCoefficient); + +private _pain = GET_PAIN(_unit); +_pain = 0 max (_pain max _desiredPainLevel) min 1; + +_unit setVariable [VAR_PAIN, _pain]; diff --git a/addons/medical_status/functions/fnc_getBloodLoss.sqf b/addons/medical_status/functions/fnc_getBloodLoss.sqf new file mode 100644 index 00000000000..ca3cba77cd6 --- /dev/null +++ b/addons/medical_status/functions/fnc_getBloodLoss.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Calculate the total blood loss of a unit. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Total blood loss of unit (litres/second) + * + * Example: + * [player] call ace_medical_status_fnc_getBloodLoss + * + * Public: No + */ + +params ["_unit"]; + +private _woundBleeding = GET_WOUND_BLEEDING(_unit); +if (_woundBleeding == 0) exitWith {0}; + +private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); + +// even if heart stops blood will still flow slowly (gravity) +(_woundBleeding * (_cardiacOutput max 0.05) * EGVAR(medical,bleedingCoefficient)) diff --git a/addons/medical_status/functions/fnc_getBloodPressure.sqf b/addons/medical_status/functions/fnc_getBloodPressure.sqf new file mode 100644 index 00000000000..bbb0e5b65ef --- /dev/null +++ b/addons/medical_status/functions/fnc_getBloodPressure.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Calculate the blood pressure of a unit. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * 0: BloodPressure Low + * 1: BloodPressure High + * + * Example: + * [player] call ace_medical_status_fnc_getBloodPressure + * + * Public: No + */ + +// Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120. +#define MODIFIER_BP_HIGH 9.4736842 + +// Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80. +#define MODIFIER_BP_LOW 6.3157894 + +params ["_unit"]; + +private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); +private _resistance = _unit getVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES]; +private _bloodPressure = _cardiacOutput * _resistance; + +[round(_bloodPressure * MODIFIER_BP_LOW), round(_bloodPressure * MODIFIER_BP_HIGH)] diff --git a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf new file mode 100644 index 00000000000..c46338a4756 --- /dev/null +++ b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Calculates the blood volume change and decreases the IVs given to the unit. + * + * Arguments: + * 0: The Unit + * 1: Time since last update + * 2: Global Sync Values (bloodbags) + * + * Return Value: + * Blood volume change (liters per second) + * + * Example: + * [player, 1, true] call ace_medical_status_fnc_getBloodVolumeChange + * + * Public: No + */ + +params ["_unit", "_deltaT", "_syncValues"]; + +private _bloodVolumeChange = -_deltaT * GET_BLOOD_LOSS(_unit); + +if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then { + private _bloodBags = _unit getVariable [QEGVAR(medical,ivBags), []]; + private _tourniquets = GET_TOURNIQUETS(_unit); + + _bloodBags = _bloodBags apply { + _x params ["_bagVolumeRemaining", "_type", "_bodyPart"]; + + if (_tourniquets select _bodyPart == 0) then { + private _bagChange = (_deltaT * EGVAR(medical,ivFlowRate) * IV_CHANGE_PER_SECOND) min _bagVolumeRemaining; // absolute value of the change in miliLiters + _bagVolumeRemaining = _bagVolumeRemaining - _bagChange; + _bloodVolumeChange = _bloodVolumeChange + (_bagChange / 1000); + }; + + if (_bagVolumeRemaining < 0.01) then { + [] + } else { + [_bagVolumeRemaining, _type, _bodyPart] + }; + }; + + _bloodBags = _bloodBags - [[]]; // remove empty bags + + if (_bloodBags isEqualTo []) then { + _unit setVariable [QEGVAR(medical,ivBags), nil, true]; // no bags left - clear variable (always globaly sync this) + } else { + _unit setVariable [QEGVAR(medical,ivBags), _bloodBags, _syncValues]; + }; +}; + +_bloodVolumeChange diff --git a/addons/medical_status/functions/fnc_getCardiacOutput.sqf b/addons/medical_status/functions/fnc_getCardiacOutput.sqf new file mode 100644 index 00000000000..cf405b52bc6 --- /dev/null +++ b/addons/medical_status/functions/fnc_getCardiacOutput.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, SilentSpike + * Get the cardiac output from the Heart, based on current Heart Rate and Blood Volume. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Current cardiac output (liter per second) + * + * Example: + * [player] call ace_medical_status_fnc_getCardiacOutput + * + * Public: No + */ + +/* + Cardiac output (Q or or CO ) is the volume of blood being pumped by the heart, in particular by a left or right ventricle in the CBA_missionTime interval of one second. CO may be measured in many ways, for example dm3/min (1 dm3 equals 1 liter). + Source: http://en.wikipedia.org/wiki/Cardiac_output +*/ + +// Value taken from https://doi.org/10.1093%2Feurheartj%2Fehl336 +// as 94/95 ml ± 15 ml +#define VENTRICLE_STROKE_VOL 95e-3 + +params ["_unit"]; + +private _bloodVolumeRatio = GET_BLOOD_VOLUME(_unit) / DEFAULT_BLOOD_VOLUME; +private _heartRate = GET_HEART_RATE(_unit); + +// Blood volume ratio dictates how much is entering the ventricle (this is an approximation) +private _entering = linearConversion [0.5, 1, _bloodVolumeRatio, 0, 1, true]; + +private _cardiacOutput = (_entering * VENTRICLE_STROKE_VOL) * _heartRate / 60; + +0 max _cardiacOutput diff --git a/addons/medical_status/functions/fnc_getMedicationCount.sqf b/addons/medical_status/functions/fnc_getMedicationCount.sqf new file mode 100644 index 00000000000..5c8b3bfd57b --- /dev/null +++ b/addons/medical_status/functions/fnc_getMedicationCount.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Gets effective count of medications in a unit's system + * (each medication dose is scaled from 0..1 based on time till max effect and max time in system) + * + * Arguments: + * 0: The patient + * 1: Medication (not case sensitive) + * 2: Get raw count (true) or effect ratio (false) (default: true) + * + * Return Value: + * Medication count (float) + * + * Example: + * [player, "Epinephrine"] call ace_medical_status_fnc_getMedicationCount + * + * Public: No + */ + +params ["_target", "_medication", ["_getCount", true]]; + +private _return = 0; +{ + _x params ["_xMed", "_timeAdded", "_timeTillMaxEffect", "_maxTimeInSystem"]; + if (_xMed == _medication) then { + private _timeInSystem = CBA_missionTime - _timeAdded; + if (_getCount) then { + // just return effective count, a medication will always start at 1 and only drop after reaching timeTilMaxEffect + _return = _return + linearConversion [_timeTillMaxEffect, _maxTimeInSystem, _timeInSystem, 1, 0, true]; + } else { + // as used in handleUnitVitals, a medication effectiveness will start low, ramp up to timeTillMaxEffect, and then drop off + _return = _return + (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + }; + }; +} forEach (_target getVariable [VAR_MEDICATIONS, []]); + +TRACE_4("getMedicationCount",_target,_medication,_getCount,_return); +_return diff --git a/addons/medical_status/functions/fnc_handleKilled.sqf b/addons/medical_status/functions/fnc_handleKilled.sqf new file mode 100644 index 00000000000..fb695d6f2bb --- /dev/null +++ b/addons/medical_status/functions/fnc_handleKilled.sqf @@ -0,0 +1,52 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Vanilla Killed EH, attempts to set correct source/killer for other killed event handlers (vanilla and XEH) + * + * Arguments: + * 0: Unit + * 1: Killer + * 2: Instigator + * 3: Use Effects + * + * Return Value: + * None + * + * Example: + * [cursorObject, player, player, true] call ace_medical_status_fnc_handleKilled + * + * Public: No + */ + +params ["_unit", "_killer", "_instigator", "_useEffects"]; +TRACE_4("handleKilled",_unit,_killer,_instigator,_useEffects); + +// ensure event is only called once +if (_unit isEqualTo (_unit getVariable [QGVAR(killed), objNull])) exitWith { + _this set [0, objNull]; + _this set [1, objNull]; + _this set [2, objNull]; +}; +_unit setVariable [QGVAR(killed), _unit]; + +private _causeOfDeath = _unit getVariable [QEGVAR(medical,causeOfDeath), "#scripted"]; + +// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect) +if (_causeOfDeath != "#scripted") then { + _killer = _unit getVariable [QEGVAR(medical,lastDamageSource), _killer]; // vehicle + _instigator = _unit getVariable [QEGVAR(medical,lastInstigator), _instigator]; // unit in the turret + + // All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator + if (missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]) then { // getVar so this can be disabled + _this set [1, _killer]; + _this set [2, _instigator]; + }; +}; +TRACE_3("killer info",_killer,_instigator,_causeOfDeath); + +if (_unit == player) then { + // Enable user input before respawn, in case mission is using respawnTemplates + ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); +}; + +["ace_killed", [_unit, _causeOfDeath, _killer, _instigator]] call CBA_fnc_globalEvent; diff --git a/addons/medical_status/functions/fnc_handleKilledMission.sqf b/addons/medical_status/functions/fnc_handleKilledMission.sqf new file mode 100644 index 00000000000..67d1f050f4d --- /dev/null +++ b/addons/medical_status/functions/fnc_handleKilledMission.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Vanilla EntityKilled mission EH, attempts to set correct source/killer for other killed event handlers. + * + * Arguments: + * 0: Unit + * 1: Killer + * 2: Instigator + * 3: Use Effects + * + * Return Value: + * None + * + * Example: + * [cursorObject, player, player, true] call ace_medical_status_fnc_handleKilledMission + * + * Public: No + */ + +params ["_unit", "_killer", "_instigator", "_useEffects"]; +TRACE_4("handleKilledMission",_unit,_killer,_instigator,_useEffects); + +// ensure event is only called once +if (_unit isEqualTo (_unit getVariable [QGVAR(killedMission), objNull])) exitWith { + _this set [0, objNull]; + _this set [1, objNull]; + _this set [2, objNull]; +}; +_unit setVariable [QGVAR(killedMission), _unit]; + +private _causeOfDeath = _unit getVariable [QEGVAR(medical,causeOfDeath), "#scripted"]; + +// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect) +if (_causeOfDeath != "#scripted") then { + _killer = _unit getVariable [QEGVAR(medical,lastDamageSource), _killer]; // vehicle + _instigator = _unit getVariable [QEGVAR(medical,lastInstigator), _instigator]; // unit in the turret + + // All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator + if (missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]) then { // getVar so this can be disabled + _this set [1, _killer]; + _this set [2, _instigator]; + }; +}; +TRACE_3("killer mission info",_killer,_instigator,_causeOfDeath); diff --git a/addons/medical_status/functions/fnc_hasStableVitals.sqf b/addons/medical_status/functions/fnc_hasStableVitals.sqf new file mode 100644 index 00000000000..90e2caac93b --- /dev/null +++ b/addons/medical_status/functions/fnc_hasStableVitals.sqf @@ -0,0 +1,34 @@ +#include "script_component.hpp" +/* + * Author: Ruthberg + * Check if a unit has stable vitals (required to become conscious) + * + * Arguments: + * 0: The patient + * + * Return Value: + * Has stable vitals + * + * Example: + * [player] call ace_medical_status_fnc_hasStableVitals + * + * Public: No + */ + +params ["_unit"]; + +if (GET_BLOOD_VOLUME(_unit) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE) exitWith { false }; +if IN_CRDC_ARRST(_unit) exitWith { false }; + +private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); +private _bloodLoss = GET_BLOOD_LOSS(_unit); +if (_bloodLoss > (BLOOD_LOSS_KNOCK_OUT_THRESHOLD * _cardiacOutput) / 2) exitWith { false }; + +private _bloodPressure = GET_BLOOD_PRESSURE(_unit); +_bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; +if (_bloodPressureL < 50 || {_bloodPressureH < 60}) exitWith { false }; + +private _heartRate = GET_HEART_RATE(_unit); +if (_heartRate < 40) exitWith { false }; + +true diff --git a/addons/medical_status/functions/fnc_initUnit.sqf b/addons/medical_status/functions/fnc_initUnit.sqf new file mode 100644 index 00000000000..4700d78393d --- /dev/null +++ b/addons/medical_status/functions/fnc_initUnit.sqf @@ -0,0 +1,84 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, commy2 + * Initializes unit variables. + * + * Arguments: + * 0: The Unit + * 1: Is Respawned + * + * Return Value: + * None + * + * Example: + * [bob, false] call ace_medical_status_fnc_initUnit + * + * Public: No + */ + +params ["_unit", ["_isRespawn", true]]; +TRACE_2("initUnit",_unit,_isRespawn); + +if (!_isRespawn) then { // Always add respawn EH (same as CBA's onRespawn=1) + _unit addEventHandler ["Respawn", {[(_this select 0), true] call FUNC(initUnit)}]; +}; + +if (!local _unit) exitWith {}; + +if (damage _unit > 0) then { + _unit setDamage 0; +}; + +if (_isRespawn) then { + TRACE_1("reseting all vars on respawn",_isRespawn); // note: state is handled by ace_medical_statemachine_fnc_resetStateDefault + + // - Blood and heart ---------------------------------------------------------- + _unit setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; + _unit setVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE, true]; + _unit setVariable [VAR_BLOOD_PRESS, [80, 120], true]; + _unit setVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES, true]; + _unit setVariable [VAR_CRDC_ARRST, false, true]; + _unit setVariable [VAR_HEMORRHAGE, 0, true]; + + // - Pain --------------------------------------------------------------------- + _unit setVariable [VAR_PAIN, 0, true]; + _unit setVariable [VAR_IN_PAIN, false, true]; + _unit setVariable [VAR_PAIN_SUPP, 0, true]; + + // - Wounds ------------------------------------------------------------------- + _unit setVariable [VAR_OPEN_WOUNDS, [], true]; + _unit setVariable [VAR_BANDAGED_WOUNDS, [], true]; + _unit setVariable [VAR_STITCHED_WOUNDS, [], true]; + _unit setVariable [QEGVAR(medical,isLimping), false, true]; + _unit setVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES, true]; + + // - Misc --------------------------------------------------------------------- + _unit setVariable [VAR_UNCON, false, true]; + + // - Treatments --------------------------------------------------------------- + _unit setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true]; + _unit setVariable [QEGVAR(medical,occludedMedications), nil, true]; // Delayed Medications (from tourniquets) + _unit setVariable [QEGVAR(medical,ivBags), nil, true]; + + // Update wound bleeding + [_unit] call EFUNC(medical_status,updateWoundBloodLoss); + + // Triage card and logs + _unit setVariable [QEGVAR(medical,triageLevel), 0, true]; + _unit setVariable [QEGVAR(medical,triageCard), [], true]; + + // Damage storage + _unit setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true]; + + // Medication + _unit setVariable [VAR_MEDICATIONS, [], true]; + + // Unconscious spontanious wake up chance + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil]; +}; + +[{ + params ["_unit"]; + TRACE_3("Unit Init",_unit,local _unit,typeOf _unit); + [QGVAR(initialized), [_unit]] call CBA_fnc_localEvent; +}, [_unit], 0.5] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_status/functions/fnc_isBeingCarried.sqf b/addons/medical_status/functions/fnc_isBeingCarried.sqf new file mode 100644 index 00000000000..7e58efc1edd --- /dev/null +++ b/addons/medical_status/functions/fnc_isBeingCarried.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Returns if a target is being carried. (from ace_dragging) + * + * Arguments: + * 0: Target Unit + * + * Return Value: + * Is being carried + * + * Example: + * [bob] call ace_medical_status_fnc_isBeingCarried + * + * Public: No + */ + +params ["_target"]; + +private _owner = _target getVariable [QEGVAR(common,owner), objNull]; + +!(isNull _owner) + && {(_owner getVariable [QEGVAR(dragging,carriedObject), objNull]) == _target} diff --git a/addons/medical_status/functions/fnc_isBeingDragged.sqf b/addons/medical_status/functions/fnc_isBeingDragged.sqf new file mode 100644 index 00000000000..e8c21bdb569 --- /dev/null +++ b/addons/medical_status/functions/fnc_isBeingDragged.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Returns if a target is being dragged. (from ace_dragging) + * + * Arguments: + * 0: Target Unit + * + * Return Value: + * Is being dragged + * + * Example: + * [bob] call ace_medical_status_fnc_isBeingDragged + * + * Public: No + */ + +params ["_target"]; + +private _owner = _target getVariable [QEGVAR(common,owner), objNull]; + +!(isNull _owner) + && {(_owner getVariable [QEGVAR(dragging,draggedObject), objNull]) == _target} diff --git a/addons/medical_status/functions/fnc_isInStableCondition.sqf b/addons/medical_status/functions/fnc_isInStableCondition.sqf new file mode 100644 index 00000000000..36ff02ac2bb --- /dev/null +++ b/addons/medical_status/functions/fnc_isInStableCondition.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Check if a unit is in a stable condition, needed for PersonalAidKit treatment + * + * Arguments: + * 0: The patient + * + * Return Value: + * Is in stable condition + * + * Example: + * [player] call ace_medical_status_fnc_isInStableCondition + * + * Public: No + */ + +params ["_unit"]; + +alive _unit +&& {!IS_UNCONSCIOUS(_unit)} +&& {GET_WOUND_BLEEDING(_unit) == 0} +&& {_unit call FUNC(hasStableVitals)} diff --git a/addons/medical_status/functions/fnc_setCardiacArrestState.sqf b/addons/medical_status/functions/fnc_setCardiacArrestState.sqf new file mode 100644 index 00000000000..3dec76ab358 --- /dev/null +++ b/addons/medical_status/functions/fnc_setCardiacArrestState.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Marks a unit as in cardiac arrest and sets heart rate to 0. + * Will put the unit in an unconscious state if not already. + * For Internal Use: Called from the state machine entered/leftState funcs. + * + * Arguments: + * 0: The unit that will be put in cardiac arrest state + * 1: Set CardiacArrest + * + * Return Value: + * None + * + * Example: + * [player, true] call ace_medical_status_fnc_setCardiacArrestState + * + * Public: No + */ + +params ["_unit", "_active"]; +TRACE_2("setCardiacArrestState",_unit,_active); + +// No change to make +if (_active isEqualTo IN_CRDC_ARRST(_unit)) exitWith { TRACE_2("no change",_active,IN_CRDC_ARRST(_unit)); }; + +// No heart rate in cardiac arrest, low heart rate if revived +_unit setVariable [VAR_CRDC_ARRST, _active, true]; +_unit setVariable [VAR_HEART_RATE, [40, 0] select _active, true]; + +// Cardiac arrest is an extension of unconsciousness, but only set when entering Cardiac arrest +if (_active) then { + [_unit, true] call FUNC(setUnconsciousState); +}; + +["ace_cardiacArrest", [_unit, _active]] call CBA_fnc_localEvent; diff --git a/addons/medical_status/functions/fnc_setDead.sqf b/addons/medical_status/functions/fnc_setDead.sqf new file mode 100644 index 00000000000..7f41ebf3dad --- /dev/null +++ b/addons/medical_status/functions/fnc_setDead.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Kills a local unit. + * + * Arguments: + * 0: The unit + * 1: Reason for death + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", ["_reason", "#setDead"]]; +TRACE_2("setDead",_unit,_reason); + +// No heart rate or blood pressure to measure when dead +_unit setVariable [VAR_HEART_RATE, 0, true]; +_unit setVariable [VAR_BLOOD_PRESS, [0, 0], true]; + +_unit setVariable [QEGVAR(medical,causeOfDeath), _reason, true]; + +// Send a local event before death +[QEGVAR(medical,death), [_unit]] call CBA_fnc_localEvent; + +// Kill the unit without changing visual apperance +[_unit, 1] call EFUNC(medical_engine,setStructuralDamage); diff --git a/addons/medical_status/functions/fnc_setUnconsciousState.sqf b/addons/medical_status/functions/fnc_setUnconsciousState.sqf new file mode 100644 index 00000000000..715041d7015 --- /dev/null +++ b/addons/medical_status/functions/fnc_setUnconsciousState.sqf @@ -0,0 +1,62 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Sets a unit in the unconscious state. + * For Internal Use: Called from the state machine. + * + * Arguments: + * 0: The unit that will be put in an unconscious state + * 1: Set unconscious + * + * Return Value: + * Success + * + * Example: + * [player, true] call ace_medical_status_fnc_setUnconsciousState + * + * Public: No + */ + +params ["_unit", "_active"]; +TRACE_2("setUnconsciousState",_unit,_active); + +// No change to make +if (_active isEqualTo IS_UNCONSCIOUS(_unit)) exitWith { TRACE_2("no change",_active,IS_UNCONSCIOUS(_unit)); }; + +_unit setVariable [VAR_UNCON, _active, true]; + +// Toggle unit ragdoll state +[_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); + +// Stop AI firing at unconscious units in most situations (global effect) +[_unit, "setHidden", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); + +if (_active) then { + // Don't bother setting this if not used + if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { + private _lastWakeUpCheck = _unit getVariable [QEGVAR(medical,lastWakeUpCheck), 0]; // could be set higher from ace_medical_fnc_setUnconscious + TRACE_2("setting lastWakeUpCheck to max of",_lastWakeUpCheck,CBA_missionTime); + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), _lastWakeUpCheck max CBA_missionTime]; + }; + + if (_unit == ACE_player) then { + if (visibleMap) then {openMap false}; + + while {dialog} do { + closeDialog 0; + }; + }; + // Unlock controls for copilot if unit is pilot of aircraft + if (vehicle _unit isKindOf "Air" && {_unit == driver vehicle _unit}) then { + TRACE_1("pilot of air vehicle - unlocking controls",vehicle _unit); + // Do "Unlock controls" user action, co-pilot will then have to do the "Take Controls" actions + _unit action ["UnlockVehicleControl", vehicle _unit]; + }; +} else { + // Unit has woken up, no longer need to track this + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil]; +}; + +// This event doesn't correspond to unconscious in statemachine +// It's for any time a unit changes consciousness (including cardiac arrest) +["ace_unconscious", [_unit, _active]] call CBA_fnc_globalEvent; diff --git a/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf b/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf new file mode 100644 index 00000000000..fe38aabadce --- /dev/null +++ b/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update total wound bleeding based on open wounds and tourniquets + * Wound bleeding = percentage of cardiac output lost + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Nothing + * + * Example: + * [player] call ace_medical_status_fnc_updateWoundBloodLoss + * + * Public: No + */ + +params ["_unit"]; + +private _tourniquets = GET_TOURNIQUETS(_unit); +private _bodyPartBleeding = [0,0,0,0,0,0]; +{ + _x params ["", "_bodyPart", "_amountOf", "_bleeeding"]; + if (_tourniquets select _bodyPart == 0) then { + _bodyPartBleeding set [_bodyPart, (_bodyPartBleeding select _bodyPart) + (_amountOf * _bleeeding)]; + }; +} forEach GET_OPEN_WOUNDS(_unit); + +if (_bodyPartBleeding isEqualTo [0,0,0,0,0,0]) then { + TRACE_1("updateWoundBloodLoss-none",_unit); + _unit setVariable [VAR_WOUND_BLEEDING, 0, true]; +} else { + _bodyPartBleeding params ["_headBleeding", "_bodyBleeding", "_leftArmBleeding", "_rightArmBleeding", "_leftLegBleeding", "_rightLegBleeding"]; + private _bodyBleedingRate = ((_headBleeding min 0.9) + (_bodyBleeding min 1.0)) min 1.0; + private _limbBleedingRate = ((_leftArmBleeding min 0.3) + (_rightArmBleeding min 0.3) + (_leftLegBleeding min 0.5) + (_rightLegBleeding min 0.5)) min 1.0; + + // limb bleeding is scaled down based on the amount of body bleeding + _limbBleedingRate = _limbBleedingRate * (1 - _bodyBleedingRate); + + TRACE_3("updateWoundBloodLoss-bleeding",_unit,_bodyBleedingRate,_limbBleedingRate); + _unit setVariable [VAR_WOUND_BLEEDING, _bodyBleedingRate + _limbBleedingRate, true]; +}; diff --git a/addons/medical_status/functions/script_component.hpp b/addons/medical_status/functions/script_component.hpp new file mode 100644 index 00000000000..9b83bfbc4f4 --- /dev/null +++ b/addons/medical_status/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_status\script_component.hpp" diff --git a/addons/medical_status/initSettings.sqf b/addons/medical_status/initSettings.sqf new file mode 100644 index 00000000000..95231b0acc8 --- /dev/null +++ b/addons/medical_status/initSettings.sqf @@ -0,0 +1,26 @@ +[ + QEGVAR(medical,bleedingCoefficient), + "SLIDER", + [LSTRING(BleedingCoefficient_DisplayName), LSTRING(BleedingCoefficient_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [0, 25, 1, 1], + true +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,painCoefficient), + "SLIDER", + [LSTRING(PainCoefficient_DisplayName), LSTRING(PainCoefficient_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [0, 25, 1, 1], + true +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,ivFlowRate), + "SLIDER", + [LSTRING(IvFlowRate_DisplayName), LSTRING(IvFlowRate_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [0, 25, 1, 1], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_status/script_component.hpp b/addons/medical_status/script_component.hpp new file mode 100644 index 00000000000..324fb88078b --- /dev/null +++ b/addons/medical_status/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_status +#define COMPONENT_BEAUTIFIED Medical Status +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_STATUS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_STATUS + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_STATUS +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml new file mode 100644 index 00000000000..8f469545962 --- /dev/null +++ b/addons/medical_status/stringtable.xml @@ -0,0 +1,115 @@ + + + + + Status + Zustand + 状態 + Статус + Statut + Status + 狀態 + Stato + Stav + Status + Estado + Durum + + + Bleeding Coefficient + Коэффициент кровопотери + Mnożnik krwawienia + Coeficiente de sangrado + Verblutungsmultiplikator + Koeficient krvácení + Coeficiente de sangramento + Coefficient de saignement + Vérzési koefficiens + Coefficiente sanguinamento + 出血の係数 + 출혈 계수 + 流血系数 + 流血係數 + Kanama Katsayısı + + + Coefficient for controlling the bleeding speed. + Коэффициент, изменяющий скорость потери крови + Mnożnik modyfikujący prędkość wykrwawiania się + Coeficiente para modificar la velocidad de sangrado + Multiplikator um die Verblutungsgeschwindigkeit zu verändern + Koeficient rychlosti krvácení + Coeficiente para modificar a velocidade do sangramento + Coefficient permettant de définir la vitesse du saignement. + Egy szorzó a vérzés sebességének szabályozására + Coefficiente che modifica la velocità di sanguinamento + この係数では出血速度を変更できます + 출혈의 속도를 계수만큼 변경합니다 + 修改流血速度 + 修改流血速度 + Kanama hızını kontrol etme katsayısı. + + + Pain Coefficient + Коэффициент боли + Mnożnik bólu + Coeficiente de dolor + Schmerzmultiplikator + Koeficient bolesti + Coeficiente de dor + Coefficient de douleur + Fájdalmi koefficiens + Coefficiente dolore + 痛みの係数 + 고통 계수 + 疼痛系数 + 疼痛係數 + Ağrı Katsayısı + + + Coefficient for controlling the intensity of pain adjustments. + Коэффициент, изменяющий уровень боли + Mnożnik modyfikujący intensywność bólu + Coeficiente para modificar la intensidad del dolor + Multiplikator um die Schmerzintensität zu verändern + Koeficient intenzity bolesti + Coeficiente para modificar a instensidade de dor + Coefficient permettant de définir l'intensité de la douleur. + Egy szorzó a fájdalom erősségének szabályozására + Coefficiente che modifica l'intensità del dolore + この係数では痛みの強さを変更できます + 고통의 정도를 계수만큼 변경합니다 + 修改疼痛强度的系数 + 修改疼痛強度的係數 + Ağrı ayarlamalarının yoğunluğunu kontrol etmek için katsayı. + + + IV Transfusion Flow Rate + Transfusions Fließrate + IV 輸血の流量 + Скорость внутривенного переливания + Débit de transfusion IV + Velocidade de Transferência de Sangue + 點滴輸血流量 + IV Portata della trasfusione + Rychlost IV transfuze + Natężenie Przepływu Transfuzji IV + IV Flujo de transfusión + IV Transfüzyon Akış Hızı + + + Controls how quickly fluid flows out of IV Bags. The IV Bag volume change is calculated as:\ntime interval (s) * iv change per second (4.1667 mL/s) * flow rate (this coefficient). + Wie schnell der Effekt der Transfusion eintritt + IV による輸血速度を変更できます + Определяет, насколько быстро подействуют эффекты внутривенного переливания + Définit la vitesse à laquelle le liquide s'écoule des poches de perfusion.\nLa variation du volume de poche IV est calculée selon la formule suivante :\n intervalle de temps (s) * variation IV par seconde (4,1667 ml/s) * débit (ce coefficient). + Controla o quão rápido flúidos são extraídos de bolsas de IV. A mudança no volume da bolsa d IV é calculado assim:\nIntervalo de tempo (s) * mudança de iv por segundo (4.1667 mL/s) * Velocidade de transferência (esse valor) + 控制從點滴輸入人體的液體流量多快。點滴的體積更改是以\n時間間隔(單位秒)乘上點滴每秒速度(4.1667毫升/秒)乘上流量(該係數)。 + Controlla la velocità con cui il fluido esce dalle sacche per flebo. La variazione di volume delle sacche IV è calcolata come:\intervallo di tempo (s) * variazione iv al secondo (4,1667 mL/s) * portata (questo coefficiente). + Nastavuje jak rychle tekutiny vytékají z IV sáčku. Zbývající objem IV sáčku je vypočítáván následovně:\nčasový interval (s) * změna iv za sekundu (4,1667 mL/s) * rychlost toku (tento koeficient). + Kontroluje, jak szybko płyn wypływa z worków IV. Zmiana objętości worka IV jest obliczana jako:\n przedział czasowy * zmiana iv na sekundę (4,1667 mL/s) * natężenie przepływu (ten współczynnik). + Controla la rapidez con que fluye el líquido de las bolsas intravenosas. El cambio de volumen de la bolsa IV se calcula como: \n intervalo (s) de tiempo * cambio iv por segundo (4.1667 mL/s) * velocidad de flujo (este coeficiente). + IV Torbalardan sıvının ne kadar hızlı aktığını kontrol eder. IV Torba hacim değişikliği şu şekilde hesaplanır: zaman aralıkları iv saniye başına değişim (4.1667 mL / s) akış hızı (bu katsayı). + + + diff --git a/addons/medical_treatment/$PBOPREFIX$ b/addons/medical_treatment/$PBOPREFIX$ new file mode 100644 index 00000000000..b6c73c4043c --- /dev/null +++ b/addons/medical_treatment/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_treatment \ No newline at end of file diff --git a/addons/medical_treatment/ACE_Medical_Facilities.hpp b/addons/medical_treatment/ACE_Medical_Facilities.hpp new file mode 100644 index 00000000000..32ab19d2331 --- /dev/null +++ b/addons/medical_treatment/ACE_Medical_Facilities.hpp @@ -0,0 +1,26 @@ +class EGVAR(medical,facilities) { + BI[] = { + "Land_Medevac_house_V1_F", + "Land_Medevac_HQ_V1_F", + "Land_MedicalTent_01_white_IDAP_med_closed_F", + "Land_MedicalTent_01_MTP_closed_F", + "Land_MedicalTent_01_brownhex_closed_F", + "Land_MedicalTent_01_digital_closed_F" + }; + CUP[] = { + "TK_GUE_WarfareBFieldhHospital_Base_EP1", + "TK_GUE_WarfareBFieldhHospital_EP1", + "TK_WarfareBFieldhHospital_Base_EP1", + "TK_WarfareBFieldhHospital_EP1", + "US_WarfareBFieldhHospital_Base_EP1", + "US_WarfareBFieldhHospital_EP1", + "MASH_EP1", + "MASH", + "Land_A_Hospital", + "CDF_WarfareBFieldhHospital", + "GUE_WarfareBFieldhHospital", + "INS_WarfareBFieldhHospital", + "RU_WarfareBFieldhHospital", + "USMC_WarfareBFieldhHospital" + }; +}; diff --git a/addons/medical_treatment/ACE_Medical_Treatment.hpp b/addons/medical_treatment/ACE_Medical_Treatment.hpp new file mode 100644 index 00000000000..1c84e6be0ed --- /dev/null +++ b/addons/medical_treatment/ACE_Medical_Treatment.hpp @@ -0,0 +1,655 @@ + +class ADDON { + class Bandaging { + // Field dressing is normal average treatment + // packing bandage is average treatment, higher reopen change, longer reopening delay + // elastic bandage is higher treatment, higher reopen change, shorter reopen delay + // quickclot is lower treatment, lower reopen change, longer reopening delay + class BasicBandage { + effectiveness = 5; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + + class FieldDressing { + // How effect is the bandage for treating one wounds type injury + effectiveness = 1; + // What is the chance and delays (in seconds) of the treated default injury reopening + reopeningChance = 0.1; + reopeningMinDelay = 120; + reopeningMaxDelay = 200; + + class Abrasion { + effectiveness = 3; + reopeningChance = 0.3; + reopeningMinDelay = 200; + reopeningMaxDelay = 1000; + }; + class AbrasionMinor: Abrasion { + effectiveness = 3; + }; + class AbrasionMedium: Abrasion { + effectiveness = 2.5; + reopeningChance = 0.7; + }; + class AbrasionLarge: Abrasion { + effectiveness = 2; + reopeningChance = 0.9; + }; + + class Avulsion: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 120; + reopeningMaxDelay = 200; + }; + class AvulsionMinor: Avulsion { + effectiveness = 1; + }; + class AvulsionMedium: Avulsion { + effectiveness = 0.9; + }; + class AvulsionLarge: Avulsion { + effectiveness = 0.75; + }; + + class Contusion: Abrasion { + effectiveness = 1; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 1; + reopeningChance = 0.2; + reopeningMinDelay = 200; + reopeningMaxDelay = 1000; + }; + class CrushMinor: Crush { + effectiveness = 1; + reopeningChance = 0.2; + }; + class CrushMedium: Crush { + effectiveness = 0.7; + reopeningChance = 0.3; + }; + class CrushLarge: Crush { + effectiveness = 0.6; + reopeningChance = 0.4; + }; + + class Cut: Abrasion { + effectiveness = 4; + reopeningChance = 0.1; + reopeningMinDelay = 300; + reopeningMaxDelay = 1000; + }; + class CutMinor: Cut { + effectiveness = 4; + reopeningChance = 0.1; + }; + class CutMedium: Cut { + effectiveness = 3; + reopeningChance = 0.3; + }; + class CutLarge: Cut { + effectiveness = 1; + reopeningChance = 0.5; + }; + + class Laceration: Abrasion { + effectiveness = 0.95; + reopeningChance = 0.3; + reopeningMinDelay = 100; + reopeningMaxDelay = 800; + }; + class LacerationMinor: Laceration { + effectiveness = 0.95; + reopeningChance = 0.3; + }; + class LacerationMedium: Laceration { + effectiveness = 0.7; + reopeningChance = 0.5; + }; + class LacerationLarge: Laceration { + effectiveness = 0.5; + reopeningChance = 0.6; + }; + + class VelocityWound: Abrasion { + effectiveness = 2; + reopeningChance = 0.7; + reopeningMinDelay = 100; + reopeningMaxDelay = 500; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 2; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 1.5; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 1; + }; + + class PunctureWound: Abrasion { + effectiveness = 2; + reopeningChance = 0.5; + reopeningMinDelay = 200; + reopeningMaxDelay = 850; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 2; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 1.3; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 0.9; + }; + }; + + class PackingBandage: fieldDressing { + class Abrasion { + effectiveness = 3; + reopeningChance = 0.6; + reopeningMinDelay = 800; + reopeningMaxDelay = 1500; + }; + class AbrasionMinor: Abrasion { + effectiveness = 3; + }; + class AbrasionMedium: Abrasion { + effectiveness = 2.5; + reopeningChance = 0.9; + }; + class AbrasionLarge: Abrasion { + effectiveness = 2; + reopeningChance = 1; + }; + + class Avulsion: Abrasion { + effectiveness = 1; + reopeningChance = 0.7; + reopeningMinDelay = 1000; + reopeningMaxDelay = 1600; + }; + class AvulsionMinor: Avulsion { + effectiveness = 1; + }; + class AvulsionMedium: Avulsion { + effectiveness = 0.9; + }; + class AvulsionLarge: Avulsion { + effectiveness = 0.75; + }; + + class Contusion: Abrasion { + effectiveness = 1; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 600; + reopeningMaxDelay = 1000; + }; + class CrushMinor: Crush { + effectiveness = 1; + reopeningChance = 0.6; + }; + class CrushMedium: Crush { + effectiveness = 0.7; + reopeningChance = 0.7; + }; + class CrushLarge: Crush { + effectiveness = 0.6; + reopeningChance = 0.8; + }; + + class Cut: Abrasion { + effectiveness = 4; + reopeningChance = 0.4; + reopeningMinDelay = 700; + reopeningMaxDelay = 1000; + }; + class CutMinor: Cut { + effectiveness = 4; + reopeningChance = 0.6; + }; + class CutMedium: Cut { + effectiveness = 3; + reopeningChance = 0.7; + }; + class CutLarge: Cut { + effectiveness = 1; + reopeningChance = 0.8; + }; + + class Laceration: Abrasion { + effectiveness = 0.95; + reopeningChance = 0.65; + reopeningMinDelay = 500; + reopeningMaxDelay = 2000; + }; + class LacerationMinor: Laceration { + effectiveness = 0.95; + reopeningChance = 0.65; + }; + class LacerationMedium: Laceration { + effectiveness = 0.7; + reopeningChance = 0.8; + }; + class LacerationLarge: Laceration { + effectiveness = 0.5; + reopeningChance = 0.9; + }; + + class VelocityWound: Abrasion { + effectiveness = 2; + reopeningChance = 1; + reopeningMinDelay = 800; + reopeningMaxDelay = 2000; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 2; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 1.5; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 1; + }; + + class PunctureWound: Abrasion { + effectiveness = 2; + reopeningChance = 1; + reopeningMinDelay = 1000; + reopeningMaxDelay = 3000; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 2; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 1.3; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 0.9; + }; + }; + + class ElasticBandage: fieldDressing { + class Abrasion { + effectiveness = 4; + reopeningChance = 0.6; + reopeningMinDelay = 80; + reopeningMaxDelay = 150; + }; + class AbrasionMinor: Abrasion { + effectiveness = 4; + }; + class AbrasionMedium: Abrasion { + effectiveness = 3; + reopeningChance = 0.9; + }; + class AbrasionLarge: Abrasion { + effectiveness = 2.5; + reopeningChance = 1; + }; + + class Avulsion: Abrasion { + effectiveness = 2; + reopeningChance = 0.7; + reopeningMinDelay = 100; + reopeningMaxDelay = 160; + }; + class AvulsionMinor: Avulsion { + effectiveness = 2; + }; + class AvulsionMedium: Avulsion { + effectiveness = 1.4; + }; + class AvulsionLarge: Avulsion { + effectiveness = 1; + }; + + class Contusion: Abrasion { + effectiveness = 2; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 2; + reopeningChance = 0.5; + reopeningMinDelay = 60; + reopeningMaxDelay = 100; + }; + class CrushMinor: Crush { + effectiveness = 2; + reopeningChance = 0.6; + }; + class CrushMedium: Crush { + effectiveness = 1.7; + reopeningChance = 0.7; + }; + class CrushLarge: Crush { + effectiveness = 1.6; + reopeningChance = 0.8; + }; + + class Cut: Abrasion { + effectiveness = 5; + reopeningChance = 0.4; + reopeningMinDelay = 70; + reopeningMaxDelay = 100; + }; + class CutMinor: Cut { + effectiveness = 5; + reopeningChance = 0.6; + }; + class CutMedium: Cut { + effectiveness = 3.5; + reopeningChance = 0.7; + }; + class CutLarge: Cut { + effectiveness = 2; + reopeningChance = 0.8; + }; + + class Laceration: Abrasion { + effectiveness = 2; + reopeningChance = 0.65; + reopeningMinDelay = 50; + reopeningMaxDelay = 200; + }; + class LacerationMinor: Laceration { + effectiveness = 2; + reopeningChance = 0.65; + }; + class LacerationMedium: Laceration { + effectiveness = 1.5; + reopeningChance = 0.8; + }; + class LacerationLarge: Laceration { + effectiveness = 1; + reopeningChance = 0.9; + }; + + class VelocityWound: Abrasion { + effectiveness = 2.2; + reopeningChance = 1; + reopeningMinDelay = 80; + reopeningMaxDelay = 200; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 2.2; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 1.75; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 1.5; + }; + + class PunctureWound: Abrasion { + effectiveness = 2.5; + reopeningChance = 1; + reopeningMinDelay = 100; + reopeningMaxDelay = 300; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 2.5; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 2; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 1.5; + }; + }; + + class QuikClot: fieldDressing { + class Abrasion { + effectiveness = 2; + reopeningChance = 0.3; + reopeningMinDelay = 800; + reopeningMaxDelay = 1500; + }; + class AbrasionMinor: Abrasion { + effectiveness = 2; + }; + class AbrasionMedium: Abrasion { + effectiveness = 1; + reopeningChance = 0.4; + }; + class AbrasionLarge: Abrasion { + effectiveness = 0.7; + reopeningChance = 0.5; + }; + + class Avulsion: Abrasion { + effectiveness = 0.7; + reopeningChance = 0.2; + reopeningMinDelay = 1000; + reopeningMaxDelay = 1600; + }; + class AvulsionMinor: Avulsion { + effectiveness = 0.7; + }; + class AvulsionMedium: Avulsion { + effectiveness = 0.65; + }; + class AvulsionLarge: Avulsion { + effectiveness = 0.5; + }; + + class Contusion: Abrasion { + effectiveness = 1; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 0.6; + reopeningChance = 0.5; + reopeningMinDelay = 600; + reopeningMaxDelay = 1000; + }; + class CrushMinor: Crush { + effectiveness = 0.6; + reopeningChance = 0.3; + }; + class CrushMedium: Crush { + effectiveness = 0.5; + }; + class CrushLarge: Crush { + effectiveness = 0.4; + }; + + class Cut: Abrasion { + effectiveness = 2; + reopeningChance = 0.2; + reopeningMinDelay = 700; + reopeningMaxDelay = 1000; + }; + class CutMinor: Cut { + effectiveness = 2; + reopeningChance = 0.3; + }; + class CutMedium: Cut { + effectiveness = 1; + }; + class CutLarge: Cut { + effectiveness = 0.6; + }; + + class Laceration: Abrasion { + effectiveness = 0.7; + reopeningChance = 0.4; + reopeningMinDelay = 500; + reopeningMaxDelay = 2000; + }; + class LacerationMinor: Laceration { + effectiveness = 0.7; + reopeningChance = 0.4; + }; + class LacerationMedium: Laceration { + effectiveness = 0.7; + }; + class LacerationLarge: Laceration { + effectiveness = 0.5; + }; + + class VelocityWound: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 800; + reopeningMaxDelay = 2000; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 1; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 0.75; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 0.5; + }; + + class PunctureWound: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 1000; + reopeningMaxDelay = 3000; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 1; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 0.7; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 0.4; + }; + }; + }; + + class Medication { + // How much does the pain get reduced? + painReduce = 0; + // How much will the heart rate be increased when the HR is low (below 55)? {minIncrease, maxIncrease} + hrIncreaseLow[] = {0, 0}; // _heartRate < 55 + hrIncreaseNormal[] = {0, 0}; // 55 <= _heartRate <= 110 + hrIncreaseHigh[] = {0, 0}; // 110 < _heartRate + + // How long until this medication has disappeared + timeInSystem = 120; + // How long until the maximum effect is reached + timeTillMaxEffect = 30; + // How many of this type of medication can be in the system before the patient overdoses? + maxDose = 4; + // Function to execute upon overdose. Arguments passed to call back are 0: unit , 1: medicationClassName + onOverDose = ""; + // The viscosity of a fluid is a measure of its resistance to gradual deformation by shear stress or tensile stress. For liquids, it corresponds to the informal concept of "thickness". This value will increase/decrease the viscoty of the blood with the percentage given. Where 100 = max. Using the minus will decrease viscosity + viscosityChange = 0; + + // specific details for the ACE_Morphine treatment action + class Morphine { + painReduce = 0.8; + hrIncreaseLow[] = {-10, -20}; + hrIncreaseNormal[] = {-10, -30}; + hrIncreaseHigh[] = {-10, -35}; + timeInSystem = 1800; + timeTillMaxEffect = 30; + maxDose = 4; + incompatibleMedication[] = {}; + viscosityChange = -10; + }; + class Epinephrine { + painReduce = 0; + hrIncreaseLow[] = {10, 20}; + hrIncreaseNormal[] = {10, 50}; + hrIncreaseHigh[] = {10, 40}; + timeInSystem = 120; + timeTillMaxEffect = 10; + maxDose = 10; + incompatibleMedication[] = {}; + }; + class Adenosine { + painReduce = 0; + hrIncreaseLow[] = {-7, -10}; + hrIncreaseNormal[] = {-15, -30}; + hrIncreaseHigh[] = {-15, -35}; + timeInSystem = 120; + timeTillMaxEffect = 15; + maxDose = 6; + incompatibleMedication[] = {}; + }; + class PainKillers { + painReduce = 0.1; + timeInSystem = 600; + timeTillMaxEffect = 60; + maxDose = 10; + incompatibleMedication[] = {}; + viscosityChange = 5; + }; + }; + class IV { + // volume is in millileters + volume = 1000; + ratio[] = {}; + type = "Blood"; + class BloodIV { + volume = 1000; + ratio[] = {"Plasma", 1}; + }; + class BloodIV_500: BloodIV { + volume = 500; + }; + class BloodIV_250: BloodIV { + volume = 250; + }; + class PlasmaIV: BloodIV { + volume = 1000; + ratio[] = {"Blood", 1}; + type = "Plasma"; + }; + class PlasmaIV_500: PlasmaIV { + volume = 500; + }; + class PlasmaIV_250: PlasmaIV { + volume = 250; + }; + class SalineIV: BloodIV { + volume = 1000; + type = "Saline"; + ratio[] = {}; + }; + class SalineIV_500: SalineIV { + volume = 500; + }; + class SalineIV_250: SalineIV { + volume = 250; + }; + }; +}; diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp new file mode 100644 index 00000000000..f080c19079f --- /dev/null +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -0,0 +1,321 @@ +class GVAR(actions) { + // - Bandages ------------------------------------------------------------- + class BasicBandage { + displayName = CSTRING(Bandage); + displayNameProgress = CSTRING(Bandaging); + icon = QPATHTOEF(medical_gui,ui\bandage.paa); + category = "bandage"; + + consumeItem = 1; + items[] = {"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}; + + medicRequired = 0; + allowSelfTreatment = 1; + allowedSelections[] = {"All"}; + condition = QFUNC(canBandage); + treatmentLocations = TREATMENT_LOCATIONS_ALL; + + treatmentTime = QFUNC(getBandageTime); + treatmentTimeSelfCoef = 1; // todo: this isn't used anywhere, remove? + + callbackStart = ""; + callbackProgress = ""; + callbackSuccess = QFUNC(bandage); + callbackFailure = ""; + + animationMedic = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; + animationMedicProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; + animationMedicSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; + animationMedicSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; + + litter[] = { + {}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} + }; + }; + class FieldDressing: BasicBandage { + displayName = CSTRING(Actions_FieldDressing); + items[] = {"ACE_fieldDressing"}; + litter[] = { + {}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} + }; + }; + class PackingBandage: BasicBandage { + displayName = CSTRING(Actions_PackingBandage); + icon = QPATHTOEF(medical_gui,ui\packing_bandage.paa); + items[] = {"ACE_packingBandage"}; + litter[] = { + {"ACE_MedicalLitter_packingBandage"}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} + }; + }; + class ElasticBandage: BasicBandage { + displayName = CSTRING(Actions_ElasticBandage); + items[] = {"ACE_elasticBandage"}; + litter[] = { + {}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} + }; + }; + class QuikClot: BasicBandage { + displayName = CSTRING(Actions_QuikClot); + items[] = {"ACE_quikclot"}; + litter[] = { + {"ACE_MedicalLitter_QuickClot"}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} + }; + }; + + // - Tourniquets ---------------------------------------------------------- + class ApplyTourniquet: BasicBandage { + displayName = CSTRING(Apply_Tourniquet); + displayNameProgress = CSTRING(Applying_Tourniquet); + icon = QPATHTOEF(medical_gui,ui\tourniquet.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + items[] = {"ACE_tourniquet"}; + treatmentTime = 7; + condition = QUOTE(!([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo))); + callbackSuccess = QFUNC(tourniquet); + litter[] = {}; + }; + class RemoveTourniquet: ApplyTourniquet { + displayName = CSTRING(Actions_RemoveTourniquet); + displayNameProgress = CSTRING(RemovingTourniquet); + items[] = {}; + condition = QUOTE([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo)); + callbackSuccess = QFUNC(tourniquetRemove); + }; + + // - Splint --------------------------------------------------------------- + class Splint: BasicBandage { + displayName = CSTRING(Apply_Splint); + displayNameProgress = CSTRING(Applying_Splint); + category = "bandage"; + icon = QPATHTOEF(medical_gui,ui\splint.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + items[] = {"ACE_splint"}; + treatmentTime = 7; + callbackSuccess = QFUNC(splint); + condition = QFUNC(canSplint); + litter[] = { + {"ACE_MedicalLitter_splint"}, {}, {} + }; + }; + + // - Syringes ------------------------------------------------------------- + class Morphine: FieldDressing { + displayName = CSTRING(Inject_Morphine); + displayNameProgress = CSTRING(Injecting_Morphine); + icon = QPATHTOEF(medical_gui,ui\auto_injector.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + category = "medication"; + items[] = {"ACE_morphine"}; + condition = ""; + treatmentTime = 5; + callbackSuccess = QFUNC(medication); + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; + sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}}; + litter[] = {{"ACE_MedicalLitter_morphine"}}; + }; + class Adenosine: Morphine { + displayName = CSTRING(Inject_Adenosine); + displayNameProgress = CSTRING(Injecting_Adenosine); + condition = QGVAR(advancedMedication); + items[] = {"ACE_adenosine"}; + litter[] = {{"ACE_MedicalLitter_adenosine"}}; + }; + class Epinephrine: Morphine { + displayName = CSTRING(Inject_Epinephrine); + displayNameProgress = CSTRING(Injecting_Epinephrine); + medicRequired = QGVAR(medicEpinephrine); + items[] = {"ACE_epinephrine"}; + treatmentLocations = QGVAR(locationEpinephrine); + litter[] = {{"ACE_MedicalLitter_epinephrine"}}; + }; + + // - IV Bags -------------------------------------------------------------- + class BloodIV: BasicBandage { + displayName = CSTRING(Actions_Blood4_1000); + displayNameProgress = CSTRING(Transfusing_Blood); + icon = QPATHTOEF(medical_gui,ui\iv.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + allowSelfTreatment = QGVAR(allowSelfIV); + category = "advanced"; + medicRequired = QGVAR(medicIV); + treatmentTime = 12; + items[] = {"ACE_bloodIV"}; + condition = ""; + callbackSuccess = QFUNC(ivBag); + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; + litter[] = {}; + }; + class BloodIV_500: BloodIV { + displayName = CSTRING(Actions_Blood4_500); + items[] = {"ACE_bloodIV_500"}; + }; + class BloodIV_250: BloodIV { + displayName = CSTRING(Actions_Blood4_250); + items[] = {"ACE_bloodIV_250"}; + }; + class PlasmaIV: BloodIV { + displayName = CSTRING(Actions_Plasma4_1000); + displayNameProgress = CSTRING(Transfusing_Plasma); + items[] = {"ACE_plasmaIV"}; + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; + }; + class PlasmaIV_500: PlasmaIV { + displayName = CSTRING(Actions_Plasma4_500); + items[] = {"ACE_plasmaIV_500"}; + }; + class PlasmaIV_250: PlasmaIV { + displayName = CSTRING(Actions_Plasma4_250); + items[] = {"ACE_plasmaIV_250"}; + }; + class SalineIV: BloodIV { + displayName = CSTRING(Actions_Saline4_1000); + displayNameProgress = CSTRING(Transfusing_Saline); + items[] = {"ACE_salineIV"}; + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; + }; + class SalineIV_500: SalineIV { + displayName = CSTRING(Actions_Saline4_500); + items[] = {"ACE_salineIV_500"}; + }; + class SalineIV_250: SalineIV { + displayName = CSTRING(Actions_Saline4_250); + items[] = {"ACE_salineIV_250"}; + }; + + // - Diagnose ------------------------------------------------------------- + class Diagnose: BasicBandage { + displayName = CSTRING(Actions_Diagnose); + displayNameProgress = CSTRING(Actions_Diagnosing); + icon = ""; + category = "examine"; + treatmentLocations = TREATMENT_LOCATIONS_ALL; + allowedSelections[] = {"Head", "Body"}; + medicRequired = 0; + treatmentTime = 2.5; + items[] = {}; + condition = QUOTE(!GVAR(advancedDiagnose)); + callbackSuccess = QFUNC(diagnose); + callbackFailure = ""; + callbackProgress = ""; + animationMedic = ""; // TODO + consumeItem = 0; + litter[] = {}; + }; + class CheckPulse: Diagnose { + displayName = CSTRING(Actions_CheckPulse); + displayNameProgress = CSTRING(Check_Pulse_Content); + allowedSelections[] = {"All"}; + condition = QGVAR(advancedDiagnose); + callbackSuccess = QFUNC(checkPulse); + animationMedicProne = ""; + animationMedicSelfProne = ""; + }; + class CheckBloodPressure: CheckPulse { + displayName = CSTRING(Actions_CheckBloodPressure); + displayNameProgress = CSTRING(Check_Bloodpressure_Content); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + callbackSuccess = QFUNC(checkBloodPressure); + }; + class CheckResponse: CheckPulse { + displayName = CSTRING(Check_Response); + displayNameProgress = CSTRING(Check_Response_Content); + allowedSelections[] = {"Head"}; + allowSelfTreatment = 0; + callbackSuccess = QFUNC(checkResponse); + }; + + // - Misc ----------------------------------------------------------------- + class BodyBag: BasicBandage { + displayName = CSTRING(PlaceInBodyBag); + displayNameProgress = CSTRING(PlacingInBodyBag); + icon = QPATHTOEF(medical_gui,ui\bodybag.paa); + category = "advanced"; + treatmentLocations = TREATMENT_LOCATIONS_ALL; + allowSelfTreatment = 0; + medicRequired = 0; + treatmentTime = 15; + items[] = {"ACE_bodyBag"}; + // 'vehicle _patient' always returns the body + // '_patient in _patient' always false for body + condition = QUOTE(!alive _patient && {isNull objectParent _patient}); + callbackSuccess = QFUNC(placeInBodyBag); + consumeItem = 1; + litter[] = {}; + }; + class CPR: BasicBandage { + displayName = CSTRING(Actions_CPR); + displayNameProgress = CSTRING(Actions_PerformingCPR); + icon = ""; + category = "advanced"; + treatmentLocations = TREATMENT_LOCATIONS_ALL; + allowedSelections[] = {"Body"}; + allowSelfTreatment = 0; + medicRequired = 0; + treatmentTime = 15; + items[] = {}; + condition = QFUNC(canCPR); + callbackSuccess = QFUNC(cprSuccess); + callbackFailure = QFUNC(cprFailure); + callbackProgress = QFUNC(cprProgress); + callbackStart = QFUNC(cprStart); + animationMedic = "AinvPknlMstpSnonWnonDr_medic0"; + animationMedicProne = "AinvPknlMstpSnonWnonDr_medic0"; + animationMedicSelf = ""; + animationMedicSelfProne = ""; + consumeItem = 0; + litter[] = {}; + }; + class SurgicalKit: FieldDressing { + displayName = CSTRING(Use_SurgicalKit); + displayNameProgress = CSTRING(Stitching); + icon = QPATHTOEF(medical_gui,ui\surgical_kit.paa); + category = "advanced"; + items[] = {"ACE_surgicalKit"}; + treatmentLocations = QGVAR(locationSurgicalKit); + allowSelfTreatment = QGVAR(allowSelfStitch); + medicRequired = QGVAR(medicSurgicalKit); + treatmentTime = QFUNC(getStitchTime); + condition = QFUNC(canStitch); + callbackSuccess = ""; + callbackProgress = QFUNC(surgicalKitProgress); + consumeItem = QGVAR(consumeSurgicalKit); + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; + litter[] = {{"ACE_MedicalLitter_gloves"}}; + }; + class PersonalAidKit: BasicBandage { + displayName = CSTRING(Use_Aid_Kit); + displayNameProgress = CSTRING(TreatmentAction); + icon = ""; + category = "advanced"; + condition = QUOTE(_patient call EFUNC(medical_status,isInStableCondition)); + items[] = {"ACE_personalAidKit"}; + treatmentLocations = QGVAR(locationPAK); + allowSelfTreatment = QGVAR(allowSelfPAK); + medicRequired = QGVAR(medicPAK); + treatmentTime = QFUNC(getHealTime); + callbackSuccess = QFUNC(fullHeal); + consumeItem = QGVAR(consumePAK); + animationMedic = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; + animationMedicProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; + animationMedicSelf = ""; + animationMedicSelfProne = ""; + litter[] = { + {"ACE_MedicalLitter_gloves"}, + {"ACE_MedicalLitter_clean"}, + { + {"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}, + {"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"} + } + }; + }; +}; diff --git a/addons/medical_treatment/Cfg3DEN.hpp b/addons/medical_treatment/Cfg3DEN.hpp new file mode 100644 index 00000000000..04c3fc3efd1 --- /dev/null +++ b/addons/medical_treatment/Cfg3DEN.hpp @@ -0,0 +1,79 @@ + +#define GRID_3DEN_W (pixelW * pixelGrid * 0.5) +#define GRID_3DEN_H (pixelH * pixelGrid * 0.5) + +#define DEFAULT_IS_MEDIC (parseNumber (_this getUnitTrait 'medic')) +#define DEFAULT_IS_MEDICAL_VEHICLE (getNumber (configFile >> 'CfgVehicles' >> typeOf _this >> 'attendant') > 0) +#define DEFAULT_IS_MEDICAL_FACILITY (typeOf _this in GVAR(facilityClasses)) + +class ctrlToolbox; + +class Cfg3DEN { + class Attributes { + class Default; + class Title: Default { + class Controls { + class Title; + }; + }; + class GVAR(isMedicControl): Title { + attributeLoad = QUOTE((_this controlsGroupCtrl 100) lbSetCurSel (0 max (_value + 1) min 3)); + attributeSave = QUOTE(lbCurSel (_this controlsGroupCtrl 100) - 1); + class Controls: Controls { + class Title: Title {}; + class Value: ctrlToolbox { + idc = 100; + x = 48 * GRID_3DEN_W; + w = 82 * GRID_3DEN_W; + h = 5 * GRID_3DEN_H; + rows = 1; + columns = 4; + strings[] = { + "$STR_3DEN_Attributes_Lock_Default_text", + CSTRING(AssignMedicRoles_role_none), + CSTRING(AssignMedicRoles_role_medic), + CSTRING(AssignMedicRoles_role_doctorShort) + }; + }; + }; + }; + }; + class Object { + class AttributeCategories { + class ace_attributes { + class Attributes { + class ace_isMedic { + displayName = CSTRING(AssignMedicRoles_role_DisplayName); + tooltip = CSTRING(Attributes_isMedic_Description); + property = QUOTE(ace_isMedic); + control = QGVAR(isMedicControl); + expression = QUOTE(if (_value != -1 && {_value != DEFAULT_IS_MEDIC}) then {_this setVariable [ARR_3(QQEGVAR(medical,medicClass),_value,true)]}); + defaultValue = QUOTE(DEFAULT_IS_MEDIC); + condition = "objectBrain"; + typeName = "NUMBER"; + }; + class ace_isMedicalVehicle { + displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); + tooltip = CSTRING(Attributes_isMedicalVehicle_Description); + property = QUOTE(ace_isMedicalVehicle); + control = "Checkbox"; + expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,isMedicalVehicle),_value,true)]); + defaultValue = QUOTE(DEFAULT_IS_MEDICAL_VEHICLE); + condition = "objectVehicle"; + typeName = "BOOL"; + }; + class ace_isMedicalFacility { + displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); + tooltip = CSTRING(AssignMedicalFacility_enabled_Description); + property = QUOTE(ace_isMedicalFacility); + control = "Checkbox"; + expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,isMedicalFacility),_value,true)];); + defaultValue = QUOTE(DEFAULT_IS_MEDICAL_FACILITY); + condition = "(1 - objectBrain) * (1 - objectVehicle)"; + typeName = "BOOL"; + }; + }; + }; + }; + }; +}; diff --git a/addons/medical_treatment/CfgEventHandlers.hpp b/addons/medical_treatment/CfgEventHandlers.hpp new file mode 100644 index 00000000000..0d3301d6e0a --- /dev/null +++ b/addons/medical_treatment/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_treatment/CfgReplacementItems.hpp b/addons/medical_treatment/CfgReplacementItems.hpp new file mode 100644 index 00000000000..16a45d01cc0 --- /dev/null +++ b/addons/medical_treatment/CfgReplacementItems.hpp @@ -0,0 +1,23 @@ +// This config accepts both item type numbers and item class names +// Item type numbers need the prefix ItemType_, so for example ItemType_401 +// Class names need no special prefix +class EGVAR(medical,replacementItems) { + DOUBLES(ItemType,TYPE_FIRST_AID_KIT)[] = { + {"ACE_fieldDressing", 1}, + {"ACE_packingBandage", 1}, + {"ACE_morphine", 1}, + {"ACE_tourniquet", 1} + }; + DOUBLES(ItemType,TYPE_MEDIKIT)[] = { + {"ACE_fieldDressing", 1}, + {"ACE_packingBandage", 2}, + {"ACE_epinephrine", 1}, + {"ACE_morphine", 1}, + {"ACE_salineIV_250", 1}, + {"ACE_tourniquet", 1}, + {"ACE_splint", 2} + }; + ACE_atropine[] = { + {"ACE_adenosine", 1} + }; +}; diff --git a/addons/medical_treatment/CfgVehicles.hpp b/addons/medical_treatment/CfgVehicles.hpp new file mode 100644 index 00000000000..7187d89a394 --- /dev/null +++ b/addons/medical_treatment/CfgVehicles.hpp @@ -0,0 +1,328 @@ +class CBA_Extended_EventHandlers; +class CfgVehicles { + // Bodybag vehicle + class MapBoard_altis_F; + class ACE_bodyBagObject: MapBoard_altis_F { + class EventHandlers { + class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; + }; + + scope = 1; + scopeCurator = 2; + side = -1; + model = QPATHTOEF(apl,ace_bodybag.p3d); + icon = ""; + displayName = CSTRING(Bodybag_Display); + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0,1.2,0}; + EGVAR(dragging,dragDirection) = 0; + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; + hiddenSelections[] = {"camo"}; + hiddenSelectionsTextures[] = {QPATHTOEF(apl,data\bodybag_co.paa)}; + class ACE_Actions { + class ACE_MainActions { + displayName = ECSTRING(interaction,MainAction); + distance = 5; + condition = QUOTE(true); + statement = ""; + icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; + selection = ""; + }; + }; + }; + + // Medical litter classes + class Thing; + class ACE_MedicalLitterBase: Thing { + scope = 1; + scopeCurator = 0; + displayName = " "; + destrType = "DestructNo"; + model = QPATHTOF(data\littergeneric.p3d); + }; + class ACE_MedicalLitter_clean: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_clean.p3d); + }; + class ACE_MedicalLitter_bandage1: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_bandages1.p3d); + }; + class ACE_MedicalLitter_bandage2: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_bandages2.p3d); + }; + class ACE_MedicalLitter_bandage3: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_bandages3.p3d); + }; + class ACE_MedicalLitter_packingBandage: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_packingBandage.p3d); + }; + class ACE_MedicalLitter_gloves: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_gloves.p3d); + }; + class ACE_MedicalLitter_adenosine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_adenosine.p3d); + }; + class ACE_MedicalLitter_atropine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_atropine.p3d); + }; + class ACE_MedicalLitter_epinephrine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_epinephrine.p3d); + }; + class ACE_MedicalLitter_morphine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_morphine.p3d); + }; + class ACE_MedicalLitter_QuickClot: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_Quikclot.p3d); + }; + class ACE_MedicalLitter_splint: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_splint.p3d); + }; + + // Treatment items + class Item_Base_F; + class ACE_fieldDressingItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Bandage_Basic_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_fieldDressing,1); + }; + }; + class ACE_packingBandageItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Packing_Bandage_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_packingBandage,1); + }; + }; + class ACE_elasticBandageItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Bandage_Elastic_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_elasticBandage,1); + }; + }; + class ACE_tourniquetItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Tourniquet_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_tourniquet,1); + }; + }; + class ACE_splintItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(splint_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_splint,1); + }; + }; + class ACE_morphineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Morphine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_morphine,1); + }; + }; + class ACE_adenosineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Adenosine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_adenosine,1); + }; + }; + class ACE_atropineItem: Item_Base_F { + scope = 1; + scopeCurator = 1; + displayName = CSTRING(Atropine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_atropine,1); + }; + }; + class ACE_epinephrineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Epinephrine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_epinephrine,1); + }; + }; + class ACE_plasmaIVItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Plasma_IV); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_plasmaIV,1); + }; + }; + + class ACE_bloodIVItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Blood_IV); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_bloodIV,1); + }; + }; + class ACE_salineIVItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Saline_IV); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_salineIV,1); + }; + }; + class ACE_quikClotItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(QuikClot_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_quikclot,1); + }; + }; + class ACE_personalAidKitItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Aid_Kit_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_personalAidKit,1); + }; + }; + class ACE_surgicalKitItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(SurgicalKit_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_surgicalKit,1); + }; + }; + class ACE_bodyBagItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Bodybag_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_bodyBag,1); + }; + }; + + // Medical supply crates + class ThingX; + class ReammoBox_F: ThingX { + class ACE_Actions; + }; + class NATO_Box_Base: ReammoBox_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions; + }; + }; + class ACE_medicalSupplyCrate: NATO_Box_Base { + scope = 2; + scopeCurator = 2; + accuracy = 1000; + displayName = CSTRING(medicalSupplyCrate); + model = QPATHTOF(data\ace_medcrate.p3d); + editorPreview = QPATHTOF(data\ACE_medicalSupplyCrate.jpg); + author = ECSTRING(common,ACETeam); + class TransportItems { + MACRO_ADDITEM(ACE_fieldDressing,50); + MACRO_ADDITEM(ACE_morphine,25); + MACRO_ADDITEM(ACE_epinephrine,25); + MACRO_ADDITEM(ACE_bloodIV,15); + MACRO_ADDITEM(ACE_bloodIV_500,15); + MACRO_ADDITEM(ACE_bloodIV_250,15); + MACRO_ADDITEM(ACE_bodyBag,10); + }; + class AnimationSources { + class Cover { + source = "user"; + animPeriod = 1.5; + initPhase = 0; + minValue = 0; + maxValue = 1; + }; + }; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "cover_action"; + + class ACE_OpenLid { + displayName = ECSTRING(medical,openLid); + condition = QUOTE(alive _target && {_target animationPhase 'Cover' < 0.5}); + statement = QUOTE(_target animate ARR_2(['Cover',1])); + showDisabled = 0; + priority = -1; + }; + class ACE_CloseLid { + displayName = ECSTRING(medical,closeLid); + condition = QUOTE(alive _target && {_target animationPhase 'Cover' >= 0.5}); + statement = QUOTE(_target animate ARR_2(['Cover',0])); + showDisabled = 0; + priority = -1; + }; + }; + }; + }; + class ACE_medicalSupplyCrate_advanced: ACE_medicalSupplyCrate { + displayName = CSTRING(medicalSupplyCrate_advanced); + class TransportItems { + MACRO_ADDITEM(ACE_fieldDressing,25); + MACRO_ADDITEM(ACE_packingBandage,25); + MACRO_ADDITEM(ACE_elasticBandage,25); + MACRO_ADDITEM(ACE_tourniquet,15); + MACRO_ADDITEM(ACE_splint,15); + MACRO_ADDITEM(ACE_morphine,15); + MACRO_ADDITEM(ACE_adenosine,15); + MACRO_ADDITEM(ACE_epinephrine,15); + MACRO_ADDITEM(ACE_plasmaIV,7); + MACRO_ADDITEM(ACE_plasmaIV_500,7); + MACRO_ADDITEM(ACE_plasmaIV_250,7); + MACRO_ADDITEM(ACE_salineIV,7); + MACRO_ADDITEM(ACE_salineIV_500,7); + MACRO_ADDITEM(ACE_salineIV_250,7); + MACRO_ADDITEM(ACE_bloodIV,7); + MACRO_ADDITEM(ACE_bloodIV_500,7); + MACRO_ADDITEM(ACE_bloodIV_250,7); + MACRO_ADDITEM(ACE_quikClot,20); + MACRO_ADDITEM(ACE_personalAidKit,3); + MACRO_ADDITEM(ACE_surgicalKit,2); + MACRO_ADDITEM(ACE_bodyBag,5); + }; + }; +}; diff --git a/addons/medical_treatment/CfgWeapons.hpp b/addons/medical_treatment/CfgWeapons.hpp new file mode 100644 index 00000000000..3e90457c8bd --- /dev/null +++ b/addons/medical_treatment/CfgWeapons.hpp @@ -0,0 +1,267 @@ + +class CfgWeapons { + class ItemCore; + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + class InventoryFirstAidKitItem_Base_F; + class MedikitItem; + + class FirstAidKit: ItemCore { + type = 0; + class ItemInfo: InventoryFirstAidKitItem_Base_F { + mass = 4; + }; + }; + class Medikit: ItemCore { + type = 0; + class ItemInfo: MedikitItem { + mass = 60; + }; + }; + + class ACE_fieldDressing: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + model = QPATHTOF(data\bandage.p3d); + picture = QPATHTOF(ui\fieldDressing_ca.paa); + displayName = CSTRING(Bandage_Basic_Display); + descriptionShort = CSTRING(Bandage_Basic_Desc_Short); + descriptionUse = CSTRING(Bandage_Basic_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_packingBandage: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Packing_Bandage_Display); + picture = QPATHTOF(ui\packingBandage_ca.paa); + model = QPATHTOF(data\packingbandage.p3d); + descriptionShort = CSTRING(Packing_Bandage_Desc_Short); + descriptionUse = CSTRING(Packing_Bandage_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_elasticBandage: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Bandage_Elastic_Display); + picture = QPATHTOF(ui\elasticBandage_ca.paa); + model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; + descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); + descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_tourniquet: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Tourniquet_Display); + picture = QPATHTOF(ui\tourniquet_ca.paa); + model = QPATHTOF(data\tourniquet.p3d); + descriptionShort = CSTRING(Tourniquet_Desc_Short); + descriptionUse = CSTRING(Tourniquet_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_splint: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(splint_Display); + picture = QPATHTOF(ui\splint_ca.paa); + model = QPATHTOF(data\splint.p3d); + descriptionShort = CSTRING(splint_Desc_Short); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 2; + }; + }; + class ACE_morphine: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Morphine_Display); + picture = QPATHTOF(ui\morphine_ca.paa); + model = QPATHTOF(data\morphine.p3d); + descriptionShort = CSTRING(Morphine_Desc_Short); + descriptionUse = CSTRING(Morphine_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_adenosine: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Adenosine_Display); + picture = QPATHTOF(ui\adenosine_ca.paa); + model = QPATHTOF(data\adenosine.p3d); + descriptionShort = CSTRING(adenosine_Desc_Short); + descriptionUse = CSTRING(adenosine_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_atropine: ACE_ItemCore { + scope = 1; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Atropine_Display); + picture = QPATHTOF(ui\atropine_ca.paa); + model = QPATHTOF(data\atropine.p3d); + descriptionShort = CSTRING(Atropine_Desc_Short); + descriptionUse = CSTRING(Atropine_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_epinephrine: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Epinephrine_Display); + picture = QPATHTOF(ui\epinephrine_ca.paa); + model = QPATHTOF(data\epinephrine.p3d); + descriptionShort = CSTRING(Epinephrine_Desc_Short); + descriptionUse = CSTRING(Epinephrine_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + + class ACE_plasmaIV: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Plasma_IV); + model = QPATHTOF(data\IVBag_1000ml.p3d); + hiddenSelections[] = {"camo"}; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_plasma_1000ml_ca.paa)}; + picture = QPATHTOF(ui\plasmaIV_ca.paa); + descriptionShort = CSTRING(Plasma_IV_Desc_Short); + descriptionUse = CSTRING(Plasma_IV_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 10; + }; + }; + class ACE_plasmaIV_500: ACE_plasmaIV { + displayName = CSTRING(Plasma_IV_500); + model = QPATHTOF(data\IVBag_500ml.p3d); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_plasma_500ml_ca.paa)}; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 5; + }; + }; + class ACE_plasmaIV_250: ACE_plasmaIV { + displayName = CSTRING(Plasma_IV_250); + model = QPATHTOF(data\IVBag_250ml.p3d); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_plasma_250ml_ca.paa)}; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 2.5; + }; + }; + class ACE_bloodIV: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + model = QPATHTOF(data\IVBag_1000ml.p3d); + displayName = CSTRING(Blood_IV); + picture = QPATHTOF(ui\bloodIV_ca.paa); + hiddenSelections[] = {"camo"}; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_1000ml_ca.paa)}; + descriptionShort = CSTRING(Blood_IV_Desc_Short); + descriptionUse = CSTRING(Blood_IV_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 10; + }; + }; + class ACE_bloodIV_500: ACE_bloodIV { + displayName = CSTRING(Blood_IV_500); + model = QPATHTOF(data\IVBag_500ml.p3d); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_500ml_ca.paa)}; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 5; + }; + }; + class ACE_bloodIV_250: ACE_bloodIV { + displayName = CSTRING(Blood_IV_250); + model = QPATHTOF(data\IVBag_250ml.p3d); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_250ml_ca.paa)}; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 2.5; + }; + }; + class ACE_salineIV: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Saline_IV); + model = QPATHTOF(data\IVBag_1000ml.p3d); + hiddenSelections[] = {"camo"}; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_saline_1000ml_ca.paa)}; + picture = QPATHTOF(ui\salineIV_ca.paa); + descriptionShort = CSTRING(Saline_IV_Desc_Short); + descriptionUse = CSTRING(Saline_IV_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 10; + }; + }; + class ACE_salineIV_500: ACE_salineIV { + displayName = CSTRING(Saline_IV_500); + model = QPATHTOF(data\IVBag_500ml.p3d); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_saline_500ml_ca.paa)}; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 5; + }; + }; + class ACE_salineIV_250: ACE_salineIV { + displayName = CSTRING(Saline_IV_250); + model = QPATHTOF(data\IVBag_250ml.p3d); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_saline_250ml_ca.paa)}; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 2.5; + }; + }; + class ACE_quikclot: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(QuikClot_Display); + model = QPATHTOF(data\QuikClot.p3d); + picture = QPATHTOF(ui\quickclot_ca.paa); + descriptionShort = CSTRING(QuikClot_Desc_Short); + descriptionUse = CSTRING(QuikClot_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + class ACE_personalAidKit: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Aid_Kit_Display); + picture = QPATHTOF(ui\personal_aid_kit_ca.paa); + descriptionShort = CSTRING(Aid_Kit_Desc_Short); + descriptionUse = CSTRING(Aid_Kit_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 10; + }; + }; + class ACE_surgicalKit: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName= CSTRING(SurgicalKit_Display); + model = QPATHTOF(data\surgical_kit.p3d); + picture = QPATHTOF(ui\surgicalKit_ca.paa); + descriptionShort = CSTRING(SurgicalKit_Desc_Short); + descriptionUse = CSTRING(SurgicalKit_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 15; + }; + }; + class ACE_bodyBag: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName= CSTRING(Bodybag_Display); + model = QPATHTOF(data\bodybagItem.p3d); + picture = QPATHTOF(ui\bodybag_ca.paa); + descriptionShort = CSTRING(Bodybag_Desc_Short); + descriptionUse = CSTRING(Bodybag_Desc_Use); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 7; + }; + }; +}; diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp new file mode 100644 index 00000000000..480a65f2cbc --- /dev/null +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -0,0 +1,62 @@ +PREP(addLoadPatientActions); +PREP(addToLog); +PREP(addToTriageCard); +PREP(bandage); +PREP(bandageLocal); +PREP(bodyCleanupLoop); +PREP(canBandage); +PREP(canCPR); +PREP(canSplint); +PREP(canStitch); +PREP(canTreat); +PREP(canTreatCached); +PREP(canTreat_holsterCheck); +PREP(checkBloodPressure); +PREP(checkBloodPressureLocal); +PREP(checkPulse); +PREP(checkPulseLocal); +PREP(checkResponse); +PREP(cprSuccess); +PREP(cprFailure); +PREP(cprLocal); +PREP(cprProgress); +PREP(cprStart); +PREP(createLitter); +PREP(createLitterServer); +PREP(diagnose); +PREP(findMostEffectiveWound); +PREP(fullHeal); +PREP(fullHealLocal); +PREP(getBandageTime); +PREP(getHealTime); +PREP(getStitchableWounds); +PREP(getStitchTime); +PREP(getTriageStatus); +PREP(handleBandageOpening); +PREP(hasItem); +PREP(hasTourniquetAppliedTo); +PREP(isInMedicalFacility); +PREP(isInMedicalVehicle); +PREP(isMedic); +PREP(isMedicalVehicle); +PREP(ivBag); +PREP(ivBagLocal); +PREP(litterCleanupLoop); +PREP(loadUnit); +PREP(medication); +PREP(medicationLocal); +PREP(onMedicationUsage); +PREP(placeInBodyBag); +PREP(removeBody); +PREP(setTriageStatus); +PREP(splint); +PREP(splintLocal); +PREP(surgicalKitProgress); +PREP(tourniquet); +PREP(tourniquetLocal); +PREP(tourniquetRemove); +PREP(treatment); +PREP(treatmentFailure); +PREP(treatmentSuccess); +PREP(unloadUnit); +PREP(useItem); diff --git a/addons/medical_treatment/XEH_postInit.sqf b/addons/medical_treatment/XEH_postInit.sqf new file mode 100644 index 00000000000..413f96cd432 --- /dev/null +++ b/addons/medical_treatment/XEH_postInit.sqf @@ -0,0 +1,63 @@ +#include "script_component.hpp" + +[QEGVAR(medical_status,initialized), { + params ["_unit"]; + + // Clear all saved medical logs + { + _unit setVariable [_x, nil, true]; + } forEach (_unit getVariable [QEGVAR(medical,allLogs), []]); + + _unit setVariable [QEGVAR(medical,allLogs), [], true]; +}] call CBA_fnc_addEventHandler; + +// Handle body removal and litter on server +if (isServer) then { + [QGVAR(createLitterServer), LINKFUNC(createLitterServer)] call CBA_fnc_addEventHandler; + ["ace_placedInBodyBag", LINKFUNC(removeBody)] call CBA_fnc_addEventHandler; +}; + +// Treatment events +[QGVAR(bandageLocal), LINKFUNC(bandageLocal)] call CBA_fnc_addEventHandler; +[QGVAR(checkBloodPressureLocal), LINKFUNC(checkBloodPressureLocal)] call CBA_fnc_addEventHandler; +[QGVAR(checkPulseLocal), LINKFUNC(checkPulseLocal)] call CBA_fnc_addEventHandler; +[QGVAR(cprLocal), LINKFUNC(cprLocal)] call CBA_fnc_addEventHandler; +[QGVAR(fullHealLocal), LINKFUNC(fullHealLocal)] call CBA_fnc_addEventHandler; +[QGVAR(ivBagLocal), LINKFUNC(ivBagLocal)] call CBA_fnc_addEventHandler; +[QGVAR(medicationLocal), LINKFUNC(medicationLocal)] call CBA_fnc_addEventHandler; +[QGVAR(placeInBodyBag), LINKFUNC(placeInBodyBag)] call CBA_fnc_addEventHandler; +[QGVAR(splintLocal), LINKFUNC(splintLocal)] call CBA_fnc_addEventHandler; +[QGVAR(tourniquetLocal), LINKFUNC(tourniquetLocal)] call CBA_fnc_addEventHandler; + +// Logging events +[QGVAR(addToLog), LINKFUNC(addToLog)] call CBA_fnc_addEventHandler; +[QGVAR(addToTriageCard), LINKFUNC(addToTriageCard)] call CBA_fnc_addEventHandler; + +// replace medical items with their ACE equivalents +["ace_settingsInitialized", { + TRACE_1("ace_settingsInitialized EH",GVAR(convertItems)); // 0: Enabled 1: RemoveOnly 2:Disabled + if (GVAR(convertItems) == 2) exitWith {}; + { + // turn [["stuff", 2], ...] into ["stuff", "stuff", ...] + private _replacements = []; + if (GVAR(convertItems) == 0) then { + { + _x params ["_item", "_count"]; + for "_i" from 1 to _count do { + _replacements pushBack _item; + }; + } forEach getArray _x; + }; + + // check if replacement is for item type or class name + private _configName = configName _x; + private _toReplace = if ((_configName select [0,9]) == "ItemType_") then { + parseNumber (_configName select [9]) + } else { + _configName + }; + + // register replacement + [_toReplace, _replacements] call EFUNC(common,registerItemReplacement); + } forEach (configProperties [configFile >> QEGVAR(medical,replacementItems), "isArray _x"]); +}] call CBA_fnc_addEventHandler; diff --git a/addons/medical_treatment/XEH_preInit.sqf b/addons/medical_treatment/XEH_preInit.sqf new file mode 100644 index 00000000000..dfb6bf6518f --- /dev/null +++ b/addons/medical_treatment/XEH_preInit.sqf @@ -0,0 +1,47 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +// config to determine animation acceleration coefficient +// adjusting these is trail and error +// if the animation is cut of ingame, increase these values +// if the unit idles too much, decrease them +GVAR(animDurations) = [] call CBA_fnc_createNamespace; + +{ + GVAR(animDurations) setVariable _x; +} forEach [ + ["AinvPknlMstpSlayWnonDnon_medic", 7.5], + ["AinvPpneMstpSlayWnonDnon_medic", 7], + ["AinvPknlMstpSlayWrflDnon_medic", 7], + ["AinvPpneMstpSlayWrflDnon_medic", 9.5], + ["AinvPknlMstpSlayWlnrDnon_medic", 9], + ["AinvPknlMstpSlayWpstDnon_medic", 9.5], + ["AinvPpneMstpSlayWpstDnon_medic", 10], + ["AinvPknlMstpSlayWnonDnon_medicOther", 8.5], + ["AinvPpneMstpSlayWnonDnon_medicOther", 8.5], + ["AinvPknlMstpSlayWrflDnon_medicOther", 7], + ["AinvPpneMstpSlayWrflDnon_medicOther", 9], + ["AinvPknlMstpSlayWlnrDnon_medicOther", 9], + ["AinvPknlMstpSlayWpstDnon_medicOther", 10], + ["AinvPpneMstpSlayWpstDnon_medicOther", 8.5], + ["AinvPknlMstpSnonWnonDnon_medic1", 10], + ["AinvPknlMstpSnonWnonDr_medic0", 12] +]; + +// class names of medical facilities (config case) +GVAR(facilityClasses) = []; +{ + { + private _name = configName (configFile >> "CfgVehicles" >> _x); + if (_name != "") then { GVAR(facilityClasses) pushBackUnique _name; }; + } forEach getArray _x; +} forEach configProperties [configFile >> QEGVAR(medical,facilities), "isArray _x"]; + +ADDON = true; diff --git a/addons/medical_treatment/XEH_preStart.sqf b/addons/medical_treatment/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_treatment/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp new file mode 100644 index 00000000000..29c11c18ad6 --- /dev/null +++ b/addons/medical_treatment/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_status", "ace_medical_damage", "ace_apl"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi", "Arcanum"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_Medical_Treatment.hpp" +#include "ACE_Medical_Treatment_Actions.hpp" +#include "ACE_Medical_Facilities.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgReplacementItems.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "Cfg3DEN.hpp" diff --git a/addons/medical_treatment/data/ACE_medicalSupplyCrate.jpg b/addons/medical_treatment/data/ACE_medicalSupplyCrate.jpg new file mode 100644 index 00000000000..7c351645d67 Binary files /dev/null and b/addons/medical_treatment/data/ACE_medicalSupplyCrate.jpg differ diff --git a/addons/medical/data/EpiMorphine_co.paa b/addons/medical_treatment/data/EpiMorphine_co.paa similarity index 100% rename from addons/medical/data/EpiMorphine_co.paa rename to addons/medical_treatment/data/EpiMorphine_co.paa diff --git a/addons/medical_treatment/data/IVBag.rvmat b/addons/medical_treatment/data/IVBag.rvmat new file mode 100644 index 00000000000..1b4677e42b4 --- /dev/null +++ b/addons/medical_treatment/data/IVBag.rvmat @@ -0,0 +1,99 @@ +#define _ARMA_ + +class StageTI +{ + texture = "a3\data_f\default_ti_ca.paa"; +}; +ambient[] = {1,1,1,1}; +diffuse[] = {1,1,1,1}; +forcedDiffuse[] = {0,0,0,0}; +emmisive[] = {0,0,0,0}; +specular[] = {0.3,0.3,0.3,0.3}; +specularPower = 150; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 +{ + texture = "z\ace\addons\medical_treatment\data\IVBag_nohq.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage2 +{ + texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage3 +{ + texture = "#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage4 +{ + texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage5 +{ + texture = "#(argb,8,8,3)color(0,0.6,1,1,SMDI)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage6 +{ + texture = "#(ai,64,64,1)fresnelGlass(2)"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage7 +{ + useWorldEnvMap = "true"; + texture = "a3\data_f\env_land_ca.paa"; + uvSource = "tex"; + class uvTransform + { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; diff --git a/addons/medical_treatment/data/IVBag_1000ml.p3d b/addons/medical_treatment/data/IVBag_1000ml.p3d new file mode 100644 index 00000000000..af080385093 Binary files /dev/null and b/addons/medical_treatment/data/IVBag_1000ml.p3d differ diff --git a/addons/medical_treatment/data/IVBag_250ml.p3d b/addons/medical_treatment/data/IVBag_250ml.p3d new file mode 100644 index 00000000000..de4113793fb Binary files /dev/null and b/addons/medical_treatment/data/IVBag_250ml.p3d differ diff --git a/addons/medical_treatment/data/IVBag_500ml.p3d b/addons/medical_treatment/data/IVBag_500ml.p3d new file mode 100644 index 00000000000..92e510d9bdc Binary files /dev/null and b/addons/medical_treatment/data/IVBag_500ml.p3d differ diff --git a/addons/medical/data/ivbag_blood_1000ml_ca.paa b/addons/medical_treatment/data/IVBag_blood_1000ml_ca.paa similarity index 100% rename from addons/medical/data/ivbag_blood_1000ml_ca.paa rename to addons/medical_treatment/data/IVBag_blood_1000ml_ca.paa diff --git a/addons/medical/data/ivbag_blood_250ml_ca.paa b/addons/medical_treatment/data/IVBag_blood_250ml_ca.paa similarity index 100% rename from addons/medical/data/ivbag_blood_250ml_ca.paa rename to addons/medical_treatment/data/IVBag_blood_250ml_ca.paa diff --git a/addons/medical/data/ivbag_blood_500ml_ca.paa b/addons/medical_treatment/data/IVBag_blood_500ml_ca.paa similarity index 100% rename from addons/medical/data/ivbag_blood_500ml_ca.paa rename to addons/medical_treatment/data/IVBag_blood_500ml_ca.paa diff --git a/addons/medical/data/IVBag_nohq.paa b/addons/medical_treatment/data/IVBag_nohq.paa similarity index 100% rename from addons/medical/data/IVBag_nohq.paa rename to addons/medical_treatment/data/IVBag_nohq.paa diff --git a/addons/medical/data/IVBag_plasma_1000ml_ca.paa b/addons/medical_treatment/data/IVBag_plasma_1000ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_plasma_1000ml_ca.paa rename to addons/medical_treatment/data/IVBag_plasma_1000ml_ca.paa diff --git a/addons/medical/data/IVBag_plasma_250ml_ca.paa b/addons/medical_treatment/data/IVBag_plasma_250ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_plasma_250ml_ca.paa rename to addons/medical_treatment/data/IVBag_plasma_250ml_ca.paa diff --git a/addons/medical/data/IVBag_plasma_500ml_ca.paa b/addons/medical_treatment/data/IVBag_plasma_500ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_plasma_500ml_ca.paa rename to addons/medical_treatment/data/IVBag_plasma_500ml_ca.paa diff --git a/addons/medical/data/IVBag_saline_1000ml_ca.paa b/addons/medical_treatment/data/IVBag_saline_1000ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_saline_1000ml_ca.paa rename to addons/medical_treatment/data/IVBag_saline_1000ml_ca.paa diff --git a/addons/medical/data/IVBag_saline_250ml_ca.paa b/addons/medical_treatment/data/IVBag_saline_250ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_saline_250ml_ca.paa rename to addons/medical_treatment/data/IVBag_saline_250ml_ca.paa diff --git a/addons/medical/data/IVBag_saline_500ml_ca.paa b/addons/medical_treatment/data/IVBag_saline_500ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_saline_500ml_ca.paa rename to addons/medical_treatment/data/IVBag_saline_500ml_ca.paa diff --git a/addons/medical_treatment/data/QuikClot.p3d b/addons/medical_treatment/data/QuikClot.p3d new file mode 100644 index 00000000000..d112ff163ee Binary files /dev/null and b/addons/medical_treatment/data/QuikClot.p3d differ diff --git a/addons/medical_treatment/data/QuikClot.rvmat b/addons/medical_treatment/data/QuikClot.rvmat new file mode 100644 index 00000000000..4b96d78ccb5 --- /dev/null +++ b/addons/medical_treatment/data/QuikClot.rvmat @@ -0,0 +1,82 @@ +class StageTI +{ + texture="a3\data_f\default_ti_ca.paa"; +}; +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.050000008,0.050000008,0.050000008,1}; +specularPower=50; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\quikclot_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={0,9,0}; + up[]={4.5,0,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 +{ + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage5 +{ + texture="#(argb,8,8,3)color(1,1,1,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 +{ + texture="#(ai,64,64,1)fresnel(1.5,1.22)"; + uvSource="none"; +}; +class Stage7 +{ + texture="a3\data_f\env_land_co.paa"; + uvSource="none"; +}; diff --git a/addons/medical/data/quikclot_co.paa b/addons/medical_treatment/data/QuikClot_CO.paa similarity index 100% rename from addons/medical/data/quikclot_co.paa rename to addons/medical_treatment/data/QuikClot_CO.paa diff --git a/addons/medical/data/quikclot_nohq.paa b/addons/medical_treatment/data/QuikClot_NOHQ.paa similarity index 100% rename from addons/medical/data/quikclot_nohq.paa rename to addons/medical_treatment/data/QuikClot_NOHQ.paa diff --git a/addons/medical/data/ace_litterclean_co.paa b/addons/medical_treatment/data/ace_litterclean_co.paa similarity index 100% rename from addons/medical/data/ace_litterclean_co.paa rename to addons/medical_treatment/data/ace_litterclean_co.paa diff --git a/addons/medical/data/ace_littergeneric1_co.paa b/addons/medical_treatment/data/ace_littergeneric1_co.paa similarity index 100% rename from addons/medical/data/ace_littergeneric1_co.paa rename to addons/medical_treatment/data/ace_littergeneric1_co.paa diff --git a/addons/medical_treatment/data/ace_medcrate.p3d b/addons/medical_treatment/data/ace_medcrate.p3d new file mode 100644 index 00000000000..5e6b2840fdb Binary files /dev/null and b/addons/medical_treatment/data/ace_medcrate.p3d differ diff --git a/addons/medical/data/ace_medcrate.rvmat b/addons/medical_treatment/data/ace_medcrate.rvmat similarity index 87% rename from addons/medical/data/ace_medcrate.rvmat rename to addons/medical_treatment/data/ace_medcrate.rvmat index 17488ebfdfb..c66fb9ca650 100644 --- a/addons/medical/data/ace_medcrate.rvmat +++ b/addons/medical_treatment/data/ace_medcrate.rvmat @@ -8,7 +8,7 @@ specularPower=50; PixelShaderID="Super"; VertexShaderID="Super"; class Stage1 { - texture="z\ace\addons\medical\data\ace_medcrate_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\ace_medcrate_nohq.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; @@ -38,7 +38,7 @@ class Stage3 { }; }; class Stage4 { - texture="z\ace\addons\medical\data\ace_medcrate_as.paa"; + texture="z\ace\addons\medical_treatment\data\ace_medcrate_as.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; @@ -48,7 +48,7 @@ class Stage4 { }; }; class Stage5 { - texture="z\ace\addons\medical\data\ace_medcrate_smdi.paa"; + texture="z\ace\addons\medical_treatment\data\ace_medcrate_smdi.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; diff --git a/addons/medical/data/ace_medcrate_as.paa b/addons/medical_treatment/data/ace_medcrate_as.paa similarity index 100% rename from addons/medical/data/ace_medcrate_as.paa rename to addons/medical_treatment/data/ace_medcrate_as.paa diff --git a/addons/medical/data/ace_medcrate_co.paa b/addons/medical_treatment/data/ace_medcrate_co.paa similarity index 100% rename from addons/medical/data/ace_medcrate_co.paa rename to addons/medical_treatment/data/ace_medcrate_co.paa diff --git a/addons/medical/data/ace_medcrate_nohq.paa b/addons/medical_treatment/data/ace_medcrate_nohq.paa similarity index 100% rename from addons/medical/data/ace_medcrate_nohq.paa rename to addons/medical_treatment/data/ace_medcrate_nohq.paa diff --git a/addons/medical/data/ace_medcrate_smdi.paa b/addons/medical_treatment/data/ace_medcrate_smdi.paa similarity index 100% rename from addons/medical/data/ace_medcrate_smdi.paa rename to addons/medical_treatment/data/ace_medcrate_smdi.paa diff --git a/addons/medical_treatment/data/adenosine.p3d b/addons/medical_treatment/data/adenosine.p3d new file mode 100644 index 00000000000..f52e9807604 Binary files /dev/null and b/addons/medical_treatment/data/adenosine.p3d differ diff --git a/addons/medical_treatment/data/atropine.p3d b/addons/medical_treatment/data/atropine.p3d new file mode 100644 index 00000000000..f52e9807604 Binary files /dev/null and b/addons/medical_treatment/data/atropine.p3d differ diff --git a/addons/medical/data/atropine_co.paa b/addons/medical_treatment/data/atropine_co.paa similarity index 100% rename from addons/medical/data/atropine_co.paa rename to addons/medical_treatment/data/atropine_co.paa diff --git a/addons/medical_treatment/data/bandage.p3d b/addons/medical_treatment/data/bandage.p3d new file mode 100644 index 00000000000..646a381de6c Binary files /dev/null and b/addons/medical_treatment/data/bandage.p3d differ diff --git a/addons/medical_treatment/data/bodybagItem.p3d b/addons/medical_treatment/data/bodybagItem.p3d new file mode 100644 index 00000000000..5195fd59d95 Binary files /dev/null and b/addons/medical_treatment/data/bodybagItem.p3d differ diff --git a/addons/medical_treatment/data/bodybagItem.rvmat b/addons/medical_treatment/data/bodybagItem.rvmat new file mode 100644 index 00000000000..e470a4e4f63 --- /dev/null +++ b/addons/medical_treatment/data/bodybagItem.rvmat @@ -0,0 +1,32 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={1.000000,1.000000,1.000000,1.000000}; +specularPower=20.000000; +PixelShaderID="NormalMapSpecularDIMap"; +VertexShaderID="NormalMap"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\bodybagItem_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 +{ + texture="z\ace\addons\medical_treatment\data\bodybagItem_smdi.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; diff --git a/addons/medical_treatment/data/bodybagItem_co.paa b/addons/medical_treatment/data/bodybagItem_co.paa new file mode 100644 index 00000000000..30b10428451 Binary files /dev/null and b/addons/medical_treatment/data/bodybagItem_co.paa differ diff --git a/addons/medical_treatment/data/bodybagItem_nohq.paa b/addons/medical_treatment/data/bodybagItem_nohq.paa new file mode 100644 index 00000000000..775246571fd Binary files /dev/null and b/addons/medical_treatment/data/bodybagItem_nohq.paa differ diff --git a/addons/medical_treatment/data/bodybagItem_smdi.paa b/addons/medical_treatment/data/bodybagItem_smdi.paa new file mode 100644 index 00000000000..33a1da4ab33 Binary files /dev/null and b/addons/medical_treatment/data/bodybagItem_smdi.paa differ diff --git a/addons/medical_treatment/data/epinephrine.p3d b/addons/medical_treatment/data/epinephrine.p3d new file mode 100644 index 00000000000..03b6cdde00e Binary files /dev/null and b/addons/medical_treatment/data/epinephrine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric.p3d b/addons/medical_treatment/data/littergeneric.p3d new file mode 100644 index 00000000000..a5e1d19c56e Binary files /dev/null and b/addons/medical_treatment/data/littergeneric.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_Quikclot.p3d b/addons/medical_treatment/data/littergeneric_Quikclot.p3d new file mode 100644 index 00000000000..949d19b7c08 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_Quikclot.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_adenosine.p3d b/addons/medical_treatment/data/littergeneric_adenosine.p3d new file mode 100644 index 00000000000..b33c34ed2db Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_adenosine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_atropine.p3d b/addons/medical_treatment/data/littergeneric_atropine.p3d new file mode 100644 index 00000000000..b33c34ed2db Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_atropine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_bandages1.p3d b/addons/medical_treatment/data/littergeneric_bandages1.p3d new file mode 100644 index 00000000000..b55652e6a25 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_bandages1.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_bandages2.p3d b/addons/medical_treatment/data/littergeneric_bandages2.p3d new file mode 100644 index 00000000000..b6c9c67fbdb Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_bandages2.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_bandages3.p3d b/addons/medical_treatment/data/littergeneric_bandages3.p3d new file mode 100644 index 00000000000..b6c9c67fbdb Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_bandages3.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_clean.p3d b/addons/medical_treatment/data/littergeneric_clean.p3d new file mode 100644 index 00000000000..41cbf348248 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_clean.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_epinephrine.p3d b/addons/medical_treatment/data/littergeneric_epinephrine.p3d new file mode 100644 index 00000000000..0d08f978ccb Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_epinephrine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_gloves.p3d b/addons/medical_treatment/data/littergeneric_gloves.p3d new file mode 100644 index 00000000000..538935cf220 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_gloves.p3d differ diff --git a/addons/medical/data/littergeneric_gloves.rvmat b/addons/medical_treatment/data/littergeneric_gloves.rvmat similarity index 88% rename from addons/medical/data/littergeneric_gloves.rvmat rename to addons/medical_treatment/data/littergeneric_gloves.rvmat index 0a0df2c55cf..fdcfa17688d 100644 --- a/addons/medical/data/littergeneric_gloves.rvmat +++ b/addons/medical_treatment/data/littergeneric_gloves.rvmat @@ -8,7 +8,7 @@ PixelShaderID="NormalMapSpecularDIMap"; VertexShaderID="NormalMap"; class Stage1 { - texture="z\ace\addons\medical\data\littergeneric_gloves_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\littergeneric_gloves_nohq.paa"; uvSource="tex"; class uvTransform { diff --git a/addons/medical/data/littergeneric_gloves_co.paa b/addons/medical_treatment/data/littergeneric_gloves_co.paa similarity index 100% rename from addons/medical/data/littergeneric_gloves_co.paa rename to addons/medical_treatment/data/littergeneric_gloves_co.paa diff --git a/addons/medical/data/littergeneric_gloves_nohq.paa b/addons/medical_treatment/data/littergeneric_gloves_nohq.paa similarity index 100% rename from addons/medical/data/littergeneric_gloves_nohq.paa rename to addons/medical_treatment/data/littergeneric_gloves_nohq.paa diff --git a/addons/medical_treatment/data/littergeneric_morphine.p3d b/addons/medical_treatment/data/littergeneric_morphine.p3d new file mode 100644 index 00000000000..f33b0120daf Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_morphine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_packingbandage.p3d b/addons/medical_treatment/data/littergeneric_packingbandage.p3d new file mode 100644 index 00000000000..abd840cafbe Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_packingbandage.p3d differ diff --git a/addons/medical/data/littergeneric_packingbandage.rvmat b/addons/medical_treatment/data/littergeneric_packingbandage.rvmat similarity index 86% rename from addons/medical/data/littergeneric_packingbandage.rvmat rename to addons/medical_treatment/data/littergeneric_packingbandage.rvmat index 8deaff550fc..25c9315da1c 100644 --- a/addons/medical/data/littergeneric_packingbandage.rvmat +++ b/addons/medical_treatment/data/littergeneric_packingbandage.rvmat @@ -7,7 +7,7 @@ PixelShaderID="NormalMapSpecularDIMap"; VertexShaderID="NormalMap"; class Stage1 { - texture="z\ace\addons\medical\data\littergeneric_packingbandage_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\littergeneric_packingbandage_nohq.paa"; uvSource="tex"; class uvTransform { diff --git a/addons/medical/data/littergeneric_packingbandage_nohq.paa b/addons/medical_treatment/data/littergeneric_packingbandage_nohq.paa similarity index 100% rename from addons/medical/data/littergeneric_packingbandage_nohq.paa rename to addons/medical_treatment/data/littergeneric_packingbandage_nohq.paa diff --git a/addons/medical_treatment/data/littergeneric_splint.p3d b/addons/medical_treatment/data/littergeneric_splint.p3d new file mode 100644 index 00000000000..4918cacaf41 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_splint.p3d differ diff --git a/addons/medical/data/medical_co.paa b/addons/medical_treatment/data/medical_co.paa similarity index 100% rename from addons/medical/data/medical_co.paa rename to addons/medical_treatment/data/medical_co.paa diff --git a/addons/medical_treatment/data/model.cfg b/addons/medical_treatment/data/model.cfg new file mode 100644 index 00000000000..344141e28e5 --- /dev/null +++ b/addons/medical_treatment/data/model.cfg @@ -0,0 +1,79 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + + class ACE_Medcrate_Skeleton { + isDiscrete = 1; + skeletonInherit = "Default"; + skeletonBones[] = { + "cover","" + }; + }; +}; + +class CfgModels { + class Default { + sectionsInherit=""; + sections[] = {""}; + skeletonName = ""; + }; + + + class ace_medcrate: Default { + skeletonName = "ACE_Medcrate_Skeleton"; + sectionsInherit = "Default"; + + class Animations { + class Cover { + type = "rotationX"; + source = "user"; + selection = "cover"; + axis = "cover_axis"; + memory = 1; + sourceAddress = "clamp"; + minValue = 0; + maxValue = 1; + angle0 = "0"; + angle1 = "rad + 240"; + }; + }; + }; + + class adenosine: Default {}; + class atropine: Default {}; + class bandage: Default {}; + class bodybagItem: Default {}; + class epinephrine: Default {}; + class splint: Default {}; + + class IVBagBase: Default { + sectionsInherit = ""; + sections[] = {"camo"}; + skeletonName = ""; + }; + class IVBag_250ml: IVBagBase {}; + class IVBag_500ml: IVBagBase {}; + class IVBag_1000ml: IVBagBase {}; + + class littergeneric: Default {}; + class littergeneric_adenosine: Default {}; + class littergeneric_atropine: Default {}; + class littergeneric_bandages1: Default {}; + class littergeneric_bandages2: Default {}; + class littergeneric_bandages3: Default {}; + class littergeneric_clean: Default {}; + class littergeneric_epinephrine: Default {}; + class littergeneric_gloves: Default {}; + class littergeneric_morphine: Default {}; + class littergeneric_packingbandage: Default {}; + class littergeneric_Quikclot: Default {}; + class littergeneric_splint: Default {}; + class morphine: Default {}; + class packingbandage: Default {}; + class QuikClot: Default {}; + class surgical_kit: Default {}; + class tourniquet: Default {}; +}; diff --git a/addons/medical_treatment/data/morphine.p3d b/addons/medical_treatment/data/morphine.p3d new file mode 100644 index 00000000000..93f0b965a2b Binary files /dev/null and b/addons/medical_treatment/data/morphine.p3d differ diff --git a/addons/medical_treatment/data/packingbandage.p3d b/addons/medical_treatment/data/packingbandage.p3d new file mode 100644 index 00000000000..7442a1e68d7 Binary files /dev/null and b/addons/medical_treatment/data/packingbandage.p3d differ diff --git a/addons/medical_treatment/data/packingbandage.rvmat b/addons/medical_treatment/data/packingbandage.rvmat new file mode 100644 index 00000000000..fcf42db5d16 --- /dev/null +++ b/addons/medical_treatment/data/packingbandage.rvmat @@ -0,0 +1,32 @@ +ambient[]={1,1,1,1}; +diffuse[]={0.5,0.5,0.5,1}; +forcedDiffuse[]={0.5,0.5,0.5,0}; +emmisive[]={0,0,0,0}; +specular[]={0,0,0,0}; +specularPower=0; +PixelShaderID="NormalMapSpecularDIMap"; +VertexShaderID="NormalMap"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\packingbandage_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture= "#(argb,8,8,3)color(0,0,0,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={0,0,0}; + up[]={0,0,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/medical/data/packingbandage_co.paa b/addons/medical_treatment/data/packingbandage_co.paa similarity index 100% rename from addons/medical/data/packingbandage_co.paa rename to addons/medical_treatment/data/packingbandage_co.paa diff --git a/addons/medical/data/packingbandage_nohq.paa b/addons/medical_treatment/data/packingbandage_nohq.paa similarity index 100% rename from addons/medical/data/packingbandage_nohq.paa rename to addons/medical_treatment/data/packingbandage_nohq.paa diff --git a/addons/medical_treatment/data/splint.p3d b/addons/medical_treatment/data/splint.p3d new file mode 100644 index 00000000000..20cbe0a5d06 Binary files /dev/null and b/addons/medical_treatment/data/splint.p3d differ diff --git a/addons/medical_treatment/data/splint.rvmat b/addons/medical_treatment/data/splint.rvmat new file mode 100644 index 00000000000..69af44f7389 --- /dev/null +++ b/addons/medical_treatment/data/splint.rvmat @@ -0,0 +1,92 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={1,1,1,0}; +specularPower=50; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\splint_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 +{ + texture="z\ace\addons\medical_treatment\data\splint_as.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage5 +{ + texture="z\ace\addons\medical_treatment\data\splint_smdi.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 +{ + texture="#(ai,64,64,1)fresnel(2,0.1)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage7 +{ + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/medical_treatment/data/splint_as.paa b/addons/medical_treatment/data/splint_as.paa new file mode 100644 index 00000000000..810525bdab7 Binary files /dev/null and b/addons/medical_treatment/data/splint_as.paa differ diff --git a/addons/medical_treatment/data/splint_ca.paa b/addons/medical_treatment/data/splint_ca.paa new file mode 100644 index 00000000000..cff2ab6ff83 Binary files /dev/null and b/addons/medical_treatment/data/splint_ca.paa differ diff --git a/addons/medical_treatment/data/splint_nohq.paa b/addons/medical_treatment/data/splint_nohq.paa new file mode 100644 index 00000000000..2ed96ef1129 Binary files /dev/null and b/addons/medical_treatment/data/splint_nohq.paa differ diff --git a/addons/medical_treatment/data/splint_smdi.paa b/addons/medical_treatment/data/splint_smdi.paa new file mode 100644 index 00000000000..e9c4efb07b7 Binary files /dev/null and b/addons/medical_treatment/data/splint_smdi.paa differ diff --git a/addons/medical_treatment/data/surgical_kit.p3d b/addons/medical_treatment/data/surgical_kit.p3d new file mode 100644 index 00000000000..73de0d24691 Binary files /dev/null and b/addons/medical_treatment/data/surgical_kit.p3d differ diff --git a/addons/medical_treatment/data/surgical_kit.rvmat b/addons/medical_treatment/data/surgical_kit.rvmat new file mode 100644 index 00000000000..ed60fdd6890 --- /dev/null +++ b/addons/medical_treatment/data/surgical_kit.rvmat @@ -0,0 +1,92 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.70399898,0.70399898,0.70399898,0}; +specularPower=70; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\surgical_kit_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 +{ + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage5 +{ + texture="#(argb,8,8,3)color(0,0.05,1,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 +{ + texture="#(ai,32,128,1)fresnel(0.98,1.02)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage7 +{ + texture="z\ace\addons\apl\data\env_co.tga"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/medical/data/surgical_kit_co.paa b/addons/medical_treatment/data/surgical_kit_co.paa similarity index 100% rename from addons/medical/data/surgical_kit_co.paa rename to addons/medical_treatment/data/surgical_kit_co.paa diff --git a/addons/medical/data/surgical_kit_metal.rvmat b/addons/medical_treatment/data/surgical_kit_metal.rvmat similarity index 100% rename from addons/medical/data/surgical_kit_metal.rvmat rename to addons/medical_treatment/data/surgical_kit_metal.rvmat diff --git a/addons/medical/data/surgical_kit_nohq.paa b/addons/medical_treatment/data/surgical_kit_nohq.paa similarity index 100% rename from addons/medical/data/surgical_kit_nohq.paa rename to addons/medical_treatment/data/surgical_kit_nohq.paa diff --git a/addons/medical_treatment/data/tourniquet.p3d b/addons/medical_treatment/data/tourniquet.p3d new file mode 100644 index 00000000000..841279b5aeb Binary files /dev/null and b/addons/medical_treatment/data/tourniquet.p3d differ diff --git a/addons/medical/data/tourniquet_co.paa b/addons/medical_treatment/data/tourniquet_co.paa similarity index 100% rename from addons/medical/data/tourniquet_co.paa rename to addons/medical_treatment/data/tourniquet_co.paa diff --git a/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf new file mode 100644 index 00000000000..fe97152c92b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: 654wak654 + * Returns children actions to the "Load Patient" action for nearby vehicles. + * + * Arguments: + * 0: Patient + * + * Return Value: + * Actions + * + * Example: + * [cursorObject] call ace_medical_treatment_fnc_addLoadPatientActions + * + * Public: No + */ + +params ["_target"]; + +private _statement = { + params ["_target", "_player", "_vehicle"]; + [_player, _target, _vehicle] call FUNC(loadUnit); +}; + +[_target call EFUNC(common,nearestVehiclesFreeSeat), _statement, _target] call EFUNC(interact_menu,createVehiclesActions) diff --git a/addons/medical_treatment/functions/fnc_addToLog.sqf b/addons/medical_treatment/functions/fnc_addToLog.sqf new file mode 100644 index 00000000000..b250fec9b1c --- /dev/null +++ b/addons/medical_treatment/functions/fnc_addToLog.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Adds an entry to the specified medical log of the unit. + * + * Arguments: + * 0: Unit + * 1: Log Type + * 2: Message + * 3: Formatting Arguments + * + * Return Value: + * None + * + * Example: + * [player, "activity", "Message %1", ["Name"]] call ace_medical_treatment_fnc_addToLog + * + * Public: No + */ + +params ["_unit", "_logType", "_message", "_arguments"]; + +if (!local _unit) exitWith { + [QGVAR(addToLog), _this, _unit] call CBA_fnc_targetEvent; +}; + +date params ["", "", "", "_hour", "_minute"]; +private _timeStamp = format ["%1:%2", _hour, [_minute, 2] call CBA_fnc_formatNumber]; + +private _logVarName = MED_LOG_VARNAME(_logType); +private _log = _unit getVariable [_logVarName, []]; + +if (count _log >= MED_LOG_MAX_ENTRIES) then { + _log deleteAt 0; +}; + +_log pushBack [_message, _timeStamp, _arguments, _logType]; +_unit setVariable [_logVarName, _log, true]; + +private _allLogs = _unit getVariable [QEGVAR(medical,allLogs), []]; + +if !(_logVarName in _allLogs) then { + _allLogs pushBack _logVarName; + _unit setVariable [QEGVAR(medical,allLogs), _allLogs, true]; +}; diff --git a/addons/medical_treatment/functions/fnc_addToTriageCard.sqf b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf new file mode 100644 index 00000000000..75cbc76b267 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Adds an entry to the unit's triage card. + * + * Arguments: + * 0: Unit + * 1: Item Classname + * + * Return Value: + * None + * + * Example: + * [player, "ACE_morphine"] call ace_medical_treatment_fnc_addToTriageCard + * + * Public: No + */ + +params ["_unit", "_item"]; + +if (!local _unit) exitWith { + [QGVAR(addToTriageCard), _this, _unit] call CBA_fnc_targetEvent; +}; + +private _triageCard = _unit getVariable [QEGVAR(medical,triageCard), []]; +private _index = _triageCard findIf {_x select 0 == _item}; + +if (_index == -1) then { + _triageCard pushBack [_item, 1, CBA_missionTime]; +} else { + _triageCard set [_index, [_item, (_triageCard select _index select 1) + 1, CBA_missionTime]]; +}; + +_unit setVariable [QEGVAR(medical,triageCard), _triageCard, true]; + +// todo: add amount of item to event args? +["ace_triageCardItemAdded", [_unit, _item]] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_bandage.sqf b/addons/medical_treatment/functions/fnc_bandage.sqf new file mode 100644 index 00000000000..1a7dd4f8186 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_bandage.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Bandages open wounds on the given body part of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head", "FieldDressing"] call ace_medical_treatment_fnc_bandage + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +[_patient, "activity", LSTRING(Activity_bandagedPatient), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(bandageLocal), [_patient, _bodyPart, _classname], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_bandageLocal.sqf b/addons/medical_treatment/functions/fnc_bandageLocal.sqf new file mode 100644 index 00000000000..61f1d695b5a --- /dev/null +++ b/addons/medical_treatment/functions/fnc_bandageLocal.sqf @@ -0,0 +1,84 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for bandaging a patient's open wounds. + * + * Arguments: + * 0: Patient + * 1: Body Part + * 2: Treatment + * + * Return Value: + * None + * + * Example: + * [player, "Head", "FieldDressing"] call ace_medical_treatment_fnc_bandageLocal + * + * Public: No + */ + +params ["_patient", "_bodyPart", "_bandage"]; +TRACE_3("bandageLocal",_patient,_bodyPart,_bandage); + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +if (_partIndex < 0) exitWith {}; + +private _openWounds = GET_OPEN_WOUNDS(_patient); +if (_openWounds isEqualTo []) exitWith {}; + +// Figure out which injury for this bodypart is the best choice to bandage +// TODO also use up the remainder on left over injuries +private _targetWound = [_patient, _bandage, _partIndex] call FUNC(findMostEffectiveWound); +_targetWound params ["_wound", "_woundIndex", "_effectiveness"]; + +// Everything is patched up on this body part already +if (_effectiveness == -1) exitWith {}; + +// Find the impact this bandage has and reduce the amount this injury is present +private _amountOf = _wound select 2; +private _impact = _effectiveness min _amountOf; +_amountOf = _amountOf - _impact; +_wound set [2, _amountOf]; +_openWounds set [_woundIndex, _wound]; + +_patient setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; + +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); + +// Handle the reopening of bandaged wounds +if (_impact > 0 && {GVAR(advancedBandages) == 2}) then { + [_patient, _impact, _partIndex, _woundIndex, _wound, _bandage] call FUNC(handleBandageOpening); +}; + +// Check if we fixed limping from this treatment +if (EGVAR(medical,limping) == 1 && {_partIndex > 3} && {_amountOf <= 0} && {_patient getVariable [QEGVAR(medical,isLimping), false]}) then { + [_patient] call EFUNC(medical_engine,updateDamageEffects); +}; + +if (GVAR(clearTraumaAfterBandage)) then { + TRACE_2("clearTraumaAfterBandage - checking open wounds",_partIndex,_openWounds); + if ((_openWounds findIf { + _x params ["", "_xBodyPartN", "_xAmountOf"]; + (_partIndex ==_xBodyPartN) && {_xAmountOf > 0} + }) == -1) then { + + private _bodyPartDamage = _patient getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; + _bodyPartDamage set [_partIndex, 0]; + _patient setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; + TRACE_2("fully healed",_partIndex,_bodyPartDamage); + + switch (_partIndex) do { + case 0: { [_patient, true, false, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + case 1: { [_patient, false, true, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + case 2; + case 3: { [_patient, false, false, true, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + default { [_patient, false, false, false, true] call EFUNC(medical_engine,updateBodyPartVisuals); }; + }; + }; +}; + +if (_amountOf <= 0) then { // Reset treatment condition cache for nearby players if we stopped all bleeding + private _nearPlayers = (_patient nearEntities ["CAManBase", 6]) select {_x call EFUNC(common,isPlayer)}; + TRACE_1("clearConditionCaches: bandage",_nearPlayers); + [QEGVAR(interact_menu,clearConditionCaches), [], _nearPlayers] call CBA_fnc_targetEvent; +}; diff --git a/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf new file mode 100644 index 00000000000..1e630b510a0 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, esteldunedain + * Handles cleaning up bodies that were replaced by body bags. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_treatment_fnc_bodyCleanupLoop + * + * Public: No + */ + +{ + TRACE_2("Handling body cleanup",_x,isPlayer _x); + if (!isNull _x && {!isPlayer _x}) then {deleteVehicle _x}; +} forEach GVAR(bodiesToDelete); + +// deleteVehicle doesn't have instant results so it won't usualy be filtered until next run +GVAR(bodiesToDelete) = GVAR(bodiesToDelete) - [objNull]; + +// Exit the loop if no more bodies remain +if (GVAR(bodiesToDelete) isEqualTo []) exitWith { + TRACE_1("Ending body cleanup loop",GVAR(bodiesToDelete)); +}; + +// Schedule cleanup loop to executed again +[FUNC(bodyCleanupLoop), [], BODY_CLEANUP_CHECK_DELAY] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_treatment/functions/fnc_canBandage.sqf b/addons/medical_treatment/functions/fnc_canBandage.sqf new file mode 100644 index 00000000000..0908e469b20 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canBandage.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Prevents bandage actions from showing if selected body part isn't bleeding. + * Toggles between showing all or only basic bandage action for advanced setting. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * Can Bandage + * + * Example: + * [player, cursorTarget, "Head", "FieldDressing"] call ace_medical_treatment_fnc_canBandage + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_bandage"]; + +// Bandage type and bandage setting XNOR to show only active actions +if ((_bandage == "BasicBandage") isEqualTo (GVAR(advancedBandages) != 0)) exitWith {false}; + +private _index = ALL_BODY_PARTS find toLower _bodyPart; +private _canBandage = false; + +{ + _x params ["", "_bodyPartN", "_amountOf", "_bleeding"]; + + // If any single wound on the bodypart is bleeding bandaging can go ahead + if (_bodyPartN == _index && {_amountOf * _bleeding > 0}) exitWith { + _canBandage = true; + }; +} forEach GET_OPEN_WOUNDS(_patient); + +_canBandage diff --git a/addons/medical_treatment/functions/fnc_canCPR.sqf b/addons/medical_treatment/functions/fnc_canCPR.sqf new file mode 100644 index 00000000000..406bccdb673 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canCPR.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Checks if CPR can be performed on the patient. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Can CPR + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_canCPR + * + * Public: No + */ + +params ["", "_patient"]; + +!(_patient call EFUNC(common,isAwake)) +&& {GVAR(advancedDiagnose) || {IN_CRDC_ARRST(_patient)}} // if basic diagnose, then only show action if appropriate (they can't tell difference between uncon/ca) +&& {isNull (_patient getVariable [QEGVAR(medical,CPR_provider), objNull])} diff --git a/addons/medical_treatment/functions/fnc_canSplint.sqf b/addons/medical_treatment/functions/fnc_canSplint.sqf new file mode 100644 index 00000000000..56551ace02e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canSplint.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Checks if a splint can be applied to the patient. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * 2: Body Part + * + * Return Value: + * Can Splint + * + * Example: + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_canSplint + * + * Public: No + */ + +params ["", "_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +(GET_FRACTURES(_patient) select _partIndex) == 1 diff --git a/addons/medical_treatment/functions/fnc_canStitch.sqf b/addons/medical_treatment/functions/fnc_canStitch.sqf new file mode 100644 index 00000000000..ea4318874dc --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canStitch.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Katalam, mharis001 + * Checks if the patient can be stitched. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * ReturnValue: + * Can Stitch + * + * Example: + * [player, cursorTarget] call ace_medical_treatment_fnc_canStitch + * + * Public: No + */ + +params ["", "_patient"]; + +!(_patient call FUNC(getStitchableWounds) isEqualTo []) diff --git a/addons/medical_treatment/functions/fnc_canTreat.sqf b/addons/medical_treatment/functions/fnc_canTreat.sqf new file mode 100644 index 00000000000..938e8a356d1 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canTreat.sqf @@ -0,0 +1,62 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Checks if the given treatment can be performed. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * Can Treat + * + * Example: + * [player, cursorObject, "Head", "SurgicalKit"] call ace_medical_treatment_fnc_canTreat + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +private _config = configFile >> QGVAR(actions) >> _classname; + +isClass _config +&& {_patient isKindOf "CAManBase"} +&& {_medic != _patient || {GET_NUMBER_ENTRY(_config >> "allowSelfTreatment") == 1}} +&& {[_medic, GET_NUMBER_ENTRY(_config >> "medicRequired")] call FUNC(isMedic)} +&& {[_medic, _patient, _config] call FUNC(canTreat_holsterCheck)} +&& { + private _selections = getArray (_config >> "allowedSelections") apply {toLower _x}; + "all" in _selections || {_bodyPart in _selections} +} && { + private _items = getArray (_config >> "items"); + _items isEqualTo [] || {[_medic, _patient, _items] call FUNC(hasItem)} +} && { + GET_FUNCTION(_condition,_config >> "condition"); + + if (_condition isEqualType {}) then { + if (_condition isEqualTo {}) exitWith { + _condition = true; + }; + + _condition = call _condition; + }; + + _condition +} && { + switch (GET_NUMBER_ENTRY(_config >> "treatmentLocations")) do { + case TREATMENT_LOCATIONS_ALL: {true}; + case TREATMENT_LOCATIONS_VEHICLES: { + IN_MED_VEHICLE(_medic) || {IN_MED_VEHICLE(_patient)} + }; + case TREATMENT_LOCATIONS_FACILITIES: { + IN_MED_FACILITY(_medic) || {IN_MED_FACILITY(_patient)} + }; + case TREATMENT_LOCATIONS_VEHICLES_AND_FACILITIES: { + IN_MED_VEHICLE(_medic) || {IN_MED_VEHICLE(_patient)} || {IN_MED_FACILITY(_medic)} || {IN_MED_FACILITY(_patient)} + }; + default {false}; + }; +} diff --git a/addons/medical_treatment/functions/fnc_canTreatCached.sqf b/addons/medical_treatment/functions/fnc_canTreatCached.sqf new file mode 100644 index 00000000000..d70f041c174 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canTreatCached.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Cached check to determine if given treatment can be performed. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * Can Treat + * + * Example: + * [player, cursorObject, "Head", "SurgicalKit"] call ace_medical_treatment_fnc_canTreatCached + * + * Public: No + */ + +params ["", "_patient", "_bodyPart", "_classname"]; + +[_this, FUNC(canTreat), _patient, format [QGVAR(canTreat_%1_%2), _bodyPart, _classname], CAN_TREAT_CONDITION_CACHE_EXPIRY, QEGVAR(interact_menu,clearConditionCaches)] call EFUNC(common,cachedCall); diff --git a/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf b/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf new file mode 100644 index 00000000000..96f498c2583 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: ddm999 + * Handle holster settings [disabled, lowered, loweredExam, holster, holsterExam] + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Treatment Config + * + * Return Value: + * Can Treat + * + * Example: + * [player, cursorObject, cfg] call ace_medical_treatment_fnc_canTreat_holsterCheck + * + * Public: No + */ + +params ["_medic", "_patient", "_config"]; + +GVAR(holsterRequired) == 0 +|| {vehicle _medic != _medic} // medic is in a vehicle, so weapon is considered holstered +|| {vehicle _patient != _patient} // patient is in a vehicle, ^ +|| {(GVAR(holsterRequired) in [2,4]) && {getText (_config >> "category") == "examine"}} // if examine bypass is on +|| {currentWeapon _medic isEqualTo ""} // weapon is holstered +|| {(GVAR(holsterRequired) <= 2) && {weaponLowered _medic}} // if just lowered is allowed diff --git a/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf b/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf new file mode 100644 index 00000000000..b708b7e50fe --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks the blood pressure of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftArm"] call ace_medical_treatment_fnc_checkBloodPressure + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +[QGVAR(checkBloodPressureLocal), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf b/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf new file mode 100644 index 00000000000..5da7495f74b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for checking the blood pressure of a patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftArm"] call ace_medical_treatment_fnc_checkBloodPressureLocal + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +private _bloodPressure = [0, 0]; + +if (alive _patient && {!([_patient, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { + _bloodPressure = GET_BLOOD_PRESSURE(_patient); +}; + +private _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_6); +private _logOutput = LSTRING(Check_Bloodpressure_NoBloodpressure); + +_bloodPressure params ["_bloodPressureLow", "_bloodPressureHigh"]; + +if (_bloodPressureHigh > 20) then { + if (_medic call FUNC(isMedic)) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_1); + _logOutput = format ["%1/%2", round _bloodPressureHigh, round _bloodPressureLow]; + } else { + if (_bloodPressureHigh > 20) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_2); + _logOutput = LSTRING(Check_Bloodpressure_Low); + + if (_bloodPressureHigh > 100) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_3); + _logOutput = LSTRING(Check_Bloodpressure_Normal); + + if (_bloodPressureHigh > 160) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_4); + _logOutput = LSTRING(Check_Bloodpressure_High); + }; + }; + }; + }; +}; + +[_patient, "quick_view", LSTRING(Check_Bloodpressure_Log), [_medic call EFUNC(common,getName), _logOutput]] call FUNC(addToLog); + +[QEGVAR(common,displayTextStructured), [[_bloodPressureOutput, _patient call EFUNC(common,getName), round _bloodPressureHigh, round _bloodPressureLow], 1.75, _medic], _medic] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkPulse.sqf b/addons/medical_treatment/functions/fnc_checkPulse.sqf new file mode 100644 index 00000000000..6c5b628fae6 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkPulse.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks the pulse or heart rate of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head"] call ace_medical_treatment_fnc_checkPulse + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +[QGVAR(checkPulseLocal), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf b/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf new file mode 100644 index 00000000000..f386fa2c899 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for checking the pulse or heart rate of a patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head"] call ace_medical_treatment_fnc_checkPulseLocal + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +private _heartRate = 0; + +if (alive _patient && {!([_patient, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { + _heartRate = GET_HEART_RATE(_patient); +}; + +private _heartRateOutput = LSTRING(Check_Pulse_Output_5); +private _logOutput = LSTRING(Check_Pulse_None); + +if (_heartRate > 1) then { + if (_medic call FUNC(isMedic)) then { + _heartRateOutput = LSTRING(Check_Pulse_Output_1); + _logOutput = format ["%1", round _heartRate]; + } else { + _heartRateOutput = LSTRING(Check_Pulse_Output_2); + _logOutput = LSTRING(Check_Pulse_Weak); + + if (_heartRate > 60) then { + if (_heartRate > 100) then { + _heartRateOutput = LSTRING(Check_Pulse_Output_3); + _logOutput = LSTRING(Check_Pulse_Strong); + } else { + _heartRateOutput = LSTRING(Check_Pulse_Output_4); + _logOutput = LSTRING(Check_Pulse_Normal); + }; + }; + }; +}; + +[_patient, "quick_view", LSTRING(Check_Pulse_Log), [_medic call EFUNC(common,getName), _logOutput]] call FUNC(addToLog); + +[QEGVAR(common,displayTextStructured), [[_heartRateOutput, _patient call EFUNC(common,getName), round _heartRate], 1.5, _medic], _medic] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkResponse.sqf b/addons/medical_treatment/functions/fnc_checkResponse.sqf new file mode 100644 index 00000000000..0fe0bbd60e4 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkResponse.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks the response status of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_checkResponse + * + * Public: No + */ + +params ["_medic", "_patient"]; + +private _output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select (_patient call EFUNC(common,isAwake)); +[[_output, _patient call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); + +[_patient, "quick_view", _output, [[_patient, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical_treatment/functions/fnc_cprFailure.sqf b/addons/medical_treatment/functions/fnc_cprFailure.sqf new file mode 100644 index 00000000000..513c2e43ee9 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprFailure.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles failure of the CPR treatment. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprFailure + * + * Public: No + */ + +params ["_medic", "_patient"]; +TRACE_2("cprFailure",_medic,_patient); + +_patient setVariable [QEGVAR(medical,CPR_provider), objNull, true]; diff --git a/addons/medical_treatment/functions/fnc_cprLocal.sqf b/addons/medical_treatment/functions/fnc_cprLocal.sqf new file mode 100644 index 00000000000..3d9dfd1e32a --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprLocal.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for finishing performing CPR on the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprLocal + * + * Public: No + */ + +params ["_medic", "_patient"]; +TRACE_2("cprLocal",_medic,_patient); + +[_patient, "activity", LSTRING(Activity_CPR), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +if ((random 1) < GVAR(cprSuccessChance)) then { + TRACE_1("CPR random success",GVAR(cprSuccessChance)); + [QEGVAR(medical,CPRSucceeded), _patient] call CBA_fnc_localEvent; +} else { + TRACE_1("CPR random fail",GVAR(cprSuccessChance)); +}; + diff --git a/addons/medical_treatment/functions/fnc_cprProgress.sqf b/addons/medical_treatment/functions/fnc_cprProgress.sqf new file mode 100644 index 00000000000..f41fefe5bfa --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprProgress.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles the progress of the CPR treatment. + * + * Arguments: + * 0: Arguments + * 0: Medic + * 1: Patient + * + * Return Value: + * Continue CPR + * + * Example: + * [[player, cursorObject]] call ace_medical_treatment_fnc_cprProgress + * + * Public: No + */ + +params ["_args"]; +_args params ["_medic", "_patient"]; + +// Cancel CPR if patient wakes up + +!(_patient call EFUNC(common,isAwake)) +&& {(GVAR(advancedDiagnose)) || {IN_CRDC_ARRST(_patient)}} // if basic diagnose, then only show action if appropriate (they can't tell difference between uncon/ca) +&& {_medic == (_patient getVariable [QEGVAR(medical,CPR_provider), objNull])} diff --git a/addons/medical_treatment/functions/fnc_cprStart.sqf b/addons/medical_treatment/functions/fnc_cprStart.sqf new file mode 100644 index 00000000000..f49ccbb4a3b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprStart.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles starting the CPR treatment. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprStart + * + * Public: No + */ + +params ["_medic", "_patient"]; +TRACE_2("cprStart",_medic,_patient); + +_patient setVariable [QEGVAR(medical,CPR_provider), _medic, true]; diff --git a/addons/medical_treatment/functions/fnc_cprSuccess.sqf b/addons/medical_treatment/functions/fnc_cprSuccess.sqf new file mode 100644 index 00000000000..bd9d0c3e2bd --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprSuccess.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles finishing performing CPR on the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprSuccess + * + * Public: No + */ + +params ["_medic", "_patient"]; +TRACE_2("cprSuccess",_medic,_patient); + +_patient setVariable [QEGVAR(medical,CPR_provider), objNull, true]; + +if (alive _patient && {IN_CRDC_ARRST(_patient)}) then { + TRACE_1("sending cprLocal event",_patient); + [QGVAR(cprLocal), [_medic, _patient], _patient] call CBA_fnc_targetEvent; +} else { + TRACE_1("not alive or in cardiac arrest",_patient); +}; diff --git a/addons/medical_treatment/functions/fnc_createLitter.sqf b/addons/medical_treatment/functions/fnc_createLitter.sqf new file mode 100644 index 00000000000..93b7e7397e3 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_createLitter.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Creates litter around the patient based on the treatment. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head", "BasicBandage"] call ace_medical_treatment_fnc_createLitter + * + * Public: No + */ + +// Exit if litter creation is disabled +if (!GVAR(allowLitterCreation)) exitWith {}; + +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +// Don't create litter if medic or patient are inside a vehicle +if (vehicle _medic != _medic || {vehicle _patient != _patient}) exitWith {}; + +// Determine if treated body part is bleeding +private _index = ALL_BODY_PARTS find toLower _bodyPart; +private _isBleeding = GET_OPEN_WOUNDS(_patient) findIf { + _x params ["", "_bodyPartN", "_amountOf", "_bleeding"]; + + _bodyPartN == _index && {_amountOf * _bleeding > 0} +} != -1; + +// Get litter config for the treatment +private _litter = getArray (configFile >> QGVAR(actions) >> _classname >> "litter"); +_litter params [["_alwaysLitter", [], [[]]], ["_cleanLitter", [], [[]]], ["_bloodyLitter", [], [[]]]]; + +private _fnc_createLitter = { + params ["_litterOptions"]; + + private _position = getPosASL _patient; + + // For now, don't spawn litter over water to avoid floating litter + // todo: handle carriers over water + if (surfaceIsWater _position) exitWith {}; + + { + if (_x isEqualType []) then { + _x = selectRandom _x; + }; + + // Randomize position XY +/- 1 m + private _position = _position vectorAdd [ + random 2 - 1, + random 2 - 1, + 0 + ]; + + // Create litter on server which will also handle cleanup + [QGVAR(createLitterServer), [_x, _position, random 360]] call CBA_fnc_serverEvent; + } forEach _litterOptions; +}; + +private _conditionalLitter = [_cleanLitter, _bloodyLitter] select _isBleeding; + +[_alwaysLitter] call _fnc_createLitter; +[_conditionalLitter] call _fnc_createLitter; diff --git a/addons/medical_treatment/functions/fnc_createLitterServer.sqf b/addons/medical_treatment/functions/fnc_createLitterServer.sqf new file mode 100644 index 00000000000..790d1d21c57 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_createLitterServer.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Creates a litter object and handles its cleanup. Only execute on server. + * + * Arguments: + * 0: Litter Class + * 1: Position ASL + * 2: Direction + * + * Return Value: + * None + * + * Example: + * ["Litter_1", [100, 100, 0], 90] call ace_medical_treatment_fnc_createLitterServer + * + * Public: No + */ + +params ["_litterClass", "_position", "_direction"]; + +if (isNil QGVAR(litterObjects)) then { + GVAR(litterObjects) = []; + GVAR(litterCleanup) = false; +}; + +private _model = getText (configFile >> "CfgVehicles" >> _litterClass >> "model"); +if (_model == "") exitWith {}; + +// createSimpleObject expects a path without the leading slash +if (_model select [0, 1] == "\") then { + _model = _model select [1]; +}; + +private _object = createSimpleObject [_model, [0, 0, 0]]; +_object setPosASL _position; +_object setDir _direction; + +// Set the litter object's position next frame to correct HORRIBLE spacing (fixes #1112) +[{ + params ["_object", "_position"]; + _object setPosASL _position; +}, [_object, _position]] call CBA_fnc_execNextFrame; + +// Delete oldest litter object if max count reached +if (count GVAR(litterObjects) > GVAR(maxLitterObjects)) then { + private _litterToDelete = GVAR(litterObjects) deleteAt 0; + deleteVehicle (_litterToDelete select 0); +}; + +GVAR(litterObjects) pushBack [_object, CBA_missionTime]; + +// Start cleanup loop if not already running and litter lifetime is not forever +if (!GVAR(litterCleanup) && {GVAR(litterCleanupDelay) > 0}) then { + [] call FUNC(litterCleanupLoop); + GVAR(litterCleanup) = true; +}; diff --git a/addons/medical_treatment/functions/fnc_diagnose.sqf b/addons/medical_treatment/functions/fnc_diagnose.sqf new file mode 100644 index 00000000000..531827302db --- /dev/null +++ b/addons/medical_treatment/functions/fnc_diagnose.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Action for diagnosing in basic medical + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_diagnose + * + * Public: No + */ + +params ["_medic", "_patient"]; + +private _messages = [LSTRING(diagnoseMessage), _patient call EFUNC(common,getName)]; + +if (alive _patient) then { + _messages pushBack LSTRING(diagnoseAlive); +} else { + _messages pushBack LSTRING(diagnoseDead); +}; + +private _hemorrhage = GET_HEMORRHAGE(_patient); +if (_hemorrhage > 0) then { + if (_hemorrhage > 1) then { + _messages pushBack LSTRING(lostBloodALot); + } else { + _messages pushBack LSTRING(lostBlood); + }; +} else { + _messages pushBack LSTRING(noBloodloss); +}; + +// todo: mirror pain visualization logic of medical_gui? +if (alive _patient) then { + if IS_IN_PAIN(_patient) then { + _messages pushBack LSTRING(inPain); + } else { + _messages pushBack LSTRING(noPain); + }; +}; + +[_messages, 3] call EFUNC(common,displayTextStructured); diff --git a/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf new file mode 100644 index 00000000000..a7a133c2e40 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Finds the wound most effective to bandage on the given bodypart of the patient for the given bandage type. + * + * Arguments: + * 0: Patient + * 1: Treatment classname + * 2: Body part index + * + * Return Value: + * [Wound, Index, Effectiveness] + * + * Public: No + */ + +params ["_patient", "_bandage", "_partIndex"]; + +// Get the default effectiveness for the used bandage +private _config = configFile >> QUOTE(ADDON) >> "Bandaging"; +private _effectiveness = getNumber (_config >> "effectiveness"); + +if (isClass (_config >> _bandage)) then { + _config = (_config >> _bandage); + + if (isNumber (_config >> "effectiveness")) then { + _effectiveness = getNumber (_config >> "effectiveness"); + }; +}; + +// Iterate over open wounds to find the most effective target +private _openWounds = GET_OPEN_WOUNDS(_patient); +if (_openWounds isEqualTo []) exitWith { [EMPTY_WOUND, -1, -1] }; + +private _wound = EMPTY_WOUND; +private _woundIndex = -1; +private _effectivenessFound = -1; + +{ + _x params ["_classID", "_partIndexN", "_amountOf", "_bleeding", "_damage"]; + + // Ignore wounds on other bodyparts + if (_partIndexN == _partIndex) then { + private _woundEffectiveness = _effectiveness; + + // Select the classname from the wound classname storage + private _className = EGVAR(medical_damage,woundClassNamesComplex) select _classID; + + // Get the effectiveness of the bandage on this wound type + if (isClass (_config >> _className)) then { + private _woundTreatmentConfig = _config >> _className; + + if (isNumber (_woundTreatmentConfig >> "effectiveness")) then { + _woundEffectiveness = getNumber (_woundTreatmentConfig >> "effectiveness"); + }; + } else { + // Basic medical bandage just has a base level config (same effectivenes for all wound types) + if (_bandage != "BasicBandage") then { + WARNING_2("No config for wound type [%1] config base [%2]",_className,_config); + }; + }; + + // Track most effective found so far + if (_woundEffectiveness * _amountOf * _bleeding > _effectivenessFound * (_wound select 2) * (_wound select 3)) then { + _effectivenessFound = _woundEffectiveness; + _woundIndex = _forEachIndex; + _wound = _x; + }; + }; +} forEach _openWounds; + +[_wound, _woundIndex, _effectivenessFound] diff --git a/addons/medical_treatment/functions/fnc_fullHeal.sqf b/addons/medical_treatment/functions/fnc_fullHeal.sqf new file mode 100644 index 00000000000..c5027e7dbea --- /dev/null +++ b/addons/medical_treatment/functions/fnc_fullHeal.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Fully heals the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_fullHeal + * + * Public: No + */ + +params ["_medic", "_patient"]; + +[_patient, "activity", LSTRING(Activity_fullHeal), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(fullHealLocal), _patient, _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf new file mode 100644 index 00000000000..b1e64afa42d --- /dev/null +++ b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf @@ -0,0 +1,93 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for fully healing a patient. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_treatment_fnc_fullHealLocal + * + * Public: No + */ + +params ["_patient"]; +TRACE_1("fullHealLocal",_patient); + +if (!alive _patient) exitWith {}; + +private _state = GET_SM_STATE(_patient); +TRACE_1("start",_state); + +// Treatment conditions would normally limit full heal to non-unconscious units +// However, this may be called externally (through Zeus) +if IN_CRDC_ARRST(_patient) then { + TRACE_1("Exiting cardiac arrest",_patient); + [QEGVAR(medical,CPRSucceeded), _patient] call CBA_fnc_localEvent; + _state = GET_SM_STATE(_patient); + TRACE_1("after CPRSucceeded",_state); +}; + +_patient setVariable [VAR_PAIN, 0, true]; +_patient setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; + +// Tourniquets +_patient setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true]; +_patient setVariable [QGVAR(occludedMedications), nil, true]; + +// Wounds and Injuries +_patient setVariable [VAR_OPEN_WOUNDS, [], true]; +_patient setVariable [VAR_BANDAGED_WOUNDS, [], true]; +_patient setVariable [VAR_STITCHED_WOUNDS, [], true]; +_patient setVariable [QEGVAR(medical,isLimping), false, true]; +_patient setVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES, true]; + +// Update wound bleeding +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); + +// Vitals +_patient setVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE, true]; +_patient setVariable [VAR_BLOOD_PRESS, [80, 120], true]; +_patient setVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES, true]; + +// IVs +_patient setVariable [QEGVAR(medical,ivBags), nil, true]; + +// Damage storage +_patient setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true]; + +// wakeup needs to be done after achieving stable vitals, but before manually reseting unconc var +if IS_UNCONSCIOUS(_patient) then { + if (!([_patient] call EFUNC(medical_status,hasStableVitals))) then { ERROR_2("fullheal [unit %1][state %2] did not restore stable vitals",_patient,_state); }; + TRACE_1("Waking up",_patient); + [QEGVAR(medical,WakeUp), _patient] call CBA_fnc_localEvent; + _state = GET_SM_STATE(_patient); + TRACE_1("after WakeUp",_state); + if IS_UNCONSCIOUS(_patient) then { ERROR_2("fullheal [unit %1][state %2] failed to wake up patient",_patient,_state); }; +}; + +// Generic medical admin +// _patient setVariable [VAR_CRDC_ARRST, false, true]; // this should be set by statemachine transition +// _patient setVariable [VAR_UNCON, false, true]; // this should be set by statemachine transition +_patient setVariable [VAR_HEMORRHAGE, 0, true]; +_patient setVariable [VAR_IN_PAIN, false, true]; +_patient setVariable [VAR_PAIN_SUPP, 0, true]; + +// Medication +_patient setVariable [VAR_MEDICATIONS, [], true]; + +// Reset triage card since medication is reset +_patient setVariable [QEGVAR(medical,triageCard), [], true]; + +[_patient] call EFUNC(medical_engine,updateDamageEffects); + +// Reset damage +_patient setDamage 0; + +[QEGVAR(medical,FullHeal), _patient] call CBA_fnc_localEvent; +_state = GET_SM_STATE(_patient); +TRACE_1("after FullHeal",_state); diff --git a/addons/medical_treatment/functions/fnc_getBandageTime.sqf b/addons/medical_treatment/functions/fnc_getBandageTime.sqf new file mode 100644 index 00000000000..8a6248e3b59 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getBandageTime.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Calculates the time to bandage a wound based on it's size, the patient and the medic. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * Treatment Time + * + * Example: + * [player, cursorTarget, "Head", "FieldDressing"] call ace_medical_treatment_fnc_getBandageTime + * + * Public: No + */ + +params ["_medic", "_patient", "_bodypart", "_bandage"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +if (_partIndex < 0) exitWith { ERROR_1("invalid partIndex - %1",_this); 0 }; + +private _targetWound = [_patient, _bandage, _partIndex] call FUNC(findMostEffectiveWound); +_targetWound params ["_wound", "_woundIndex", "_effectiveness"]; +TRACE_3("findMostEffectiveWound",_wound,_woundIndex,_effectiveness); + +// Everything is patched up on this body part already +if (_wound isEqualTo EMPTY_WOUND) exitWith {0}; + +_wound params ["_classID", "", "_amountOf", "_bloodloss", "_damage"]; +private _category = (_classID % 10); + +// Base bandage time is based on wound size and remaining percentage +private _bandageTime = [BANDAGE_TIME_S, BANDAGE_TIME_M, BANDAGE_TIME_L] select _category; + +// Scale bandage time based on amount left and effectiveness (less time if only a little wound left) +// Basic bandage treatment will have a very high effectiveness and can be ignored +if (GVAR(advancedBandages) != 0) then { + _bandageTime = _bandageTime * linearConversion [0, _effectiveness, _amountOf, 0.666, 1, true]; +}; + +// Medics are more practised at applying bandages +if ([_medic] call FUNC(isMedic)) then { + _bandageTime = _bandageTime + BANDAGE_TIME_MOD_MEDIC; +}; + +// Bandaging yourself requires more work +if (_medic == _patient) then { + _bandageTime = _bandageTime + BANDAGE_TIME_MOD_SELF; +}; + +TRACE_1("",_bandageTime); +// Nobody can bandage instantly +_bandageTime max 2.25 diff --git a/addons/medical_treatment/functions/fnc_getHealTime.sqf b/addons/medical_treatment/functions/fnc_getHealTime.sqf new file mode 100644 index 00000000000..e8e8c302bfc --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getHealTime.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Ruthberg + * Calculates the PAK treatment time based on the amount of damage to heal. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Treatment Time + * + * Example: + * [player] call ace_medical_treatment_fnc_getHealTime + * + * Public: No + */ + +#define DAMAGE_SCALING_FACTOR 5 + +params ["", "_patient"]; + +private _bodyPartDamage = 0; + +{ + _bodyPartDamage = _bodyPartDamage + _x; +} forEach (_patient getVariable [QEGVAR(medical,bodyPartDamage), []]); + +10 max (((_bodyPartDamage * DAMAGE_SCALING_FACTOR) min 180) * GVAR(timeCoefficientPAK)) diff --git a/addons/medical_treatment/functions/fnc_getStitchTime.sqf b/addons/medical_treatment/functions/fnc_getStitchTime.sqf new file mode 100644 index 00000000000..9d0254605ae --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getStitchTime.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Calculates the Surgical Kit treatment time based on the amount of stitchable wounds. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Treatment Time + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_getStitchTime + * + * Public: No + */ + +params ["", "_patient"]; + +count (_patient call FUNC(getStitchableWounds)) * WOUND_STITCH_TIME diff --git a/addons/medical_treatment/functions/fnc_getStitchableWounds.sqf b/addons/medical_treatment/functions/fnc_getStitchableWounds.sqf new file mode 100644 index 00000000000..a46d878409f --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getStitchableWounds.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Returns a list of all the stitchable wounds that the given unit has. + * A stitchable wound is a bandaged wound on a body part that does not have any bleeding wounds. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Stitchable Wounds + * + * Example: + * [player] call ace_medical_treatment_fnc_getStitchableWounds + * + * Public: No + */ + +params ["_unit"]; + +private _bleedingBodyParts = GET_OPEN_WOUNDS(_unit) select { + _x params ["", "", "_amountOf", "_bleedingRate"]; + + _amountOf > 0 && {_bleedingRate > 0} +} apply { + _x select 1 +}; + +GET_BANDAGED_WOUNDS(_unit) select { + _x params ["", "_bodyPartN"]; + + !(_bodyPartN in _bleedingBodyParts) +} diff --git a/addons/medical_treatment/functions/fnc_getTriageStatus.sqf b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf new file mode 100644 index 00000000000..6db6484b8f2 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Returns the current triage status of the unit. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Triage Info + * 0: Status ID + * 1: Name + * 2: Color + * 3: Text Color + * + * Example: + * [player] call ace_medical_treatment_fnc_getTriageStatus + * + * Public: No + */ + +params ["_unit"]; + +private _status = _unit getVariable [QEGVAR(medical,triageLevel), -1]; + +switch (_status) do { + case 1: {[1, localize LSTRING(Triage_Status_Minimal), [TRIAGE_COLOR_MINIMAL], [TRIAGE_TEXT_COLOR_MINIMAL]]}; + case 2: {[2, localize LSTRING(Triage_Status_Delayed), [TRIAGE_COLOR_DELAYED], [TRIAGE_TEXT_COLOR_DELAYED]]}; + case 3: {[3, localize LSTRING(Triage_Status_Immediate), [TRIAGE_COLOR_IMMEDIATE], [TRIAGE_TEXT_COLOR_IMMEDIATE]]}; + case 4: {[4, localize LSTRING(Triage_Status_Deceased), [TRIAGE_COLOR_DECEASED], [TRIAGE_TEXT_COLOR_DECEASED]]}; + default {[0, localize LSTRING(Triage_Status_None), [TRIAGE_COLOR_NONE], [TRIAGE_TEXT_COLOR_NONE]]}; +}; diff --git a/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf new file mode 100644 index 00000000000..daa8b5f2eff --- /dev/null +++ b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf @@ -0,0 +1,130 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles the bandage of a patient. + * + * Arguments: + * 0: The target + * 1: The impact + * 2: Selection part number + * 3: Injury index + * 4: Injury + * 5: Used Bandage type + * + * Return Value: + * None + * + * Public: No + */ + +params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; +TRACE_6("handleBandageOpening",_target,_impact,_part,_injuryIndex,_injury,_bandage); + +_injury params ["_classID", "_bodyPartN"]; + +private _className = EGVAR(medical_damage,woundClassNamesComplex) select _classID; +private _reopeningChance = DEFAULT_BANDAGE_REOPENING_CHANCE; +private _reopeningMinDelay = DEFAULT_BANDAGE_REOPENING_MIN_DELAY; +private _reopeningMaxDelay = DEFAULT_BANDAGE_REOPENING_MAX_DELAY; + +// Get the default values for the used bandage +private _config = configFile >> QUOTE(ADDON) >> "Bandaging"; + +if (isClass (_config >> _bandage)) then { + _config = _config >> _bandage; + _reopeningChance = getNumber (_config >> "reopeningChance"); + _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); + _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; +} else { + WARNING_2("No config for bandage [%1] config base [%2]", _bandage, _config); +}; + +if (isClass (_config >> _className)) then { + private _woundTreatmentConfig = _config >> _className; + + if (isNumber (_woundTreatmentConfig >> "reopeningChance")) then { + _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); + }; + + if (isNumber (_woundTreatmentConfig >> "reopeningMinDelay")) then { + _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); + }; + + if (isNumber (_woundTreatmentConfig >> "reopeningMaxDelay")) then { + _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; + }; +} else { + WARNING_2("No config for wound type [%1] config base [%2]", _className, _config); +}; +TRACE_5("configs",_bandage,_className,_reopeningChance,_reopeningMinDelay,_reopeningMaxDelay); + +private _bandagedWounds = GET_BANDAGED_WOUNDS(_target); +private _exist = false; +{ + _x params ["_id", "_partN", "_amountOf"]; + if (_id == _classID && {_partN == _bodyPartN}) exitWith { + _x set [2, _amountOf + _impact]; + TRACE_2("adding to existing bandagedWound",_id,_partN); + _exist = true; + }; +} forEach _bandagedWounds; + +if (!_exist) then { + TRACE_2("adding new bandagedWound",_classID,_bodyPartN); + private _bandagedInjury = +_injury; + _bandagedInjury set [2, _impact]; + _bandagedWounds pushBack _bandagedInjury; +}; + +_target setVariable [VAR_BANDAGED_WOUNDS, _bandagedWounds, true]; + +// _reopeningChance = 1; +// _reopeningMinDelay = 5; +// _reopeningMaxDelay = 6; + +TRACE_1("",_reopeningChance); +// Check if we are ever going to reopen this +if (random 1 <= _reopeningChance * GVAR(woundReopenChance)) then { + private _delay = _reopeningMinDelay + random (_reopeningMaxDelay - _reopeningMinDelay); + TRACE_1("Will open",_delay); + [{ + params ["_target", "_impact", "_part", "_injuryIndex", "_injury"]; + TRACE_5("reopen delay finished",_target,_impact,_part,_injuryIndex,_injury); + + private _openWounds = GET_OPEN_WOUNDS(_target); + if (count _openWounds - 1 < _injuryIndex) exitWith { TRACE_2("index bounds",_injuryIndex,count _openWounds); }; + + _injury params ["_classID", "_bodyPartN"]; + + private _selectedInjury = _openWounds select _injuryIndex; + _selectedInjury params ["_selClassID", "_selBodyPart", "_selAmmount"]; + if ((_selClassID == _classID) && {_selBodyPart == _bodyPartN}) then { // matching the IDs + private _bandagedWounds = GET_BANDAGED_WOUNDS(_target); + private _exist = false; + { + _x params ["_id", "_partN", "_amountOf"]; + if ((_id == _classID) && {_partN == _bodyPartN}) exitWith { + TRACE_2("bandagedWound exists",_id,_classID); + _x set [2, 0 max (_amountOf - _impact)]; + _exist = true; + }; + } forEach _bandagedWounds; + + if (_exist) then { + TRACE_2("Reopening Wound",_bandagedWounds,_openWounds); + _selectedInjury set [2, _selAmmount + _impact]; + _target setVariable [VAR_BANDAGED_WOUNDS, _bandagedWounds, true]; + _target setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; + + [_target] call EFUNC(medical_status,updateWoundBloodLoss); + + // Check if we gained limping from this wound re-opening + if ((EGVAR(medical,limping) == 1) && {_bodyPartN > 3}) then { + [_target] call EFUNC(medical_engine,updateDamageEffects); + }; + }; + } else { + TRACE_3("no match",_selectedInjury,_classID,_bodyPartN); + }; + }, [_target, _impact, _part, _injuryIndex, +_injury], _delay] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/medical_treatment/functions/fnc_hasItem.sqf b/addons/medical_treatment/functions/fnc_hasItem.sqf new file mode 100644 index 00000000000..78d3f79b688 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_hasItem.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Checks if one of the given items are present between the medic and patient. + * Does not respect the priority defined by the allowSharedEquipment setting. + * Will check medic first and then patient if shared equipment is allowed. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Items + * + * Return Value: + * Has Item + * + * Example: + * [player, cursorObject, ["ACE_fieldDressing"]] call ace_medical_treatment_fnc_hasItem + * + * Public: No + */ + +params ["_medic", "_patient", "_items"]; + +private _fnc_checkItems = { + params ["_unit"]; + + private _unitItems = _unit call EFUNC(common,uniqueItems); + _items findIf {_x in _unitItems} != -1 +}; + +_medic call _fnc_checkItems || {GVAR(allowSharedEquipment) != 2 && {_patient call _fnc_checkItems}} diff --git a/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf new file mode 100644 index 00000000000..c8d2aa8e7bf --- /dev/null +++ b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks if the unit has a tourniquet applied on the specified body part. + * + * Arguments: + * 0: Unit + * 1: Body Part + * + * Return Value: + * Has Tourniquet Been Applied + * + * Example: + * [player, "leftleg"] call ace_medical_treatment_fnc_hasTourniquetAppliedTo + * + * Public: No + */ + +params ["_unit", "_bodyPart"]; + +private _index = ALL_BODY_PARTS find toLower _bodyPart; + +_index >= 0 && {HAS_TOURNIQUET_APPLIED_ON(_unit,_index)} diff --git a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf new file mode 100644 index 00000000000..fe144ea78a2 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Checks if the unit is in a medical facility. + * + * Arguments: + * 0: Unit + * + * Return Value: + * In Medical Facility + * + * Example: + * [player] call ace_medical_treatment_fnc_isInMedicalFacility + * + * Public: No + */ + +#define CHECK_OBJECTS(var) ((var) findIf {typeOf _x in GVAR(facilityClasses) || {_x getVariable [QEGVAR(medical,isMedicalFacility), false]}} != -1) + +params ["_unit"]; + +private _fnc_check = { + private _position = _unit modelToWorldVisual [0, 0, eyePos _unit select 2]; + CHECK_OBJECTS(ARR_5(lineIntersectsWith [_position, _position vectorAdd [0, 0, 10], _unit])) || {CHECK_OBJECTS(_unit nearObjects 7.5)} +}; + +[[], _fnc_check, _unit, QGVAR(inMedicalFacilityCache), IN_MEDICAL_FACILITY_CACHE_EXPIRY] call EFUNC(common,cachedCall); diff --git a/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf new file mode 100644 index 00000000000..2f76f04f99a --- /dev/null +++ b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi + * Checks if the unit is in a medical vehicle. + * + * Arguments: + * 0: Unit + * + * Return Value: + * In Medical Vehicle + * + * Example: + * [player] call ace_medical_treatment_fnc_isInMedicalVehicle + * + * Public: No + */ + +params ["_unit"]; + +private _vehicle = vehicle _unit; + +_unit != _vehicle && {!(_unit in [driver _vehicle, gunner _vehicle, commander _vehicle])} && {[_vehicle] call FUNC(isMedicalVehicle)} diff --git a/addons/medical_treatment/functions/fnc_isMedic.sqf b/addons/medical_treatment/functions/fnc_isMedic.sqf new file mode 100644 index 00000000000..d109ad24521 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_isMedic.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, KoffeinFlummi + * Checks if the unit is a medic of the given level. + * Medic Levels: 0 - None, 1 - Medic, 2 - Doctor + * + * Arguments: + * 0: Unit + * 1: Medic Level (default: 1) + * + * Return Value: + * Is Medic + * + * Example: + * [player] call ace_medical_treatment_fnc_isMedic + * + * Public: No + */ + +params ["_unit", ["_medicN", 1]]; + +private _class = _unit getVariable [QEGVAR(medical,medicClass), parseNumber (_unit getUnitTrait "medic")]; + +if (_class >= _medicN) exitWith {true}; +if (!GVAR(locationsBoostTraining)) exitWith {false}; + +if (IN_MED_VEHICLE(_unit) || {IN_MED_FACILITY(_unit)}) then { + _class = _class + 1; // Boost medical training by one: untrained becomes medic, medic becomes doctor +}; + +_class >= _medicN diff --git a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf new file mode 100644 index 00000000000..4b06ffdb557 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks if the vehicle is a medical vehicle. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * Is Medical Vehicle + * + * Example: + * [cursorObject] call ace_medical_treatment_fnc_isMedicalVehicle + * + * Public: No + */ + +params ["_vehicle"]; + +_vehicle getVariable [QEGVAR(medical,isMedicalVehicle), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant") > 0] diff --git a/addons/medical_treatment/functions/fnc_ivBag.sqf b/addons/medical_treatment/functions/fnc_ivBag.sqf new file mode 100644 index 00000000000..bfc149564e1 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_ivBag.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Administers an IV bag treatment to the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "RightArm", "BloodIV", objNull, "ACE_bloodIV"] call ace_medical_treatment_fnc_ivBag + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[_patient, _usedItem] call FUNC(addToTriageCard); +[_patient, "activity", LSTRING(Activity_gaveIV), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(ivBagLocal), [_patient, _bodyPart, _classname], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf new file mode 100644 index 00000000000..f2640fb0bfd --- /dev/null +++ b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Local callback for administering an IV bag to a patient. + * + * Arguments: + * 0: Patient + * 1: Body Part + * 2: Treatment + * + * Return Value: + * None + * + * Example: + * [player, "RightArm", "BloodIV"] call ace_medical_treatment_fnc_ivBagLocal + * + * Public: No + */ + +params ["_patient", "_bodyPart", "_classname"]; + +// Exit if patient has max blood volume +private _bloodVolume = GET_BLOOD_VOLUME(_patient); +if (_bloodVolume >= DEFAULT_BLOOD_VOLUME) exitWith {}; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +// Get attributes for the used IV +private _defaultConfig = configFile >> QUOTE(ADDON) >> "IV"; +private _ivConfig = _defaultConfig >> _classname; + +private _volume = GET_NUMBER(_ivConfig >> "volume",getNumber (_defaultConfig >> "volume")); +private _type = GET_STRING(_ivConfig >> "type",getText (_defaultConfig >> "type")); + +// Add IV bag to patient's ivBags array +private _ivBags = _patient getVariable [QEGVAR(medical,ivBags), []]; +_ivBags pushBack [_volume, _type, _partIndex]; +_patient setVariable [QEGVAR(medical,ivBags), _ivBags, true]; diff --git a/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf new file mode 100644 index 00000000000..1039edb4c62 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, esteldunedain, mharis001 + * Handles cleaning up litter objects that have reached the end of their lifetime. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_treatment_fnc_litterCleanupLoop + * + * Public: No + */ + +{ + _x params ["_object", "_timeCreated"]; + + // Litter array has older objects at the beginning + // Can exit on first element that still has lifetime remaining + if (CBA_missionTime - _timeCreated < GVAR(litterCleanupDelay)) exitWith {}; + + deleteVehicle _object; + GVAR(litterObjects) set [_forEachIndex, objNull]; +} forEach GVAR(litterObjects); + +GVAR(litterObjects) = GVAR(litterObjects) - [objNull]; + +// Exit the loop if no litter objects left +if (GVAR(litterObjects) isEqualTo []) exitWith { + GVAR(litterCleanup) = false; +}; + +// Schedule cleanup loop to executed again +[FUNC(litterCleanupLoop), [], LITTER_CLEANUP_CHECK_DELAY] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf new file mode 100644 index 00000000000..74e66d517b9 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf @@ -0,0 +1,52 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Loads an unconscious or dead patient in the given or nearest vehicle. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Vehicle (default: objNull) + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_loadUnit + * + * Public: No + */ + +params ["_medic", "_patient", ["_vehicle", objNull]]; +TRACE_3("loadUnit",_medic,_patient,_vehicle); + +if (_patient call EFUNC(common,isAwake)) exitWith { + [[LSTRING(CanNotLoad), _patient call EFUNC(common,getName)]] call EFUNC(common,displayTextStructured); +}; + +if (_patient call EFUNC(medical_status,isBeingCarried)) then { + [_medic, _patient] call EFUNC(dragging,dropObject_carry); +}; + +if (_patient call EFUNC(medical_status,isBeingDragged)) then { + [_medic, _patient] call EFUNC(dragging,dropObject); +}; + +private _vehicle = [_medic, _patient, _vehicle] call EFUNC(common,loadPerson); + +if (isNull _vehicle) exitWith { TRACE_1("no vehicle found",_vehicle); }; + +[{ + params ["_unit", "_vehicle"]; + (alive _unit) && {alive _vehicle} && {(vehicle _unit) == _vehicle} +}, { + params ["_unit", "_vehicle"]; + TRACE_2("success",_unit,_vehicle); + private _patientName = [_unit, false, true] call EFUNC(common,getName); + private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + [[LSTRING(LoadedInto), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); +}, [_patient, _vehicle], 3, { + params ["_unit", "_emptyPos"]; + WARNING_3("loadPerson failed to load %1[local %2] -> %3 ",_unit,local _unit,_vehicle); +}] call CBA_fnc_waitUntilAndExecute; + diff --git a/addons/medical_treatment/functions/fnc_medication.sqf b/addons/medical_treatment/functions/fnc_medication.sqf new file mode 100644 index 00000000000..6def70b212b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_medication.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Administers medication to the patient on the given body bodypart. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "RightArm", "Morphine", objNull, "ACE_morphine"] call ace_medical_treatment_fnc_medication + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[_patient, _usedItem] call FUNC(addToTriageCard); +[_patient, "activity", LSTRING(Activity_usedItem), [[_medic, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _usedItem >> "displayName")]] call FUNC(addToLog); + +[QGVAR(medicationLocal), [_patient, _bodyPart, _classname], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_medicationLocal.sqf b/addons/medical_treatment/functions/fnc_medicationLocal.sqf new file mode 100644 index 00000000000..bb14e14b5b4 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_medicationLocal.sqf @@ -0,0 +1,78 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Local callback for administering medication to a patient. + * + * Arguments: + * 0: Patient + * 1: Body Part + * 2: Treatment + * + * Return Value: + * None + * + * Example: + * [player, "RightArm", "Morphine"] call ace_medical_treatment_fnc_medicationLocal + * + * Public: No + */ + +// todo: move this macro to script_macros_medical.hpp? +#define MORPHINE_PAIN_SUPPRESSION 0.6 + +params ["_patient", "_bodyPart", "_classname"]; +TRACE_3("medicationLocal",_patient,_bodyPart,_classname); + +// Medication has no effects on dead units +if (!alive _patient) exitWith {}; + +// Exit with basic medication handling if advanced medication not enabled +if (!GVAR(advancedMedication)) exitWith { + switch (_classname) do { + case "Morphine": { + private _painSuppress = GET_PAIN_SUPPRESS(_patient); + _patient setVariable [VAR_PAIN_SUPP, (_painSuppress + MORPHINE_PAIN_SUPPRESSION) min 1, true]; + }; + case "Epinephrine": { + [QEGVAR(medical,WakeUp), _patient] call CBA_fnc_localEvent; + }; + }; +}; +TRACE_1("Running treatmentMedicationLocal with Advanced configuration for",_patient); + + +// Handle tourniquet on body part blocking blood flow at injection site +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +if (HAS_TOURNIQUET_APPLIED_ON(_patient,_partIndex)) exitWith { + TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets); + private _occludedMedications = _patient getVariable [QEGVAR(medical,occludedMedications), []]; + _occludedMedications pushBack [_partIndex, _classname]; + _patient setVariable [QEGVAR(medical,occludedMedications), _occludedMedications, true]; +}; + +// Get adjustment attributes for used medication +private _defaultConfig = configFile >> QUOTE(ADDON) >> "Medication"; +private _medicationConfig = _defaultConfig >> _classname; + +private _painReduce = GET_NUMBER(_medicationConfig >> "painReduce",getNumber (_defaultConfig >> "painReduce")); +private _timeInSystem = GET_NUMBER(_medicationConfig >> "timeInSystem",getNumber (_defaultConfig >> "timeInSystem")); +private _timeTillMaxEffect = GET_NUMBER(_medicationConfig >> "timeTillMaxEffect",getNumber (_defaultConfig >> "timeTillMaxEffect")); +private _maxDose = GET_NUMBER(_medicationConfig >> "maxDose",getNumber (_defaultConfig >> "maxDose")); +private _viscosityChange = GET_NUMBER(_medicationConfig >> "viscosityChange",getNumber (_defaultConfig >> "viscosityChange")); +private _hrIncreaseLow = GET_ARRAY(_medicationConfig >> "hrIncreaseLow",getArray (_defaultConfig >> "hrIncreaseLow")); +private _hrIncreaseNormal = GET_ARRAY(_medicationConfig >> "hrIncreaseNormal",getArray (_defaultConfig >> "hrIncreaseNormal")); +private _hrIncreaseHigh = GET_ARRAY(_medicationConfig >> "hrIncreaseHigh",getArray (_defaultConfig >> "hrIncreaseHigh")); +private _incompatibleMedication = GET_ARRAY(_medicationConfig >> "incompatibleMedication",getArray (_defaultConfig >> "incompatibleMedication")); + +private _heartRate = GET_HEART_RATE(_patient); +private _hrIncrease = [_hrIncreaseLow, _hrIncreaseNormal, _hrIncreaseHigh] select (floor ((0 max _heartRate min 110) / 55)); +_hrIncrease params ["_minIncrease", "_maxIncrease"]; +private _heartRateChange = _minIncrease + random (_maxIncrease - _minIncrease); + +// Adjust the medication effects and add the medication to the list +TRACE_3("adjustments",_heartRateChange,_painReduce,_viscosityChange); +[_patient, _className, _timeTillMaxEffect, _timeInSystem, _heartRateChange, _painReduce, _viscosityChange] call EFUNC(medical_status,addMedicationAdjustment); + +// Check for medication compatiblity +[_patient, _className, _maxDose, _incompatibleMedication] call FUNC(onMedicationUsage); diff --git a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf new file mode 100644 index 00000000000..1f9ef981dde --- /dev/null +++ b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf @@ -0,0 +1,62 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles the medication given to a patient. + * + * Arguments: + * 0: The patient + * 1: Medication Treatment classname + * 2: Max dosage (0 to ignore) + * 3: Incompatable medication > + * + * Return Value: + * None + * + * Example: + * [player, "morphine", 4, [["x", 1]]] call ace_medical_treatment_fnc_onMedicationUsage + * + * Public: No + */ + +params ["_target", "_className", "_maxDosage", "_incompatibleMedication"]; +TRACE_4("onMedicationUsage",_target,_className,_maxDosage,_incompatibleMedication); + +private _overdosedMedications = []; + +// Check for overdose from current medication +if (_maxDosage > 0) then { + private _currentDose = [_target, _className] call EFUNC(medical_status,getMedicationCount); + if (_currentDose >= floor (_maxDosage + round(random(2)))) then { + TRACE_1("exceeded max dose",_currentDose); + _overdosedMedications pushBackUnique _className; + }; +}; + +// Check incompatible medication (format [med,limit]) +{ + _x params ["_xMed", "_xLimit"]; + private _inSystem = [_target, _xMed] call EFUNC(medical_status,getMedicationCount); + if (_inSystem> _xLimit) then { + _overdosedMedications pushBackUnique _xMed; + }; +} forEach _incompatibleMedication; + +if !(_overdosedMedications isEqualTo []) then { + private _medicationConfig = (configFile >> "ace_medical_treatment" >> "Medication"); + private _onOverDose = getText (_medicationConfig >> "onOverDose"); + if (isClass (_medicationConfig >> _className)) then { + _medicationConfig = (_medicationConfig >> _className); + if (isText (_medicationConfig >> "onOverDose")) then { _onOverDose = getText (_medicationConfig >> "onOverDose"); }; + }; + TRACE_2("overdose",_overdosedMedications,_onOverDose); + if (_onOverDose == "") exitWith { + TRACE_1("CriticalVitals Event",_target); // make unconscious + [QEGVAR(medical,CriticalVitals), _target] call CBA_fnc_localEvent; + }; + if (isNil _onOverDose) then { + _onOverDose = compile _onOverDose; + } else { + _onOverDose = missionNamespace getVariable _onOverDose; + }; + [_target, _className, _overdosedMedications] call _onOverDose; +}; diff --git a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf new file mode 100644 index 00000000000..02feb520253 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Places a dead body inside a body bag. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_placeInBodyBag + * + * Public: No + */ + +params ["", "_patient"]; +TRACE_1("placeInBodyBag",_patient); + +if (!local _patient) exitWith { + TRACE_1("Calling where local",local _patient); + [QGVAR(placeInBodyBag), [nil, _patient], _patient] call CBA_fnc_targetEvent; +}; + +if (alive _patient) then { + TRACE_1("Manually killing with setDead",_patient); + [_patient, "buried_alive"] call EFUNC(medical_status,setDead); +}; + +private _position = (getPosASL _patient) vectorAdd [0, 0, 0.2]; + +private _headPos = _patient modelToWorldVisual (_patient selectionPosition "head"); +private _spinePos = _patient modelToWorldVisual (_patient selectionPosition "Spine3"); +private _direction = (_headPos vectorFromTo _spinePos) call CBA_fnc_vectDir; + +// Move the body away so it won't collide with the body bag object +// This setPosASL seems to need to be called where the unit is local +_patient setPosASL [-5000, -5000, 0]; + +// Create the body bag object, set its position to prevent it from flipping +private _bodyBag = createVehicle ["ACE_bodyBagObject", [0, 0, 0], [], 0, "NONE"]; +_bodyBag setPosASL _position; +_bodyBag setDir _direction; + +// Server will handle hiding and deleting the body +["ace_placedInBodyBag", [_patient, _bodyBag]] call CBA_fnc_globalEvent; diff --git a/addons/medical_treatment/functions/fnc_removeBody.sqf b/addons/medical_treatment/functions/fnc_removeBody.sqf new file mode 100644 index 00000000000..e86d374e8e3 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_removeBody.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Removes a body. Ideally it is deleted the next frame. + * However, player bodies cannot be deleted until they respawn, so it is hidden and deleted later. + * + * Arguments: + * 0: Body + * + * Return Value: + * None + * + * Example: + * [cursorObject] call ace_medical_treatment_fnc_removeBody + * + * Public: No + */ + +params ["_body"]; +TRACE_2("removeBody",_body,isPlayer _body); + +// Hide the body globally +[QEGVAR(common,hideObjectGlobal), [_body, true]] call CBA_fnc_serverEvent; + +// Add body to array of those waiting for deletion +if (isNil QGVAR(bodiesToDelete)) then { + GVAR(bodiesToDelete) = []; +}; + +GVAR(bodiesToDelete) pushBack _body; + +// Start up the body cleanup loop to delete bodies once they are free +if (count GVAR(bodiesToDelete) == 1) then { + [] call FUNC(bodyCleanupLoop); +}; diff --git a/addons/medical_treatment/functions/fnc_setTriageStatus.sqf b/addons/medical_treatment/functions/fnc_setTriageStatus.sqf new file mode 100644 index 00000000000..aee83260561 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_setTriageStatus.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Sets the traige status of the given unit. + * + * Arguments: + * 0: Unit + * 1: Status + * + * Return Value: + * None + * + * Example: + * [player, 2] call ace_medical_treatment_fnc_setTriageStatus + * + * Public: No + */ + +params ["_unit", "_status"]; + +_unit setVariable [QEGVAR(medical,triageLevel), _status, true]; diff --git a/addons/medical_treatment/functions/fnc_splint.sqf b/addons/medical_treatment/functions/fnc_splint.sqf new file mode 100644 index 00000000000..f7883da86a0 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_splint.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Applies a splint to the patient on the given body part. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * Nothing + * + * Example: + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_splint + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; +TRACE_3("splint",_medic,_patient,_bodyPart); + +[QGVAR(splintLocal), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_splintLocal.sqf b/addons/medical_treatment/functions/fnc_splintLocal.sqf new file mode 100644 index 00000000000..f0834b328e9 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_splintLocal.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Local callback for applying a splint to a patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * Nothing + * + * Example: + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_splintLocal + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; +TRACE_3("splintLocal",_medic,_patient,_bodyPart); + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +private _fractures = GET_FRACTURES(_patient); +_fractures set [_partIndex, -1]; +_patient setVariable [VAR_FRACTURES, _fractures, true]; + +// Check if we fixed limping from this treatment +[_patient] call EFUNC(medical_engine,updateDamageEffects); + +[_patient, "ACE_splint"] call FUNC(addToTriageCard); +[_patient, "activity", LSTRING(Activity_appliedSplint), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf new file mode 100644 index 00000000000..9dcd7265e1a --- /dev/null +++ b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf @@ -0,0 +1,63 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut, mharis001 + * Handles the surgical kit treatment by periodically closing bandaged wounds. + * + * Arguments: + * 0: Arguments + * 0: Medic (not used) + * 1: Patient + * 1: Elapsed Time + * 2: Total Time + * + * Return Value: + * Continue Treatment + * + * Example: + * [[objNull, player], 5, 10] call ace_medical_treatment_fnc_surgicalKitProgress + * + * Public: No + */ + +params ["_args", "_elapsedTime", "_totalTime"]; +_args params ["", "_patient"]; + +private _stitchableWounds = _patient call FUNC(getStitchableWounds); + +// Stop treatment if there are no wounds that can be stitched remaining +if (_stitchableWounds isEqualTo []) exitWith {false}; + +// Not enough time has elapsed to stitch a wound +if (_totalTime - _elapsedTime > (count _stitchableWounds - 1) * WOUND_STITCH_TIME) exitWith {true}; + +private _bandagedWounds = GET_BANDAGED_WOUNDS(_patient); +private _stitchedWounds = GET_STITCHED_WOUNDS(_patient); + +// Remove the first stitchable wound from the bandaged wounds +private _treatedWound = _bandagedWounds deleteAt (_bandagedWounds find (_stitchableWounds select 0)); +_treatedWound params ["_treatedID", "_treatedBodyPartN", "_treatedAmountOf"]; + +// Check if we need to add a new stitched wound or increase the amount of an existing one +private _woundIndex = _stitchedWounds findIf { + _x params ["_classID", "_bodyPartN"]; + + _classID == _treatedID && {_bodyPartN == _treatedBodyPartN} +}; + +if (_woundIndex == -1) then { + _stitchedWounds pushBack _treatedWound; +} else { + private _wound = _stitchedWounds select _woundIndex; + _wound set [2, (_wound select 2) + _treatedAmountOf]; +}; + +_patient setVariable [VAR_BANDAGED_WOUNDS, _bandagedWounds, true]; +_patient setVariable [VAR_STITCHED_WOUNDS, _stitchedWounds, true]; + +// Check if we fixed limping by stitching this wound (only for leg wounds) +if (EGVAR(medical,limping) == 2 && {_patient getVariable [QEGVAR(medical,isLimping), false]} && {_treatedBodyPartN > 3}) then { + TRACE_3("Updating damage effects",_patient,_treatedBodyPartN,local _patient); + [QEGVAR(medical_engine,updateDamageEffects), _patient, _patient] call CBA_fnc_targetEvent; +}; + +true diff --git a/addons/medical_treatment/functions/fnc_tourniquet.sqf b/addons/medical_treatment/functions/fnc_tourniquet.sqf new file mode 100644 index 00000000000..155a2c502b5 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_tourniquet.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Applies a tourniquet to the patient on the given body part. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment (not used) + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg", "", objNull, "ACE_tourniquet"] call ace_medical_treatment_fnc_tourniquet + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "", "", "_usedItem"]; + +// Exit if there is a tourniquet already applied to body part +if ([_patient, _bodyPart] call FUNC(hasTourniquetAppliedTo)) exitWith { + ["There is already a tourniquet on this body part!", 1.5] call EFUNC(common,displayTextStructured); // todo: localize +}; + +[_patient, _usedItem] call FUNC(addToTriageCard); +[_patient, "activity", LSTRING(Activity_appliedTourniquet), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(tourniquetLocal), [_patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf new file mode 100644 index 00000000000..e20510951b6 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for applying a tourniquet to a patient. + * + * Arguments: + * 0: Patient + * 1: Body Part + * + * Return Value: + * None + * + * Example: + * [player, "LeftLeg"] call ace_medical_treatment_fnc_tourniquetLocal + * + * Public: No + */ + +params ["_patient", "_bodyPart"]; +TRACE_2("tourniquetLocal",_patient,_bodyPart); + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +private _tourniquets = GET_TOURNIQUETS(_patient); +_tourniquets set [_partIndex, CBA_missionTime]; +_patient setVariable [VAR_TOURNIQUET, _tourniquets, true]; + +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); + +private _nearPlayers = (_patient nearEntities ["CAManBase", 6]) select {_x call EFUNC(common,isPlayer)}; +TRACE_1("clearConditionCaches: tourniquetLocal",_nearPlayers); +[QEGVAR(interact_menu,clearConditionCaches), [], _nearPlayers] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf new file mode 100644 index 00000000000..aebf56a6ff4 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf @@ -0,0 +1,64 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Removes the tourniquet from the patient on the given body part. + * Note: Patient may not be local + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_tourniquetRemove + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; +TRACE_3("tourniquetRemove",_medic,_patient,_bodyPart); + +// Remove tourniquet from body part, exit if no tourniquet applied +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _tourniquets = GET_TOURNIQUETS(_patient); + +if (_tourniquets select _partIndex == 0) exitWith { + [LSTRING(noTourniquetOnBodyPart), 1.5] call EFUNC(common,displayTextStructured); +}; + +_tourniquets set [_partIndex, 0]; +_patient setVariable [VAR_TOURNIQUET, _tourniquets, true]; + +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); + +private _nearPlayers = (_patient nearEntities ["CAManBase", 6]) select {_x call EFUNC(common,isPlayer)}; +TRACE_1("clearConditionCaches: tourniquetRemove",_nearPlayers); +[QEGVAR(interact_menu,clearConditionCaches), [], _nearPlayers] call CBA_fnc_targetEvent; + +// Add tourniquet item to medic's inventory +// todo: should there be a setting to select who receives the removed tourniquet? +[_medic, "ACE_tourniquet", true] call EFUNC(common,addToInventory); + +// Handle occluded medications that were blocked due to tourniquet +private _occludedMedications = _patient getVariable [QEGVAR(medical,occludedMedications), []]; +private _arrayModified = false; + +{ + _x params ["_bodyPartN", "_medication"]; + + if (_partIndex == _bodyPartN) then { + TRACE_1("delayed medication call after tourniquet removeal",_x); + [QGVAR(medicationLocal), [_patient, _bodyPart, _medication], _patient] call CBA_fnc_targetEvent; + _occludedMedications set [_forEachIndex, []]; + _arrayModified = true; + }; + +} forEach _occludedMedications; + +if (_arrayModified) then { + _occludedMedications = _occludedMedications - [[]]; + _patient setVariable [QEGVAR(medical,occludedMedications), _occludedMedications, true]; +}; diff --git a/addons/medical_treatment/functions/fnc_treatment.sqf b/addons/medical_treatment/functions/fnc_treatment.sqf new file mode 100644 index 00000000000..01d3cabc8dd --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatment.sqf @@ -0,0 +1,160 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, KoffeinFlummi, mharis001 + * Starts the treatment process. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * Treatment Started + * + * Example: + * [player, cursorObject, "Head", "BasicBandage"] call ace_medical_treatment_fnc_treatment + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +// Delay by a frame if cursor menu is open to prevent progress bar failing +if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened), false]) exitWith { + [FUNC(treatment), _this] call CBA_fnc_execNextFrame; +}; + +if !(_this call FUNC(canTreat)) exitWith {false}; + +private _config = configFile >> QGVAR(actions) >> _classname; + +// Get treatment time from config, exit if treatment time is zero +private _treatmentTime = if (isText (_config >> "treatmentTime")) then { + GET_FUNCTION(_treatmentTime,_config >> "treatmentTime"); + + if (_treatmentTime isEqualType {}) then { + _treatmentTime = call _treatmentTime; + }; + + _treatmentTime +} else { + getNumber (_config >> "treatmentTime"); +}; + +if (_treatmentTime == 0) exitWith {false}; + +// Consume one of the treatment items if needed +// Store item user so that used item can be returned on failure +private _userAndItem = if (GET_NUMBER_ENTRY(_config >> "consumeItem") == 1) then { + [_medic, _patient, getArray (_config >> "items")] call FUNC(useItem); +} else { + [objNull, ""]; // Treatment does not require items to be consumed +}; + +_userAndItem params ["_itemUser", "_usedItem"]; + +// Get treatment animation for the medic +private _medicAnim = if (_medic isEqualTo _patient) then { + getText (_config >> ["animationMedicSelf", "animationMedicSelfProne"] select (stance _medic == "PRONE")); +} else { + getText (_config >> ["animationMedic", "animationMedicProne"] select (stance _medic == "PRONE")); +}; + +_medic setVariable [QGVAR(selectedWeaponOnTreatment), weaponState _medic]; + +// Adjust animation based on the current weapon of the medic +private _wpn = ["non", "rfl", "lnr", "pst"] param [["", primaryWeapon _medic, secondaryWeapon _medic, handgunWeapon _medic] find currentWeapon _medic, "non"]; +_medicAnim = [_medicAnim, "[wpn]", _wpn] call CBA_fnc_replace; + +// This animation is missing, use alternative +if (_medicAnim == "AinvPknlMstpSlayWlnrDnon_medic") then { + _medicAnim = "AinvPknlMstpSlayWlnrDnon_medicOther"; +}; + +// Determine the animation length +private _animDuration = GVAR(animDurations) getVariable _medicAnim; +if (isNil "_animDuration") then { + WARNING_2("animation [%1] for [%2] has no duration defined",_medicAnim,_classname); + _animDuration = 10; +}; + +// These animations have transitions that take a bit longer... +if (weaponLowered _medic) then { + _animDuration = _animDuration + 0.5; + + // Fix problems with lowered weapon transitions by raising the weapon first + if (currentWeapon _medic != "" && {_medicAnim != ""}) then { + _medic action ["WeaponInHand", _medic]; + }; +}; + +if (binocular _medic != "" && {binocular _medic == currentWeapon _medic}) then { + _animDuration = _animDuration + 1; +}; + +// Play treatment animation for medic and determine the ending animation +if (vehicle _medic == _medic && {_medicAnim != ""}) then { + // Speed up animation based on treatment time (but cap max to prevent odd animiations/cam shake) + private _animRatio = _animDuration / _treatmentTime; + TRACE_3("setAnimSpeedCoef",_animRatio,_animDuration,_treatmentTime); + + // Don't slow down animation too much to prevent it looking funny. + if (_animRatio < ANIMATION_SPEED_MIN_COEFFICIENT) then { + _animRatio = ANIMATION_SPEED_MIN_COEFFICIENT; + }; + + // Skip animation enitrely if progress bar too quick. + if (_animRatio > ANIMATION_SPEED_MAX_COEFFICIENT) exitWith {}; + + [QEGVAR(common,setAnimSpeedCoef), [_medic, _animRatio]] call CBA_fnc_globalEvent; + + // Play animation + private _endInAnim = "AmovP[pos]MstpS[stn]W[wpn]Dnon"; + + private _pos = ["knl", "pne"] select (stance _medic == "PRONE"); + private _stn = "non"; + + if (_wpn != "non") then { + _stn = ["ras", "low"] select (weaponLowered _medic); + }; + + _endInAnim = [_endInAnim, "[pos]", _pos] call CBA_fnc_replace; + _endInAnim = [_endInAnim, "[stn]", _stn] call CBA_fnc_replace; + _endInAnim = [_endInAnim, "[wpn]", _wpn] call CBA_fnc_replace; + + [_medic, _medicAnim] call EFUNC(common,doAnimation); + [_medic, _endInAnim] call EFUNC(common,doAnimation); + _medic setVariable [QGVAR(endInAnim), _endInAnim]; + + if (!isNil QEGVAR(advanced_fatigue,setAnimExclusions)) then { + EGVAR(advanced_fatigue,setAnimExclusions) pushBack QUOTE(ADDON); + }; +}; + +// Play a random treatment sound globally if defined +if (isArray (_config >> "sounds")) then { + selectRandom getArray (_config >> "sounds") params ["_file", ["_volume", 1], ["_pitch", 1], ["_distance", 10]]; + playSound3D [_file, objNull, false, getPosASL _medic, _volume, _pitch, _distance]; +}; + +GET_FUNCTION(_callbackStart,_config >> "callbackStart"); +GET_FUNCTION(_callbackProgress,_config >> "callbackProgress"); + +if (_callbackProgress isEqualTo {}) then { + _callbackProgress = {true}; +}; + +[_medic, _patient, _bodyPart, _classname, _itemUser, _usedItem] call _callbackStart; + +[ + _treatmentTime, + [_medic, _patient, _bodyPart, _classname, _itemUser, _usedItem], + FUNC(treatmentSuccess), + FUNC(treatmentFailure), + getText (_config >> "displayNameProgress"), + _callbackProgress, + ["isNotInside"] +] call EFUNC(common,progressBar); + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentFailure.sqf b/addons/medical_treatment/functions/fnc_treatmentFailure.sqf new file mode 100644 index 00000000000..f59331fc770 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentFailure.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, Glowbal, mharis001 + * Handles treatment process failure. + * + * Arguments: + * 0: Arguments + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User + * 5: Used Item + * + * Return Value: + * None + * + * Public: No + */ + +params ["_args"]; +_args params ["_medic", "_patient", "_bodyPart", "_classname", "_itemUser", "_usedItem"]; + +// Return used item to user (if used) +if (!isNull _itemUser) then { + [_itemUser, _usedItem] call EFUNC(common,addToInventory); +}; + +// Switch medic to end animation immediately +private _endInAnim = _medic getVariable QGVAR(endInAnim); + +if (!isNil "_endInAnim") then { + if (animationState _medic != _endInAnim) then { + [_medic, _endInAnim, 2] call EFUNC(common,doAnimation); + }; + + _medic setVariable [QGVAR(endInAnim), nil]; +}; + +// Reset medic animation speed coefficient +[QEGVAR(common,setAnimSpeedCoef), [_medic, 1]] call CBA_fnc_globalEvent; + +if (!isNil QEGVAR(advanced_fatigue,setAnimExclusions)) then { + EGVAR(advanced_fatigue,setAnimExclusions) deleteAt (EGVAR(advanced_fatigue,setAnimExclusions) find QUOTE(ADDON)); +}; + +// Call treatment specific failure callback +GET_FUNCTION(_callbackFailure,configFile >> QGVAR(actions) >> _classname >> "callbackFailure"); + +_args call _callbackFailure; diff --git a/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf b/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf new file mode 100644 index 00000000000..07dd5261b3e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf @@ -0,0 +1,51 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, Glowbal, mharis001 + * Handles treatment process success. + * + * Arguments: + * 0: Arguments + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User + * 5: Used Item + * + * Return Value: + * None + * + * Public: No + */ + +params ["_args"]; +_args params ["_medic", "_patient", "_bodyPart", "_classname"]; + +// Switch medic to end animation immediately +private _endInAnim = _medic getVariable QGVAR(endInAnim); + +if (!isNil "_endInAnim") then { + if (animationState _medic != _endInAnim) then { + [_medic, _endInAnim, 2] call EFUNC(common,doAnimation); + }; + + _medic setVariable [QGVAR(endInAnim), nil]; +}; + +// Reset medic animation speed coefficient +[QEGVAR(common,setAnimSpeedCoef), [_medic, 1]] call CBA_fnc_globalEvent; + +if (!isNil QEGVAR(advanced_fatigue,setAnimExclusions)) then { + EGVAR(advanced_fatigue,setAnimExclusions) deleteAt (EGVAR(advanced_fatigue,setAnimExclusions) find QUOTE(ADDON)); +}; + +// Call treatment specific success callback +GET_FUNCTION(_callbackSuccess,configFile >> QGVAR(actions) >> _classname >> "callbackSuccess"); + +_args call _callbackSuccess; + +// Call litter creation handler +_args call FUNC(createLitter); + +// Emit local event for medical API +["ace_treatmentSucceded", [_medic, _patient, _bodyPart, _classname]] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_unloadUnit.sqf b/addons/medical_treatment/functions/fnc_unloadUnit.sqf new file mode 100644 index 00000000000..6baeb005ca7 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_unloadUnit.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Unloads an unconscious or dead patient from their vehicle. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, bob] call ace_medical_treatment_fnc_unloadUnit + * + * Public: No + */ + +params ["_medic", "_patient"]; +TRACE_2("unloadUnit",_medic,_patient); + +if (vehicle _patient == _patient) exitWith { + ERROR_1("Unit %1 is not in a vehicle",_patient); +}; + +if (_patient call EFUNC(common,isAwake)) exitWith { + ERROR_1("Unit %1 is awake",_patient); +}; + +["ace_unloadPersonEvent", [_patient, vehicle _patient, _medic], _patient] call CBA_fnc_targetEvent; + +[{ + params ["_unit", "_vehicle"]; + (alive _unit) && {alive _vehicle} && {(vehicle _unit) != _vehicle} +}, { + params ["_unit", "_vehicle"]; + TRACE_2("success",_unit,_vehicle); + private _patientName = [_unit, false, true] call EFUNC(common,getName); + private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + [[LSTRING(UnloadedFrom), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); +}, [_patient, vehicle _patient], 3, { + params ["_unit", "_vehicle"]; + WARNING_3("unloadPerson failed to unload %1[local %2] -> %3 ",_unit,local _unit,_vehicle); +}] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/medical_treatment/functions/fnc_useItem.sqf b/addons/medical_treatment/functions/fnc_useItem.sqf new file mode 100644 index 00000000000..5425e0848c7 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_useItem.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Uses one of the treatment items. Respects the priority defined by the allowSharedEquipment setting. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Items + * + * Return Value: + * User and Item + * + * Example: + * [player, cursorObject, ["bandage"]] call ace_medical_treatment_fnc_useItem + * + * Public: No + */ + +params ["_medic", "_patient", "_items"]; + +scopeName "Main"; + +private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select GVAR(allowSharedEquipment); + +{ + private _unit = _x; + private _unitItems = _x call EFUNC(common,uniqueItems); + + { + if (_x in _unitItems) then { + _unit removeItem _x; + [_unit, _x] breakOut "Main"; + }; + } forEach _items; +} forEach _useOrder; + +[objNull, ""] diff --git a/addons/medical_treatment/functions/script_component.hpp b/addons/medical_treatment/functions/script_component.hpp new file mode 100644 index 00000000000..86227531f9d --- /dev/null +++ b/addons/medical_treatment/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_treatment\script_component.hpp" \ No newline at end of file diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf new file mode 100644 index 00000000000..3b68a0409f2 --- /dev/null +++ b/addons/medical_treatment/initSettings.sqf @@ -0,0 +1,234 @@ +[ + QGVAR(advancedDiagnose), + "CHECKBOX", + [LSTRING(AdvancedDiagnose_DisplayName), LSTRING(AdvancedDiagnose_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(advancedMedication), + "CHECKBOX", + [LSTRING(AdvancedMedication_DisplayName), LSTRING(AdvancedMedication_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(advancedBandages), + "LIST", + [LSTRING(AdvancedBandages_DisplayName), LSTRING(AdvancedBandages_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), LSTRING(AdvancedBandages_EnabledCanReopen)], 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(woundReopenChance), + "SLIDER", + [LSTRING(WoundReopenChance_DisplayName), LSTRING(WoundReopenChance_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0, 5, 1, 2], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(clearTraumaAfterBandage), + "CHECKBOX", + [LSTRING(ClearTraumaAfterBandage_DisplayName), LSTRING(ClearTraumaAfterBandage_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + false, + true +] call CBA_settings_fnc_init; + +// todo: should this setting differentiate between medical vehicles and facilities? +[ + QGVAR(locationsBoostTraining), + "CHECKBOX", + [LSTRING(LocationsBoostTraining_DisplayName), LSTRING(LocationsBoostTraining_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + false, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(allowSharedEquipment), + "LIST", + [LSTRING(AllowSharedEquipment_DisplayName), LSTRING(AllowSharedEquipment_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(AllowSharedEquipment_PriorityPatient), LSTRING(AllowSharedEquipment_PriorityMedic), ELSTRING(common,No)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(convertItems), + "LIST", + [LSTRING(ConvertItems_DisplayName), LSTRING(ConvertItems_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [ELSTRING(common,Enabled), LSTRING(ConvertItems_RemoveOnly), ELSTRING(common,Disabled)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(medicEpinephrine), + "LIST", + [LSTRING(MedicEpinephrine_DisplayName), LSTRING(MedicEpinephrine_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(locationEpinephrine), + "LIST", + [LSTRING(LocationEpinephrine_DisplayName), LSTRING(LocationEpinephrine_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(medicPAK), + "LIST", + [LSTRING(MedicPAK_DisplayName), LSTRING(MedicPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(locationPAK), + "LIST", + [LSTRING(LocationPAK_DisplayName), LSTRING(LocationPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 3], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(consumePAK), + "LIST", + [LSTRING(ConsumePAK_DisplayName), LSTRING(ConsumePAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(allowSelfPAK), + "LIST", + [LSTRING(AllowSelfPAK_DisplayName), LSTRING(AllowSelfPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(timeCoefficientPAK), + "SLIDER", + [LSTRING(TimeCoefficientPAK_DisplayName), LSTRING(TimeCoefficientPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0, 5, 1, 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(medicSurgicalKit), + "LIST", + [LSTRING(MedicSurgicalKit_DisplayName), LSTRING(MedicSurgicalKit_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(locationSurgicalKit), + "LIST", + [LSTRING(LocationSurgicalKit_DisplayName), LSTRING(LocationSurgicalKit_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 2], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(consumeSurgicalKit), + "LIST", + [LSTRING(ConsumeSurgicalKit_DisplayName), LSTRING(ConsumeSurgicalKit_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(allowSelfStitch), + "LIST", + [LSTRING(AllowSelfStitch_DisplayName), LSTRING(AllowSelfStitch_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(medicIV), + "LIST", + [LSTRING(MedicIV_DisplayName), LSTRING(MedicIV_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(allowSelfIV), + "LIST", + [LSTRING(AllowSelfIV_DisplayName), LSTRING(AllowSelfIV_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(cprSuccessChance), + "SLIDER", + [LSTRING(CPRSuccessChance_DisplayName), LSTRING(CPRSuccessChance_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0, 1, 0.4, 2, true], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(holsterRequired), + "LIST", + [LSTRING(HolsterRequired_DisplayName), LSTRING(HolsterRequired_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Disabled), LSTRING(HolsterRequired_Lowered), LSTRING(HolsterRequired_LoweredExam), LSTRING(HolsterRequired_Holstered), LSTRING(HolsterRequired_HolsteredExam)], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(allowLitterCreation), + "CHECKBOX", + [LSTRING(AllowLitterCreation_DisplayName), LSTRING(AllowLitterCreation_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], + true, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(maxLitterObjects), + "LIST", + [LSTRING(MaxLitterObjects_DisplayName), LSTRING(MaxLitterObjects_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], + [[50, 100, 200, 300, 400, 500, 1000, 2000, 3000, 4000, 5000], [/* settings function will auto create names */], 5], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(litterCleanupDelay), + "SLIDER", + [LSTRING(LitterCleanupDelay_DisplayName), LSTRING(LitterCleanupDelay_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], + [-1, 3600, 600, 0], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_treatment/script_component.hpp b/addons/medical_treatment/script_component.hpp new file mode 100644 index 00000000000..682e8a471c5 --- /dev/null +++ b/addons/medical_treatment/script_component.hpp @@ -0,0 +1,56 @@ +#define COMPONENT medical_treatment +#define COMPONENT_BEAUTIFIED Medical Treatment +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_TREATMENT + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_TREATMENT + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_TREATMENT +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" + +// Returns a text config entry as compiled code or variable from missionNamespace +#define GET_FUNCTION(var,cfg) \ + private var = getText (cfg); \ + if (isNil var) then { \ + var = compile var; \ + } else { \ + var = missionNamespace getVariable var; \ + } + +// Returns a number config entry with default value of 0 +// If entry is a string, will get the variable from missionNamespace +#define GET_NUMBER_ENTRY(cfg) \ + if (isText (cfg)) then { \ + missionNamespace getVariable [getText (cfg), 0]; \ + } else { \ + getNumber (cfg); \ + } + +// Macros for checking if unit is in medical vehicle or facility +// Defined mostly to make location check in canTreat more readable +#define IN_MED_VEHICLE(unit) (unit call FUNC(isInMedicalVehicle)) +#define IN_MED_FACILITY(unit) (unit call FUNC(isInMedicalFacility)) + +#define TREATMENT_LOCATIONS_ALL 0 +#define TREATMENT_LOCATIONS_VEHICLES 1 +#define TREATMENT_LOCATIONS_FACILITIES 2 +#define TREATMENT_LOCATIONS_VEHICLES_AND_FACILITIES 3 +#define TREATMENT_LOCATIONS_NONE 4 + +#define LITTER_CLEANUP_CHECK_DELAY 30 +#define BODY_CLEANUP_CHECK_DELAY 20 + +// Animations that would be played slower than this are instead played exactly as slow as this. (= Progress bar will take longer than the slowed down animation). +#define ANIMATION_SPEED_MIN_COEFFICIENT 0.5 + +// Animations that would be played faster than this are instead skipped. (= Progress bar too quick for animation). +#define ANIMATION_SPEED_MAX_COEFFICIENT 2.5 diff --git a/addons/medical/sounds/Inject.ogg b/addons/medical_treatment/sounds/Inject.ogg similarity index 100% rename from addons/medical/sounds/Inject.ogg rename to addons/medical_treatment/sounds/Inject.ogg diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml new file mode 100644 index 00000000000..9ae2d1f116e --- /dev/null +++ b/addons/medical_treatment/stringtable.xml @@ -0,0 +1,4033 @@ + + + + + Treatment + Behandlung + 治療 + Лечение + Traitement + Tratamento + 治療 + Trattamento + Léčba + Leczenie + + + Litter + 廃棄物 + Détritus + Медицинский мусор + Lixo + 醫療用廢棄物 + Rifiuti + Odpadky + Śmieci + Abfall + + + Advanced Diagnose + Erweiterte Diagnose + アドバンスド診断 + Расширенная Диагностика + Diagnostic avancé + Diagnóstico Avançado + 進階診斷 + Diagnosi avanzata + Pokročilá diagnóza + Zaawansowana Diagnoza + Gelişmiş Teşhis + + + Enables the Check Pulse, Check Blood Pressure, and Check Response treatment actions instead of the generic Diagnose action.\nWhen disabled, the CPR action will only be shown when performing CPR is appropriate.\nThe actions this setting enables are needed to determine whether a person is unconscious or in cardiac arrest. + 有効化すると通常の診断動作に代わり、心拍や血圧測定、反応を確認できます。 + Active le diagnostic avancé, permettant la vérification du pouls, de la pression sanguine, ainsi que la réponse du patient aux traitements.\nSi l'option est désactivée, l'action de RCP ne sera visible que si elle est effectivement appropriée.\nLe diagnostic avancé est indispensable pour différencier une personne inconsciente d'une personne en arrêt cardiaque. + Включает действия «Проверить пульс», «Проверить давление» и «Проверить реакцию» вместо общего действия «Диагностика». + Ativa as opções de Verificar Pulso, Verificar Pressão Sanguínea e Verificar Resposta, ao invés do diagnóstico geral. + 啟用檢查脈搏、血壓以及病患反應的動作而非一般的診斷動作。\n當停用時,CPR只會在需要時出現。\n當這個選項啟用時必須診斷病患是否無意識或者心搏停止。 + Abilita le azioni di controllo del polso, controllo della pressione sanguigna e controllo della risposta al trattamento invece dell'azione generica Diagnose.\ Se disabilitata, l'azione di RCP sarà mostrata solo quando l'esecuzione della RCP è appropriata.\Le azioni abilitate da questa impostazione sono necessarie per determinare se una persona è in stato di incoscienza o in arresto cardiaco. + Povoluje kontrolu srdečního tepu, krevního tlaku a reakce pacienta namísto univerzální diagnózy.\nKdyž je tato možnost vypnuta, CPR akce bude dostupná pouze pokud je vhodné ji provést.\nAkce které tato možnost zapíná jsou nutné k určení zda je pacient v bezvědomí nebo má srdeční zástavu. + Włącza opcje sprawdzania Pulsu, Ciśnienia Tętniczego Krwi i Reakcje Na Ból, zamiast bardziej ogólnej akcji Diagnozuj.\n Po wyłączeniu tej opcji akcja RKO będzie wyświetlana tylko wtedy, gdy jej wykonanie będzie odpowiednie.\n Opcja, która włącza to ustawienie jest potrzebna do ustalenia, czy osoba jest nieprzytomna lub ma zatrzymanie krążenia. + Ermöglicht die 'Überprüfe Puls', 'Überprüfe Blutdruck' und 'Überprüfe Reaktionen' Behandlungsaktionen anstatt der einfachen 'Diagnose' Behandlungsaktion.\nWenn diese Einstellung nicht aktiviert ist, wird die "HLW"-Aktion nur angezeigt, wenn die Anwendung von HLW angemessen ist.\nDie Aktionen, die das Aktivieren dieser Einstellung ermöglicht, werden benötigt um zu bestimmen, ob eine Person bewusstlos ist oder einen Herzstillstand erleidet. + + + Advanced Medication + Erweiterte Medikation + アドバンスド医薬品 + Расширенные Лекарства + Médication avancée + Medicação Avançada + 進階醫療用品 + Pokročilé léky + Medicazione avanzata + Zaawansowane leki + Gelişmiş Ilaç + + + Enables extended, more in-depth medication handling. Also, enables the use of Adenosine. + Устанавливает расширенное использование лекарств + 有効化するともっと多くの多様な機能を持つ医薬品を使えます。また、アデノシンとアトロピンが利用可能になります。 + Permet une manipulation étendue et plus approfondie des médicaments.\nEn outre, permet l'utilisation d'adénosine. + Ativa a manipulação avançada de medicações. Também permite o uso de Adenosina e Atropina. + 是否擴展藥物管控使其更深度化。並且,啟用腺苷以及阿托品的使用次數 + Povoluje hlubší a rozšířené zacházení s léčivy. Také aktivuje Adenosin a Atropin. + Abilita una gestione della medicazione più estesa e approfondita. Permette inoltre l'utilizzo dell'Adenosina. + Ermöglicht erweiterte, mehr tiefgründigere Anwendung von Medikationen. Ebenso ermöglicht es die Benutzung von Adenosin. + Pozwala na zaawansowane uzycie leków. Pozwala na używanie Adenozyny. + + + Advanced Bandages + Erweiterte Bandagen + アドバンスド包帯 + Расширенная Перевязка + Pansements avancés + Ataduras Avançadas + 進階包紮 + Bendaggi avanzati + Pokročilé obvazy + Zaawansowane Bandaże + Gelişmiş Bandajlar + + + Enables treatment actions for different bandage types instead of the generic Bandage action.\nAdditionally, the reopening of bandaged wounds can also be enabled. + Ermöglicht Behandlungsaktionen für verschiedene Bandagentypen anstelle der gewöhnlichen Bandageaktionen. + 有効化すると通常の包帯動作に代わり、様々な種類がある包帯で治療ができます。 + Active différents types de bandages, à choisir judicieusement en fonction des plaies. + Включает действия для разных типов повязок, вместо общего действия «Перевязка». + Ativa o uso de tipos diferentes de ataduras ao invés de apenas a atadura básica. + 啟用不同繃帶的可用行為而非一般包紮動作。 + Permette azioni di trattamento per diversi tipi di bendaggio al posto del bendaggio generico. + Povoluje specifické obvazy s různými vlastnostmi namísto jednoho univerzálního obvazu. + Umożliwia wybranie konkretnego rodzaju bandaża zamiast ogólnej akcji bandażowania. + + + Enabled & Can Reopen + Activé & peuvent se rouvrir + 有効 & 再開放 + Zapnuto & Úrazy se mohou znovu otevřít + Включено и может открыться заново + Aktywne & możliwe ponowne otwarcie + + + Wound Reopening Coefficient + Coefficient de réouverture des plaies + Wundwiederöffnungskoeffizient + Koeficient opětovného otevření rány + Коэффициент повторного открытия раны + Współczynnik ponownego otwierania ran + + + Coefficient for controlling the wound reopening chance. The final reopening chance is determined by multiplying this value with the specific reopening chance for the wound type and bandage used. + Coefficient de contrôle des chances de réouverture de la plaie. La chance de réouverture finale est déterminée en multipliant cette valeur par la chance de réouverture spécifique pour le type de plaie et le bandage utilisés. + Koeffizient zur Kontrolle der Wundöffnungswahrscheinlichkeit. Die endgültige Wiedereröffnungschance wird bestimmt, indem dieser Wert mit der spezifischen Wiedereröffnungschance für den verwendeten Wundtyp und Verband multipliziert wird. + Koeficient pro řízení šance na opětovné otevření rány. Konečná šance na opětovné otevření se stanoví vynásobením této hodnoty specifickou šancí na opětovné otevření pro použitý typ rány a obvaz. + Коэффициент контроля вероятности повторного открытия раны. Окончательный шанс повторного открытия определяется путем умножения этого значения на определенный шанс повторного открытия для используемого типа раны и повязки. + Współczynnik kontroluje szanse na ponowne otworzenie rany. Końcowa szansa na otworzenie jest ustalana przez pomnożenie tej wartości z wartością szansy na otworzenie rany dla typu rany oraz typu bandaża. + + + Clear Trauma After Bandage + 治療後に外傷を削除 + 包紮即痊癒 + Guérir les blessures pansées + Odebrat úraz po obvázání + Usuń uraz po zabandażowaniu + Rimozione ferite bendate + Entferne Trauma nach Bandagierung. + Удалять травму после перевязки + + + Controls whether fully bandaged body parts are healed. + 全ての傷に対して包帯を巻いた部分を治癒するかどうかを決定します。 + Kontroluje czy w pełni zabandażowane części ciała są uleczone. + Définit s'il faut guérir les parties du corps entièrement bandées. + Controlla se le parti del corpo completamente bendate sono guarite. + Kontrolliert, ob voll bandagierte Körperteile geheilt werden. + 控制說當傷口處理好的時候是否直接痊癒。 + Nastavuje zda jsou plně obvázané části těla vyléčena. + Контролирует то, что полностью перевязанные раны целиком исцеляют часть тела. + + + Locations Boost Training + Zdravotnická místa zvyšují zdravotnickou úrovně + Sedi per potenziare la formazione + Örtliche Trainingssteigerung + Ubicación mejora entrenamiento. + Miejsca zwiększają wyszkolenie + Localização melhora treinamento + Le lieu améliore l'efficacité + Места ускоренного обучения + 衛生能力の上昇位置 + 교육 증가 지역 + 受所在位置影响提升医疗能力 + 受所在位置影響提升醫療能力 + + + Boost medical training when in medical vehicles or facilities. Untrained becomes medic, medic becomes doctor. + 衛生車両か施設では衛生能力を上昇します。未訓練では衛生兵に、衛生兵では医師になります。 + Améliore les compétences médicales des unités en fonction du lieu où elles se trouvent ; notamment dans les véhicules ou les installations sanitaires.\nUn soldat non formé devient infirmier, un infirmier devient médecin. + Увеличивает уровень медподготовки при нахождении в медицинской технике или госпитале. Неподготовленный становится Медиком, Медик становится Доктором. + Aumenta a qualidade do tratamento quando dentro de veículos ou instalações médicas. Destreinados se tornam médicos, médicos se tornam doutores. + 在醫療設施或者載具旁時增加醫療能力。未受訓練的將會成為醫療兵,醫療兵將會成為軍醫。 + Aumentare la formazione medica quando si è in veicoli o strutture mediche. Se non addestrato diventa medico, il medico diventa dottore. + Zvyšuje zdravotnickou úroveň v zdravotnických objektech a vozidlech. Nevycvičení se stávají mediky a medici se stávají doktory. + Zwiększ wyszkolenie medyczne w pojazdach lub obiektach medycznych. Niewytrenowana jednostka zostaje medykiem, medyk zostaje lekarzem. + Verbessere 'Fähigkeiten-Level' in medizinischen Fahrzeugen oder Einrichtungen. Untrainiert wird zu Sanitäter, Sanitäter wird zu Arzt. + + + Allow Shared Equipment + 装備共有を許可 + Matériel médical partagé + Разрешить общие медикаменты + Permitir Compartilhar Itens Médicos + 允許共享設備 + Consentire la condivisione di attrezzature + Povolit sdílení vybavení + Zezwalaj na współdzielenie sprzętu + Erlaube geteilte Ausrüstung + + + Controls whether medical equipment can be shared between the patient and the medic. + 患者と衛生兵との間で医療品の共有をするかどうかを決定します。 + Définit si l'équipement médical du médecin et du patient sont mis en commun, et quel matériel est à utiliser en priorité, le cas échéant. + Контролирует, можно ли разделить медикаменты между пациентом и врачом. + Controla se um item médico pode ser compartilhado entre médico e paciente. + 控制是否病患與醫療兵之間能否共享醫療物資 + Controlla se le attrezzature mediche possono essere condivise tra il paziente e il medico. + Nastavuje zda jak je zdravotnické vybavení sdíleno mezi medikem a pacientem. + Kontroluje, czy sprzęt medyczny ma być dzielony między pacjentem a medykiem. + Legt fest, ob medizinische Ausrüstung zwischen Patient und Sanitäter geteilt werden kann. + + + Patient's Equipment First + 患者の装備を先に使用 + Matériel du patient d'abord + Сначала медикаменты пациента + Usar do Paciente Primeiro + 優先使用患者的醫療物資 + L'attrezzatura del paziente prima di tutto + Prvně pacientovo vybavení + Najpierw sprzęt pacjenta + Ausrüstung des Patienten zuerst + + + Medic's Equipment First + 衛生兵の装備を先に使用 + Matériel du médecin d'abord + Сначала медикаменты врача + Usar do Médico Primeiro + 優先使用醫療兵的醫療物資 + Prima le attrezzature mediche + Prvně medikovo vybavení + Najpierw sprzęt medyka + Ausrüstung des Sanitäters zuerst + + + Allow Epinephrine + Erlaube Epiniphrin + Permitir Epinefrina + Ograniczenia użycia adrenaliny + Épinéphrine autorisée pour + Permette epinefrina + Povolit epinefrin + Permitir Epinefrina + Разрешить Адреналин + アドレナリンの許可 + 에피네프린 활성화 + 允许使用肾上腺素 + 允許使用腎上腺素 + + + Training level required to use epinephrine. + アドレナリンの使用に訓練レベルを必要とさせます。 + Définit quelle qualification médicale est requise pour pouvoir utiliser l'épinéphrine. + Уровень подготовки, необходимый для использования Адреналина. + É necessária uma qualificação médica para usar epinefrina. + 要受過何種程度的醫療訓練才可以使用腎上腺素 + Livello di addestramento richiesto per usare l'Epinefrina. + Úroveň výcviku pro použití epinefrinu + Poziom wyszkolenia wymagany do korzystania z epinefryny. + 'Fähigkeiten-Level', das benötigt wird, um Epinephrin zu nutzen. + + + Locations Epinephrine + Orte für Epiniphrin + Ubicaciones epinefrina + Miejsca użycia epinefryny + Lieux épinéphrine + Ubicazione epinefrina + Oblast pro použití epinefrinu + Localizações de Epinefrina + Места использования Адреналина + アドレナリンの使用可能場所 + 에피네프린 사용 장소 + 肾上腺素使用地点 + 腎上腺素使用地點 + + + Controls where epinephrine can be used. + アドレナリンが使える場所を決定します。 + Définit où l'épinéphrine peut être utilisée. + Контролирует, где можно использовать Адреналин. + Controla onde Epinefrina pode ser utilizada. + 控制何處能使用腎上腺素 + Controlli dove si può usare l'Epinefrina. + Nastavuje kde může být epinefrin použit + Kontroluje, gdzie można stosować epinefrynę. + Legt fest, wo Epinephrin genutzt werden kann. + + + Allow PAK + Использование Аптечки + Ograniczenia użycia apteczek osobistych + Permitir EPA + Erlaube Erste-Hilfe-Set + Povolit osobní lékárničky (PAK) + Permitir Kit de Primeiros Socorros (KPS) + Trousse sanitaire autorisée pour + Elsősegélycsomag engedélyezése + Consenti Kit di Pronto Soccorso + 応急処置キットの許可 + 개인응급키트 활성화 + 允许使用个人急救包 + 允許使用個人急救包 + + + Training level required to use a PAK. + 応急処置キットの使用に訓練レベルを必要とさせます。 + Définit quelle qualification médicale est requise pour pouvoir utiliser la trousse sanitaire. + Уровень подготовки, необходимый для использования Аптечки. + É necessária uma qualificação médica para usar KPS + 要受過何種程度的醫療訓練才可以使用個人急救包 + Livello di formazione richiesto per l'utilizzo di un PAK. + Úroveň výcviku pro použití osobní lékárničky (PAK). + Poziom wyszkolenia wymagany do korzystania z apteczek osobistych. + 'Fähigkeiten-Level', das benötigt wird, um ein Erste-Hilfe-Set zu nutzen. + + + Locations PAK + Места использования Аптечки + Miejsca użycia apteczek osobistych + Ubicaciones del EPA + Orte für Erste-Hilfe-Set + Oblast k použití PAK + Localizações do KPS + Lieux trousse sanitaire + Elsősegélycsomag helyek + Locazioni Kit Pronto Soccorso + 応急処置キットの使用可能場所 + 개인응급키트 사용 장소 + 个人急救包使用地点 + 個人急救包使用地點 + + + Controls where a PAK can be used. + 応急処置キットが使える場所を決定します。 + Définit où la trousse sanitaire peut être utilisée. + Контролирует, где можно использовать Аптечку. + Controla onde o KPS pode ser utilizado. + 控制何處能使用個人急救包 + Controlla dove può essere usato un PAK. + Nastavuje kde může být osobní lékárnička (PAK) použita. + Kontroluje, gdzie można korzystać z apteczek osobistych. + Kontrolliert, wo ein Erste-Hilfe-Set benutzt werden kann. + + + Consume PAK + 応急処置キットの消費 + Trousse sanitaire consommable + Израсходовать Аптечку + KPS Descartável + 個人急救包為消耗品 + Consumare PAK + Spotřebuj osobní lékárničku (PAK) + Zużycie apteczek osobistych + Verbrauche Erste-Hilfe-Set + + + Controls whether a PAK should be consumed after use. + 応急処置キットの使用後に消費するかどうかを決定します。 + Définit si la trousse sanitaire doit être à usage unique. + Контролирует, следует ли израсходовать Аптечку после использования. + Controla se o KPS deve ser descartado/consumido após o uso. + 設定個人急救包是否為消耗品 + Controlla se un PAK deve essere consumato dopo l'uso. + Nastavuje zda má být osobní lékárnička (PAK) spotřebována po použití. + Kontroluje, czy apteczka osobista powinna być zużyta po użyciu. + Kontrolliert, ob ein Erste-Hilfe-Set nach der Benutzung verbraucht werden soll. + + + Self PAK Usage + Utilizzo del kit di pronto soccorso su se stessi + Erste-Hilfe-Set Selbstanwendung + 自我使用急救包 + Utilisation de la trousse sanitaire sur soi-même + Używanie apteczki osobistej na sobie + 応急処置キットの自己使用 + Samo-použití osobní lékárničky (PAK) + Использование аптечки на себе + + + Enables the use of PAKs to heal oneself. + Abilita l'utilizzo del kit di pronto soccorso su se stessi. + Erlaubt die Benutzung des Erste-Hilfe-Sets, um sich selbst zu heilen. + 啟用個人急救包能對自己使用。 + Définit si le joueur peut utiliser la trousse sanitaire pour se soigner lui-même. + Pozwala na użycie apteczki osobistej na sobie + 応急処置キットを使って、自分を治療できるようにします。 + Umožňuje použít osobní lékárničku (PAK) na sama sebe. + Позволяют использовать аптечку на себе в одиночку. + + + Time Coefficient PAK + 応急処置キットの時間係数 + Coefficient de temps pour la trousse sanitaire + Контролирует, следует ли израсходовать Аптечку после использования. + Coeficiente de Tempo do KPS + 個人急救包的時間係數 + Coefficiente temporale PAK + Časový koeficient pro osobní lékárničku (PAK) + Współczynnik czasu apteczek osobistych + Zeit-Koeffizient Erste-Hilfe-Set + + + Modifies how long a PAK takes to apply.\nThe treatment time is based on the total body part damage multiplied by this coefficient, with a minimum of 10 seconds. + 応急処置キットの使用にかかる時間を変更できます。\n総治療時間は最低でも 10 秒間で、この係数と体全体に負ったダメージによって決まります。 + Modifie le temps nécessaire à l'application de la trousse sanitaire.\nLa durée est calculée en multipliant ce coefficient par les dommages totaux du patient, avec un minimum de 10 secondes. + Изменяет быстроту применения Аптечки.\nВремя лечения зависит от общего повреждения частей тела, умноженного на данный коэффициент (минимум 10 сек.). + Modifica quanto tempo o KPS leva para ser aplicado.\nO tempo de tratamento é baseado no total de dano do corpo, multiplicado por esse coeficiente, com um mínimo de 10 segundos. + 修改個人急救包要使用多久才能完成。\n醫療時間是依照全身的肢體狀況並乘上該係數而決定的,至少十秒。 + Il tempo di trattamento si basa sul danno totale della parte del corpo moltiplicato per questo coefficiente, con un minimo di 10 secondi. + Upravuje jak dlouho trvá léčba pomocí osobní lékárničky (PAK).\nDoba léčby závisí na celkovém poškození částí těla vynásobeném tímto koeficientem, přičemž minimum je 10 vteřin. + Zmienia czas potrzebny na zastosowanie apteczki osobistej.\n Czas leczenia jest oparty na całkowitym uszkodzeniu części ciała pomnożonym przez ten współczynnik, wynosi minimum 10 sekund. + Modifiziert, wie lange ein Erste-Hilfe-Set für die Anwendung benötigt.\nDie Behandlungszeit basiert auf der Anzahl des Gesamtkörperschadens multipliziert mit diesem Koeffizienten, mit einen Minimum von 10 Sekunden. + + + Allow Surgical Kit + 縫合キットを許可 + Trousse chirurgicale autorisée pour + Разрешить Хирургический набор + Permitir Kit Cirúrgico + 允許使用手術包 + Permettere il kit chirurgico + Povolit sešívací sadu + Ograniczenia Użycia Zestawu Chirurgicznego + Erlaube Operations-Set + + + Training level required to use a surgical kit. + 縫合キットの使用に訓練レベルを必要とさせます。 + Définit quelle qualification médicale est requise pour pouvoir utiliser une trousse chirurgicale. + Уровень медицинской подготовки, необходимый для использования Хирургического набора. + É necessária uma qualificação médica para usar Kit Cirúrgico + 要受過多少程度的醫療訓練才能使用手術包。 + Livello di formazione richiesto per l'utilizzo di un kit chirurgico. + Úroveň výcviku pro použití sešívací sady. + Poziom wyszkolenia wymagany do korzystania z Zestawu Chirurgicznego. + 'Fähigkeiten-Level', das benötigt wird um ein Operations-Set zu nutzen. + + + Locations Surgical Kit + 縫合キットの使用可能場所 + Lieux trousse chirurgicale + Места использования Хирургического набора + Locais para Kit Cirúrgico + 手術包使用地點 + Luoghi Kit chirurgico + Nastavuje kde může být sešívací sada použita + Miejsca użycia Zestawu Chirurgicznego + Orte für Operations-Set + + + Controls where a surgical kit can be used. + 縫合キットが使える場所を決定します。 + Définit où la trousse chirurgicale peut être utilisée. + Контролирует, где можно использовать Хирургический набор + Controle onde o Kit Cirúrgico pode ser utilizado. + 控制何處能使用手術包 + Controlla dove può essere usato un kit chirurgico. + Nastavuje zda má být sešívací sada spotřebována po použití. + Kontroluje, gdzie można użyć Zestawu Chirurgicznego. + Legt fest, wo ein Operations-Set genutzt werden kann. + + + Consume Surgical Kit + 縫合キットの消費 + Trousse chirurgicale consommable + Израсходовать Хирургический набор + Kit Cirúrgico Consumível + 手術包為消耗品 + Consumare Kit Chirurgico + Spotřebuj sešívací sadu + Zużycie Zestawów Chirurgicznych + Verbrauche Operations-Set + + + Controls whether a surgical kit should be consumed after use. + 縫合キットの使用後に消費するかどうかを決定します。 + Définit si la trousse chirurgicale doit être à usage unique. + Контролирует, следует ли израсходовать Хирургический набор после использования. + Controla se o Kit Cirúrgico deve ser descartado/consumido após o uso. + 設定手術包是否為消耗品 + Controlla se un kit chirurgico deve essere consumato dopo l'uso. + Nastavuje + Kontroluje, czy Zestaw Chirurgiczny powinien być zużyty po użyciu. + Legt fest, ob ein Operations-Set nach der Anwendung verbraucht werden soll. + + + Self Stitching + Suturer soi-même + Auto-Cirurgia + 自己縫合 + 自我縫合 + Auto cucitura + Samo-zašívání + Zszywanie własnych ran + Selbstnähen + Зашивание своей раны + + + Enables the use of surgical kits to stitch oneself. + Autorise l'utilisation de la trousse chirugicale sur soi-même. + Permite o uso de Kit Cirúrgico em si mesmo. + 縫合キットを使い自らを縫合できるようにします。 + 啟用是否能自己使用手術包來縫合自己的傷口。 + Umožňuje použití sešívací sady na sebe sama. + Umożliwia użycie Zestawu Chirurgicznego na sobie. + Permette l'uso di kit chirurgici per ricucirsi. + Ermöglicht die Benutzung des Operations-Sets, um sich selbst zu nähen. + Включает использование хирургического набора на себе. + + + Self IV Transfusion + Eigennutzung von Bluttransfusionen + Внутривенное переливание на себе + 自己 IV 輸血 + Autotransfusion d'IV + Autotransfusão de IV + 自我注射點滴 + Samoaplikace IV transfuze + Samotransfuzja IV + Trasfusione endovena su se stessi + + + Enables the use of IV transfusions on oneself. + Erlaube Bluttransfusionen an sich selbst zu benutzen + Позволяет использовать внутривенные переливания на себе + 自らに対して IV 輸血を可能にします。 + Permet de poser des IV sur soi-même. + Permite utilizar bolsas de IV para transfusão em si mesmo + 啟用是否能對自己注射點滴 + Umožňuje aplikovat IV transfuze na sama sebe. + Pozwala przetoczyć płyny IV samemu sobie + Abilita la trasfusione in endovena su se stessi. + + + Allow IV Transfusion + Erlaube Bluttransfusionen + Zezwalaj na przetaczanie płynów IV + Pose de perfusion autorisée pour + 允許操作點滴 + IV 輸血の制限 + Povolit IV transfuzi + Разрешить переливание IV группы крови + + + Training level required to transfuse IVs. + 'Fähigkeiten-Level', das benötigt wird, um Blut zu transfundieren. + Poziom wyszkolenia potrzebny aby móc przetaczać płyny IV. + Définit quelle qualification médicale est requise pour pouvoir poser des perfusions intraveineuses. + 要有何種醫療水準才可注射點滴。 + IV 輸血を行うのに訓練済レベルを要求とします。 + Úroveň výcviku nutná pro IV transfuzi. + Уровень навыка требуемый для переливания крови IV группы. + + + Convert Vanilla Items + Standard Arma-Equipment in ACE-Items umwandeln + Преобразовывать ванильные медикаменты + 標準アイテムの変換 + Convertir les objets vanilla + Converter itens vanilla + 轉換原版物品 + Converti oggetti vanilla + Přeměnit zdravotnické předměty ze základní hry + Konwertuj przedmioty z vanili + + + Controls whether vanilla medical items are converted to ACE Medical items, removed only, or ignored. + Legt fest, ob Standard Medic-Equipment in ACE-Equipment umgewandelt oder entfernt wird + ゲーム標準の医療アイテムを ACE 医療アイテムへ変換、削除、そのままにするかを決定します。 + Détermine si les objets médicaux vanilla sont convertis en objets médicaux ACE, s'ils sont simplement retirés, ou s'ils sont ignorés. + Определяет, что делать с ванильными медикаментами: преобразовать в медикаменты ACE, удалить или проигнорировать. + Controla se itens médicos vanilla serão convertidos para itens do ACE, removidos ou ignorados. + 控制是否轉換原版的醫療物資成ACE的醫療物資,或者單純移除或無視。 + Controlla se gli articoli medicali vanilla vengono convertiti in articoli medicali ACE, rimossi o ignorati. + Nastavuje zda zdravotnické předměty ze základní hry budou přeměněny na ACE předměty, odstraněny nebo ignorovány. + Kontroluje, czy podstawowe przedmioty medyczne z Arma są konwertowane na przedmioty medyczne ACE, tylko usuwane lub ignorowane. + + + Remove Only + 削除のみ + Retirer uniquement + Удалять + Apenas Remover + 單純移除 + Rimuovere solo + Pouze odstranit + Tylko Usuwaj + Nur Entfernen + + + Enable Litter + Включить мусор + Aktywuj odpadki + Activar restos médicos + Abfälle aktivieren + Povolit odpadky + Permitir Lixo Médico + Activer les détritus + Szemét engedélyezése + Abilita rifiuti + 廃棄物の有効化 + 啟用醫療用廢棄物 + + + Enables the creation of litter upon treatment. + 治療後に廃棄物の生成を有効化します。 + Active la généreration de détritus (emballages, pansements usagés...) suite à un traitement. + Разрешает создание медицинского мусора при лечении. + Permite a criação de lixo médico durante o tratamento. + 啟用醫療後剩下的醫療用廢棄物。 + Permette la creazione di rifiuti al momento del trattamento. + Umožňuje vytvořit odpadky při léčbě. + Umożliwia tworzenie śmieci po przeprowadzaniu zabiegu. + Ermöglicht das Produzieren von Abfall während einer Behandlung. + + + Max Litter Objects + 最大廃棄物数 + Nombre maximum de détritus + Макс. кол-во мусора + Máximo de Objetos de Lixo + 最大醫療用廢棄物數量 + Numero massimo di rifiuti + Maximum odpadků + Maksymalna Ilość Śmieci + Maximale Anzahl an Abfall-Objekten + + + Sets the maximum number of litter objects which can be spawned, excessive amounts can cause FPS lag. + 生成される最大廃棄物数を設定できます。極端に増やすと FPS ラグを引き起こします。 + Définit le nombre maximal de détritus pouvant être affichés.\nUne quantité excessive peut engendrer une baisse de FPS. + Устанавливает максимальное количество создаваемых объектов мусора. Чрезмерное значение может вызвать задержку FPS. + Define o limite máximo de objetos de lixo que podem ser criados, quantidade excessivas podem causar lag de FPS. + 設定最大可以產生的醫療用廢棄物數量,極端的數量的話可能導致幀數下降。 + Imposta il numero massimo di rifiuti che possono essere generati, quantità eccessive possono diminuire gli FPS. + Nastavuje maximum odpadků, které se mohou objevit. Vysoká hodnota m§že negativně ovlivnit FPS. + Definiuje maksymalną liczbę śmieci, które mogą zostać stworzone, nadmierne ilości mogą powodować spadki FPS. + Bestimmt die maximal Anzahl an Abfall-Objekten, die erstellt werden können. Eine zu hohe Anzahl kann Lag verursachen. + + + Litter Lifetime + 廃棄物寿命 + Durée d'affichage des détritus + Время жизни мусора + Duração de Lixo + 醫療用廢棄物時長 + Tempo rifiuti + Životnost odpadků + Czas trwania Śmieci + Abfall Anzeigedauer + + + Controls the lifetime of litter objects, in seconds. -1 is forever. + 廃棄物の寿命を秒で決定できます。-1 で永遠です。 + Définit la durée d'affichage des détritus, en secondes. Durée illimitée : -1. + Управляет временем жизни объектов мусора в секундах. -1 означает Навсегда. + Controla o tempo de vida de objetos de lixo criados em segundos. -1 é para sempre. + 控制醫療用廢棄物的時長,以秒為單位。設定為-1則是永不刪除。 + Controlla la durata di vita dei rifiuti in secondi. -1 è per sempre. + Nastavuje za jak dlouho zdravotnické odpadky zmizí. -1 je navždy. + Kontroluje czas trwania śmieci w sekundach. -1 pozostawia je na zawsze. + Kontrolliert die Anzeigedauer von Abfall-Objekten in Sekunden. -1 ist für immer. + + + Anyone + Кем угодно + Wszyscy + Nadie + Jeder + Kdokoliv + Qualquer um + Tout le monde + Akárki + Chiunque + だれでも + 모두 + 任何人 + 任何人 + + + Medics + 衛生兵 + Infirmiers + Медики + Médicos + 醫療兵 + Medici + Medikové + Medycy + Sanitäter + + + Doctors + 医師 + Médecins + Доктора + Doutores + 軍醫 + Dottori + Doktoři + Doktorzy + Ärzte + + + Medical Facilities + 医療施設 + Installations sanitaires + Госпитали + Instalações Médicas + 醫療設施 + Strutture mediche + Zdravotnické zařízení + Obiekty Medyczne + Medizinische Einrichtungen + + + Vehicles & Facilities + 車両 & 施設 + Véhicules & installations sanitaires + Техника и госпитали + Veículos e Instalações Médicas + 車輛與設施 + Zdravotnická zařízení a vozidla + Veicoli e strutture + Pojazdy i Obiekty + Fahrzeuge und Einrichtungen + + + CPR Success Chance + 心肺蘇生の成功率 + Chance de réussite de la RCP + Шанс успешной реанимации + Chance de ter sucesso com SBV + 心肺復甦術成功率 + Pravděpodobnost úspěchu CPR + Possibilità di successo della RCP + Szansa powodzenia RKO + HLW Erfolgsrate + + + Probability that CPR will be successful in restoring heart rhythm. + 心肺蘇生によって心拍を戻せる確率を決定できます。 + Probabilité de rétablir un rythme cardiaque suite à une RCP. + Вероятность успешного проведения сердечно-лёгочной реанимации (СЛР). + Probabilidade que um SBV restaurará o batimento cardíaco. + 心肺復甦術恢復心率的機率。 + Pravděpodobnost, že CPR obnoví srdeční tep. + E' probabile che la rianimazione RCP abbia successo nel ripristinare il ritmo cardiaco. + Prawdopodobieństwo przwyrócenia akcji serca poprzez wykonanie RKO + Wahrscheinlichkeit, dass HLW bei der Wiederherstellung des Herzrhythmus erfolgreich sein wird. + + + Holster Required + 武器の扱い + 需要收起武器 + Rengainer obligatoirement + Fondina richiesta + Vyžadováno schování zbraně + Wymagana broń w kaburze + Holstern benötigt + Необходимость убирать оружие + + + Controls whether weapons must be holstered / lowered in order to perform medical actions.\nExcept Exam options allow examination actions (checking pulse, blood pressure, response) at all times regardless of this setting. + 何らかの治療をするには武器を下げるか収めるかどうかを決定します。\nなお次の診断行動は設定で例外できます: 心拍確認、血圧測定、反応確認 + 控制是否要先放下或把武器放入武器套才能做出醫療行為。\n除了診斷 - 允許未放下或未放入的情況下進行一連串的診斷(檢查脈搏,血壓,反應)。 + Définit si les armes doivent être rengainées ou abaissées avant de pouvoir effectuer des actes médicaux.\nLes options "sauf examens" autorisent les examens (vérification du pouls, de la tension artérielle, de l'état de conscience) en toutes circonstances. + Nastavuje zda musí být zbraň schovaná/snížená pro provádění zdravotnických úkonů.\nKromě Diagnózy - Umožňuje diagnostické akce (kontrola srdečního tepu, tlaku krve a reakci pacienta) vždy bez ohledu na nastavení schování zbraně. + Kontroluje, czy broń musi być schowana/opuszczona w celu wykonania leczenia pacjenta.\n Za wyjątkiem diagnozowania - umożliwia wykonywanie czynności kontrolnych (sprawdzanie tętna, ciśnienia krwi, reakcji) przez cały czas, niezależnie od ustawienia Wymagana broń w kaburze. + Controlla se le armi devono essere tenute nella fondina / abbassate per poter eseguire le azioni mediche.\Except Exam - Permette azioni di esame (controllo del polso, della pressione sanguigna, della risposta) in ogni momento indipendentemente dall'impostazione della fondina richiesta. + Kontrolliert, ob Waffen geholstert/gesenkt werden müssen, um medizinische Aktionen durchzuführen.\nAusgenommen die eingestellten Untersuchungsoptionen erlauben Diagnose-Aktionen (Überprüfung von Puls, Blutdruck, Reaktion) jederzeit. + Нужно ли убирать оружие для проведения медицинских действий.\nОпция «Проверка разрешена» разрешает проверять пульс, кровяное давление или реакцию независимо от этого параметра. + + + Lowered or Holstered + 下げるか収める + 放低或者收起 + Abaisser ou rengainer + Abbassato o con fondina + Snížena nebo Schována + Opuszczona lub w kaburze + Gesenkt oder Geholstert + Опущено или убрано + + + Lowered or Holstered (Except Exam) + 下げるか収める (診断行動は除外) + 放低或者收起(除了診斷) + Abaisser ou rengainer (sauf examens) + Abbassato o con la fondina (eccetto l'esame) + Snížena nebo Schována (kromě Diagnózy) + Opuszczona lub w kaburze (oprócz diagnozowania) + Gesenkt oder Geholstert (Ausnahme Untersuchung) + Опущено или убрано (Проверка разрешена) + + + Holstered Only + 収めた時のみ + 只能收起 + Rengainer seulement + Solo con la fondina + Pouze Schována + Tylko w Kaburze + Nur geholstert + Только убрано + + + Holstered Only (Except Exam) + 収めた時のみ (診断行動は除外) + 只能收起(除了診斷) + Rengainer seulement (sauf examens) + Solo fondina (eccetto esame) + Pouze Schována (kromě Diagnózy) + Tylko w Kaburze (oprócz diagnozowania) + Nur geholstert (Ausnahme Untersuchung) + Только убрано (Проверка разрешена) + + + [ACE] Medical Supply Crate (Basic) + [ACE] Ящик с медикаментами (базовая медицина) + [ACE] Skrzynka z zapasami medycznymi (podstawowa) + [ACE] Caja de suministros médicos (Básica) + [ACE] Sanitätskiste (Standard) + [ACE] Zdravotnické zásoby (základní) + [ACE] Caixa com suprimentos médicos + [ACE] Caisse médicale (basique) + [ACE] Orvosi láda (Alap) + [ACE] Cassa Rifornimenti Medici (Basico) + [ACE] 医療物資箱 (ベーシック) + [ACE] 의료 물자 (기본) + [ACE] 医疗补给箱 (基础) + [ACE] 醫療補給箱(基本) + + + [ACE] Medical Supply Crate (Advanced) + [ACE] Ящик с медикаментами (усложн. медицина) + [ACE] Skrzynka z zapasami medycznymi (zaawansowana) + [ACE] Caja de suministros médicos (Avanzada) + [ACE] Sanitätskiste (erweitert) + [ACE] Zdravotnické zásoby (pokročilé) + [ACE] Caixa com suprimentos médicos (Avançados) + [ACE] Caisse médicale (avancée) + [ACE] Orvosi láda (Fejlett) + [ACE] Cassa Rifornimenti Medici (Avanzato) + [ACE] 医療物資箱 (アドバンスド) + [ACE] 의료 물자 (고급) + [ACE] 医疗补给箱 (高级) + [ACE] 醫療補給箱(進階) + + + Whether or not the object will be a medical vehicle. + Czy pojazd ma być pojazdem medycznym? + L'oggetto in questione sarà un veicolo medico o meno. + Legt fest, ob das Objekt ein Sanitätsfahrzeug ist. + Es un vehículo médico? + Définit s'il s'agit d'un véhicule sanitaire. + Se o objeto será ou não um veículo médico + Будет ли объект считаться медицинским транспортом. + どれでも、またはオブジェクトを医療車両として割り当てます。 + 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. + 是否使该载具为医疗载具? + 是否使該載具為醫療載具? + Rozhoduje zda bude objekt zdravotnickým vozidlem. + + + Medical training + Wyszkolenie medyczne + Addestramento Medico + Sanitätsausbildung + Entrenamiento médico + Choix du niveau de compétence médicale de l'unité. + Lékařský výcvik + Treino médico + Медицинская подготовка + 衛生訓練 + 의료 훈련 + 医疗训练 + 醫療訓練 + + + Is Medic + Является медиком + Klasa medyczna + Es médico + Ist Sanitäter + Je zdravotník + É médico + Qualification médicale + Orvos-e + E' Medico + 衛生兵に + 의무병 + 是医疗兵 + 是醫療兵 + + + This module allows you to assign the medic class to selected units. + Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. + Dieses Modul legt fest, welche Einheiten Sanitäter sind. + Tento modul určuje, která jednotka je zdravotník. + Este módulo determina qual unidade é um paramédico. + Ce module vous permet d'assigner une classe médicale aux unités sélectionnées. + Ez a modul engedélyezi az orvosi jelző hozzárendelését kiválasztott egységekhez. + Этот модуль позволяет назначить класс медика выбранным юнитам. + Este módulo permite asignar la clase médico a las unidades seleccionadas. + Questo modulo ti permette di assegnare la classe Medico alle unità selezionate. + 選択されたユニットを衛生兵として指定します。 + 이 모듈은 선택한 보직이 의무병을 할 수 있게 해줍니다. + 本模块可让被同步的单位成为医疗兵 + 本模塊可讓被同步的單位成為醫療兵 + + + None + Нет + Żadna + Nada + Keine + Žádný + Nada + Aucune + Nincs + Nessuno + なし + 없음 + + + + + Regular Medic + Обычный медик + Zwykły medyk + Médico regular + Normaler Sanitäter + Řadový zdravotník + Médico regular + Infirmier + Hagyományos orvos + Medico Regolare + 通常の衛生兵 + 일반 의무병 + 普通医疗兵 + 普通醫療兵 + + + Is Medical Vehicle + Является медицинским транспортом + Jest pojazdem medycznym + Es vehículo médico + Ist medizinisches Fahrzeug + Zdravotnické vozidlo + É um veículo médico + Est un véhicule sanitaire + Orvosi jármű-e + E' Veicolo Medico + 医療車両に + 의료 차량 + 是医疗载具 + 是醫療載具 + + + Is Medical Facility + Является госпиталем + Jest budynkiem medycznym + Es centro médico + Ist eine medizinische Einrichtung + Zdravotnické zařízení + É uma instalação médica + Est une installation sanitaire + Orvosi létesítmény-e + E' Struttura Medica + 医療施設に + 의료시설 + 是医疗设施 + 是醫療設施 + + + Registers an object as a medical facility + Определяет объект в качестве госпиталя + Przypisuje danemu obiektowi status budynku medycznego + Registra un objeto como un centro médico + Definiert ein Objekt als medizinische Einrichtung + Registruje objekt jako zdravotnické zařízení + Registra um objeto como instalacão médica + Définit l'objet comme étant une installation sanitaire. + Egy objektum orvosi létesítményként való regisztrálása + Registra un oggetto come struttura medica + オブジェクトを医療施設として割り当てる + 물체를 의료시설로 등록합니다 + 指定一个物件作为医疗设施 + 指定一個物件作為醫療設施 + + + Doctor (Only Advanced Medics) + Врач (только усложн.) + Doktor (tylko zaawansowani medycy) + Doctor (Solo medicina avanzada) + Arzt (Nur erweitertes Sanitätssystem) + Doktor (Pouze pokročilý zdravotníci) + Doutor (Somente médicos avançados) + Médecin (uniquement en médecine avancée) + Doktor (csak fejlett orvosok) + Dottore (Solo Medici Avanzati) + 医師 (アドバンスド医療のみ) + 의사 (오직 고급 의료에서만) + 军医 (只限进阶医疗系统) + 軍醫 (只限進階醫療系統) + + + Doctor + Врач + Doktor + Doctor + Arzt + Doktor + Doutor + Médecin + Doktor + Dottore + 医師 + 의사 + 军医 + 軍醫 + + + Bandage (Basic) + Bandage (Einfach) + Повязка (обычная) + Vendaje (Básico) + Pansement individuel + Bandaż (jałowy) + Obvaz (Standardní) + Kötszer (Általános) + Bendaggio (base) + Bandagem(Básico) + 包帯 (緊急圧迫) + 붕대 (기본) + 绷带 (基础型) + 基礎繃帶 + + + Used to cover a wound + Для перевязки ран + Utilizado para cubrir una herida + Utilisé pour couvrir une blessure + Używany w celu przykrycia i ochrony miejsca zranienia. Najczęściej stosowany bandaż na otarcia i draśnięcia. + Verwendet um Wunden abzudecken + Sebesülések befedésére alkalmas + Usato per coprire una ferita + Usado para cobrir um ferimento + Slouží k překrytí poranění + 傷口を覆います + 상처를 덮을때 씁니다 + 用于覆盖伤口 + 用於覆蓋傷口 + + + A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. + Ein Verband, der aus einem besonderen Material besteht um die Wunde zu schützen, nachdem die Blutung gestoppt wurde. + Повязка, накладываемая поверх раны после остановки кровотечения. + Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar. + Pansement utilisé pour couvrir une blessure lorsque le saignement a été stoppé. + Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. + Egy különleges anyagú kötszer sebek betakarására, amelyet a vérzés elállítása után helyeznek fel. + Una benda apposita, utilizzata per coprire una ferita, la quale viene applicata su di essa una volta fermata l'emorragia. + Uma curativo, material específico para cobrir um ferimento que é aplicado assim que o sangramento é estancando. + Obvaz je vhodným způsobem upravený sterilní materiál, určený k překrytí rány, případně k fixaci poranění. + 傷口を血液凝固剤で塞ぐようにできていて、使うと出血の原因を取りさります。 + 드레싱, 출혈을 막고서 상처를 덮기위해 쓰는 물건입니다. + 用于覆盖伤口以防止出血, 透过敷料的止血剂来让出血慢慢停止 + 用於覆蓋傷口以防止出血, 透過敷料的止血劑來讓出血慢慢停止 + + + Bandage (Packing) + Bandage (Mullbinde) + Тампонирующая повязка + Vendaje compresivo + Bande compressive + Bandaż (uciskowy) + Nyomókötszer + Bendaggio compressivo + Bandagem de Compressão + Obvaz (Tlakový) + 弾性包帯 + 거즈 붕대 + 绷带 (包扎型) + 繃帶(包紮型) + + + Used to pack medium to large wounds and stem the bleeding + Wird verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen + Для тампонирования ран среднего и большого размера и остановки кровотечения. + Se utiliza para vendar heridas medianas o grandes y detener el sangrado + Utilisée pour panser les moyennes et grosses plaies, et freiner le saignement. + Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. Dobrze radzi sobie z tamowaniem ran płatowych oraz postrzałowych. + Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer + Usato su ferite medie o larghe per fermare emorragie. + Usado para o preenchimento de cavidades geradas por ferimentos médios e grandes e estancar o sangramento. + Používá se k zastavení středních až silnějších krvácení + 粘着フィルム状で、普通から大きめなケガに使い止血します。 + 중형 또는 대형 상처를 채우고 출혈을 막기위해 쓰입니다 + 用于包扎中到大型伤口, 并防止出血 + 用於包紮中到大型傷口, 並防止出血 + + + A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. + Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжёлых сочетанных ранениях возможно тампонирование раны. + Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. + Pansement utilisé pour enrayer le saignement et faciliter la cicatrisation de la plaie.\nComprimer une blessure est une option intéressante en cas de grands polytraumatismes. + Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. + Egy kötszerfajta, melyet a sebek nyomására használnak a vérzés elállítása és sebgyógyulás érdekében. A nyomókötés egy lehetőség nagyobb polytraumatikus sérülések esetén. + Un bendaggio usato per coprire la ferita, fermare il sanguinamento e facilitarne la guarigione. Questa tecnica è opzionale su ferite multiple. + Ein Verband, um die Wunde abzudecken und die Wundheilung zu fördern. Wunden abdecken ist eine Option bei größeren Polytraumen + Uma bandagem usada para preencher o ferimento para estancar o sangramento e facilitar a cicatrização. Preenchimento de feridas é uma opção em ferimentos de politrauma grandes. + Tlakový obvaz se skládá se ze sterilní krycí vrstvy, na kterou je přiložena silná vrstva savého materiálu stlačující cévu v ráně a která je přitlačována k ráně a připevněna obinadlem. Slouží k zastavení silnějších krvácení. + 包帯を使うと出血元を塞ぎ、怪我の治癒を促進させます。また大きめ多発性外傷に対しても使えます。 + 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 채우는것도 한 가지 방법입니다. + 用于包扎中到大型伤口, 并防止出血, 为在大型多处性伤口的选项之一! + 用於包紮中到大型傷口, 並防止出血, 為在大型多處性傷口的選項之一! + + + Bandage (Elastic) + Bandage (Elastisch) + Повязка (давящая) + Vendaje (Elástico) + Bande extensible + Bandaż (elastyczny) + Obvaz (Elastický) + Rögzító kötszer + Benda (elastica) + Bandagem (Elástica) + 包帯 (伸縮) + 붕대 (압박) + 绷带 (弹性型) + 繃帶(彈性型) + + + Bandage kit, Elastic + Elastische Binde (Kompressionsbinde) + Давящая повязка + Kit de vendaje (Elástico) + Bande de crêpe extensible + Bandaż elastyczny służy do opatrywania ran ciętych oraz kłutych. Dobrze radzi sobie również ze zgniecieniami tkanek miękkich oraz rozerwaniami powierzchni skóry. + Rugalmas kötszercsomag, "rögzítő" + Kit di bendaggio, elastico + Kit de Bandagem, Elástica + Sada obvazů, Elastická + 包帯キット (伸縮) + 붕대, 압박 + 弹性绷带 + 一個彈性繃帶包 + + + Allows an even compression and extra support to the injured area. + Ermöglicht eine gleichmäßige Kompression und zusätzliche Unterstützung für den verletzten Bereich. + Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку повреждённой области + Permet une compression uniforme et un maintien supplémentaire de la zone blessée. + Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. + Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada + Egyenletes nyomást és támogatást biztosít a sebesült felületnek. + Permette di comprimere e aiutare la zone ferita. + Esta bandagem pode ser utilizada para comprimir o ferimento e diminuir o sangramento e garantir que o ferimento não abra em movimento. + Hodí se k fixačním účelům a to i v oblastech kloubů. + 負傷部分へ最大の対応と止血を続けられます。 + 부상 부위를 골고루 압박해주면서 동시에 고정시켜 줍니다. + 可对伤口持续压迫并固定以防止伤口情况变严重 + 可對傷口持續壓迫並固定以防止傷口情況變嚴重 + + + Tourniquet (CAT) + Tourniquet [CAT] + Жгут + Torniquete (CAT) + Garrot (CAT) + Staza taktyczna (CAT) + Škrtidlo (CAT) + Érszorító (CAT) + Laccio emostatico (CAT) + Torniquete (CAT) + 止血帯 (CAT) + 지혈대 [CAT] + 止血带 (军用型) + 軍用止血帶 + + + Slows down blood loss when bleeding + Замедляет кровопотерю при кровотечении + Reduce la velocidad de pérdida de sangre + Ralentit l'hémorragie. + Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. Nie może być noszony zbyt długo ze względu na narastający ból z kończyny. + Verringert den Blutverlust + Lelassítja a vérvesztést vérzés esetén + Rallenta la perdita di sangue in caso di sanguinamento + Reduz a velocidade da perda de sangue + Zpomaluje ztráty krve při krvácení + 出血時に失血量を減らします。 + 출혈 시 혈액손실을 늦춰줍니다 + 减缓失血速度 + 減緩失血的速度 + + + A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. + Жгут используется для прижатия сосудов к костным выступам, которое приводит к остановке или значительному уменьшению кровотечения + Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre + Dispositif permettant de comprimer fortement les veines et artères, ce qui a pour effet de ralentir, voire d'arrêter la circulation sanguine.\nDiminue donc drastiquement les pertes de sang. + Opaska uciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym krwawieniem tętniczym lub żylnym. + Ein Hilfsmittel, das Druck auf Venen und Arterien ausübt und so den Blutfluss verringert. + Egy szűkítőeszköz, mely a vénás és artériás nyomás keringés helyi összenyomására szolgál, ezzel lelassítva vagy megállítva az adott területen a vérkeringést. Ez csökkenti a vérvesztés mértékét. + Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. + A aparelho que comprime as artérias e veias para diminuir a perda de sangue. + Zařízení používané ke stlačení venózního a arteriálního oběhu. V důsledku dochází ke zpomalení toku krve a tedy i snížení ztrát krve. + 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れを遅し失血を防ぎます。 + 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. + 用于压迫静脉与动脉的血液流动, 以达到减缓失血速度的目的 + 用於壓迫靜脈與動脈的血液流動, 達到減緩失血速度的目的 + + + Splint + Шина + 添え木 + Attelle + Tala + 固定板 + Gessatura + Dlaha + Szyna + Schiene + 夹板 + + + Stabilizes a fractured limb + Стабилизирует перелом конечности + 骨折部位を安定させます。 + Stabilise un membre fracturé. + Estabiliza um membro fraturado. + 固定骨折的部位 + Stabilizza un arto fratturato + Znehybňuje zlomenou končetinu + Stabilizuje złamaną kończynę + Stabilisiere einen Bruch + 用于固定骨折的肢体 + + + Morphine autoinjector + Morphium-Autoinjektor + Морфин в пневмошприце + Morfina auto-inyectable + Auto-injecteur de morphine + Autostrzykawka z morfiną + Auto-morfin + Morfium autoinjektor + Autoiniettore di morfina + Auto-injetor de morfina + モルヒネ注射器 + 모르핀 자동주사기 + 吗啡自动注射器 + 嗎啡自動注射器 + + + Used to combat moderate to severe pain experiences + Wird verwendet um moderate bis starke Schmerzen zu lindern. + Для снятия средних и сильных болевых ощущений + Usado para combatir los estados dolorosos de moderados a severos + Utilisé pour réduire les douleurs modérées à sévères. + Morfina. Ma silne działanie przeciwbólowe. Powoduje spowolnienie tętna oraz rozrzedzenie krwi, zwiększając tym samym ciśnienie tętnicze krwi. Działa przez ok. 15 minut. + Mérsékelttől erős fájdalomig, ellene alkalmazandó termék + Usato per combattere il dolore. + Usado para combater dores moderadas e severas + Slouží k tlumení středně těžkých a těžkých bolestí + 戦闘が収まった時に痛みに対して使います。 + 심한 통증을 완화하는데 쓰입니다 + 用于削减中度至重度疼痛 + 減低中度至重度的疼痛感 + + + An analgesic used to combat moderate to severe pain experiences. + Обезболивающее для снятия средних и сильных болевых ощущений. + Analgésico usado para combatir los estados dolorosos de moderados a severos. + Un analgésique puissant soulageant les douleurs modérées à sévères. + Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. + Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln + Egy fájdalomcsillapító anyag, jellemzően mérsékelt vagy erős fájdalom esetén alkalmazandó. + Un analgesico usato per combattere il dolore. + Um analgésico usado para combater dores moderadas e fortes. + Analgetikum slouží k tlumení středně těžkých a těžkých bolestí + 戦闘が収まった時にモルヒネを痛みに対して使います。 + 심한 통증을 완화하기 위해 쓰이는 진통제입니다. + 一种用于削减中度至重度疼痛的止痛药 + 止痛藥的一種, 用於減低中度至重度的疼痛感 + + + Adenosine autoinjector + Adenosin-Autoinjektor + Asenosina auto-inyectable + Autostrzykawka z adenozyną + Auto-injecteur d'adénosine + Autoiniettore di adenosina + Auto-adenosine + Auto-injetor de Adenosina + Аденозин в пневмошприце + アデノシン注射器 + 아데노신 자동주사기 + 腺苷自动注射器 + 腺苷自動注射器 + + + Used to counter effects of Epinephrine + Wird verwendet um die Symptome von Epiniphrin zu lindern + Utilizada para contrarrestar los effectos de la Epinefrina + Adenozyna. Stosowana do zwalczania efektów działania adrenaliny. + Utilisé pour contrer les effets de l'épinéphrine. + Usato per contrastare l'effetto dell'epinefrina + Slouží jako protiváha Adrenalinu + Usado para combater os efeitos da Epinefrina + Используется для купирования эффектов адреналина + アドレナリンの反対の効果として使います。 + 에피네프린 대응책으로 쓰입니다 + 用于中和肾上腺素的影响 + 用來對付腎上腺素的影響 + + + A drug used to counter the effects of Epinephrine + Ein Medikament, das die Symptome von Epiniphrin bekämpft. + Medicamento usado para contrarrestar los efectos de la Epinefrina. + Organiczny związek chemiczny z grupy nukleozydów. Skuteczna w leczeniu częstoskurczu komorowego. Działa rozszerzająco na naczynia krwionośne. + Un composé utilisé pour contrer les effets de l'épinéphrine. + Medicamento usato per contrastare l'effetto dell'epinefrina + Droga používaná k tlumení efektu Adrenalinu + Uma droga usada para combater os efeitos da Epinefrina + Препарат используется для купирования эффектов адреналина + 使うとアドレナリンと反対の効果が出ます。 + 에피네프린에 대응용으로 쓰이는 약품 + 一种用于中和肾上腺素效果的药物 + 一種藥物用於減低腎上腺素的效果 + + + Atropine autoinjector + Атропин в пневмошприце + Atropina auto-inyectable + Auto-injecteur d'atropine + Autostrzykawka AtroPen + Atropin-Autoinjektor + Auto-atropine + Atropin autoinjektor + Autoiniettore di atropina + Auto-injetor de Atropina + アトロピン注射器 + 아트로핀 자동주사기 + 阿托品自动注射器 + 阿托品自動注射器 + + + Used in NBC scenarios + Применяется для защиты от ОМП + Usado en escenarios NBQ + Utilisé en cas d'attaque CBRN. + Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. + Verwendet bei ABC-Kontamination + NBK helyzetek esetén használandó + Usato in situazioni con gas nervino. + Usado em casos de ataque QBRN + Používá se v přítomnosti nervových plynů + 核・生物・化学兵器による汚染環境下にて使います。 + 핵,생물,화학 상황에 쓰입니다 + 使用于核生化污染的情况 + 使用於核生化汙染的情況 + + + A drug used by the Military in NBC scenarios. + Препарат, используемый в войсках для защиты от оружия массового поражения. + Medicamento usado por militares en escenarios NBQ + Médicament utilisé par l'armée en cas d'attaque CBRN. + Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC. + Ein Medikament, das vom Militär bei ABC-Kontamination verwendet wird. + Egy instabil alkaloid, NBK helyzetek esetén a katonai szervezetek veszik használatba. + E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. + Uma droga usada por militares em casos de ataque QBRN. + Atropin slouží jako protijed na otravu organofosfátovými insekticidy (diazinon) a nervovými plyny. + 核・生物・化学兵器による汚染環境下にて使います。 + 핵,생물,화학 상황에 쓰이는 군용 약품 + 军用神经解毒针, 用来应付核生化污染的情况. + 軍用神經解毒針, 用來應付核生化汙染的情況. + + + Epinephrine autoinjector + Адреналин в пневмошприце + Epinefrina auto-inyectable + Auto-injecteur d'épinéphrine + Autostrzykawka EpiPen + Epiniphrin-Autoinjektor + Auto-adrenalin + Epinefrin autoinjektor + Autoiniettore di adrenalina + Auto-injetor de epinefrina + アドレナリン注射器 + 에피네프린 자동주사기 + 肾上腺素自动注射器 + 腎上腺素自動注射器 + + + Increase heart rate and counter effects given by allergic reactions + Стимулирует работу сердца и купирует аллергические реакции + Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas + Augmente la fréquence cadiaque et annule les effets d'une réaction anaphylactique. + Adrenalina. Przyśpiesza tętno oraz zwiększa ciśnienie krwi a także przeciwdziała efektom wywołanym przez reakcje alergiczne. + Steigert die Herzfrequenz und bekämpft Symptome von allergischen Reaktionen. + Növeli a szívverést és ellenzi az allergiás reakciók hatásait + Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. + Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas + Zvyšuje srdeční frekvenci a chrání před alergickými reakcemi + 心拍数を増加させたり、アレルギー反応を収める効果もあります。 + 심박수를 높이며 알러지반응의 대응책입니다 + 用于提升心率的一种药物 + 增加心跳速率的一種藥物 + + + A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. + Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшенной вероятностью благоприятного исхода. + Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos. + Médicament qui agit sur la réponse sympathique afin de dilater les bronches, augmenter le rythme cardiaque et contrer les effets provoqués par les réactions allergiques (anaphylaxie).\nUtilisé dans les scénarios d'arrêt cardiaque soudain, avec des résultats décroissants. + EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. + Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. + Ein Medikament, das die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen (Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. + Uma droga trabalha dilatando os bronquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas(anáfilaticas). Usado em casos de parada cardiaca com poucas changes de recuperação. + Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. + Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. + 気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります (アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにも使われます。 + 기관지를 확장시키는 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과에 대응합니다(아나필락시스). 심폐가 정지하는 경우 호전이 되지않을때 사용합니다. + 俗称强心针, 为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! + 俗稱強心針, 為一種支氣管擴張藥物, 會增加心跳速率並減緩過敏反應(過敏性休克), 在心跳驟停時有恢復心跳的效果! + + + Plasma IV (1000ml) + Плазма для в/в вливания (1000 мл) + Plasma IV (1000ml) + Plasma IV (1000 ml) + Osocze IV (1000ml) + Plasma IV (1000ml) + Vérplazma-infúzió (1000ml) + Plasma EV (1000ml) + Plasma IV (1000ml) + Krevní plazma (1000ml) + 血しょう IV (1000ml) + 혈장 IV (250ml) + 血浆 (1000毫升) + 血漿 (1000毫升) + + + A volume-expanding blood supplement. + Дополнительный препарат, применяемый при возмещении объема крови. + Suplemento para expandir el volumen sanguíneo. + Substitut sanguin visant à remplacer les volumes perdus. + Składnik krwi, używany do zwiększenia jej objętości. + Egy térfogatnövelő vérkiegészítmény. + Aiuta ad aumentare il volume sanguigno. + Volumenerweiterungsmittel (künstliches Blutvolumen) + Suplemento para expandir o volume sanguíneo. + Intravenózně podávaný doplněk k zvětšení objemu krve + 血液量を増加させる補助です。 + 혈액량을 늘리기위한 보조수단 입니다. + 可快速得到血液补充 + 可快速得到血液補充 + + + A volume-expanding blood supplement. + Дополнительный препарат, применяемый при возмещении объема крови. + Suplemento para expandir el volumen sanguíneo. + Substitut visant à remplacer le volume sanguin perdu. + Składnik krwi, używany do zwiększenia jej objętości. + Egy térfogatnövelő vérkiegészítmény. + Aiuta ad aumentare il volume sanguigno. + Volumenerweiterungsmittel (künstliches Blutvolumen) + Suplemento para expandir o volume sanguíneo. + Intravenózně podávaný doplněk k zvětšení objemu krve + 血液量を増加させる補助です。 + 혈액량을 늘리기위한 보조수단 입니다. + 可快速得到血液补充 + 可快速得到血液補充 + + + Plasma IV (500ml) + Плазма для в/в вливания (500 мл) + Plasma IV (500ml) + Plasma IV (500 ml) + Osocze IV (500ml) + Plasma IV (500ml) + Vérplazma-infúzió (500ml) + Plasma EV (500ml) + Plasma IV (500ml) + Krevní plazma (500ml) + 血しょう IV (500ml) + 혈장 IV (500ml) + 血浆 (500毫升) + 點滴 (血漿 500毫升) + + + Plasma IV (250ml) + Плазма для в/в вливания (250 мл) + Plasma IV (250ml) + Plasma IV (250 ml) + Osocze IV (250ml) + Plasma IV (250ml) + Vérplazma-infúzió (250ml) + Plasma EV (250ml) + Plasma IV (250ml) + Krevní plazma (250ml) + 血しょう IV (250ml) + 혈장 IV (250ml) + 血浆 (250毫升) + 點滴 (血漿 250毫升) + + + Blood IV (1000ml) + Кровь для переливания (1000 мл) + Sangre IV (1000ml) + Culot sanguin IV (1000 ml) + Krew IV (1000ml) + Blut IV (1000ml) + Vér-infúzió (1000ml) + Sangue EV (1000ml) + Sangue IV (1000ml) + Krevní transfúze (1000ml) + 血液 IV (1000ml) + 혈액 IV (1000ml) + 血液 (1000毫升) + 點滴 (血液 1000毫升) + Kan IV (1000ml) + + + Blood IV, for restoring a patients blood + Пакет крови для возмещения объёма потерянной крови + Sangre intravenosa, para restarurar el volumen sanguíneo + Culot sanguin pour transfustion IV, restaure le sang d'un patient. + Krew IV, używana do uzupełnienia krwi u pacjenta. + Vér-infúzió, intravénás bejuttatásra egy páciensnek + Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue + Blut IV, um den Bluthaushalt des Patienten wiederherzustellen. + Sangue intravenoso, para restaurar o volume sanguinio do paciente. + Krevní transfuze pro doplnění pacientovi krve + 血液 IV は、患者へ血液を補給します。 + 혈액 IV, 환자에게 혈액을 공급합니다. + 血液, 用于补充伤者流失的血液 + 血液, 用於補充傷者流失的血液 + + + O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. + Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. + Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. + Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. + Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. + Culot sanguin O-, utilisé en cas de perte de sang importante, afin de rétablir un volume normal.\nAdministré normalement lors d'un MEDEVAC. + O Negative Blutinfusion wird nur in seltenen Fällen verwendet, um den Bluthaushalt des Patienten zu ergänzen. Wird in der Regel wärend der Transportphase durchgeführt. + Sangue O- , utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento. + Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben. + 0 Rh negativní krev se používá v vzácných případech k doplnění pacientovy hladiny krve, obvykle při převozu zraněné osoby do nemocnice. + O 型への輸血はまれで厳格であり、通常は治療のための輸送段階で輸血をおこないます。 + O- 형 혈액 투여는 매우 엄격하고 드문 혈액보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. + O型负值注射用血液, 在紧急情况时使用, 用于补充伤者流失的血液 + O型陰性注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液 + + + Blood IV (500ml) + Кровь для переливания (500 мл) + Sangre IV (500ml) + Culot sanguin IV (500 ml) + Krew IV (500ml) + Blut IV (500ml) + Vér-infúzió (500ml) + Sangue EV (500ml) + Sangue IV (500ml) + Krevní transfúze (500ml) + 血液 IV (500ml) + 혈액 IV (500ml) + 血液 (500毫升) + 點滴 (血液 500毫升) + Kan IV (500ml) + + + Blood IV (250ml) + Кровь для переливания (250 мл) + Sangre IV (250ml) + Culot sanguin IV (250 ml) + Krew IV (250ml) + Blut IV (250ml) + Vér-infúzió (250ml) + Sangue EV (250ml) + Sangue IV (250ml) + Krevní transfúze (250ml) + 血液 IV (250ml) + 혈액 IV (250ml) + 血液 (250毫升) + 點滴 (血液 250毫升) + Kan IV (250ml) + + + Saline IV (1000ml) + Физраствор для в/в вливания (1000 мл) + Salino IV (1000ml) + Solution saline IV (1000 ml) + Sól fizjologiczna IV (1000ml) + Kochsalzlösung (1000ml) + 0,9%-os sósvíz-infúzió (1000ml) + Soluzione salina EV (1˙000ml) + Soro IV (1000ml) + Fyziologický roztok (1000ml) + 生理食塩水 IV (1000ml) + 생리식염수 IV (1000ml) + 生理盐水 (1000毫升) + 點滴 (食鹽水 1000毫升) + Serum IV (1000ml) + + + Saline IV, for restoring a patients blood + Пакет физраствора для возмещения объёма потерянной крови + Solución salina intravenosa, para restaurar el volumen sanguíneo + Solution saline, pour rétablir en urgence le volume sanguin. + Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). + 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására + Soluzione salina, usata per ripristinare sangue nei pazienti. + Kochsalzlösung, ein medizinisches Volumenersatzmittel + Solução Salina Intravenosa 0.9%, para restaurar o volume de sangue temporariamente. + Fyziologický roztok se aplikuje intravenózně a slouží k obnově pacientovi krve + 生理食塩水 IV は、患者の血液量を補助します + 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 + 生理盐水, 用于恢复伤者血液 + 生理食鹽水, 用於恢復傷者血液 + + + A medical volume-replenishing agent introduced into the blood system through an IV infusion. + Пакет физиологического раствора для возмещения объёма потерянной крови путем внутривенного вливания + Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. + Un agent médical permettant de reconstituer le volume sanguin.\nÀ administrer par perfusion intraveineuse. + Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). + Egy orvosi térfogat-helyreállító készítmény, melyet intravénás módon lehet a szervezetbe juttatni. + Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione EV. + Ein medizinisches Volumenersatzmittel, dass durch einen intravenösen Zugang in den Blutkreislauf verabreicht wird. + Uma reposição temporaria para restaurar a pressão arterial perdida por perda de sangue. + Fyziologický roztok se využívá nejčastěji jako infuze při dehydrataci organismu. + 生理食塩水 IV を静脈へ投与し、血液量を増加させることができます。 + 혈류에 IV로 투여되는 의료 용적 대체 요법 + 利用静脉注射进入人体血液系统, 帮助伤者血液恢复 + 利用靜脈注射進入人體血液系統, 幫助傷者血液恢復 + + + Saline IV (500ml) + Физраствор для в/в вливания (500 мл) + Salino IV (500ml) + Solution saline IV (500 ml) + Sól fizjologiczna IV (500ml) + Kochsalzlösung (500ml) + 0,9%-os sósvíz-infúzió (500ml) + Soluzione salina EV (500ml) + Soro IV (1000ml) + Fyziologický roztok (500ml) + 生理食塩水 IV (500ml) + 생리식염수 IV (500ml) + 生理盐水 (500毫升) + 點滴 (食鹽水 500毫升) + Serum IV (500ml) + + + Saline IV (250ml) + Физраствор для в/в вливания (250 мл) + Salino IV (250ml) + Solution saline IV (250 ml) + Sól fizjologiczna IV (250ml) + Kochsalzlösung (250ml) + 0,9%-os sósvíz-infúzió (250ml) + Soluzione salina EV (250ml) + Soro IV (1000ml) + Fyziologický roztok (250ml) + 生理食塩水 IV (250ml) + 생리식염수 IV (250ml) + 生理盐水 (250毫升) + 點滴 (食鹽水 250毫升) + Serum IV (250ml) + + + Bandage (QuikClot) + Первичный перевязочный пакет (QuikClot) + Vendaje básico (QuickClot) + Pansement hémostatique (Quikclot) + Opatrunek QuikClot ACS + Bandage (QuikClot) + Általános zárókötszer (QuikClot) + Bendaggio emostatico (QuikClot) + Bandagem básica (Coagulante) + Hemostatický obvaz (QuikClot) + 緊急圧迫止血包帯 (クイッククロット) + 필드 드레싱 (퀵 클롯) + 绷带 (止血型) + 繃帶 (止血粉) + + + QuikClot bandage + Гемостатический пакет QuikClot + Vendaje QuikClot + Bande de gaze hémostatique + Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. + Bandage mit Gerinnungsmittel + QuikClot kötszer + Bendaggio emostatico (QuikClot) + Bandagem com agente coagulante + Hemostatický obvaz (QuikClot) + クイッククロット + 퀵 클롯 붕대 + 止血粉绷带 + 止血粉繃帶 + + + Hemostatic bandage with coagulant that stops bleeding. + Медицинский коагулянт для экстренной остановки кровотечения + Bande de gaze hémostatique, impreignée d'un agent coagulant, afin de maitriser et stopper rapidement une hémorragie. + Proszkowy opatrunek adsorpcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. + Vendaje hemostático con coagulante que detiene el sangrado. + Verband mit Gerinnungsmittel, um starke Blutung zu behandeln. + Hemostatikus kötszer egy vérzésgátló anyaggal. + Bendaggio emostatico con coagulante che permette di arrestare perdite di sangue + Bandagem Hemostática com coagulante que controla hemorragia médias e grandes com risco de vida. + Hemostatický obvaz určený k zástavě krvácení + 血液凝固剤を含む包帯により、止血できます。 + 지혈시 사용하는 붕대로 혈액 응고제를 포함하고있습니다. + 包含止血粉成分的止血绷带, 可用于止血 + 包含止血粉成分的止血繃帶, 可用於止血 + + + Personal Aid Kit + Аптечка + Trousse sanitaire + Equipo de primeros auxilios + Apteczka osobista + Persönliches Erste-Hilfe-Set + Elsősegélycsomag + Pronto soccorso personale + Kit De Primeiros Socorros Pessoal + Osobní lékárnička (PAK) + 応急処置キット + 개인응급키트 + 个人急救包 + 個人急救包 + + + Includes various treatment kit needed for stitching or advanced treatment + Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. + Incluye material médico para tratamientos avanzados + Contient tout le matériel médical requis pour la suture ou les traitements avancés. + Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego. + Beinhaltet medizinisches Material für fortgeschrittene Behandlung und zum Nähen. + Változatos segédfelszereléseket tartalmaz sebvarráshoz és haladó elsősegélynyújtáshoz + Include vario materiale medico per trattamenti avanzati. + Inclui vários tratamentos materiais para custura e tratamento avançado + Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných + 縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 + 봉합및 고급 조치에 필요한 다양한 치료 도구가 있습니다. + 包含各种医疗套件, 以及进阶伤口系统需要的缝合用品 + 包含各種醫療套件, 以及進階傷口系統需要的縫合用品 + + + Personal Aid Kit for in field stitching or advanced treatment + W znacznym stopniu poprawia stan pacjenta + Полевая аптчека для продвинутого лечения и зашивания ран + Persönliches Erste-Hilfe-Set zum ambulanten Nähen und fortgeschrittener Behandlung. + A utiliser pour les sutures sur le terrain, ou pour les traitements avancés. + Equipo de primeros auxilios para sutura de campaña o tratamientos avanzados + Elsősegélycsomag, terepen való sebvarráshoz és haladó ellátáshoz + Kit de primeiros socorros para sutura ou tratamentos avançados + Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných v poli + Pronto soccorso personale da campo per mettersi i punti o per trattamenti avanzati. + 戦場で縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 + 야전에서 봉합및 고급 조치를 위한 개인응급키트 + 个人急救包可用于战地缝合手术或进阶伤口系统使用 + 個人急救包可用於戰地縫合手術或進階醫療用 + + + Use Personal Aid Kit + Erste-Hilfe-Set benutzen + Использовать аптечку + Utiliser la trousse sanitaire + Użyj apteczki osobistej + Usar equipo de primeros auxilios + Elsősegélycsomag használata + Usar o kit de primeiros socorros + Použít osobní lékárničku (PAK) + Usa il pronto soccorso personale + 応急処置キットを使う + 개인 응급 키트사용하기 + 使用个人急救包 + 使用個人急救包 + + + Surgical Kit + Trousse chirurgicale + Хирургический набор + Kit quirúrgico + Zestaw do szycia ran + Operationsset + Sebészeti készlet + Kit chirurgico + Kit Cirurgico + Chirurgická sada + 縫合キット + 봉합 키트 + 手术包 + 手術包 + + + Surgical Kit for in field advanced medical treatment + Trousse chirurgicale pour le traitement avancé sur le terrain. + Набор для хирургической помощи в полевых условиях + Kit quirúrgico para el tratamiento avanzado en el campo de batalla + Zestaw pozwalający na zszywanie ran w polu + Operationsset für fortgeschrittene medizinische Feldversorgung + Sebészeti készlet komplex orvosi feladatok terepen való ellátására + Kit chirurgico per trattamenti avanzati sul campo. + Kit Cirurgico para uso de tratamento médico avançado em campo + Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli + 縫合キットは戦場で高度な処置をする為に使われます。 + 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用於在戰場上為傷口進行縫合 + + + Surgical Kit for in field advanced medical treatment + Набор для хирургической помощи в полевых условиях + Kit quirúrgico para el tratamiento avanzado en el campo de batalla + Zestaw pozwalający na zszywanie ran w polu + Operationsset für fortgeschrittene medizinische Feldversorgung + Trousse chirurgicale pour le traitement avancé sur le terrain. + Sebészeti készlet komplex orvosi feladatok terepen való ellátására + Kit chirurgico per trattamenti avanzati sul campo. + Kit Cirurgico para uso de tratamento médico avançado em campo. + Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli + 縫合キットは戦場で高度な処置をする為に使われます。 + 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用於在戰場上為傷口進行縫合 + + + Use Surgical Kit + Operationsset benutzen + Usa kit chirurgico + Использовать хирургический набор + Utiliser la trousse chirugicale + Zszyj rany + Usar equipo quirúrgico + Sebészeti készlet használata + Použít chirurgickou sadu + Usar kit cirúrgico + 縫合キットを使う + 봉합키트 사용하기 + 使用手术包 + 使用手術包 + + + Bodybag + Housse mortuaire + Мешок для трупов + Bolsa para cadáveres + Worek na zwłoki + Leichensack + Hullazsák + Sacca per corpi + Saco para cadáver + Pytel na mrtvoly + 死体袋 + 시체 가방 + 尸袋 + 屍袋 + + + A bodybag for dead bodies + Housse de transport des corps + Мешок для упаковки трупов + Una bolsa para cadáveres + Worek do pakowania zwłok + Ein Leichensack für Tote + Egy hullazsák a holttestek számára + Una sacca nera per trasportare cadaveri. + Um saco para corpos mortos + Pytel na mrtvoly + 死体袋は死体を入れる為に使います。 + 시체를 운반할때 쓰는 가방입니다 + 用于装尸体 + 用來裝屍體用 + + + A bodybag for dead bodies + Housse de transport des corps + Мешок для упаковки трупов + Una bolsa para cadáveres + Worek do pakowania zwłok + Ein Leichensack für Tote + Egy hullazsák a holttestek számára + Una sacca nera per trasportare cadaveri. + Um saco para corpos mortos. + Pytel na mrtvoly + 死体袋は死体を入れる為に使います。 + 시체를 운반할때 쓰는 가방입니다 + 用于装尸体 + 用來裝屍體用 + + + No injuries on this bodypart... + Körperteil nicht verletzt... + Non ci sono ferite in questa parte del corpo... + Данная часть тела не повреждена... + Aucune blessure sur cette partie du corps... + Brak obrażeń na tej części ciała... + Sin heridas en esta parte del cuerpo... + Ezen a testrészen nincs sérülés... + Žádné zranění na této části těla... + Nenhum ferimento nesta parte do corpo... + この部分に怪我をしていません・・・ + 이 부위에는 부상이 없습니다... + 该部位没有受伤 + 此身體部位沒有受傷 + + + Inject Adenosine + Adenosin injizieren + Inyectar Adenosina + Wstrzyknij adenozynę + Adénosine + Inietta andenosina + Aplikovat adenosine + Injetar Adenosina + Ввести аденозин + アデノシンを投与 + 아데노신 주사 + 注射腺苷 + 注射腺苷 + + + Inject Atropine + Atropin injizieren + Inyectar Atropina + Aplikovat atropin + Wstrzyknij atropinę + Atropine + Ввести атропин + Atropin beadása + Inietta atropina + Injetar Atropina + アトロピンを投与 + 아트로핀 주사 + 注射阿托品 + 注射阿托品 + + + Inject Epinephrine + Epinephrine injizieren + Inyectar Epinefrina + Wstrzyknij adrenalinę + Aplikovat adrenalin + Épinéphrine + Ввести адреналин + Epinefrin beadása + Injetar Epinefrina + Inietta adrenalina + アドレナリンを投与 + 에피네프린 주사 + 注射肾上腺素 + 注射腎上腺素 + + + Inject Morphine + Morphin injizieren + Inyectar Morfina + Wstrzyknij morfinę + Aplikovat morfin + Ввести морфин + Morphine + Morfium beadása + Injetar Morfina + Inietta morfina + モルヒネを投与 + 모르핀 주사 + 注射吗啡 + 注射嗎啡 + + + Transfuse Blood + Bluttransfusion + Transfundir sangre + Przetocz krew + Transfúze krve + Перелить кровь + Transfuser (sang) + Infúzió (vér) + Transfundir Sangue + Trasfusione di sangue + 輸血する + 혈액 수혈 + 输入血液 + 輸血液 + + + Transfuse Plasma + Plasmatransfusion + Transfundir plasma + Transfúze plazmy + Przetocz osocze + Transfuser (plasma) + Перелить плазму + Infúzió (vérplazma) + Trasfusione di plasma + Transfundir Plasma + 血しょうを投与 + 혈장 수혈 + 输入血浆 + 輸血漿 + + + Transfuse Saline + Salzlösungstransfusion + Transfundir salino + Transfúze fyziologického roztoku + Przetocz sól fizjologiczną + Transfuser (saline) + Перелить физраствор + Infúzió (sós víz) + Trasfusione di soluzione salina + Transfundir Soro + 生理食塩水を投与 + 생리식염수 수혈 + 输入生理盐水 + 注射生理食鹽水 + + + Apply Tourniquet + Tourniquet anwenden + Aplicar torniquete + Aplikovat škrtidlo + Załóż stazę + Poser un garrot + Наложить жгут + Applica laccio emostatico + Aplicar Torniquete + Érszorító alkalmazása + 止血帯を巻く + 지혈대 적용 + 使用止血带 + 使用軍用止血帶 + + + Bandage + Verbinden + Venda + Bandażuj + Obvázat + Panser + Benda + Kötözés + Atadura + Перевязать + 包帯 + 붕대 + 包扎 + 繃帶 + + + Bandage Head + Kopf verbinden + Vendar la cabeza + Bandażuj głowę + Obvázat hlavu + Перевязать голову + Panser Tête + Fej kötözése + Atar Cabeça + Benda la testa + 包帯を頭へ + 머리에 붕대감기 + 包扎头部 + 繃帶包紮 頭部 + + + Bandage Torso + Torso verbinden + Vendar el torso + Bandażuj tors + Obvázat hruď + Перевязать торс + Panser Torse + Testtörzs kötözése + Atar Tronco + Benda il torso + 包帯を胴体へ + 몸통에 붕대감기 + 包扎躯干 + 繃帶包紮 身體 + + + Bandage Left Arm + Linken Arm verbinden + Vendar el brazo izquierdo + Bandażuj lewe ramię + Obvázat levou ruku + Перевязать левую руку + Panser Bras Gauche + Bal kar kötözése + Atar Braço Esquerdo + Benda il braccio sinistro + 包帯を左腕に + 왼팔에 붕대감기 + 包扎左臂 + 繃帶包紮 左手 + + + Bandage Right Arm + Rechten Arm verbinden + Vendar el brazo derecho + Bandażuj prawe ramię + Obvázat pravou ruku + Перевязать правую руку + Panser Bras Droit + Jobb kar kötözése + Atar Braço Direito + Benda il braccio destro + 包帯を右腕に + 오른팔에 붕대감기 + 包扎右臂 + 繃帶包紮 右手 + + + Bandage Left Leg + Linkes Bein verbinden + Vendar la pierna izquierda + Bandażuj lewą nogę + Obvázat levou nohu + Перевязать левую ногу + Panser Jambe Gauche + Bal láb kötözése + Atar Perna Esquerda + Benda la gamba sinistra + 包帯を左足へ + 왼쪽 다리에 붕대감기 + 包扎左腿 + 繃帶包紮 左腳 + + + Bandage Right Leg + Rechtes Bein verbinden + Vendar la pierna derecha + Bandażuj prawą nogę + Obvázat pravou nohu + Перевязать правую ногу + Panser Jambe Droite + Jobb láb kötözése + Atar Perna Direita + Benda la gamba destra + 包帯を右足へ + 오른쪽 다리에 붕대감기 + 包扎右腿 + 繃帶包紮 右腳 + + + Injecting Morphine... + Morphin injizieren... + Inyectando Morfina... + Wstrzykiwanie morfiny... + Aplikuji morfin... + Введение морфина... + Injection (morphine)... + Morfium beadása... + Injetando Morfina... + Inietto la morfina... + モルヒネを投与しています・・・ + 모르핀 주사중... + 正在注射吗啡... + 嗎啡注射中... + + + Injecting Epinephrine... + Epinephrin injizieren... + Inyectando Epinefrina... + Wstrzykiwanie adrenaliny... + Aplikuji adrenalin... + Введение адреналина... + Injection (épinéphrine)... + Epinefrin beadása... + Injetando Epinefrina... + Inietto l'adrenalina... + アドレナリンを投与しています・・・ + 에피네프린 주사중... + 正在注射肾上腺素... + 腎上腺素注射中... + + + Injecting Adenosine... + Adenosin injizieren... + Inyectando Adenosina... + Wstrzykiwanie adenozyny... + Injection (adénosine)... + Inietto l'andenosina + Aplikuji adenosine... + Injetando Adenosina... + Введение аденозина... + アドネシンを投与しています・・・ + 아데노신 주사중... + 正在注射腺苷... + 腺苷注射中... + + + Injecting Atropine... + Atropin injizieren... + Inyectando Atropina... + Aplikuji atropin... + Wstrzykiwanie atropiny... + Injection (atropine)... + Введение атропина... + Atropin beadása... + Inietto l'atropina... + Injetando Atropina + アトロピンを投与しています・・・ + 아트리핀 주사중... + 阿托品注射中 ... + 阿托品注射中 ... + + + Transfusing Blood... + Bluttransfusion... + Transfusión de sangre... + Przetaczanie krwi... + Probíhá transfúze krve... + Переливание крови... + Transfusion (sang)... + Infúzió vérrel... + Transfundindo Sangue... + Effettuo la trasfusione di sangue... + 輸血しています・・・ + 혈액 수혈중... + 正在输入血液... + 輸血液中 ... + + + Transfusing Saline... + Salzlösungtransfusion... + Transfusión de salino... + Probíha transfúze fyziologického roztoku... + Przetaczanie soli fizjologicznej... + Transfusion (solution saline)... + Переливание физраствора... + Infúzió sós vizzel... + Effettuo la rasfusione di soluzione salina + Transfundindo Soro... + 生理食塩水を投与しています・・・ + 생리식염수 수혈중... + 正在输入生理盐水... + 施打生理食鹽水中 ... + + + Transfusing Plasma... + Plasmatransfusion... + Transfusión de plasma... + Probíha transfúze plazmy... + Przetaczanie osocza... + Transfusion (plasma)... + Переливание плазмы... + Infúzió vérplazmával... + Effettu la trasfusione di plasma... + Transfundindo Plasma... + 血しょうを投与しています・・・ + 혈장 수혈중... + 正在输入血浆... + 輸血漿中 ... + + + Bandaging... + Verbinden... + Vendando... + Bandażowanie... + Obvazuji... + Pansement... + Sto bendando... + Bekötözés... + Atando... + Перевязывание... + 包帯を巻いています・・・ + 붕대감는중... + 包扎中... + 繃帶包紮中 ... + + + Applying Tourniquet... + Setze Tourniquet an... + Aplicando torniquete... + Aplikuji škrtidlo... + Zakładanie stazy... + Pose du garrot... + Наложение жгута... + Érszorító felhelyezése... + Sto applicando il laccio emostatico... + Applicando Torniquete + 止血帯を巻いています・・・ + 지혈대 적용중... + 正在使用止血带... + 使用軍用止血帶中 ... + + + Field Dressing + Wundverband + Compresa de campaña + Бинтовая повязка + Obinadlo + Bandaż jałowy + Pansement individuel + Zárókötszer + Bendaggio rapido + Curativo de Campo + 緊急圧迫包帯 + 필드 드레싱 + 基础绷带 + 基礎繃帶 + + + Packing Bandage + Mullbinde + Vendaje compresivo + Компресионный пакет + Bandaż uciskowy + Nyomókötszer + Bendaggio compressivo + Bandage compressif + Bandagem de Compressão + Obvaz Tlakový + 弾性包帯 + 거즈 붕대 + 包扎绷带 + 包紮繃帶 + + + Elastic Bandage + Elastischer Verband + Vendaje elástico + Давящая повязка + Obavaz Elastický + Bandaż elastyczny + Bandage extensible + Rögzitő kötszer + Bendaggio elastico + Bandagem Elástica + 伸縮包帯 + 압박 붕대 + 弹性绷带 + 彈性繃帶 + + + QuikClot + QuikClot + QuikClot + QuikClot + Opatrunek QuikClot + QuikClot + Bandage hémostatique + QuikClot + QuikClot (polvere emostatica) + QuikClot + クイッククロット + 퀵 클롯 + 止血粉 + 止血粉 + + + Check Pulse + Puls überprüfen + Comprobar pulso + Проверить пульс + Zkontrolovat puls + Sprawdź tętno + Prendre le pouls + Pulzus ellenőrzése + Controlla il polso + Checar Pulso + 心拍数を計る + 맥박 확인 + 检查脉搏 + 檢查脈搏 + + + Check Blood Pressure + Blutdruck überprüfen + Comprobar presión arterial + Проверить давление + Zkontrolovat krevní tlak + Sprawdź ciśnienie krwi + Prendre la tension + Vérnyomás megmérése + Controlla pressionsa sanguigna + Chegar Pressão Sanguínea + 血圧を計る + 혈압 확인 + 检查血压 + 檢查血壓 + + + No entries on this triage card. + Keine Einträge auf der Triagekarte + Nessuna voce sulla Triage Card + Нет записей. + Fiche vide + Brak wpisów w tej karcie segregacyjnej. + Sin entradas en esta tarjeta de clasificación. + Ez az orvosi lap nem tartalmaz bejegyzést. + Žádné záznamy na tomto štítku + Nenhuma entrada neste cartão de triagem + トリアージ カードには何も無い。 + 부상자 분류 카드에 쓰여있는것이 없습니다. + 此分诊卡上没有信息。 + 此檢傷分類卡上沒有任何資料 + + + Tourniquet + Tourniquet + Torniquete + Жгут + Škrtidlo + Staza + Garrot + Érszorító + Laccio emostatico + Torniquete + 止血帯 + 지혈대 + 止血带 + 軍用止血帶 + + + Remove Tourniquet + Tourniquet entfernen + Quitar torniquete + Снять жгут + Sundat škrtidlo + Zdejmij stazę + Enlever le garrot + Érszorító leszedése + Rimuovi laccio emostatico + Remover Torniquete + 止血帯を外す + 지혈대 제거 + 移除止血带 + 移除軍用止血帶 + + + Apply Splint + Наложить Шину + 添え木を当てる + Poser une attelle + Aplicar Tala + 套上固定板 + Applica gessatura + Aplikovat dlahu + Załóż szynę + Aplicar férula + Schiene anlegen + 安装夹板 + + + Applying Splint... + Накладывается Шина... + 添え木を当てています・・・ + Application de l'attelle... + Aplicando Tala... + 套用固定板中... + Applicazione gessatura + Aplikuji dlahu... + Zakładanie szyny + Aplicando férula... + Lege Schiene an ... + 正在安装夹板... + + + Diagnose + Diagnose + Diagnosi + Диагностика + Diagnostiquer + Diagnoza + Diagnosticar + Diagnosztizálás + Diagnóza + Diagnosticar + 診断する + 진단 + 诊断 + 診斷 + + + Diagnosing... + Diagnostizieren... + Diagnosi in corso... + Диагностика... + Diagnostic en cours... + Diagnozowanie... + Diagnosticando... + Diagnózis folyamatban... + Diagnostika... + Diagnosticando... + 診断しています・・・ + 진단중... + 诊断中... + 診斷中... + + + CPR + HLW + RCP + Сердечно-лёгочная реанимация + RCP + RKO + RCP + Újraélesztés + CPR + SBV + 心肺蘇生 + 심폐소생술 + 心肺复苏(CPR) + 心肺復甦術 + + + Performing CPR... + HLW durchführen... + Eseguendo RCP... + Сердечно-лёгочная реанимация... + RCP en cours... + Przeprowadzanie RKO... + Realizando RCP... + Újraélesztés folyamatban... + Provádím CPR... + Realizando o SBV... + 心肺蘇生をしています・・・ + 심폐소생중... + 正在进行心肺复苏... + 進行心肺復甦術中... + + + Give Blood IV (1000ml) + Bluttransfusion IV (1000ml) + Dar Sangre IV (1000ml) + Перелить пакет крови (1000 мл) + Podaj krew IV (1000ml) + Sang en IV (1000 ml) + Podat krev. transfúzi (1000ml) + Vér adása intravénásan (1000ml) + Effettua trasfusione sangue EV (1˙000ml) + Administrar Sangue IV (1000ml) + 血液 IV (1000ml) を投与 + IV 혈액 수혈 (1000ml) + 静脉输血 (1000毫升) + 輸血液 (1000毫升) + + + Give Blood IV (500ml) + Bluttransfusion IV (500ml) + Dar Sangre IV (500ml) + Перелить пакет крови (500 мл) + Podaj krew IV (500ml) + Sang en IV (500 ml) + Podat krev. transfúzi (500ml) + Vér adása intravénásan (500ml) + Effettua trasfusione sangue EV (500ml) + Administrar Sangue IV (500ml) + 血液 IV (500ml) を投与 + IV 혈액 수혈 (500ml) + 静脉输血 (500毫升) + 輸血液 (500毫升) + + + Give Blood IV (250ml) + Bluttransfusion IV (250ml) + Dar Sangre IV (250ml) + Перелить пакет крови (250 мл) + Podaj krew IV (250ml) + Sang en IV (250 ml) + Podat krev. transfúzi (250ml) + Vér adása intravénásan (250ml) + Effettua trasfusione sangue EV (250ml) + Administrar Sangue IV (250ml) + 血液 IV (250ml) を投与 + IV 혈액 수혈 (250ml) + 静脉输血 (250毫升) + 輸血液 (250毫升) + + + Give Plasma IV (1000ml) + Plasmatransfusion IV (1000ml) + Dar Plasma IV (1000ml) + Перелить пакет плазмы (1000 мл) + Podaj osocze IV (1000ml) + Plasma en IV (1000 ml) + Podat plazmu (1000ml) + Vérplazma adása intravénásan (1000ml) + Effettua trasfusione plasma EV (1˙000ml) + Administrar Plasma IV (1000ml) + 血しょう IV (1000ml) を投与 + IV 혈장 수혈 (1000ml) + 静脉注射血浆 (1000毫升) + 輸血漿 (1000毫升) + + + Give Plasma IV (500ml) + Plasmatransfusion IV (500ml) + Dar Plasma IV (500ml) + Перелить пакет плазмы (500 мл) + Podaj osocze IV (500ml) + Plasma en IV (500 ml) + Podat plazmu (500ml) + Vérplazma adása intravénásan (500ml) + Effettua trasfusione plasma EV (500ml) + Administrar Plasma IV (500ml) + 血しょう IV (500ml) を投与 + IV 혈장 수혈 (500ml) + 静脉注射血浆 (500毫升) + 輸血漿 (500毫升) + + + Give Plasma IV (250ml) + Plasmatransfusion IV (250ml) + Dar Plasma IV (250ml) + Перелить пакет плазмы (250 мл) + Podaj osocze IV (250ml) + Plasma en IV (250 ml) + Podat plazmu (250ml) + Vérplazma adása intravénásan (250ml) + Effettua trasfusione plasma EV (250ml) + Administrar Plasma IV (250ml) + 血しょう IV (250ml) を投与 + IV 혈장 수혈 (250ml) + 静脉注射血浆 (250毫升) + 輸血漿 (250毫升) + + + Give Saline IV (1000ml) + Kochsalzlösung IV (1000ml) + Dar Salino IV (1000ml) + Перелить пакет физраствора (1000 мл) + Podaj sól fizjologiczną IV (1000ml) + Solution saline en IV (1000 ml) + Podaz fyz. roztok (1000ml) + Sós víz adása intravénásan (1000ml) + Effettua trasfusione salina EV (1˙000ml) + Administrar Soro IV (1000ml) + 生理食塩水 IV (1000ml) を投与 + IV 생리식염수 수혈 (1000ml) + 静脉注射生理盐水 (1000毫升) + 注射生理食鹽水 (1000毫升) + + + Give Saline IV (500ml) + Kochsalzlösung IV (500ml) + Dar Salino IV (500ml) + Перелить пакет физраствора (500 мл) + Podaj sól fizjologiczną IV (500ml) + Solution saline en IV (500 ml) + Podaz fyz. roztok (500ml) + Sós víz adása intravénásan (500ml) + Effettua trasfusione salina EV (500ml) + Administrar Soro IV (500ml) + 生理食塩水 IV (500ml) を投与 + IV 생리식염수 수혈 (500ml) + 静脉注射生理盐水 (500毫升) + 注射生理食鹽水 (500毫升) + + + Give Saline IV (250ml) + Kochsalzlösung IV (250ml) + Dar Salino IV (250ml) + Перелить пакет физраствора (250 мл) + Podaj sól fizjologiczną IV (250ml) + Solution saline en IV (250 ml) + Podaz fyz. roztok (250ml) + Sós víz adása intravénásan (250ml) + Effettua trasfusione salina EV (250ml) + Administrar Soro IV (250ml) + 生理食塩水 IV (250ml) を投与 + IV 생리식염수 수혈 (250ml) + 静脉注射生理盐水 (250毫升) + 注射生理食鹽水 (250毫升) + + + Minimal + Minimal + 軽処置群 + Минимально + Aucune urgence + Mínimo + 輕微 + Minimo + Minimální + Minimalny + Mínimo + 轻微 + + + Delayed + Retrasado + Срочная помощь + Pomoc Odroczona + Peut attendre + Verzögert + Odložitelný + Késleltetett + Differito + Atrasado + 待機的治療群 + 늦어짐 + 延后 + 延後 + + + Immediate + Inmediato + Неотложная помощь + Pomoc Natychmiastowa + Urgent + Sofort + Okamžitý + Azonnali + Immediata + Imediato + 再優先治療群 + 긴급 + 紧急 + 緊急 + + + Deceased + Fallecido + Труп + Denat + Décédé + Verstorben + Mrtvý + Elhalálozott + Deceduto + Falecido + 死亡群 + 사망 + 死亡 + 死亡 + + + None + Ninguno + Отсутствует + Brak klasyfikacji + Pas de fiche + Keine + Nic + Semmi + Nessuna + Nenhum + なし + 없음 + 未分类 + 未分類 + + + Normal breathing + Дыхание в норме + Respiración normal + Respiration normale + Normalny oddech + Normale Atmung + Dýchá normálně + Normális légzés + Respiro normale + Respiração normal + 通常の呼吸 + 정상 호흡 + 呼吸正常 + 呼吸正常 + + + No breathing + Keine Atmung + Дыхание отсутствует + No respira + Pas de respiration + Brak oddechu + Nedýchá + Nincs légzés + Mancanza di respiro + Não respira + 息をしていない + 호흡 불가 + 没有呼吸 + 沒有呼吸 + + + Difficult breathing + Дыхание затруднено + Dificultad para respirar + Respiratoire difficile + Trudności z oddychaniem + Schwere Atmung + Dýchá s obtížemi + Nehéz légzés + Difficoltà a respirare + Dificuldade para respirar + 呼吸が苦しそうだ + 호흡 곤란 + 呼吸困难 + 呼吸困難 + + + Almost no breathing + Beinahe keine Atmung + Дыхание очень слабое + Casi sin respiración + Respiration très faible + Prawie brak oddechu + Skoro nedýchá + Alig van légzés + Respira a fatica + Quase não respira + ほとんど呼吸をしていない + 호흡이 없음 + 呼吸微弱 + 呼吸極弱 + + + In mild pain + Hat leichte Schmerzen + 中くらいの痛みがある + Небольшая боль + Légère douleur + Com dor leve + 中度疼痛中 + Con un dolore leggero + V mírných bolestech + W łagodnym bólu + Con dolor leve + 轻度疼痛 + + + In pain + Hat Schmerzen + Испытывает боль + Con dolor + Douleur moyenne + W bólu + V bolestech + Fájdalom alatt + Con dolore + Com dor + 痛みがある + 고통 + 疼痛 + 疼痛中 + + + In severe pain + Hat starke Schmerzen + ひどい痛みがある + Сильная боль + Douleur intense + Com dor intensa + 嚴重疼痛中 + Con un forte dolore + Ve velkých bolestech + W silnym bólu + Con dolor severo + 重度疼痛 + + + Tourniquet [CAT] + Tourniquet [CAT] + Жгут + Torniquete [CAT] + Garrot [CAT] + Staza [CAT] + Škrtidlo [CAT] + Érszorító [CAT] + Laccio emostatico [CAT] + Torniquete [CAT] + 止血帯 [CAT] + 지혈대 [CAT] + 止血带 (军用型) + 軍用止血帶 + + + Receiving IV [%1ml] + Erhalte IV [%1ml] + Recibiendo IV [%1ml] + Принимается переливание [%1 мл] + Otrzymywanie IV [pozostało %1ml] + Transfusion : [%1 ml] + Přijímání transfúze [%1ml] + Infúzióra kötve [%1ml] + Ricevendo EV [%1ml] + Recebendo IV [%1ml] + IV [%1ml] を投与されている + IV로 [%1ml] 수혈중 + 正在接受静脉注射 [%1毫升] + 接收靜脈注射液中 [%1毫升] + + + Blood Pressure + Tension artérielle + Артериальное давление + Presión arterial + Ciśnienie krwi + Blutdruck + Vérnyomás + Pressione sanguigna + Pressão Arterial + Krevní tlak + 血圧を測る + 혈압 + 血压 + 血壓 + + + Checking Blood Pressure.. + Prise de tension... + Проверка артериального давления... + Comprobando presión arterial... + Sprawdzanie ciśnienia krwi... + Blutdruck kontrollieren... + Vérnyomás megmérése... + Controllando la pressione sanguigna.. + Aferindo Pressão Arterial... + Měřím krevní tlak... + 血圧を測定しています・・・ + 혈압 측정증... + 正在测量血压... + 檢查血壓中... + + + %1 checked Blood Pressure: %2 + %1 kontrollierte Blutdruck: %2 + %1 controllata pressione sanguigna: %2 + %1 проверил артериальное давление: %2 + %1 a mesuré la tension : %2. + %1 sprawdził ciśnienie krwi: %2 + %1 verificada la presión arterial: %2 + %1 ellenőrizte a vérnyomást: %2 + %1 zkontroloval krevní tlak: %2 + %1 verificou pressão arterial: %2 + %1 が測った血圧は: %2 + %1 (이)가 혈압을 측정했습니다: %2 + %1 测得血压为 %2 + 已由%1確認血壓: %2 + + + You checked %1 + Vous avez examiné %1. + Вы осмотрели раненого %1 + Examinando a %1 + Zbadałeś %1 + Kontrolliert %1 + A %1 ellenőrizve + Hai diagnosticato %1 + Você verificou o paciente %1 + Zkontroloval jsi %1 + 血圧は %1 + 나의 혈압은 %1 이다 + 你已检查 %1 + 你已經檢查 %1 + + + You find a blood pressure of %2/%3 + La tension est de %2/%3. + Артериальное давление %2/%3 + La Presión Arterial es %2/%3 + A vérnyomás %2/%3 + Hai riscontrato una pressione di %2/%3 + Wyczuwasz ciśnienie krwi o wartości %2/%3 + Der Blutdruck liegt bei %2/%3 + A Pressão Arterial é de %2/%3 + Naměřil si krevní tlak u %2/%3 + 血圧は %2/%3 + 혈압이 %2/%3 이다 + 血压为 %2/%3 + 血壓為%2/%3 + + + You find a low blood pressure + La tension est basse. + Давление низкое + La presión arterial es baja + Wyczuwasz niskie ciśnienie krwi + Blutdruck ist niedrig + A vérnyomás alacsony + La pressione sanguigna è bassa + Pressão Arterial baixa + Naměřil si nízký krevní tlak + 血圧はかなり低い + 혈압이 매우 낮다 + 血压低 + 發現到低血壓 + + + You find a normal blood pressure + La tension est normale. + Давление нормальное + La presión arterial es normal + Wyczuwasz normalne ciśnienie krwi + Blutdruck ist normal + A vérnyomás normális + La pressione sanguigna è normale + Pressão Arterial normal + Naměřil si normální krevní tlak + 血圧は通常 + 혈압이 정상이다 + 血压正常 + 發現到正常血壓 + + + You find a high blood pressure + La tension est élevée. + Давление высокое + La presión arterial es alta + Wyczuwasz wysokie ciśnienie krwi + Blutdruck ist hoch + A vérnyomás magas + La pressione sanguigna è alta + Pressão Arterial Alta + Naměřil si vysoký krevní tlak + 血圧はかなり高い + 혈압이 매우 높다 + 血压高 + 發現到高血壓 + + + You find no blood pressure + Il n'y a aucune pression sanguine. + Давления нет + No hay presión arterial + Nie wyczuwasz ciśnienia krwi + Patient hat keinen Blutdruck + Nem észlelhető vérnyomás + La pressione sanguigna è assente + Sem Pressão Arterial + Nenaměřil si žádný krevní tlak + 血圧は測れなかった + 혈압이 잡히지 않는다 + 血压为零 + 量不到血壓 + + + You fail to find a blood pressure + Vous n'avez pu mesurer aucune pression sanguine. + Артериальное давление не определяется + No puedes encontrar presión arterial + Nie udało Ci się sprawdzić ciśnienia krwi + Du konntest keinen Blutdruck feststellen + Nem sikerült a vérnyomás megmérése + Manca strumento per misurare pressione sanguigna + Você falhou em aferir a Pressão Arterial + Nedokázal si změřit krevní tlak + 血圧を測るのに失敗 + 혈압을 잡을 수 없었다 + 无法测得血压 + 檢查血壓的動作失敗 + + + Low + Niedrig + Bassa + Низкое + basse + Niskie + Baja + Alacsony + Nízký + Baixa + 低い + 낮음 + + + + + Normal + Normal + Normale + Нормальное + normale + Normalne + Normal + Normális + Normální + Normal + 通常 + 보통 + 正常 + 正常 + + + High + Hoch + Alta + Высокое + élevée + Wysokie + Alta + Magas + Vysoký + Alta + 高い + 높음 + + + + + No Blood Pressure + Kein Blutdruck + Nessuna Pressione Sanguigna + Артериальное давление отсутствует + Aucune pression sanguine. + Brak ciśnienia krwi + Sin presión arterial + Nincs vérnyomás + Žádný krevní tlak + Sem pressão arterial + 血圧なし + 혈압 없음 + 血压为零 + 無血壓 + + + Pulse + Пульс + Pouls + Pulso + Tętno + Puls + Pulzus + Polso + Pulso + Puls + 心拍数 + 맥박 + 脉搏 + 脈搏 + + + Checking Pulse... + Vérification du pouls... + Проверка пульса... + Comprobando pulso... + Sprawdzanie tętna... + Kontrolliere Puls... + Szívverés-szám mérése... + Controllando il polso... + Checando Pulso... + Kontroluji puls... + 脈拍数を測定しています・・・ + 맥박 확인중... + 正在测量脉搏... + 檢查心跳中... + + + You checked %1 + Вы осмотрели раненого %1 + Vous avez examiné %1. + Examinando a %1 + Zbadałeś %1 + Kontrolliert %1 + A %1 ellenőrizve + Hai diagnosticato %1 + Você aferiu o paciente %1 + Zkontroloval si %1 + 心拍数は %1 + 나의 맥박은 %1 이다 + 你已检查 %1 + 你已經檢查 %1 + + + %1 checked Heart Rate: %2 + %1 kontrollierte Herzfrequenz: %2 + %1 Controllata Frequenza Cardiaca: %2 + %1 проверил пульс: %2 + %1 a vérifié le pouls : %2. + %1 sprawdził tętno: %2 + %1 verificado el ritmo cardíaco: %2 + %1 ellenőrizte a szívverés-számot: %2 + %1 zkontroloval srdeční tep: %2 + %1 verificou a frequência cardíaca: %2 + %1 が測った心拍数は: %2 + %1 (이)가 맥박을 측정했습니다: %2 + %1 测得心率为 %2 + 已由%1確認心跳: %2 + + + None + Нет + Żadna + Nada + Keine + Žádný + Nada + Aucun pouls + Nincs + Niente + なし + 없음 + + + + + Weak + Schwach + Lento + Слабый + Lent + Słabe + Débil + Gyenge + Slabý + Fraca + 弱い + 약함 + 微弱 + 微弱 + + + Normal + Normal + Normale + Нормальный + Normal + Normalne + Normal + Normális + Normální + Normal + 通常 + 보통 + 正常 + 正常 + + + Strong + Stark + Veloce + Сильный + Rapide + Silne + Fuerte + Erős + Silný + Forte + 強い + 강함 + 过快 + 過快 + + + You find a Heart Rate of %2 + Le rythme cardiaque est de %2. + Пульс %2 уд./мин. + El ritmo cardíaco es de %2 + Wyczuwasz tętno o wartości %2 + Herzfrequenz ist %2 + A szívverés-szám %2 + Il battito cardiaco è %2 + A Freqüência Cardíaca é de %2 + Nahmatal jsi srdeční tep u %2 + 心拍数は %2 + 맥박이 %2 이다 + 心率为 %2 + 心跳為%2 + + + You find a weak Heart Rate + Rythme cardiaque lent. + Пульс слабый + El ritmo cardíaco es débil + Wyczuwasz słabe tętno + Schwacher Puls + A szívverés-szám alacsony + Hai riscontrato un debole battito cardiaco + Freqüência Cardíaca baixa + Nahmatal jsi slabý srdeční puls + 心拍数は低い + 약한 맥박이다 + 心率微弱 + 心跳微弱 + + + You find a strong Heart Rate + Rythme cardiaque rapide. + Пульс учащенный + El ritmo cardíaco está acelerado + Wyczuwasz silne tętno + Starker Puls + A szívverés-szám magas + Hai riscontrato un forte battito cardiaco + Freqüência Cardíaca normal + Nahmatal jsi silný srdeční puls + 心拍数は強い + 강한 맥박이다 + 心率过快 + 心跳過快 + + + You find a normal Heart Rate + Rythme cardiaque normal. + Пульс в норме + El ritmo cardíaco es bueno + Wyczuwasz normalne tętno + Normaler Puls + A szívverés-szám normális + Hai riscontrato un normale battito cardiaco + Freqüência Cardíaca alta + Nahmatal jsi normální srdeční puls + 心拍数は通常 + 보통 맥박이다 + 心率正常 + 心跳正常 + + + You find no Heart Rate + Aucun pouls. + Пульс не прощупывается + No tiene ritmo cardíaco + Wyczuwasz brak tętna + Kein Puls gefunden + Nem észlelhető szívverés + Hai riscontrato una assenza di battito cardiaco + Sem Freqüência Cardíaca + Žádný puls + 心拍数を測れなかった + 맥박을 찾을 수가 없다 + 无法测得心率 + 量不到心跳 + + + Response + Conscience + Реакция + Respuesta + Przytomność + Ansprechbarkeit + Reagálóképesség + Risposta + Reação + Odezva + 反応を見る + 반응 + 反应 + 反應 + + + You check response of patient + Évaluation de l'état de conscience du patient... + Вы проверяете реакцию раненого + Compruebas si el paciente reacciona + Sprawdzasz przytomność pacjenta + Du prüfst ob der Patient ansprechbar ist + Ellenőrzöd a páciens reagálóképességét + Controlli la risposta del paziente + Aferindo se o paciente tem reação + Zkontroloval jsi reakci pacienta + 患者からの反応をみる + 대상의 반응 확인중 + 检查伤员的反应 + 檢查傷者的反應 + + + %1 is responsive + %1 реагирует на раздражители + %1 est conscient. + %1 ha reaccionado + %1 jest przytomny + %1 ist anprechbar + %1 reakcióképes + %1 è cosciente + %1 está respondendo + %1 odpovídá + %1 は反応あり + %1 은 반응이있다 + %1 有反应 + %1 有反應 + + + %1 is not responsive + %1 не реагирует на раздражители + %1 est inconscient. + %1 no reacciona + %1 jest nieprzytomny + %1 ist nicht ansprechbar + %1 nem reagál + %1 non risponde + %1 não está respondendo + %1 neodpovídá + %1 の反応なし + %1 은 반응이없다 + %1 没有反应 + %1 沒有反應 + + + You checked %1 + Вы осмотрели раненого %1 + Vous avez examiné %1. + Examinas a %1 + Zbadałeś %1 + Du hast versucht, %1 anzusprechen + Megnézted %1-t + Hai controllato %1 + Você aferiu o paciente %1 + Zkontroloval jsi %1 + %1 を見た + %1 을 확인함 + 你已检查 %1 + 你已經檢查 %1 + + + Patient %1<br/>is %2.<br/>%3.<br/>%4 + Il paziente %1<br/>è %2.<br/>%3.<br/>%4 + Пациент %1<br/>%2.<br/>%3.<br/>%4 + Patient %1<br/>ist %2.<br/>%3.<br/>%4 + Le patient %1<br/>est %2.<br/>%3.<br/>%4 + Pacjent %1<br/>jest %2.<br/>%3.<br/>%4 + Paciente %1<br/>is %2.<br/>%3.<br/>%4 + A páciens, %1,<br/>%2.<br/>%3.<br/>%4 + Pacient %1<br/>je %2.<br/>%3.<br/>%4 + Paciente %1<br/>é %2.<br/>%3.<br/>%4 + 患者 %1<br/>は %2.<br/>%3.<br/>%4 + 환자 %1<br/>는 %2.<br/>%3.<br/>%4 + 伤员 %1 <br/> %2 <br/> %3 <br/> %4 + 傷者 %1<br/>is %2.<br/>%3.<br/>%4 + + + alive + vivo + жив + lebendig + vivant + żywy + vivo + élő + naživu + vivo + 生存 + 생존 + 存活 + 活著 + + + dead + morto + мёртв + muerto + tot + décédé + martwy + halott + mrtev + morto + 死亡 + 사망 + 死亡 + 死亡 + + + He's lost some blood + Ha perso poco sangue + Ha perdido un poco de sangre + Есть кровопотеря + Er hat etwas Blut verloren + Il a perdu un peu de sang + Stracił trochę krwi + Valamennyi vért vesztett + Ztratil trochu krve + Ele perdeu um pouco de sangue + 彼は出血している + 적은 양의 피를 잃었다 + 他轻微失血 + 他流失一些血液 + + + He's lost a lot of blood + Er hat viel Blut verloren + Sok vért vesztett + Stracił sporo krwi + Большая кровопотеря + Ha perdido mucha sangre + Il a perdu beaucoup de sang + Ztratil hodně krve + Ele perdeu muito sangue + Ha perso molto sangue + 彼は大量失血している + 많은 양의 피를 잃었다 + 他大量失血 + 他流失大量血液 + + + He hasn't lost blood + Non ha perso sangue + Нет кровопотери + Er hat kein Blut verloren + Il n'a pas perdu de sang + Nie stracił krwi + No ha perdido sangre + Nem vesztett vért + Neztratil žádnou krev + Ele não perdeu sangue + 彼は失血していない + 피를 잃지 않았다 + 他没有失血 + 他並沒有失血 + + + He is in pain + Sente dolori + Испытывает боль + Er hat Schmerzen + Il souffre + Odczuwa ból + Siente dolor + Fájdalmai vannak + Je v bolestech + Ele está com dor + 彼には痛みがあるようだ + 통증이 있다 + 他感到疼痛 + 他感到疼痛中 + + + He is not in pain + Non sente dolori + Не испытывает боли + Er hat keine Schmerzen + Il ne souffre pas + Nie odczuwa bólu + No siente dolor + Nincsenek fájdalmai + Nemá žádné bolesti + Ele não está com dor + 彼には痛みがないようだ + 통증이 없다 + 他没有感到疼痛 + 他沒感到疼痛中 + + + Bandaged + Pansé + Повязка наложена + Vendado + Zabandażowano + Bekötözve + Bendato + verbunden + Enfaixado + Obvázaný + 包帯 + 붕대 감음 + 包扎 + 繃帶 + + + You bandage %1 (%2) + Vous pansez %1 (%2). + Вы перевязали раненого %1 (%2) + Aplicas vendaje a %1 en %2 + Bandażujesz %1 (%2) + Bekötözöd %1-t (%2) + Stai bendando %1 (%2) + Du verbindest %1 (%2) + Você aplica bandagem no paciente %1 (%2) + Obvazuješ %1 (%2) + %1 (%2) 包帯を使った + %1 (%2) 붕대를 감았다 + 你正在使用 %2 包扎 %1 + 你正在對 %1 (%2) 包紮繃帶中 + + + %1 is bandaging you + %1 vous panse. + %1 перевязывает вас + %1 te está vendando + %1 bandażuje Ciebie + %1 bekötöz téged + %1 ti sta bendando + %1 verbindet dich + %1 está aplicando uma bandagem em você + %1 tě obvazuje + %1 はあなたに包帯を巻いている + %1 (이)가 나에게 붕대를 감고있다 + 你正在被 %1 包扎 + %1 正在對你包紮繃帶中 + + + You start stitching injuries from %1 (%2) + Вы зашиваете ранения от %1 (%2) + Du nähst die Wunden von %1 (%2) + Vous suturez %1 (%2). + Estás suturando heridas de %1 en %2 + Zszywasz rany %1 (%2) + Elkezded összevarni %1 sérüléseit (%2) + Stai suturando le ferite di %1 (%2) + Você começa a suturar os ferimentos do %1 (%2) + Zašíváš rány %1 (%2) + あなたは %1 (%2) の外傷へ縫合を始めた + 나는 %1(%2) 상처로부터 봉합을 시작했다 + 你正在使用 %2 缝合 %1 的伤口 + 你正開始對 %1 (%2) 縫合傷口中 + + + Stitching + Наложение швов + Suturando + Nähen + Suture en cours... + Szycie + Összevarrás + Suturando + Suturando + Šití + 縫合中 + 붕합중 + 正在缝合 + 縫合中 + + + You treat the airway of %1 + Вы интубируете раненого %1 + Estás intubando a %1 + Du behandelst die Atemwege von %1 + Vous traitez les voies respiratoires de %1. + Udrażniasz drogi oddechowe %1 + Kezeled %1 légútját + Controlli le vie respiratorie di %1 + Você entuba o %1 + Ošetřuješ dýchací cesty %1 + %1 の気道を診断する + %1의 기도를 확보했다 + 你正在治疗 %1 的呼吸道 + 你治療 %1 的呼吸道 + + + Airway + Дыхательные пути + Vías aéreas + Drogi oddechowe + Atemwege + Voies respiratoires + Légút + Vie respiratorie + Vias Aéreas + Dýchací cesty + 気道 + 기도 + 呼吸道 + 呼吸道 + + + %1 is treating your airway + %1 проводит вам интубацию + %1 traite vos voies respiratoires. + %1 te está intubando + %1 udrażnia Twoje drogi oddechowe + %1 behandelt deine Atemwege + %1 kezeli a légútadat + %1 ti sta trattando le vie respiratorie + %1 está te entubando + %1 ošetřuje tvoje dýchací cesty + %1 はあなたの気道を見ている + %1 (이)가 나의 기도를 확보중이다 + %1 正在治疗你的呼吸道 + %1 正在治療你的呼吸道 + + + Drag + Ziehen + Arrastrar + Ciągnij + Táhnout + Тащить + Traîner + Húzás + Arrastar + Trascina + 引きずる + 끌다 + 拖拽 + 拖拉 + + + Carry + Tragen + Cargar + Nieś + Nést + Нести + Porter + Cipelés + Carregar + Trasporta + 担ぐ + 업다 + 背起 + 背起 + + + Release + Loslassen + Soltar + Połóż + Položit + Отпустить + Déposer + Elengedés + Soltar + Rrilascia + 離す + 내려놓기 + 放下 + 放下 + + + Load Patient Into + Patient einladen + Cargar al paciente en + Załaduj pacjenta + Naložit pacianta do + Погрузить пациента в + Embarquer le patient + Sebesült berakása + Carregar Paciente Em + Carica paziente nel + 患者を載せる + 환자 싣기 + 将伤者装入 + 將傷者放入 + + + Unload Patient + Patient ausladen + Descargar al paciente + Wyładuj pacjenta + Vyložit pacienta + Выгрузить пациента + Débarquer le patient + Sebesült kihúzása + Descarregar Paciente + Scarica il paziente + 患者を降ろす + 환자 내리기 + 将伤者背出 + 將傷者背出 + + + This person (%1) is awake and cannot be loaded + Diese Person (%1) ist wach und kann nicht verladen werden + Ta osoba (%1) jest przytomna i nie może zostać załadowana + Esta persona (%1) está despierto y no puede ser cargado + Боец (%1) в сознании и не может быть погружен + Esta pessoa (%1) está acordada e não pode ser carregada + Tato osoba (%1) je vzhůru a nemůže být naložena + Questa persona (%1) è sveglia e non può essere caricata. + %1 est conscient et ne peut être embarqué. + 患者 (%1) は意識があり、積み込めない + 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 + 此人(%1)处于清醒状态, 因此无法被装载 + 此人(%1)是清醒且不能被裝載 + + + %1<br/>loaded into<br/>%2 + %1<br/>cargado en<br/>%2 + %1<br/>a embarqué dans<br/>%2. + %1<br/>in<br/>%2 verladen + %1<br/>załadowano do<br/>%2 + %1<br/>naloženo do<br/>%2 + %1<br/>carregado em<br/>%2 + %1<br/>caricato su<br/>%2 + %1<br/>berakodva ide:<br/>%2 + %1<br/>загружен в<br/>%2 + %1<br/>は<br/>%2へ積み込まれました + %1<br/>는<br/>%2 에 실림 + %1<br/>裝載至<br/>%2 + %1<br/>装载至<br/>%2 + + + Unloaded<br/>%1 from<br/>%2 + %1<br/>von<br/>%2 abgeladen + Descargado/a<br/>%1 de<br/>%2 + %1<br/> a débarqué du<br/>%2. + %1<br/>rozładowano z<br/>%2 + %1<br/>vyloženo z<br/>%2 + %1<br/>descarregado de<br/>%2 + Hai scaricato<br/>%1 da<br/>%2 + 1%<br/>kirakodva ebből:<br/>%2 + %1<br/>разгружен из<br/>%2 + <br/>%1が<br/>%2から降ろされました + %1<br/>는<br/>%2 에서 내려짐 + 從<br/>%2卸載<br/>%1 + 从<br/>%2卸载<br/>%1 + + + Place body in bodybag + Colocar cuerpo en bolsa para cadáveres + Поместить тело в мешок для трупов + Körper in Leichesack verstauen + Zapakuj ciało do worka na zwłoki + Mettre le corps dans la housse mortuaire + Test hullazsákba helyezése + Metti il corpo nella sacca per cadaveri + Colocar corpo dentro do saco para cadáver + Umístit tělo do pytle na mrtvoly + 死体袋に入れる + 시체 가방에 담기 + 将尸体装入尸袋 + 將屍體放入屍袋 + + + Placing body in bodybag... + Colocando cuerpo en bolsa para cadáveres... + Упаковка тела... + Körper wird in Leichensack gepackt... + Pakowanie ciała do worka na zwłoki... + Placement du corps dans la housse... + Test hullazsákba helyezése... + Stai mettendo il corpo nella sacca... + Colocando corpo dentro do saco para cadáver... + Umisťuji tělo do pytle na mrtvoly... + 死体袋へ入れています・・・ + 시체 가방에 담는중... + 正在将尸体装入尸袋... + 將屍體放入屍袋中... + + + %1 has bandaged patient + %1 has vendado al paciente + %1 перевязал пациента + %1 hat den Patienten verbunden + %1 założył bandaż + %1 a pansé le patient. + %1 bekötözte a pácienst + %1 ha bendato il paziente + %1 aplicou bandagem no paciente + %1 již obvázal pacienta + %1 は包帯を巻いた + %1 (이)가 붕대를 감아줬다 + %1 已包扎伤员 + %1 已包紮傷者 + + + %1 performed CPR + %1 wykonał cykl RKO + %1 provádí CPR + %1 hat eine HLW durchgeführt + %1 ha eseguito CPR + %1 realizou RCP + %1 провел сердечно-легочную реанимацию + %1 realicó RCP + %1 a fait une RCP. + %1 は心肺蘇生をした + %1 (이)가 심폐소생술을 실시했다 + %1 已进行心肺复苏 + %1 已執行心肺復甦術 + + + %1 used %2 + %1 usó %2 + %1 benutzt %2 + %1 использовал %2 + %1 użył %2 + %1 a utilisé un %2. + %1 használta a %2-t + %1 ha usato %2 + %1 usou %2 + %1 použil %2 + %1 は %2 を使った + %1 (이)가 %2 을 썼다 + %1 已使用 %2 + %1 已使用 %2 + + + %1 has given an IV + %1 провёл переливание + %1 ha puesto una IV + %1 hat eine Infusion verabreicht + %1 podał IV + %1 a posé une IV. + %1 infúziót adott + %1 ha somministrato una EV + %1 aplicou um intravenoso + %1 již aplikoval IV + %1 は IV を投与した + %1 (이)가 IV를 실시했다 + %1 已进行静脉注射 + %1 已經給予靜脈注射液 + + + %1 applied a tourniquet + %1 aplicado torniquete + %1 наложил жгут + %1 hat ein Tourniquet angelegt + %1 założył stazę + %1 a posé un garrot. + %1 felhelyezett egy érszorítót + %1 ha applicato un laccio emostatico + %1 aplicou um torniquete + %1 použil škrtidlo + %1 は止血帯を巻いた + %1 (이)가 지혈대를 적용했다 + %1 已使用止血带 + %1 已經綁上止血帶 + + + %1 applied a splint + %1 наложил Шина + %1 a posé une attelle. + %1 aplicou uma Tala + %1 已套用固定板 + %1 ha applicato una gessatura + %1 použil dlahu + %1 は添え木を当てた + %1 założył szynę + %1 aplicada una férula + %1 hat eine Schiene angelegt + %1 已安装夹板 + + + %1 used Personal Aid Kit + %1 hat das eigene Erste-Hilfe-Set verwendet + %1 użył apteczki + %1 utilizou KPS + %1 používá PAK + %1 использовал аптечку + %1 ha usato Kit Pronto Soccorso Personale + %1 usó Kit de Primeros Auxilios + %1 a utilisé une trousse sanitaire. + %1 は応急処置キットを使った + %1 (이)가 개인응급키트를 사용했다 + %1 已使用个人急救包 + %1 已使用了個人急救包 + + + Heavily wounded + Schwer verwundet: + Ciężko ranny + Тяжелые ранения + Gravemente ferito + Gravemente herido + Gravement blessé + Erősen sérült + Těžce raněn + Gravemente ferido + 重傷 + 중상 + 重伤 + 重傷 + + + Lightly wounded + Leicht verwundet: + Lekko ranny + Легкие ранения + Leggermente ferito + Levemente herido + Légèrement blessé + Enyhén sérült + Lehce raněn + Levemente ferido + 軽傷 + 경상 + 轻伤 + 輕傷 + + + Very lightly wounded + Sehr leicht verwundet: + B. lekko ranny + Царапины + Ferito lievemente + Muy levemente herido + Très légèrement blessé + Nagyon enyhén sérült + Velmi lehce raněn + Muito levemente ferido + かなり浅い傷 + 매우 가벼운 부상 + 小伤 + 小傷 + + + Heal fully bandaged hitpoints + Lecz w pełni zabandażowane hitpointy + Curar miembros totalmente vendados + Исцелять полностью перебинтованные части тела + Curar hitpoints totalmente enfaixados + Heal fully bandaged hitpoints + Cura hitpoints completamente bendati + Guérir les plaies entièrement bandées + Heilt vollständig bandagierte Trefferpunkte + 包帯は体力を完全に回復させます + 붕대를 감은후 체력을 회복함 + 完全医疗包扎的部位至痊愈 + 完全醫療包紮的部位至痊癒 + + + Treating... + Behandeln... + Ellátás... + Opatrywanie ran... + Traitement... + Лечение... + Tratando... + Tratando... + Ošetřuji... + Curando... + 治療しています・・・ + 치료중... + 正在治疗... + 治療中... + + + Removing Tourniquet... + Tourniquet entfernen... + Zdejmowanie stazy... + Quitando torniquete... + Retrait du garrot... + Removendo torniquete... + Érszorító eltávolítása... + Sundavám škrtidlo... + Снятие жгута... + Togliendo il laccio emostatico... + 止血帯を外しています・・・ + 지혈대 제거중... + 正在移除止血带... + 移除軍用止血帶中... + + + There is no tourniquet on this body part! + An diesem Körperteil befindet sich kein Tourniquet! + Na tej kończynie nie ma stazy! + No hay torniquete en esta parte del cuerpo! + Нет жгута на этой части тела! + Não existe nenhum torniquete nesta parte do corpo! + Žádné škrtidlo na této části těla! + Non c'è nessun laccio emostatico su questa parte del corpo! + Il n'y a pas de garrot sur ce membre ! + 身体には止血帯が無い! + 이 부위에는 지혈대가 없습니다! + 该部位没有使用止血带! + 這部位沒有止血帶! + + + diff --git a/addons/medical/ui/items/adenosine_x_ca.paa b/addons/medical_treatment/ui/adenosine_ca.paa similarity index 100% rename from addons/medical/ui/items/adenosine_x_ca.paa rename to addons/medical_treatment/ui/adenosine_ca.paa diff --git a/addons/medical/ui/items/atropine_x_ca.paa b/addons/medical_treatment/ui/atropine_ca.paa similarity index 100% rename from addons/medical/ui/items/atropine_x_ca.paa rename to addons/medical_treatment/ui/atropine_ca.paa diff --git a/addons/medical/ui/items/bloodIV_x_ca.paa b/addons/medical_treatment/ui/bloodiv_ca.paa similarity index 100% rename from addons/medical/ui/items/bloodIV_x_ca.paa rename to addons/medical_treatment/ui/bloodiv_ca.paa diff --git a/addons/medical/ui/items/bodybag_x_ca.paa b/addons/medical_treatment/ui/bodybag_ca.paa similarity index 100% rename from addons/medical/ui/items/bodybag_x_ca.paa rename to addons/medical_treatment/ui/bodybag_ca.paa diff --git a/addons/medical/ui/items/elasticBandage_x_ca.paa b/addons/medical_treatment/ui/elasticbandage_ca.paa similarity index 100% rename from addons/medical/ui/items/elasticBandage_x_ca.paa rename to addons/medical_treatment/ui/elasticbandage_ca.paa diff --git a/addons/medical/ui/items/epinephrine_x_ca.paa b/addons/medical_treatment/ui/epinephrine_ca.paa similarity index 100% rename from addons/medical/ui/items/epinephrine_x_ca.paa rename to addons/medical_treatment/ui/epinephrine_ca.paa diff --git a/addons/medical/ui/items/fieldDressing_x_ca.paa b/addons/medical_treatment/ui/fielddressing_ca.paa similarity index 100% rename from addons/medical/ui/items/fieldDressing_x_ca.paa rename to addons/medical_treatment/ui/fielddressing_ca.paa diff --git a/addons/medical/ui/items/morphine_x_ca.paa b/addons/medical_treatment/ui/morphine_ca.paa similarity index 100% rename from addons/medical/ui/items/morphine_x_ca.paa rename to addons/medical_treatment/ui/morphine_ca.paa diff --git a/addons/medical/ui/items/packingBandage_x_ca.paa b/addons/medical_treatment/ui/packingbandage_ca.paa similarity index 100% rename from addons/medical/ui/items/packingBandage_x_ca.paa rename to addons/medical_treatment/ui/packingbandage_ca.paa diff --git a/addons/medical/ui/items/personal_aid_kit_x_ca.paa b/addons/medical_treatment/ui/personal_aid_kit_ca.paa similarity index 100% rename from addons/medical/ui/items/personal_aid_kit_x_ca.paa rename to addons/medical_treatment/ui/personal_aid_kit_ca.paa diff --git a/addons/medical/ui/items/plasmaIV_x_ca.paa b/addons/medical_treatment/ui/plasmaiv_ca.paa similarity index 100% rename from addons/medical/ui/items/plasmaIV_x_ca.paa rename to addons/medical_treatment/ui/plasmaiv_ca.paa diff --git a/addons/medical/ui/items/quickclot_x_ca.paa b/addons/medical_treatment/ui/quickclot_ca.paa similarity index 100% rename from addons/medical/ui/items/quickclot_x_ca.paa rename to addons/medical_treatment/ui/quickclot_ca.paa diff --git a/addons/medical/ui/items/salineIV_x_ca.paa b/addons/medical_treatment/ui/salineiv_ca.paa similarity index 100% rename from addons/medical/ui/items/salineIV_x_ca.paa rename to addons/medical_treatment/ui/salineiv_ca.paa diff --git a/addons/medical_treatment/ui/splint_ca.paa b/addons/medical_treatment/ui/splint_ca.paa new file mode 100644 index 00000000000..ea09181ef02 Binary files /dev/null and b/addons/medical_treatment/ui/splint_ca.paa differ diff --git a/addons/medical/ui/items/surgicalKit_x_ca.paa b/addons/medical_treatment/ui/surgicalkit_ca.paa similarity index 100% rename from addons/medical/ui/items/surgicalKit_x_ca.paa rename to addons/medical_treatment/ui/surgicalkit_ca.paa diff --git a/addons/medical/ui/items/tourniquet_x_ca.paa b/addons/medical_treatment/ui/tourniquet_ca.paa similarity index 100% rename from addons/medical/ui/items/tourniquet_x_ca.paa rename to addons/medical_treatment/ui/tourniquet_ca.paa diff --git a/addons/medical_vitals/$PBOPREFIX$ b/addons/medical_vitals/$PBOPREFIX$ new file mode 100644 index 00000000000..c3a2843a0e4 --- /dev/null +++ b/addons/medical_vitals/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_vitals diff --git a/addons/medical_vitals/CfgEventHandlers.hpp b/addons/medical_vitals/CfgEventHandlers.hpp new file mode 100644 index 00000000000..0d3301d6e0a --- /dev/null +++ b/addons/medical_vitals/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_vitals/XEH_PREP.hpp b/addons/medical_vitals/XEH_PREP.hpp new file mode 100644 index 00000000000..8f8c4277518 --- /dev/null +++ b/addons/medical_vitals/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(handleUnitVitals); +PREP(updateHeartRate); +PREP(updatePainSuppress); +PREP(updatePeripheralResistance); diff --git a/addons/medical_vitals/XEH_postInit.sqf b/addons/medical_vitals/XEH_postInit.sqf new file mode 100644 index 00000000000..6eccf9d1ddc --- /dev/null +++ b/addons/medical_vitals/XEH_postInit.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" + diff --git a/addons/disposable/XEH_preInit.sqf b/addons/medical_vitals/XEH_preInit.sqf similarity index 100% rename from addons/disposable/XEH_preInit.sqf rename to addons/medical_vitals/XEH_preInit.sqf diff --git a/addons/medical_vitals/XEH_preStart.sqf b/addons/medical_vitals/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/medical_vitals/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_vitals/config.cpp b/addons/medical_vitals/config.cpp new file mode 100644 index 00000000000..91995242c9c --- /dev/null +++ b/addons/medical_vitals/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_status"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf new file mode 100644 index 00000000000..cdb57b3dfec --- /dev/null +++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf @@ -0,0 +1,168 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Updates the vitals. Called from the statemachine's onState functions. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Update Ran (at least 1 second between runs) + * + * Example: + * [player] call ace_medical_vitals_fnc_handleUnitVitals + * + * Public: No + */ + +params ["_unit"]; + +private _lastTimeUpdated = _unit getVariable [QGVAR(lastTimeUpdated), 0]; +private _deltaT = (CBA_missionTime - _lastTimeUpdated) min 10; +if (_deltaT < 1) exitWith { false }; // state machines could be calling this very rapidly depending on number of local units + +BEGIN_COUNTER(Vitals); + +_unit setVariable [QGVAR(lastTimeUpdated), CBA_missionTime]; +private _lastTimeValuesSynced = _unit getVariable [QGVAR(lastMomentValuesSynced), 0]; +private _syncValues = (CBA_missionTime - _lastTimeValuesSynced) >= (10 + floor(random 10)); + +if (_syncValues) then { + _unit setVariable [QGVAR(lastMomentValuesSynced), CBA_missionTime]; +}; + +private _bloodVolume = GET_BLOOD_VOLUME(_unit) + ([_unit, _deltaT, _syncValues] call EFUNC(medical_status,getBloodVolumeChange)); +_bloodVolume = 0 max _bloodVolume min DEFAULT_BLOOD_VOLUME; + +// @todo: replace this and the rest of the setVariable with EFUNC(common,setApproximateVariablePublic) +_unit setVariable [VAR_BLOOD_VOL, _bloodVolume, _syncValues]; + +// Set variables for synchronizing information across the net +private _hemorrhage = switch (true) do { + case (_bloodVolume < BLOOD_VOLUME_CLASS_4_HEMORRHAGE): { 4 }; + case (_bloodVolume < BLOOD_VOLUME_CLASS_3_HEMORRHAGE): { 3 }; + case (_bloodVolume < BLOOD_VOLUME_CLASS_2_HEMORRHAGE): { 2 }; + case (_bloodVolume < BLOOD_VOLUME_CLASS_1_HEMORRHAGE): { 1 }; + default {0}; +}; + +if (_hemorrhage != GET_HEMORRHAGE(_unit)) then { + _unit setVariable [VAR_HEMORRHAGE, _hemorrhage, true]; +}; + +private _woundBloodLoss = GET_WOUND_BLEEDING(_unit); + +private _inPain = GET_PAIN_PERCEIVED(_unit) > 0; +if !(_inPain isEqualTo IS_IN_PAIN(_unit)) then { + _unit setVariable [VAR_IN_PAIN, _inPain, true]; +}; + +// Handle pain due tourniquets, that have been applied more than 120 s ago +private _tourniquetPain = 0; +private _tourniquets = GET_TOURNIQUETS(_unit); +{ + if (_x > 0 && {CBA_missionTime - _x > 120}) then { + _tourniquetPain = _tourniquetPain max (CBA_missionTime - _x - 120) * 0.001; + }; +} forEach _tourniquets; +if (_tourniquetPain > 0) then { + [_unit, _tourniquetPain] call EFUNC(medical_status,adjustPainLevel); +}; + +// Get Medication Adjustments: +private _hrTargetAdjustment = 0; +private _painSupressAdjustment = 0; +private _peripheralResistanceAdjustment = 0; +private _adjustments = _unit getVariable [VAR_MEDICATIONS,[]]; + +if !(_adjustments isEqualTo []) then { + private _deleted = false; + { + _x params ["_medication", "_timeAdded", "_timeTillMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust"]; + private _timeInSystem = CBA_missionTime - _timeAdded; + if (_timeInSystem >= _maxTimeInSystem) then { + _deleted = true; + _adjustments set [_forEachIndex, objNull]; + } else { + private _effectRatio = (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + if (_hrAdjust != 0) then { _hrTargetAdjustment = _hrTargetAdjustment + _hrAdjust * _effectRatio; }; + if (_painAdjust != 0) then { _painSupressAdjustment = _painSupressAdjustment + _painAdjust * _effectRatio; }; + if (_flowAdjust != 0) then { _peripheralResistanceAdjustment = _peripheralResistanceAdjustment + _flowAdjust * _effectRatio; }; + }; + } forEach _adjustments; + + if (_deleted) then { + _unit setVariable [VAR_MEDICATIONS, _adjustments - [objNull], true]; + _syncValues = true; + }; +}; + +private _heartRate = [_unit, _hrTargetAdjustment, _deltaT, _syncValues] call FUNC(updateHeartRate); +[_unit, _painSupressAdjustment, _deltaT, _syncValues] call FUNC(updatePainSuppress); +[_unit, _peripheralResistanceAdjustment, _deltaT, _syncValues] call FUNC(updatePeripheralResistance); + +private _bloodPressure = GET_BLOOD_PRESSURE(_unit); +_unit setVariable [VAR_BLOOD_PRESS, _bloodPressure, _syncValues]; + +_bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; + +// Statements are ordered by most lethal first. +switch (true) do { + case (_bloodVolume < BLOOD_VOLUME_FATAL): { + TRACE_3("BloodVolume Fatal",_unit,BLOOD_VOLUME_FATAL,_bloodVolume); + [QEGVAR(medical,Bleedout), _unit] call CBA_fnc_localEvent; + }; + case (IN_CRDC_ARRST(_unit)): {}; // if in cardiac arrest just break now to avoid throwing unneeded events + case (_hemorrhage == 4): { + TRACE_3("Class IV Hemorrhage",_unit,_hemorrhage,_bloodVolume); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_heartRate < 20 || {_heartRate > 220}): { + TRACE_2("heartRate Fatal",_unit,_heartRate); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodPressureH < 50 && {_bloodPressureL < 40} && {_heartRate < 40}): { + TRACE_4("bloodPressure (H & L) + heartRate Fatal",_unit,_bloodPressureH,_bloodPressureL,_heartRate); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodPressureL >= 190): { + TRACE_2("bloodPressure L above limits",_unit,_bloodPressureL); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_heartRate < 30): { // With a heart rate below 30 but bigger than 20 there is a chance to enter the cardiac arrest state + private _nextCheck = _unit getVariable [QGVAR(nextCheckCriticalHeartRate), CBA_missionTime]; + private _enterCardiacArrest = false; + if (CBA_missionTime >= _nextCheck) then { + _enterCardiacArrest = random 1 < (0.4 + 0.6*(30 - _heartRate)/10); // Variable chance of getting into cardiac arrest. + _unit setVariable [QGVAR(nextCheckCriticalHeartRate), CBA_missionTime + 5]; + }; + if (_enterCardiacArrest) then { + TRACE_2("Heart rate critical. Cardiac arrest",_unit,_heartRate); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + } else { + TRACE_2("Heart rate critical. Critical vitals",_unit,_heartRate); + [QEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + }; + case (_woundBloodLoss > BLOOD_LOSS_KNOCK_OUT_THRESHOLD): { + [QEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_woundBloodLoss > 0): { + [QEGVAR(medical,LoweredVitals), _unit] call CBA_fnc_localEvent; + }; + case (_inPain): { + [QEGVAR(medical,LoweredVitals), _unit] call CBA_fnc_localEvent; + }; +}; + +#ifdef DEBUG_MODE_FULL +private _cardiacOutput = [_unit] call EFUNC(medical_status,getCardiacOutput); +if (!isPlayer _unit) then { + private _painLevel = _unit getVariable [VAR_PAIN, 0]; + hintSilent format["blood volume: %1, blood loss: [%2, %3]\nhr: %4, bp: %5, pain: %6", round(_bloodVolume * 100) / 100, round(_woundBloodLoss * 1000) / 1000, round((_woundBloodLoss / (0.001 max _cardiacOutput)) * 100) / 100, round(_heartRate), _bloodPressure, round(_painLevel * 100) / 100]; +}; +#endif + +END_COUNTER(Vitals); + +true diff --git a/addons/medical_vitals/functions/fnc_updateHeartRate.sqf b/addons/medical_vitals/functions/fnc_updateHeartRate.sqf new file mode 100644 index 00000000000..4da8519077f --- /dev/null +++ b/addons/medical_vitals/functions/fnc_updateHeartRate.sqf @@ -0,0 +1,69 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update the heart rate + * + * Arguments: + * 0: The Unit + * 1: Heart Rate Adjustments + * 2: Time since last update + * 3: Sync value? + * + * ReturnValue: + * Current Heart Rate + * + * Example: + * [player, 0, 1, false] call ace_medical_vitals_fnc_updateHeartRate + * + * Public: No + */ + +params ["_unit", "_hrTargetAdjustment", "_deltaT", "_syncValue"]; + +private _heartRate = GET_HEART_RATE(_unit); + +if IN_CRDC_ARRST(_unit) then { + if (alive (_unit getVariable [QEGVAR(medical,CPR_provider), objNull])) then { + if (_heartRate == 0) then { _syncValue = true }; // always sync on large change + _heartRate = random [25, 30, 35]; + } else { + if (_heartRate != 0) then { _syncValue = true }; // always sync on large change + _heartRate = 0 + }; +} else { + private _hrChange = 0; + private _targetHR = 0; + private _bloodVolume = GET_BLOOD_VOLUME(_unit); + if (_bloodVolume > BLOOD_VOLUME_CLASS_4_HEMORRHAGE) then { + GET_BLOOD_PRESSURE(_unit) params ["_bloodPressureL", "_bloodPressureH"]; + private _meanBP = (2/3) * _bloodPressureH + (1/3) * _bloodPressureL; + private _painLevel = GET_PAIN_PERCEIVED(_unit); + + private _targetBP = 107; + if (_bloodVolume < BLOOD_VOLUME_CLASS_2_HEMORRHAGE) then { + _targetBP = _targetBP * (_bloodVolume / DEFAULT_BLOOD_VOLUME); + }; + + _targetHR = DEFAULT_HEART_RATE; + if (_bloodVolume < BLOOD_VOLUME_CLASS_3_HEMORRHAGE) then { + _targetHR = _heartRate * (_targetBP / (45 max _meanBP)); + }; + if (_painLevel > 0.2) then { + _targetHR = _targetHR max (80 + 50 * _painLevel); + }; + _targetHR = (_targetHR + _hrTargetAdjustment) max 0; + + _hrChange = round(_targetHR - _heartRate) / 2; + } else { + _hrChange = -round(_heartRate / 10); + }; + if (_hrChange < 0) then { + _heartRate = (_heartRate + _deltaT * _hrChange) max _targetHR; + } else { + _heartRate = (_heartRate + _deltaT * _hrChange) min _targetHR; + }; +}; + +_unit setVariable [VAR_HEART_RATE, _heartRate, _syncValue]; + +_heartRate diff --git a/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf b/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf new file mode 100644 index 00000000000..98906746e25 --- /dev/null +++ b/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update the pain suppression + * + * Arguments: + * 0: The Unit + * 1: Pain Suppress Adjustments + * 2: Time since last update + * 3: Sync value? + * + * Return Value: + * None + * + * Example: + * [player, 0, 1, false] call ace_medical_vitals_fnc_updatePainSuppress + * + * Public: No + */ + +params ["_unit", "_painSupressAdjustment", "_deltaT", "_syncValue"]; + +// Handle continuous pain reduction +private _pain = GET_PAIN(_unit); +_unit setVariable [VAR_PAIN, 0 max (_pain - _deltaT / PAIN_FADE_TIME), _syncValue]; + +if (isNil QEGVAR(medical_treatment,advancedMedication) || {!EGVAR(medical_treatment,advancedMedication)}) then { + // Handles simple medication + private _painSupress = _unit getVariable [VAR_PAIN_SUPP, 0]; + _painSupress = _painSupress - _deltaT / PAIN_SUPPRESSION_FADE_TIME; + _unit setVariable [VAR_PAIN_SUPP, 0 max _painSupress, _syncValue]; +} else { + // Handle advanced medication + _unit setVariable [VAR_PAIN_SUPP, 0 max _painSupressAdjustment, _syncValue]; +}; diff --git a/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf new file mode 100644 index 00000000000..c5552143c78 --- /dev/null +++ b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update the peripheral resistance + * + * Arguments: + * 0: The Unit + * 1: Peripheral Resistance Adjustments + * 2: Time since last update + * 3: Sync value? + * + * Return Value: + * None + * + * Example: + * [player, 0, 1, false] call ace_medical_vitals_fnc_updatePeripheralResistance + * + * Public: No + */ + +params ["_unit", "_peripheralResistanceAdjustment", "_deltaT", "_syncValue"]; + +_unit setVariable [VAR_PERIPH_RES, 0 max (DEFAULT_PERIPH_RES + _peripheralResistanceAdjustment), _syncValue]; diff --git a/addons/medical_vitals/functions/script_component.hpp b/addons/medical_vitals/functions/script_component.hpp new file mode 100644 index 00000000000..4fe94957b5a --- /dev/null +++ b/addons/medical_vitals/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_vitals\script_component.hpp" diff --git a/addons/medical_vitals/script_component.hpp b/addons/medical_vitals/script_component.hpp new file mode 100644 index 00000000000..3bfb4bcc269 --- /dev/null +++ b/addons/medical_vitals/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_vitals +#define COMPONENT_BEAUTIFIED Medical Vitals +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_VITALS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_VITALS + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_VITALS +#endif + +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/metis/$PBOPREFIX$ b/addons/metis/$PBOPREFIX$ new file mode 100644 index 00000000000..d37f3f73281 --- /dev/null +++ b/addons/metis/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\metis \ No newline at end of file diff --git a/addons/metis/CfgAmmo.hpp b/addons/metis/CfgAmmo.hpp new file mode 100644 index 00000000000..1f613a36b18 --- /dev/null +++ b/addons/metis/CfgAmmo.hpp @@ -0,0 +1,81 @@ +class CfgAmmo { + class M_Vorona_HEAT; + class GVAR(HEAT): M_Vorona_HEAT { + manualControl = 0; + irLock = 0; + laserLock = 0; + airLock = 0; + lockType = 0; + + class ace_missileguidance { + enabled = 1; + + minDeflection = 0; // Minium flap deflection for guidance + maxDeflection = 0.0027; // Maximum flap deflection for guidance + incDeflection = 0.0005; // The incrmeent in which deflection adjusts. + + canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode + + // Guidance type for munitions + defaultSeekerType = "SACLOS"; + seekerTypes[] = { "SACLOS" }; + + defaultSeekerLockMode = "LOAL"; + seekerLockModes[] = { "LOAL", "LOBL" }; + + seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos] + seekerAngle = 15; // Angle from the shooter's view that can track the missile + seekerAccuracy = 1; // seeker accuracy multiplier + + seekerMinRange = 80; + seekerMaxRange = 2000; // Range from the missile which the seeker can visually search + + correctionDistance = 3; // distance from center of crosshair where missile slows down + offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair. + + // Attack profile type selection + defaultAttackProfile = "WIRE"; + attackProfiles[] = {"WIRE"}; + }; + }; + + class M_Vorona_HE; + class GVAR(HE): M_Vorona_HE { + manualControl = 0; + irLock = 0; + laserLock = 0; + airLock = 0; + lockType = 0; + + class ace_missileguidance { + enabled = 1; + + minDeflection = 0; // Minium flap deflection for guidance + maxDeflection = 0.0027; // Maximum flap deflection for guidance + incDeflection = 0.0005; // The incrmeent in which deflection adjusts. + + canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode + + // Guidance type for munitions + defaultSeekerType = "SACLOS"; + seekerTypes[] = { "SACLOS" }; + + defaultSeekerLockMode = "LOAL"; + seekerLockModes[] = { "LOAL", "LOBL" }; + + seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos] + seekerAngle = 15; // Angle from the shooter's view that can track the missile + seekerAccuracy = 1; // seeker accuracy multiplier + + seekerMinRange = 80; + seekerMaxRange = 2000; // Range from the missile which the seeker can visually search + + correctionDistance = 3; // distance from center of crosshair where missile slows down + offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair. + + // Attack profile type selection + defaultAttackProfile = "WIRE"; + attackProfiles[] = {"WIRE"}; + }; + }; +}; diff --git a/addons/metis/CfgMagazines.hpp b/addons/metis/CfgMagazines.hpp new file mode 100644 index 00000000000..e1c26d844f2 --- /dev/null +++ b/addons/metis/CfgMagazines.hpp @@ -0,0 +1,10 @@ +class CfgMagazines { + class CA_LauncherMagazine; + class Vorona_HEAT : CA_LauncherMagazine { + ammo = QGVAR(HEAT); + }; + class Vorona_HE : Vorona_HEAT { + ammo = QGVAR(HE); + }; +}; + diff --git a/addons/metis/README.md b/addons/metis/README.md new file mode 100644 index 00000000000..c494b9f8f9e --- /dev/null +++ b/addons/metis/README.md @@ -0,0 +1,12 @@ +ace_metis +=================== + +Converts vanilla "Vorona" Missile Guidance into ACE SACLOS Guidance + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Brandon-TCVM](https://github.com/TheCandianVendingMachine) + diff --git a/addons/metis/config.cpp b/addons/metis/config.cpp new file mode 100644 index 00000000000..65e4474dd90 --- /dev/null +++ b/addons/metis/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_missileguidance"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Brandon (TCVM)"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" + diff --git a/addons/metis/script_component.hpp b/addons/metis/script_component.hpp new file mode 100644 index 00000000000..d812eba2a2c --- /dev/null +++ b/addons/metis/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT metis +#define COMPONENT_BEAUTIFIED Metis +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_METIS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_METIS + #define DEBUG_SETTINGS DEBUG_SETTINGS_METIS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + diff --git a/addons/microdagr/CfgEventHandlers.hpp b/addons/microdagr/CfgEventHandlers.hpp index 47564cbd2d2..789cfeb05c7 100644 --- a/addons/microdagr/CfgEventHandlers.hpp +++ b/addons/microdagr/CfgEventHandlers.hpp @@ -13,6 +13,6 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); + clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); }; }; diff --git a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf index c231b583b4c..88e89f7fa79 100644 --- a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf +++ b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf @@ -11,7 +11,7 @@ * Waypoints * * Example: - * [["Hill 55", [41,324, 12]]] = [] call ace_microdagr_fnc_deviceGetWaypoint + * [["Hill 55", [41,324, 12]]] = [] call ace_microdagr_fnc_deviceGetWaypoints * * Public: No */ diff --git a/addons/microdagr/gui_controls.hpp b/addons/microdagr/gui_controls.hpp index 4fd194e1ab2..f48c182f161 100644 --- a/addons/microdagr/gui_controls.hpp +++ b/addons/microdagr/gui_controls.hpp @@ -132,6 +132,7 @@ class controlsBackground { h = H_PART(19); onDraw = QUOTE(_this call FUNC(mapOnDrawEH)); + showMarkers = 0; colorBackground[] = {0,0,0,1}; colorOutside[] = {0,0,0,1}; moveOnEdges = 0; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 87f1600c11c..63672ca1a2e 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -8,7 +8,7 @@ MicroDAGR GPS MicroDAGR GPS MicroDAGR GPS - MicroDAGR GPS + MicroDAGR MicroDAGR GPS GPS MicroDAGR GPS MicroDAGR @@ -16,6 +16,7 @@ MicroDAGR GPS 微型军用GPS接收器 微型軍用GPS接收器 + MicroDAGR GPS MicroDAGR advanced GPS receiver @@ -23,11 +24,11 @@ Receptor avanzado GPS MicroDAGR Многофункциональный GPS-приёмник. Zaawansowany odbiornik GPS MicroDAGR - Récepteur GPS MicroDAGR + MicroDAGR - Récepteur GPS avancé MicroDAGR pokročílá GPS příjímač MicroDAGR fejlett GPS vevőegység Ricevitore GPS avanzato MicroDAGR - Recepitor GPS avançado MicroDAGR + Receptor GPS avançado MicroDAGR MicroDAGR は改良された GPS 受信機です MicroDAGR 고급 위성항법 수신기 微型军用高级防御GPS接收器 @@ -38,7 +39,7 @@ Unidad angular: Угловые единицы: Jednostka kątowa: - Unité angulaire + Unité angulaire : Winkeleinheit: Úhlová jednotka: Szögmértékegység: @@ -49,13 +50,29 @@ 角密位: 角密位: + + Degrees + Grad + Grados + Градусы + Stopnie + Degré + Stupně + Fok + Gradi + Graus + 角度 + 각도 + + + Mils Mil Mils Тысячные Tysiączne - Mils + Mil Mils Mil Mils @@ -71,7 +88,7 @@ Mostrar puntos de ruta en el mapa: Показывать маршрутные точки на карте: Pokaż PT na mapie: - Montrer points de passage sur la carte + Montrer les WP sur la carte : Ukázat waypointy na mapě: Útvonalpontok mutatása a térképen: Mostra waypoint sulla mappa: @@ -81,26 +98,10 @@ 显示路径点在地图上: 顯示路徑點在地圖上: - - Degrees - Grad - Grados - Градусы - Stopnie - Degrés - Stupně - Fok - Gradi - Graus - 角度 - 각도 - - - On Zapnuto - Allumé + Actif Ein Acceso Wł. @@ -112,11 +113,12 @@ 켜기 开启 開啟 + Açık Off Vypnuto - Eteint + Inactif Aus Spento Wył. @@ -128,6 +130,7 @@ 끄기 关闭 關閉 + Kapalı Enter Grid Cords: @@ -139,7 +142,7 @@ Napiš souřadnice: Add meg a rácskoordinátákat: Introduci griglia coordinate: - Digite as Ccords. do Grid + Digite as Coords. do Grid 座標を入力: 输入网格座标: 輸入網格座標: @@ -151,7 +154,7 @@ Nombre de [%1] Название [%1] Nazwa [%1] - Nom de %1 + Nom de [%1] Název [%1] [%1] neve Nome di [%1] @@ -167,7 +170,7 @@ Nuevo-MGRS MGRS-Новая MGRS-Nowy - Info-MGRS + MGRS-Nouveau MGRS-Nový MGRS-új Nuovo MGRS @@ -199,7 +202,7 @@ Distanz: Дистанция: Dystans: - Distance: + Distance : Vzdálenost: Távolság: Distanza: @@ -231,7 +234,7 @@ Marca Отметка Oznacz - Marque + Marquer Označit Jelölés Marca @@ -248,7 +251,7 @@ Машрутные точки Waypointy Punkty trasy - Point de passage + Points de passage Útvonalpontok waypoints Waypoints @@ -296,11 +299,11 @@ Установить МТ Nastavit WP UstawPT - Définir point de passage + ChoixWP UP Beállítása Definisci WayPoints Definir WP - ウェイポイント設定 + WP設定 웨이포인트 설정 设置路径点 設置路徑點 @@ -312,7 +315,7 @@ Добавить Přidat Dodaj - Ajouter + Ajout Hozzáadás Aggiungi Adicionar @@ -324,7 +327,7 @@ Delete Smazat - Supprimer + Suppr. Löschen Elimina Usuń @@ -424,7 +427,7 @@ MicroDAGR - Vyplnění mapy MicroDAGR-Kartenfüllung Preenchimento de mapa do MicroDAGR - MicroDAGR - Remplissage de la carte + Contenu de la carte MicroDAGR térképkitöltés Заполнение карты MicroDAGR Riempimento Mappa MicroDAGR @@ -440,7 +443,7 @@ Wie viel Daten auf einem MicroDAGR zu sehen sind Kolik informací je načteno do MicroDAGR? Quanta informação é preenchida no mapa do MicroDAGR - Combien d'informations apparaissent sur la carte du MicroDAGR + Définit le type d'information à afficher sur la carte du MicroDAGR. Mennyi térképadatot tartalmaz a MicroDAGR Сколько данных должно отображаться на карте MicroDAGR Quanti dati sono trasferiti nella mappa del MicroDAGR @@ -456,7 +459,7 @@ Satellitenbild + Gebäude Satelit + Budovy Satélite completo + Edifícios - Satellite + Batiments + Image satellite + Bâtiments Teljes műholdas + épületek Спутник + Здания Satellite Completo + Edifici @@ -488,7 +491,7 @@ Keine (kann keine Kartenansicht verwenden) Žádný (Nelze použít zobrazení mapy) Nada (Não pode usar a tela de mapa) - Rien (La vue carte n'est pas possible) + Néant (carte désactivée) Semmi (nem használható a térképnézet) Не показывать (запрещает использовать режим карты) Nessuno (Non puoi usare la vista mappa) @@ -503,6 +506,11 @@ MicroDAGR - Precisione del Waypoint MicroDAGR - ウェイポイントの精度 MicroDAGR - Precyzja PT + MicroDAGR - Точность маршрутных точек + MicroDAGR - Precisão de Waypoint + Précision des points de passage + 微型軍用GPS接收器 - 導航精確度 + MicroDAGR - přesnost Waypointů Controls how precise the waypointdistance can be displayed @@ -510,6 +518,11 @@ Controlla quanto precisamente può essere visualizzato il waypoint a distanza 表示されるウェイポイントの精度を設定します Kontroluje jak precyzyjnie może być wyświetlany dystans PT + Управляет точностью отображения расстояний маршрутных точек + Controla o quão preciso pode exibir o waypoint de distância + Définit la précision d'affichage des points de passage. + 控制顯示的導航點精確度為多少 + Nastavuje jak přesně je vzdálenost waypointů zobrazena. 100m @@ -517,6 +530,12 @@ 100m 100m 100m + 100 м + 100m + 100 m + 一百公尺 + 100 m + 100m 10m @@ -524,6 +543,12 @@ 10m 10m 10m + 10 м + 10m + 10 m + 十公尺 + 10 m + 10m 1m @@ -531,6 +556,12 @@ 1m 1m 1m + 1 м + 1m + 1 m + 一公尺 + 1 m + 1m Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap. @@ -539,7 +570,7 @@ Steuert wie viel Daten auf dem microDAGR zu sehen ist. Weniger Daten schränken die Kartenansicht ein, um mehr auf der Minimap zu sehen. Tento modul umožňuje kontrolovat, kolik informací je obsaženo v MicroDAGR. Menší množství dat omezené zobrazením mapy ukazují méně věcí na minimapě. Controla quantos dados são preenchidos nos itens microDAGR. Menos dados restringe a visualização de mapa para mostrar menos informações no minimapa. - Contrôle le nombre d'informations disponibles sur la carte du MicroDAGR. + Définit la quantité de données présentes dans le MicroDAGR.\nMoins de données force la carte à afficher moins d'informations sur la minimap. Meghatárroza a MicroDAGR objektumok térképének tartalmát. A kevesebb adat korlátozza a térképnézeti módot az eszközön. Контролирует, сколько данных должно отображаться на карте устройств MicroDAGR. Ограничивает объем отображаемых данных на миникарте. Controlla quanti dati sono presenti negli oggetti MicroDAGR. Meno dati costringono la vista mappa a mostrare meno informazioni nella minimappa. diff --git a/addons/minedetector/CfgEventHandlers.hpp b/addons/minedetector/CfgEventHandlers.hpp index f19d0e18ecd..e90bed419e7 100644 --- a/addons/minedetector/CfgEventHandlers.hpp +++ b/addons/minedetector/CfgEventHandlers.hpp @@ -1,3 +1,8 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); @@ -5,6 +10,6 @@ class Extended_PreInit_EventHandlers { }; class Extended_PostInit_EventHandlers { class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/minedetector/XEH_postInit.sqf b/addons/minedetector/XEH_postInit.sqf index 7ea04b5a5da..1c448794cc9 100644 --- a/addons/minedetector/XEH_postInit.sqf +++ b/addons/minedetector/XEH_postInit.sqf @@ -5,16 +5,12 @@ GVAR(detectorConfigs) = call CBA_fnc_createNamespace; // Create a dictionary of detectable classnames GVAR(detectableClasses) = call CBA_fnc_createNamespace; + +private _detectableClasses = call (uiNamespace getVariable [QGVAR(detectableClasses), {[]}]); //See XEH_preStart.sqf { - if ((getNumber (_x >> QGVAR(detectable))) == 1) then { - GVAR(detectableClasses) setVariable [configName _x, true]; - }; -} forEach (configProperties [configFile >> "CfgVehicles", "isClass _x", true]); -{ - if ((getNumber (_x >> QGVAR(detectable))) == 1) then { - GVAR(detectableClasses) setVariable [configName _x, true]; - }; -} forEach (configProperties [configFile >> "CfgAmmo", "isClass _x", true]); + GVAR(detectableClasses) setVariable [_x, true]; +} forEach _detectableClasses; +TRACE_1("built cache",count allVariables GVAR(detectableClasses)); [QGVAR(enableDetector), FUNC(enableDetector)] call CBA_fnc_addEventHandler; [QGVAR(disableDetector), FUNC(disableDetector)] call CBA_fnc_addEventHandler; diff --git a/addons/minedetector/XEH_preStart.sqf b/addons/minedetector/XEH_preStart.sqf new file mode 100644 index 00000000000..48f003d08e3 --- /dev/null +++ b/addons/minedetector/XEH_preStart.sqf @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" + +// Cache detectable classes, see XEH_postInit.sqf +private _detectableClasses = []; +{ + if ((getNumber (_x >> QGVAR(detectable))) == 1) then { + _detectableClasses pushBackUnique configName _x; + }; +} forEach (configProperties [configFile >> "CfgVehicles", "isClass _x", true]); +{ + if ((getNumber (_x >> QGVAR(detectable))) == 1) then { + _detectableClasses pushBackUnique configName _x; + }; +} forEach (configProperties [configFile >> "CfgAmmo", "isClass _x", true]); + +TRACE_1("compiled",count _detectableClasses); +uiNamespace setVariable [QGVAR(detectableClasses), compileFinal str _detectableClasses]; diff --git a/addons/minedetector/functions/fnc_isDetectorEnabled.sqf b/addons/minedetector/functions/fnc_isDetectorEnabled.sqf index 95ff89fa650..4b18d417bc4 100644 --- a/addons/minedetector/functions/fnc_isDetectorEnabled.sqf +++ b/addons/minedetector/functions/fnc_isDetectorEnabled.sqf @@ -10,7 +10,7 @@ * None * * Example: - * ["example"] call ace_minedetector_fnc_[functionName] + * ["example"] call ace_minedetector_fnc_isDetectorEnabled * * Public: No */ diff --git a/addons/minedetector/sounds/metal_detector.wav b/addons/minedetector/sounds/metal_detector.wav index 59f3b43ebef..f07e1280610 100644 Binary files a/addons/minedetector/sounds/metal_detector.wav and b/addons/minedetector/sounds/metal_detector.wav differ diff --git a/addons/minedetector/sounds/metal_detector.wss b/addons/minedetector/sounds/metal_detector.wss index 3ba5d3b7e33..4fe2135cb17 100644 Binary files a/addons/minedetector/sounds/metal_detector.wss and b/addons/minedetector/sounds/metal_detector.wss differ diff --git a/addons/minedetector/stringtable.xml b/addons/minedetector/stringtable.xml index 72f389813f7..7dec7d1a807 100644 --- a/addons/minedetector/stringtable.xml +++ b/addons/minedetector/stringtable.xml @@ -13,6 +13,9 @@ Metal detector 金属探测器 金屬探測器 + Detector de Metais + Detector de metales + Metal Dedektör Metal detector @@ -26,6 +29,9 @@ Metal detector 金属探测器 金屬探測器 + Detector de Metais + Detector de metales + Metal Dedektör Activate @@ -39,6 +45,9 @@ Attiva 启用探测器 啟用探測器 + Ativar + Activar + Aktif Deactivate @@ -52,6 +61,9 @@ Disattiva 停用探测器 停用探測器 + Desativar + Desactivar + Aktif Değil Connect Headphones @@ -65,6 +77,9 @@ Connetti Auricolari 连接耳机 連接耳機 + Conectar fones de ouvido + Conectar auriculares + Kulaklığını Bağla Disconnect Headphones @@ -78,6 +93,9 @@ Disconnetti Auricolari 断开耳机 斷開耳機 + Desconectar fones de ouvido + Desconectar auriculares + Kulaklığının Bağlantısını Kes Headphones Connected @@ -91,6 +109,9 @@ Auricolari Connessi 已连接耳机 已連接耳機 + Fones de ouvido conectados + Auriculares conectados + Kulaklık Bağlandı Headphones Disconnected @@ -104,6 +125,9 @@ Auricolari Disconnessi 已断开耳机 已斷開耳機 + Fones de ouvido conectados + Auriculares desconectados + Kulaklık Çıkartıldı diff --git a/addons/missileguidance/ACE_GuidanceConfig.hpp b/addons/missileguidance/ACE_GuidanceConfig.hpp index f202e7d1614..8e3324b09df 100644 --- a/addons/missileguidance/ACE_GuidanceConfig.hpp +++ b/addons/missileguidance/ACE_GuidanceConfig.hpp @@ -41,6 +41,22 @@ class GVAR(AttackProfiles) { functionName = QFUNC(attackProfile_JAV_TOP); }; + class WIRE { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_WIRE); + onFired = QFUNC(wire_onFired); + }; + class BEAM { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_BEAM); + onFired = QFUNC(wire_onFired); // since Beam guidance is pretty much the same as Wire guidance, we can reuse this + }; }; class GVAR(SeekerTypes) { @@ -58,4 +74,20 @@ class GVAR(SeekerTypes) { functionName = QFUNC(seekerType_Optic); }; + class SACLOS { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(seekerType_SACLOS); + onFired = QFUNC(SACLOS_onFired); + }; + class ARH { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(seekerType_ARH); + onFired = QFUNC(ahr_onFired); + }; }; diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index 7c2fb90d22c..d2d5c1ecf00 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -93,6 +93,7 @@ class CfgAmmo { // Attack profile type selection defaultAttackProfile = "JAV_TOP"; attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; + useModeForAttackProfile = 1; }; }; class ACE_Javelin_FGM148_static: ACE_Javelin_FGM148 { diff --git a/addons/missileguidance/XEH_PREP.hpp b/addons/missileguidance/XEH_PREP.hpp index ee2b7328cb6..075f2f03c59 100644 --- a/addons/missileguidance/XEH_PREP.hpp +++ b/addons/missileguidance/XEH_PREP.hpp @@ -10,7 +10,7 @@ PREP(onFired); PREP(onIncomingMissile); PREP(guidancePFH); -PREP(doAttackProfile); +PREP(doAttackProfile); PREP(doSeekerSearch); PREP(doHandoff); @@ -22,6 +22,8 @@ PREP(attackProfile_DIR); PREP(attackProfile_HI); PREP(attackProfile_LIN); PREP(attackProfile_MID); +PREP(attackProfile_WIRE); +PREP(attackProfile_BEAM); // Javelin profiles PREP(attackProfile_JAV_DIR); @@ -30,3 +32,12 @@ PREP(attackProfile_JAV_TOP); // Seeker search functions PREP(seekerType_SALH); PREP(seekerType_Optic); +PREP(seekerType_SACLOS); +PREP(seekerType_ARH); + +// Attack Profiles OnFired +PREP(wire_onFired); + +// Seeker OnFired +PREP(SACLOS_onFired); +PREP(ahr_onFired); diff --git a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf new file mode 100644 index 00000000000..7ef06487e04 --- /dev/null +++ b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Sets up SACLOS state arrays (called from missileGuidance's onFired). + * + * Arguments: + * Guidance Arg Array + * + * Return Value: + * None + * + * Example: + * [] call ace_missileguidance_fnc_SACLOS_onFired + * + * Public: No + */ +params ["_firedEH", "", "", "", "_stateParams"]; +_firedEH params ["_shooter","_weapon","","","","","_projectile"]; +_stateParams params ["", "_seekerStateParams"]; + +private _config = ([_projectile] call CBA_fnc_getObjectConfig) >> "ace_missileguidance"; + +if (_shooter isKindOf "Plane" && { !hasPilotCamera _shooter }) exitWith { WARNING("SACLOS fired from planes without camera unsupported"); }; + +private _turretPath = [_shooter, _weapon] call CBA_fnc_turretPathWeapon; +private _turretConfig = [_shooter, _turretPath] call CBA_fnc_getTurret; +private _memoryPointGunnerOptics = getText(_turretConfig >> "memoryPointGunnerOptics"); +private _animationSourceBody = getText(_turretConfig >> "animationSourceBody"); +private _animationSourceGun = getText(_turretConfig >> "animationSourceGun"); +_seekerStateParams set [0, _memoryPointGunnerOptics]; +_seekerStateParams set [1, _animationSourceBody]; +_seekerStateParams set [2, _animationSourceGun]; + diff --git a/addons/missileguidance/functions/fnc_ahr_onFired.sqf b/addons/missileguidance/functions/fnc_ahr_onFired.sqf new file mode 100644 index 00000000000..331484f4a29 --- /dev/null +++ b/addons/missileguidance/functions/fnc_ahr_onFired.sqf @@ -0,0 +1,73 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Sets up Active Radar state arrays (called from missileGuidance's onFired). + * + * Arguments: + * Guidance Arg Array + * + * Return Value: + * None + * + * Example: + * [] call ace_missileguidance_fnc_ahr_onFired + * + * Public: No + */ +params ["_firedEH", "_launchParams", "", "", "_stateParams"]; +_firedEH params ["_shooter","","","","","","_projectile"]; +_stateParams params ["", "_seekerStateParams"]; +_launchParams params ["","_targetLaunchParams"]; +_targetLaunchParams params ["_target"]; + +_target = missileTarget _projectile; +if (isNull _target && isVehicleRadarOn vehicle _shooter) then { + _target = cursorTarget; +}; +if !(_target isKindOf "AllVehicles") then { + _target = nil; +}; +_launchParams set [0, _target]; +_projectile setMissileTarget objNull; // to emulate a no launch warning + +private _projectileConfig = [_projectile] call CBA_fnc_getObjectConfig; +private _config = _projectileConfig >> "ace_missileguidance"; + +private _isActive = false; +private _activeRadarDistance = [_config >> "activeRadarEngageDistance", "NUMBER", 500] call CBA_fnc_getConfigEntry; +private _projectileThrust = [_projectileConfig >> "thrust", "NUMBER", 0] call CBA_fnc_getConfigEntry; +private _projectileThrustTime = [_projectileConfig >> "thrustTime", "NUMBER", 0] call CBA_fnc_getConfigEntry; + +private _velocityAtImpact = _projectileThrust * _projectileThrustTime; +private _timeToActive = 0; +if (!isNil "_target" && _velocityAtImpact > 0) then { + private _distanceUntilActive = (((getPosASL _shooter) vectorDistance (getPosASL _target)) - _activeRadarDistance); + _timeToActive = 0 max (_distanceUntilActive / _velocityAtImpact); +}; + +if (isNil "_target") then { + _timeToActive = 0; + _isActive = true; + _target = objNull; +}; + +private _shooterHasActiveRadar = { + if ("ActiveRadarSensorComponent" in _x) exitWith { true }; + false +} forEach listVehicleSensors vehicle _shooter; + +if !(isVehicleRadarOn vehicle _shooter) then { + _isActive = true; +}; + +_seekerStateParams set [0, _isActive]; +_seekerStateParams set [1, _activeRadarDistance]; +_seekerStateParams set [2, CBA_missionTime + _timeToActive]; +_seekerStateParams set [3, getPosASL _target]; +_seekerStateParams set [4, CBA_missionTime]; +_seekerStateParams set [5, _shooterHasActiveRadar]; +_seekerStateParams set [6, false]; +_seekerStateParams set [7, [0, 0, 0]]; +_seekerStateParams set [8, CBA_missionTime]; +_seekerStateParams set [9, isNull _target]; + diff --git a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf new file mode 100644 index 00000000000..7e9408b2d71 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf @@ -0,0 +1,47 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Attack profile: Beam guided. Exact same as wire-guided, except no wire cutting + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_BEAM; + * + * Public: No + */ +params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; +_args params ["_firedEH"]; +_firedEH params ["_shooter","","","","","","_projectile"]; +_attackProfileStateParams params["_maxCorrectableDistance", "_wireCut", "_randomVector", "_crosshairOffset", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_distanceAheadOfMissile"]; + +private _projectilePos = getPosASL _projectile; +private _shooterPos = getPosASL _shooter; + +private _shooterDir = vectorNormalized(_seekerTargetPos vectorDiff _shooterPos); +private _distanceToProjectile = _shooterPos vectorDistanceSqr _projectilePos; + +if (_distanceToProjectile > _seekerMaxRangeSqr || { _seekerTargetPos isEqualTo [0, 0, 0] } || { _distanceToProjectile < _seekerMinRangeSqr }) exitWith { + // return position 50m infront of projectile + _projectilePos vectorAdd (_projectile vectorModelToWorld [0, 50, 0]) +}; + +private _relativeCorrection = _projectile vectorWorldToModel (_projectilePos vectorDiff _seekerTargetPos); +_relativeCorrection = _relativeCorrection vectorDiff _crosshairOffset; + +private _magnitude = vectorMagnitude [_relativeCorrection select 0, 0, _relativeCorrection select 2]; +private _fovImpulse = 1 min (_magnitude / _maxCorrectableDistance); // the simulated impulse for the missile being close to the center of the crosshair + +// Adjust the impulse due to near-zero values creating wobbly missiles? +private _correction = _fovImpulse; + + +_relativeCorrection = (vectorNormalized _relativeCorrection) vectorMultiply _correction; +private _returnPos = _projectilePos vectorDiff (_projectile vectorModelToWorld _relativeCorrection); +_returnPos vectorAdd (_shooterDir vectorMultiply _distanceAheadOfMissile) diff --git a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf new file mode 100644 index 00000000000..6d881978198 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf @@ -0,0 +1,63 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Attack profile: Wire guided + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_WIRE; + * + * Public: No + */ +params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; +_args params ["_firedEH"]; +_firedEH params ["_shooter","","","","","","_projectile"]; +_attackProfileStateParams params["_maxCorrectableDistance", "_wireCut", "_randomVector", "_crosshairOffset", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_distanceAheadOfMissile"]; + +private _projectilePos = getPosASL _projectile; +private _shooterPos = getPosASL _shooter; + +private _shooterDir = vectorNormalized(_seekerTargetPos vectorDiff _shooterPos); +private _distanceToProjectile = _shooterPos vectorDistanceSqr _projectilePos; + +if ((_distanceToProjectile > _seekerMaxRangeSqr) || { _wireCut }) exitWith { + // wire snap, random direction + if (_randomVector isEqualTo [0, 0, 0]) then { + _randomVector = RANDOM_VECTOR_3D vectorMultiply 300; + _attackProfileStateParams set [1, true]; + _attackProfileStateParams set [2, _randomVector]; + + playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLtoASL (_shooter modelToWorld _wireCutSource), 5, 1, 150]; + }; + _projectilePos vectorAdd _randomVector +}; + +if (_seekerTargetPos isEqualTo [0, 0, 0] || { _distanceToProjectile < _seekerMinRangeSqr }) exitWith { + // cut wire if its caught on terrain + /*if !(lineIntersectsSurfaces [getPosASL _shooter, _projectilePos, _shooter] isEqualTo []) then { + _attackProfileStateParams set [1, true]; + };*/ + // return position 50m infront of projectile + _projectilePos vectorAdd (_projectile vectorModelToWorld [0, 50, 0]) +}; + +private _relativeCorrection = _projectile vectorWorldToModel (_projectilePos vectorDiff _seekerTargetPos); +_relativeCorrection = _relativeCorrection vectorDiff _crosshairOffset; + +private _magnitude = vectorMagnitude [_relativeCorrection select 0, 0, _relativeCorrection select 2]; +private _fovImpulse = 1 min (_magnitude / _maxCorrectableDistance); // the simulated impulse for the missile being close to the center of the crosshair + +// Adjust the impulse due to near-zero values creating wobbly missiles? +private _correction = _fovImpulse; + + +_relativeCorrection = (vectorNormalized _relativeCorrection) vectorMultiply _correction; +private _returnPos = _projectilePos vectorDiff (_projectile vectorModelToWorld _relativeCorrection); +_returnPos vectorAdd (_shooterDir vectorMultiply _distanceAheadOfMissile) diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf index 205ff3d4efd..838254e9505 100644 --- a/addons/missileguidance/functions/fnc_checkLos.sqf +++ b/addons/missileguidance/functions/fnc_checkLos.sqf @@ -1,23 +1,29 @@ #include "script_component.hpp" /* * Author: jaynus - * Returns whether the seeker object can see the target position with lineIntersect + * Returns whether the seeker object can see the target position with checkVisibility * * Arguments: * 0: Seeker * 1: Target + * 2: Whether or not to use checkVisibility to test for LOS * * Return Value: * Has LOS * * Example: - * [player, cursorTarget] call ace_missileguidance_fnc_checkLOS; + * [player, cursorTarget] call ace_missileguidance_fnc_checkLos; * * Public: No */ -params ["_seeker", "_target"]; +params ["_seeker", "_target", ["_checkVisibilityTest", true]]; +// Boolean checkVisibilityTest so that if the seeker type is one that ignores smoke we revert back to raw LOS checking. +if (_checkVisibilityTest) exitWith { + private _visibility = [_seeker, "VIEW", _target] checkVisibility [getPosASL _seeker, aimPos _target]; + _visibility > 0.001 +}; if ((isNil "_seeker") || {isNil "_target"}) exitWith { ERROR_2("nil",_seeker,_target); false @@ -36,4 +42,5 @@ if (!((terrainIntersectASL [_seekerPos, _targetPos]) && {terrainIntersectASL [_s _return = false; }; -_return; +_return + diff --git a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf index 45e2c4f9002..adfd1b5e01d 100644 --- a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf +++ b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf @@ -23,18 +23,19 @@ if (!([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) private _currentShooter = objNull; private _currentMagazine = ""; +private _turretPath = []; if (isNull (ACE_controlledUAV param [0, objNull])) then { if (((vehicle ACE_player) == ACE_player) || {ACE_player call CBA_fnc_canUseWeapon}) then { _currentShooter = ACE_player; _currentMagazine = currentMagazine ACE_player; } else { _currentShooter = vehicle ACE_player; - private _turretPath = if (ACE_player == (driver _currentShooter)) then {[-1]} else {ACE_player call CBA_fnc_turretPath}; + _turretPath = if (ACE_player == (driver _currentShooter)) then {[-1]} else {ACE_player call CBA_fnc_turretPath}; _currentMagazine = _currentShooter currentMagazineTurret _turretPath; }; } else { _currentShooter = ACE_controlledUAV select 0; - private _turretPath = ACE_controlledUAV select 2; + _turretPath = ACE_controlledUAV select 2; _currentMagazine = _currentShooter currentMagazineTurret _turretPath; }; @@ -47,6 +48,11 @@ TRACE_3("",_currentShooter,_currentMagazine,_ammo); // Bail if guidance is disabled for this ammo if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "enabled")) != 1) exitWith {TRACE_1("not enabled",_ammo)}; +private _useModeForAttackProfile = (getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "useModeForAttackProfile")) == 1; +private _weaponStateToken = if (_currentShooter isEqualTo ACE_player) then { _currentShooter } else { [_currentShooter, _turretPath] }; +(weaponState _weaponStateToken) params ["_weapon", "", "_mode"]; +TRACE_4("",_useModeForAttackProfile,_weaponStateToken,_weapon,_mode); + // Verify ammo has explicity added guidance config (ignore inheritances) private _configs = configProperties [(configFile >> "CfgAmmo" >> _ammo), QUOTE(configName _x == QUOTE(QUOTE(ADDON))), false]; if ((count _configs) < 1) exitWith {TRACE_2("not explicity enabled",_ammo,_configs)}; @@ -54,7 +60,11 @@ if ((count _configs) < 1) exitWith {TRACE_2("not explicity enabled",_ammo,_confi private _attackProfiles = getArray (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "attackProfiles"); if ((count _attackProfiles) <= 1) exitWith {TRACE_1("no choices for attack profile",_attackProfiles)}; -private _currentFireMode = _currentShooter getVariable [QGVAR(attackProfile), "#undefined"]; +private _currentFireMode = if (_useModeForAttackProfile) then { + getText (configFile >> "CfgWeapons" >> _weapon >> _mode >> QGVAR(attackProfile)) +} else { + _currentShooter getVariable [QGVAR(attackProfile), "#undefined"] +}; // Just like onFired, this is case sensitive! private _index = _attackProfiles find _currentFireMode; @@ -65,7 +75,21 @@ _index = (_index + 1) % (count _attackProfiles); private _nextFireMode = _attackProfiles select _index; TRACE_4("",_currentFireMode,_nextFireMode,_index,_attackProfiles); -_currentShooter setVariable [QGVAR(attackProfile), _nextFireMode, false]; + +private _currentFireMode = if (_useModeForAttackProfile) then { + TRACE_2("setting fire mode",_weaponStateToken,_nextFireMode); + for "_weaponIndex" from 0 to 299 do { + ACE_player action ["SwitchWeapon", _currentShooter, ACE_player, _weaponIndex]; + (weaponState _weaponStateToken) params ["_xWeapon", "", "_xMode"]; + if ((_xWeapon == _weapon) && {(getText (configFile >> "CfgWeapons" >> _weapon >> _xMode >> QGVAR(attackProfile))) == _nextFireMode}) exitWith { + TRACE_2("Restoring",_weaponIndex,weaponState _currentShooter); + }; + if ((weaponState _weaponStateToken) isEqualTo ["","","","",0]) exitWith {ERROR_2("weaponState not found",_weapon,_nextFireMode);}; + }; +} else { + TRACE_2("setVariable attackProfile",_currentShooter,_nextFireMode); + _currentShooter setVariable [QGVAR(attackProfile), _nextFireMode, false]; +}; playSound "ACE_Sound_Click"; diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf index feb13481a5a..e1078054965 100644 --- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -12,7 +12,7 @@ * Missile Aim PosASL * * Example: - * [[], [], []] call ace_missileguidance_fnc_seekerType_Optic; + * [[], [], []] call ace_missileguidance_fnc_doSeekerSearch; * * Public: No */ diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index 8196de80573..e218e27e546 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -55,7 +55,8 @@ private _seekerTargetPos = [[0,0,0], _args, _seekerStateParams, _lastKnownPosSta private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStateParams] call FUNC(doAttackProfile); // If we have no seeker target, then do not change anything -if (!(_profileAdjustedTargetPos isEqualTo [0,0,0])) then { +// If there is no deflection on the missile, this cannot change and therefore is redundant. Avoid calculations for missiles without any deflection +if ((_minDeflection != 0 || {_maxDeflection != 0}) && {!(_profileAdjustedTargetPos isEqualTo [0,0,0])}) then { private _targetVector = _projectilePos vectorFromTo _profileAdjustedTargetPos; private _adjustVector = _targetVector vectorDiff (vectorDir _projectile); diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index eb4d2051cf8..422639c452a 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -17,7 +17,7 @@ * Public: No */ -params ["_shooter","","","","_ammo","","_projectile"]; +params ["_shooter","_weapon","","_mode","_ammo","","_projectile"]; // Bail on not missile if (!(_ammo isKindOf "MissileBase")) exitWith {}; @@ -44,6 +44,9 @@ private _target = _shooter getVariable [QGVAR(target), nil]; private _targetPos = _shooter getVariable [QGVAR(targetPosition), nil]; private _seekerType = _shooter getVariable [QGVAR(seekerType), nil]; private _attackProfile = _shooter getVariable [QGVAR(attackProfile), nil]; +if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "useModeForAttackProfile")) == 1) then { + _attackProfile = getText (configFile >> "CfgWeapons" >> _weapon >> _mode >> QGVAR(attackProfile)) +}; private _lockMode = _shooter getVariable [QGVAR(lockMode), nil]; private _laserCode = _shooter getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE]; @@ -109,45 +112,38 @@ private _args = [_this, [ getNumber ( _config >> "seekerAngle" ), getNumber ( _config >> "seekerAccuracy" ), - getNumber ( _config >> "seekerMaxRange" ) + getNumber ( _config >> "seekerMaxRange" ), + getNumber ( _config >> "seekerMinRange" ) ], [ diag_tickTime, [], [], _lastKnownPosState] ]; +private _onFiredFunc = getText (configFile >> QGVAR(SeekerTypes) >> _seekerType >> "onFired"); +TRACE_1("",_onFiredFunc); +if (_onFiredFunc != "") then { + _args call (missionNamespace getVariable _onFiredFunc); +}; + +_onFiredFunc = getText (configFile >> QGVAR(AttackProfiles) >> _attackProfile >> "onFired"); +TRACE_1("",_onFiredFunc); +if (_onFiredFunc != "") then { + _args call (missionNamespace getVariable _onFiredFunc); +}; // Run the "onFired" function passing the full guidance args array -private _onFiredFunc = getText (_config >> "onFired"); +_onFiredFunc = getText (_config >> "onFired"); TRACE_1("",_onFiredFunc); if (_onFiredFunc != "") then { _args call (missionNamespace getVariable _onFiredFunc); }; - - + // Reverse: // _args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"]; // _firedEH params ["_shooter","","","","_ammo","","_projectile"]; // _launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo"]; // _targetLaunchParams params ["_target", "_targetPos", "_launchPos"]; // _stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState"]; -// _seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange"]; - - -// Hand off to the guiding unit. We just use local player so local PFH fires for now -// Laser code needs to give us a shooter for LOBL, or the seeker unit needs to be able to shift locality -// Based on its homing laser -// Lasers need to be handled in a special LOAL/LOBL case - -//if (isPlayer _shooter) then { -// private _guidingUnit = ACE_player; -// -// if (local _guidingUnit) then { -// [FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; -// } else { -// [QGVAR(handoff), [_guidingUnit, _args] ] call FUNC(doHandoff); -// }; -//} else { - // [FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; -//}; +// _seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"]; [FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf index 04ad0c79b7c..045fffaaa1c 100644 --- a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf +++ b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [cursorTarget, "x", player] call ace_missileguidance_fnc_changeMissileDirection; + * [cursorTarget, "x", player] call ace_missileguidance_fnc_onIncomingMissile; * * Public: No */ diff --git a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf new file mode 100644 index 00000000000..9244090af70 --- /dev/null +++ b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf @@ -0,0 +1,119 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Active Radar Homing seeker + * + * Arguments: + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Seeker Pos + * + * Example: + * [] call call ace_missileguidance_fnc_seekerType_ARH; + * + * Public: No + */ +params ["", "_args", "_seekerStateParams"]; +_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams"]; +_firedEH params ["_shooter","","","","","","_projectile"]; +_launchParams params ["_target","","","",""]; +_seekerParams params ["_seekerAngle", "", "_seekerMaxRange"]; +_seekerStateParams params ["_isActive", "_activeRadarEngageDistance", "_timeWhenActive", "_expectedTargetPos", "_lastTargetPollTime", "_shooterHasRadar", "_wasActive", "_lastKnownVelocity", "_lastTimeSeen", "_doesntHaveTarget"]; + +if (_isActive || { CBA_missionTime >= _timeWhenActive }) then { + if !(_isActive) then { + _seekerStateParams set [0, true]; + }; + if !(_wasActive) then { + _seekerStateParams set [6, true]; + TRACE_1("Missile Pitbull",_seekerStateParams); + }; + // Internal radar homing + // For performance reasons only poll for target every so often instead of each frame + if ((_lastTargetPollTime + ACTIVE_RADAR_POLL_FREQUENCY) - CBA_missionTime < 0) then { + private _searchPos = _expectedTargetPos; + if (_searchPos isEqualTo [0, 0, 0] || { _doesntHaveTarget }) then { + _seekerStateParams set [9, true]; + // no target pos - shot without lock. Have the missile's radar search infront of it on the ground + _searchPos = (getPosASL _projectile) vectorAdd (_projectile vectorModelToWorld [0, _seekerMaxRange, -((getPos _projectile)#2)]); + }; + + _target = objNull; + _lastTargetPollTime = CBA_missionTime; + _seekerStateParams set [4, _lastTargetPollTime]; + private _distanceToExpectedTarget = _seekerMaxRange min ((getPosASL _projectile) vectorDistance _searchPos); + + // Simulate how much the seeker can see at the ground + private _projDir = vectorDir _projectile; + private _projYaw = getDir _projectile; + private _rotatedYaw = (+(_projDir select 0) * sin _projYaw) + (+(_projDir select 1) * cos _projYaw); + if (_rotatedYaw isEqualTo 0) then { _rotatedYaw = 0.001 }; + private _projPitch = atan ((_projDir select 2) / _rotatedYaw); + private _a1 = abs _projPitch; + private _a2 = 180 - ((_seekerAngle / 2) + _a1); + private _seekerBaseRadiusAtGround = ACTIVE_RADAR_MINIMUM_SCAN_AREA max (_distanceToExpectedTarget / sin(_a2) * sin(_seekerAngle / 2)); + private _seekerBaseRadiusAdjusted = linearConversion [0, _seekerBaseRadiusAtGround, (CBA_missionTime - _lastTimeSeen) * vectorMagnitude _lastKnownVelocity, ACTIVE_RADAR_MINIMUM_SCAN_AREA, _seekerBaseRadiusAtGround, false]; + if (_doesntHaveTarget) then { + _seekerBaseRadiusAdjusted = _seekerBaseRadiusAtGround; + }; + // Look in front of seeker for any targets + private _nearestObjects = nearestObjects [_searchPos, ["Air", "LandVehicle", "Ship"], _seekerBaseRadiusAdjusted, false]; + + _nearestObjects = _nearestObjects apply { + // I check both Line of Sight versions to make sure that a single bush doesnt make the target lock dissapear but at the same time ensure that this can see through smoke. Should work 80% of the time + if ([_projectile, getPosASL _x, _seekerAngle] call FUNC(checkSeekerAngle) && { ([_projectile, _x, true] call FUNC(checkLOS)) || { ([_projectile, _x, false] call FUNC(checkLOS)) } }) then { + _x + } else { + objNull + }; + }; + _nearestObjects = _nearestObjects select { !isNull _x }; + + // Select closest object to the expected position to be the current radar target + if ((count _nearestObjects) <= 0) exitWith { + _projectile setMissileTarget objNull; + _searchPos + }; + private _closestDistance = _seekerBaseRadiusAtGround; + { + if ((_x distance2d _searchPos) < _closestDistance) then { + _closestDistance = _x distance2d _searchPos; + _target = _x; + }; + } forEach _nearestObjects; + _expectedTargetPos = _searchPos; + }; + + _projectile setMissileTarget _target; +} else { + #ifdef DRAW_GUIDANCE_INFO + _seekerTypeName = "AHR - EXT"; + #endif + // External radar homing + // if the target is in the remote targets for the side, whoever the donor is will "datalink" the target for the hellfire. + private _remoteTargets = listRemoteTargets side _shooter; + if ((_remoteTargets findIf { (_target in _x) && (_x#1 > 0) }) < 0) then { + // I check both Line of Sight versions to make sure that a single bush doesnt make the target lock dissapear but at the same time ensure that this can see through smoke. Should work 80% of the time + if (!_shooterHasRadar || { !isVehicleRadarOn vehicle _shooter } || { !alive vehicle _shooter } || { !([vehicle _shooter, _target, true] call FUNC(checkLOS)) && { !([vehicle _shooter, _target, false] call FUNC(checkLOS)) } }) then { + _seekerStateParams set [0, true]; + _target = objNull; // set up state for active guidance + }; + }; +}; + +if !(isNull _target) then { + private _centerOfObject = getCenterOfMass _target; + private _targetAdjustedPos = _target modelToWorldWorld _centerOfObject; + _expectedTargetPos = _targetAdjustedPos; + + _seekerStateParams set [3, _expectedTargetPos]; + _seekerStateParams set [7, velocity _target]; + _seekerStateParams set [8, CBA_missionTime]; + _seekerStateParams set [9, false]; +}; + +_launchParams set [0, _target]; +_expectedTargetPos + diff --git a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf new file mode 100644 index 00000000000..539ee997d64 --- /dev/null +++ b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf @@ -0,0 +1,62 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * SACLOS seeker + * + * Arguments: + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Position of wanted missile pos relative to the camera direction + * + * Example: + * [] call ace_missileguidance_fnc_seekerType_SACLOS + * + * Public: No + */ +params ["", "_args"]; +_args params ["_firedEH", "", "", "_seekerParams", "_stateParams"]; +_firedEH params ["_shooter","_weapon","","","","","_projectile"]; +_seekerParams params ["_seekerAngle"]; +_stateParams params ["", "_seekerStateParams"]; +_seekerStateParams params ["_memoryPointGunnerOptics", "_animationSourceBody", "_animationSourceGun"]; + +private _shooterPos = AGLToASL (_shooter modelToWorld(_shooter selectionPosition _memoryPointGunnerOptics)); +private _projPos = getPosASL _projectile; + +private _lookDirection = if !(_shooter isKindOf "CAManBase" || {_shooter isKindOf "StaticWeapon"}) then { + private _finalLookDirection = if (_shooter isKindOf "Plane") then { + _shooterPos = _shooter modelToWorldVisualWorld getPilotCameraPosition _shooter; + private _trackingTarget = getPilotCameraTarget _shooter; + _trackingTarget params ["_isTracking", "_trackingPos"]; + // Because ARMA doesnt update the camera rotation if you are locked on immediatly, we have to calculate the look direction manually or else the SACLOS target will be wrong, especially if shooter is moving + if (_isTracking) then { + vectorNormalized (_trackingPos vectorDiff _shooterPos); + } else { + _shooter vectorModelToWorldVisual getPilotCameraDirection _shooter; + }; + } else { + private _gBody = -deg(_shooter animationPhase _animationSourceBody); + private _gGun = deg(_shooter animationPhase _animationSourceGun); + _shooter vectorModelToWorldVisual ([1, _gBody, _gGun] call CBA_fnc_polar2vect); + }; + _finalLookDirection +} else { + _shooterPos = eyePos _shooter; + _shooter weaponDirection _weapon +}; + +private _distanceToProj = _shooterPos vectorDistance _projPos; +private _testPointVector = vectorNormalized (_projPos vectorDiff _shooterPos); +private _testDotProduct = (_lookDirection vectorDotProduct _testPointVector); + +private _testIntersections = lineIntersectsSurfaces [_shooterPos, _projPos, _shooter]; + +if ((_testDotProduct < (cos _seekerAngle)) || { !(_testIntersections isEqualTo []) }) exitWith { + // out of LOS of seeker + [0, 0, 0] +}; + +_shooterPos vectorAdd (_lookDirection vectorMultiply _distanceToProj); + diff --git a/addons/missileguidance/functions/fnc_wire_onFired.sqf b/addons/missileguidance/functions/fnc_wire_onFired.sqf new file mode 100644 index 00000000000..295d6a2b5a1 --- /dev/null +++ b/addons/missileguidance/functions/fnc_wire_onFired.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: Brandon (TCVM) + * Sets up wireGuided state arrays (called from missileGuidance's onFired). + * + * Arguments: + * Guidance Arg Array + * + * Return Value: + * None + * + * Example: + * [] call ace_missileguidance_fnc_wire_onFired + * + * Public: No + */ +params ["_firedEH", "", "", "_seekerParams", "_stateParams"]; +_firedEH params ["_shooter","_weapon","","","","","_projectile", "_gunner"]; +_stateParams params ["", "", "_attackProfileStateParams"]; +_seekerParams params ["", "", "_seekerMaxRange", "_seekerMinRange"]; + +private _config = ([_projectile] call CBA_fnc_getObjectConfig) >> "ace_missileguidance"; +private _maxCorrectableDistance = [_config >> "correctionDistance", "NUMBER", DEFAULT_CORRECTION_DISTANCE] call CBA_fnc_getConfigEntry; +private _distanceAheadOfMissile = [_config >> "missileLeadDistance", "NUMBER", DEFAULT_LEAD_DISTANCE] call CBA_fnc_getConfigEntry; +private _maxDistanceSqr = _seekerMaxRange * _seekerMaxRange; +private _minDistanceSqr = _seekerMinRange * _seekerMinRange; + +// AI don't know how to use the crosshair offset becauze they dum dum +private _crosshairOffset = if ((_gunner != ACE_PLAYER) && {_gunner != (ACE_controlledUAV select 1)}) then { + [0, 0, 0]; +} else { + [_config >> "offsetFromCrosshair", "ARRAY", [0, 0, 0]] call CBA_fnc_getConfigEntry +}; + +private _turretPath = [_shooter, _weapon] call CBA_fnc_turretPathWeapon; +private _turretConfig = [_shooter, _turretPath] call CBA_fnc_getTurret; + +private _wireCutSource = _shooter selectionPosition getText(_turretConfig >> "missileEnd"); + +_attackProfileStateParams set [0, _maxCorrectableDistance]; +_attackProfileStateParams set [1, false]; // _wireCut +_attackProfileStateParams set [2, [0, 0, 0]]; // _randomVector +_attackProfileStateParams set [3, _crosshairOffset]; // crosshair offset +_attackProfileStateParams set [4, _maxDistanceSqr]; // max distance squared used for wire cut +_attackProfileStateParams set [5, _minDistanceSqr]; +_attackProfileStateParams set [6, _wireCutSource]; +_attackProfileStateParams set [7, _distanceAheadOfMissile]; + diff --git a/addons/missileguidance/script_component.hpp b/addons/missileguidance/script_component.hpp index 298de3a0518..2b43be42f3c 100644 --- a/addons/missileguidance/script_component.hpp +++ b/addons/missileguidance/script_component.hpp @@ -16,3 +16,16 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define RANDOM_VECTOR_3D (call {\ + private _z = random 2 - 1;\ + private _r = sqrt (1 - _z^2);\ + private _theta = random 360;\ + [_r * cos _theta, _r * sin _theta, _z]\ +}) + +#define DEFAULT_CORRECTION_DISTANCE 2 +#define DEFAULT_LEAD_DISTANCE 5 +#define ACTIVE_RADAR_POLL_FREQUENCY (1 / 7) +#define ACTIVE_RADAR_MINIMUM_SCAN_AREA 30 + diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 1758dea3e3c..eb77ee12d45 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -9,13 +9,14 @@ Erweitertes Raketenlenksystem Pokročilé řízení střel Guida missili avanzata - Avançado Missile Guidance + Orientação avançada de Míssil Fejlett rakétairányító Продвинутое наведение ракет 高度なミサイルの誘導 고급 미사일 유도 进阶飞弹制导 進階飛彈制導 + Gelişmiş Füze Güdüm Sistemi Advanced missile guidance, or AMG, provides multiple enhancements to missile locking and firing. It is also a framework required for missile weapon types. @@ -24,7 +25,7 @@ Продвинутое наведение ракет, или ПНР, обеспечивает множество усовершествований для наведения и стрельбы ракет. Также, это система, необходимая для всех ракетных типов оружия. El guiado avanzado de misiles, o AMG en sus siglas en inglés, ofrece múltiples mejoras en el fijado y disparo de misiles. Es también un sistema requerido para armas de tipo misil. Das Erweiterte Raketenlenksystem, auch ERls genannt, bietet viele Verbesserungen zum Aufschalten und Feuern mittels gelenkter Raketen. - Le guidage avancé de missile, ou AMG en anglais, apporte de multiples améliorations au verouillage et au tir de missiles. C'est aussi un framework requis pour tout arme de type missile. + Le guidage avancé de missile, ou AMG en anglais, apporte de multiples améliorations au verrouillage et au tir de missiles. C'est aussi un framework requis pour toute arme de type missile. A fejlett rakétairányító (vagy AMG) többféle módosítást tartalmaz a rakéták célkövetéséhez és tüzeléséhez. Ez egy szükséges keresztrendszer a rakéta-alapú fegyverekhez. Orientação avançada de mísseis ou OAM, fornece vários aprimoramentos para travamento de mísseis e disparos. Também é um sistema requerido para disparar armas que utilizem mísseis. Pokočilé navádění raket (AMG) poskytuje několik vylepšení pro lepší zaměření a následnou střelbu. Je to prvek vyžadovaný u typu zbraní jako jsou rakety. @@ -32,11 +33,12 @@ 고급 미사일 유도 혹은 AMG 는 표적 획득 및 발사를 위한 여러 기능을 제공합니다. 미사일 종류에따라 체계가 필요합니다. 进阶飞弹制导增强了多种导弹锁定和射击的能力。此系统适用于所有飞弹类型的武器。 進階飛彈制導增強了多種導彈鎖定和射擊的能力。此系統適用於所有飛彈類型的武器 + Gelişmiş füze rehberliği veya AMG, füze kilitleme ve ateşleme için çoklu geliştirmeler sağlar. Hydra-70 DAGR Missile Misil Hydra-70 DAGR - Hydra-70 DAGR + Missile Hydra-70 DAGR Hydra-70 DAGR Hydra-70 DAGR Rakete Hydra-70 DAGR @@ -48,6 +50,7 @@ Hydra-70 DAGR 미사일 九头蛇-70 直接攻击导引飞弹 九頭蛇-70 直接攻擊導引飛彈 + Hydra-70 DAGR Füze DAGR @@ -64,11 +67,12 @@ DAGR 直接攻击制导火箭弹 直接攻擊導引飛彈 + DAGR Hydra-70 DAGR Laser Guided Missile Misil guiado por láser Hydra-70 DAGR - Missile à guidage laser Hydra-70 DAGR + Missile Hydra-70 DAGR, à guidage laser Laserowo naprowadzana rakieta Hydra-70 DAGR Hydra-70 DAGR lasergelenkte Rakete Hydra-70 DAGR laserem naváděná střela @@ -80,11 +84,12 @@ Hydra-70 DAGR 레이저 유도 미사일 九头蛇-70mm 制导航空火箭弹 九頭蛇-70 直接攻擊雷射導引飛彈 + Hydra-70 DAGR Lazer Güdümlü Füze Hellfire II AGM-114K Missile Misil Hellfire II AGM-114K - Hellfire II AGM-114K + Missile Hellfire II AGM-114K Hellfire II AGM-114K Hellfire II AGM-114K Hellfire II AGM-114K @@ -96,6 +101,7 @@ Hellfire II AGM-114K 미사일 地狱火II型AGM-114K空地制导破甲弹 地獄火II型 AGM-114K 導彈 + Hellfire II AGM-114K Füze AGM-114K @@ -112,11 +118,12 @@ AGM-114K AGM-114K制导破甲弹 AGM-114K + AGM-114K Hellfire II AGM-114K Laser Guided Missile Misil guiado por láser Hellfire II AGM-114K - Missile à guidage laser Hellfire II AGM-114K + Missile Hellfire II AGM-114K, à guidage laser Laserowo naprowadzana rakieta Hellfire II AGM-114K Hellfire II AGM-114K Lasergelenkte Rakete Hellfire II AGM-114K laserem naváděná střela @@ -128,6 +135,7 @@ Hellfire II AGM-114K 레이저 유도 미사일 地狱火II型AGM-114K空地制导破甲弹 地獄火II型 AGM-114K 雷射導引飛彈 + Hellfire II AGM-114K Lazer Güdümlü Füze Off @@ -136,7 +144,7 @@ Aus Vypnout Desligado - Eteint + Éteint Ki Выкл. Spento @@ -144,6 +152,7 @@ 끄기 关闭 關閉 + Kapalı Player Only @@ -160,6 +169,7 @@ 오직 플레이어만 只有玩家 只有玩家 + Sadece Oyuncular Player and AI @@ -176,6 +186,7 @@ 玩家和AI 玩家和AI 플레이어와 AI + Oyuncular ve AI Cycle Fire Mode @@ -183,7 +194,7 @@ Переключение режимов огня Přepínání režimů palby Przełącz tryb ognia - Cycle mode de tir + Guidage missiles - Changer le mode de tir Tüzelési mód váltása Alterna le modalità di fuoco Cambiar modo de disparo @@ -192,6 +203,7 @@ 발사 방식 순환 循环切换开火模式 循環切換開火模式 + Ateşleme Modunu Değiştir diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index cb28cb3d7e1..a9097784409 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -7,8 +7,8 @@ Módulo de misiones ACE ACE-Missionsmodule ACE Moduly mise - Módulo de missões ACE - ACE module de mission + ACE Módulo de missões + ACE modules de mission ACE küldetési modulok Модули миссий ACE Moduli Missione ACE @@ -16,6 +16,7 @@ ACE 미션 모듈 ACE 任务模块 ACE 任務模塊 + ACE Görev Modülleri Ambiance Sounds @@ -32,6 +33,7 @@ 환경 효과음 环境声音 環境聲音 + Ortam Sesleri Sounds @@ -48,6 +50,7 @@ 효과음 声音 聲音 + Sesler Class names of the ambiance sounds to be played. Seperated by ',' @@ -57,7 +60,7 @@ Class names zvuků prostředí, které budou přehrány. Oddělené ',' Nomes de classe dos sons de ambiente para serem reproduzidos. Separados por "," Имена классов звуков окружения, которые должны проигрываться. Разделенные ',' - ClassNames des sons d'ambiances. Séparation par "," + ClassNames des sons d'ambiance, séparées par une virgule. Nomi classi dei suoni ambientali da eseguire. Separati da ',' 再生する環境音のクラスネームを記載。','で複数指定できます。 재생되는 환경 효과음의 단위와 이름입니다. ','로 구분됩니다. @@ -79,6 +82,7 @@ 최소 거리 最小距离 最小距離 + Minimum Mesafe Used for calculating a random position and sets the minimal distance between the players and the played sound file(s) @@ -87,7 +91,7 @@ Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Mindestabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest Používá se pro výpočet náhodné pozice a určuje minimální vzdálenost mezi hráči a přehrávaným zvukem. Usada para calcular uma posição aleatória e definir a distância mínima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. - Utilisé pour calculer une position aléatoire et pour définir la distance minimale entre le joueur les sons lus. + Valeur utilisée pour calculer une position aléatoire et définir la distance minimale entre les joueurs et les sons joués. Egy véletlenszerű pozíció számításához használt érték, amihez megadja a minimum távolságot a játékosok és a lejátszott hangfájl(ok) között Используется для расчета случайной позиции и указывает минимальное расстояние между игроками и источниками звука Usati per calcolare una posizione casuale ed impostare la distanza minima tra i giocatori ed il file suono eseguito @@ -111,6 +115,7 @@ 최대 거리 最大距离 最大距離 + Maksimum Mesafe Used for calculating a random position and sets the maximum distance between the players and the played sound file(s) @@ -119,7 +124,7 @@ Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Maximalabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest Používá se pro výpočet náhodné pozice a určuje maximální vzdálenost mezi hráči a přehrávaným zvukem. Usado para calcular uma posição aleatória e definir uma distância máxima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. - Utilisé pour calculer une position aléatoire et pour définir la distance maximale entre le joueur les sons lus. + Valeur utilisée pour calculer une position aléatoire et définir la distance maximale entre les joueurs et les sons joués. Egy véletlenszerű pozíció számításához használt érték, amihez megadja a maximum távolságot a játékosok és a lejátszott hangfájl(ok) között Используется для расчета случайной позиции и указывает максимальное расстояние между игроками и источниками звука Usato per calcolare una posizione casuale ed impostare la distanza massima tra giocatori e il file suono eseguito @@ -135,7 +140,7 @@ Minimale Verzögerung Minimální prodleva Atraso mínimo - Délais minimal + Délai minimal Minimum késleltetés Минимальная задержка Pausa Minima @@ -143,6 +148,7 @@ 최소 지연 最小延迟 最小延遲 + Minimum Gecikme Minimal delay between sounds played @@ -151,7 +157,7 @@ Minimale Verzögerung zwischen abzuspielenden Sounds Minimální prodleva mezi přehrávanými zvuky Atraso mínimo entre os sons reproduzidos - Délais minimal entre les sons lus. + Délai minimal entre deux sons consécutifs. Minimum késleltetés a lejátszott hangok között Минимальная задержка между воспроизведением звуков Pausa Minima tra suoni eseguiti @@ -159,6 +165,7 @@ 재생된 소리간 최소 지연시간 设定每个声音档案中间最少间隔多久再进行播放 設定每個聲音檔案中間最少間隔多久再進行播放 + Çalınan sesler arasında minimum gecikme Maximum Delay @@ -167,7 +174,7 @@ Maximale Verzögerung Maximální prodleva Atraso máximo - Délais maximal + Délai maximal Maximum késleltetés Максимальная задержка Pausa Massima @@ -175,6 +182,7 @@ 최대 지연 最大延迟 最大延遲 + Maksimum Gecikme Maximum delay between sounds played @@ -183,7 +191,7 @@ Maximale Verzögerung zwischen abzuspielenden Sounds Maximální prodleva mezi přehrávanými zvuky Atraso máximo entre os sons reproduzidos - Délais maximal entre les sons lus. + Délai maximal entre deux sons consécutifs. Maximum késleltetés a lejátszott hangok között Максимальная задержка между воспроизведением звуков Pausa Massima tra suoni eseguiti @@ -191,6 +199,7 @@ 재생된 소리간 최대 지연시간 设定每个声音档案中间最多间隔多久再进行播放 設定每個聲音檔案中間最多間隔多久再進行播放 + Çalınan sesler arasında maksimum gecikme Follow Players @@ -207,6 +216,7 @@ 플레이어 따라가기 跟随玩家 跟隨玩家 + Oyuncuları Takip Et Follow players. If set to false, loop will play sounds only nearby logic position. @@ -215,7 +225,7 @@ Spielern folgen. Wenn auf falsch gesetzt, werden Sounds nur in der Nähe des Logikmoduls abgespielt. Následuj hráče. Pokud je FALSE, smyčka zvuku bude přehrávána na nejbližší pozici logiki. Segue os jogadores. Se esta desabilitado (falso), o loop reproduzirá os sons somente perto de sua posição lógica. - Suivre le joueur. Si défini sur false, les sons seront joués en boucle autour la position logique + Suivre les joueurs. Si défini sur false, les sons ne seront joués qu'autour de la position du module. Játékosok követése. Ha le van tiltva, az ismétlés csak a legközelebbi logikai ponton játszik le hangokat. Следовать за игроками. Если установить в Ложь, звуки будут циклически проигрываться только около позиции Логики. Segui Giocatori. Se impostato su falso, il ciclo eseguirà i suoni solo vicino ad una posizione logica. @@ -223,6 +233,7 @@ 플레이어를 따라갑니다. 거짓으로 설정될경우 오직 한 자리에서만 반복해서 소리를 재생합니다. 设定声音是否会在玩家的附近产生。假如关闭此功能,声音只会在模块的位置产生。 設定聲音是否會在玩家的附近產生。假如關閉此功能,聲音只會在模塊的位置產生。 + Eğer devde dışı bırakılırsa sesler oyuncuyu takip etmez Volume @@ -239,6 +250,7 @@ 볼륨 音量 音量 + Ses The volume of the sounds played @@ -247,7 +259,7 @@ Lautstärke der abzuspielenden Sounds Hlasitost přehrávaného zvuku O volume em que os sons serão reproduzidos - Volume des sons lus + Définit le volume des sons. A lejátszott hangok hangereje Громкость воспроизводимых звуков Il volume dei suoni eseguiti @@ -263,7 +275,7 @@ Umgebungsgeräusch-Schleife (im MP synchronisiert) Smyčka okkolního zvuku (synchronizováno v MP) Loop de sons ambientes (sincronizados através do MP) - Sons d'ambiance lus en boucle (Synchronisation MP) + Boucle de sons d'ambiance. (Synchronisée en MP) Ambiens hangok folyamatossága (MP alatt szinkronizálva) Циклически воспроизводимые звуки окружения (синх. между игроками) Ciclo Suoni Ambientali (sincronizzato in MP) diff --git a/addons/mk6mortar/ACE_Settings.hpp b/addons/mk6mortar/ACE_Settings.hpp index 5fb88aa23b2..9c3a1a33e8c 100644 --- a/addons/mk6mortar/ACE_Settings.hpp +++ b/addons/mk6mortar/ACE_Settings.hpp @@ -1,35 +1,14 @@ class ACE_Settings { - //These settings effect gameplay difficutly: defaults will leave the mortar the same as vanilla class GVAR(airResistanceEnabled) { - category = CSTRING(DisplayName); - displayName = CSTRING(airResistanceEnabled_DisplayName); - description = CSTRING(airResistanceEnabled_Description); - value = 0; - typeName = "BOOL"; - isClientSetable = 0; + movedToSQF = 1; }; class GVAR(allowComputerRangefinder) { - category = CSTRING(DisplayName); - displayName = CSTRING(allowComputerRangefinder_DisplayName); - description = CSTRING(allowComputerRangefinder_Description); - value = 1; - typeName = "BOOL"; - isClientSetable = 0; + movedToSQF = 1; }; class GVAR(allowCompass) { - category = CSTRING(DisplayName); - displayName = CSTRING(allowCompass_DisplayName); - description = CSTRING(allowCompass_Description); - value = 1; - typeName = "BOOL"; - isClientSetable = 0; + movedToSQF = 1; }; class GVAR(useAmmoHandling) { - category = CSTRING(DisplayName); - displayName = CSTRING(useAmmoHandling_DisplayName); - description = CSTRING(useAmmoHandling_Description); - value = 0; - typeName = "BOOL"; - isClientSetable = 0; + movedToSQF = 1; }; }; diff --git a/addons/mk6mortar/CfgEventHandlers.hpp b/addons/mk6mortar/CfgEventHandlers.hpp index 957fefb7367..becf3950523 100644 --- a/addons/mk6mortar/CfgEventHandlers.hpp +++ b/addons/mk6mortar/CfgEventHandlers.hpp @@ -16,11 +16,3 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; - -class Extended_FiredBIS_EventHandlers { - class Mortar_01_base_F { - class ADDON { - firedBIS = QUOTE(_this call FUNC(handleFired)); - }; - }; -}; diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 4a5d420f5c9..41e45abf351 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -24,9 +24,12 @@ class CfgVehicles { class Turrets: Turrets { class MainTurret: MainTurret {}; }; - class ACE_Actions; }; class Mortar_01_base_F: StaticMortar { + class ace_csw { + proxyWeapon = QFUNC(csw_getProxyWeapon); + magazineLocation = "_target selectionPosition 'usti hlavne'"; + }; class Turrets: Turrets { class MainTurret: MainTurret { turretInfoType = "ACE_Mk6_RscWeaponRangeArtillery"; @@ -34,54 +37,6 @@ class CfgVehicles { discreteDistanceInitIndex = 0; }; }; - class ACE_Actions: ACE_Actions { - class GVAR(unloadMagazine) { - displayName = CSTRING(unloadMortar); - distance = 2; - condition = QUOTE(_this call FUNC(canUnloadMagazine)); - statement = QUOTE([ARR_3(_target,_player,5)] call FUNC(unloadMagazineTimer)); - icon = ""; - selection = "usti hlavne"; - }; - class GVAR(LoadActions) { - displayName = CSTRING(loadMortar); - distance = 2; - condition = QUOTE([ARR_2(_target,_player)] call FUNC(canLoadMagazine)); - statement = ""; - icon = ""; - selection = "usti hlavne"; - class GVAR(loadMagazine_HE_Guided) { - displayName = CSTRING(loadMagazine_HE_Guided); - condition = QUOTE([ARR_3(_target,_player,'ACE_1Rnd_82mm_Mo_HE_Guided')] call FUNC(canLoadMagazine)); - statement = QUOTE([ARR_4(_target,_player,8,'ACE_1Rnd_82mm_Mo_HE_Guided')] call FUNC(loadMagazineTimer)); - icon = ""; - }; - class GVAR(loadMagazine_HE_LaserGuided) { - displayName = CSTRING(loadMagazine_HE_LaserGuided); - condition = QUOTE([ARR_3(_target,_player,'ACE_1Rnd_82mm_Mo_HE_LaserGuided')] call FUNC(canLoadMagazine)); - statement = QUOTE([ARR_4(_target,_player,8,'ACE_1Rnd_82mm_Mo_HE_LaserGuided')] call FUNC(loadMagazineTimer)); - icon = ""; - }; - class GVAR(loadMagazine_Illum) { - displayName = CSTRING(loadMagazine_Illum); - condition = QUOTE([ARR_3(_target,_player,'ACE_1Rnd_82mm_Mo_Illum')] call FUNC(canLoadMagazine)); - statement = QUOTE([ARR_4(_target,_player,5,'ACE_1Rnd_82mm_Mo_Illum')] call FUNC(loadMagazineTimer)); - icon = ""; - }; - class GVAR(loadMagazine_Smoke) { - displayName = CSTRING(loadMagazine_Smoke); - condition = QUOTE([ARR_3(_target,_player,'ACE_1Rnd_82mm_Mo_Smoke')] call FUNC(canLoadMagazine)); - statement = QUOTE([ARR_4(_target,_player,2.5,'ACE_1Rnd_82mm_Mo_Smoke')] call FUNC(loadMagazineTimer)); - icon = ""; - }; - class GVAR(loadMagazine_HE) { - displayName = CSTRING(loadMagazine_HE); - condition = QUOTE([ARR_3(_target,_player,'ACE_1Rnd_82mm_Mo_HE')] call FUNC(canLoadMagazine)); - statement = QUOTE([ARR_4(_target,_player,2.5,'ACE_1Rnd_82mm_Mo_HE')] call FUNC(loadMagazineTimer)); - icon = ""; - }; - }; - }; class ACE_SelfActions { class GVAR(toggleMils) { displayName = "Toggle MILS"; diff --git a/addons/mk6mortar/RscInGameUI.hpp b/addons/mk6mortar/RscInGameUI.hpp index 3c2a1da5348..4145bc091f2 100644 --- a/addons/mk6mortar/RscInGameUI.hpp +++ b/addons/mk6mortar/RscInGameUI.hpp @@ -4,16 +4,8 @@ class RscInGameUI { }; class ACE_Mk6_RscWeaponRangeArtillery: RscWeaponRangeArtillery { onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_Mk6_RscWeaponRangeArtillery', _this select 0)]; [ARR_2('ace_infoDisplayChanged', [ARR_2(_this select 0, 'Mk6Mortar')])] call CBA_fnc_localEvent;); - controls[] = {"ACE_ChargeDisplay", "ACE_MILS_GROUP", "CA_IGUI_elements_group","CA_RangeElements_group"}; - class ACE_ChargeDisplay: RscStructuredText { - idc = 80085; - colorText[] = {1, 1, 1, 1}; - colorBackground[] = {0, 0, 0, 0.1}; - x = "3.8 * (((safezoneW / safezoneH) min 1.2) / 40) + (profilenamespace getvariable [""IGUI_GRID_WEAPON_X"",((safezoneX + safezoneW) - (10 * (((safezoneW / safezoneH) min 1.2) / 40)) - 4.3 * (((safezoneW / safezoneH) min 1.2) / 40))])"; - y = "2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safezoneY + 0.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))])"; - w = "10 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - }; + controls[] = {"ACE_MILS_GROUP", "CA_IGUI_elements_group","CA_RangeElements_group"}; + class ACE_MILS_GROUP: CA_IGUI_elements_group { idc = 80170; class controls { diff --git a/addons/mk6mortar/RscRangeTable.hpp b/addons/mk6mortar/RscRangeTable.hpp deleted file mode 100644 index c719dd7ee45..00000000000 --- a/addons/mk6mortar/RscRangeTable.hpp +++ /dev/null @@ -1,87 +0,0 @@ -class ACE_82mm_RangeTable_Dialog { - idd = -1; - movingEnable = 1; - onLoad = "uiNamespace setVariable ['ACE_82mm_RangeTable_Dialog', _this select 0];"; - objects[] = {}; - - class ControlsBackground { - class TableBackground: RscPicture { - idc = -1; - text = QPATHTOF(UI\RangeTable_background.paa); - x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "16.2634559672906 * (safeZoneH / 40)"; - h = "23 * ((safeZoneH / 1.2) / 25)"; - colorBackground[] = {1,1,1,1}; - }; - class ChargeBackground: RscText { - idc = -1; - x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "4 * (safeZoneH / 40)"; - h = "5 * ((safeZoneH / 1.2) / 25)"; - colorBackground[] = {0,0,0,1}; - }; - }; - class controls { - class TheTable: RscListNBox { - idc = 20001; - // style = ST_CENTER + ST_MULTI + LB_TEXTURES; - // style = ST_LEFT + ST_MULTI + LB_TEXTURES; - // style = LB_MULTI + ST_LEFT; // Style - x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "16.2634559672906 * (safeZoneH / 40)"; - h = "20.24 * ((safeZoneH / 1.2) / 25)"; - columns[] = {(10/867),(86/867),(171/867),(238/867),(320/867),(405/867), - (485/867),(546/867),(607/867),(668/867),(729/867),(790/867)}; - rowHeight = 0.015 * safeZoneH; - sizeEx = "0.014 * safeZoneH"; - font = "EtelkaMonospacePro"; - drawSideArrows = 1; - idcLeft = 14124; - idcRight = 412343243; - colorText[] = {0, 0, 0, 1}; - shadow = "0"; - // colorBorder[] = {1,0,0,1}; - // colorBackground[] = {1, 0, 0, 1}; - colorSelectBackground[] = {0, 0, 0, 0.025}; - colorSelectBackground2[] = {0, 0, 0, 0.025}; - colorScrollbar[] = {0.95,0,0.95,1}; - class ListScrollBar: ScrollBar{ - color[] = {0,0,0,0.6}; - }; - }; - class ChargeListBox: RscListbox { - idc = 1501; - style = ST_RIGHT; - x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "4 * (safeZoneH / 40)"; - h = "5 * ((safeZoneH / 1.2) / 25)"; - onLBSelChanged = QUOTE(_this call FUNC(rangeTablePageChange)); - }; - class CloseBackground: RscText { - idc = -1; - x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "0.5 * (safeZoneH / 40)"; - h = "0.5 * ((safeZoneH / 1.2) / 25)"; - colorBackground[] = {0,0,0,0.5}; - }; - class CloseActiveText: RscActiveText { - idc = -1; - style = 48; - color[] = {1,1,1,0.7}; - text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; - x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "0.5 * (safeZoneH / 40)"; - h = "0.5 * ((safeZoneH / 1.2) / 25)"; - colorText[] = {1,1,1,0.7}; - colorActive[] = {1,1,1,1}; - tooltip = "Close"; - onButtonClick = "closeDialog 0"; - }; - }; -}; diff --git a/addons/mk6mortar/XEH_PREP.hpp b/addons/mk6mortar/XEH_PREP.hpp index 600fc0707f8..dd052a993e5 100644 --- a/addons/mk6mortar/XEH_PREP.hpp +++ b/addons/mk6mortar/XEH_PREP.hpp @@ -1,23 +1,9 @@ -PREP(dev_buildTable); -PREP(dev_formatNumber); -PREP(dev_simulateCalcRangeTableLine); -PREP(dev_simulateFindSolution); -PREP(dev_simulateShot); - -PREP(canLoadMagazine); -PREP(canUnloadMagazine); +PREP(csw_getProxyWeapon); PREP(handleFired); PREP(handlePlayerVehicleChanged); -PREP(loadMagazine); -PREP(loadMagazineTimer); PREP(moduleInit); -PREP(mortarInit); PREP(rangeTableCanUse); PREP(rangeTableOpen); -PREP(rangeTablePageChange); -PREP(rangeTablePreCalculatedValues); PREP(toggleMils); PREP(turretDisplayLoaded); -PREP(unloadMagazine); -PREP(unloadMagazineTimer); diff --git a/addons/mk6mortar/XEH_postInit.sqf b/addons/mk6mortar/XEH_postInit.sqf index e3169b6dbaa..3ea99118932 100644 --- a/addons/mk6mortar/XEH_postInit.sqf +++ b/addons/mk6mortar/XEH_postInit.sqf @@ -1,41 +1,16 @@ #include "script_component.hpp" -[QGVAR(addMagazine), { - params ["_static", "_magazine"]; - _static addMagazineTurret [_magazine,[0]]; -}] call CBA_fnc_addEventHandler; - -[QGVAR(removeMagazine), { - params ["_static", "_magazine"]; - _static removeMagazineTurret [_magazine,[0]]; -}] call CBA_fnc_addEventHandler; - -[QGVAR(setAmmo), { - params ["_static", "_magazine","_ammoCount"]; - _static setMagazineTurretAmmo [_magazine, _ammoCount, [0]]; -}] call CBA_fnc_addEventHandler; - -["ace_initMortar", {_this call FUNC(mortarInit);}] call CBA_fnc_addEventHandler; - if (hasInterface) then { ["ace_infoDisplayChanged", FUNC(turretDisplayLoaded)] call CBA_fnc_addEventHandler; }; ["ace_settingsInitialized", { - TRACE_1("ace_settingsInitialized",GVAR(useAmmoHandling)); + TRACE_4("ace_settingsInitialized",GVAR(airResistanceEnabled),GVAR(allowComputerRangefinder),GVAR(allowCompass),GVAR(useAmmoHandling)); ["vehicle", FUNC(handlePlayerVehicleChanged), true] call CBA_fnc_addPlayerEventHandler; - if (GVAR(useAmmoHandling)) then { - ["Mortar_01_base_F", "init", { - TRACE_2("mortar init",_this,(_this select 0) turretLocal [0]); - - //wait for proper turret locality change - [{ - TRACE_2("after delay",_this,(_this select 0) turretLocal [0]); - ["ace_initMortar", _this] call CBA_fnc_localEvent; - }, _this, 0.5] call CBA_fnc_waitAndExecute; + if (!GVAR(airResistanceEnabled)) exitWith {}; + if (EGVAR(artillerytables,advancedCorrections)) exitWith { TRACE_1("defer firedEH to artillerytables",_this); }; + ["Mortar_01_base_F", "fired", {call FUNC(handleFired)}] call CBA_fnc_addClassEventHandler; - }, true, [], true] call CBA_fnc_addClassEventHandler; - }; }] call CBA_fnc_addEventHandler; diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index b47cf6628db..9361d05015e 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index f3876324466..6104f571aa0 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { "ACE_Box_82mm_Mo_Illum","ACE_Box_82mm_Mo_Combo"}; weapons[] = {"ACE_RangeTable_82mm","ace_mortar_82mm"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interaction"}; + requiredAddons[] = {"ace_csw", "ace_artillerytables"}; author = ECSTRING(common,ACETeam); authors[] = {"PabstMirror","Grey","VKing"}; url = ECSTRING(main,URL); @@ -33,4 +33,3 @@ class RscActiveText; class RscStructuredText; #include "RscInGameUI.hpp" -#include "RscRangeTable.hpp" diff --git a/addons/mk6mortar/functions/fnc_canLoadMagazine.sqf b/addons/mk6mortar/functions/fnc_canLoadMagazine.sqf deleted file mode 100644 index 67bcf4d5221..00000000000 --- a/addons/mk6mortar/functions/fnc_canLoadMagazine.sqf +++ /dev/null @@ -1,52 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Grey - * Checks whether magazine can be loaded into static weapon - * - * Arguments: - * 0: static - * 1: unit - * 2: magazine class to check; if not given having any compatible magazine returns true (default: "") - * - * Return Value: - * canLoadMagazine - * - * Example: - * [_target,_player,"ACE_1Rnd_82mm_Mo_HE"] call ace_mk6mortar_fnc_canLoadMagazine - * - * Public: Yes - */ - -params ["_static","_unit",["_magazineClassOptional","",[""]]]; - -if !(alive _static && GVAR(useAmmoHandling)) exitWith {false}; -if (_static getVariable [QGVAR(inUse), false]) exitWith {false}; - -private _canLoadMagazine = false; -private _hasCompatibleMagazine = false; - -private _currentMagazine = (magazinesAllTurrets _static) select 1; -private _weapon = (_static weaponsTurret [0]) select 0; - -private _listOfMagNames = getArray(configFile >> "cfgWeapons" >> _weapon >> "magazines"); -private _count = 0; - -//If function is called with an optional string then check if player has that magzine otherwise check all magazines of the player to see if they are compatible with the static weapon -if (_magazineClassOptional != "") then { - if ([_unit,_magazineClassOptional] call EFUNC(common,hasMagazine)) then { - _hasCompatibleMagazine = true; - }; - } else { - { - if ([_unit,_x] call EFUNC(common,hasMagazine)) exitWith {_hasCompatibleMagazine = true}; - } forEach _listOfMagNames; -}; -//If static weapon has a magazine then find the ammo count -if (count (_static magazinesTurret [0]) > 0) then { - _count = _currentMagazine select 2; -}; -//If the static weapon doesn't have a magzine or a magazine with no bullets, the player has a compatible magazine and the static weapon has a barrel then you can load a magazine -if ((count (_static magazinesTurret [0]) == 0 || _count == 0) && _hasCompatibleMagazine) then { - _canLoadMagazine = true; -}; -_canLoadMagazine diff --git a/addons/mk6mortar/functions/fnc_canUnloadMagazine.sqf b/addons/mk6mortar/functions/fnc_canUnloadMagazine.sqf deleted file mode 100644 index a296d56c328..00000000000 --- a/addons/mk6mortar/functions/fnc_canUnloadMagazine.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Grey - * Checks whether magazine can be unloaded from static weapon - * - * Arguments: - * 0: static - * 1: unit - * - * Return Value: - * canUnloadMagazine - * - * Example: - * [_target,_player] call ace_mk6mortar_fnc_canUnloadMagazine - * - * Public: Yes - */ - -params ["_static","_unit"]; - -if !(alive _static && GVAR(useAmmoHandling) && _static getVariable [QGVAR(initialized),false]) exitWith {false}; -if (_static getVariable [QGVAR(inUse), false]) exitWith {false}; - -private _canUnloadMagazine = false; - -private _ammoCount = ((magazinesAllTurrets _static) select 1) select 2; -if (_ammoCount > 0) then { - _canUnloadMagazine = true; -}; -_canUnloadMagazine diff --git a/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf b/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf new file mode 100644 index 00000000000..f6d11334b31 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf @@ -0,0 +1,68 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Compatibility With ACE_CSW (will be called by ace_csw, no dependency) + * Setting Init has finished, and this runs before csw attempts to unload weapon, should replicate functionality of mk6_fnc_mortarInit + * + * Arguments: + * 0: static + * 1: Turret + * 2: current weapon + * 3: need proxy weapon (either assembly mode is true, or weapon has been emptied and is being reloaded) + * + * Return Value: + * Proxy Weapon + * + * Example: + * [mortar, "mortar_82mm", true] call ace_mk6mortar_fnc_csw_getProxyWeapon + * + * Public: No + */ + +params ["_mortar", "_turret", "_currentWeapon", "_proxyWeaponNeeded"]; +TRACE_4("csw_getProxyWeapon",_mortar,_turret,_currentWeapon,_proxyWeaponNeeded); + +private _newWeapon = ""; + +if (_proxyWeaponNeeded || GVAR(useAmmoHandling)) then { + if (_currentWeapon != "mortar_82mm") exitWith { ERROR_2("unknown weapon [%1 - %2]",typeOf _mortar,_currentWeapon); }; + + // Replace weapon with fast reloading version + _newWeapon = "ace_mortar_82mm"; + TRACE_1("replacing weapon",_newWeapon); + + // need to convert 8rnd mags to 1rnd mags for new weapon (we need to do this so the weapon is loaded with a compatible mag) + private _magsToRemove = []; + private _convertedMags = []; + { + _x params ["_xMag", "_xTurret", "_xAmmo"]; + + if (_xTurret isEqualTo _turret) then { + private _replaceMag = switch (true) do { + case (_xMag == "8Rnd_82mm_Mo_shells"): {"ACE_1Rnd_82mm_Mo_HE"}; + case (_xMag == "8Rnd_82mm_Mo_Smoke_white"): {"ACE_1Rnd_82mm_Mo_Smoke"}; + case (_xMag == "8Rnd_82mm_Mo_Flare_white"): {"ACE_1Rnd_82mm_Mo_Illum"}; + case (_xMag == "8Rnd_82mm_Mo_guided"): {"ACE_1Rnd_82mm_Mo_HE_Guided"}; + case (_xMag == "8Rnd_82mm_Mo_LG"): {"ACE_1Rnd_82mm_Mo_HE_LaserGuided"}; + default {""}; + }; + if (_replaceMag != "") then { + _magsToRemove pushBackUnique [_xMag, _xTurret]; + if (!GVAR(useAmmoHandling)) then { + TRACE_3("replacing",_xMag,_replaceMag,_xAmmo); + for "_i" from 1 to _xAmmo do { + _convertedMags pushBack [_replaceMag, _xTurret, 1]; + }; + }; + } else { + WARNING("unknown mag %1", _xMag); + }; + }; + } forEach (magazinesAllTurrets _mortar); + + // remove orignal mags and add 1rnd versions: + { _mortar removeMagazinesTurret _x; } forEach _magsToRemove; + { _mortar addMagazineTurret _x; } forEach _convertedMags; +}; + +_newWeapon diff --git a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf deleted file mode 100644 index 6141314eead..00000000000 --- a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf +++ /dev/null @@ -1,84 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) - * - * Arguments: - * 0: Muzzle Velocity - * 1: Air Friction - * - * Return Value: - * None - * - * Example: - * [100, -0.0001] spawn ace_mk6mortar_fnc_dev_buildTable; //spawn (scheduled) is slower - * [100, -0.0001] call ace_mk6mortar_fnc_dev_buildTable; //faster, but will lock while processing - * - * Public: No - */ - -private _muzzleVelocity = _this select 0; -private _airFriction = _this select 1; -private _stillInRange = true; -private _currentRange = 100; -private _increasePerRow = 50; -private _outputArray = []; - - -//[_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] - -while {_stillInRange} do { - private _result = [_muzzleVelocity, _currentRange, _airFriction] call FUNC(dev_simulateCalcRangeTableLine); - if (_result isEqualTo []) then { - _stillInRange = false; - } else { - if (_airFriction == 0) then { - _result set [5, 0]; - _result set [6, 0]; - _result set [7, 0]; - _result set [8, 0]; - _result set [9, 0]; - _result set [10, 0]; - _result set [11, 0]; - }; - if ((_result select 1) < 88) then { - _outputArray pushBack [ - ([(_result select 0), "meters", false] call FUNC(dev_formatNumber)), - ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), - ([(_result select 2), "mil", true] call FUNC(dev_formatNumber)), - ([(_result select 3), "sec", false] call FUNC(dev_formatNumber)), - ([(_result select 4), "sec", false] call FUNC(dev_formatNumber)), - ([(_result select 5), "milPrecise", true] call FUNC(dev_formatNumber)), - ([(_result select 6), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 7), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 8), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 9), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 11), "metersprecise", false] call FUNC(dev_formatNumber)) - ]; - }; - _currentRange = _currentRange + _increasePerRow; - }; - hintSilent str _currentRange; -}; - -//handle floating point rounding errors -private _outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && {(abs(_airFriction - %2) < 0.00001)}): { -[ -", _muzzleVelocity, _airFriction]; - -{ - if (_forEachIndex < ((count _outputArray) - 1)) then { - _outputString = _outputString + format ["%1, - ", _x]; - } else { - _outputString = _outputString + format ["%1 - ] - };", _x]; - }; -} forEach _outputArray; - -copyToClipboard _outputString; -rangeTableOutput = _outputString; - -hint "done"; diff --git a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf deleted file mode 100644 index a24f456037f..00000000000 --- a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf +++ /dev/null @@ -1,76 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Pabst Mirror - * Converts numbers into nicely formated strings. - * - * Arguments: - * 0: Input number - * 1: Output type (see case statement) - * 2: If output type is mil, convert input type from deg->mil - * - * Return Value: - * Formatted number - * - * Example: - * [45, "mil4", true] call ace_mk6mortar_fnc_dev_formatNumber = "0800" - * - * Public: No - */ - -params ["_theNumber", "_inputType", "_convertToMils"]; - -private _decimalPlaces = -1; -private _integerPlaces = -1; - -switch (toLower _inputType) do { -case ("meters"): { - _decimalPlaces = 0; - _integerPlaces = 1; - }; -case ("metersprecise"): { - _decimalPlaces = 1; - _integerPlaces = 1; - }; -case ("meters4"): { - _decimalPlaces = 0; - _integerPlaces = 4; - }; -case ("deg3precise"): { - _decimalPlaces = 2; - _integerPlaces = 3; - }; -case ("mil"): { - _decimalPlaces = 0; - _integerPlaces = 1; - if (_convertToMils) then { - _theNumber = _theNumber * (6400 / 360); - }; - }; -case ("mil4"): { - _decimalPlaces = 0; - _integerPlaces = 4; - if (_convertToMils) then { - _theNumber = _theNumber * (6400 / 360); - }; - }; -case ("milprecise"): { - _decimalPlaces = 1; - _integerPlaces = 1; - if (_convertToMils) then { - _theNumber = _theNumber * (6400 / 360); - }; - }; -case ("sec"): { - _decimalPlaces = 1; - _integerPlaces = 1; - }; - default {systemChat format ["badtype %1", _inputType];}; -}; - -//CBA_fnc_formatNumber is silly: [-9.58545, 1, 1, false] call CBA_fnc_formatNumber == "-9.-6" - -private _prefix = if (_theNumber < 0) then {"-"} else {""}; - -private _return = [abs (_theNumber), _integerPlaces, _decimalPlaces, false] call CBA_fnc_formatNumber; - -(_prefix + _return) diff --git a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf deleted file mode 100644 index 2bdfe56c225..00000000000 --- a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf +++ /dev/null @@ -1,77 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Pabst Mirror - * Builds a rangeTable line for a certian range, given muzzle velocity and air friction, returns [] if out of range. - * - * Arguments: - * 0: Muzzle Velocity - * 1: Air Friction - * 2: Range To Hit - * - * Return Value: - * Range Table Line Data (see return line) - * - * Example: - * [300, -0.0001, 3000] call ace_mk6mortar_fnc_simulateCalcRangeTableLine - * - * Public: No - */ - -#define TIME_STEP (1/50) - -params ["_muzzleVelocity", "_rangeToHit", "_airFriction"]; - -private _startTime = diag_tickTime; - - - -//Run Binary search for correct elevation -private _solution = [_rangeToHit, 0, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(dev_simulateFindSolution); -if (_solution isEqualTo []) exitWith {[]}; - -//Real Elevation -private _lineElevation = _solution select 0; - -//Time Of Flight: -private _lineTimeOfFlight = _solution select 1; - -//Height Adjustment for -100m (another binary search) -private _solution = [_rangeToHit, -100, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(dev_simulateFindSolution); -if (_solution isEqualTo []) exitWith {[]};//should never be triggered (lower elevation easier to hit) - -private _lineHeightElevation = ((_solution select 0) - _lineElevation); -private _lineHeightTimeDelta = (_solution select 1) - _lineTimeOfFlight; - -//Compute for 10x and divide to minimize rounding errors - -//Crosswind -private _lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 10, 0, TIME_STEP] call FUNC(dev_simulateShot); -private _lineCrosswindDeg = (_lastTestResult select 2) / 10; - -//Headwind: -_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, -10, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); -private _lineHeadwindMeters = (_rangeToHit - (_lastTestResult select 0)) / 10; - -//TailWind: -_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, 10, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); -private _lineTailWindMeters = (_rangeToHit - (_lastTestResult select 0)) / 10; - -//Air Temp Dec -_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, (15 - 10), 1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); -_lineTempDec = (_rangeToHit - (_lastTestResult select 0)) / 10; - -//Air Temp Inc -_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, (15 + 10), 1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); -_lineTempInc = (_rangeToHit - (_lastTestResult select 0)) / 10; - -//Air Density Dec -_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 0.9, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); -private _lineAirDensDec = (_rangeToHit - (_lastTestResult select 0)) / 10; - -//Air Density Inc -_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1.1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); -private _lineAirDensInc = (_rangeToHit - (_lastTestResult select 0)) / 10; - -// systemChat format ["debug: Range %1 - in %2 sec", _rangeToHit, (diag_tickTime - _startTime)]; - -[_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf deleted file mode 100644 index 3c509d5a19e..00000000000 --- a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf +++ /dev/null @@ -1,48 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * DEV to find a firing solution for a given range - * - * Arguments: - * 0: Range to Hit (Meters) - * 1: Height To Hit (Meters) - * 2: Muzzle Velocity (M/S) - * 3: Air Friction - * 4: Time Step (seconds) (eg 1/50 will simulate 50 cycles per second) - * - * Return Value: - * [NUMBER - Elevation In Degrees, NUMBER - Shot Durration] - * - * Example: - * [_rangeToHit, _heightToHit, _muzzleVelocity, _airFriction, TIME_STEP] call ace_mk6mortar_fnc_dev_simulateFindSolution; - * - * Public: No - */ - -#define MAX_ATTEMPTS 22 -params ["_rangeToHit", "_heightToHit", "_muzzleVelocity", "_airFriction","_timeStep"]; - -private _maxElev = 90; -private _minElev = 45; //todo - Low Angle Howitzers??? - -private _error = 10000; -private _solutionElevation = -1; -private _lastTestResult = []; -private _numberOfAttempts = 0; - -//(binary search) -while {(_numberOfAttempts < MAX_ATTEMPTS) && {(abs _error) > 0.2}} do { - _numberOfAttempts = _numberOfAttempts + 1; - _solutionElevation = (_maxElev + _minElev) / 2; - _lastTestResult = [_solutionElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 0, _heightToHit, _timeStep] call FUNC(dev_simulateShot); - _error = _rangeToHit - (_lastTestResult select 0); - if (_error > 0) then { - _maxElev = _solutionElevation; //test range was short - } else { - _minElev = _solutionElevation; //test range was long - }; -}; -if (_numberOfAttempts >= MAX_ATTEMPTS) exitWith {[]}; - -//return the elevation and time required -[_solutionElevation, (_lastTestResult select 1)] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf deleted file mode 100644 index 7974526ff63..00000000000 --- a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf +++ /dev/null @@ -1,63 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) - * - * Arguments: - * 0: Shot Angle (degrees) - * 1: Muzzle Velocity (m/s) - * 2: Air Friction - * 3: Tempeture (degres celcius) - * 4: Relative Air Denisty - * 5: Tail Wind (m/s) - * 6: Cross Wind (m/s) - * 7: Height Of Target (M) - * 8: Time Step (fraction of a second) - * - * Return Value: - * [Distance Traveled, Shot Time, Offset (degrees)] - * - * Example: - * [45, 180, -0.0001, 15, 1, 10, 0, 0, 1/50] call ace_mk6mortar_fnc_dev_simulateShot; - * - * Public: No - */ - -params ["_angleDeg", "_muzzleVelocity", "_airFriction", "_temp", "_relDensity", "_tailWind", "_crosswind", "_heightOfTarget", "_timeStep"]; - -private _wind = [_crosswind, _tailWind, 0]; -private _gravity = [0,0,-9.8]; - -private _currentPos = [0,0,0]; -private _muzzleVelocity = _muzzleVelocity * (((_temp + 273.13) / 288.13 - 1) / 40 + 1); -private _currentVelocity = [0, (_muzzleVelocity * cos _angleDeg), (_muzzleVelocity * sin _angleDeg)]; - -private _currentTime = 0; -private _lastPos = _currentPos; - -private _kCoefficent = -1 * _relDensity * _airFriction; //save time in the loop and compute once - -while {((_currentVelocity select 2) > 0) || ((_currentPos select 2) >= _heightOfTarget)} do { - _lastPos = _currentPos; - - private _aparentWind = _wind vectorDiff _currentVelocity; - private _changeInVelocity = _gravity vectorAdd (_aparentWind vectorMultiply ((vectorMagnitude _aparentWind) * _kCoefficent)); - - _currentVelocity = _currentVelocity vectorAdd (_changeInVelocity vectorMultiply _timeStep); - - _currentPos = _currentPos vectorAdd (_currentVelocity vectorMultiply _timeStep); - _currentTime = _currentTime + _timeStep; -}; - -//Uses linearConversion to get a weighted average betwen points before and after dropping below target height -private _linConversion = linearConversion [(_lastPos select 2), (_currentPos select 2), _heightOfTarget, 0, 1, true]; -private _middlePos = (_lastPos vectorMultiply (1 - _linConversion)) vectorAdd (_currentPos vectorMultiply (_linConversion)); -// private _middlePosOld = (_lastPos vectorAdd _currentPos) vectorMultiply 0.5; - -//Same to find travel time -private _middleTotalTravelTime = _currentTime - (_timeStep * (1-_linConversion)); - -//Find shot offset (from crosswind), in degrees -private _offsetDeg = (_middlePos select 0) aTan2 (_middlePos select 1); - -[(_middlePos select 1), _middleTotalTravelTime, _offsetDeg] diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 02a8e51ce0c..5224aa09a09 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -21,22 +21,13 @@ * Public: No */ -params ["_vehicle", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile"]; - -if (GVAR(useAmmoHandling) && {_vehicle getVariable [QGVAR(initialized),false] && !(_vehicle getVariable [QGVAR(exclude),false])}) then { - // if !(_vehicle getVariable [QGVAR(exclude),false]) then { - _vehicle removeMagazineGlobal (_vehicle magazinesTurret [0] select 0); - TRACE_1("",_vehicle magazinesTurret [0]); - // }; -}; - -if (!GVAR(airResistanceEnabled)) exitWith {}; +params ["_vehicle", "", "", "", "", "", "_projectile"]; // Large enough distance to not simulate any wind deflection if (_vehicle distance ACE_player > 8000) exitWith {false}; //AI will have no clue how to use: -_shooterMan = gunner _vehicle; +private _shooterMan = gunner _vehicle; if (!([_shooterMan] call EFUNC(common,isPlayer))) exitWith {false}; //Calculate air density: @@ -52,8 +43,8 @@ TRACE_5("FiredWeather",_temperature,_pressure,_relativeHumidity,_airDensity,_rel //powder effects: private _newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); if (_newMuzzleVelocityCoefficent != 1) then { - _bulletVelocity = velocity _projectile; - _bulletSpeed = vectorMagnitude _bulletVelocity; + private _bulletVelocity = velocity _projectile; + private _bulletSpeed = vectorMagnitude _bulletVelocity; _bulletVelocity = (vectorNormalized _bulletVelocity) vectorMultiply (_bulletSpeed * _newMuzzleVelocityCoefficent); _projectile setVelocity _bulletVelocity; }; @@ -71,7 +62,6 @@ if (_newMuzzleVelocityCoefficent != 1) then { _args set[2, CBA_missionTime]; private _bulletVelocity = velocity _shell; - private _bulletSpeed = vectorMagnitude _bulletVelocity; private _trueVelocity = _bulletVelocity vectorDiff wind; private _trueSpeed = vectorMagnitude _trueVelocity; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index fd53bcf3d48..5628ef88b0c 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -21,20 +21,6 @@ params ["_player", "_newVehicle"]; if (isNull _newVehicle) exitWith {}; if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; -// Run magazine handling initialization if enabled -if (!(_newVehicle getVariable [QGVAR(initialized),false]) && !(_newVehicle getVariable [QGVAR(exclude),false])) then { - // Make sure that mortar init is executed after settings init - [{ - params ["_mortar"]; - if (GVAR(useAmmoHandling) && {!(_mortar getVariable [QGVAR(initialized),false]) && !(_mortar getVariable [QGVAR(exclude),false])}) then { - //wait for proper turret locality change - [{ - ["ace_initMortar", [_this], [_this]] call CBA_fnc_globalEvent; - }, _mortar, 0.05] call CBA_fnc_waitAndExecute; - }; - }, _newVehicle] call EFUNC(common,runAfterSettingsInit); -}; - private _tubeWeaponName = (weapons _newVehicle) select 0; private _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes"); @@ -70,40 +56,13 @@ if (_lastFireMode != -1) then { private _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; if (isNull _display) exitWith {}; //It may be null for the first frame - private _chargeText = format ["%1: %2 ", (localize LSTRING(rangetable_charge)), _currentChargeMode, QPATHTOF(UI\ui_charges.paa)]; - //Hud should hidden in 3rd person private _notGunnerView = cameraView != "GUNNER"; - //Calc real azimuth/elevation - //(looking at the sky VS looking at ground will radicaly change fire direction because BIS) - private _realAzimuth = -1; - private _realElevation = -1; - - private _useRealWeaponDir = (ctrlText (_display displayCtrl 173)) == "--"; - if (_useRealWeaponDir && {(_mortarVeh ammo (currentWeapon _mortarVeh)) == 0}) then { - // With no ammo, distance display will be empty, but gun will still fire at wonky angle if aimed at ground - private _testSeekerPosASL = AGLtoASL (positionCameraToWorld [0,0,0]); - private _testSeekerDir = _testSeekerPosASL vectorFromTo (AGLtoASL (positionCameraToWorld [0,0,1])); - private _testPoint = _testSeekerPosASL vectorAdd (_testSeekerDir vectorMultiply viewDistance); - if ((terrainIntersectASL [_testSeekerPosASL, _testPoint]) || {lineIntersects [_testSeekerPosASL, _testPoint]}) then { - _useRealWeaponDir = false; // If we are not looking at infinity (based on viewDistance) - }; - }; - - if (_useRealWeaponDir) then { - //No range (looking at sky), it will follow weaponDir: - private _weaponDir = _mortarVeh weaponDirection (currentWeapon _mortarVeh); - _realAzimuth = (_weaponDir select 0) atan2 (_weaponDir select 1); - _realElevation = asin (_weaponDir select 2); - } else { - //Valid range, will fire at camera dir - private _lookVector = ((positionCameraToWorld [0,0,0]) call EFUNC(common,positionToASL)) vectorFromTo ((positionCameraToWorld [0,0,10]) call EFUNC(common,positionToASL)); - _realAzimuth = ((_lookVector select 0) atan2 (_lookVector select 1)); - private _upVectorDir = (((vectorUp _mortarVeh) select 0) atan2 ((vectorUp _mortarVeh) select 1)); - private _elevationDiff = (cos (_realAzimuth - _upVectorDir)) * acos ((vectorUp _mortarVeh) select 2); - _realElevation = ((180 / PI) * (_mortarVeh animationPhase "mainGun")) + 75 - _elevationDiff; - }; + // Get aiming values from ace_artillerytables + // Note: it also handles displaying the "charge" level + private _realAzimuth = missionNamespace getVariable [QEGVAR(artillerytables,predictedAzimuth), -1]; + private _realElevation = missionNamespace getVariable [QEGVAR(artillerytables,predictedElevation), -1]; //Update Heading Display: if (_notGunnerView || (!GVAR(allowCompass))) then { @@ -116,13 +75,10 @@ if (_lastFireMode != -1) then { }; }; - //Update CurrentElevation Display and "charge" text + //Update CurrentElevation Display if (_notGunnerView) then { - (_display displayCtrl 80085) ctrlSetStructuredText parseText ""; (_display displayCtrl 80175) ctrlSetText ""; } else { - (_display displayCtrl 80085) ctrlSetStructuredText parseText _chargeText; - if (_useMils) then { (_display displayCtrl 80175) ctrlSetText str ((round (_realElevation * 6400 / 360)) % 6400); } else { diff --git a/addons/mk6mortar/functions/fnc_loadMagazine.sqf b/addons/mk6mortar/functions/fnc_loadMagazine.sqf deleted file mode 100644 index 297fb2a9695..00000000000 --- a/addons/mk6mortar/functions/fnc_loadMagazine.sqf +++ /dev/null @@ -1,62 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Grey - * Loads Magazine into static weapon - * - * Arguments: - * 0: static - * 1: unit - * 2: magazine class to load; if not given the first compatible magazine is loaded (default: "") - * - * Return Value: - * None - * - * Example: - * [_target,_player,"ACE_1Rnd_82mm_Mo_HE"] call ace_mk6mortar_fnc_loadMagazine - * - * Public: Yes - */ - -params ["_static","_unit",["_magazineClassOptional","",[""]]]; - -//If function has been called with an optional classname hten add that magazine to the static weapon. Otherwise add the compatible magazine -if(_magazineClassOptional != "") then { - _unit removeMagazine _magazineClassOptional; - [QGVAR(addMagazine), [_static, _magazineClassOptional]] call CBA_fnc_globalEvent; -} else { - //Get weapon & magazine information of static weapon - private _weapon = (_static weaponsTurret [0]) select 0; - private _currentMagazine = (magazinesAllTurrets _static) select 1; - private _currentMagazineClass = _currentMagazine select 0; - private _count = _currentMagazine select 2; - - //Check all of the players magazines to see if they are compatible with the static weapon. First magazine that is compatible is chosen - //VKing: This section ought to be double checked. - private _magazines = magazines _unit; - private _magazineDetails = magazinesDetail _unit; - private _listOfMagNames = getArray(configFile >> "cfgWeapons" >> _weapon >> "magazines"); - private _magazineClass = ""; - private _magazineClassDetails = ""; - private _roundsLeft = 0; - { - if (_x in _listOfMagNames) exitWith { - _magazineClass = _x; - _magazineClassDetails = _magazineDetails select _forEachIndex; - }; - } forEach _magazines; - //If the static weapon already has an empty magazine then remove it - if (_count == 0) then { - [QGVAR(removeMagazine), [_static, _currentMagazineClass]] call CBA_fnc_globalEvent; - }; - //Find out the ammo count of the compatible magazine found - if (_magazineClassDetails != "") then{ - private _parsed = _magazineClassDetails splitString "([]/: )"; - _parsed params ["_type", "", "", "_roundsLeftText", "_maxRoundsText"]; - _roundsLeft = parseNumber _roundsLeftText; - _magType = _type; - }; - - _unit removeMagazine _magazineClass; - [QGVAR(addMagazine), [_static, _magazineClass]] call CBA_fnc_globalEvent; - [QGVAR(setAmmo), [_static, _magazineClass,_roundsLeft], _static] call CBA_fnc_targetEvent; -}; diff --git a/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf b/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf deleted file mode 100644 index cfc6adff081..00000000000 --- a/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Grey - * Loads Magazine into static weapon using a timer. - * - * Arguments: - * 0: Static - * 1: Unit - * 2: Time to load - * 3: Magazine Class (default: "") - * - * Return Value: - * None - * - * Example: - * [_target,_player,"ACE_1Rnd_82mm_Mo_HE"] call ace_mk6mortar_fnc_loadMagazineTimer - * - * Public: Yes - */ - -params ["_static","_unit","_timeToLoad",["_magazineClassOptional","",[""]]]; - -_static setVariable [QGVAR(inUse), true, true]; - -// Move player into animation if player is standing -if ((_unit call CBA_fnc_getUnitAnim) select 0 == "stand") then { - [_unit, "AmovPercMstpSrasWrflDnon_diary", 1] call EFUNC(common,doAnimation); -}; - -[_timeToLoad, [_static,_unit,_magazineClassOptional], {(_this select 0) call FUNC(loadMagazine); ((_this select 0) select 0) setVariable [QGVAR(inUse), nil, true]}, {((_this select 0) select 0) setVariable [QGVAR(inUse), nil, true]}, localize LSTRING(loadingMortar)] call EFUNC(common,progressBar); diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf index 31582368592..a0186dfb3d9 100644 --- a/addons/mk6mortar/functions/fnc_moduleInit.sqf +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -17,7 +17,7 @@ * Public: No */ -params ["_logic", "_syncedUnits", "_activated"]; +params ["_logic", "", "_activated"]; if (!_activated) exitWith {WARNING("Module - placed but not active");}; diff --git a/addons/mk6mortar/functions/fnc_mortarInit.sqf b/addons/mk6mortar/functions/fnc_mortarInit.sqf deleted file mode 100644 index 46c16738bf1..00000000000 --- a/addons/mk6mortar/functions/fnc_mortarInit.sqf +++ /dev/null @@ -1,46 +0,0 @@ -#include "script_component.hpp" -/* - * Author: VKing - * Initializes mortar for use with ammunition handling magazines. - * - * Arguments: - * 0: Mortar - * - * Return Value: - * None - * - * Example: - * [mortar1] call ace_mk6mortar_fnc_mortarInit - * - * Public: No - */ - -params ["_mortar"]; - -if (_mortar getVariable [QGVAR(initialized),false] || _mortar getVariable [QGVAR(exclude),false]) exitWith {TRACE_1("Exit",_mortar)}; -if (!(_mortar turretLocal [0])) exitWith {TRACE_1("Exit - turret not local",_mortar)}; - -// Remove all magazines from turret -if (count magazines _mortar > 0) then { - { - _mortar removeMagazineTurret [_x,[0]]; - } forEach magazines _mortar; -}; - -// Replace current turret weapon with ammo handling weapon -private _currentWeapon = _mortar weaponsTurret [0] select 0; -private _newWeapon = ""; - -if (_currentWeapon == "mortar_82mm") then { - _newWeapon = "ace_mortar_82mm"; -} else { - _newWeapon = getText (configFile >> "CfgWeapons" >> _currentWeapon >> QGVAR(replaceWith)); -}; - -if (_newWeapon != "") then { - _mortar removeWeaponTurret [_currentWeapon,[0]]; - _mortar addWeaponTurret [_newWeapon,[0]]; -}; - -_mortar setVariable [QGVAR(initialized),true,true]; -TRACE_1("Init complete",_mortar); diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index f55e2bcd99b..56ef6a32c52 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -15,32 +15,6 @@ * Public: No */ -#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) +TRACE_1("rangeTableOpen - defer to artillerytables",_this); -private _weaponName = "mortar_82mm"; //todo: work on other weapons - -createDialog "ACE_82mm_RangeTable_Dialog"; -if (isNull (uiNamespace getVariable ["ACE_82mm_RangeTable_Dialog", displayNull])) exitWith {ERROR("Dialog failed to open");}; - -//Get Magazine Types -private _magazines = getArray (configFile >> "CfgWeapons" >> _weaponName >> "magazines"); - -//For now just get settings from first mag, all rounds have same flight characteristics: -if ((count _magazines) < 1) exitWith {ERROR("No Magazines for weapon");}; -private _initSpeed = getNumber (configFile >> "CfgMagazines" >> (_magazines select 0) >> "initSpeed"); - -//Get Charge Modes -private _fireModes = getArray (configFile >> "CfgWeapons" >> _weaponName >> "modes"); - -private _muzzleVelocities = []; -{ - private _showToPlayer = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "showToPlayer"); - if (_showToPlayer == 1) then { - private _artilleryCharge = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "artilleryCharge"); - LIST_CHARGE lbAdd format ["%1: %2", (localize LSTRING(rangetable_charge)), (count _muzzleVelocities)]; - LIST_CHARGE lbSetData [(count _muzzleVelocities), str (_artilleryCharge * _initSpeed)]; - _muzzleVelocities pushBack _artilleryCharge; - }; -} forEach _fireModes; - -LIST_CHARGE lbSetCurSel 0; +["mortar_82mm", 45, 88, GVAR(airResistanceEnabled) || EGVAR(artillerytables,advancedCorrections)] call EFUNC(artillerytables,rangeTableOpen); diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf deleted file mode 100644 index 84bb2fba056..00000000000 --- a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf +++ /dev/null @@ -1,35 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Called when listbox selection changes. Updates the rangetable with new values. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_mk6mortar_fnc_rangeTablePageChange - * - * Public: No - */ - -#define RANGE_TABLE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 20001) -#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) - -private _listBoxData = LIST_CHARGE lbData (lbCurSel LIST_CHARGE); -if (isNil "_listBoxData" || {_listBoxData == ""}) exitWith {ERROR("lbCurSel out of bounds or no data");}; -private _muzzleVelocity = parseNumber _listBoxData; - -private _airFriction = if (GVAR(airResistanceEnabled)) then {MK6_82mm_AIR_FRICTION} else {0}; - -private _precalcArray = [_muzzleVelocity, _airFriction] call FUNC(rangeTablePreCalculatedValues); - -lnbClear RANGE_TABLE; -{ - RANGE_TABLE lnbAddRow _x; -} forEach _precalcArray; - -//put dummy line at end because scrolling is fucked and can't see last line -RANGE_TABLE lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""]; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf deleted file mode 100644 index 7a219e55359..00000000000 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ /dev/null @@ -1,271 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Simple Lookup Table for various muzzle velocities and air frictions. - * Use ace_mk6mortar_fnc_dev_buildTable to build - * - * Arguments: - * 0: Muzzle Velocity - * 1: Air Friction - * - * Return Value: - * Array - * - * Example: - * [200, 0] call ace_mk6mortar_fnc_rangeTablePreCalculatedValues - * - * Public: No - */ - -params ["_muzzleVelocity", "_airFriction"]; - -switch (true) do { - -case ((abs(_muzzleVelocity - 70) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { - [ - ["100","1493","9","1.4","14.0","3.7","0.4","-0.3","0.0","0.0","0.0","0.0"], - ["150","1438","14","1.4","13.9","2.5","0.4","-0.4","0.0","0.0","-0.1","0.0"], - ["200","1381","20","1.4","13.8","1.9","0.5","-0.4","0.0","0.0","-0.1","0.1"], - ["250","1321","27","1.5","13.6","1.5","0.5","-0.4","0.0","0.0","-0.1","0.1"], - ["300","1256","36","1.6","13.3","1.3","0.6","-0.5","0.0","-0.1","-0.1","0.1"], - ["350","1183","49","1.7","12.9","1.1","0.6","-0.5","0.1","-0.1","-0.1","0.1"], - ["400","1097","70","1.9","12.4","0.9","0.6","-0.5","0.1","-0.1","-0.2","0.1"], - ["450","979","113","2.3","11.6","0.8","0.6","-0.5","0.1","-0.1","-0.2","0.2"] - ] - }; -case ((abs(_muzzleVelocity - 140) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { - [ - ["150","1556","1","0.8","27.2","16.3","2.5","-2.4","0.0","0.0","-0.2","0.2"], - ["200","1541","1","0.8","27.2","12.3","2.5","-2.4","0.0","0.0","-0.3","0.2"], - ["250","1527","2","0.8","27.2","9.9","2.6","-2.4","0.0","0.0","-0.3","0.3"], - ["300","1512","2","0.8","27.2","8.3","2.7","-2.4","0.1","0.0","-0.4","0.4"], - ["350","1497","3","0.8","27.1","7.1","2.7","-2.5","0.0","-0.1","-0.5","0.4"], - ["400","1482","3","0.8","27.1","6.2","2.7","-2.5","0.1","-0.1","-0.5","0.5"], - ["450","1467","3","0.8","27.0","5.6","2.8","-2.5","0.1","-0.1","-0.6","0.6"], - ["500","1451","4","0.8","27.0","5.0","2.9","-2.6","0.1","-0.1","-0.6","0.6"], - ["550","1436","4","0.8","26.9","4.6","2.9","-2.6","0.1","-0.1","-0.7","0.7"], - ["600","1420","5","0.8","26.8","4.2","3.0","-2.7","0.1","-0.1","-0.8","0.8"], - ["650","1404","5","0.8","26.8","3.9","3.0","-2.7","0.1","-0.1","-0.9","0.8"], - ["700","1388","6","0.8","26.7","3.6","3.1","-2.8","0.1","-0.1","-0.9","0.9"], - ["750","1372","6","0.8","26.6","3.4","3.2","-2.8","0.1","-0.1","-1.0","1.0"], - ["800","1355","7","0.8","26.5","3.2","3.2","-2.9","0.1","-0.1","-1.1","1.1"], - ["850","1338","8","0.8","26.4","3.0","3.3","-2.9","0.1","-0.1","-1.1","1.1"], - ["900","1321","8","0.8","26.2","2.8","3.4","-3.0","0.1","-0.1","-1.2","1.2"], - ["950","1303","9","0.9","26.1","2.7","3.4","-3.1","0.1","-0.2","-1.3","1.2"], - ["1000","1285","10","0.9","26.0","2.6","3.5","-3.1","0.2","-0.1","-1.4","1.3"], - ["1050","1266","11","0.9","25.8","2.4","3.5","-3.2","0.1","-0.2","-1.4","1.4"], - ["1100","1247","12","0.9","25.7","2.3","3.6","-3.3","0.1","-0.2","-1.5","1.4"], - ["1150","1228","13","0.9","25.5","2.2","3.7","-3.3","0.2","-0.2","-1.6","1.5"], - ["1200","1207","14","1.0","25.3","2.1","3.7","-3.4","0.2","-0.2","-1.7","1.6"], - ["1250","1186","15","1.0","25.1","2.0","3.8","-3.4","0.2","-0.2","-1.7","1.7"], - ["1300","1163","17","1.0","24.8","1.9","3.8","-3.5","0.2","-0.2","-1.8","1.7"], - ["1350","1140","19","1.0","24.6","1.9","3.9","-3.5","0.2","-0.2","-1.9","1.8"], - ["1400","1115","21","1.1","24.3","1.8","3.9","-3.6","0.2","-0.2","-1.9","1.9"], - ["1450","1088","24","1.1","23.9","1.7","4.0","-3.6","0.2","-0.2","-2.0","1.9"], - ["1500","1060","27","1.2","23.6","1.6","4.0","-3.7","0.2","-0.2","-2.1","2.0"], - ["1550","1028","32","1.3","23.1","1.5","4.0","-3.7","0.2","-0.2","-2.1","2.1"], - ["1600","991","38","1.4","22.6","1.5","4.0","-3.7","0.2","-0.2","-2.2","2.1"], - ["1650","947","49","1.7","21.9","1.4","4.0","-3.7","0.2","-0.3","-2.3","2.2"], - ["1700","888","71","2.1","21.0","1.3","3.9","-3.6","0.3","-0.3","-2.3","2.2"] - ] - }; -case ((abs(_muzzleVelocity - 200) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { - [ - ["250","1559","1","0.6","37.3","23.8","6.1","-5.9","0.0","0.0","-0.6","0.5"], - ["300","1551","1","0.6","37.3","20.0","6.1","-5.9","0.1","0.0","-0.7","0.7"], - ["350","1543","1","0.6","37.3","17.2","6.2","-5.9","0.0","-0.1","-0.8","0.7"], - ["400","1535","1","0.6","37.3","15.1","6.2","-5.9","0.1","0.0","-0.9","0.9"], - ["450","1527","1","0.6","37.3","13.4","6.3","-6.0","0.1","-0.1","-1.0","1.0"], - ["500","1519","1","0.6","37.2","12.1","6.3","-6.0","0.1","-0.1","-1.1","1.1"], - ["550","1510","1","0.6","37.2","11.0","6.4","-6.0","0.1","-0.1","-1.3","1.2"], - ["600","1502","1","0.6","37.2","10.1","6.4","-6.1","0.1","-0.1","-1.4","1.3"], - ["650","1494","1","0.6","37.2","9.4","6.5","-6.1","0.1","-0.1","-1.5","1.4"], - ["700","1485","2","0.6","37.1","8.7","6.5","-6.2","0.1","-0.1","-1.6","1.5"], - ["750","1477","2","0.6","37.1","8.2","6.6","-6.2","0.1","-0.1","-1.7","1.6"], - ["800","1468","2","0.6","37.0","7.7","6.7","-6.3","0.1","-0.1","-1.8","1.8"], - ["850","1460","2","0.6","37.0","7.2","6.7","-6.3","0.1","-0.1","-2.0","1.9"], - ["900","1451","2","0.6","37.0","6.8","6.8","-6.4","0.1","-0.1","-2.1","2.0"], - ["950","1443","2","0.6","36.9","6.5","6.9","-6.4","0.1","-0.1","-2.2","2.1"], - ["1000","1434","2","0.6","36.9","6.2","6.9","-6.5","0.1","-0.1","-2.3","2.2"], - ["1050","1425","2","0.6","36.8","5.9","7.0","-6.6","0.1","-0.2","-2.5","2.3"], - ["1100","1417","3","0.6","36.8","5.6","7.1","-6.6","0.1","-0.2","-2.6","2.4"], - ["1150","1408","3","0.6","36.7","5.4","7.1","-6.7","0.2","-0.2","-2.7","2.5"], - ["1200","1399","3","0.6","36.6","5.2","7.2","-6.7","0.2","-0.2","-2.8","2.7"], - ["1250","1390","3","0.6","36.6","5.0","7.3","-6.8","0.2","-0.2","-2.9","2.8"], - ["1300","1381","3","0.6","36.5","4.8","7.4","-6.9","0.2","-0.2","-3.0","2.9"], - ["1350","1372","3","0.6","36.4","4.6","7.4","-6.9","0.2","-0.2","-3.2","3.0"], - ["1400","1362","4","0.6","36.4","4.4","7.5","-7.0","0.2","-0.2","-3.3","3.1"], - ["1450","1353","4","0.6","36.3","4.3","7.6","-7.1","0.2","-0.2","-3.4","3.2"], - ["1500","1344","4","0.6","36.2","4.2","7.7","-7.1","0.2","-0.2","-3.5","3.4"], - ["1550","1334","4","0.6","36.1","4.0","7.7","-7.2","0.2","-0.2","-3.7","3.5"], - ["1600","1324","4","0.6","36.0","3.9","7.8","-7.3","0.2","-0.2","-3.8","3.6"], - ["1650","1314","4","0.7","35.9","3.8","7.9","-7.3","0.2","-0.2","-3.9","3.7"], - ["1700","1304","5","0.7","35.8","3.7","7.9","-7.4","0.2","-0.2","-4.0","3.8"], - ["1750","1294","5","0.7","35.7","3.6","8.0","-7.5","0.2","-0.2","-4.2","3.9"], - ["1800","1284","5","0.7","35.6","3.5","8.1","-7.6","0.2","-0.3","-4.3","4.0"], - ["1850","1274","5","0.7","35.5","3.4","8.2","-7.6","0.2","-0.3","-4.4","4.2"], - ["1900","1263","6","0.7","35.4","3.3","8.2","-7.7","0.2","-0.3","-4.5","4.3"], - ["1950","1253","6","0.7","35.2","3.2","8.3","-7.8","0.2","-0.3","-4.7","4.4"], - ["2000","1242","6","0.7","35.1","3.1","8.4","-7.8","0.3","-0.3","-4.8","4.5"], - ["2050","1231","7","0.7","35.0","3.0","8.4","-7.9","0.3","-0.3","-4.9","4.7"], - ["2100","1219","7","0.7","34.8","2.9","8.5","-8.0","0.3","-0.3","-5.0","4.8"], - ["2150","1208","7","0.7","34.7","2.9","8.5","-8.0","0.3","-0.3","-5.2","4.9"], - ["2200","1196","8","0.7","34.5","2.8","8.6","-8.1","0.3","-0.3","-5.3","5.0"], - ["2250","1184","8","0.7","34.3","2.7","8.7","-8.2","0.3","-0.3","-5.4","5.1"], - ["2300","1171","9","0.8","34.2","2.7","8.7","-8.2","0.3","-0.3","-5.5","5.2"], - ["2350","1158","9","0.8","34.0","2.6","8.8","-8.3","0.3","-0.3","-5.7","5.4"], - ["2400","1145","10","0.8","33.8","2.5","8.8","-8.3","0.3","-0.3","-5.8","5.5"], - ["2450","1132","10","0.8","33.6","2.5","8.9","-8.4","0.3","-0.3","-5.9","5.6"], - ["2500","1118","11","0.8","33.3","2.4","8.9","-8.4","0.3","-0.3","-6.0","5.7"], - ["2550","1103","12","0.8","33.1","2.4","9.0","-8.5","0.3","-0.3","-6.1","5.8"], - ["2600","1088","13","0.9","32.8","2.3","9.0","-8.5","0.4","-0.3","-6.2","5.9"], - ["2650","1072","14","0.9","32.6","2.2","9.0","-8.6","0.4","-0.4","-6.4","6.0"], - ["2700","1056","15","0.9","32.3","2.2","9.0","-8.6","0.3","-0.4","-6.5","6.1"], - ["2750","1038","16","1.0","31.9","2.1","9.1","-8.6","0.4","-0.4","-6.6","6.3"], - ["2800","1020","18","1.0","31.6","2.1","9.1","-8.6","0.4","-0.4","-6.7","6.4"], - ["2850","1000","20","1.1","31.2","2.0","9.1","-8.6","0.4","-0.4","-6.8","6.5"], - ["2900","978","22","1.1","30.8","1.9","9.0","-8.6","0.4","-0.4","-6.9","6.5"], - ["2950","954","26","1.2","30.3","1.9","9.0","-8.6","0.4","-0.4","-7.0","6.6"], - ["3000","927","31","1.4","29.7","1.8","8.9","-8.5","0.4","-0.4","-7.1","6.7"], - ["3050","894","38","1.6","29.0","1.7","8.8","-8.4","0.4","-0.4","-7.2","6.8"], - ["3100","849","54","2.0","27.9","1.6","8.5","-8.3","0.4","-0.4","-7.2","6.8"] - ] - }; -case ((abs(_muzzleVelocity - 70) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { - [ - ["100","1497","9","1.3","14.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["150","1445","14","1.3","14.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["200","1390","19","1.4","14.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["250","1333","26","1.4","13.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["300","1272","34","1.5","13.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["350","1204","45","1.6","13.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["400","1127","61","1.8","12.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["450","1028","91","2.1","12.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] - ] - }; -case ((abs(_muzzleVelocity - 140) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { - [ - ["150","1562","1","0.7","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["200","1549","1","0.7","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["250","1536","2","0.7","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["300","1523","2","0.7","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["350","1510","2","0.7","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["400","1497","3","0.7","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["450","1484","3","0.7","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["500","1471","3","0.7","28.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["550","1458","4","0.7","28.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["600","1445","4","0.7","28.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["650","1431","4","0.7","28.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["700","1418","5","0.7","28.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["750","1404","5","0.7","28.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["800","1390","6","0.7","27.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["850","1376","6","0.7","27.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["900","1362","6","0.8","27.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["950","1348","7","0.8","27.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1000","1333","7","0.8","27.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1050","1318","8","0.8","27.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1100","1303","9","0.8","27.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1150","1288","9","0.8","27.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1200","1272","10","0.8","27.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1250","1256","11","0.8","26.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1300","1239","12","0.8","26.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1350","1222","13","0.9","26.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1400","1205","13","0.9","26.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1450","1187","15","0.9","26.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1500","1168","16","0.9","26.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1550","1148","18","1.0","25.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1600","1127","19","1.0","25.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1650","1105","21","1.1","25.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1700","1082","24","1.1","24.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1750","1057","27","1.2","24.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1800","1029","31","1.3","24.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1850","997","37","1.4","23.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1900","960","46","1.6","23.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1950","912","63","1.9","22.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] - ] - }; -case ((abs(_muzzleVelocity - 200) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { - [ - ["300","1563","0","0.5","40.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["350","1556","1","0.5","40.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["400","1550","1","0.5","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["450","1544","1","0.5","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["500","1537","1","0.5","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["550","1531","1","0.5","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["600","1525","1","0.5","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["650","1519","1","0.5","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["700","1512","1","0.5","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["750","1506","1","0.5","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["800","1499","1","0.5","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["850","1493","1","0.5","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["900","1487","1","0.5","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["950","1480","1","0.5","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1000","1474","2","0.5","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1050","1467","2","0.5","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1100","1461","2","0.5","40.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1150","1454","2","0.5","40.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1200","1448","2","0.5","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1250","1441","2","0.5","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1300","1435","2","0.5","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1350","1428","2","0.5","40.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1400","1422","2","0.5","40.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1450","1415","2","0.5","40.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1500","1408","2","0.5","40.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1550","1402","3","0.5","40.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1600","1395","3","0.5","40.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1650","1388","3","0.5","39.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1700","1381","3","0.5","39.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1750","1374","3","0.5","39.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1800","1367","3","0.5","39.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1850","1360","3","0.5","39.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1900","1353","3","0.5","39.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1950","1346","4","0.5","39.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2000","1339","4","0.5","39.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2050","1332","4","0.5","39.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2100","1325","4","0.6","39.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2150","1317","4","0.6","39.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2200","1310","4","0.6","39.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2250","1302","4","0.6","39.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2300","1295","5","0.6","39.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2350","1287","5","0.6","38.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2400","1280","5","0.6","38.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2450","1272","5","0.6","38.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2500","1264","5","0.6","38.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2550","1256","5","0.6","38.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2600","1248","6","0.6","38.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2650","1240","6","0.6","38.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2700","1232","6","0.6","38.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2750","1223","6","0.6","38.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2800","1215","7","0.6","37.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2850","1206","7","0.6","37.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2900","1197","7","0.6","37.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2950","1188","7","0.7","37.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3000","1179","8","0.7","37.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3050","1170","8","0.7","37.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3100","1160","8","0.7","37.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3150","1151","9","0.7","36.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3200","1141","9","0.7","36.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3250","1131","10","0.7","36.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3300","1120","10","0.7","36.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3350","1109","11","0.8","36.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3400","1098","11","0.8","35.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3450","1087","12","0.8","35.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3500","1075","13","0.8","35.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3550","1062","14","0.8","35.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3600","1049","15","0.9","35.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3650","1036","16","0.9","34.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3700","1021","17","0.9","34.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3750","1006","19","1.0","34.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3800","990","21","1.1","33.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3850","971","24","1.1","33.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3900","952","27","1.2","32.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3950","929","32","1.4","32.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["4000","900","40","1.6","31.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["4050","861","56","2.1","30.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] - ] - }; - default { - ERROR("MuzzleVelocity not found in LUT"); - [] - }; -}; diff --git a/addons/mk6mortar/functions/fnc_toggleMils.sqf b/addons/mk6mortar/functions/fnc_toggleMils.sqf index a2c2a29789f..f010848acf7 100644 --- a/addons/mk6mortar/functions/fnc_toggleMils.sqf +++ b/addons/mk6mortar/functions/fnc_toggleMils.sqf @@ -5,7 +5,6 @@ * * Arguments: * 0: Vehicle - * 1: Player * * Return Value: * None @@ -16,7 +15,8 @@ * Public: No */ -params ["_mortarVeh", "_unit"]; +params ["_mortarVeh"]; +TRACE_1("toggleMils",_mortarVeh); private _currentSetting = _mortarVeh getVariable [QGVAR(useMils), true]; _mortarVeh setVariable [QGVAR(useMils), (!_currentSetting)]; diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index aa2e9f2823e..0a7ad4b928d 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -19,7 +19,7 @@ disableSerialization; params ["_display", "_rscType"]; -TRACE_2("params",_display,_rscType); +TRACE_2("turretDisplayLoaded",_display,_rscType); if (_rscType != "Mk6Mortar") exitWith {}; if (isNull _display) exitWith {}; diff --git a/addons/mk6mortar/functions/fnc_unloadMagazine.sqf b/addons/mk6mortar/functions/fnc_unloadMagazine.sqf deleted file mode 100644 index 4da21b3e8f4..00000000000 --- a/addons/mk6mortar/functions/fnc_unloadMagazine.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Grey - * - * Unload current magazine from static weapon - * - * Arguments: - * 0: static - * 1: unit - * - * Return Value: - * None - * - * Example: - * [_target, _player] call ace_mk6mortar_fnc_unloadMagazine - * - * Public: Yes - */ - -params ["_static","_unit"]; - -//Get weapon & magazine information about static weapon -private _currentMagazine = (magazinesAllTurrets _static) select 1; -private _currentMagazineClass = _currentMagazine select 0; -private _ammoCount = _currentMagazine select 2; - -// Try to add the round to player inventory, otherwise place it on the ground near the player -if (_ammoCount > 0) then { - if (_unit canAdd _currentMagazineClass) then { - _unit addMagazineGlobal _currentMagazineClass; - } else { - _pos = _unit modelToWorldVisual [0.5,0.5,0]; // Front right of player - _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; - _unit addMagazineAmmoCargo [_currentMagazineClass, 1, _ammoCount]; - _unit setPosATL _pos; - }; - [QGVAR(removeMagazine), [_static, _currentMagazineClass]] call CBA_fnc_globalEvent; -}; diff --git a/addons/mk6mortar/functions/fnc_unloadMagazineTimer.sqf b/addons/mk6mortar/functions/fnc_unloadMagazineTimer.sqf deleted file mode 100644 index 4c152bc7d16..00000000000 --- a/addons/mk6mortar/functions/fnc_unloadMagazineTimer.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Grey - * - * Unload current magazine from static weapon using a timer - * - * Arguments: - * 0: static - * 1: unit - * 2: time to unload - * - * Return Value: - * None - * - * Example: - * [_target, _player, 5] call ace_mk6mortar_fnc_unloadMagazineTimer - * - * Public: Yes - */ - -params ["_static","_unit","_timeToUnload"]; - -_static setVariable [QGVAR(inUse), true, true]; - -//Move player into animation if player is standing -if ((_unit call CBA_fnc_getUnitAnim) select 0 == "stand") then { - [_unit, "AmovPercMstpSrasWrflDnon_diary", 1] call EFUNC(common,doAnimation); -}; - -[_timeToUnload, [_static,_unit], {(_this select 0) call FUNC(unloadMagazine); ((_this select 0) select 0) setVariable [QGVAR(inUse), nil, true]}, {((_this select 0) select 0) setVariable [QGVAR(inUse), nil, true]}, localize LSTRING(unloadingMortar)] call EFUNC(common,progressBar); diff --git a/addons/mk6mortar/initSettings.sqf b/addons/mk6mortar/initSettings.sqf new file mode 100644 index 00000000000..1e48575b972 --- /dev/null +++ b/addons/mk6mortar/initSettings.sqf @@ -0,0 +1,44 @@ +// CBA Settings [ADDON: ace_mk6mortar]: +// These settings effect gameplay difficutly: defaults will leave the mortar the same as vanilla + +private _category = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], localize LSTRING(DisplayName)]; + +[ + QGVAR(airResistanceEnabled), "CHECKBOX", + [LSTRING(airResistanceEnabled_DisplayName), LSTRING(airResistanceEnabled_Description)], + _category, + false, // default value + true, // isGlobal + {[QGVAR(airResistanceEnabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(allowComputerRangefinder), "CHECKBOX", + [LSTRING(allowComputerRangefinder_DisplayName), LSTRING(allowComputerRangefinder_Description)], + _category, + true, // default value + true, // isGlobal + {[QGVAR(allowComputerRangefinder), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(allowCompass), "CHECKBOX", + [LSTRING(allowCompass_DisplayName), LSTRING(allowCompass_Description)], + _category, + true, // default value + true, // isGlobal + {[QGVAR(allowCompass), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(useAmmoHandling), "CHECKBOX", + [LSTRING(useAmmoHandling_DisplayName), LSTRING(useAmmoHandling_Description)], + _category, + false, // default value + true, // isGlobal + {[QGVAR(useAmmoHandling), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index e80ba73765d..27758c2091f 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -5,7 +5,7 @@ 82mm Rangetable 82mm Distanztabelle Tabela strzelnicza 82mm - Table de tir 82mm + Table de tir 82 mm 82 мм Таблица дальностей и прицелов Tabla de distancias de 82mm 82mm hatótáv-tábla @@ -15,13 +15,14 @@ 82mm 射表 82mm 사거리표 82mm迫击炮射表 - 82mm迫擊炮射表 + 82毫米迫擊炮射表 + 82mm Menzil Tablosu Range Table for the Mk6 82mm Mortar Distanztabelle für den Mk6 82mm Mortar Tabela strzelnicza dla moździerza 82mm Mk6 - Table de tir pour le mortier Mk6 82mm + Table de tir pour le mortier Mk6 82 mm. Таблица дальностей и прицелов для Mk6 82 мм мортиры Tabla de distancias para el mortero Mk6 de 82mm Hatótáv-tábla a Mk6 82mm-es mozsárhoz @@ -31,13 +32,14 @@ Mk6 82mm 迫撃砲の射表 Mk6 82mm 박격포 사격을 위한 사거리표 MK6 82mm迫击炮射表 - MK6 82mm迫擊炮射表 + MK6 82毫米迫擊炮射表 + Mk6 82mm için Menzil Tablosu Open 82mm Rangetable Öffne 82mm Distanztabelle Otwórz tabelę strzelniczą 82mm - Ouvrir la table de tir 82mm + Ouvrir la table de tir 82 mm Открыть 82 мм Таблицу дальностей и прицелов Abrir tabla de distancias de 82mm 82mm hatótáv-tábla megnyitása @@ -47,7 +49,8 @@ 82mm 射表を開く 82mm 사거리표 열기 开启82mm迫击炮射表 - 開啟82mm迫擊炮射表 + 開啟82毫米迫擊炮射表 + 82mm Menzil Tablosunu Aç Charge @@ -64,6 +67,7 @@ 장약 装药 裝藥 + Yükle Mk6 Mortar @@ -74,6 +78,10 @@ Mk6 迫撃砲 Mortier Mk6 Moździerz Mk6 + Миномет Mk6 + Morteiro Mk6 + Minomet Mk6 + Mk6 Havan Mk6 Settings @@ -82,7 +90,7 @@ Mk6-Einstellungen Mk6 - Nastavení Ajustes do Mk6 - Option du Mk6 + Paramètres du Mk6 Mk6 beállítások Настройки Mk6 Impostazioni Mk6 @@ -90,6 +98,7 @@ Mk6 설정 MK6设定 MK6設定 + Mk6 Ayarları Air Resistance @@ -106,6 +115,7 @@ 공기저항 空气阻力 空氣阻力 + Hava Direnci For Player Shots, Model Air Resistance and Wind Effects @@ -114,7 +124,7 @@ Für Spielerschüsse, Luftwiderstand und Windeffekte Pro hráčovu střelbu, Model odporu vzduchu a povětrných podmínek Para disparos do jogador, modelo de resistência de ar e efeitos de vento - Pour les tirs de joueurs, modèle de résistance à l'air et d'effet du vent + Pour les tirs des joueurs, simule la résistance de l'air et les effets du vent. Játékos általi lövésekhez, legyen-e számított légellenállás és szélhatás Для выстрелов игрока. Моделирует сопротивление воздуха и эффект ветра Per Proiettili dei Giocatori, simula la Resistenza dell'Aria e gli Effetti del Vento @@ -130,7 +140,7 @@ Erlaube Mk6-Computer Mk6 - Povolit počítač Permitir computador do Mk6 - Autoriser l'ordinateur de tir pour Mk6 + Activer l'ordinateur de tir du Mk6 Mk6 számítógép engedélyezése Разрешить компьютер Mk6 Consenti Computer Mk6 @@ -138,6 +148,7 @@ Mk6 탄도계산컴퓨터 허가 允许使用MK6射控电脑 允許使用MK6射控電腦 + Mk6 bilgisayarına izin ver Show the Computer and Rangefinder (these NEED to be removed if you enable air resistance) @@ -146,7 +157,7 @@ Zeige den Computer und den Entfernungsmesser an (diese MÜSSEN entfernt werden, wenn der Luftwiderstand aktiviert ist) Zobrazit počítač a dálkoměr (toto MUSÍ být odstraněno pokud je zapnut odpor vzduchu) Mostra o computador e o medidor de distância (estes DEVEM ser removidos se você habilitar resistência do ar) - Affiche l'ordinateur de tir (cette option doit être DESACTIVEE si la résisance à l'air est activée) + Affiche l'ordinateur de tir et le télémètre. Cette option doit être DÉSACTIVÉE si la résistance de l'air est activée. A távmérő és számítógép megjelenítése (ezeket el KELL távolítani ha a légellenállás engedélyezve van) Показывает компьютер и дальномер (это НУЖНО отключить, если вы включаете сопротивление воздуха) Mostra il Computer e Distaziometro (questi DEVONO essere rimossi se vuoi abilitare la resistenza dell'aria) @@ -162,7 +173,7 @@ Erlaube Mk6-Kompass Mk6 - Povolit kompas Permitir bússula do Mk6 - Autoriser la boussole pour Mk6 + Activer la boussole du Mk6 Mk6 iránytű engedélyezése Разрешить компас Mk6 Consenti Bussola Mk6 @@ -170,6 +181,7 @@ Mk6 나침반 허용 允许使用MK6指北针 允許使用MK6指北針 + Mk6 pusulasına izin ver Show the Mk6 Digital Compass @@ -178,7 +190,7 @@ Zeige Mk6-Digitaler-Kompass Mk6 - Zobrazit digitální kompas Mostra a bússula digital do Mk6 - Affiche la boussole digitale pour le Mk6 + Affiche la boussole numérique du Mk6. Az Mk6 digitális iránytű megjelenítése Показывает цифровой компас Mk6 Mostra la Bussola Digitale Mk6 @@ -186,6 +198,7 @@ Mk6 에서 전자 나침반을 보여줍니다 显示MK6的数位指北针 顯示MK6的數位指北針 + Mk6 Dijital Pusulasını göster This module allows you to setup Mk6 mortar settings. @@ -194,7 +207,7 @@ Tento modul umožňuje nastavení minometu Mk6. Este módulo permite que você ajuste o morteiro Mk6. Модуль настройки миномета Mk6. - Ce module permet de régler les options du mortier Mk6 + Ce module permet de régler les options du mortier Mk6. Questo modulo ti consente di impostare i parametri del mortaio Mk6. Este módulo permite configurar los parámetros del mortero Mk6. Mk6 迫撃砲への設定をできます。 @@ -215,13 +228,14 @@ 탄약 관리 활성화 使用手动弹药装卸 使用手動彈藥裝卸 + Používat ruční manipulaci s municí Removes mortar magazines, requiring individual rounds to be loaded by the gunner or loader. Does not affect AI mortars. Enfernt das Magzin des Mörsers. Es ist nun erforderlich, die einzelnen Patronen manuell zu laden. Dies beeinflusst nicht die KI-Truppen. Elimina los cargadores del mortero, requiriendo al artillero o cargador la carga manual de cada rondas. No afecta morteros controlados por IA. Usuwa magazynki moździerza, wymagając ładowania pojedynczych pocisków przez strzelca lub ładowniczego. Nie dotyczy moździerzy AI. - Enlever les chargeurs de mortier, requiert des obus individuels qui doivent être chargés par le tireur ou le servant. N'affect pas les mortiers IA. + Enlève les chargeurs de mortier, ce qui oblige le tireur ou le servant à charger les obus manuellement. N'affecte pas les mortiers IA. Toglie i proiettili dal mortaio. I colpi singoli devono essere caricati dall'operatore. Non cambia quado l'IA spara. Elimina os carregadores do morteiro, requerendo que o atirador ou carregador utilize de forma individual a munição. Não afeta os morteiros controlados pela IA. Удаляет артиллерийские магазины, требует загрузку отдельных снарядов стрелком или заряжащим. Не влияет на артиллерию ИИ. @@ -229,13 +243,14 @@ 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야만 합니다. 인공지능은 영향을 받지 않습니다. 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填。此功能并不影响由AI射击的迫击炮 開啟此功能時。迫擊砲的彈藥需由砲手與裝填手共同合作來進行裝填。此功能並不影響由AI射擊的迫擊砲 + Odstraní z minometu zásobník a vynucuje nabíjení po každém výstřelu buď mířičem nebo nabíječem. Tato možnost neovlivňuje AI posádky. Remove Round Entferne Patrone Extraer ronda Wyładuj pocisk - Enlever l'obus + Retirer l'obus Togli proiettile Odstranit náboj Remover munição @@ -244,6 +259,7 @@ 탄약 제거 卸除弹头 卸除彈頭 + Mermiyi Boşalt Load Mortar @@ -259,6 +275,7 @@ 탄약 장전 装载弹头 裝載彈頭 + Havanı Yükle Unloading Round @@ -273,6 +290,8 @@ 탄약 제거중 卸除弹头中 卸除彈頭中 + Vybít minomet + Mermi Boşaltılıyor Preparing Round @@ -284,10 +303,11 @@ Připavuji náboj Preparar munição Подготовка снаряда - 事前に装填 + 砲弾を事前装填 탄약 준비중 准备弹头中 準備彈頭中 + Mermi Hazırlanıyor Load HE @@ -303,6 +323,7 @@ 고폭탄 장전 装载高爆弹 裝載高爆彈 + HE Yükle Load Smoke @@ -314,17 +335,18 @@ Nabít Dýmovnici Carregar Fumaça Зарядить дымовой - 煙幕弾を装填 + 発煙弾を装填 연막탄 장전 装载烟雾弹 裝載煙霧彈 + Sis Yükle Load Illumination Lade Leuchtpatrone Cargar Iluminación Załaduj pocisk oświetlający - Charger Eclairante + Charger Éclairant Carica illuminante Nabít Světlici Carregar Iluminação @@ -333,6 +355,7 @@ 조명탄 장전 装载照明弹 裝載照明彈 + Aydınlatma Yükle Load Guided HE @@ -348,6 +371,7 @@ 유도 고폭탄 장전 装载导引高爆弹 裝載導引高爆彈 + Güdümlü HE Yükle Load Laser Guided HE @@ -363,13 +387,14 @@ 레이저 유도 고폭탄 장전 装载雷射导引高爆弹 裝載雷射導引高爆彈 + Lazer Güdümlü HE Yükle 82mm HE Round 82mm Sprengpatrone Ronda 82mm HE Pocisk wybuchowy kal. 82mm - Obus de 82mm HE + Obus de 82 mm HE Proiettile da 82mm HE 82mm HE náboj Munição 82mm HE @@ -377,29 +402,31 @@ 82mm りゅう弾 82mm 고폭탄 82mm高爆弹 - 82mm高爆彈 + 82毫米高爆彈 + 82mm HE Mermisi 82mm Smoke Round 82mm Nebelpatrone Ronda 82mm Humo Pocisk dymny kal. 82mm - Obus de 82mm fumigène + Obus de 82 mm fumigène Proiettile Fumogeno da 82mm 82mm Kouřový náboj Munição 82mm Fumaça Дымовой снаряд 82мм - 82mm 煙幕弾 + 82mm 発煙弾 82mm 연막탄 82mm烟雾弹 - 82mm煙霧彈 + 82毫米煙霧彈 + 82mm Sis Mermisi 82mm Illumination Round 82mm Leuchtpatrone Ronda 82mm Iluminación Pocisk oświetlający kal. 82mm - Obus de 82mm éclairant + Obus de 82 mm éclairant Proiettile illuminante da 82mm 82mm Osvětlovací náboj Munição 82mm Iluminação @@ -407,14 +434,15 @@ 82mm 照明弾 82mm 조명탄 82mm照明弹 - 82mm照明彈 + 82毫米照明彈 + 82mm Işık Mermisi 82mm Guided HE Round 82mm gelenkte Sprengpatrone Ronda 82mm Guiada Kierowany pocisk wybuchowy kal. 82mm - Obus de 82mm HE guidé + Obus de 82 mm HE guidé Proiettile HE guidato 82mm HE náboj (naváděný) Munição 82mm HE Guiada @@ -422,14 +450,15 @@ 82mm 誘導りゅう弾 82mm 유도 고폭탄 82mm导引高爆弹 - 82mm導引高爆彈 + 82毫米導引高爆彈 + 82mm Güdümlü HE Mermisi 82mm Laser Guided HE Round 82mm lasergelenkte Sprengpatrone Ronda 82mm Guiada por Laser Laserowo napr. pocisk wybuchowy kal. 82mm - Obus de 82mm HE guidé au laser + Obus de 82 mm HE guidé au laser Proiettile HE a guida laser 82mm HE náboj (naváděný laserem) Munição 82mm HE Guiada por Laser @@ -437,14 +466,15 @@ 82mm レーザ誘導りゅう弾 82mm 레이저 유도 고폭탄 82mm雷射导引高爆弹 - 82mm雷射導引高爆彈 + 82毫米雷射導引高爆彈 + 82mm Lazer Güdümlü HE Mermisi Used in Mk6 mortar Wird im Mk6 Mörser verwendet Usada en el mortero Mk6 Używany w moździerzu Mk6 - Utilisé dans le mortier Mk6 + Utilisé dans le mortier Mk6. Usato nel mortaio Mk6 Používá se u minometu Mk6 Usada no Morteiro MK6 @@ -459,7 +489,7 @@ [ACE] 82mm Sprengpatronenkiste [ACE] Caja de municiones 82mm HE [ACE] Skrzynka amunicji wybuchowej 82mm - [ACE] Obus de 82mm HE + [ACE] Obus de 82 mm HE [ACE] Scatola proiettili espolisvi ad alto potenziale (HE) da 82mm [ACE] Bedna s municí (82mm HE) [ACE] Caixa de Munição 82mm HE @@ -467,29 +497,31 @@ [ACE] 82mm りゅう弾入り弾薬箱 [ACE] 82mm 고폭탄 상자 [ACE] 82mm高爆弹药箱 - [ACE] 82mm高爆彈藥箱 + [ACE] 82毫米高爆彈藥箱 + [ACE] 82mm HE Mermisi Kutusu [ACE] 82mm Smoke Rounds Box [ACE] 82mm Nebelpatronenkiste [ACE] Caja de municiones 82mm Humo [ACE] Skrzynka amunicji dymnej 82mm - [ACE] Obus de 82mm fumigène + [ACE] Obus de 82 mm fumigène [ACE] Scatola fumogeni da 82mm [ACE] Bedna s municí (82mm Dýmovnice) [ACE] Caixa de Munição 82mm Fumaça [ACE] Ящик дымовых снарядов 82мм - [ACE] 82mm 煙幕弾入り弾薬箱 + [ACE] 82mm 発煙弾入り弾薬箱 [ACE] 82mm 연막탄 상자 [ACE] 82mm烟雾弹药箱 - [ACE] 82mm煙霧彈藥箱 + [ACE] 82毫米煙霧彈藥箱 + [ACE] 82mm Sis Mermisi Kutusu [ACE] 82mm Illumination Rounds Box [ACE] 82mm Leuchtpatronenkiste [ACE] Caja de municiones 82mm Iluminacion [ACE] Skrzynka amunicji oświetlającej 82mm - [ACE] Obus de 82mm éclairants + [ACE] Obus de 82 mm éclairants [ACE] Scatola illuminanti da 82mm [ACE] Bedna s municí (82mm Světlice) [ACE] Caixa de Munição 82mm Iluminação @@ -497,22 +529,24 @@ [ACE] 82mm 照明弾入り弾薬箱 [ACE] 82mm 조명탄 상자 [ACE] 82mm照明弹药箱 - [ACE] 82mm照明彈藥箱 + [ACE] 82毫米照明彈藥箱 + [ACE] 82mm Işık Mermisi Kutusu [ACE] 82mm Default Loadout Box [ACE] 82mm Standardkiste [ACE] Caja de municiones 82mm por defecto [ACE] Skrzynka amunicji standardowej 82mm - [ACE] Obus de 82mm par défaut + [ACE] Obus de 82 mm par défaut [ACE] Scatola proiettili 82mm standard [ACE] Bedna se standardní 82mm municí [ACE] Caixa de Munição 82mm Padrão [ACE] Ящик снарядов 82мм (стандартный) - [ACE] 82mm 梱包箱 + [ACE] 82mm 保管箱 [ACE] 82mm 기본 장비 상자 [ACE] 82mm预设弹药箱 - [ACE] 82mm預設彈藥箱 + [ACE] 82毫米預設彈藥箱 + [ACE] 82mm Varsayılan Teçhizat Kutusu diff --git a/addons/movement/CfgMoves.hpp b/addons/movement/CfgMoves.hpp index c8273fcdb2f..edf6bac4a34 100644 --- a/addons/movement/CfgMoves.hpp +++ b/addons/movement/CfgMoves.hpp @@ -57,13 +57,24 @@ class CfgMovesBasic { // jump animation - WEAPON LOWERED - RUNNING class RifleLowStandActionsNoAdjust; class RifleLowStandActionsRunF: RifleLowStandActionsNoAdjust { - getOver = "AovrPercMrunSrasWrflDf"; + getOver = "ACE_AovrPercMrunSlowWrflDf"; }; class RifleLowStandActionsRunFL: RifleLowStandActionsNoAdjust { - getOver = "AovrPercMrunSrasWrflDf"; + getOver = "ACE_AovrPercMrunSlowWrflDf"; }; class RifleLowStandActionsRunFR: RifleLowStandActionsNoAdjust { - getOver = "AovrPercMrunSrasWrflDf"; + getOver = "ACE_AovrPercMrunSlowWrflDf"; + }; + + // jump animation - WEAPON LOWERED - SPRINTING + class RifleStandLowEvasiveActionsF: RifleLowStandActionsNoAdjust { + getOver = "ACE_AovrPercMrunSlowWrflDf"; + }; + class RifleStandLowEvasiveActionsFR: RifleLowStandActionsNoAdjust { + getOver = "ACE_AovrPercMrunSlowWrflDf"; + }; + class RifleStandLowEvasiveActionsFL: RifleLowStandActionsNoAdjust { + getOver = "ACE_AovrPercMrunSlowWrflDf"; }; }; }; @@ -76,11 +87,178 @@ class CfgMovesMaleSdr: CfgMovesBasic { class AovrPercMrunSrasWrflDf: AovrPercMstpSrasWrflDf { forceAim = 0; }; + class ACE_AovrPercMrunSlowWrflDf: AovrPercMrunSrasWrflDf { // custom + actions = "RifleLowStandActionsRunF"; + + ConnectTo[] = { + "AidlPercMstpSlowWrflDnon_G0S",0.02, + "AmovPercMstpSlowWrflDnon",0.03, + "WeaponMagazineReloadStand",0.1, + //"AmovPercMstpSrasWrflDnon_AmovPercMstpSrasWlnrDnon",0.01, + "AmovPercMstpSlowWrflDnon_AmovPercMstpSrasWrflDnon",0.01, + //"AmovPercMstpSrasWrflDnon_AmovPercMstpSrasWpstDnon",0.02, + //"AmovPercMstpSrasWrflDnon_AwopPercMstpSoptWbinDnon",0.02, + //"AmovPercMstpSrasWrflDnon_AmovPercMstpSnonWnonDnon",0.02, + "AwopPercMstpSgthWrflDnon_Start2",0.1, + "AmovPercMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon",0.02, + //"AmovPercMstpSrasWrflDnon_AadjPercMstpSrasWrflDup",0.02, + //"AmovPercMstpSrasWrflDnon_AadjPercMstpSrasWrflDdown",0.02, + //"AmovPercMstpSrasWrflDnon_AadjPercMstpSrasWrflDleft",0.02, + //"AmovPercMstpSrasWrflDnon_AadjPercMstpSrasWrflDright",0.02, + "AmovPercMstpSrasWrflDnon_AmovPercMstpSrasWrflDnon_gear",0.02 + }; + InterpolateTo[] = { + "AmovPercMstpSlowWrflDnon_turnL",0.02, + "AmovPercMstpSlowWrflDnon_turnR",0.02, + "AmovPercMstpSlowWrflDnon_AmovPknlMstpSlowWrflDnon",0.01, + "AmovPercMstpSlowWrflDnon_AmovPpneMstpSrasWrflDnon",0.01, + "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1",0.01, + "Helper_SwitchToCarryRfl",0.2, + "AmovPercMstpSrasWrflDnon_AinvPercMstpSrasWrflDnon",0.02, + "AmovPercMstpSrasWrflDnon_AinvPercMstpSrasWrflDnon_Putdown",0.02, + "AmovPercMwlkSlowWrflDf",0.02, + "AmovPercMwlkSlowWrflDfl",0.02, + "AmovPercMwlkSlowWrflDl",0.02, + "AmovPercMwlkSlowWrflDbl",0.02, + "AmovPercMwlkSlowWrflDb",0.02, + "AmovPercMwlkSlowWrflDbr",0.02, + "AmovPercMwlkSlowWrflDr",0.02, + "AmovPercMwlkSlowWrflDfr",0.02, + "AmovPercMrunSlowWrflDf",0.02, + "AmovPercMrunSlowWrflDfl",0.02, + "AmovPercMrunSlowWrflDl",0.02, + "AmovPercMrunSlowWrflDbl",0.02, + "AmovPercMrunSlowWrflDb",0.02, + "AmovPercMrunSlowWrflDbr",0.02, + "AmovPercMrunSlowWrflDr",0.02, + "AmovPercMrunSlowWrflDfr",0.02, + //"AmovPercMrunSrasWrflDf_ldst",0.02, + //"AmovPercMrunSrasWrflDfl_ldst",0.02, + //"AmovPercMrunSrasWrflDl_ldst",0.02, + //"AmovPercMrunSrasWrflDbl_ldst",0.02, + //"AmovPercMrunSrasWrflDb_ldst",0.02, + //"AmovPercMrunSrasWrflDbr_ldst",0.02, + //"AmovPercMrunSrasWrflDr_ldst",0.02, + //"AmovPercMrunSrasWrflDfr_ldst",0.02, + "AmovPercMstpSlowWrflDnon_AmovPknlMstpSlowWrflDnon",0.02, + "AmovPercMevaSlowWrflDf",0.02, + "AmovPercMevaSlowWrflDfl",0.02, + "AmovPercMevaSlowWrflDfr",0.02, + "AmovPercMstpSlowWrflDnon_SaluteIn",0.03, + "Unconscious",0.02, + "AidlPercMstpSlowWrflDnon_AI",0.02, + "AidlPercMstpSlowWrflDnon_AI",0.02, + "AovrPercMstpSlowWrflDf",1.01, + "AmovPercMtacSlowWrflDfl",0.2, + "AmovPercMtacSlowWrflDl",0.2, + "AmovPercMtacSlowWrflDbl",0.2, + "AmovPercMtacSlowWrflDb",0.2, + "AmovPercMtacSlowWrflDbr",0.2, + "AmovPercMtacSlowWrflDr",0.2, + "AmovPercMtacSlowWrflDfr",0.22, + "AmovPercMtacSlowWrflDf",0.02, + "HaloFreeFall_non",10.2, + "AmovPercMrunSlowWrflDf",0.02, + "AmovPercMrunSlowWrflDfl",0.02, + "AmovPercMrunSlowWrflDl",0.02, + "AmovPercMrunSlowWrflDb",0.02, + "AmovPercMrunSlowWrflDbr",0.02, + "AmovPercMrunSlowWrflDr",0.02, + "AmovPercMrunSlowWrflDbl",0.02, + "AmovPercMrunSlowWrflDfr",0.02, + "AmovPercMstpSrasWrflDnon_falling",0.02, + "AsdvPercMstpSnonWrflDnon",2.02, + "AdvePercMstpSnonWrflDnon",2.02, + "AbdvPercMstpSnonWrflDnon",2.02, + "AinvPercMstpSrasWrflDnon",0.05, + "AmovPknlMstpSlowWrflDnon_AmovPercMstpSlowWrflDnon",0.02, + //"AmovPpneMstpSrasWrflDnon_AmovPercMstpSrasWrflDnon",0.02, + //"AmovPercMstpSlowWrflDnon_AmovPercMstpSrasWrflDnon",0.02, + "AmovPercMstpSlowWrflDnon_AmovPsitMstpSlowWrflDnon",0.02, + "AfalPercMstpSrasWrflDnon",0.025, + //"AmovPercMevaSrasWrflDl",0.025, + //"AmovPercMevaSrasWrflDr",0.025, + "Acts_PercMstpSlowWrflDnon_handup2",1, + "Acts_WalkingChecking",1, + "Acts_PercMstpSlowWrflDnon_handup1",1, + "Acts_PercMstpSlowWrflDnon_handup2b",1, + "Acts_PercMstpSlowWrflDnon_handup2c",1, + "Acts_PercMstpSlowWrflDnon_handup1b",1, + "Acts_PercMstpSlowWrflDnon_handup1c",1, + "HubSpectator_stand",1, + "HubSpectator_walk",1, + "HubStanding_idle1",1, + "HubStanding_idle2",1, + "HubStanding_idle3",1, + "Campaign_Base",0.5, + "CutSceneAnimationBase",0.5, + "AmovPercMlmpSlowWrflDf",0.05, + "AmovPercMlmpSlowWrflDfl",0.05, + "AmovPercMlmpSlowWrflDl",0.05, + "AmovPercMlmpSlowWrflDbl",0.05, + "AmovPercMlmpSlowWrflDb",0.05, + "AmovPercMlmpSlowWrflDbr",0.05, + "AmovPercMlmpSlowWrflDr",0.05, + "AmovPercMlmpSlowWrflDfr",0.05, + "acts_millerDisarming_runToDesk",0.05, + "CutSceneAnimationSmk",0.1, + "UnconsciousFaceDown",0.25, + "UnconsciousMedicFromRifle",0.2 + }; + }; - // replace link of vault with jump animation + // rifle raised, replace link of vault with jump animation class AmovPercMstpSrasWrflDnon; class AmovPercMrunSrasWrflDf: AmovPercMstpSrasWrflDnon { - InterpolateTo[] = {"AovrPercMrunSrasWrflDf",0.22,"AmovPercMrunSlowWrflDf",0.025,"AmovPercMwlkSrasWrflDf",0.025,"AmovPknlMrunSrasWrflDf",0.03,"AmovPercMrunSlowWrflDf_AmovPpneMstpSrasWrflDnon",0.02,"AmovPercMevaSrasWrflDf",0.025,"Unconscious",0.01,"AmovPercMtacSrasWrflDf",0.02,"AmovPercMrunSrasWrflDfl",0.02,"AmovPercMrunSrasWrflDfl_ldst",0.02,"AmovPercMrunSrasWrflDfr",0.02,"AmovPercMrunSrasWrflDfr_ldst",0.02,"AmovPercMstpSrasWrflDnon",0.02,"AmovPercMrunSrasWrflDl",0.02,"AmovPercMrunSrasWrflDbl",0.02,"AmovPercMrunSrasWrflDb",0.02,"AmovPercMrunSrasWrflDbr",0.02,"AmovPercMrunSrasWrflDr",0.02,"AmovPknlMstpSlowWrflDnon_relax",0.1,"AmovPercMrunSrasWrflDf_ldst",0.02,"AmovPercMrunSrasWrflDf",0.02}; + InterpolateTo[] = { + "AovrPercMrunSrasWrflDf",0.22, + "AmovPercMrunSlowWrflDf",0.025, + "AmovPercMwlkSrasWrflDf",0.025, + "AmovPknlMrunSrasWrflDf",0.03, + "AmovPercMrunSlowWrflDf_AmovPpneMstpSrasWrflDnon",0.02, + "AmovPercMevaSrasWrflDf",0.025, + "Unconscious",0.01, + "AmovPercMtacSrasWrflDf",0.02, + "AmovPercMrunSrasWrflDfl",0.02, + "AmovPercMrunSrasWrflDfl_ldst",0.02, + "AmovPercMrunSrasWrflDfr",0.02, + "AmovPercMrunSrasWrflDfr_ldst",0.02, + "AmovPercMstpSrasWrflDnon",0.02, + "AmovPercMrunSrasWrflDl",0.02, + "AmovPercMrunSrasWrflDbl",0.02, + "AmovPercMrunSrasWrflDb",0.02, + "AmovPercMrunSrasWrflDbr",0.02, + "AmovPercMrunSrasWrflDr",0.02, + "AmovPknlMstpSlowWrflDnon_relax",0.1, + "AmovPercMrunSrasWrflDf_ldst",0.02, + "AmovPercMrunSrasWrflDf",0.02 + }; + }; + + // rifle lowered, add link to jump animation + class AmovPercMstpSlowWrflDnon; + class AmovPercMrunSlowWrflDf: AmovPercMstpSlowWrflDnon { + InterpolateTo[] = { + "ACE_AovrPercMrunSlowWrflDf",0.22, + "AmovPercMstpSlowWrflDnon",0.02, + "AmovPercMwlkSlowWrflDf_ver2",0.025, + "AmovPercMwlkSlowWrflDf",0.5, + "AidlPercMrunSrasWrflDf",0.01, + "AmovPercMrunSlowWrflDfl",0.025, + "AmovPercMrunSlowWrflDfr",0.025, + "AmovPercMrunSrasWrflDf",0.025, + "AmovPknlMrunSlowWrflDf",0.03, + "AmovPercMrunSlowWrflDf_AmovPpneMstpSrasWrflDnon",0.02, + "AmovPercMevaSrasWrflDf",0.025, + "AmovPercMevaSlowWrflDf",0.025, + "Unconscious",0.02, + "AmovPercMrunSlowWrflDf_AmovPercMstpSrasWrflDnon_gthStart",0.1, + "AmovPknlMstpSlowWrflDnon_relax",0.1, + "AmovPercMtacSlowWrflDf_ver2",0.2, + "AmovPercMtacSlowWrflDf",0.5, + "AmovPercMwlkSrasWrflDf",0.02, + "AmovPercMtacSrasWrflDf",0.02 + }; }; // enable optics in prone down stance diff --git a/addons/movement/functions/fnc_inventoryDisplayLoad.sqf b/addons/movement/functions/fnc_inventoryDisplayLoad.sqf index d107bd70b13..cdbc85a8954 100644 --- a/addons/movement/functions/fnc_inventoryDisplayLoad.sqf +++ b/addons/movement/functions/fnc_inventoryDisplayLoad.sqf @@ -17,11 +17,15 @@ params ["_display"]; +// forces player name control to display irrespective of isStreamFriendlyUIEnabled +(_display displayCtrl 111) ctrlShow true; + private _fnc_update = { params ["_display"]; private _control = _display displayCtrl 111; + private _format = ["%1 - %2 %3 (%4)", "%2 %3 (%4)"] select isStreamFriendlyUIEnabled; - _control ctrlSetText format ["%1 - %2 %3 (%4)", + _control ctrlSetText format [_format, [ACE_player, false, true] call EFUNC(common,getName), localize ELSTRING(common,Weight), [ACE_player] call EFUNC(common,getWeight), diff --git a/addons/movement/stringtable.xml b/addons/movement/stringtable.xml index 45a3bf65c3d..544e7914a70 100644 --- a/addons/movement/stringtable.xml +++ b/addons/movement/stringtable.xml @@ -16,6 +16,7 @@ 무게를 파운드(lb)로 보여줍니다 使用磅来显示重量 使用磅來顯示重量 + Ağırlığı lb olarak göster Climb @@ -32,6 +33,7 @@ 오르기 攀爬 攀爬 + Tırman Can't climb here @@ -43,11 +45,12 @@ Здесь невозможно взобраться Itt nem tudsz mászni Non puoi arrampicarti qui - Não se pode subir aqui + Não pode subir aqui ここは登れません 这里无法攀爬 這裡無法攀爬 여기는 올라갈 수 없다 + Buraya tırmanamazsın diff --git a/addons/mx2a/stringtable.xml b/addons/mx2a/stringtable.xml index 099a8e7703b..0836523fde2 100644 --- a/addons/mx2a/stringtable.xml +++ b/addons/mx2a/stringtable.xml @@ -16,6 +16,7 @@ MX-2A MX-2A(热成像) MX-2A + MX-2A Thermal imaging device @@ -32,6 +33,7 @@ 열영상 장치 热成像装置 熱成像裝置 + Termal Görüntüleme Aracı diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index 5b5d7b79cc0..c7ca9f73785 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -23,6 +23,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; displayName = CSTRING(ShowVehicleCrewInfo); + description = CSTRING(ShowVehicleCrewInfo_Desc); category = CSTRING(Module_DisplayName); }; class GVAR(showNamesForAI) { @@ -30,13 +31,15 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; displayName = CSTRING(ShowNamesForAI); + description = CSTRING(ShowNamesForAI_Desc); category = CSTRING(Module_DisplayName); }; class GVAR(showCursorTagForVehicles) { - displayName = CSTRING(showCursorTagForVehicles_DisplayName); value = 0; typeName = "BOOL"; isClientSettable = 0; + displayName = CSTRING(showCursorTagForVehicles_DisplayName); + description = CSTRING(showCursorTagForVehicles_Description); category = CSTRING(Module_DisplayName); }; class GVAR(showSoundWaves) { @@ -49,18 +52,19 @@ class ACE_Settings { category = CSTRING(Module_DisplayName); }; class GVAR(playerNamesViewDistance) { - displayName = CSTRING(playerNamesViewDistance_DisplayName); value = 5; typeName = "SCALAR"; isClientSettable = 0; + displayName = CSTRING(PlayerNamesViewDistance_DisplayName); + description = CSTRING(PlayerNamesViewDistance_Description); category = CSTRING(Module_DisplayName); sliderSettings[] = {0, 50, 5, 1}; }; class GVAR(playerNamesMaxAlpha) { - displayName = CSTRING(playerNamesMaxAlpha); value = 0.8; typeName = "SCALAR"; isClientSettable = 0; + displayName = CSTRING(playerNamesMaxAlpha); category = CSTRING(Module_DisplayName); sliderSettings[] = {0, 1, 0.8, 2}; }; diff --git a/addons/nametags/CfgFactionClasses.hpp b/addons/nametags/CfgFactionClasses.hpp new file mode 100644 index 00000000000..0e41b5823fe --- /dev/null +++ b/addons/nametags/CfgFactionClasses.hpp @@ -0,0 +1,79 @@ +class CfgFactionClasses { + class OPF_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_russia\private_gs.paa), + QPATHTOF(UI\icons_russia\corporal_gs.paa), + QPATHTOF(UI\icons_russia\sergeant_gs.paa), + QPATHTOF(UI\icons_russia\lieutenant_gs.paa), + QPATHTOF(UI\icons_russia\captain_gs.paa), + QPATHTOF(UI\icons_russia\major_gs.paa), + QPATHTOF(UI\icons_russia\colonel_gs.paa) + }; + }; + class OPF_G_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_spain\private_gs.paa), + QPATHTOF(UI\icons_spain\corporal_gs.paa), + QPATHTOF(UI\icons_spain\sergeant_gs.paa), + QPATHTOF(UI\icons_spain\lieutenant_gs.paa), + QPATHTOF(UI\icons_spain\captain_gs.paa), + QPATHTOF(UI\icons_spain\major_gs.paa), + QPATHTOF(UI\icons_spain\colonel_gs.paa) + }; + }; + class OPF_T_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_russia\private_gs.paa), + QPATHTOF(UI\icons_russia\corporal_gs.paa), + QPATHTOF(UI\icons_russia\sergeant_gs.paa), + QPATHTOF(UI\icons_russia\lieutenant_gs.paa), + QPATHTOF(UI\icons_russia\captain_gs.paa), + QPATHTOF(UI\icons_russia\major_gs.paa), + QPATHTOF(UI\icons_russia\colonel_gs.paa) + }; + }; + class OPF_V_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_russia\private_gs.paa), + QPATHTOF(UI\icons_russia\corporal_gs.paa), + QPATHTOF(UI\icons_russia\sergeant_gs.paa), + QPATHTOF(UI\icons_russia\lieutenant_gs.paa), + QPATHTOF(UI\icons_russia\captain_gs.paa), + QPATHTOF(UI\icons_russia\major_gs.paa), + QPATHTOF(UI\icons_russia\colonel_gs.paa) + }; + }; + class IND_C_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_russia\private_gs.paa), + QPATHTOF(UI\icons_russia\corporal_gs.paa), + QPATHTOF(UI\icons_russia\sergeant_gs.paa), + QPATHTOF(UI\icons_russia\lieutenant_gs.paa), + QPATHTOF(UI\icons_russia\captain_gs.paa), + QPATHTOF(UI\icons_russia\major_gs.paa), + QPATHTOF(UI\icons_russia\colonel_gs.paa) + }; + }; + class IND_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_germany\private_gs.paa), + QPATHTOF(UI\icons_germany\corporal_gs.paa), + QPATHTOF(UI\icons_germany\sergeant_gs.paa), + QPATHTOF(UI\icons_germany\lieutenant_gs.paa), + QPATHTOF(UI\icons_germany\captain_gs.paa), + QPATHTOF(UI\icons_germany\major_gs.paa), + QPATHTOF(UI\icons_germany\colonel_gs.paa) + }; + }; + class IND_G_F { + GVAR(rankIcons)[] = { + QPATHTOF(UI\icons_spain\private_gs.paa), + QPATHTOF(UI\icons_spain\corporal_gs.paa), + QPATHTOF(UI\icons_spain\sergeant_gs.paa), + QPATHTOF(UI\icons_spain\lieutenant_gs.paa), + QPATHTOF(UI\icons_spain\captain_gs.paa), + QPATHTOF(UI\icons_spain\major_gs.paa), + QPATHTOF(UI\icons_spain\colonel_gs.paa) + }; + }; +}; diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index e712459f689..a014e1c099f 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -47,14 +47,14 @@ class CfgVehicles { }; }; class playerNamesViewDistance { - displayName = CSTRING(PlayerNamesViewDistance_DisplayName); - description = CSTRING(PlayerNamesViewDistance_Description); + displayName = CSTRING(playerNamesViewDistance_DisplayName); + description = CSTRING(playerNamesViewDistance_Description); typeName = "NUMBER"; defaultValue = 5; }; class showNamesForAI { - displayName = CSTRING(showNamesForAI_DisplayName); - description = CSTRING(showNamesForAI_Description); + displayName = CSTRING(ShowNamesForAI); + description = CSTRING(ShowNamesForAI_Desc); typeName = "NUMBER"; class values { class DoNotForce { @@ -73,8 +73,8 @@ class CfgVehicles { }; }; class showVehicleCrewInfo { - displayName = CSTRING(showVehicleCrewInfo_DisplayName); - description = CSTRING(showVehicleCrewInfo_Description); + displayName = CSTRING(ShowVehicleCrewInfo); + description = CSTRING(ShowVehicleCrewInfo_Desc); typeName = "NUMBER"; class values { class DoNotForce { diff --git a/addons/nametags/UI/icons_france/captain_gs.paa b/addons/nametags/UI/icons_france/captain_gs.paa new file mode 100644 index 00000000000..b9cceddc05e Binary files /dev/null and b/addons/nametags/UI/icons_france/captain_gs.paa differ diff --git a/addons/nametags/UI/icons_france/colonel_gs.paa b/addons/nametags/UI/icons_france/colonel_gs.paa new file mode 100644 index 00000000000..b0119b21d5c Binary files /dev/null and b/addons/nametags/UI/icons_france/colonel_gs.paa differ diff --git a/addons/nametags/UI/icons_france/corporal_gs.paa b/addons/nametags/UI/icons_france/corporal_gs.paa new file mode 100644 index 00000000000..b6f5b6a2ca0 Binary files /dev/null and b/addons/nametags/UI/icons_france/corporal_gs.paa differ diff --git a/addons/nametags/UI/icons_france/lieutenant_gs.paa b/addons/nametags/UI/icons_france/lieutenant_gs.paa new file mode 100644 index 00000000000..7792c8e87a8 Binary files /dev/null and b/addons/nametags/UI/icons_france/lieutenant_gs.paa differ diff --git a/addons/nametags/UI/icons_france/major_gs.paa b/addons/nametags/UI/icons_france/major_gs.paa new file mode 100644 index 00000000000..b7b31a10f4c Binary files /dev/null and b/addons/nametags/UI/icons_france/major_gs.paa differ diff --git a/addons/nametags/UI/icons_france/private_gs.paa b/addons/nametags/UI/icons_france/private_gs.paa new file mode 100644 index 00000000000..abb2251112d Binary files /dev/null and b/addons/nametags/UI/icons_france/private_gs.paa differ diff --git a/addons/nametags/UI/icons_france/sergeant_gs.paa b/addons/nametags/UI/icons_france/sergeant_gs.paa new file mode 100644 index 00000000000..afa48f04c87 Binary files /dev/null and b/addons/nametags/UI/icons_france/sergeant_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/captain_gs.paa b/addons/nametags/UI/icons_germany/captain_gs.paa new file mode 100644 index 00000000000..cf99a2cb402 Binary files /dev/null and b/addons/nametags/UI/icons_germany/captain_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/colonel_gs.paa b/addons/nametags/UI/icons_germany/colonel_gs.paa new file mode 100644 index 00000000000..d46b75527c4 Binary files /dev/null and b/addons/nametags/UI/icons_germany/colonel_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/corporal_gs.paa b/addons/nametags/UI/icons_germany/corporal_gs.paa new file mode 100644 index 00000000000..a02673671d4 Binary files /dev/null and b/addons/nametags/UI/icons_germany/corporal_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/lieutenant_gs.paa b/addons/nametags/UI/icons_germany/lieutenant_gs.paa new file mode 100644 index 00000000000..9423487ede2 Binary files /dev/null and b/addons/nametags/UI/icons_germany/lieutenant_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/major_gs.paa b/addons/nametags/UI/icons_germany/major_gs.paa new file mode 100644 index 00000000000..f6ef27fad27 Binary files /dev/null and b/addons/nametags/UI/icons_germany/major_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/private_gs.paa b/addons/nametags/UI/icons_germany/private_gs.paa new file mode 100644 index 00000000000..abb2251112d Binary files /dev/null and b/addons/nametags/UI/icons_germany/private_gs.paa differ diff --git a/addons/nametags/UI/icons_germany/sergeant_gs.paa b/addons/nametags/UI/icons_germany/sergeant_gs.paa new file mode 100644 index 00000000000..b3b855ef56c Binary files /dev/null and b/addons/nametags/UI/icons_germany/sergeant_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/captain_gs.paa b/addons/nametags/UI/icons_spain/captain_gs.paa new file mode 100644 index 00000000000..1d271583be5 Binary files /dev/null and b/addons/nametags/UI/icons_spain/captain_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/colonel_gs.paa b/addons/nametags/UI/icons_spain/colonel_gs.paa new file mode 100644 index 00000000000..8f1e308d9de Binary files /dev/null and b/addons/nametags/UI/icons_spain/colonel_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/corporal_gs.paa b/addons/nametags/UI/icons_spain/corporal_gs.paa new file mode 100644 index 00000000000..af3a9a7cbc2 Binary files /dev/null and b/addons/nametags/UI/icons_spain/corporal_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/lieutenant_gs.paa b/addons/nametags/UI/icons_spain/lieutenant_gs.paa new file mode 100644 index 00000000000..5ce43d74376 Binary files /dev/null and b/addons/nametags/UI/icons_spain/lieutenant_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/major_gs.paa b/addons/nametags/UI/icons_spain/major_gs.paa new file mode 100644 index 00000000000..a3844c8ce27 Binary files /dev/null and b/addons/nametags/UI/icons_spain/major_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/private_gs.paa b/addons/nametags/UI/icons_spain/private_gs.paa new file mode 100644 index 00000000000..b486dd488c8 Binary files /dev/null and b/addons/nametags/UI/icons_spain/private_gs.paa differ diff --git a/addons/nametags/UI/icons_spain/sergeant_gs.paa b/addons/nametags/UI/icons_spain/sergeant_gs.paa new file mode 100644 index 00000000000..aa76186ddb2 Binary files /dev/null and b/addons/nametags/UI/icons_spain/sergeant_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/captain_gs.paa b/addons/nametags/UI/icons_uk/captain_gs.paa new file mode 100644 index 00000000000..aeb89e3043f Binary files /dev/null and b/addons/nametags/UI/icons_uk/captain_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/colonel_gs.paa b/addons/nametags/UI/icons_uk/colonel_gs.paa new file mode 100644 index 00000000000..b0a6e4851f5 Binary files /dev/null and b/addons/nametags/UI/icons_uk/colonel_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/corporal_gs.paa b/addons/nametags/UI/icons_uk/corporal_gs.paa new file mode 100644 index 00000000000..2f664f8b3ac Binary files /dev/null and b/addons/nametags/UI/icons_uk/corporal_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/lieutenant_gs.paa b/addons/nametags/UI/icons_uk/lieutenant_gs.paa new file mode 100644 index 00000000000..8b8f707f6ef Binary files /dev/null and b/addons/nametags/UI/icons_uk/lieutenant_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/major_gs.paa b/addons/nametags/UI/icons_uk/major_gs.paa new file mode 100644 index 00000000000..562ce1599c8 Binary files /dev/null and b/addons/nametags/UI/icons_uk/major_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/private_gs.paa b/addons/nametags/UI/icons_uk/private_gs.paa new file mode 100644 index 00000000000..abb2251112d Binary files /dev/null and b/addons/nametags/UI/icons_uk/private_gs.paa differ diff --git a/addons/nametags/UI/icons_uk/sergeant_gs.paa b/addons/nametags/UI/icons_uk/sergeant_gs.paa new file mode 100644 index 00000000000..e1041d08a93 Binary files /dev/null and b/addons/nametags/UI/icons_uk/sergeant_gs.paa differ diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 2df7565cd6d..e73794600d5 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -45,3 +45,15 @@ GVAR(showNamesTime) = -10; // civilians don't use military ranks ["CIV_F", ["","","","","","",""]] call FUNC(setFactionRankIcons); + +// Change ranks based on faction for all factions that have an entry in CfgFactionClasses +if (missionNamespace getVariable [QGVAR(useFactionIcons), true]) then { + { + if (isArray (_x >> QGVAR(rankIcons))) then { + private _faction = configName _x; + if (!isNil {GVAR(factionRanks) getVariable _faction}) exitWith {}; // don't overwrite if already set + private _icons = getArray (_x >> QGVAR(rankIcons)); + [_faction, _icons] call FUNC(setFactionRankIcons); + }; + } forEach ("true" configClasses (configFile >> "CfgFactionClasses")); +}; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index 0f491efce1c..2db10c7eeb2 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -16,6 +16,7 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "ACE_Settings.hpp" +#include "CfgFactionClasses.hpp" #include "CfgVehicles.hpp" #include diff --git a/addons/nametags/functions/fnc_getVehicleData.sqf b/addons/nametags/functions/fnc_getVehicleData.sqf index 55dc7580810..ce7eec49b1a 100644 --- a/addons/nametags/functions/fnc_getVehicleData.sqf +++ b/addons/nametags/functions/fnc_getVehicleData.sqf @@ -15,7 +15,7 @@ * 1: Categorized vehicle's turrets * * Example: - * call ace_nametags_fnc_updateSettings + * call ace_nametags_fnc_getVehicleData * * Public: No */ diff --git a/addons/nametags/functions/fnc_setFactionRankIcons.sqf b/addons/nametags/functions/fnc_setFactionRankIcons.sqf index fa7975d5e56..e60c295c7d3 100644 --- a/addons/nametags/functions/fnc_setFactionRankIcons.sqf +++ b/addons/nametags/functions/fnc_setFactionRankIcons.sqf @@ -29,6 +29,7 @@ if (isNil QGVAR(factionRanks)) then { }; params [["_faction", "", [""]], ["_icons", [], [[]], [7]]]; +TRACE_2("setFactionRankIcons",_faction,_icons); if !(_faction != "" && {_icons isEqualTypeAll ""}) exitWith {false}; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index dd75dafe809..21097e2967c 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -1,11 +1,45 @@ + + Name Tags + Ustawienia imion + Etiquetas de nombre + Zeige Spielernamen + Jmenovky + Etiquetas de nome + Noms des joueurs + Névcímkék + Имена игроков + Etichette Nomi + 名札 + 이름표 + 玩家名字 + 玩家名稱 + Isım Etiketleri + + + This module allows you to customize settings and range of Name Tags. + Moduł ten pozwala dostosować ustawienia i zasięg wyświetlania imion. + Dieses Modul erlaubt die Einstellungen der Anzeigenamen zu verändern. + Este módulo permite personalizar la configuración y la distancia de las Etiquetas de nombre. + Tento modul umožňuje si přizpůsobit nastavení a vzdálenost jmenovky. + Este módulo permite que você personalize as configurações e distâncias de etiquetas de nome. + Ce module permet de configurer les options et la distance d'affichage du nom des unités. + Ez a modul lehetővé teszi a névcímkék beállításainak testreszabását. + Этот модуль позволяет настроить опции и дистанцию отображения имен игроков. + Questo modulo ti consente di personalizzare le impostazioni ed il raggio delle Etichette Nomi + これは名札の表示範囲と設定を変更できます。 + 이 모듈은 당신이 이름표의 범위를 임의로 수정할 수 있게 해줍니다. + 这个模块允许您设定名字和显示范围等设定 + 這個模塊允許您設定名稱和顯示範圍等設定 + Bu modül, Isim Etiketleri ayarlarını ve aralığını özelleştirmenizi sağlar. + Show Names Namen anzeigen Mostrar nombres - Afficher noms + Afficher les noms Zobrazit jména Pokaż imiona Nevek mutatása @@ -16,13 +50,14 @@ 이름 표시 显示名字 顯示名稱 + Isimleri Göster Show player names Spielernamen anzeigen Mostrar nombres de jugadores Pokaż imiona graczy - Afficher les nom des joueurs + Afficher le nom des joueurs Játékosnevek mutatása Zobrazit jména hráčů Mostrar nomes de jogadores @@ -32,45 +67,94 @@ 플레이어 이름 표시 显示玩家名字 顯示玩家名稱 + Oyuncu isimlerini göster + + + Show player names and set their activation. Default: Enabled + Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. + Mostrar nombres de los jugadores y establecer su activación. Predeterminado: Habilitado + Zobrazit jména hráčů a nastavit jejich aktivaci. Výchozí: Povoleno + Erlaubt das Anzeigen von Spielernamen und stellt ein, ob sie standardmäßig aktiviert oder deaktiviert sind. Standard: aktiviert + Mostrar os nomes dos jogadores e definir sua ativação. Padrão: Ativado + Affiche le nom des joueurs et définit leur activation. Valeur par défaut : activé. + Mutassa a játékosok nevét és kezelje az aktivációjukat. Alapértelmezett: Engedélyezve + Показывать имена игроков и установить их активацию. По-умолчанию: Включено + Mostra nomi giocatori ed imposta la loro attivazione. Default: Abilitato + プレイヤ名の表示と設定を有効化します。標準: 有効 + 플레이어 이름의 표시와 설정을 활성화합니다. 기본설정: 활성화 + 显示玩家的名字并设置其启动方式。预设: 启用 + 顯示玩家的名稱並設置其啟動方式。預設: 啟用 + + + Only on Cursor + Tylko pod kursorem + Solo cursor + Nur bei Maus + Pouze na kurzor + Somente no cursor + Seulement sous le curseur + Csak kurzorra + Только под курсором + Solo su Cursore + カーソルでのみ + 커서만 해당 + 只有准心指到时 + 只有準心指到時 + + + Only on Keypress + Tylko po wciśnięciu klawisza + Solo al pulsar tecla + Nur bei Tastendruck + Pouze na klávesu + Somente em tecla ativada + Seulement par appui de touche + Csak gombnyomásra + Только по нажатию клавиши + Solo quando Premi Tasto + キー押下のみ + 키를 누를경우만 + 只有按按键时 + 只有按按鍵時 + Yalnızca Tuşa Basmada - - Show player name only on cursor (requires player names) - Pokaż imiona graczy tylko pod kursorem (wymagana opcja Pokaż imiona graczy) - Mostrar nombres de jugadores solo al apuntarles (requiere Mostrar nombres de jugadores) - Zeige Spielernamen nur an, wenn die Maus auf sie gerrichtet ist (benötigt Spielernamen) - Noms uniquement sous le curseur (si noms affichés) - Zobrazit jméno hráče jenom na kurzor (vyžaduje jména hráčů) - Mostra i nomi solo se puntati (insieme ai nomi) - Mostrar nome de jogador somente no cursor (requer nome de jogadores) - Játékosok nevének mutatása csak a kurzoron (a nevek mutatása szükséges) - Показать имена игроков только под курсором (при включенных именах) - カーソルを合わせた時だけプレイヤ名を表示 (プレイヤ名が必要) - 커서로 지시할때만 플레이어 이름 표시(플레이어 이름 필요) - 仅在准心指到后显示玩家名字 (玩家必须有设定名字) - 僅在準心指到後顯示玩家名稱 (玩家必須有設定名稱) + + Only on Cursor and Keypress + Tylko pod kursorem i po wciśnięciu klawisza + En cursor y al pulsar tecla + Nur Maus und Tastendruck + Pouze na kurzor a klávesu + Somente em cursor ou tecla ativada + Seulement sous le curseur et par appui de touche + Csak kurzorra és gombnyomásra + Под курсором или по нажатию клавиши + Solo su Cursore e quando Premi Tasto + カーソルとキー押下のみ + 커서와 키를 누를경우만 + 只有在准心指到和按按键时 + 只有在準心指到和按按鍵時 - - Show player name only on keypress (requires player names) - Spielernamen nur auf Tastendruck anzeigen (benötigt Spielernamen) - Mostrar nombres solo al pulsar la tecla(requiere Mostrar nombres de jugadores) - Noms uniquement sur pression de la touche (si noms affichés) - Zobrazit jména hráčů jen na klávesu (vyžaduje jména hráčů) - Pokaż imiona graczy tylko po przytrzymaniu klawisza (wymagana opcja Pokaż imiona graczy) - Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges) - Показать имена игроков только по нажатию клавиши (при включенных именах) - Mostra i nomi solo se si preme il tasto (insieme ai nomi) - Mostrar nomes somente ao pressionar teclar (requer nome de jogadores) - キーを押した時だけプレイヤ名を表示 (プレイヤ名が必要) - 키를 누를때만 플레이어 이름 표시(플레이어 이름 필요) - 仅在按按键后显示玩家名字 (玩家必须有设定名字) - 僅在按按鍵後顯示玩家名稱 (玩家必須有設定名稱) + + Fade on screen border + Am Bildschirmrand ausblenden + 画面端では非表示 + Ukryj na brzegach ekranu + 화면 가장자리에서 사라짐 + Estomper sur les bords de l'écran + Sfocatura nei bordi dello schermo + 在荧幕边框旁淡出 + 在螢幕邊框旁淡出 + Затухание на границе экрана + Ocultar na borda da tela + Zeslábnout poblíž okrajů obrazovky + Difuminar en el borde de pantalla Show player ranks (requires player names) Spielerränge anzeigen (benötigt Spielernamen) Pokaż rangi graczy (wymagana opcja Pokaż imiona graczy) Mostrar rango de los jugadores (requiere Mostrar nombres de jugadores) - Grade des joueurs (si noms affichés) + Afficher le grade des joueurs (si noms affichés) Zobrazit hodnosti hráčů (vyžaduje jména hráčů) Mostra i gradi (insieme ai nomi) Mostrar patente de jogadores (requer nome de jogadores) @@ -97,6 +181,22 @@ 显示载具成员信息 顯示載具成員信息 + + Show vehicle crew info, or by default allows players to choose it on their own. Default: Do Not Force + Pokaż informacje o obsadzie pojazdu, lub pozwól graczom ustawić tą opcje według własnego uznania. Domyślnie: Nie wymuszaj + Muestra información de la tripulación, o por defecto permite a los jugadores elegirlo. Por defecto: No forzar + Zeige Status der Fahrzeugbesatzung oder erlaube Spielern ihn auszuwählen. Standard: nicht erzwingen. + Zobrazit informace o posádce, nebo nechat aby si hráč vybral sám. Výchozí: Nevynucovat + Mostrar informações de tripulação ou por padrão permitir a escolha dos jogadores. Padrão: Não forçar. + Affiche les informations sur l'équipage des véhicules. + A legénységi adatok mutatása, alapértelmezett esetben a játékos által kiválasztható. Alapértelmezett: Nincs felülbírálás + Показывать информацию об экипаже техники, или по-умолчанию, позволяет игрокам выбрать свою настройку. По-умолчанию: Не обязывать + Mostra informazioni sull'equipaggio del veicolo, oppure consenti di default di lasciare che siano i giocatori a scegliere. Default: Non Forzare + 車両の乗員を表示します。標準ではプレイヤ各々が選べられます。標準: 強制しない + 승무원 정보를 표시하거나 플레이어가 직접 고르게 냅둡니다. 기본설정: 강제하지 않음 + 显示载具成员讯息。在预设的情况下,系统允许玩家自己决定开关此讯息。预设: 不显示 + 顯示載具成員訊息。在預設的情況下,系統允許玩家自己決定開關此訊息。預設: 不顯示 + Show name tags for AI units Namen für KI Einheiten anzeigen @@ -104,7 +204,7 @@ Показывать имена ботов Zobrazit jména AI Wyświetl imiona jednostek AI - Afficher les noms des IA + Afficher le nom des unités IA Névcímkék mutatása MI-egységeknél Mostra i nomi delle le unità AI Mostrar nomes para unidades de IA @@ -113,6 +213,53 @@ 显示AI单位名字 顯示AI單位名稱 + + Show the name and rank tags for friendly AI units? Default: Do not force + Pokaż imiona i rangi przyjaznych jednostek AI? Domyślnie: Nie wymuszaj + Muestra etiquetas de nombre y rango para las unidades IA amigas? Por defecto: No forzar + Zeige den Namen und Rang für freundliche KI-Einheiten? Standard: nicht erzwingen + Zobrazit jména a hodnosti pro spřátelené AI jednotky? Výchozí: Nevynucovat + Mostra o nome e patente para unidades IA aliadas? Padrão: Não forçar + Affiche le nom et le grade des IA alliées. + Mutassa-e a szövetséges AI egységek nevét és rangját? Alapértelmezett: Nincs felülbírálás + Показывать имена и звания дружественных ботов? По-умолчанию: Не обязывать + Mostra etichette nomi ed etichette gradi per unità IA alleate? Default: Non forzare + 友軍の AI にも名前と階級を表示しますか? 標準: 強制しない + 아군 인공지능의 계급을 표시합니까? 기본설정: 강제하지 않음 + 显示友军AI的名字和军阶? 预设: 不显示 + 顯示友軍AI的名稱和軍階? 預設: 不顯示 + + + Show for Vehicles + Pokaż dla pojazdów + Mostrar para vehiculos + Zeige bei Fahrzeugen + Zobrazit pro vozidla + Mostrar para veículos + Montrer pour les véhicules + Mutatás járműveknél + Показывать для техники + Mostra per Veicoli + 車両への表示 + 차량 표시 + 显示给载具指挥官 + 顯示給載具指揮官 + + + Show cursor NameTag for vehicle commander (only if client has name tags enabled) Default: No + Pokazuj imię dowódcy pojazdu nad pojazdem (tylko jeżeli klient ma włączone imiona graczy). Domyślnie: Nie + Muestra etiquetas de nombre en el cursor para el comandante del vehiculo (solo si el cliente tiene las etiquetas de nombre activadas) Por defecto: No + Zeige Maus-Spielernamen für Fahrzeugkommandanten (nur wenn der Client Namensanzeigen aktiviert hat). Standard: Nein + Zobrazit jmenovky pro velitele vozidla (pouze pokud má klient jmenovky povolené). Výchozí: Ne + Mostrar o nome no cursor para o comandante do veículo (somente se o cliente tiver etiquetas de nomes ativada). Padrão: Não + Показывать имя командира техники (только, если клиент включил отображение имен). По-умолчанию: Нет + Affiche les noms pour les commandants de véhicule (uniquement si le client a activé l'affichage des noms). + Mostra il nome sul cursore per il comandante del veicolo (solo se il client ha le Etichette Nomi attive) Default: No + 車長の名札をカーソルを当てて表示します (クライアント側で名札を有効化する必要があります) 標準: 無効 + 차량의 사령관의 이름표를 표시합니다 (오직 클라이언트가 이름표를 활성화 할시에만 보입니다) 기본설정: 아니요 + 使载具指挥官能透过准心指到别的单位来显示其名字 (仅当客户端的名字功能已启用)。预设: 关闭 + 使載具指揮官能透過準心指到別的單位來顯示其名稱 (僅當客戶端的名稱功能已啟用)。預設: 關閉 + Show SoundWaves (requires player names) Sprechsymbol anzeigen (benötigt Spielernamen) @@ -129,37 +276,53 @@ 当玩家讲话时,显示声波图案 (玩家必须有设定名字) 當玩家講話時,顯示聲波圖案 (玩家必須有設定名稱) - - Default Nametag Color (Non Group Members) - Voreingestellte Namenfarbe (Spieler außerhalb der Gruppe) - Цвет меток игроков (не членов групп) - Color de etiquetas de nombre por defecto (No miembros de grupo) - Domyślny kolor imion (członkowie spoza grupy) - Couleur d'affichage par défaut (si dans aucun groupe) - Standardní barva jmenovek (pro nečleny jednotky) - Alap névcímke-szín (csoporton kívüli személyek) - Colore dei nomi non appartenenti al gruppo - Cor padrão do nome (unidades fora do grupo) - 標準の名札の色(グループ メンバ以外) - 기본 이름표 색상 (비-그룹 멤버) - 预设名字颜色 (非同小队队友) - 預設名稱顏色 (非同小隊隊友) + + Effect of sound waves above the heads of speaking players after holding the PTT key. This option works with TFAR and ACRE2. + Opcja ta pozwala dostosować sposób wyświetlania efektu fal dźwiękowych nad głowami mówiących graczy, wyświetlanych po przytrzymaniu klawisza PTT. Opcja ta współpracuje z TFAR oraz ACRE2. + Efecto de ondas sonoras encima de las cabezas de los jugadores que hablan después de mantener la tecla PTT. Esta opción funciona con TFAR y ACRE2. + Efekt zvukových vln nad hlavami hráčů když mluví skrz PTT klávesu. Tato volba funguje s TFAR a ACRE2. + Es wird ein Schallwellensymbol über den Köpfen von sprechenden Spielern angezeigt, die ihre Push-to-Talk-Taste drücken. Diese Option funktioniert mit "TFAR" und "ACRE2". + Efeito de ondas sonoras acima das cabeças dos jogadores que falam depois mantendo pressionada a tecla PTT. Esta opção funciona com TFAR e ACRE2. + Effet d'onde sonore, qui s'anime au-dessus de la tête des joueurs lorsqu'ils parlent en maintenant la touche PTT enfoncée. Cette option fonctionne avec TFAR et ACRE2. + Hanghullám-effekt a beszélő játékosok feje felett a PTT-gomb lenyomásakor. Ez a beállítás TFAR és ACRE2 alatt működik. + Эффект звуковой волны над головами говорящих игроков при удерживании кнопки push-to-talk. Эта опация работает также с рациями TFAR и ACRE2. + Effetto delle onde sonore sopra la testa dei giocatori parlanti quando premono il tasto PTT. Questa opzione funziona con TFAR ed ACRE2 + プレイヤーが PTT キーを押している間は、音波形を表示します。このオプションは TFAR と ACRE2 で動作します。 + 플레이어가 PTT로 말할시 머리위에 음파효과를 적용합니다. 이 옵션은 TFAR과 ACRE2가 있을때만 적용됩니다. + 当玩家使用按键发话时,其头上的角色名字旁会显示声波的图案。此功能可搭配TFAR、ACRE2等模组使用。 + 當玩家使用按鍵發話時,其頭上的角色名稱旁會顯示聲波的圖案。此功能可搭配TFAR、ACRE2等模組使用。 - - Name Tags - Ustawienia imion - Etiquetas de nombre - Zeige Spielernamen - Jmenovky - Etiquetas de nome - NameTags - Névcímkék - Имена игроков - Etichette Nomi - 名札 - 이름표 - 玩家名字 - 玩家名稱 + + Use Nametag settings + Użyj ustawień imion + Usar ajustes de etiquetas de nombre + Verwende Spielernamen + Použít nastavení jmenovky + Usar ajustes de etiquetas de nome + Utiliser les paramètre des noms + Névcímkék beállításának használata + Так же, как имена + Usa impostazioni Etichette Nomi + 名札の設定 + 이름표 설정 사용 + 玩家名字设定 + 玩家名稱設定 + + + Always Show All + Zawsze pokazuj wszystkie + Mostrar siempre todo + Immer alle zeigen + Vždy zobrazit vše + Sempre mostrar tudo + Toujours montrer tout + Mindig minden mutatása + Всегда показывать + Mostra Sempre Tutto + 常に表示する + 항상 모두 표시 + 永远显示全部 + 永遠顯示全部 Player Names View Dist. @@ -168,7 +331,7 @@ Sichtweite der Spielernamen Vzdálenost zobrazení jména hráčů Distância de visão dos nomes dos jogadores - Distance de vue des noms de joueurs + Distance de visibilité du nom des joueurs Játékosok nevének látótávja Дистанция отображения имен Distanza Visiva Etichette Nomi @@ -184,7 +347,7 @@ Entfernung in Metern, bei der Spielernamen angezeigt werden. Standard: 5 Vzdálenost v metrech pro zobrazení jména. Výchozí: 5 Distância em metros que os nomes dos jogadores são mostrados. Padrão: 5 - Distance en mètres au delà de laquelle les noms de joueurs ne sont plus affichés. Défaut: 5 + Distance au delà de laquelle les noms des joueurs ne sont plus affichés. Valeur par défaut : 5 mètres. Méterben megadott érték a játékosok nevének mutatására. Alapértelmezett: 5 Дистанция в метрах, на которой отображаются имена игроков. По-умолчанию: 5 Distanza in metri a cui sono visibili i nomi giocatori. Default: 5 @@ -193,46 +356,77 @@ 设定名字在多少距离以内显示。预设:5公尺 設定名稱在多少距離以內顯示。預設:5公尺 - - Show name tags for AI? - Imiona AI - ¿Mostrar nombres para la IA? - Zeige KI-Namen? - Zobrazit jmenovky pro AI? - Mostrar nomes para IA? - Afficher les noms pour les IA? - Névcímkék megjelenítése AI-nál? - Показывать имена ботов? - Mostra etichette nomi per IA? - AI の名札も表示しますか? - 인공지능의 이름도 표시합니까? - 显示AI名字? - 顯示AI名稱? - - - Show the name and rank tags for friendly AI units? Default: Do not force - Pokaż imiona i rangi przyjaznych jednostek AI? Domyślnie: Nie wymuszaj - Muestra etiquetas de nombre y rango para las unidades IA amigas? Por defecto: No forzar - Zeige den Namen und Rang für freundliche KI-Einheiten? Standard: nicht erzwingen - Zobrazit jména a hodnosti pro spřátelené AI jednotky? Výchozí: Nevynucovat - Mostra o nome e patente para unidades IA aliadas? Padrão: Não forçar - Affiche le nom et le rang pour les IA alliées? Défaut : ne pas forcer - Mutassa-e a szövetséges AI egységek nevét és rangját? Alapértelmezett: Nincs felülbírálás - Показывать имена и звания дружественных ботов? По-умолчанию: Не обязывать - Mostra etichette nomi ed etichette gradi per unità IA alleate? Default: Non forzare - 友軍の AI にも名前と階級を表示しますか? 標準: 強制しない - 아군 인공지능의 계급을 표시합니까? 기본설정: 강제하지 않음 - 显示友军AI的名字和军阶? 预设: 不显示 - 顯示友軍AI的名稱和軍階? 預設: 不顯示 + + Player tags transparency + Spielernamen Transparenz + プレイヤー名札の透明度 + 玩家名字标签透明度 + 玩家名稱透明度 + Trasparenza Etichette Nome + Przezroczystość etykiet gracza + Прозрачность меток игроков + Transparência da etiqueta de nome + Transparence des noms + Průhlednost jmenovek + Transparencia de etiquetas de jugadores - - Force Hide - Wymuś ukrycie + + Nametags Size + Rozmiar imion + Tamaño de las Etiquetas de nombre + Velikost jmenovky + Größe der Spielernamen + Tamanho das etiquetas de nome + Taille des noms + Névcímkék mérete + Размер имен игроков + Dimensione Etichette Nome + 名札の大きさ + 이름표 크기 + 玩家名字标记大小 + 玩家名稱標記大小 + Isim Etiketi Büyüklüğü + + + Text and Icon Size Scaling + Skalowanie tekstu oraz ikon + Escala del texto y el icono + Velikost textu a ikon + Text- und Symbolgrößen + Escala de tamanho dos ícones e textos + Taille du texte et des icônes. + Szöveg és ikon méretének skálázása + Масштабирование размера текста и иконок + Proporzione Dimensioni Testo ed Icone + 文字とアイコンの大きさ + 글자와 아이콘 크기 비례 + 文字和图示大小设定 + 文字和圖示大小設定 + + + Default Nametag Color (Non Group Members) + Voreingestellte Namenfarbe (Spieler außerhalb der Gruppe) + Цвет меток игроков (не членов групп) + Color de etiquetas de nombre por defecto (No miembros de grupo) + Domyślny kolor imion (członkowie spoza grupy) + Couleur d'affichage par défaut (si dans aucun groupe) + Standardní barva jmenovek (pro nečleny jednotky) + Alap névcímke-szín (csoporton kívüli személyek) + Colore dei nomi non appartenenti al gruppo + Cor padrão do nome (unidades fora do grupo) + 標準の名札の色(グループ メンバ以外) + 기본 이름표 색상 (비-그룹 멤버) + 预设名字颜色 (非同小队队友) + 預設名稱顏色 (非同小隊隊友) + + + Force Hide + Wymuś ukrycie Ocultar forzado Verstecken erzwingen Vynuceno skrýt Ocultar forçado - Forcer la désactivation + /!\ Module obsolète /!\ - Forcer le masquage Erőltetett rejtett Обязательно: Скрывать Forza Nascosto @@ -240,6 +434,7 @@ 강제로 숨기기 强制隐藏 強迫隱藏 + Gizlemeye Zorla Force Show @@ -248,7 +443,7 @@ Anzeige erzwingen Vynuceno zobrazit Mostrar forçado - Forcer l'affichage + /!\ Module obsolète /!\ - Forcer l'affichage Erőltetett látható Обязательно: Показывать Forza Mostra @@ -256,133 +451,7 @@ 강제로 표시 强制显示 強迫顯示 - - - Show crew info? - Pokaż załogę - ¿Mostrar información de la tripulación? - Zeige Besatzungsstatus? - Zobrazit informace o posádce? - Mostrar informação de tripulação? - Afficher les informations de l'équipage? - Legénységi adatok megjelenítése? - Показывать экипаж? - Mostra informazioni equipaggio? - 乗員の情報を表示 - 승무원 정보 표시? - 显示载具成员讯息? - 顯示載具成員訊息? - - - Show vehicle crew info, or by default allows players to choose it on their own. Default: Do Not Force - Pokaż informacje o obsadzie pojazdu, lub pozwól graczom ustawić tą opcje według własnego uznania. Domyślnie: Nie wymuszaj - Muestra información de la tripulación, o por defecto permite a los jugadores elegirlo. Por defecto: No forzar - Zeige Status der Fahrzeugbesatzung oder erlaube Spielern ihn auszuwählen. Standard: nicht erzwingen. - Zobrazit informace o posádce, nebo nechat aby si hráč vybral sám. Výchozí: Nevynucovat - Mostrar informações de tripulação ou por padrão permitir a escolha dos jogadores. Padrão: Não forçar. - Afficher les informations sur l'équipage d'un véhicule. Défaut: ne pas forcer - A legénységi adatok mutatása, alapértelmezett esetben a játékos által kiválasztható. Alapértelmezett: Nincs felülbírálás - Показывать информацию об экипаже техники, или по-умолчанию, позволяет игрокам выбрать свою настройку. По-умолчанию: Не обязывать - Mostra informazioni sull'equipaggio del veicolo, oppure consenti di default di lasciare che siano i giocatori a scegliere. Default: Non Forzare - 車両の乗員を表示します。標準ではプレイヤ各々が選べられます。標準: 強制しない - 승무원 정보를 표시하거나 플레이어가 직접 고르게 냅둡니다. 기본설정: 강제하지 않음 - 显示载具成员讯息。在预设的情况下,系统允许玩家自己决定开关此讯息。预设: 不显示 - 顯示載具成員訊息。在預設的情況下,系統允許玩家自己決定開關此訊息。預設: 不顯示 - - - Show for Vehicles - Pokaż dla pojazdów - Mostrar para vehiculos - Zeige bei Fahrzeugen - Zobrazit pro vozidla - Mostrar para veículos - Montrer pour les véhicules - Mutatás járműveknél - Показывать для техники - Mostra per Veicoli - 車両への表示 - 차량 표시 - 显示给载具指挥官 - 顯示給載具指揮官 - - - Show cursor NameTag for vehicle commander (only if client has name tags enabled) Default: No - Pokazuj imię dowódcy pojazdu nad pojazdem (tylko jeżeli klient ma włączone imiona graczy). Domyślnie: Nie - Muestra etiquetas de nombre en el cursor para el comandante del vehiculo (solo si el cliente tiene las etiquetas de nombre activadas) Por defecto: No - Zeige Maus-Spielernamen für Fahrzeugkommandanten (nur wenn der Client Namensanzeigen aktiviert hat). Standard: Nein - Zobrazit jmenovky pro velitele vozidla (pouze pokud má klient jmenovky povolené). Výchozí: Ne - Mostrar o nome no cursor para o comandante do veículo (somente se o cliente tiver etiquetas de nomes ativada). Padrão: Não - Показывать имя командира техники (только, если клиент включил отображение имен). По-умолчанию: Нет - Afficher les étiquettes de nom pour les commandants de véhicule (uniquement si l'affichage est activé pour le client). Défaut: non - Mostra il nome sul cursore per il comandante del veicolo (solo se il client ha le Etichette Nomi attive) Default: No - 車長の名札をカーソルを当てて表示します (クライアント側で名札を有効化する必要があります) 標準: 無効 - 차량의 사령관의 이름표를 표시합니다 (오직 클라이언트가 이름표를 활성화 할시에만 보입니다) 기본설정: 아니요 - 使载具指挥官能透过准心指到别的单位来显示其名字 (仅当客户端的名字功能已启用)。预设: 关闭 - 使載具指揮官能透過準心指到別的單位來顯示其名稱 (僅當客戶端的名稱功能已啟用)。預設: 關閉 - - - This module allows you to customize settings and range of Name Tags. - Moduł ten pozwala dostosować ustawienia i zasięg wyświetlania imion. - Dieses Modul erlaubt die Einstellungen der Anzeigenamen zu verändern. - Este módulo permite personalizar la configuración y la distancia de las Etiquetas de nombre. - Tento modul umožňuje si přizpůsobit nastavení a vzdálenost jmenovky. - Este módulo permite que você personalize as configurações e distâncias de etiquetas de nome. - Ce module permet le paramétrage de l'affichage des étiquettes des noms - Ez a modul lehetővé teszi a névcímkék beállításainak testreszabását. - Этот модуль позволяет настроить опции и дистанцию отображения имен игроков. - Questo modulo ti consente di personalizzare le impostazioni ed il raggio delle Etichette Nomi - これは名札の表示範囲と設定を変更できます。 - 이 모듈은 당신이 이름표의 범위를 임의로 수정할 수 있게 해줍니다. - 这个模块允许您设定名字和显示范围等设定 - 這個模塊允許您設定名稱和顯示範圍等設定 - - - Only on Cursor - Tylko pod kursorem - Solo cursor - Nur bei Maus - Pouze na kurzor - Somente no cursor - Seulement sous le curseur - Csak kurzorra - Только под курсором - Solo su Cursore - カーソルでのみ - 커서만 해당 - 只有准心指到时 - 只有準心指到時 - - - Only on Keypress - Tylko po wciśnięciu klawisza - Solo al pulsar tecla - Nur bei Tastendruck - Pouze na klávesu - Somente em tecla ativada - Seulement par appui de touche - Csak gombnyomásra - Только по нажатию клавиши - Solo quando Premi Tasto - キー押下のみ - 키를 누를경우만 - 只有按按键时 - 只有按按鍵時 - - - Only on Cursor and Keypress - Tylko pod kursorem i po wciśnięciu klawisza - En cursor y al pulsar tecla - Nur Maus und Tastendruck - Pouze na kurzor a klávesu - Somente em cursor ou tecla ativada - Seulement sous le curseur et par appui de touche - Csak kurzorra és gombnyomásra - Под курсором или по нажатию клавиши - Solo su Cursore e quando Premi Tasto - カーソルとキー押下のみ - 커서와 키를 누를경우만 - 只有在准心指到和按按键时 - 只有在準心指到和按按鍵時 + Göstermeye Zorla Force Show Only on Cursor @@ -391,7 +460,7 @@ Vynuceno zobrazit pouze na kurzor Erzwinge nur mit Mauszeiger anzuzeigen Forçar mostrar somente no cursor - Forcer l'affichage sous le curseur uniquement + /!\ Module obsolète /!\ - Forcer l'affichage sous le curseur uniquement Erőltetett látható, csak kurzorra Обязательно: Только под курсором Forza Mostra solo su Cursore @@ -407,7 +476,7 @@ Vynuceno zobrazit pouze na klávesu Erzwinge nur mit Tastendruck anzuzeigen Forçar somente mostrar em tecla ativada - Forcer l'affichage par appui de touche uniquement + /!\ Module obsolète /!\ - Forcer l'affichage par appui de touche uniquement Erőltetett látható, csak gombnyomásra Обязательно: Только по нажатию клавиши Forza Mostra solo quando Premi Tasto @@ -423,7 +492,7 @@ Vynuceno zobrazit pouze na kurzor a klávesu Erzwinge nur mit Mauszeiger und Tastendruck anzuzeigen Forçar mostrar somente em cursor e tecla ativada - Forcer l'affichage sous le curseur et par appui de touche uniquement + /!\ Module obsolète /!\ - Forcer l'affichage sous le curseur et par appui de touche uniquement Erőltetett látható, csak kurzorra és gombnyomásra Обязательно: Под курсором или по нажатию клавиши Forza Mostra solo su Cursore e quando Premi Tasto @@ -432,120 +501,5 @@ 强制显示在准心指到和按按键时 強制顯示在準心指到和按按鍵時 - - Use Nametag settings - Użyj ustawień imion - Usar ajustes de etiquetas de nombre - Verwende Spielernamen - Použít nastavení jmenovky - Usar ajustes de etiquetas de nome - Utiliser les paramètre des NamesTags - Névcímkék beállításának használata - Так же, как имена - Usa impostazioni Etichette Nomi - 名札の設定 - 이름표 설정 사용 - 玩家名字设定 - 玩家名稱設定 - - - Always Show All - Zawsze pokazuj wszystkie - Mostrar siempre todo - Immer alle zeigen - Vždy zobrazit vše - Sempre mostrar tudo - Toujours montrer tout - Mindig minden mutatása - Всегда показывать - Mostra Sempre Tutto - 常に表示する - 항상 모두 표시 - 永远显示全部 - 永遠顯示全部 - - - Show player names and set their activation. Default: Enabled - Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. - Mostrar nombres de los jugadores y establecer su activación. Predeterminado: Habilitado - Zobrazit jména hráčů a nastavit jejich aktivaci. Výchozí: Povoleno - Erlaubt das Anzeigen von Spielernamen und stellt ein, ob sie standardmäßig aktiviert oder deaktiviert sind. Standard: aktiviert - Mostrar os nomes dos jogadores e definir sua ativação. Padrão: Ativado - Afficher les noms des joueurs et paramètre son activation. Défaut: activé - Mutassa a játékosok nevét és kezelje az aktivációjukat. Alapértelmezett: Engedélyezve - Показывать имена игроков и установить их активацию. По-умолчанию: Включено - Mostra nomi giocatori ed imposta la loro attivazione. Default: Abilitato - プレイヤ名の表示と設定を有効化します。標準: 有効 - 플레이어 이름의 표시와 설정을 활성화합니다. 기본설정: 활성화 - 显示玩家的名字并设置其启动方式。预设: 启用 - 顯示玩家的名稱並設置其啟動方式。預設: 啟用 - - - Effect of sound waves above the heads of speaking players after holding the PTT key. This option works with TFAR and ACRE2. - Opcja ta pozwala dostosować sposób wyświetlania efektu fal dźwiękowych nad głowami mówiących graczy, wyświetlanych po przytrzymaniu klawisza PTT. Opcja ta współpracuje z TFAR oraz ACRE2. - Efecto de ondas sonoras encima de las cabezas de los jugadores que hablan después de mantener la tecla PTT. Esta opción funciona con TFAR y ACRE2. - Efekt zvukových vln nad hlavami hráčů když mluví skrz PTT klávesu. Tato volba funguje s TFAR a ACRE2. - Es wird ein Schallwellensymbol über den Köpfen von sprechenden Spielern angezeigt, die ihre Push-to-Talk-Taste drücken. Diese Option funktioniert mit "TFAR" und "ACRE2". - Efeito de ondas sonoras acima das cabeças dos jogadores que falam depois mantendo pressionada a tecla PTT. Esta opção funciona com TFAR e ACRE2. - Icone au dessus de la tête du joueur qui parle après avoir utilisé la touche de PTT. Option compatible avec ACRE2 et TFAR - Hanghullám-effekt a beszélő játékosok feje felett a PTT-gomb lenyomásakor. Ez a beállítás TFAR és ACRE2 alatt működik. - Эффект звуковой волны над головами говорящих игроков при удерживании кнопки push-to-talk. Эта опация работает также с рациями TFAR и ACRE2. - Effetto delle onde sonore sopra la testa dei giocatori parlanti quando premono il tasto PTT. Questa opzione funziona con TFAR ed ACRE2 - プレイヤーが PTT キーを押している間は、音波形を表示します。このオプションは TFAR と ACRE2 で動作します。 - 플레이어가 PTT로 말할시 머리위에 음파효과를 적용합니다. 이 옵션은 TFAR과 ACRE2가 있을때만 적용됩니다. - 当玩家使用按键发话时,其头上的角色名字旁会显示声波的图案。此功能可搭配TFAR、ACRE2等模组使用。 - 當玩家使用按鍵發話時,其頭上的角色名稱旁會顯示聲波的圖案。此功能可搭配TFAR、ACRE2等模組使用。 - - - Nametags Size - Rozmiar imion - Tamaño de las Etiquetas de nombre - Velikost jmenovky - Größe der Spielernamen - Tamanho das etiquetas de nome - Taille des noms - Névcímkék mérete - Размер имен игроков - Dimensione Etichette Nome - 名札の大きさ - 이름표 크기 - 玩家名字标记大小 - 玩家名稱標記大小 - - - Text and Icon Size Scaling - Skalowanie tekstu oraz ikon - Escala del texto y el icono - Velikost textu a ikon - Text- und Symbolgrößen - Escala de tamanho dos ícones e textos - Taille du texte et des icones - Szöveg és ikon méretének skálázása - Масштабирование размера текста и иконок - Proporzione Dimensioni Testo ed Icone - 文字とアイコンの大きさ - 글자와 아이콘 크기 비례 - 文字和图示大小设定 - 文字和圖示大小設定 - - - Fade on screen border - Am Bildschirmrand ausblenden - 画面端では非表示 - Ukryj na brzegach ekranu - 화면 가장자리에서 사라짐 - Estomper sur les bords de l'écran - Sfocatura nei bordi dello schermo - 在荧幕边框旁淡出 - 在螢幕邊框旁淡出 - - - Player tags transparency - プレイヤー名札の透明度 - 玩家名字标签透明度 - 玩家名稱透明度 - Trasparenza Etichette Nome - Przezroczystość etykiet gracza - diff --git a/addons/nightvision/CfgIRLaserSettings.hpp b/addons/nightvision/CfgIRLaserSettings.hpp new file mode 100644 index 00000000000..c42bc3a3cd1 --- /dev/null +++ b/addons/nightvision/CfgIRLaserSettings.hpp @@ -0,0 +1,3 @@ +class CfgIRLaserSettings { + maxNumberOfRays = 64; // Default is 24. +}; diff --git a/addons/nightvision/XEH_postInit.sqf b/addons/nightvision/XEH_postInit.sqf index 44926ae7ace..70023223fb7 100644 --- a/addons/nightvision/XEH_postInit.sqf +++ b/addons/nightvision/XEH_postInit.sqf @@ -21,28 +21,23 @@ GVAR(ppeffectRadialBlur) = -1; GVAR(ppeffectColorCorrect) = -1; GVAR(ppeffectBlur) = -1; +GVAR(isUsingMagnification) = false; ["ace_settingsInitialized", { TRACE_4("settingsInitialized",GVAR(disableNVGsWithSights),GVAR(fogScaling),GVAR(noiseScaling),GVAR(effectScaling)); ["visionMode", LINKFUNC(onVisionModeChanged), false] call CBA_fnc_addPlayerEventHandler; - - // handle only brightness if effects are disabled - if (GVAR(effectScaling) == 0) exitWith { - GVAR(ppEffectNVGBrightness) = ppEffectCreate ["ColorCorrections", 1236]; - GVAR(ppEffectNVGBrightness) ppEffectForceInNVG true; - GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, (-3+3)/5 + 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; - GVAR(ppEffectNVGBrightness) ppEffectCommit 0; - }; - ["loadout", LINKFUNC(onLoadoutChanged), true] call CBA_fnc_addPlayerEventHandler; ["cameraView", LINKFUNC(onCameraViewChanged), true] call CBA_fnc_addPlayerEventHandler; ["vehicle", LINKFUNC(refreshGoggleType), false] call CBA_fnc_addPlayerEventHandler; ["turret", LINKFUNC(refreshGoggleType), true] call CBA_fnc_addPlayerEventHandler; - ["ace_firedPlayer", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler; - ["ace_firedPlayerVehicle", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler; - + // handle only brightness if effects are disabled + GVAR(ppEffectNVGBrightness) = ppEffectCreate ["ColorCorrections", 1236]; + GVAR(ppEffectNVGBrightness) ppEffectForceInNVG true; + GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, (-3+3)/5 + 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; + GVAR(ppEffectNVGBrightness) ppEffectCommit 0; + GVAR(ppEffectNVGBrightness) ppEffectEnable (GVAR(effectScaling) == 0); addMissionEventHandler ["Loaded", { // Restart UI vars on mission load if (GVAR(running)) then { diff --git a/addons/nightvision/XEH_preInit.sqf b/addons/nightvision/XEH_preInit.sqf index d021ef1f577..9361d05015e 100644 --- a/addons/nightvision/XEH_preInit.sqf +++ b/addons/nightvision/XEH_preInit.sqf @@ -6,6 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -#include "initSettings.sqf"; +#include "initSettings.sqf" ADDON = true; diff --git a/addons/nightvision/config.cpp b/addons/nightvision/config.cpp index 8e33002c31e..ffdb3d16a03 100644 --- a/addons/nightvision/config.cpp +++ b/addons/nightvision/config.cpp @@ -15,6 +15,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgIRLaserSettings.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "ACE_Settings.hpp" diff --git a/addons/nightvision/functions/fnc_onCameraViewChanged.sqf b/addons/nightvision/functions/fnc_onCameraViewChanged.sqf index 09eb8e247f8..fc4c85a5079 100644 --- a/addons/nightvision/functions/fnc_onCameraViewChanged.sqf +++ b/addons/nightvision/functions/fnc_onCameraViewChanged.sqf @@ -20,7 +20,7 @@ params ["_unit", "_cameraView"]; TRACE_2("onCameraViewChanged",_unit,_cameraView); // Refresh goggle effect (e.g. switching to vehicle's NVG) -[] call FUNC(refreshGoggleType); +call FUNC(refreshGoggleType); if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then { if ((vehicle _unit == _unit) diff --git a/addons/nightvision/functions/fnc_onLoadoutChanged.sqf b/addons/nightvision/functions/fnc_onLoadoutChanged.sqf index 59be659f533..75a1a1ca8a8 100644 --- a/addons/nightvision/functions/fnc_onLoadoutChanged.sqf +++ b/addons/nightvision/functions/fnc_onLoadoutChanged.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [player] call ace_nightvision_fnc_onLoadoutChange + * [player] call ace_nightvision_fnc_onLoadoutChanged * * Public: No */ diff --git a/addons/nightvision/functions/fnc_onVisionModeChanged.sqf b/addons/nightvision/functions/fnc_onVisionModeChanged.sqf index b4bdc7f4f91..ecd87f59d1a 100644 --- a/addons/nightvision/functions/fnc_onVisionModeChanged.sqf +++ b/addons/nightvision/functions/fnc_onVisionModeChanged.sqf @@ -19,7 +19,20 @@ params ["_unit", "_visionMode"]; TRACE_2("onVisionModeChanged",_unit,_visionMode); -// handle only brightness if effects are disabled +// Handle disableNVGsWithSights setting: +if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then { + if ((vehicle _unit == _unit) + || {isTurnedOut _unit} + || {!([_unit] call EFUNC(common,hasHatch)) + && {[_unit] call EFUNC(common,getTurretIndex) in ([vehicle _unit] call EFUNC(common,getTurretsFFV))} + }) then { + if ((cameraView == "GUNNER") && {_visionMode > 0}) then { + _unit action ["NVGogglesOff", _unit]; + }; + }; +}; + +// Handle only brightness if effects are disabled if (GVAR(effectScaling) == 0) exitWith { GVAR(ppEffectNVGBrightness) ppEffectEnable (_visionMode == 1); }; @@ -31,21 +44,13 @@ if (_visionMode == 1) then { [true] call FUNC(setupDisplayEffects); [] call FUNC(refreshGoggleType); GVAR(PFID) = [LINKFUNC(pfeh), 0, []] call CBA_fnc_addPerFrameHandler; + GVAR(firedEHs) = [ + ["ace_firedPlayer", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler, + ["ace_firedPlayerVehicle", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler + ]; + TRACE_1("Added fired EHs",GVAR(firedEHs)); // Fade in from black when turning nvg on QGVAR(turnOnEffect) cutText ["", "BLACK IN", 2.5]; }; }; - -// Handle disableNVGsWithSights setting: -if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then { - if ((vehicle _unit == _unit) - || {isTurnedOut _unit} - || {!([_unit] call EFUNC(common,hasHatch)) - && {[_unit] call EFUNC(common,getTurretIndex) in ([vehicle _unit] call EFUNC(common,getTurretsFFV))} - }) then { - if ((cameraView == "GUNNER") && {_visionMode > 0}) then { - _unit action ["NVGogglesOff", _unit]; - }; - }; -}; diff --git a/addons/nightvision/functions/fnc_pfeh.sqf b/addons/nightvision/functions/fnc_pfeh.sqf index c889b59a47b..82e6a3cf34f 100644 --- a/addons/nightvision/functions/fnc_pfeh.sqf +++ b/addons/nightvision/functions/fnc_pfeh.sqf @@ -16,15 +16,21 @@ * Public: No */ -if ((currentVisionMode ACE_player) != 1) exitWith { +private _unit = ACE_player; + +if (currentVisionMode _unit != 1) exitWith { GVAR(running) = false; [false] call FUNC(setupDisplayEffects); [GVAR(PFID)] call CBA_fnc_removePerFrameHandler; GVAR(PFID) = -1; + (missionNamespace getVariable [QGVAR(firedEHs), []]) params [["_firedPlayerID", -1], ["_firedPlayerVehicleID", -1]]; + TRACE_2("removing fired EHs",_firedPlayerID,_firedPlayerVehicleID); + ["ace_firedPlayer", _firedPlayerID] call CBA_fnc_removeEventHandler, + ["ace_firedPlayerVehicle", _firedPlayerVehicleID] call CBA_fnc_removeEventHandler, }; if (EGVAR(common,OldIsCamera)) exitWith { if (GVAR(running)) then { - TRACE_2("pausing NVG for scripted camera",alive ACE_player,EGVAR(common,OldIsCamera)); + TRACE_2("pausing NVG for scripted camera",alive _unit,EGVAR(common,OldIsCamera)); GVAR(running) = false; [false] call FUNC(setupDisplayEffects); }; @@ -41,7 +47,7 @@ BEGIN_COUNTER(borderScaling); private _scale = (call EFUNC(common,getZoom)) * 1.12513; if (!(GVAR(defaultPositionBorder) isEqualTo [])) then { // Prevents issues when "zooming out" on ultra wide monitors - The square mask would be narrower than the screen - if (((GVAR(defaultPositionBorder) select 2) * _scale) < safeZoneW) then { + if ((GVAR(defaultPositionBorder) select 2) * _scale < safeZoneW) then { _scale = safeZoneW / (GVAR(defaultPositionBorder) select 2); }; [(uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1000, GVAR(defaultPositionHex), _scale] call FUNC(scaleCtrl); @@ -51,6 +57,11 @@ if (!(GVAR(defaultPositionBorder) isEqualTo [])) then { }; END_COUNTER(borderScaling); +if !(IS_MAGNIFIED isEqualTo GVAR(isUsingMagnification)) then { + GVAR(isUsingMagnification) = IS_MAGNIFIED; + GVAR(nextEffectsUpdate) = -1; +}; + if (CBA_missionTime < GVAR(nextEffectsUpdate)) then { // Update radial blur as it depends on zoom level, so should be changed each frame like the border/hex if (GVAR(ppeffectRadialBlur) != -1) then { @@ -83,10 +94,11 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then { private _fogApply = linearConversion [0, 1, _effectiveLight, ST_NVG_MAXFOG, ST_NVG_MINFOG, true]; // Modify blur if looking down scope - if ((cameraView == "GUNNER") && {[ACE_player] call CBA_fnc_canUseWeapon}) then { - if (currentWeapon ACE_player == "") exitWith {}; - if (currentWeapon ACE_player == primaryWeapon ACE_player) exitWith {_blurFinal = _blurFinal * linearConversion [0, 1, GVAR(aimDownSightsBlur), 1, ST_NVG_CAMERA_BLUR_SIGHTS_RIFLE]}; // Rifles are bad - if (currentWeapon ACE_player == handgunWeapon ACE_player) exitWith {_blurFinal = _blurFinal * linearConversion [0, 1, GVAR(aimDownSightsBlur), 1, ST_NVG_CAMERA_BLUR_SIGHTS_PISTOL]}; // Pistols aren't so bad + if (cameraView == "GUNNER" && {[_unit] call CBA_fnc_canUseWeapon && {!GVAR(isUsingMagnification)}}) then { + private _weapon = currentWeapon _unit; + if (_weapon == "") exitWith {}; + if (_weapon == primaryWeapon _unit) exitWith {_blurFinal = _blurFinal * linearConversion [0, 1, GVAR(aimDownSightsBlur), 1, ST_NVG_CAMERA_BLUR_SIGHTS_RIFLE]}; // Rifles are bad + if (_weapon == handgunWeapon _unit) exitWith {_blurFinal = _blurFinal * linearConversion [0, 1, GVAR(aimDownSightsBlur), 1, ST_NVG_CAMERA_BLUR_SIGHTS_PISTOL]}; // Pistols aren't so bad }; // Scale general effects based on ace_nightvision_effectScaling setting @@ -95,7 +107,7 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then { _contrastFinal = linearConversion [0, 1, GVAR(effectScaling), 1, _contrastFinal]; // Add adjusted NVG brightness - private _playerBrightSetting = ACE_player getVariable [QGVAR(NVGBrightness), 0]; + private _playerBrightSetting = _unit getVariable [QGVAR(NVGBrightness), 0]; _brightFinal = _brightFinal + (_playerBrightSetting / 20); // Scale grain effects based on ace_nightvision_noiseScaling setting @@ -144,9 +156,12 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then { // Modify local fog: if (GVAR(fogScaling) > 0) then { - if (((vehicle ACE_player) != ACE_player) && {(vehicle ACE_player) isKindOf "Air"}) then { // For flying in particular, can refine nicer later. + private _vehicle = vehicle _unit; + + if (_vehicle != _unit && {_vehicle isKindOf "Air"}) then { // For flying in particular, can refine nicer later. _fogApply = _fogApply * ST_NVG_AIR_FOG_MULTIPLIER; }; + _fogApply = linearConversion [0, 1, GVAR(priorFog) select 0, (GVAR(fogScaling) * _fogApply), 1]; // mix in old fog if present GVAR(nvgFog) = [_fogApply, 0, 0]; 0 setFog GVAR(nvgFog) diff --git a/addons/nightvision/functions/fnc_refreshGoggleType.sqf b/addons/nightvision/functions/fnc_refreshGoggleType.sqf index 8943784646b..c367d7a2f5e 100644 --- a/addons/nightvision/functions/fnc_refreshGoggleType.sqf +++ b/addons/nightvision/functions/fnc_refreshGoggleType.sqf @@ -17,7 +17,7 @@ TRACE_1("refreshGoggleType",_this); -if (!GVAR(running)) exitWith {}; +if (!GVAR(running) || {GVAR(effectScaling) == 0}) exitWith {}; // Defaults (good for most vehicles/binoculars) private _borderImage = ""; @@ -34,6 +34,7 @@ if (alive ACE_player) then { private _vehConfig = configFile >> "CfgVehicles" >> (typeOf _currentVehicle); if (cameraView != "GUNNER") exitWith {true}; // asume hmd usage outside of gunner view + if ([ACE_player] call CBA_fnc_canUseWeapon) exitWith {true}; // FFV if (ACE_player == (driver _currentVehicle)) exitWith { !("NVG" in getArray (_vehConfig >> "ViewOptics" >> "visionMode")); diff --git a/addons/nightvision/initSettings.sqf b/addons/nightvision/initSettings.sqf index 5b6492a2cb6..9ccf2cc7f92 100644 --- a/addons/nightvision/initSettings.sqf +++ b/addons/nightvision/initSettings.sqf @@ -6,17 +6,51 @@ localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true, // isGlobal - {[QGVAR(effectScaling), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + { + TRACE_1("effectScaling setting changed",_this); + GVAR(ppEffectNVGBrightness) ppEffectEnable ( + (GVAR(effectScaling) == 0) && {currentVisionMode ACE_player == 1} + ); + + if (GVAR(effectScaling) == 0) then { + // Destroy PFH & PP effects + GVAR(running) = false; + [false] call FUNC(setupDisplayEffects); + [GVAR(PFID)] call CBA_fnc_removePerFrameHandler; + GVAR(PFID) = -1; + GVAR(nextEffectsUpdate) = -1; + (missionNamespace getVariable [QGVAR(firedEHs), []]) params [["_firedPlayerID", -1], ["_firedPlayerVehicleID", -1]]; + TRACE_2("removing fired EHs",_firedPlayerID,_firedPlayerVehicleID); + ["ace_firedPlayer", _firedPlayerID] call CBA_fnc_removeEventHandler, + ["ace_firedPlayerVehicle", _firedPlayerVehicleID] call CBA_fnc_removeEventHandler, + } else { + // Start PFH if scaling was previously set to 0 + if ((currentVisionMode ACE_player == 1) && {!GVAR(running)}) then { + GVAR(running) = true; + [true] call FUNC(setupDisplayEffects); + [] call FUNC(refreshGoggleType); + + if (!isMultiplayer && {!isNull findDisplay 49}) then { + // Prevent duplicate effects when paused + GVAR(nextEffectsUpdate) = CBA_missionTime + 0.1; + }; + + GVAR(PFID) = [LINKFUNC(pfeh), 0, []] call CBA_fnc_addPerFrameHandler; + GVAR(firedEHs) = [ + ["ace_firedPlayer", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler, + ["ace_firedPlayerVehicle", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler + ]; + TRACE_1("Added fired EHs",GVAR(firedEHs)); + }; + }; + } ] call CBA_settings_fnc_init; [ QGVAR(fogScaling), "SLIDER", [LSTRING(fogScaling_DisplayName), LSTRING(fogScaling_Description)], localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] - true, // isGlobal - {[QGVAR(fogScaling), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + true // isGlobal ] call CBA_settings_fnc_init; [ @@ -24,8 +58,7 @@ [LSTRING(noiseScaling_DisplayName), LSTRING(noiseScaling_Description)], localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] - true, // isGlobal - {[QGVAR(noiseScaling), _this] call EFUNC(common,cbaSettings_settingChanged)} + true // isGlobal ] call CBA_settings_fnc_init; [ @@ -33,8 +66,7 @@ [LSTRING(aimDownSightsBlur_DisplayName)], localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] - true, // isGlobal - {[QGVAR(aimDownSightsBlur), _this] call EFUNC(common,cbaSettings_settingChanged)} + true // isGlobal ] call CBA_settings_fnc_init; [ @@ -42,8 +74,7 @@ [LSTRING(DisableNVGsWithSights_DisplayName), LSTRING(DisableNVGsWithSights_description)], localize LSTRING(Category), false, // default value - true, // isGlobal - {[QGVAR(disableNVGsWithSights), _this] call EFUNC(common,cbaSettings_settingChanged)} + true // isGlobal ] call CBA_settings_fnc_init; [ @@ -51,6 +82,5 @@ [LSTRING(shutterEffects_DisplayName), LSTRING(shutterEffects_description)], localize LSTRING(Category), true, // default value - false, // isGlobal - {[QGVAR(shutterEffects), _this] call EFUNC(common,cbaSettings_settingChanged)} + false // isGlobal ] call CBA_settings_fnc_init; diff --git a/addons/nightvision/script_component.hpp b/addons/nightvision/script_component.hpp index 2f431c54072..7f80b1b4fa6 100644 --- a/addons/nightvision/script_component.hpp +++ b/addons/nightvision/script_component.hpp @@ -46,3 +46,5 @@ #define ST_NVG_NOISESHARPNESS_MIN 1.2 #define ST_NVG_NOISESHARPNESS_MAX 1 + +#define IS_MAGNIFIED (0.75 call CBA_fnc_getFOV select 1 > 3.01) diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 3c5e9115f02..555f346c81e 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -10,6 +10,10 @@ ACE夜视镜 ACE Vision Nocturne ACE Noktowizja + ACE ПНВ + ACE Visão Noturna + ACE Noční vidění + ACE Gece Görüşü NV Goggles (Gen1) @@ -26,6 +30,7 @@ 야투경 (1세대) 夜视镜 (初代) 夜視鏡 (初代) + GG Gözlüğü (1. Jen) NV Goggles (Gen2) @@ -42,6 +47,7 @@ 야투경 (2세대) 夜视镜 (二代) 夜視鏡 (二代) + GG Gözlüğü (2. Jen) NV Goggles (Gen3) @@ -58,6 +64,7 @@ 야투경 (3세대) 夜视镜 (三代) 夜視鏡 (三代) + GG Gözlüğü (3. Jen) NV Goggles (Gen3, Brown) @@ -74,6 +81,7 @@ 야투경 (3세대, 갈색) 夜视镜 (三代, 棕色) 夜視鏡 (三代, 棕色) + GG Gözlüğü (3. Jen Kahverengi) NV Goggles (Gen3, Green) @@ -90,6 +98,7 @@ 야투경 (3세대, 녹색) 夜视镜 (三代, 绿色) 夜視鏡 (三代, 綠色) + GG Gözlüğü (3. Jen Yeşil) NV Goggles (Gen3, Black) @@ -106,6 +115,7 @@ 야투경 (3세대, 검정색) 夜视镜 (三代, 黑色) 夜視鏡 (三代, 黑色) + GG Gözlüğü (3. Jen Siyah) NV Goggles (Gen4) @@ -122,6 +132,7 @@ 야투경 (4세대) 夜视镜 (四代) 夜視鏡 (四代) + GG Gözlüğü (4. Jen) NV Goggles (Wide) @@ -138,6 +149,7 @@ 야투경 (넓음) 夜视镜 (宽版) 夜視鏡 (寬版) + GG Gözlüğü (Geniş) Brightness: %1 @@ -154,6 +166,7 @@ 밝기: %1 亮度: %1 亮度: %1 + Parlaklık: %1 Increase NVG Brightness @@ -170,6 +183,7 @@ 야투경 밝기 높이기 增加夜视镜亮度 增加夜視鏡亮度 + Gece Görüşü Parlaklığını Arttır Decrease NVG Brightness @@ -177,7 +191,7 @@ Disminuir el brillo de las NVG Zmniejsz czułość noktowizji Snížení jasu noktovizoru - Baisser la luminosité des JVN + Abaisser la luminosité des JVN Уменьшить яркость ПНВ Éjjellátó fényerejének csökkentése Diminuir Luminosidade do EVN @@ -186,11 +200,12 @@ 야투경 밝기 줄이기 减少夜视镜亮度 減少夜視鏡亮度 + Gece Görüşü Parlaklığını Düşür Nightvision Nachtsicht - Ночное виденье + Ночное видение Visão Noturna Noční vidění Noktowizja @@ -201,43 +216,46 @@ 야간투시경 夜视 夜視 + Gece Görüşü Settings for night vision. Einstellungen für Nachtsichtgeräte. - Настройки ночного виденья + Настройки приборов ночного видения Ajustes para visão noturna. Nastavení nočního vidění Ustawienia noktowizorów Impostazioni per visione notturna. Parámetros para visión nocturna - Réglage pour la vision nocturne + Réglages pour la vision nocturne. 暗視装置の設定をします。 야간투시경 설정 设定夜视选项. 設定夜視選項 + Gece görüşü ayarı. Disable NVGs in scope Deakt. NS mit Visier Убирать ПНВ при прицеливании Desabilitar visão noturna nas lunetas - Zakázat NVG v zaměřovači + Zakázat noktovizor u puškohledů Wył. NVG przy celowaniu Disabilita NVG nei mirini Desactivar NVG en miras - Desactiver les JVN dans les viseurs. + Désactiver les JVN dans les viseurs スコープでは暗視装置を無効化 조준경 사용시 야투경 비활성화 使用瞄准镜时关闭夜视镜 使用瞄準鏡時關閉夜視鏡 + Gece görüşünü dürbünde kapat. Blocks the usage of night vision goggles whilst aiming down the sight. Blockiert die Nachtsichtbrillen beim Verwenden des Visiers. - Блокирует использование головного ПНВ при прицеливании через прицел. + Блокирует использование головного ПНВ при прицеливании Bloqueia o uso de visão noturna ao utilizar a mira. - Zabraňuje používání nokovizoru v režimu zaměřovače. + Zabraňuje používání noktovizoru při použití mířidel. Uniemożliwia korzystanie z gogli noktowizyjnych przy celowaniu. Blocca l'uso di visori notturni mentre miri con ottiche. Desactiva el uso de gafas visión nocturna cuando se utilizan miras normales. @@ -256,6 +274,10 @@ 夜视镜雾气程度 Épaisseur du brouillard (JVN) Skala Mgły NVG + Степень размытия ПНВ + Escala de Névoa na NVG + Míra mlhy pro noktovizor + Escala de niebla NVG Fog is used to limit visibility. @@ -264,8 +286,12 @@ Nebel wird genutzt, um die Sichtbarkeit einzuschränken. 透過霧氣來縮減夜視鏡的可視距離 透过雾气来缩减夜视镜的可视距离。 - Le brouillard est utilisé pour limiter la visibilité + Le brouillard est utilisé pour limiter la visibilité. Mgła jest wykorzystywana do ograniczenia widoczności. + Туман используется для ограничения видимости + Névoa é usada para limitar visibilidade. + Mlha je použita pro omezení dohledu. + Niebla es usada para limitar la visibilidad NVG Effect Scale @@ -276,6 +302,10 @@ 夜视镜效果程度 Intensité des effets Skala Efektów NVG + Степень эффектов ПНВ + Intensidade de efeito da Visão Noturna + Míra efektu pro noktovizor + Escala del efecto NVG Blur and brightness effects [Setting to 0 will disable ALL nightvision effects] @@ -284,8 +314,12 @@ Unschärfe und Helligkeitseffekte [Dies auf 0 zu setzen deaktiviert SÄMTLICHE Nachtsichteffekte] 調整模糊與亮度的效果。[設值為0會關閉所有夜視鏡的特殊效果] 调整模糊与亮度的效果。[设值为0会关闭所有夜视镜的特殊效果] - Effets de flou et de luminosité [Règler cette option sur 0 désactivera TOUS les effets de vision nocturne] + Effets de flou et de luminosité. [Régler cette option sur 0 désactivera TOUS les effets de vision nocturne.] Efekty rozmazania i jasności [Ustawienie na 0 wyłączy WSZYSTKIE efekty noktowizji] + Эффекты размытия и яркости [Установка на 0 отключит ВСЕ эффекты ПНВ] + Efeitos de borrão e brilho [Definir 0 desativa TODOS os efeitos da Visão Noturna] + Rozostření a jas [Nastavení na 0 vypne VŠECHNY efekty nočního vidění] + Efectos de emborronado y brillo [Configuración a 0 deshabilita todos los efectos de visión nocturna] Aim Down Sights Blur @@ -296,6 +330,10 @@ Flou de visée Blur durante la mira Rozmazanie podczas celowania z narządów celowniczych + Размытие при опущеном прицеле + Borrão ao mirar + Rozostření při použití mířidel + Emborronado al mirar NVG Noise Scale @@ -306,6 +344,10 @@ Intensité du bruit (JVN) Fattore di Disturbo del NVG Skala Szumu NVG + Степень шума ПНВ + Intensidade de Ruído/Efeito Granulado + Míra šumu pro noktovizor + Escala de ruido/granulado NVG Image noise intensity when wearing NVGs @@ -313,27 +355,41 @@ 調整配戴夜視鏡時畫面雜訊的多寡。 调整配戴夜视镜时画面杂讯的多寡。 暗視装置を使用時に起きる画像ノイズの強度です - Intensité du bruit de l'image lorsque vous portez des JVN + Intensité du bruit de l'image lorsque vous portez des JVN. Intensità del disturbo dell'immagine quando i NVG sono equipaggiati Intensywność efektu szumu podczas noszenia gogli noktowizyjnych + Интенсивность шума при использовании ПНВ + Intensidade de Ruído de Imagem ao utilizar Visão Noturna + Intezita šumu při používání noktovizoru + Intensidad de ruido de la imagen cuando se usa NVG Shutter Effects + Rolling-Shutter-Effekt シャッター効果 快门效果 快門效果 Effets d'obturateur Effetti lampeggianti Efekt Shutter + Эффекты затвора + Efeito de Obturador + Efekt závěrky + Efecto de obturador Rolling shutter effect from muzzle flashes + Rolling-Shutter-Effekt bei Müdungsfeuer 発射炎が作るローリング シャッター効果です 枪械开火时产生瞬间快门效果 槍開火時瞬間產生快門效果 - Effets d'obturateur à rideau dû aux flashs du canon + Effet d'obturateur à rideau dû aux flashs du canon. Effetto lampeggiante dato dal lampo dello sparo Efekt rolling shutter z błysków wylotowych + Эффект затвора при вспышках выстрелов + Efeito de rolamento de Obturador de flashes de focinho + Efekt závěrky z důsledku výšlehu při střelbě + Efecto obturador por los fogonazos de la boca del cañón diff --git a/addons/nlaw/CfgAmmo.hpp b/addons/nlaw/CfgAmmo.hpp index f51816d692e..b579ebeb065 100644 --- a/addons/nlaw/CfgAmmo.hpp +++ b/addons/nlaw/CfgAmmo.hpp @@ -29,6 +29,7 @@ class CfgAmmo { // Attack profile type selection defaultAttackProfile = QGVAR(directAttack); attackProfiles[] = {QGVAR(directAttack), QGVAR(overflyTopAttack)}; + useModeForAttackProfile = 1; showHintOnCycle = 1; // Run once at fired event diff --git a/addons/nlaw/CfgWeapons.hpp b/addons/nlaw/CfgWeapons.hpp index 35f5b17122f..cf2c5862e9c 100644 --- a/addons/nlaw/CfgWeapons.hpp +++ b/addons/nlaw/CfgWeapons.hpp @@ -1,3 +1,5 @@ +class Mode_SemiAuto; + class CfgWeapons { class Launcher_Base_F; class launch_NLAW_F: Launcher_Base_F { @@ -9,5 +11,11 @@ class CfgWeapons { distanceZoomMax = 0; }; }; + class Single: Mode_SemiAuto { + EGVAR(missileGuidance,attackProfile) = QGVAR(directAttack); + }; + class Overfly: Single { + EGVAR(missileGuidance,attackProfile) = QGVAR(overflyTopAttack); + }; }; }; diff --git a/addons/nlaw/stringtable.xml b/addons/nlaw/stringtable.xml index c9864678876..a53d21050c3 100644 --- a/addons/nlaw/stringtable.xml +++ b/addons/nlaw/stringtable.xml @@ -10,6 +10,11 @@ 次世代輕型反坦克導彈發射器追蹤目標 (按住) Śledzenie Celu NLAW (Przytrzymaj) NLAW 목표 추적 (누름유지) + NLAW наведение на цель (Удерживать) + NLAW Rastrear Alvo (Segurar) + NLAW suivre la cible (maintenir) + NLAW sledování cíle (držet) + NLAW Track Target (Basılı Tut) Direct Attack @@ -20,6 +25,11 @@ 直射模式 Bezpośredni atak 직접 사격 + Прямая атака + Ataque Direto + Attaque directe + Přímý útok + Doğrudan Saldırı Overfly Top Attack @@ -30,6 +40,11 @@ 攻頂模式 Atak z góry 탑어택 + Атака сверху + Ataque por cima + Attaque par le haut + Útok zvrchu při přeletu + Yüksek Uçuş Saldırı diff --git a/addons/noradio/stringtable.xml b/addons/noradio/stringtable.xml index d8aa43d4e2b..7e788a9f3fd 100644 --- a/addons/noradio/stringtable.xml +++ b/addons/noradio/stringtable.xml @@ -1,7 +1,7 @@ - - + + Mute Player Spieler stummschalten Muta Giocatore @@ -9,8 +9,13 @@ 玩家静音 プレイヤーをミュート Wycisz Gracza + Заглушить игрока + Silenciar Jogador + Joueur en sourdine + Ztlumit hráče + Oyuncuyu Sustur - + Mutes the controlled player avatar. Schaltet eigenen Spieleravatar stumm. Muta l'avatar del giocatore controllato. @@ -18,6 +23,11 @@ 静音玩家所控制的角色。 プレイヤーに操作されているこのキャラをミュートします。 Wycisza awatar kontrolowany przez gracza + Заглушить контролируемого игрока + Silencia o avatar do Jogador controlado + Met en sourdine l'avatar du joueur. + Vypne hlas charakteru hráče. + Oyuncuları Susturur diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml index 377cca28bcd..58763da8d6a 100644 --- a/addons/optics/stringtable.xml +++ b/addons/optics/stringtable.xml @@ -16,6 +16,7 @@ RCO (2D) 步枪战斗光学瞄准镜(2D) 步槍戰鬥光學瞄準鏡(2D) + RCO (2D) RCO (PIP) @@ -32,6 +33,7 @@ RCO (PIP) 步枪战斗光学瞄准镜(拟真版) 步槍戰鬥光學瞄準鏡(擬真版) + RCO (PIP) ARCO (2D) @@ -48,6 +50,7 @@ ARCO (2D) 先进步枪战斗光学瞄准镜(2D) 先進步槍戰鬥光學瞄準鏡(2D) + ARCO (2D) ARCO (PIP) @@ -64,6 +67,7 @@ ARCO (PIP) 先进步枪战斗光学瞄准镜(拟真版) 先進步槍戰鬥光學瞄準鏡(擬真版) + ARCO (PIP) MRCO (2D) @@ -80,6 +84,7 @@ MRCO (2D) 多距离战斗瞄准镜(2D) 多距離戰鬥瞄準鏡(2D) + MRCO (2D) MRCO (PIP) @@ -96,6 +101,7 @@ MRCO (PIP) 多距离战斗瞄准镜(拟真版) 多距離戰鬥瞄準鏡(擬真版) + MRCO (PIP) MOS (2D) @@ -112,6 +118,7 @@ MOS (2D) 精准光学瞄准镜(2D) 精準光學瞄準鏡(2D) + MOS (2D) MOS (PIP) @@ -128,6 +135,7 @@ MOS (PIP) 精准光学瞄准镜(拟真版) 精準光學瞄準鏡(擬真版) + MOS (PIP) LRPS (2D) @@ -144,6 +152,7 @@ LRPS (2D) 长距离精确瞄准镜(2D) 長距離精確瞄準鏡(2D) + LRPS (2D) LRPS (PIP) @@ -160,6 +169,7 @@ LRPS (PIP) 长距离精确瞄准镜(拟真版) 長距離精確瞄準鏡(擬真版) + LRPS (PIP) diff --git a/addons/optionsmenu/config.cpp b/addons/optionsmenu/config.cpp index b17fe12cc3c..56617535795 100644 --- a/addons/optionsmenu/config.cpp +++ b/addons/optionsmenu/config.cpp @@ -30,7 +30,10 @@ class CfgAddons { #include "gui\pauseMenu.hpp" class ACE_Extensions { - extensions[] += {"ace_clipboard"}; + class ace_clipboard { + windows = 1; + client = 1; + }; }; class CfgCommands { diff --git a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf index 3b662eb1217..6ed460d2f9e 100644 --- a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf +++ b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf @@ -15,7 +15,7 @@ * Public: No */ -#define MIN_ARRAY_SIZE 50 +#define MIN_ARRAY_SIZE 100 private _outputText = { diag_log text (_this select 0); @@ -24,8 +24,7 @@ private _outputText = { }; private _text = format ["~~~~~~~~~ACE Debug~~~~~~~~~ -time = %1 - +%1 ------Performance------ diag_fps = %2 count cba_common_waitAndExecArray = %3 @@ -34,11 +33,11 @@ count cba_common_perFrameHandlerArray = %5 (max %6) count diag_activeSQFScripts = %7 count diag_activeSQSScripts = %8 count diag_activeMissionFSMs = %9", -time, +format ["[Time: %1] [CBA_missionTime: %2] [tickTime: %3]", time toFixed 1, CBA_missionTime toFixed 1, diag_tickTime toFixed 1], diag_fps, count cba_common_waitAndExecArray, count cba_common_waitUntilAndExecArray, -{!isNil "_x"} count cba_common_perFrameHandlerArray, count cba_common_perFrameHandlerArray, +count cba_common_perFrameHandlerArray, count cba_common_PFHhandles, count diag_activeSQFScripts, count diag_activeSQSScripts, count diag_activeMissionFSMs]; @@ -54,16 +53,20 @@ if (isNull ace_player) then {"null"} else {animationState ace_player}]; [_text] call _outputText; +private _aceSettings = cba_settings_allSettings select {((_x select [0,4]) == "ace_") || {(_x select [0,5]) == "acex_"}}; +_aceSettings sort true; _text = format [" -------ACE's CBA Settings------"]; +------ACE's CBA Settings [%1 Total] [Only Non-Defaults]------", count _aceSettings]; [_text] call _outputText; -private _aceSettings = cba_settings_allSettings select {((_x select [0,4]) == "ace_") || {(_x select [0,5]) == "acex_"}}; -_aceSettings sort true; { - _var = missionNamespace getVariable [_x, "ERROR: Not Defined"]; - _text = format ["%1 - %2", _x, _var]; - [_text] call _outputText; + private _currentValue = missionNamespace getVariable [_x, "$"]; + private _defaultValue = (cba_settings_default getVariable [_x, []]) param [0, "#"]; + if (_currentValue isEqualTo _defaultValue) then { + // [format ["%1 - %2 - DEFAULT", _x, _currentValue]] call _outputText; + } else { + [format ["%1 - %2", _x, _currentValue]] call _outputText; + }; } forEach _aceSettings; diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 4ef6afd1202..27ad2dce2c5 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -16,6 +16,7 @@ 디버그를 클립보드로 复制除错讯息至剪贴簿 複製除錯訊息至剪貼簿 + Panoya Hata Ayıkla Sends debug information to RPT and clipboard. @@ -24,7 +25,7 @@ Pošle debug informace do RPT a schránky. Protokolliert Debug-Informationen im RPT und speichert sie in der Zwischenablage. Envia informação de depuração para RPT e área de transferência. - Copie le Debug dans le RPT et le presse-papier + Envoie les informations de debug vers le RPT et le presse-papier. Debug információt küld az RPT-be és a vágólapra. Отправляет отладочную информацию в RPT и буфер обмена. Invia informazioni di debug all'RPT e al Blocco Note @@ -32,6 +33,7 @@ 디버그 정보를 보고하기 및 클립보드에 복사하기 위해 보냅니다. 复制除错讯息至剪贴簿与RPT报告档中。 複製除錯訊息至剪貼簿與RPT報告檔中 + Hata ayıklama bilgilerini RPT ve panoya gönderir. Headbug Fix @@ -48,12 +50,13 @@ 헤드버그 수정 修复动作BUG 修復動作BUG + Animasyon Düzeltme Resets your animation state. Setzt die derzeitige Animation zurück. Resetuje aktualną animację. - Réinitialise l'état de l'animation + Réinitialise l'état de votre animation. Visszaállítja az animációs állapotodat. Redefine seu estado de animação. Исправляет баг с зациклившейся анимацией. @@ -64,6 +67,7 @@ 자신의 동작 상태 초기화 当ACE发生动作BUG时,点此修复。 當ACE發生動作BUG時,點此修復 + Animasyon durumunuzu sıfırlar. ACE News @@ -80,6 +84,7 @@ ACE 새소식 ACE新闻 ACE新聞 + ACE Haberler Show News on Main Menu @@ -87,7 +92,7 @@ Zeige Neuigkeiten im Hauptmenü Mostrar notícias no menu principal Pokazuj wiadomości ACE w menu głównym - Affiche les nouveautés sur l'écran principal + Affiche les nouveautés dans le menu principal. Hírek mutatása a főmenüben Показывать новости в Главном Меню Zobrazit zprávy v hlavním menu @@ -96,6 +101,7 @@ 메인메뉴에 새소식을 표시합니다 显示新闻消息于主选单 顯示新聞消息於主選單 + Ana Menü de Haberleri Göster ACE Logistics @@ -111,6 +117,7 @@ ACE 보급 ACE 后勤设定 ACE 後勤設定 + ACE Lojistik Hide @@ -127,6 +134,7 @@ 숨기기 隐藏 隱藏 + Gizle Top right, downwards @@ -135,7 +143,7 @@ Oben rechts, nach unten Vpravo nahoře, dolů Superior direito, para baixo - Haut droit, vers le bas + En haut à droite, vers le bas Jobb felül, lefele Справа — сверху вниз In Alto a Destra, verso il Basso @@ -143,6 +151,7 @@ 오른쪽 위에서 아래로 右上角,向下 右上角,向下 + Sağ üst, aşağı Top right, to the left @@ -151,7 +160,7 @@ Von rechts nach links Vpravo nahoře, do leva Superior direito, à esquerda - Haut droit, vers la gauche + En haut à droite, vers la gauche Jobb felül, balra Сверху — справа налево In Alto a Destra, verso Sinistra @@ -159,6 +168,7 @@ 오른쪽 위에서 왼쪽으로 右上角,向左 右上角,向左 + Sağ üstte, solda Top left, downwards @@ -167,7 +177,7 @@ Von links, nach unten Vlevo nahoře, dolů Superior esquerdo, para baixo - Haut gauche, vers le bas + En haut à gauche, vers le bas Bal felül, lefele Слева - сверху вниз In Alto a Sinistra, verso il Basso @@ -175,6 +185,7 @@ 왼쪽 위에서 아래로 左上角,向下 左上角,向下 + Sol üst, aşağı Top left, to the right @@ -183,7 +194,7 @@ Oben links nach rechts Vlevo nahoře, do prava Superior esquerdo, para a direita - Haut gauche, vers la droite + En haut à gauche, vers la droite Bal felül, jobbra Сверху — слева направо In Alto a Sinistra, verso Destra @@ -191,6 +202,7 @@ 왼쪽 위에서 오른쪽으로 左上角,向右 左上角,向右 + Sol üst, sağa Top @@ -199,7 +211,7 @@ Oben Nahoře Acima - Haut + En haut Fent Сверху Alto @@ -207,6 +219,7 @@ 상단 上方 上方 + Üst Bottom @@ -215,7 +228,7 @@ Unten Dole Abaixo - Bas + En bas Alul Снизу Basso @@ -223,6 +236,7 @@ 하단 下方 下方 + Alt diff --git a/addons/overheating/ACE_Settings.hpp b/addons/overheating/ACE_Settings.hpp index 5a4b8941e91..e0681f42c53 100644 --- a/addons/overheating/ACE_Settings.hpp +++ b/addons/overheating/ACE_Settings.hpp @@ -1,11 +1,10 @@ class ACE_Settings { - class GVAR(displayTextOnJam) { + class GVAR(enabled) { category = CSTRING(DisplayName); typeName = "BOOL"; - isClientSettable = 1; value = 1; - displayName = CSTRING(DisplayTextOnJam_displayName); - description = CSTRING(DisplayTextOnJam_description); + displayName = CSTRING(enabled_displayName); + description = CSTRING(enabled_description); }; class GVAR(showParticleEffects) { category = CSTRING(DisplayName); @@ -30,6 +29,14 @@ class ACE_Settings { displayName = CSTRING(overheatingDispersion_displayName); description = CSTRING(overheatingDispersion_description); }; + class GVAR(displayTextOnJam) { + category = CSTRING(DisplayName); + typeName = "BOOL"; + isClientSettable = 1; + value = 1; + displayName = CSTRING(DisplayTextOnJam_displayName); + description = CSTRING(DisplayTextOnJam_description); + }; class GVAR(unJamOnreload) { category = CSTRING(DisplayName); typeName = "BOOL"; @@ -45,11 +52,4 @@ class ACE_Settings { description = CSTRING(unJamFailChance_description); sliderSettings[] = {0, 1, 0.1, 2}; }; - class GVAR(enabled) { - category = CSTRING(DisplayName); - typeName = "BOOL"; - value = 1; - displayName = CSTRING(enabled_displayName); - description = CSTRING(enabled_description); - }; }; diff --git a/addons/overheating/CfgEventHandlers.hpp b/addons/overheating/CfgEventHandlers.hpp index 5da5fd0dc24..becf3950523 100644 --- a/addons/overheating/CfgEventHandlers.hpp +++ b/addons/overheating/CfgEventHandlers.hpp @@ -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)); }; }; diff --git a/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf b/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf index 4c7eba29194..1c60b1a4778 100644 --- a/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf +++ b/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [bob] call ace_overheating_fnc_checkSpareBarrelsTemperature + * [bob] call ace_overheating_fnc_checkSpareBarrelsTemperatures * * * Public: No diff --git a/addons/overheating/functions/fnc_clearJam.sqf b/addons/overheating/functions/fnc_clearJam.sqf index 44b219fda28..61e84fe9068 100644 --- a/addons/overheating/functions/fnc_clearJam.sqf +++ b/addons/overheating/functions/fnc_clearJam.sqf @@ -36,7 +36,7 @@ if (_weapon in _jammedWeapons) then { if (_weapon == primaryWeapon _unit) then { playSound QGVAR(fixing_rifle); } else { - if (_weapon == secondaryWeapon _unit) then { + if (_weapon == handgunWeapon _unit) then { playSound QGVAR(fixing_pistol); }; }; diff --git a/addons/overheating/functions/fnc_jamWeapon.sqf b/addons/overheating/functions/fnc_jamWeapon.sqf index f8518add8ea..e3a5bb793ad 100644 --- a/addons/overheating/functions/fnc_jamWeapon.sqf +++ b/addons/overheating/functions/fnc_jamWeapon.sqf @@ -40,6 +40,14 @@ if (_ammo > 0) then { }, [_unit, _weapon, _ammo]] call CBA_fnc_execNextFrame; }; +if (_weapon == primaryWeapon _unit) then { + playSound QGVAR(jamming_rifle); +} else { + if (_weapon == handgunWeapon _unit) then { + playSound QGVAR(jamming_pistol); + }; +}; + // only display the hint once, after you try to shoot an already jammed weapon GVAR(knowAboutJam) = false; @@ -55,7 +63,7 @@ if (_unit getVariable [QGVAR(JammingActionID), -1] == -1) then { }; private _statement = { - playSound3D ["a3\sounds_f\weapons\Other\dry9.wss", _this select 0]; + playSound3D ["a3\sounds_f\weapons\Other\dry9.wss", _this select 0, false, eyePos (_this select 0), 1, 1, 15]; if (!(missionNamespace getVariable [QGVAR(knowAboutJam), false]) && {(_this select 1) ammo currentWeapon (_this select 1) > 0} && {GVAR(DisplayTextOnJam)}) then { [localize LSTRING(WeaponJammed)] call EFUNC(common,displayTextStructured); diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index cff88070034..f1eb7b16c07 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -33,12 +33,12 @@ if (isNil "_energyIncrement") then { // If the bullet mass is not configured, estimate it _bulletMass = 3.4334 + 0.5171 * (getNumber (configFile >> "CfgAmmo" >> _ammo >> "hit") + getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber")); }; - + // Projectile motion is roughly equal to Barrel heat // Ref: https://en.wikipedia.org/wiki/Physics_of_firearms // Muzzle Engergy = 1/2 * m * v^2 = (1/2 * 0.001 g/kg * bulletMass (grams) * v^2) // Multiple by 3 becase we only calc every 3rd bullet: (3 * 1/2 * 0.001) = 0.0015 - private _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); + _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); GVAR(cacheAmmoData) setVariable [_ammo, _energyIncrement]; }; diff --git a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf index ff71814ea8c..71cacbd0475 100644 --- a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf +++ b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [bob, "bob"] call ace_overheating_fnc_sendSpareBarrelsIsTemperaturesHint + * [bob, "bob"] call ace_overheating_fnc_sendSpareBarrelsTemperaturesHint * * * Public: No diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 9ea7e36a06d..de53e3e25f9 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -4,11 +4,17 @@ Overheating Heißlaufen + Sobrecalentamiento Surriscaldamento 過熱 过热 過熱 Przegrzewanie + Перегрев + Super Aquecimento + Túlmelegedés + Surchauffe + Přehřívání Display text on jam @@ -17,7 +23,7 @@ Показывать текст, когда клинит оружие Zobrazit upozornění při zaseknutí Wyświetl tekst przy zacięciu broni - Affiche texte si enrayé + Afficher du texte si enrayé Szöveges értesítés kijelzése a fegyver elakadásakor Mostrar texto quando trava acontecer Visualizza testo in caso di inceppamento @@ -33,7 +39,7 @@ Показывать уведомление каждый раз, когда клинит Ваше оружие. Zobrazí upozornění při zaseknutí zbraně Wyświetl powiadomienie za każdym razem, kiedy Twoja broń ulegnie zacięciu - Affiche une notification lors d'un enrayement + Affiche une notification lorsque votre arme est enrayée. Egy szöveges értesítés jelenik meg, amikor a fegyver megakad Mostra uma notificação quando sua arma sofre um travamento. Visualizza una notifica in caso la tua arma si inceppasse @@ -48,7 +54,7 @@ Efekty cząsteczkowe przegrzania Effetti Particelle Surriscaldamento Efectos de partículas - Effet de surchauffe + Effets de particules Částicové efekty přehřívání Efeito de parícula de superaquecimento Эффект частиц при перегреве @@ -56,6 +62,7 @@ 과열 입자 효과 枪管过热特效 槍管過熱特效 + Részecskék túlmelegedése Show particle effects when weapon overheats @@ -63,7 +70,7 @@ Pokaż efekty cząsteczkowe kiedy broń się przegrzeje Mostra effetti particellari quando l'arma si surriscalda Muestra efectos de partículas cuando el arma del jugador se sobreacalienta - Montrer les effets lorsque l'arme surchauffe. + Affiche des effets de particules lorsqu'une arme surchauffe. Mostra efeitos de párticula quando a arma superaquece Показывать эффект частиц, когда оружие перегревается Zobrazit částicové efekty když se zbraň přehřije @@ -71,6 +78,7 @@ 무기가 과열되면 입자 효과를 보여줍니다 显示枪管过热特效 顯示槍管過熱特效 + Fegyvertúlmelegedést okozó részecskehatások mutatása Overheating Particle Effects for everyone @@ -78,14 +86,15 @@ Pokaż efekty cząsteczkowe dla wszystkich Effetti Particellari Surriscaldamento per tutti Efectos de partículas para todos - Effets de surchauffe pour tout le monde. + Effets de particules pour tout le monde Částicové efekty přehřívání pro všechny Efeito de partícula de superaquecimento para todos Эффект частиц при перегреве для всех - 過熱の視覚表現を全員に与えます + 過熱の視覚表現を全員に 모두에게 과열 입자 효과 적용 显示其他玩家的枪管过热特效 顯示其他玩家的槍管過熱特效 + A részecskék túlmelegedésének hatása mindenki számára Show particle effects when other players weapon overheats @@ -93,14 +102,15 @@ Pokazuje efekty cząsteczkowe kiedy broń innego gracza się przegrzeje Mostra effetti particellari quando l'arma di altri giocatori si surriscalda Muestra efectos de partículas cuando el arma de jugadores cercanos se sobreacalienta - Montrer les effets de surchauffe des autres joueurs. + Affiche les effets de particules lorsque les armes des autres joueurs surchauffent. Mostra efeito de partículas quando a arma de outros jogadores superaquece Показывать эффект частиц, когда оружие других игроков перегревается Zobrazit částicové efekty když se zbraň přehřije jinému hráči - 他のプレイヤの過熱の視覚表現を表示します + 他のプレイヤーの過熱の視覚表現を表示します 모든 인원이 무기가 과열될시 입자 효과가 나타납니다. 当其他玩家的武器过热时显示特效 當其他玩家的武器過熱時顯示特效 + Mutassa a részecskehatásokat, amikor más játékosok fegyvere melegedik túl Overheating Dispersion @@ -108,7 +118,7 @@ Wpływ na rozrzut Dispersione Surriscaldamento Dispersión - Disperssion dûe à la surchauffe + Dispersion Disperção de superaquecimento Разброс при перегреве Důsledky přehřátí zbraně @@ -116,6 +126,7 @@ 과열 명중률 저하 过热散射 過熱散射 + Túlmelegedés diszperzió (szórás) Overheated weapons will be less accurate and have decreased muzzle velocity. Applys for all players. @@ -123,7 +134,7 @@ Przegrzane bronie będą mniej celne oraz będą miały zmniejszoną prędkość pocisku. Wpływa na wszystkich graczy. Armi surriscaldate saranno meno precise ed avranno una ridotta velocità alla volata. Applica per tutti i giocatori. Las armas sobrecalentadas pierden precisión y tienen una velocidad de disparo reducida. Se aplica a todos los jugadores. - Les armes en surchauffe seront moins précises et auront une vitesse en sortie de bouche plus faible. S'applique pour tous les joueurs. + Les armes surchauffées seront moins précises et auront une vitesse initiale moins élevée. S'applique à tous les joueurs. Armas superaquecidas irão ser menos precisas e ter velocidade de disparo reduzidas. Aplica a todos os jogadores. Перегретое оружие будет менее точным, а дульная скорость будет снижена. Применяется ко всем игрокам. Přehřátá zbraň bude méně přesná a bude mít menší úsťovou rychlost. Platí pro všechny hráče. @@ -131,13 +142,14 @@ 무기 과열시 무기의 명중률이 저하되고 총구속도가 감소합니다. 이는 모든 플레이어에게 적용됩니다. 过热的武器将会有打不准和减少射击初速的情况。适用于所有玩家 過熱的武器將會有打不準和減少射擊初速的情況。適用於所有玩家 + A túlmelegedett fegyverek kevésbé lesznek pontosak és csökkent a lövés sebessége. Minden játékosra vonatkozik. Unjam weapon on reload Behebt Ladehemmung beim Nachladen Desencasquillar el arma al recargar. Usuń zacięcie przy przeładowaniu - Des-enrayer l'arme au rechargement. + Désenrayer l'arme au rechargement Disinceppa l'arma quando si ricarica Uvolnit zbraň při přebití Desemperrar arma no recarregamento @@ -146,13 +158,14 @@ 재장전시 탄걸림 해결 重装弹匣以解决卡弹 重裝彈匣以解決卡彈 + Távolítsa el az akadályt újratöltéskor Reloading clears a weapon jam. Nachladen behebt eine Ladehemmung. Recargar el arma la desencasquilla. Przeładowywanie usuwa zacięcie - Recharger vide la chambre de l'arme + Les armes se désenrayent lors d'un rechargement. L'arma si disinceppa quando si ricarica Přebití uvolní zaseknutou zbraň. Recarregar desemperra arma. @@ -161,13 +174,14 @@ 탄걸림이 재장전시 해결됩니다. 利用重装弹匣来解决卡弹 利用重裝彈匣來解決卡彈 + Az újratöltés megszünteti a fegyver elakadását. Chance of unjam failing Wahrscheinlichkeit, dass Ladehemmung nicht behoben wird Probabilidad de falla al desencasquillar. Szansa na porażkę usuw. zacięcia - Chance de rater le des-enrayement + Risque d'échec du désenrayement Probabilità di sbagliare a disinceppare l'arma Šance, že uvolnění zbraně selže Chance de falha de desemperramento @@ -176,13 +190,14 @@ 탄걸림 해결 시도 실패확률 解决卡弹失败机率 解決卡彈失敗機率 + Akadály eltávolítás hibájának esélye Probability that an unjam action might fail, requiring to be repeated. Wahrscheinlichkeit, dass der Versuch eine Ladehemmung zu beheben fehl schlägt und erneut durchgeführt werden muss. Probabilidad de que el proceso de desencasquille falle, teniendo que repetirlo. Szansa na to, że przy przeładowaniu broni zacięcie nie zostanie usunięte, przez co czynność będzie musiała zostać powtórzona ponownie. - Probabilité qu'une action de des-enrayement échoue, nécessitant de recommencer. + Probabilité qu'une action de désenrayement échoue, nécessitant de recommencer. Probabilità che si possa sbagliare a caso a disinceppare l'arma. Richiede di ripetere. Probabilidade que uma ação de desemperramento falhe, tendo que ser repetida Вертоятность того, что устранение заклинивания не сработает, и его придется повторить. @@ -191,6 +206,7 @@ 탄걸림 해결 시도시 실패할 확률이 있습니다. 이는 다시 탄걸림 해결을 시도해야함을 의미합니다. 清除卡弹时有可能会失败,需要反覆进行清枪。 清除卡彈時有可能會失敗,需要反覆進行清槍。 + Valószínűsége annak, hogy egy akadály eltávolítás művelet kudarcot vall, megismétlést igényel. Spare barrel @@ -230,7 +246,7 @@ Arma encasquillada! Zacięcie! Zbraň se zasekla! - Arme enrayée + Arme enrayée ! Оружие заклинило! Megakadt a fegyver! Arma travada! @@ -262,7 +278,7 @@ Arma desencasquillada Zacięcie usunięte Zbraň uvolněna - Arme désenrayée + Arme désenrayée. Оружие исправлено Akadás elhárítva Arma destravada @@ -279,7 +295,7 @@ Porażka przy usuwaniu zacięcia Toujours enrayé ! Non si è disinceppata! - Zbrań se nepodařilo uvolnit + Zbraň se nepodařilo uvolnit Falha no desemperramento Не удалось исправить клин 弾詰りの除去に失敗しました @@ -293,7 +309,7 @@ Cambiar el cañón Wymień lufę Vyměnit hlaveň - Changer de canon + Remplacer le canon Сменить ствол Cső cserélése Substituir cano @@ -309,7 +325,7 @@ Cambiando el cañón... Wymienianie lufy... Měním hlaveň... - Changement du canon... + Remplacement du canon... Смена ствола... Cső kicserélése folyamatban... Substituindo cano... @@ -325,7 +341,7 @@ Cañón cambiado Lufa wymieniona Hlaveň vyměněna - Canon changé + Canon remplacé. Ствол заменён Cső kicserélve Cano substituído @@ -385,6 +401,7 @@ Check spare barrels temperatures + Comprobar temperatura de los cañones de repuesto Verifica temperatura de canos reservas Vérifier la température des canons de rechange Проверить температуру запасных стволов @@ -399,6 +416,7 @@ Checking spare barrels temperatures... + Comprobando temperatura de los cañones de repuesto Verificando temperatura de canos reservas Vérification de la température des canons de rechange... Проверка температуры запасных стволов... @@ -429,10 +447,11 @@ Cool Spare Barrel/s + Cañon/es de repuesto frio/s Cano/s reserva/s frio/s - Canon(s) de rechange froid + Canon(s) de rechange froid(s). Прохладные - Studená náhrandí hlaveň + Studená náhradní hlaveň 予備銃身は冷たい Zimne zapasowe lufy Kalte Wechselläufe @@ -443,10 +462,11 @@ Warm Spare Barrel/s + Cañon/es de repuesto templado/s Cano/s reserva/s morno/s - Canon(s) de rechange tiède + Canon(s) de rechange tiède(s). Теплые - Teplá náhrandí hlaveň + Teplá náhradní hlaveň 予備銃身は温かい Ciepłe zapasowe lufy Warme Wechselläufe @@ -457,10 +477,11 @@ Hot Spare Barrel/s + Cañon/es de repuesto caliente/s Cano/s reserva/s quente/s - Canon(s) de rechange chaud + Canon(s) de rechange chaud(s). Горячие - Horká náhrandí hlaveň + Horká náhradní hlaveň 予備銃身は熱い Gorące zapasowe lufy Heiße Wechselläufe @@ -471,10 +492,11 @@ Very Hot Spare Barrel/s + Cañon/es de repuesto muy caliente/s Cano/s reserva/s muito quente/s - Canon(s) de rechange très chaud + Canon(s) de rechange très chaud(s). Очень горячие - Velmi horká náhrandí hlaveň + Velmi horká náhradní hlaveň 予備銃身はとても熱い Bardzo gorące zapasowe lufy Sehr heiße Wechselläufe @@ -485,10 +507,11 @@ Extremely Hot Spare Barrel/s + Cañon/es de repuesto extremadamente caliente/s Cano/s reserva/s extremamente quente/s - Canon(s) de rechange extrêmement chaud + Canon(s) de rechange extrêmement chaud(s). Запредельно горячие - Extrémně horká náhrandí hlaveň + Extrémně horká náhradní hlaveň 予備銃身は極めて熱い Ekstremalnie gorące zapasowe lufy Extrem heiße Wechselläufe @@ -500,7 +523,7 @@ Overheating Enabled Überhitzung aktiviert - Activada Sobrecalentamiento + Activado Sobrecalentamiento Superaquecimento ativado Surchauffe activée Перегрев включен @@ -514,8 +537,9 @@ Master enable for the overheating/jamming module + Activación maestra para Sobrecalentamiento Chave mestra para o módulo de superaquecimento/emperramento - Activateur maître pour le module de surchauffe / enrayement + Active le module de surchauffe/d'enrayement. Главный включатель для модуля перегрева/заклинивания 過熱と弾詰まりモジュールを全て有効化します Główny włącznik modułu przegrzewania/zacinania się broni @@ -524,6 +548,7 @@ Abilitazione master per il modulo di surriscaldamento / inceppamento 启用枪管过热/干扰模块 啟用槍管過熱/干擾模塊 + Hlavní přepínač pro modul přehřívání/zasekávání diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 3c65ca813cd..2d1d0f783cf 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -51,8 +51,8 @@ if (_distance < _backblastRange) then { private _damage = _alpha * _beta * _backblastDamage; [_damage * 100] call BIS_fnc_bloodEffect; - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical") && {([_unit] call EFUNC(medical,hasMedicalEnabled))}) then { - [_unit, _damage, "body", "backblast"] call EFUNC(medical,addDamageToUnit); + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + [_unit, _damage, "body", "backblast", _unit] call EFUNC(medical,addDamageToUnit); } else { TRACE_1("",isDamageAllowed _unit); if (!isDamageAllowed _unit) exitWith {}; // Skip damage if not allowed diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 53b02fe10de..119c19ebb25 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -56,12 +56,13 @@ TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); // If the target is the ACE_player if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical") && {([_x] call EFUNC(medical,hasMedicalEnabled))}) then { - [_x, _damage, "body", "backblast"] call EFUNC(medical,addDamageToUnit); - } else { - TRACE_1("",isDamageAllowed _x); - if (!isDamageAllowed _x) exitWith {}; // Skip damage if not allowed - _x setDamage (damage _x + _damage); + TRACE_1("",isDamageAllowed _x); + if (isDamageAllowed _x && {_x getVariable [QEGVAR(medical,allowDamage), true]}) then { + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + [_x, _damage, "body", "backblast", _firer] call EFUNC(medical,addDamageToUnit); + } else { + _x setDamage (damage _x + _damage); + }; }; #ifdef DEBUG_MODE_FULL diff --git a/addons/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml index 6dca54adcb5..b701337cb2e 100644 --- a/addons/overpressure/stringtable.xml +++ b/addons/overpressure/stringtable.xml @@ -1,43 +1,63 @@ - - + + Overpressure Distance Coefficient Überdruckentfernungskoeffizient 過圧の距離係数 초과압력 거리 계수 Mnożnik dystansu nadciśnienia - Coéfficient de distance pour la surpression + Coefficient de distance pour la surpression Coefficente Distanza Sovrapressione 高压影响距离系数 高壓影響距離係數 + Коэффициент избыточного давления + Coeficiente de Distância de Sobrepressão + Túlnyomás-távolság együtthatója + Koeficient vzdálenosti přetlaku - + Scales the overpressure effect [Default: 1] Stellt den Koeffizient für die Überdruckentfernung ein [Standard: 1] 過圧効果の範囲 [標準: 1] 초과압력의 효과 크기 [기본설정: 1] Skaluje efekt nadciśnienia [Domyślne: 1] - Échelonne les effets de la surpression [Par défaut : 1] + Ajuste l'effet de surpression. Valeur par défaut : 1. Scala l'effetto di sovrapressione [Predefinito: 1] 高压影响的范围 [预设: 1] 高壓影響的範圍 [預設: 1] + Степень зависимости избыточного давления от расстояния [По умолчанию: 1] + Escala o efeito de sobrepressão [Padrão: 1] + Állítja a túlnyomás hatását [Alapértelmezett: 1] + Nastavuje jak velký je efekt přetlaku [Standard: 1] - + Backblast range + Rückstrahlzone 後方噴射の範囲 向后喷射的范围 後方尾焰的範圍 Raggio della fiammata [lanciarazzi] Zasięg backblast'u + Дальность реактивной струи + Alcance do Sopro de Disparo + Utóhatás távolsága + Portée du backblast + Dosah zpětné tlakové vlny (backblast) - + Backblast angle + Rückstrahlwinkel 後方噴射の角度 向后喷射的角度 後方尾焰的角度 Angolo della fiammata [lanciarazzi] Kąt backblast'u + Угол реактивной струи + Ângulo do Sopro de Disparo + Utóhatás aránya + Angle du backblast + Úhel zpětné tlakové vlny (backblast) diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index facea0a4eda..f5c10154257 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -16,6 +16,7 @@ 고도계 高度计 高度計 + Altimetre Altimeter Watch @@ -32,10 +33,11 @@ 고도계 시계 高度计手表 高度計手錶 + Altimetre Saati Used to show height, descent rate and the time. - Affiche la hauteur, le taux de descente et l'heure. + Permet d'afficher la hauteur, la vitesse de chute et l'heure. Zeigt Höhe, Fallgeschwindigkeit und Uhrzeit. Používané k zjištění výšky, rychlosti sestupu a času. Używany przez spadochroniarzy, pokazuje wysokość, prędkość opadania oraz czas. @@ -48,6 +50,7 @@ 높이와, 하강속도 그리고 시간을 보여줍니다. 用于显示高度,下降率和时间。 用於顯示高度,下降率和時間 + Yüksekliği, alçalma hızını ve zamanı göstermek için kullanılır. Non-Steerable Parachute @@ -64,6 +67,7 @@ 비-조종 낙하산 非可操控降落伞 非可操控降落傘 + Yönlendirilemez Paraşüt Cut Parachute @@ -80,6 +84,7 @@ 낙하산 자르기 剪断降落伞 剪斷降落傘 + Paraşütü Kes Reserve Parachute @@ -96,6 +101,7 @@ 예비 낙하산 备用降落伞 備用降落傘 + Yedek Paraşüt Hide Freefall Altimeter @@ -105,6 +111,12 @@ 隱藏自由落體高度計 隐藏自由落体高度计 Schowaj wysokościomierz podczas swobodnego opadania + Убрать высотомер при падении + Esconder Altímetro de queda livre + Masquer l'altimètre en chute libre + Schovat výškoměr v GUI při volném pádu + Ocultar altímetro de caída libre + Serbest Düşüş Altimetresini Gizle Hides the altitude and speed shown while free falling or parachuting. @@ -114,6 +126,12 @@ 在自由落體時或開傘下隱藏自由落體高度計 在自由落体时或开伞下隐藏自由落体高度计。 Chowa wysokość i prędkość pokazywaną podczas swobodnego opadania lub spadania ze spadochronem. + Скрывает показания высоты и скорости при свободном падении или прыжках с парашютом. + Esconde a altitude e velocidade enquanto estiver em queda livre ou saltando de paraquedas. + Cache l'altitude et la vitesse affichées, lors d'une chute libre ou d'un parachutage. + Schová výšku a rychlost v GUI při volném pádu a při použití padáku. + Oculta la altitud y la velocidad que se muestran en caída libre o en paracaídas. + Serbest düşme veya paraşütle atlama sırasında gösterilen yüksekliği ve hızı gizler. diff --git a/addons/pylons/XEH_postInit.sqf b/addons/pylons/XEH_postInit.sqf index 0fdcaee056d..3e0b9bb4f0f 100644 --- a/addons/pylons/XEH_postInit.sqf +++ b/addons/pylons/XEH_postInit.sqf @@ -1,34 +1,38 @@ #include "script_component.hpp" -private _filter = "isClass (_x >> 'Components' >> 'TransportPylonsComponent') && {(getNumber (_x >> 'scope')) > 0}"; -GVAR(aircraftWithPylons) = (_filter configClasses (configFile >> "CfgVehicles")) apply {configName _x}; -{ - [_x, "init", { - params ["_aircraft"]; - - private _loadoutAction = [ - QGVAR(loadoutAction), - localize LSTRING(ConfigurePylons), - "", - {[_target] call FUNC(showDialog)}, - { - if (!GVAR(enabledFromAmmoTrucks)) exitWith {false}; - - private _vehicles = nearestObjects [_target, ["Air", "LandVehicle", "Slingload_base_F", "ReammoBox_F"], GVAR(searchDistance) + 10]; - private _isRearmVehicle = if (["ace_rearm"] call EFUNC(common,isModLoaded)) then { - _vehicles findIf {[_x] call EFUNC(rearm,isSource)} != -1; - } else { - private _cfgVehicle = configFile >> "CfgVehicles"; - _vehicles findIf {getNumber (_cfgVehicle >> typeOf _x >> "transportAmmo") > 0} != -1; - }; - - (_isRearmVehicle && {[ace_player, _target] call FUNC(canConfigurePylons)}) - } - ] call EFUNC(interact_menu,createAction); - - [_aircraft, 0, ["ACE_MainActions"], _loadoutAction] call EFUNC(interact_menu,addActionToObject); - }, false, [], true] call CBA_fnc_addClassEventHandler; -} forEach GVAR(aircraftWithPylons); +GVAR(aircraftWithPylons) = []; + +GVAR(loadoutAction) = [ // create action + QGVAR(loadoutAction), + localize LSTRING(ConfigurePylons), + "", + {[_target] call FUNC(showDialog)}, + { + if (!GVAR(enabledFromAmmoTrucks)) exitWith {false}; + + private _vehicles = nearestObjects [_target, ["Air", "LandVehicle", "Slingload_base_F", "ReammoBox_F"], GVAR(searchDistance) + 10]; + private _isRearmVehicle = if (["ace_rearm"] call EFUNC(common,isModLoaded)) then { + _vehicles findIf {[_x] call EFUNC(rearm,isSource)} != -1; + } else { + private _cfgVehicle = configFile >> "CfgVehicles"; + _vehicles findIf {getNumber (_cfgVehicle >> typeOf _x >> "transportAmmo") > 0} != -1; + }; + + (_isRearmVehicle && {[ace_player, _target] call FUNC(canConfigurePylons)}) + } +] call EFUNC(interact_menu,createAction); + +["Air", "init", { // on air vehicle init, add action to class if has pylons + params ["_vehicle"]; + private _typeOf = typeOf _vehicle; + + if (_typeOf in GVAR(aircraftWithPylons)) exitWith {}; + if (!isClass (configFile >> "CfgVehicles" >> _typeOf >> 'Components' >> 'TransportPylonsComponent')) exitWith {}; + + GVAR(aircraftWithPylons) pushBack _typeOf; + [_typeOf, 0, ["ACE_MainActions"], GVAR(loadoutAction)] call EFUNC(interact_menu,addActionToClass); +}, true, ["ParachuteBase"], true] call CBA_fnc_addClassEventHandler; + [QGVAR(setPylonLoadOutEvent), { params ["_aircraft", "_pylonIndex", "_pylon", "_turret", "_weaponToRemove"]; diff --git a/addons/pylons/config.cpp b/addons/pylons/config.cpp index 011167fd228..fc7159e08b4 100644 --- a/addons/pylons/config.cpp +++ b/addons/pylons/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interact_menu", "ace_zeus"}; + requiredAddons[] = {"ace_interact_menu"}; author = ECSTRING(common,ACETeam); authors[] = {"654wak654"}; url = ECSTRING(main,URL); diff --git a/addons/pylons/functions/fnc_handleDisconnect.sqf b/addons/pylons/functions/fnc_handleDisconnect.sqf index 9ad646eb310..9bc3247415f 100644 --- a/addons/pylons/functions/fnc_handleDisconnect.sqf +++ b/addons/pylons/functions/fnc_handleDisconnect.sqf @@ -4,20 +4,22 @@ * Cleans up pylons on client disconnect. * * Arguments: - * 0: Player + * 0: Unit (not used) + * 1: ID (not used) + * 2: UID * * Return Value: * None * * Example: - * [] call ace_pylons_fnc_handleDisconnect + * [_unit, _id, _uid] call ace_pylons_fnc_handleDisconnect * * Public: No */ params ["", "", "_uid"]; -private _aircraft = GVAR(currentAircraftNamespace) getVariable ["_uid", objNull]; +private _aircraft = GVAR(currentAircraftNamespace) getVariable [_uid, objNull]; if (!isNull _aircraft) then { _aircraft setVariable [QGVAR(currentUser), objNull, true]; diff --git a/addons/pylons/functions/fnc_showDialog.sqf b/addons/pylons/functions/fnc_showDialog.sqf index 2ce438e0ab7..119489f4d8e 100644 --- a/addons/pylons/functions/fnc_showDialog.sqf +++ b/addons/pylons/functions/fnc_showDialog.sqf @@ -1,23 +1,25 @@ #include "script_component.hpp" /* -* Author: 654wak654 -* Shows the aircraft loadout dialog for given aircraft. -* -* Arguments: -* 0: Aircraft -* 1: Is curator. Disables time and resource requirements. (default: false) -* -* Return Value: -* None -* -* Example: -* [vehicle ace_player] call ace_pylons_fnc_showDialog -* -* Public: Yes -*/ + * Author: 654wak654 + * Shows the aircraft loadout dialog for given aircraft. + * + * Arguments: + * 0: Aircraft + * 1: Is curator. Disables time and resource requirements. (default: false) + * + * Return Value: + * None + * + * Example: + * [vehicle ace_player] call ace_pylons_fnc_showDialog + * + * Public: Yes + */ params ["_aircraft", ["_isCurator", false]]; +if (_isCurator && {!(["ace_zeus"] call EFUNC(common,isModLoaded))}) exitWith { WARNING("ace_zeus not loaded"); }; + if !(typeOf _aircraft in GVAR(aircraftWithPylons)) exitWith { if (_isCurator) then { [LSTRING(AircraftDoesntHavePylons)] call EFUNC(zeus,showMessage); diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml index a1949e816c2..1e83e512742 100644 --- a/addons/pylons/stringtable.xml +++ b/addons/pylons/stringtable.xml @@ -9,8 +9,11 @@ 飞机武器配置 항공기 무장 AUSRÜSTUNG DES FLUGGERÄTS - ÉQUIPEMENTS DE L'AÉRONEF + ÉQUIPEMENT DE L'AÉRONEF WYPOSAŻENIE POJAZDU POWIETRZNEGO + СНАРЯЖЕНИЕ САМОЛЕТА + LOADOUT DA AERONAVE + VÝZBROJ LETADLA Loadouts for %1 @@ -22,6 +25,9 @@ Ausrüstung für %1 Équipements pour %1 Wyposażenia dla %1 + Оснащение %1 + Loadouts para %1 + Sady výzbroje pro %1 Configure Pylons @@ -33,6 +39,9 @@ Konfiguriere Außenlaststationen Configurer les pylônes Konfiguruj Pylony + Настройка Пилонов + Configurar Pylons + Nastavit pylony ACE Pylons @@ -44,6 +53,9 @@ ACE Außenlaststationen ACE Pylônes Pylony ACE + ACE Пилоны + ACE Pylons + ACE Pylony <empty> @@ -55,6 +67,10 @@ <leer> <vide> <puste> + <пусто> + <vazio> + <prázdné> + <boş> Pylons that are colored red will have to be manually rearmed. @@ -66,6 +82,9 @@ Außenlaststationen, die rot markiert sind, müssen manuell aufmunitioniert werden. Les pylônes colorés en rouge devront être réarmés manuellement. Pylony, które są w kolorze czerwonym muszą być manualnie dozbrojone. + Пилоны, окрашенные красным, должны быть переоборудованы вручную + Pylons que estão coloridos de vermelho, precisarão ser rearmados manualmente. + Pylony označené červeně budou muset být manuálně přezbrojeny. %1 is already configuring this aircraft! @@ -77,6 +96,9 @@ %1 konfiguriert dieses Fluggerät bereits! %1 est déjà en train de configurer cet aéronef ! %1 już konfiguruje ten pojazd! + %1 уже настраивает эту авиатехнику! + %1 já está configurando essa aeronave! + %1 už nastavuje výzbroj tohoto letadla! Replacing pylon %1 out of %2... @@ -86,8 +108,11 @@ 共有%2个发射架,正在整装%1号挂架中... 교체중 (%2 -> %1) Ersetze Außenlaststation %1 von insgesamt %2 - Remplacement du pylône %1 sur %2 ... + Remplacement du pylône %1 sur %2... Wymiana pylonów %1 z %2... + Замена пилона %1 из %2... + Substituindo pylon %1 de %2... + Nahrazuji pylon %1 z %2... Stopped at pylon %1! @@ -99,6 +124,9 @@ Gestoppt bei Außenlaststation %1 Arrêté au pylône %1 ! Zatrzymano na pylonie %1! + Остановлено на пилоне %1! + Parado no pylon %1! + Přerušeno na pylonu %1! Vehicle too far @@ -108,8 +136,11 @@ 载具过远 車両が遠すぎます Fahrzeug zu weit entfernt - Véhicule trop éloigné + Véhicule trop éloigné. Pojazd za daleko + Техника слишком далеко + Veículo muito longe + Vozidlo je příliš daleko Enable Pylons Menu for Zeus @@ -117,8 +148,12 @@ 啟用派龍架選單給宙斯 Abilita Menù Piloni da Zeus Zeus でパイロン メニューを有効化 + Aktiviert Außenlaststationsmenü im Zeus Activer le menu des pylônes (Zeus) Aktywuj Menu Pylonów dla Zeus'a + Активировать Меню пилонов для Зевса + Ativar Menu de Pylon para Zeus + Povolit menu s pylony pro Zeuse Enables use of the zeus module. @@ -126,8 +161,12 @@ 允啟使用宙斯模塊 Abilita l'uso dal modulo di Zeus Zeus モジュールでパイロン メニューを利用できます。 - Autorise l'utilisation des modules Zeus + Aktiviert die Nutzung im Zeus + Permet l'utilisation des modules Zeus. Aktywuj wykorzystanie modułu zeus'a. + Позволяет использовать модуль Зевса + Permite usar o módulo de Zeus + Povoluje použití daného Zeus modulu. Enable Pylons Menu from Ammo Trucks @@ -135,8 +174,12 @@ 啟用從彈藥卡車使用派龍架選單 Abilita Menù Piloni da mezzi rifornimento munizioni 弾薬トラックからパイロン メニューを有効化 - Activer le menu des pylônes (camion de munitions) + Aktiviert Außenlaststationsmenü von Munitionstransportern + Activer le menu des pylônes (camions de munitions) Aktywuj Menu Pylonów dla Ciężarówek z amunicją + Меню пилонов из грузовика боеприпасов + Ativar Menu de Pylons de Caminhões de Munição + Povolit menu s pylony z muničních náklaďáků. Enables use of pylons menu from ammo trucks. @@ -144,8 +187,12 @@ 允許從彈藥卡車使用派龍架選單 Abilita l'uso del Menù Piloni da mezzi rifornimento munizioni 弾薬給弾トラックからパイロン メニューを利用できます。 - Autorise l'utilisation du menu des pylônes depuis les camions de munitions. + Aktiviert die Nutzung von Außenlaststationsmenü von Munitionstransportern. + Permet l'utilisation du menu des pylônes à partir des camions de ravitaillement de munitions. Aktywuj wykorzystanie menu pylonów z ciężarówek z amunicją. + Позволяет использовать меню пилонов из грузовика с боеприпасами + Permite abrir o menu de pylons através de veículos de munição. + Povoluje použití menu na nastavení pylonů z náklaďáků s municí. This aircraft doesn't have pylons @@ -153,8 +200,12 @@ 這架飛機沒有派龍架 Questo aereo non ha piloni 航空機にパイロンがありません - Cet aéronef n'a pas de pylônes + Dieses Flugzeug hat keine Außenlaststationen + Cet aéronef n'a pas de pylônes. Ten pojazd nie posiada pylonów + Эта авиатехника не имеет пилонов + Essa aeronave não possui pylons + Toto letadlo nemá pylony Configure pylons module is disabled for zeus @@ -162,8 +213,12 @@ 宙斯模塊的派龍架設定已被禁用 Il modulo per configurare i piloni da Zeus è disabilitato Zeus のパイロン モジュールを無効化 - La configuration de pylônes est désactivé pour Zeus + Die Konfiguration für das Außenlaststationen ist im Zeus deaktiviert + Le module de configuration des pylônes est désactivé pour Zeus. Konfiguracja modułu pylonów jest wyłączona dla zeus'a + Модуль Настройка пилонов отключен для Zeus + O Módulo de configurar pylons está desativado para o Zeus + Nastavení pylonů je vypnuto pro Zeuse Rearm New Pylons @@ -175,6 +230,9 @@ Neue Außenlaststationen. aufmunitionieren Réarmer les nouveaux pylônes Dozbrój Nowe Pylony + Перевооружать новые пилоны + Rearmar novos pylons + Přezbrojit nové pylony Automatically rearm new pylons from the nearest rearm vehicle. @@ -184,8 +242,11 @@ 自动从附近的整装载具中为导弹挂架进行弹药整装。 근처의 재무장 차량에서 빈 파일런을 자동으로 재무장 합니다. Neue Außenlaststationen. automatisch vom nächsten Munitionsfahrzeug aufmunitionieren - Réarmer automatiquement tout les nouveau pylônes depuis le véhicule de munitions le plus proche. + Réarme automatiquement les nouveaux pylônes à partir du véhicule de ravitaillement le plus proche. Automatycznie dozbrajaj nowe pylony z najbliższego pojazdu dozbrajania. + Автоматически перевооружать новые пилоны из ближайшей техники с боеприпасами + Automaticamente rearmas novos pylons com o veículo de munição mais próximo + Automaticky přezbrojit nové pylony z nejbližšího vozidla s municí. Time Per Pylon @@ -197,6 +258,9 @@ Zeit pro Außenlaststation Durée par pylône Czas na Pylon + Время на пилон + Tempo por pylon + Čas na pylon The time it takes to replace each pylon (in seconds). @@ -208,6 +272,9 @@ Die benötigte Zeit, um einzelne Außenlaststationen zu ersetzen (in Sekunden). Le temps nécessaire pour remplacer chaque pylône (en secondes). Czas, jaki trwa wymiana każdego z pylonów (w sekundach). + Время для замены каждого пилона (в секундах) + O tempo necessário para substituir cada pylon (em segundos) + Udává čas jaký trvá nahrazení každého pylonu (ve vteřinách). Search Distance @@ -217,8 +284,11 @@ 搜索距离 검색 반경 Suchdistanz - Distance de recherche + Distance ravitaillement Dystans Szukania + Дальность поиска + Distância de procura + Vzdálenost hledání munice The distance an aircraft needs to be from a rearm vehicle. @@ -228,8 +298,11 @@ 设定飞机必须距离整装载具多少公尺才能进行弹药整装。 항공기에서 재보급 가능한 재무장 차량을 찾습니다. Die Distanz, die ein Fahrzeug von einem Munitionsfahrzeug entfernt sein darf. - La distance à laquelle un aéronef doit être d'un véhicule de munitions. + La distance maximale à laquelle un aéronef doit se trouver du véhicule de ravitaillement. Dystans, w jakim pojazd musi być od pojazdu dozbrajania. + Дальность от авиатехники до грузовика (пункта) с боеприпасами + A distância que a aeronave precisa estar de um veículo de munições. + Maximální vzdálenost ze které je možné letadlo přezbrojit s vozidlem s municí. Require Engineer @@ -239,8 +312,11 @@ 必须是工兵 정비병 요구 Benötigt Pionier - Requiert ingénieur + Ingénieur requis Wymaga Mechanika + Требуется Инженер + Requer um engenheiro + Vyžadovat Inženýra Require an engineer. @@ -252,6 +328,9 @@ Benötigt einen Pionier. Requiert un ingénieur. Wymaga mechanika. + Требуется роль Инженера + É necessário uma unidade definida como engenheiro para interagir com pylons. + Vyžaduje, aby hráč byl Inženýr. Require Toolkit @@ -261,8 +340,11 @@ 需要工具包 툴킷 요구 Benötigt Werkzeugkasten - Requiert trousse à outils + Trousse à outils requise Wymaga Narzędzi + Требуется Набор инструментов + Requer Kit de Ferramentas + Vyžadovat sadu nářadí (toolkit). Require a toolkit in inventory. @@ -274,6 +356,9 @@ Benötigt einen Werkzeugkasten im Inventar. Requiert une trousse à outils dans l'inventaire. Wymaga narzędzi w ekwipunku. + Требуется наличие Набора инструментов в инвентаре + Requer um Kit de Ferramentas no inventário. + Vyžaduje, aby hráč měl ve svém inventáři sadu nářadí (toolkit). diff --git a/addons/quickmount/CfgVehicles.hpp b/addons/quickmount/CfgVehicles.hpp index d24a207d4ba..a0b54df48b5 100644 --- a/addons/quickmount/CfgVehicles.hpp +++ b/addons/quickmount/CfgVehicles.hpp @@ -43,7 +43,7 @@ class CfgVehicles { condition = QUOTE(call DFUNC(canShowFreeSeats)); \ statement = QUOTE(call DFUNC(getInNearest)); \ exceptions[] = {"isNotSwimming"}; \ - insertChildren = QUOTE(call DFUNC(addFreeSeatsActions)); \ + insertChildren = QUOTE((_this select 2) param [ARR_2(0, [])]); \ }; \ }; \ }; \ @@ -52,7 +52,7 @@ class CfgVehicles { displayName = CSTRING(ChangeSeat); \ condition = QUOTE(call DFUNC(canShowFreeSeats)); \ statement = ""; \ - insertChildren = QUOTE(call DFUNC(addFreeSeatsActions)); \ + insertChildren = QUOTE((_this select 2) param [ARR_2(0, [])]); \ }; \ } diff --git a/addons/quickmount/XEH_postInitClient.sqf b/addons/quickmount/XEH_postInitClient.sqf index 718c08b843d..23c225f5839 100644 --- a/addons/quickmount/XEH_postInitClient.sqf +++ b/addons/quickmount/XEH_postInitClient.sqf @@ -4,7 +4,7 @@ if (!hasInterface) exitWith {}; ["ACE3 Movement", QGVAR(mount), [localize LSTRING(KeybindName), localize LSTRING(KeybindDescription)], "", { if (!dialog) then { - call FUNC(getInNearest); + [] call FUNC(getInNearest); }; false }] call CBA_fnc_addKeybind; diff --git a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf index b49525d406e..422afece6dd 100644 --- a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf +++ b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf @@ -33,17 +33,17 @@ [ARR_5( \ {!isNull objectParent (_this select 0)}, \ { \ - params [ARR_2("_player","_damageBlocked")]; \ - if (_damageBlocked) then {_player allowDamage true}; \ - LOG_1("moved in in %1 frames",diag_frameno-GVAR(frame)); \ + LOG_1("moved in after %1 frames",diag_frameno-GVAR(frame)); \ + (_this select 0) enableSimulation true; \ }, \ - [ARR_4(_player,_damageBlocked,_moveBackCode,_moveBackParams)], \ + [ARR_3(_player,_moveBackCode,_moveBackParams)], \ TAKEN_SEAT_TIMEOUT, \ { \ - params [ARR_4("_player","_damageBlocked","_moveBackCode","_moveBackParams")]; \ + params [ARR_3("_player","_moveBackCode","_moveBackParams")]; \ + WARNING_1("failed move in after %1 frames",diag_frameno-GVAR(frame)); \ [ARR_2(_player,_moveBackParams)] call _moveBackCode; \ - if (_damageBlocked) then {_player allowDamage true}; \ localize "str_mis_state_failed" call EFUNC(common,displayTextStructured); \ + _player enableSimulation true; \ } \ )] call CBA_fnc_waitUntilAndExecute; @@ -62,18 +62,10 @@ private _fnc_move = { (_this select 2) params ["_moveInCode", "_moveInParams", "_currentTurret", "_moveBackCode", "_moveBackParams", ["_enabledByAnimationSource", ""]]; TRACE_7("fnc_move params",_moveInCode,_moveInParams,_currentTurret,_moveBackCode,_moveBackParams,_enabledByAnimationSource,call {GVAR(frame)=diag_frameno}); - // check bugged FFV - if ( - !("" isEqualTo _enabledByAnimationSource) - && {1 > _target doorPhase _enabledByAnimationSource} - ) exitWith {}; - // workaround getting damage when moveOut while vehicle is moving - private _damageBlocked = false; - if (isDamageAllowed _player) then { - _player allowDamage false; - _damageBlocked = true; - }; + // also this helps with arma bug when unit is stuck in wrong anim when move in turret with configured enabledByAnimationSource + _player enableSimulation false; + private _preserveEngineOn = _player == driver _target && {isEngineOn _target}; moveOut _player; if (_preserveEngineOn) then {_target engineOn true}; @@ -89,12 +81,12 @@ private _fnc_move = { [ {params ["_target", "_player", "_currentTurret"]; IS_MOVED_OUT}, { - params ["", "_player", "", "_moveInCode", "_moveInParams", "_moveBackCode", "_moveBackParams", "_damageBlocked"]; - LOG_2("moved out in %1 frames",diag_frameno-GVAR(frame),call {GVAR(frame)=diag_frameno; 0}); + params ["", "_player", "", "_moveInCode", "_moveInParams", "_moveBackCode", "_moveBackParams"]; + LOG_2("moved out after %1 frames",diag_frameno-GVAR(frame),call {GVAR(frame)=diag_frameno; 0}); [_player, _moveInParams] call _moveInCode; WAIT_IN_OR_MOVE_BACK; }, - [_target, _player, _currentTurret, _moveInCode, _moveInParams, _moveBackCode, _moveBackParams, _damageBlocked] + [_target, _player, _currentTurret, _moveInCode, _moveInParams, _moveBackCode, _moveBackParams] ] call CBA_fnc_waitUntilAndExecute; }; @@ -216,12 +208,6 @@ private _cargoNumber = -1; private _gunnerCompartments = (_turretConfig >> "gunnerCompartments") call BIS_fnc_getCfgData; TO_COMPARTMENT_STRING(_gunnerCompartments); if (_compartment != _gunnerCompartments) then {breakTo "crewLoop"}; - // due to arma bug the unit is stuck in wrong anim when move in turret with configured enabledByAnimationSource - private _enabledByAnimationSource = getText (_turretConfig >> "enabledByAnimationSource"); - if ( - !("" isEqualTo _enabledByAnimationSource) - && {1 > _vehicle doorPhase _enabledByAnimationSource} - ) then {breakTo "crewLoop"}; _params = [{MOVE_IN_CODE(moveInTurret)}, [_vehicle, _turretPath], _currentTurret, _moveBackCode, _moveBackParams, _enabledByAnimationSource]; _statement = _fnc_move; }; diff --git a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf index 560a036a50f..ac146a8c578 100644 --- a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf +++ b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf @@ -6,6 +6,7 @@ * Arguments: * 0: Vehicle * 1: Unit + * 2: Args * * Return Value: * Can show menu @@ -16,8 +17,9 @@ * Public: No */ -params ["_vehicle", "_unit"]; +params ["_vehicle", "_unit", "_args"]; +_args set [0, []]; private _isInVehicle = _unit in _vehicle; GVAR(enabled) @@ -36,4 +38,8 @@ GVAR(enabled) 0.3 < vectorUp _vehicle select 2 // moveIn* and GetIn* don't work for flipped vehicles || {_vehicle isKindOf "Air"} // except Air } -&& {!([] isEqualTo (_this call FUNC(addFreeSeatsActions)))} // this should be replaced with faster function +&& { + private _subActions = _this call FUNC(addFreeSeatsActions); + _args set [0, _subActions]; + !([] isEqualTo _subActions) +} diff --git a/addons/quickmount/functions/fnc_getInNearest.sqf b/addons/quickmount/functions/fnc_getInNearest.sqf index 8e8d77fe8dc..b94ba8f0d9a 100644 --- a/addons/quickmount/functions/fnc_getInNearest.sqf +++ b/addons/quickmount/functions/fnc_getInNearest.sqf @@ -4,7 +4,7 @@ * Mount the player in the vehicle they are directly looking at based on their distance. * * Arguments: - * None + * 0: Target (Optional) * * Return Value: * None @@ -22,17 +22,27 @@ if (!GVAR(enabled) || {ACE_player getVariable ["ace_unconscious", false]} ) exitWith {}; +params [["_interactionTarget", objNull, [objNull]]]; +TRACE_1("getInNearest",_interactionTarget); + private _start = AGLtoASL (ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")); private _end = (_start vectorAdd (getCameraViewDirection ACE_player vectorMultiply GVAR(distance))); private _objects = lineIntersectsSurfaces [_start, _end, ACE_player]; private _target = (_objects param [0, []]) param [2, objNull]; +if ((isNull _target) && {alive _interactionTarget}) then { + _end = _start vectorAdd ((_start vectorFromTo (aimPos _interactionTarget)) vectorMultiply GVAR(distance)); + _objects = lineIntersectsSurfaces [_start, _end, ACE_player]; + TRACE_1("2nd ray attempt at interaction target aim pos",_objects); + _target = (_objects param [0, []]) param [2, objNull]; +}; + if (locked _target in [2,3]) exitWith { [localize LSTRING(VehicleLocked)] call EFUNC(common,displayTextStructured); true }; -TRACE_1("",_target); +TRACE_2("",_target,typeOf _target); if (!isNull _target && {alive _target} && diff --git a/addons/quickmount/initSettings.sqf b/addons/quickmount/initSettings.sqf index f2133571670..742a45cb7e4 100644 --- a/addons/quickmount/initSettings.sqf +++ b/addons/quickmount/initSettings.sqf @@ -1,7 +1,7 @@ [ QGVAR(enabled), "CHECKBOX", - ELSTRING(common,Enabled), + [ELSTRING(common,Enabled), LSTRING(EnabledDescription)], format ["ACE %1", LLSTRING(Category)], true, true diff --git a/addons/quickmount/stringtable.xml b/addons/quickmount/stringtable.xml index ab1bf15e67f..d53a4b2b108 100644 --- a/addons/quickmount/stringtable.xml +++ b/addons/quickmount/stringtable.xml @@ -10,6 +10,10 @@ 快速搭乘 Szybkie wsiadanie 빠른 탑승 + Быстрая посадка + Entrada Rápida + Entrée rapide + Rychlé nastoupení Vehicle quick mount @@ -20,6 +24,10 @@ 快速搭乘载具 快速搭乘載具 빠른 차량 탑승 + Быстрая посадка в технику + Entrada Rápida em Veículo + Entrée rapide véhicules + Rychlé nastoupení do vozidla Quickly enter the vehicle you are directly looking at. @@ -30,6 +38,11 @@ 快速進入你正在看的載具之中 Szybko wsiądź do pojazdu, na który patrzysz. 빠르게 당신이 보고 있는 가까운 차량에 탑승합니다. + Позволяет быстро сесть в технику, на которую вы смотрите + Rapidamente entra no veículo que você está olhando diretamente. + Permet d'entrer rapidement dans le véhicule que vous regardez. + Rychle nastoupit do vozidla na které se díváte. + Doğrudan bakmakta olduğunuz araca hızla girin. Vehicle Full @@ -40,6 +53,23 @@ 載具已滿 Pojazd pełny 만차 + Мест нет + Veículo cheio + Véhicule plein + Vozidlo je plné + Araç Dolu + + + This option allows quick entry into the vehicle you are directly looking at. + Cette option permet d'entrer rapidement dans les véhicules que vous regardez. + 這個選項允許你能快速進入你直視的載具 + Ta opcja umożliwia szybkie wsiadanie do pojazdu na który patrzysz. + Esta opção permite entrada rápida para o veículo que você está olhando + この機能により直接見ている車両へすぐさま搭乗できます。 + Questa opzione permette l'entrata rapida nel veicolo che si sta guardando. + Bu seçenek, doğrudan bakmakta olduğunuz araca hızlı giriş sağlar. + Tato možnost umožňuje rychle nastoupit do vozidla na které se díváte. + Эта опция разрешает быстро залезть в транспорт, на который вы смотрите. Distance @@ -50,16 +80,26 @@ 距離 Odległość 거리 + Дистанция + Distância + Distance + Vzdálenost + Mesafe Maximum distance to check for vehicles. Maximale Entfernung zu Fahrzeugen Distanza massima per controllare i veicoli. - 車両を確認できる最大距離 + 車両を検知できる最大距離を設定します。 最大可检查载具的距离. 最大可檢查載具的距離 Maksymalna odległość do pojazdu. 탑승 가능한 차량과의 거리 + Максимальная дистанция для техники + Distância máxima para checar por veículos. + Distance de vérification maximale des véhicules. + Maximální vzdálenost od vozidel. + Araçların kontrol edilmesi için maksimum mesafe. Vehicle Locked @@ -70,6 +110,11 @@ 載具已上鎖 Pojazd zablokowany 차량 잠김 + Техника закрыта + Veículo Trancado + Véhicule verrouillé + Vozidlo je zamčeno + Araç Kilitli Maximum Speed (km/h) @@ -80,16 +125,26 @@ 最高速度 (公里/小時) Maksymalna prędkość (km/h) 최대 속도 (km/h) + Макс. скорость (км/ч) + Velocidade Máxima (km/h) + Vitesse maximale (km/h) + Maximální rychlost (km/h) + Yüksek Hız (km/h) Maximum vehicle speed (km/h) allowed for player entry - Maximale Geschwindigkeit (km/h) für Schnellzugang + Maximale erlaubte Geschwindigkeit (km/h) für Schnellzugang Velocità massima del veicolo (km/h) consentita per far salire un giocatore - プレイヤーが搭乗できる限界速度 (km/h) + プレイヤーが搭乗できる最高速度 (km/h) を設定します。 设置玩家能在最高速度是多少的情况之下进入载具。 設置玩家能在最高多少的速度之下進入載具 Maksymalna prędkość pojazdu (km/h) pozwalająca graczowi wsiąść. 플레이어가 탑승 가능한 목표 차량의 최대 속도 + Макс. скорость техники для посадки игрока (км/ч) + Velocidade máxima que o veículo pode estar para permitr entrada rápida. + Définit la vitesse maximale que peut avoir un véhicule en mouvement pour qu'un joueur réussisse à y entrer. + Maximální rychlost vozidla (km/h) při které hráči mohou nastoupit do vozidla + Oyuncu binmesi için izin verilen maksimum araç hızı (km / s) Prioritize Seat @@ -100,23 +155,39 @@ 優先座位 Priorytet zajmowanych pozycji 좌석 우선순위 지정 + Приоритет мест + Priorizar Assento + Place prioritaire + Priorita sedadel + Koltuğa Öncelik Ver Seat priority on entry Priorisierter Sitzplatz zum Schnellzugang Priorità del sedile in entrata - 搭乗時の優先順位 + 搭乗時の優先順位をします。 优先想进入哪个位置。 優先想進入哪個座位 Priorytet pozycji w pojeździe 탑승할 좌석의 우선순위를 지정합니다. + Приоритет мест при посадке + Define qual o assento que vai priorizar a Entrada Rápida + Définit à quel poste s'asseoir en priorité lors de l'embarquement. + Priorita sedadla při nástupu + Araça binerken koltuk önceliği Change seat + Sitz wechseln Пересесть 席の変更 Zmień zajmowaną pozycję Cambia posto + Mudar de Assento + 換座位 + Changer de place + Změnit sedadlo + Koltuk Değiştir diff --git a/addons/rangecard/CfgEventHandlers.hpp b/addons/rangecard/CfgEventHandlers.hpp index 5da5fd0dc24..becf3950523 100644 --- a/addons/rangecard/CfgEventHandlers.hpp +++ b/addons/rangecard/CfgEventHandlers.hpp @@ -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)); }; }; diff --git a/addons/rangecard/functions/fnc_canShow.sqf b/addons/rangecard/functions/fnc_canShow.sqf index 6b3cf6997aa..4262391d294 100644 --- a/addons/rangecard/functions/fnc_canShow.sqf +++ b/addons/rangecard/functions/fnc_canShow.sqf @@ -15,4 +15,8 @@ * Public: No */ -(GVAR(ammoClass) != "" && GVAR(magazineClass) != "" && GVAR(weaponClass) != "" && !GVAR(RangeCardOpened) && ("ACE_RangeCard" in (uniformItems ACE_player)) || ("ACE_RangeCard" in (vestItems ACE_player))) +GVAR(ammoClass) != "" && +GVAR(magazineClass) != "" && +GVAR(weaponClass) != "" && +!GVAR(RangeCardOpened) && +"ACE_RangeCard" in ([ACE_player] call EFUNC(common,uniqueItems)) diff --git a/addons/rangecard/functions/fnc_canShowCopy.sqf b/addons/rangecard/functions/fnc_canShowCopy.sqf index e4eb28b60b2..134147917ec 100644 --- a/addons/rangecard/functions/fnc_canShowCopy.sqf +++ b/addons/rangecard/functions/fnc_canShowCopy.sqf @@ -15,4 +15,8 @@ * Public: No */ -(GVAR(ammoClassCopy) != "" && GVAR(magazineClassCopy) != "" && GVAR(weaponClassCopy) != "" && !GVAR(RangeCardOpened) && ("ACE_RangeCard" in (uniformItems ACE_player)) || ("ACE_RangeCard" in (vestItems ACE_player))) +GVAR(ammoClassCopy) != "" && +GVAR(magazineClassCopy) != "" && +GVAR(weaponClassCopy) != "" && +!GVAR(RangeCardOpened) && +"ACE_RangeCard" in ([ACE_player] call EFUNC(common,uniqueItems)) diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 9fc2c9ebab0..89a6ac9e542 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -14,7 +14,7 @@ * None * * Example: - * [1, 2, "ammo", "magazine", "weapon"] call ace_rangecard_fnc_openRangeCard + * [1, 2, "ammo", "magazine", "weapon"] call ace_rangecard_fnc_updateRangeCard * * Public: No */ diff --git a/addons/rangecard/initKeybinds.sqf b/addons/rangecard/initKeybinds.sqf index cb6ff49206e..2e0828127d4 100644 --- a/addons/rangecard/initKeybinds.sqf +++ b/addons/rangecard/initKeybinds.sqf @@ -1,11 +1,11 @@ -["ACE3 Equipment", QGVAR(RangeCardDialogKey), localize "STR_ACE_RangeCard_RangeCardDialogKey", +["ACE3 Equipment", QGVAR(RangeCardDialogKey), LLSTRING(RangeCardDialogKey), { // Conditions: canInteract, canShow if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; if (GVAR(RangeCardOpened)) exitWith { closeDialog 0; false - }; + }; if !(call FUNC(canShow)) exitWith {false}; // Statement false call FUNC(openRangeCard); @@ -14,7 +14,7 @@ {false}, [0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) -["ACE3 Equipment", QGVAR(RangeCardCopyDialogKey), localize "STR_ACE_RangeCard_RangeCardCopyDialogKey", +["ACE3 Equipment", QGVAR(RangeCardCopyDialogKey), LLSTRING(RangeCardCopyDialogKey), { // Conditions: canInteract, canShowCopy if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -28,4 +28,4 @@ true }, {false}, -[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) \ No newline at end of file +[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml index 5862981e16a..8290ef9b08a 100644 --- a/addons/rangecard/stringtable.xml +++ b/addons/rangecard/stringtable.xml @@ -16,6 +16,7 @@ 사거리표 弹道射表 彈道射表 + Menzil Kartı 50 METER increments -- MRAD/MRAD (reticle/turrets) @@ -24,7 +25,7 @@ Přidat 50 METRŮ -- MRAD/MRAD (síťka/věže) 50-Meter-Schritte MRAD/MRAD (Fadenkreuz/Geschützturm) Incrementos de 50 METROS - MRAD/MRAD (retícula/torres) - Incrément de 50m -- MRAD/MRAD (réticule/tourelle) + Incréments de 50 MÈTRES -- MRAD/MRAD (réticule/tourelles) 50 MÉTERES lépések - MRAD/MRAD (célzó/lövegek) Шаг 50 МЕТРОВ - MRAD/MRAD (сетка/маховички) Incrementi per 50 METRI - MRAD/MRAD (reticolo/torrette) @@ -32,6 +33,7 @@ 50 미터 늘리기 -- MRAD/MRAD (조준선/포탑) 50公尺增量 -- 毫弧度/毫弧度 (瞄镜分划线/调整纽) 50公尺增量 -- 毫弧度/毫弧度 (瞄鏡分劃線/調整紐) + 50 METER increments -- MRAD/MRAD (reticle/turrets) Open Range Card @@ -48,6 +50,7 @@ 사거리표 열기 开启弹道射表 開啟彈道射表 + Menzil Kartını Aç Open Range Card Copy @@ -64,6 +67,7 @@ 복제 사거리표 열기 开启弹道射表副本 開啟彈道射表副本 + Menzil Kartının Kopyasını Aç Open Range Card @@ -80,6 +84,7 @@ 사거리표 열기 开启弹道射表 開啟彈道射表 + Menzil Kartını Aç Open Range Card Copy @@ -96,6 +101,7 @@ 복제 사거리표 열기 开启弹道射表副本 開啟彈道射表副本 + Menzil Kartının Kopyasını Aç Copy Range Card @@ -112,6 +118,7 @@ 사거리표 복제 复制弹道射表 複製彈道射表 + Menzil Kartını Kopyala diff --git a/addons/realisticnames/CfgVehicles.hpp b/addons/realisticnames/CfgVehicles.hpp index 9b0ab1b95a3..e0fa6af1deb 100644 --- a/addons/realisticnames/CfgVehicles.hpp +++ b/addons/realisticnames/CfgVehicles.hpp @@ -737,12 +737,11 @@ class CfgVehicles { // APEX/Tanoa // Jeep Wrangler - class Offroad_02_base_F; - class Offroad_02_unarmed_base_F : Offroad_02_base_F {}; - class C_Offroad_02_unarmed_F: Offroad_02_unarmed_base_F { + class Car_F; + class Offroad_02_base_F: Car_F { displayName = CSTRING(C_Offroad_02_unarmed); }; - class I_C_Offroad_02_unarmed_F: Offroad_02_unarmed_base_F { + class Offroad_02_unarmed_base_F: Offroad_02_base_F { displayName = CSTRING(C_Offroad_02_unarmed); }; class Offroad_02_at_base_F: Offroad_02_base_F { diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index af04d903108..e5a9a0785cb 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -616,7 +616,7 @@ class CfgWeapons { displayName = "L94A1"; }; class ACE_LMG_coax_ext_MG3: LMG_coax_ext { - displayName = "H&K MG3"; + displayName = "Rheinmetall MG3"; }; class ACE_LMG_coax_DenelMG4 : LMG_coax { displayName = "Denel MG4"; @@ -699,6 +699,9 @@ class CfgWeapons { class optic_Hamr_khk_F : optic_hamr { displayName = CSTRING(optic_hamr_khk); }; + class ACE_optic_Hamr_2D : optic_Hamr { + displayName = CSTRING(optic_hamr_2d); + }; class optic_Arco : ItemCore { displayName = CSTRING(optic_arco); @@ -709,6 +712,9 @@ class CfgWeapons { class optic_Arco_ghex_F : optic_Arco { displayName = CSTRING(optic_arco_ghex); }; + class ACE_optic_Arco_2D : optic_Arco { + displayName = CSTRING(optic_arco_2d); + }; class optic_ERCO_blk_f : optic_Arco { displayName = CSTRING(optic_erco_blk); @@ -729,6 +735,9 @@ class CfgWeapons { class optic_LRPS_tna_F : optic_LRPS { displayName = CSTRING(optic_lrps_tna); }; + class ACE_optic_LRPS_2D : optic_LRPS { + displayName = CSTRING(optic_lrps_2d); + }; class optic_AMS_base; class optic_AMS: optic_AMS_base { @@ -784,6 +793,9 @@ class CfgWeapons { class optic_MRCO : ItemCore { displayName = CSTRING(optic_MRCO); }; + class ACE_optic_MRCO_2D : optic_MRCO { + displayName = CSTRING(optic_MRCO_2d); + }; class optic_Yorris : ItemCore { displayName = CSTRING(optic_Yorris); @@ -927,4 +939,147 @@ class CfgWeapons { class hgun_Pistol_01_F: Pistol_Base_F { displayName = CSTRING(hgun_Pistol_01); }; + + // AKM + class arifle_AKM_base_F; + class arifle_AKM_F: arifle_AKM_base_F { + displayName = CSTRING(arifle_AKM); + }; + + // AKSU + class arifle_AKS_base_F; + class arifle_AKS_F: arifle_AKS_base_F { + displayName = CSTRING(arifle_AKS); + }; + + // Contact/Livonia + + // FNX-45 (Green) + class hgun_Pistol_heavy_01_green_F: hgun_Pistol_heavy_01_F { + displayName = CSTRING(hgun_Pistol_heavy_01_green_Name); + }; + + // RPG-32 (Green) + class launch_RPG32_green_F: launch_RPG32_F { + displayName = CSTRING(launch_RPG32_green_Name); + }; + + // AK15 variants + class arifle_AK12_base_F; + class arifle_AK12_F: arifle_AK12_base_F { + displayName = CSTRING(arifle_AK12); + }; + class arifle_AK12_lush_F: arifle_AK12_base_F { + displayName = CSTRING(arifle_AK12_lush); + }; + class arifle_AK12_arid_F: arifle_AK12_base_F { + displayName = CSTRING(arifle_AK12_arid); + }; + class arifle_AK12_GL_base_F; + class arifle_AK12_GL_F: arifle_AK12_GL_base_F { + displayName = CSTRING(arifle_AK12_GL); + }; + class arifle_AK12_GL_lush_F: arifle_AK12_GL_base_F { + displayName = CSTRING(arifle_AK12_GL_lush); + }; + class arifle_AK12_GL_arid_F: arifle_AK12_GL_base_F { + displayName = CSTRING(arifle_AK12_GL_arid); + }; + class arifle_AK12U_base_F; + class arifle_AK12U_F: arifle_AK12U_base_F { + displayName = CSTRING(arifle_AK12U); + }; + class arifle_AK12U_lush_F: arifle_AK12U_base_F { + displayName = CSTRING(arifle_AK12U_lush); + }; + class arifle_AK12U_arid_F: arifle_AK12U_base_F { + displayName = CSTRING(arifle_AK12U_arid); + }; + class arifle_RPK12_base_F; + class arifle_RPK12_F: arifle_RPK12_base_F { + displayName = CSTRING(arifle_RPK12); + }; + class arifle_RPK12_lush_F: arifle_RPK12_base_F { + displayName = CSTRING(arifle_RPK12_lush); + }; + class arifle_RPK12_arid_F: arifle_RPK12_base_F { + displayName = CSTRING(arifle_RPK12_arid); + }; + + // M14 (Classic) + class DMR_06_hunter_base_F; + class srifle_DMR_06_hunter_F: DMR_06_hunter_base_F { + displayName = CSTRING(srifle_DMR_06_hunter); + }; + + // Stoner 99 LMG (Black) + class LMG_Mk200_black_F: LMG_Mk200_F { + displayName = CSTRING(LMG_Mk200_black); + }; + + // MSBS Grot variants + class arifle_MSBS65_base_F; + class arifle_MSBS65_F: arifle_MSBS65_base_F { + displayName = CSTRING(arifle_MSBS65); + }; + class arifle_MSBS65_base_black_F; + class arifle_MSBS65_black_F: arifle_MSBS65_base_black_F { + displayName = CSTRING(arifle_MSBS65_black); + }; + class arifle_MSBS65_base_camo_F; + class arifle_MSBS65_camo_F: arifle_MSBS65_base_camo_F { + displayName = CSTRING(arifle_MSBS65_camo); + }; + class arifle_MSBS65_base_sand_F; + class arifle_MSBS65_sand_F: arifle_MSBS65_base_sand_F { + displayName = CSTRING(arifle_MSBS65_sand); + }; + class arifle_MSBS65_GL_base_F; + class arifle_MSBS65_GL_F: arifle_MSBS65_GL_base_F { + displayName = CSTRING(arifle_MSBS65_GL); + }; + class arifle_MSBS65_GL_base_black_F; + class arifle_MSBS65_GL_black_F: arifle_MSBS65_GL_base_black_F { + displayName = CSTRING(arifle_MSBS65_GL_black); + }; + class arifle_MSBS65_GL_base_camo_F; + class arifle_MSBS65_GL_camo_F: arifle_MSBS65_GL_base_camo_F { + displayName = CSTRING(arifle_MSBS65_GL_camo); + }; + class arifle_MSBS65_GL_base_sand_F; + class arifle_MSBS65_GL_sand_F: arifle_MSBS65_GL_base_sand_F { + displayName = CSTRING(arifle_MSBS65_GL_sand); + }; + class arifle_MSBS65_Mark_base_F; + class arifle_MSBS65_Mark_F: arifle_MSBS65_Mark_base_F { + displayName = CSTRING(arifle_MSBS65_Mark); + }; + class arifle_MSBS65_Mark_base_black_F; + class arifle_MSBS65_Mark_black_F: arifle_MSBS65_Mark_base_black_F { + displayName = CSTRING(arifle_MSBS65_Mark_black); + }; + class arifle_MSBS65_Mark_base_camo_F; + class arifle_MSBS65_Mark_camo_F: arifle_MSBS65_Mark_base_camo_F { + displayName = CSTRING(arifle_MSBS65_Mark_camo); + }; + class arifle_MSBS65_Mark_base_sand_F; + class arifle_MSBS65_Mark_sand_F: arifle_MSBS65_Mark_base_sand_F { + displayName = CSTRING(arifle_MSBS65_Mark_sand); + }; + class arifle_MSBS65_UBS_base_F; + class arifle_MSBS65_UBS_F: arifle_MSBS65_UBS_base_F { + displayName = CSTRING(arifle_MSBS65_UBS); + }; + class arifle_MSBS65_UBS_base_black_F; + class arifle_MSBS65_UBS_black_F: arifle_MSBS65_UBS_base_black_F { + displayName = CSTRING(arifle_MSBS65_UBS_black); + }; + class arifle_MSBS65_UBS_base_camo_F; + class arifle_MSBS65_UBS_camo_F: arifle_MSBS65_UBS_base_camo_F { + displayName = CSTRING(arifle_MSBS65_UBS_camo); + }; + class arifle_MSBS65_UBS_base_sand_F; + class arifle_MSBS65_UBS_sand_F: arifle_MSBS65_UBS_base_sand_F { + displayName = CSTRING(arifle_MSBS65_UBS_sand); + }; }; diff --git a/addons/realisticnames/config.cpp b/addons/realisticnames/config.cpp index c97c9a82e02..e8f4afae467 100644 --- a/addons/realisticnames/config.cpp +++ b/addons/realisticnames/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; + requiredAddons[] = {"ace_common", "ace_optics"}; author = ECSTRING(common,ACETeam); authors[] = {"KoffeinFlummi","TaoSensai","commy2"}; url = ECSTRING(main,URL); diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 84c429fa32a..a7b10daa841 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -11,11 +11,12 @@ XM312 XM312 XM312 - XM312A + XM312 XM312 XM312 XM312重機槍 XM312重机枪 + XM312 XM312A @@ -32,12 +33,13 @@ XM312A XM312A重機槍 XM312A重机枪 + XM312A XM312 (High) XM312 (Hoch) XM312 (Alto) - XM312 (Haut) + XM312 (Haute) XM312 (Vysoká montáž) XM312 (Wysoki) XM312 (Высокий) @@ -48,6 +50,7 @@ XM312 (높음) XM312重機槍 (高射腳架) XM312重机枪 (高射脚架) + XM312 (Yüksek) XM307 @@ -64,6 +67,7 @@ XM307 XM307榴彈機槍 XM307榴弹机枪 + XM307 XM307A @@ -80,12 +84,13 @@ XM307A XM307A榴彈機槍 XM307A榴弹机枪 + XM307A XM307 (High) XM307 (Hoch) XM307 (Alto) - XM307 (Haut) + XM307 (Haute) XM307 (Vysoká montáž) XM307 (Wysoki) XM307 (Высокий) @@ -96,6 +101,7 @@ XM307 (높음) XM307榴彈機槍 (高射腳架) XM307榴弹机枪 (高射脚架) + XM307 (Yüksek) Mini-Spike Launcher (AT) @@ -112,6 +118,7 @@ Mini-Spike Launcher (대전차) "迷你長釘"導彈發射器 (反坦克) "迷你长钉"导弹发射器 (反坦克) + Mini-Spike Launcher (AT) Mini-Spike Launcher (AA) @@ -120,7 +127,7 @@ Poste de tir Mini-Spike (AA) Mini-Spike Odpalovač (AA) Wyrzutnia Mini-Spike (AA) - Mini-Spike Пусковое устройство (ВВ) + Mini-Spike Пусковое устройство (ПВО) Lança-mísseis Mini-Spike (AA) Mini-Spike rakétarendszer (Repülő-elhárító) Lanciatore Mini-Spike (AA) @@ -128,6 +135,7 @@ Mini-Spike Launcher (대공) "迷你長釘"導彈發射器 (防空) "迷你长钉"导弹发射器 (防空) + Mini-Spike Launcher (AA) YABHON-R3 @@ -144,6 +152,7 @@ YABHON-R3 "亞伯罕-R3型"空中無人載具 "亚伯罕-R3型"空中无人载具 + YABHON-R3 YABHON-R3 (CAS) @@ -156,10 +165,11 @@ YABHON-R3 (Légitámogató) YABHON-R3 (CAS) YABHON-R3 (CAS) - YABHON-R3 (対地) + YABHON-R3 (CAS) YABHON-R3 (근접지원) "亞伯罕-R3型"空中無人載具 (近空支援) "亚伯罕-R3型"空中无人载具 (近空支援) + YABHON-R3 (CAS) M-ATV @@ -176,6 +186,7 @@ M-ATV 防地雷反伏擊全地形車 防地雷反伏击全地形车 + M-ATV M-ATV (HMG) @@ -192,6 +203,7 @@ M-ATV (HMG) 防地雷反伏擊全地形車 (重機槍) 防地雷反伏击全地形车 (重机枪) + M-ATV (HMG) M-ATV (GMG) @@ -208,6 +220,7 @@ M-ATV (GMG) 防地雷反伏擊全地形車 (榴彈機槍) 防地雷反伏击全地形车 (榴弹机枪) + M-ATV (GMG) Merkava Mk IV M @@ -224,6 +237,7 @@ Merkava Mk IV M "梅卡瓦4代"主戰坦克 "梅卡瓦4代"主战坦克 + Merkava Mk IV M Merkava Mk IV LIC @@ -240,6 +254,7 @@ Merkava Mk IV LIC "梅卡瓦4代"主戰坦克 城市版 "梅卡瓦4代"主战坦克 城市版 + Merkava Mk IV LIC Sholef @@ -256,6 +271,7 @@ Sholef "神槍"自走炮 "神枪"自走炮 + Sholef Seara @@ -272,6 +288,7 @@ Seara "希拉"多管火箭車 "希拉"多管火箭车 + Seara Namer @@ -288,6 +305,7 @@ Namer "花豹"裝甲運兵車 "花豹"装甲运兵车 + Namer Bardelas @@ -304,6 +322,7 @@ Bardelas "布萊德斯"防空車 "布莱德斯"防空车 + Bardelas Badger IFV @@ -320,6 +339,7 @@ Badger IFV "蜜獾"步兵戰車 "蜜獾"步兵战车 + Badger IFV Nemmera @@ -336,6 +356,7 @@ Nemmera "雌豹"戰鬥工程車 "雌豹"战斗工程车 + Nemmera HEMTT Transport @@ -352,6 +373,7 @@ HEMTT 수송 重型增程機動戰術卡車 (運輸) 重型增程机动战术卡车 (运输) + HEMTT Nakil HEMTT Transport (covered) @@ -368,6 +390,7 @@ HEMTT 수송 (덮개) 重型增程機動戰術卡車 (運輸, 棚布) 重型增程机动战术卡车 (运输, 棚布) + HEMTT Nakil (Kapalı) HEMTT @@ -384,6 +407,7 @@ HEMTT 重型增程機動戰術卡車 重型增程机动战术卡车 + HEMTT HEMTT Container @@ -400,6 +424,7 @@ HEMTT 컨테이너 重型增程機動戰術卡車 (貨櫃) 重型增程机动战术卡车 (货柜) + HEMTT Konteynır HEMTT Medical @@ -416,6 +441,7 @@ HEMTT 의료 重型增程機動戰術卡車 (醫療) 重型增程机动战术卡车 (医疗) + HEMTT Medikal HEMTT Ammo @@ -432,6 +458,7 @@ HEMTT 탄약 重型增程機動戰術卡車 (彈藥) 重型增程机动战术卡车 (弹药) + HEMTT Cephane HEMTT Fuel @@ -448,6 +475,7 @@ HEMTT 연료 重型增程機動戰術卡車 (燃油) 重型增程机动战术卡车 (燃油) + HEMTT Yakıt HEMTT Repair @@ -464,6 +492,7 @@ HEMTT 수리 重型增程機動戰術卡車 (維修) 重型增程机动战术卡车 (维修) + HEMTT Tamir Fennek @@ -480,6 +509,7 @@ Fennek "非洲小狐"防地雷反伏擊車 "非洲小狐"防地雷反伏击车 + Fennek Fennek (HMG) @@ -496,6 +526,7 @@ Fennek (HMG) "非洲小狐"防地雷反伏擊車 (重機槍) "非洲小狐"防地雷反伏击车 (重机枪) + Fennek (HMG) Fennek (GMG) @@ -512,6 +543,7 @@ Fennek (GMG) "非洲小狐"防地雷反伏擊車 (榴彈機槍) "非洲小狐"防地雷反伏击车 (榴弹机枪) + Fennek (GMG) Leopard 2SG @@ -528,6 +560,7 @@ Leopard 2SG "豹2型新加坡版"主戰坦克 "豹2型新加坡版"主战坦克 + Leopard 2SG FV510 Warrior @@ -544,6 +577,7 @@ FV510 Warrior FV510"戰士"步兵戰車 FV510"战士"步兵战车 + FV510 Warrior Pandur II @@ -560,6 +594,7 @@ Pandur II "潘德2型"裝甲運兵車 "潘德2型"装甲运兵车 + Pandur II KamAZ Transport @@ -576,6 +611,7 @@ KamAZ 수송 "卡瑪斯"卡車 (運輸) "卡玛斯"卡车 (运输) + KamAZ Nakil KamAZ Transport (covered) @@ -592,6 +628,7 @@ KamAZ 수송 (덮개) "卡瑪斯"卡車 (運輸, 棚布) "卡玛斯"卡车 (运输, 棚布) + KamAZ Nakil (Kapalı) KamAZ Ammo @@ -608,6 +645,7 @@ KamAZ 탄약 "卡瑪斯"卡車 (彈藥) "卡玛斯"卡车 (弹药) + KamAZ Cephane KamAZ Fuel @@ -624,6 +662,7 @@ KamAZ 연료 "卡瑪斯"卡車 (燃油) "卡玛斯"卡车 (燃油) + KamAZ Yakıt KamAZ Repair @@ -640,6 +679,7 @@ KamAZ 수리 "卡瑪斯"卡車 (維修) "卡玛斯"卡车 (维修) + KamAZ Tamir KamAZ Medical @@ -656,6 +696,7 @@ KamAZ 의료 "卡瑪斯"卡車 (醫療) "卡玛斯"卡车 (医疗) + KamAZ Medikal KamAZ MRL @@ -665,6 +706,12 @@ KamAZ MRL KamAZ MRL KamAZ MRL + КамАЗ РСЗО + KamAZ MRL + KamAZ LRM + KamAZ MRL (raketové dělostřelectvo) + KamAZ MRL + KamAZ Karatel @@ -681,6 +728,7 @@ Karatel "懲罰者"防地雷反伏擊車 "惩罚者"防地雷反伏击车 + Karatel Karatel (HMG) @@ -697,6 +745,7 @@ Karatel (HMG) "懲罰者"防地雷反伏擊車 (重機槍) "惩罚者"防地雷反伏击车 (重机枪) + Karatel (HMG) Karatel (GMG) @@ -713,6 +762,7 @@ Karatel (GMG) "懲罰者"防地雷反伏擊車 (榴彈機槍) "惩罚者"防地雷反伏击车 (榴弹机枪) + Karatel (GMG) T100 Black Eagle @@ -729,6 +779,7 @@ T100 Black Eagle T100"黑鷹"主戰坦克 T100"黑鹰"主战坦克 + T100 Black Eagle 2S9 Sochor @@ -745,6 +796,7 @@ 2S9 Sochor 2S9"薩克爾"自走砲 2S9"萨克尔"自走炮 + 2S9 Sochor BM-2T Stalker @@ -761,6 +813,7 @@ BM-2T Stalker BM-2T"潛行者"步兵戰車 BM-2T"潜行者"步兵战车 + BM-2T Stalker ZSU-35 Tigris @@ -777,6 +830,7 @@ ZSU-35 Tigris ZSU-35"虎式"防空車 ZSU-35"虎式"防空车 + ZSU-35 Tigris Otokar ARMA @@ -793,6 +847,7 @@ Otokar ARMA "奧托卡-阿爾默"裝甲運兵車 "奥托卡-阿尔默"装甲运兵车 + Otokar ARMA Typhoon Transport @@ -809,6 +864,7 @@ Typhoon 수송 "颱風"卡車 (運輸) "台风"卡车 (运输) + Typhoon Nakil Typhoon Transport (covered) @@ -825,6 +881,7 @@ Typhoon 수송 (덮개) "颱風"卡車 (運輸, 棚布) "台风"卡车 (运输, 棚布) + Typhoon Nakil (Kapalı) Typhoon Device @@ -841,6 +898,7 @@ Typhoon 장치 "颱風"卡車 (精密設備) "台风"卡车 (精密设备) + Typhoon Cihaz Typhoon Ammo @@ -857,6 +915,7 @@ Typhoon 탄약 "颱風"卡車 (彈藥) "台风"卡车 (弹药) + Typhoon Cephane Typhoon Fuel @@ -873,6 +932,7 @@ Typhoon 연료 "颱風"卡車 (燃油) "台风"卡车 (燃油) + Typhoon Yakıt Typhoon Repair @@ -889,6 +949,7 @@ Typhoon 수리 "颱風"卡車 (維修) "台风"卡车 (维修) + Typhoon Tamir Typhoon Medical @@ -905,6 +966,7 @@ Typhoon 의료 "颱風"卡車 (醫療) "台风"卡车 (医疗) + Typhoon Medikal RAH-66 Comanche @@ -912,7 +974,7 @@ RAH-66 Comanche RAH-66 Comanche RAH-66 Comanche - RAH-66 Commanche + RAH-66 Comanche RAH-66 Команч RAH-66 Comanche RAH-66 Comanche @@ -921,6 +983,7 @@ RAH-66 Comanche RAH-66"卡曼契"攻擊直升機 RAH-66"卡曼契"攻击直升机 + RAH-66 Comanche MH-6 Little Bird @@ -937,6 +1000,7 @@ MH-6 Little Bird MH-6"小鳥"運輸直升機 MH-6"小鸟"运输直升机 + MH-6 Little Bird AH-6 Little Bird @@ -953,6 +1017,7 @@ AH-6 Little Bird AH-6"小鳥"武裝直升機 AH-6"小鸟"武装直升机 + AH-6 Little Bird CH-47I Chinook @@ -969,6 +1034,7 @@ CH-47I Chinook CH-47I"契努克"運輸直升機 CH-47I"契努克"运输直升机 + CH-47I Chinook CH-47I Chinook (unarmed) @@ -985,6 +1051,7 @@ CH-47I Chinook (비무장) CH-47I"契努克"運輸直升機 (無武裝) CH-47I"契努克"运输直升机 (无武装) + CH-47I Chinook (silahsız) A-10D Thunderbolt II @@ -1001,6 +1068,7 @@ A-10D Thunderbolt II A-10D"雷霆二式"攻擊機 A-10D"雷霆二式"攻击机 + A-10D Thunderbolt II AW159 Wildcat @@ -1017,6 +1085,7 @@ AW159 Wildcat AW159"野貓"直升機 AW159"野猫"直升机 + AW159 Wildcat AW159 Wildcat (unarmed) @@ -1033,6 +1102,7 @@ AW159 Wildcat (비무장) AW159"野貓"直升機 (無武裝) AW159"野猫"直升机 (无武装) + AW159 Wildcat (silahsız) AW101 Merlin @@ -1049,6 +1119,7 @@ AW101 Merlin AW101"灰背隼"運輸直升機 AW101"灰背隼"运输直升机 + AW101 Merlin L-159 ALCA @@ -1061,10 +1132,11 @@ L-159 ALCA L-159 ALCA L-159 ALCA - L-159 アルカ + L-159 ALCA L-159 ALCA L-159先進輕型戰鬥機 L-159先进轻型战斗机 + L-159 ALCA L-159 ALCA (CAS) @@ -1077,10 +1149,11 @@ L-159 ALCA (CAS) L-159 ALCA (Légitámogató) L-159 ALCA (CAS) - L-159 アルカ (対地) + L-159 ALCA (CAS) L-159 ALCA (근접지원) L-159先進輕型戰鬥機 (近空支援) L-159先进轻型战斗机 (近空支援) + L-159 ALCA (CAS) L-159 ALCA (AA) @@ -1093,10 +1166,11 @@ L-159 ALCA (ВВ) L-159 ALCA (Repülő-elhárító) L-159 ALCA (AA) - L-159 アルカ (対空) + L-159 ALCA (対空) L-159 ALCA (대공) L-159先進輕型戰鬥機 (空對空) L-159先进轻型战斗机 (空对空) + L-159 ALCA (AA) JAS 39 Gripen @@ -1112,6 +1186,7 @@ JAS 39 그리펜 JAS 39 獅鷲戰鬥機 JAS 39 狮鹫战斗机 + JAS 39 Gripen Ka-60 Kasatka @@ -1128,6 +1203,7 @@ Ka-60 Kasatka Ka-60"逆戟鯨"直升機 Ka-60"逆戟鲸"直升机 + Ka-60 Kasatka Ka-60 Kasatka (Black & White) @@ -1143,6 +1219,7 @@ Ka-60 Kasatka (검정 및 하양) Ka-60"逆戟鯨"直升機 (黑&白) Ka-60"逆戟鲸"直升机 (黑&白) + Ka-60 Kasatka (Siyah & Beyaz) Ka-60 Kasatka (unarmed) @@ -1159,6 +1236,7 @@ Ka-60 Kasatka (비무장) Ka-60"逆戟鯨"直升機 (無武裝) Ka-60"逆戟鲸"直升机 (无武装) + Ka-60 Kasatka (Silahsız) Yak-130 @@ -1175,6 +1253,7 @@ Yak-130 Yak-130"手套"攻擊機 Yak-130"手套"攻击机 + Yak-130 MD 500 @@ -1191,6 +1270,7 @@ MD 500 MD 500"防衛者"直升機 MD 500"防卫者"直升机 + MD 500 M4A1 SLAM @@ -1207,6 +1287,7 @@ M4A1 SLAM M4A1指向性反裝甲地雷 M4A1指向性反装甲地雷 + M4A1 SLAM M18A1 Claymore @@ -1223,6 +1304,7 @@ M18A1 클레이모어 M18A1"闊刀"地雷 M18A1"阔刀"地雷 + M18A1 Claymore M183 Demolition Charge Assembly @@ -1239,6 +1321,7 @@ M183 폭파 장약 조립 M183炸藥包 M183炸药包 + M183 Demolition Charge Assembly M112 Demolition Block @@ -1255,6 +1338,7 @@ M112 폭파 블럭 M112塑性炸藥 M112塑性炸药 + M112 Demolition Block M67 Fragmentation Grenade @@ -1271,6 +1355,7 @@ M67 세열 수류탄 M67破片手榴彈 M67破片手榴弹 + M67 El Bombası V40 Mini-Grenade @@ -1278,6 +1363,13 @@ Mini Granata V40 V40 小型手榴弾 Mini-granat V40 + V40 Мини-граната + Mini Granada V40 + V40 Mini-Grenade + V40迷你手榴彈 + V40 Mini-Granát + Mini Granada V40 + V40 Mini-El Bombası M83 Smoke Grenade (White) @@ -1290,10 +1382,11 @@ M83 Granada de fumaça (Branca) M83 füstgránát (Fehér) M83 Granata fumogena (Bianco) - M18 煙幕手榴弾 (白) + M18 発煙手榴弾 (白) M83 연막탄 (하양) M83煙霧彈 (白色) M83烟雾弹 (白色) + M83 Sis Bombası (Beyaz) M18 Smoke Grenade (Blue) @@ -1306,10 +1399,11 @@ M18 Granada de fumaça (Azul) M18 füstgránát (Kék) M18 Granata fumogena (Blu) - M18 煙幕手榴弾 (青) + M18 発煙手榴弾 (青) M18 연막탄 (파랑) M18煙霧彈 (藍色) M18烟雾弹 (蓝色) + M83 Sis Bombası (Mavi) M18 Smoke Grenade (Green) @@ -1326,6 +1420,7 @@ M18 연막탄 (초록) M18煙霧彈 (綠色) M18烟雾弹 (绿色) + M83 Sis Bombası (Yeşil) M18 Smoke Grenade (Orange) @@ -1338,10 +1433,11 @@ M18 Granada de fumaça (Laranja) M18 füstgránát (Narancssárga) M18 Granata fumogena (Arancione) - M18 煙幕手榴弾 (橙) + M18 発煙手榴弾 (橙) M18 연막탄 (주황) M18煙霧彈 (橘色) M18烟雾弹 (橘色) + M83 Sis Bombası (Turuncu) M18 Smoke Grenade (Purple) @@ -1354,10 +1450,11 @@ M18 Granada de fumaça (Roxa) M18 füstgránát (Lila) M18 Granata fumogena (Viola) - M18 煙幕手榴弾 (紫) + M18 発煙手榴弾 (紫) M18 연막탄 (보라) M18煙霧彈 (紫色) M18烟雾弹 (紫色) + M83 Sis Bombası (Mor) M18 Smoke Grenade (Red) @@ -1374,6 +1471,7 @@ M18 연막탄 (빨강) M18煙霧彈 (紅色) M18烟雾弹 (红色) + M83 Sis Bombası (Kırmızı) M18 Smoke Grenade (Yellow) @@ -1386,10 +1484,11 @@ M18 Granada de fumaça (Amarela) M18 füstgránát (Sárga) M18 Granata fumogena (Giallo) - M18 煙幕手榴弾 (黄) + M18 発煙手榴弾 (黄) M18 연막탄 (노랑) M18煙霧彈 (黃色) M18烟雾弹 (黄色) + M83 Sis Bombası (Sarı) M15 Anti-Tank Mine @@ -1406,6 +1505,7 @@ M15 대전차지뢰 M15反坦克地雷 M15反坦克地雷 + M15 Anti-Tank Mayını VS-50 Anti-Personnel Mine @@ -1422,6 +1522,7 @@ VS-50 대인지뢰 VS-50反人員地雷 VS-50反人员地雷 + VS-50 Anti-Personel Mayını M26 Anti-Personnel Bounding Mine @@ -1429,7 +1530,7 @@ Mina antipersona M26 Mina przeciwpiechotna M26 M26 Protipěchotní mina - M26 Mine AP bondissante + M26 Mine AP bondissante M26 Противопехотная мина M26 Mina saltadora antipessoal M26 gyalogsági ugróakna @@ -1438,6 +1539,7 @@ M26 대인도약지뢰 M26反人員彈跳雷 M26反人员弹跳雷 + M26 Anti Personel Mayını PMR-3 Anti-Personnel Tripwire Mine @@ -1454,6 +1556,7 @@ PMR-3 대인인계철선지뢰 PMR-3反人員絆線雷 PMR-3反人员绊线雷 + PMR-3 Telli Anti Personel Mayını P99 @@ -1470,6 +1573,7 @@ P99 P99手槍 P99手枪 + P99 MP-443 Grach @@ -1486,6 +1590,7 @@ MP-443 Grach MP-443"烏鴉"手槍 MP-443"乌鸦"手枪 + MP-443 Grach Custom Covert II @@ -1502,6 +1607,7 @@ Custom Covert II 特裝隱蔽Ⅱ型手槍 特装隐蔽Ⅱ型手枪 + Custom Covert II FNX-45 Tactical @@ -1514,11 +1620,29 @@ FNX-45 Tactical FNX-45 Tactical FNX-45 Tactical + FNX-45 Tactical FNX-45 タクティカル FNX-45 Tactical FNX-45戰術型手槍 FNX-45战术型手枪 + + FNX-45 Tactical (Green) + FNX-45 Tactical (Grün) + FNX-45 Tactical (Zelený) + FNX-45 Tactical (Zielony) + FNX-45 Tactical (Vert) + FNX-45 Tactical (Zöld) + FNX-45 Tactical (Verde) + FNX-45 Tactical (Зелёный) + FNX-45 Tactical (Verde) + FNX-45 Tactical (Verde) + FNX-45 Tactical (Yeşil) + FNX-45 タクティカル (緑) + FNX-45 Tactical (초록) + FNX-45戰術型手槍 (綠色) + FNX-45战术型手枪 (绿色) + Chiappa Rhino 60DS Chiappa Rhino 60DS @@ -1534,6 +1658,7 @@ Chiappa Rhino 60DS 齊亞帕"犀牛"60DS左輪手槍 齐亚帕"犀牛"60DS左轮手枪 + Chiappa Rhino 60DS Taurus Judge @@ -1550,6 +1675,7 @@ Taurus Judge 金牛座"法官"信號槍 金牛座"法官"信号枪 + Taurus Judge NLAW @@ -1566,6 +1692,7 @@ NLAW 次世代輕型反坦克導彈發射器 次世代轻型反坦克导弹发射器 + NLAW RPG-32 @@ -1578,11 +1705,29 @@ РПГ-32 RPG-32 RPG-32 + RPG-32 RPG-32 RPG-32 RPG-32"哈希姆"火箭發射器 RPG-32"哈希姆"火箭发射器 + + RPG-32 (Green) + RPG-32 (Grün) + RPG-32 (Zelený) + RPG-32 (Zielony) + RPG-32 (Vert) + RPG-32 (Zöld) + RPG-32 (Verde) + РПГ-32 (Зелёный) + RPG-32 (Verde) + RPG-32 (Verde) + RPG-32 (Yeşil) + RPG-32 (緑) + RPG-32 (초록) + RPG-32"哈希姆"火箭發射器 (綠色) + RPG-32"哈希姆"火箭发射器 (绿色) + Mini-Spike (AA) Mini-Spike (FlaRak) @@ -1591,13 +1736,14 @@ Mini-Spike (AA) Mini-Spike (Repülő-elhárító) Mini-Spike (AA) - Mini-Spike (AA) + Mini-Spike (ПВО) Mini-Spike (AA) Mini-Spike (AA) ミニスパイク (対空) Mini-Spike (대공) "迷你長釘"導彈發射器 (防空) "迷你长钉"导弹发射器 (防空) + Mini-Spike (AA) Mini-Spike (AT) @@ -1607,13 +1753,14 @@ Mini-Spike (AC) Mini-Spike (Tankelhárító) Mini-Spike (AT) - Mini-Spike (AT) + Mini-Spike (ПТ) Mini-Spike (AT) Mini-Spike (AT) ミニスパイク (対地) Mini-Spike (대전차) "迷你長釘"導彈發射器 (反坦克) "迷你长钉"导弹发射器 (反坦克) + Mini-Spike (AT) Metis-M @@ -1625,28 +1772,39 @@ Metis-M メチス-M Metis-M + Metis-M + Metis-M + Metis-M Metis-M (Brown) Metis-M (Braun) Metis-M (Brun) - Метис-М (Кори́чневый) + Метис-М (Коричневый) "麥士蒂索人"-M型反坦克導彈(棕色) "麦士蒂索人"-M型反坦克导弹(棕色) Metis-M (Marrone) メチス-M (茶) Metis-M (Brązowy) + Metis-M (Marrom) + Metis-M (hnědý) + Metis-M (Marrón) + Metis-M (Kahverengi) Metis-M (Green) Metis-M (Grün) - Metis-M (Verde) + Metis-M (Vert) Метис-М (Зелёный) "麥士蒂索人"-M型反坦克導彈(綠色) "麦士蒂索人"-M型反坦克导弹(绿色) Metis-M (Verde) メチス-M (緑) Metis-M (Zielony) + Metis-M (Verde) + Metis-M (zelený) + Metis-M (Verde) + Metis-M (Yeşil) MX @@ -1663,6 +1821,7 @@ MX MX突擊步槍 MX突击步枪 + MX MX (Black) @@ -1679,6 +1838,7 @@ MX (검정) MX突擊步槍 (黑色) MX突击步枪 (黑色) + MX (Siyah) MXC @@ -1695,6 +1855,7 @@ MXC MXC卡賓步槍 MXC卡宾步枪 + MXC MXC (Black) @@ -1711,6 +1872,7 @@ MXC (검정) MXC卡賓步槍 (黑色) MXC卡宾步枪 (黑色) + MXC (Siyah) MX 3GL @@ -1727,6 +1889,7 @@ MX 3GL MX突擊步槍 (3連裝榴彈) MX突击步枪 (3连装榴弹) + MX 3GL MX 3GL (Black) @@ -1743,6 +1906,7 @@ MX 3GL (검정) MX突擊步槍 (3連裝榴彈-黑色) MX突击步枪 (3连装榴弹-黑色) + MX 3GL (Siyah) MX LSW @@ -1759,6 +1923,7 @@ MX LSW MX輕型機槍 MX轻型机枪 + MX LSW MX LSW (Black) @@ -1775,6 +1940,7 @@ MX LSW (검정) MX輕型機槍 (黑色) MX轻型机枪 (黑色) + MX LSW (Siyah) MXM @@ -1791,6 +1957,7 @@ MXM MXM精準步槍 MXM精准步枪 + MXM MXM (Black) @@ -1803,10 +1970,11 @@ MXM (Чёрный) MXM (Preto) MXM (Nero) - MXM (黒) + MXM (ブラック) MXM (검정) MXM精準步槍 (黑色) MXM精准步枪 (黑色) + MXM (Siyah) KH2002 Sama @@ -1823,6 +1991,7 @@ KH2002 Sama KH2002"海白爾"突擊步槍 KH2002"海白尔"突击步枪 + KH2002 Sama KH2002C Sama @@ -1839,6 +2008,7 @@ KH2002C Sama KH2002C"海白爾"卡賓步槍 KH2002C"海白尔"卡宾步枪 + KH2002C Sama KH2002 Sama KGL @@ -1855,6 +2025,7 @@ KH2002 Sama KGL KH2002"海白爾"突擊步槍 (榴彈) KH2002"海白尔"突击步枪 (榴弹) + KH2002 Sama KGL F2000 (Camo) @@ -1867,10 +2038,11 @@ F2000 (Камо) F2000 (Camo) F2000 (Camo) - F2000 (迷彩) + F2000 (カモフラージュ) F2000 (위장) F2000突擊步槍 (迷彩) F2000突击步枪 (迷彩) + F2000 (Kamuflaj) F2000 @@ -1887,6 +2059,7 @@ F2000 F2000突擊步槍 F2000突击步枪 + F2000 F2000 Tactical (Camo) @@ -1903,6 +2076,7 @@ F2000 Tactical (위장) F2000戰術型突擊步槍 (迷彩) F2000战术型突击步枪 (迷彩) + F2000 Tactical (Kamuflaj) F2000 Tactical @@ -1919,6 +2093,7 @@ F2000 Tactical F2000戰術型突擊步槍 F2000战术型突击步枪 + F2000 Tactical F2000 EGLM (Camo) @@ -1931,10 +2106,11 @@ F2000 EGLM (Камо) F2000 EGLM (Camo) F2000 EGLM (Camo) - F2000 EGLM (迷彩) + F2000 EGLM (カモフラージュ) F2000 EGLM (위장) F2000突擊步槍 (榴彈-迷彩) F2000突击步枪 (榴弹-迷彩) + F2000 EGLM (Kamuflaj) F2000 EGLM @@ -1951,6 +2127,7 @@ F2000 EGLM F2000突擊步槍 (榴彈) F2000突击步枪 (榴弹) + F2000 EGLM TAR-21 @@ -1967,6 +2144,7 @@ TAR-21 TAR-21突擊步槍 TAR-21突击步枪 + TAR-21 CTAR-21 @@ -1983,6 +2161,7 @@ CTAR-21 CTAR-21卡賓步槍 CTAR-21卡宾步枪 + CTAR-21 GTAR-21 EGLM @@ -1999,6 +2178,7 @@ GTAR-21 EGLM GTAR-21突擊步槍 (榴彈) GTAR-21突击步枪 (榴弹) + GTAR-21 EGLM Vector SMG @@ -2015,6 +2195,7 @@ Vector SMG "維克特"衝鋒槍 "维克特"冲锋枪 + Vector SMG Scorpion Evo 3 A1 @@ -2031,6 +2212,7 @@ Scorpion Evo 3 A1 "蠍式"Evo 3 A1衝鋒槍 "蝎式"Evo 3 A1冲锋枪 + Scorpion Evo 3 A1 CPW @@ -2047,6 +2229,7 @@ CPW 緊湊型個人衝鋒槍 紧凑型个人冲锋枪 + CPW RFB SDAR @@ -2063,6 +2246,7 @@ RFB SDAR 犢牛式水陸兩用步槍 犊牛式水陆两用步枪 + RFB SDAR Stoner 99 LMG @@ -2079,6 +2263,7 @@ Stoner 99 LMG 斯通納99輕機槍 斯通纳99轻机枪 + Stoner 99 LMG Negev NG7 @@ -2095,13 +2280,14 @@ Negev NG7 內蓋夫NG7機槍 内盖夫NG7机枪 + Negev NG7 Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR - Mk 14 Mod 1 EBR + Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR @@ -2111,6 +2297,7 @@ Mk14 Mod 1 EBR Mk14一型增強型戰鬥步槍 Mk14一型增强型战斗步枪 + Mk14 Mod 1 EBR GM6 Lynx @@ -2127,6 +2314,7 @@ GM6 Lynx GM6"天貓"反器材狙擊步槍 GM6"天猫"反器材狙击步枪 + GM6 Lynx GM6 Lynx (Camo) @@ -2139,10 +2327,11 @@ GM6 Lynx (Камо) GM6 Lynx (Camo) GM6 Lynx (Camo) - GM6 リンクス (迷彩) + GM6 リンクス (カモフラージュ) GM6 Lynx (위장) GM6"天貓"反器材狙擊步槍 (迷彩) GM6"天猫"反器材狙击步枪 (迷彩) + GM6 Lynx (Kamufulaj) M200 Intervention @@ -2159,6 +2348,7 @@ M200 Intervention M200干預型狙擊步槍 M200干预型狙击步枪 + M200 Intervention M200 Intervention (Camo) @@ -2171,10 +2361,11 @@ M200 Intervention (Камо) M200 Intervention (Camo) M200 Intervention (Camo) - M200 インターベンション (迷彩) + M200 インターベンション (カモフラージュ) M200 Intervention (위장) M200干預型狙擊步槍 (迷彩) M200干预型狙击步枪 (迷彩) + M200 Intervention (kamuflaj) VS-121 @@ -2191,6 +2382,7 @@ VS-121 VS-121狙擊步槍 VS-121狙击步枪 + VS-121 Noreen "Bad News" ULR @@ -2207,6 +2399,7 @@ Noreen "Bad News" ULR 諾琳"壞消息"極距狙擊步槍 诺琳"坏消息"极距狙击步枪 + Noreen "Bad News" ULR Noreen "Bad News" ULR (Black) @@ -2219,10 +2412,11 @@ Noreen "Bad News" ULR (Nero) Noreen "Bad News"ULR (Fekete) Noreen "Bad News" ULR (Preto) - ノレーン "バッド ニュース" ULR (黒) + ノレーン "バッド ニュース" ULR (ブラック) Noreen "Bad News" ULR (검정) 諾琳"壞消息"極距狙擊步槍 (黑色) 诺琳"坏消息"极距狙击步枪 (黑色) + Noreen "Bad News" ULR (Siyah) Noreen "Bad News" ULR (Camo) @@ -2235,10 +2429,11 @@ Noreen "Bad News" ULR (Camo) Noreen "Bad News"ULR (Terepmintás) Noreen "Bad News" ULR (Camuflagem) - ノレーン "バッド ニュース" ULR (迷彩) + ノレーン "バッド ニュース" ULR (カモフラージュ) Noreen "Bad News" ULR (위장) 諾琳"壞消息"極距狙擊步槍 (迷彩) 诺琳"坏消息"极距狙击步枪 (迷彩) + Noreen "Bad News" ULR (Kamufulaj) Noreen "Bad News" ULR (Sand) @@ -2255,6 +2450,7 @@ Noreen "Bad News" ULR (모래) 諾琳"壞消息"極距狙擊步槍 (沙色) 诺琳"坏消息"极距狙击步枪 (沙色) + Noreen "Bad News" ULR (Çöl) SIG 556 @@ -2271,6 +2467,7 @@ SIG 556 SIG 556精準步槍 SIG 556精准步枪 + SIG 556 SIG 556 (Black) @@ -2283,10 +2480,11 @@ SIG 556 (Nero) SIG 556 (Fekete) SIG 556 (Preto) - SIG 556 (黒) + SIG 556 (ブラック) SIG 556 (검정) SIG 556精準步槍 (黑色) SIG 556精准步枪 (黑色) + SIG 556 (Siyah) SIG 556 (Khaki) @@ -2303,6 +2501,7 @@ SIG 556 (카키) SIG 556精準步槍 (卡其色) SIG 556精准步枪 (卡其色) + SIG 556 (Haki) SIG 556 (Sand) @@ -2319,6 +2518,7 @@ SIG 556 (모래) SIG 556精準步槍 (沙色) SIG 556精准步枪 (沙色) + SIG 556 (Kum) SIG 556 (Camo) @@ -2331,10 +2531,11 @@ SIG 556 (Camo) SIG 556 (Terepmintás) SIG 556 (Camuflagem) - SIG 556 (迷彩) + SIG 556 (カモフラージュ) SIG 556 (위장) SIG 556精準步槍 (迷彩) SIG 556精准步枪 (迷彩) + SIG 556 (Kamufulaj) SIG 556 (Woodland) @@ -2351,6 +2552,7 @@ SIG 556 (우드랜드) SIG 556精準步槍 (森林迷彩) SIG 556精准步枪 (森林迷彩) + SIG 556 (Orman) ASP-1 Kir @@ -2367,6 +2569,7 @@ ASP-1 キール ASP-1"基爾"消音狙擊步槍 ASP-1"基尔"消音狙击步枪 + ASP-1 Kir ASP-1 Kir (Black) @@ -2379,10 +2582,11 @@ ASP-1 Kir (Nero) ASP-1 Kir (Fekete) ASP-1 Kir (Preto) - ASP-1 キール (黒) + ASP-1 キール (ブラック) ASP-1 Kir (검정) ASP-1"基爾"消音狙擊步槍 (黑色) ASP-1"基尔"消音狙击步枪 (黑色) + ASP-1 Kir (Siyah) ASP-1 Kir (Tan) @@ -2399,6 +2603,7 @@ ASP-1 Kir (황갈) ASP-1"基爾"消音狙擊步槍 (黃褐色) ASP-1"基尔"消音狙击步枪 (黄褐色) + ASP-1 Kir (Tan) Cyrus @@ -2415,6 +2620,7 @@ Cyrus "居鲁士"狙擊步槍 "居鲁士"狙击步枪 + Cyrus Cyrus (Black) @@ -2427,10 +2633,11 @@ Cyrus (Nero) Cyrus (Fekete) Cyrus (Preto) - サイラス (黒) + サイラス (ブラック) Cyrus (검정) "居鲁士"狙擊步槍 (黑色) "居鲁士"狙击步枪 (黑色) + Cyrus (Siyah) Cyrus (Hex) @@ -2447,6 +2654,7 @@ Cyrus (육각) "居鲁士"狙擊步槍 (數位蜂巢迷彩) "居鲁士"狙击步枪 (数位蜂巢迷彩) + Cyrus (Hex) Cyrus (Tan) @@ -2459,10 +2667,11 @@ Cyrus (Tan) Cyrus (Cserszín) Cyrus (Deserto) - サイラス (黄褐) + サイラス (タン) Cyrus (황갈) "居鲁士"狙擊步槍 (黃褐色) "居鲁士"狙击步枪 (黄褐色) + Cyrus (Tan) M14 @@ -2479,6 +2688,7 @@ M14 M14精準步槍 M14精准步枪 + M14 M14 (Camo) @@ -2491,10 +2701,11 @@ M14 (Camo) M14 (Terepmintás) M14 (Camuflagem) - M14 (迷彩) + M14 (カモフラージュ) M14 (위장) M14精準步槍 (迷彩) M14精准步枪 (迷彩) + M14 (Kamufulaj) M14 (Olive) @@ -2511,6 +2722,7 @@ M14 (올리브) M14精準步槍 (橄欖色) M14精准步枪 (橄榄色) + M14 (Zeytin Yeşili) HK121 @@ -2527,6 +2739,7 @@ HK121 HK121中型機槍 HK121中型机枪 + HK121 HK121 (Hex) @@ -2543,6 +2756,7 @@ HK121 (육각) HK121中型機槍 (數位蜂巢迷彩) HK121中型机枪 (数位蜂巢迷彩) + HK121 (Hex) HK121 (Tan) @@ -2559,6 +2773,7 @@ HK121 (황갈) HK121機槍 (黃褐色) HK121机枪 (黄褐色) + HK121 (Tan) LWMMG @@ -2575,6 +2790,7 @@ LWMMG 輕量化中型機槍 轻量化中型机枪 + LWMMG LWMMG (MTP) @@ -2591,6 +2807,7 @@ LWMMG (MTP) 輕量化中型機槍 (多地形迷彩) 轻量化中型机枪 (多地形迷彩) + LWMMG (MTP) LWMMG (Black) @@ -2603,10 +2820,11 @@ LWMMG (Nero) LWMMG (Fekete) LWMMG (Preto) - LWMMG (黒) + LWMMG (ブラック) LWMMG (검정) 輕量化中型機槍 (黑色) 轻量化中型机枪 (黑色) + LWMMG (Siyah) LWMMG (Sand) @@ -2623,6 +2841,7 @@ LWMMG (모래) 輕量化中型機槍 (沙色) 轻量化中型机枪 (沙色) + LWMMG (Kum) Jeep Wrangler @@ -2639,6 +2858,7 @@ Jeep Wrangler "牧馬人"吉普車 "牧马人"吉普车 + Jeep Wrangler Jeep Wrangler (SPG-9) @@ -2648,6 +2868,11 @@ ジープ ラングラー (SPG-9) Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) + Jeep Wrangler (СПГ-9) + Jeep Wrangler (SPG-9) + Jeep Wrangler (SPG-9) + Jeep Wrangler (SPG-9) + Jeep Wrangler (SPG-9) Jeep Wrangler (LMG) @@ -2657,6 +2882,11 @@ ジープ ラングラー (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) + Jeep Wrangler (Пулемет) + Jeep Wrangler (LMG) + Jeep Wrangler (LMG) + Jeep Wrangler (LMG) + Jeep Wrangler (LMG) Cessna TTx @@ -2673,6 +2903,7 @@ Cessna TTx "賽斯納"TTx單引擎飛機 "赛斯纳"TTx单引擎飞机 + Cessna TTx Cessna TTx (Racing) @@ -2689,6 +2920,7 @@ Cessna TTx (경주용) "賽斯納"TTx單引擎飛機 (競速) "赛斯纳"TTx单引擎飞机 (竞速) + Cessna TTx (Racing) Burraq UCAV @@ -2705,6 +2937,7 @@ Burraq UCAV "柏拉格"空中無人戰鬥載具 "柏拉格"空中无人战斗载具 + Burraq UCAV QBZ-95-1 (Black) @@ -2717,10 +2950,11 @@ QBZ-95-1 (Nero) QBZ-95-1 (Fekete) QBZ-95-1 (Preto) - QBZ-95-1 (黒) + QBZ-95-1 (ブラック) QBZ-95-1 (검정) QBZ-95-1式自動步槍 (黑色) QBZ-95-1式自动步枪 (黑色) + QBZ-95-1 (Siyah) QBZ-95-1 (Green Hex) @@ -2728,15 +2962,16 @@ QBZ-95-1 (Hex Verde) QBZ-95-1 (zielony hex) QBZ-95-1 (Zelený Hex) - QBZ-95-1 (Hex Verte) - QBZ-95-1 (Зелёный Hex) + QBZ-95-1 (Hex Vert) + QBZ-95-1 (Зелёный Гекс) QBZ-95-1 (Verde Hex) QBZ-95-1 (Zöld Hex) QBZ-95-1 (Hex Verde) - QBZ-95-1 (緑蜂巣) + QBZ-95-1 (緑ヘックス) QBZ-95-1 (초록육각) QBZ-95-1式自動步槍 (綠色數位蜂巢迷彩) QBZ-95-1式自动步枪 (绿色数位蜂巢迷彩) + QBZ-95-1 (Yeşil Hex) QBZ-95-1 (Hex) @@ -2745,14 +2980,15 @@ QBZ-95-1 (hex) QBZ-95-1 (Hex) QBZ-95-1 (Hex) - QBZ-95-1 (Hex) + QBZ-95-1 (Гекс) QBZ-95-1 (Hex) QBZ-95-1 (Hex) QBZ-95-1 (Hex) - QBZ-95-1 (蜂巣) + QBZ-95-1 (ヘックス) QBZ-95-1 (육각) QBZ-95-1式自動步槍 (數位蜂巢迷彩) QBZ-95-1式自动步枪 (数位蜂巢迷彩) + QBZ-95-1 (Hex) QBZ-95-1 GL (Black) @@ -2765,10 +3001,11 @@ QBZ-95-1 GL (Nero) QBZ-95-1 GL (Fekete) QBZ-95-1 GL (Preto) - QBZ-95-1 GL (黒) + QBZ-95-1 GL (ブラック) QBZ-95-1 GL (검정) QBZ-95-1式自動步槍 (榴彈-黑色) QBZ-95-1式自动步枪 (榴弹-黑色) + QBZ-95-1 GL (Siyah) QBZ-95-1 GL (Green Hex) @@ -2776,15 +3013,16 @@ QBZ-95-1 GL (Hex Verde) QBZ-95-1 GL (zielony hex) QBZ-95-1 GL (Zelený Hex) - QBZ-95-1 GL (Hex Verte) - QBZ-95-1 GL (Зелёный Hex) + QBZ-95-1 GL (Hex Vert) + QBZ-95-1 GL (Зелёный Гекс) QBZ-95-1 GL (Verde Hex) QBZ-95-1 GL (Zöld Hex) QBZ-95-1 GL (Hex Verde) - QBZ-95-1 GL (緑蜂巣) + QBZ-95-1 GL (緑ヘックス) QBZ-95-1 GL (초록육각) QBZ-95-1式自動步槍 (榴彈-綠色數位蜂巢迷彩) QBZ-95-1式自动步枪 (榴弹-绿色数位蜂巢迷彩) + QBZ-95-1 GL (Yeşil Hex) QBZ-95-1 GL (Hex) @@ -2793,14 +3031,15 @@ QBZ-95-1 GL (hex) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) - QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Гекс) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) - QBZ-95-1 GL (蜂巣) + QBZ-95-1 GL (ヘックス) QBZ-95-1 GL (육각) QBZ-95-1式自動步槍 (榴彈-數位蜂巢迷彩) QBZ-95-1式自动步枪 (榴弹-数位蜂巢迷彩) + QBZ-95-1 GL (Hex) QBZ-95-1 LSW (Black) @@ -2817,6 +3056,7 @@ QBZ-95-1 LSW (검정) QBZ-95-1式輕機槍 (黑色) QBZ-95-1式轻机枪 (黑色) + QBZ-95-1 LSW (Siyah) QBZ-95-1 LSW (Green Hex) @@ -2824,15 +3064,16 @@ QBZ-95-1 LSW (Hex Verde) QBZ-95-1 LSW (zielony hex) QBZ-95-1 LSW (Zelený Hex) - QBZ-95-1 LSW (Hex Verte) - QBZ-95-1 LSW (Зелёный Hex) + QBZ-95-1 LSW (Hex Vert) + QBZ-95-1 LSW (Зелёный Гекс) QBZ-95-1 LSW (Verde Hex) QBZ-95-1 LSW (Zöld Hex) QBZ-95-1 LSW (Hex Verde) - QBZ-95-1 LSW (緑蜂巣) + QBZ-95-1 LSW (緑ヘックス) QBZ-95-1 LSW (초록육각) QBZ-95-1式輕機槍 (綠色數位蜂巢迷彩) QBZ-95-1式轻机枪 (绿色数位蜂巢迷彩) + QBZ-95-1 LSW (Yeşil Hex) QBZ-95-1 LSW (Hex) @@ -2841,14 +3082,15 @@ QBZ-95-1 LSW (hex) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) - QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Гекс) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) - QBZ-95-1 LSW (蜂巣) + QBZ-95-1 LSW (ヘックス) QBZ-95-1 LSW (육각) QBZ-95-1式輕機槍 (數位蜂巢迷彩) QBZ-95-1式轻机枪 (数位蜂巢迷彩) + QBZ-95-1 LSW (Hex) QBU-88 (Black) @@ -2861,10 +3103,11 @@ QBU-88 (Nero) QBU-88 (Fekete) QBU-88 (Preto) - QBU-88 (黒) + QBU-88 (ブラック) QBU-88 (검정) QBU-88式狙擊步槍 (黑色) QBU-88式狙击步枪 (黑色) + QBU-88 (Siyah) QBU-88 (Green Hex) @@ -2872,15 +3115,16 @@ QBU-88 (Hex Verde) QBU-88 (zielony hex) QBU-88 (Zelený Hex) - QBU-88 (Hex Verte) - QBU-88 (Зелёный Hex) + QBU-88 (Hex Vert) + QBU-88 (Зелёный Гекс) QBU-88 (Verde Hex) QBU-88 (Zöld Hex) QBU-88 (Hex Verde) - QBU-88 (緑蜂巣) + QBU-88 (緑ヘックス) QBU-88 (초록육각) QBU-88式狙擊步槍 (綠色數位蜂巢迷彩) QBU-88式狙击步枪 (绿色数位蜂巢迷彩) + QBU-88 (Yeşil Hex) QBU-88 (Hex) @@ -2889,14 +3133,15 @@ QBU-88 (hex) QBU-88 (Hex) QBU-88 (Hex) - QBU-88 (Hex) + QBU-88 (Гекс) QBU-88 (Hex) QBU-88 (Hex) QBU-88 (Hex) - QBU-88 (蜂巣) + QBU-88 (ヘックス) QBU-88 (육각) QBU-88式狙擊步槍 (數位蜂巢迷彩) QBU-88式狙击步枪 (数位蜂巢迷彩) + QBU-88 (Hex) GM6 Lynx (Green Hex) @@ -2904,15 +3149,16 @@ GM6 Lynx (Hex Verde) GM6 Lynx (Zielony hex) GM6 Lynx (Zelený Hex) - GM6 Lynx (Hex Verte) - GM6 Lynx (Зелёный Hex) + GM6 Lynx (Hex Vert) + GM6 Lynx (Зелёный Гекс) GM6 Lynx (Verde Hex) GM6 Lynx (Zöld Hex) GM6 Lynx (Hex Verde) - GM6 リンクス (緑蜂巣) + GM6 リンクス (緑ヘックス) GM6 Lynx (초록육각) GM6"天貓"反器材狙擊步槍 (綠色數位蜂巢迷彩) GM6"天猫"反器材狙击步枪 (绿色数位蜂巢迷彩) + GM6 Lynx (Yeşil Hex) FN Minimi SPW @@ -2929,6 +3175,7 @@ FN Minimi SPW FN Minimi班用自動機槍 FN Minimi班用自动机枪 + FN Minimi SPW M200 Intervention (Tropic) @@ -2945,6 +3192,7 @@ M200 Intervention (열대) M200干預型狙擊步槍 (熱帶迷彩) M200干预型狙击步枪 (热带迷彩) + M200 Intervention (Tropic) MP5K @@ -2961,6 +3209,7 @@ MP5K MP5K衝鋒槍 MP5K冲锋枪 + MP5K HK416A5 11" (Black) @@ -2973,10 +3222,11 @@ HK416A5 11" (Nero) HK416A5 11" (Fekete) HK416A5 11" (Preto) - HK416A5 11" (黒) + HK416A5 11" (ブラック) HK416A5 11" (검정) HK416A5 11"突擊步槍 (黑色) HK416A5 11"突击步枪 (黑色) + HK416A5 11" (Siyah) HK416A5 11" (Khaki) @@ -2989,10 +3239,11 @@ HK416A5 11" (Khaki) HK416A5 11" (Khaki) HK416A5 11" (Caqui) - HK416A5 11" (土埃) + HK416A5 11" (カーキ) HK416A5 11" (카키) HK416A5 11"突擊步槍 (卡其色) HK416A5 11"突击步枪 (卡其色) + HK416A5 11" (Haki) HK416A5 11" (Sand) @@ -3005,10 +3256,11 @@ HK416A5 11" (Sabbia) HK416A5 11" (Homok) HK416A5 11" (Deserto) - HK416A5 11" (砂地) + HK416A5 11" (サンド) HK416A5 11" (모래) HK416A5 11"突擊步槍 (沙色) HK416A5 11"突击步枪 (沙色) + HK416A5 11" (Kum) HK416A5 11" GL (Black) @@ -3021,10 +3273,11 @@ HK416A5 11" GL (Nero) HK416A5 11" GL (Fekete) HK416A5 11" GL (Preto) - HK416A5 11" GL (黒) + HK416A5 11" GL (ブラック) HK416A5 11" GL (검정) HK416A5 11"突擊步槍 (榴彈-黑色) HK416A5 11"突击步枪 (榴弹-黑色) + HK416A5 11" GL (Siyah) HK416A5 11" GL (Khaki) @@ -3037,10 +3290,11 @@ HK416A5 11" GL (Khaki) HK416A5 11" GL (Khaki) HK416A5 11" GL (Caqui) - HK416A5 11" GL (土埃) + HK416A5 11" GL (カーキ) HK416A5 11" GL (카키) HK416A5 11"突擊步槍 (榴彈-卡其色) HK416A5 11"突击步枪 (榴弹-卡其色) + HK416A5 11" GL (Hakii) HK416A5 11" GL (Sand) @@ -3053,10 +3307,11 @@ HK416A5 11" GL (Sabbia) HK416A5 11" GL (Homok) HK416A5 11" GL (Deserto) - HK416A5 11" GL (砂地) + HK416A5 11" GL (サンド) HK416A5 11" GL (모래) HK416A5 11"突擊步槍 (榴彈-沙色) HK416A5 11"突击步枪 (榴弹-沙色) + HK416A5 11" GL (Çöl) HK416A5 14.5" (Black) @@ -3073,6 +3328,7 @@ HK416A5 14.5" (검정) HK416A5 14.5"突擊步槍 (黑色) HK416A5 14.5"突击步枪 (黑色) + HK416A5 14.5" (Siyah) HK416A5 14.5" (Khaki) @@ -3085,10 +3341,11 @@ HK416A5 14.5" (Khaki) HK416A5 14.5" (Khaki) HK416A5 14.5" (Caqui) - HK416A5 14.5" (土埃) + HK416A5 14.5" (カーキ) HK416A5 14.5" (카키) HK416A5 14.5"突擊步槍 (卡其色) HK416A5 14.5"突击步枪 (卡其色) + HK416A5 14.5" (Haki) HK416A5 14.5" (Sand) @@ -3101,10 +3358,11 @@ HK416A5 14.5" (Sabbia) HK416A5 14.5" (Homok) HK416A5 14.5" (Deserto) - HK416A5 14.5" (砂地) + HK416A5 14.5" (サンド) HK416A5 14.5" (모래) HK416A5 14.5"突擊步槍 (沙色) HK416A5 14.5"突击步枪 (沙色) + HK416A5 14.5" (Kum) HK417A2 20" (Black) @@ -3117,10 +3375,11 @@ HK417A2 20" (Nero) HK417A2 20" (Fekete) HK417A2 20" (Preto) - HK417A2 20" (黒) + HK417A2 20" (ブラック) HK417A2 20" (검정) HK417A2 20"突擊步槍 (黑色) HK417A2 20"突击步枪 (黑色) + HK417A2 20" (Siyah) HK417A2 20" (Khaki) @@ -3133,10 +3392,11 @@ HK417A2 20" (Khaki) HK417A2 20" (Khaki) HK417A2 20" (Caqui) - HK417A2 20" (土埃) + HK417A2 20" (カーキ) HK417A2 20" (카키) HK417A2 20"突擊步槍 (卡其色) HK417A2 20"突击步枪 (卡其色) + HK417A2 20" (Haki) HK417A2 20" (Sand) @@ -3149,10 +3409,11 @@ HK417A2 20" (Sabbia) HK417A2 20" (Homok) HK417A2 20" (Deserto) - HK417A2 20" (砂地) + HK417A2 20" (サンド) HK417A2 20" (모래) HK417A2 20"突擊步槍 (沙色) HK417A2 20"突击步枪 (沙色) + HK417A2 20" (Kum) RPG-32 (Green Hex) @@ -3160,15 +3421,16 @@ RPG-32 (Hex Verde) RPG-32 (zielony hex) RPG-32 (Zelený Hex) - RPG-32 (Hex Verte) - RPG-32 (Зелёный Hex) + RPG-32 (Hex Vert) + RPG-32 (Зелёный Гекс) RPG-32 (Verde Hex) RPG-32 (Zöld Hex) RPG-32 (Hex Verde) - RPG-32 (緑蜂巣) + RPG-32 (緑ヘックス) RPG-32 (초록육각) RPG-32火箭發射器 (綠色數位蜂巢迷彩) RPG-32火箭发射器 (绿色数位蜂巢迷彩) + RPG-32 (Yeşil Hex) P99 (Khaki) @@ -3181,10 +3443,11 @@ P99 (Khaki) P99 (Khaki) P99 (Caqui) - P99 (土埃) + P99 (カーキ) P99 (카키) P99半自動手槍 (卡其色) P99半自动手枪 (卡其色) + P99 (Haki) Makarov PM @@ -3201,6 +3464,7 @@ Makarov PM "馬卡洛夫"手槍 "马卡洛夫"手枪 + Makarov PM Polaris DAGOR (XM312) @@ -3210,6 +3474,11 @@ "北极星"先进布署越野车 (XM312重机枪) Polaris DAGOR (XM312) Polaris DAGOR (XM312) + Polaris DAGOR (XM312) + Polaris DAGOR (XM312) + Polaris DAGOR (XM312) + Polaris DAGOR (XM312) + Polaris DAGOR (XM312) Polaris DAGOR (Mini-Spike AT) @@ -3219,6 +3488,11 @@ Polaris DAGOR (Mini-Spike AT) ポラリス DAGOR (ミニスパイク対戦) Polaris DAGOR (Mini-Spike AT) + Polaris DAGOR (ПТ Mini-Spike) + Polaris DAGOR (Mini-Spike AT) + Polaris DAGOR (Mini-Spike AC) + Polaris DAGOR (Mini-Spike AT) + Polaris DAGOR (Mini-Spike AT) Polaris DAGOR @@ -3228,6 +3502,11 @@ "北极星"先进布署越野车 Polaris DAGOR Polaris DAGOR + Polaris DAGOR + Polaris DAGOR + Polaris DAGOR + Polaris DAGOR + Polaris DAGOR Polaris DAGOR (light) @@ -3237,6 +3516,11 @@ "北极星"先进布署越野车 (轻型) Polaris DAGOR (leggero) Polaris DAGOR (light) + Polaris DAGOR (легкий) + Polaris DAGOR (leve) + Polaris DAGOR (léger) + Polaris DAGOR (lehký) + Polaris DAGOR (light) LSV Mk. II (M134) @@ -3246,6 +3530,11 @@ LSV Mk. II (M134) LSV Mk. II (M134) LSV Mk. II (M134) + LSV Mk. II (M134) + LSV Mk. II (M134) + LSV Mk. II (M134) + LSV Mk. II (M134) + LSV Mk. II (M134) LSV Mk. II (Metis-M) @@ -3255,6 +3544,11 @@ LSV Mk. II (メチス-M) LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) + LSV Mk. II (Метис-M) + LSV Mk. II (Metis-M) + LSV Mk. II (Metis-M) + LSV Mk. II (Metis-M) + LSV Mk. II (Metis-M) LSV Mk. II @@ -3264,6 +3558,11 @@ LSV Mk. II LSV Mk. II LSV Mk. II + LSV Mk. II + LSV Mk. II + LSV Mk. II + LSV Mk. II + LSV Mk. II Rooikat 120 @@ -3273,6 +3572,11 @@ ルーイカット 120 Rooikat 120 Rooikat 120 + Rooikat 120 + Rooikat 120 + Rooikat 120 + Rooikat 120 + Rooikat 120 Rooikat 120 UP @@ -3282,6 +3586,11 @@ ルーイカット 120 UP Rooikat 120 UP Rooikat 120 UP + Rooikat 120 UP + Rooikat 120 UP + Rooikat 120 UP + Rooikat 120 UP + Rooikat 120 UP T-14 Armata @@ -3292,6 +3601,10 @@ T-14 アルマータ T-14 Armata T-14 Armata + T-14 Armata + T-14 Armata + T-14 Armata + T-14 Armata T-14K Armata @@ -3302,15 +3615,24 @@ T-14K アルマータ T-14K Armata T-14K Armata + T-14K Armata + T-14K Armata + T-14K Armata + T-14K Armata Wiesel 2 Ozelot (AA) - Wiesel 2 Ozelot (FlaRaWaTrg) + Wiesel 2 Ozelot (LeFlaSys) "鼬鼠"2装甲车 (防空) "鼬鼠"2裝甲車 (防空) ウィーゼル 2 オゼロット (対空) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) + Wiesel 2 Ozelot (ПВО) + Wiesel 2 Ozelot (AA) + Wiesel 2 Ozelot (AA) + Wiesel 2 Ozelot (AA) + Wiesel 2 Ozelot (AA) Wiesel 2 (ATGM) @@ -3320,6 +3642,11 @@ ウィーゼル 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) + Wiesel 2 (ПТ) + Wiesel 2 (ATGM) + Wiesel 2 (ATGM) + Wiesel 2 (ATGM) + Wiesel 2 (ATGM) Wiesel 2 (MK20) @@ -3329,6 +3656,11 @@ ウィーゼル 2 (MK20) Wiesel 2 (MK20) Wiesel 2 (MK20) + Wiesel 2 (MK20) + Wiesel 2 (MK20) + Wiesel 2 (MK20) + Wiesel 2 (MK20) + Wiesel 2 (MK20) Wiesel 2 RFCV (Radar) @@ -3338,6 +3670,11 @@ ウィーゼル 2 (レーダー) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) + Wiesel 2 RFCV (Радар) + Wiesel 2 RFCV (Radar) + Wiesel 2 RFCV (Radar) + Wiesel 2 RFCV (Radar) + Wiesel 2 RFCV (Radar) Leupold Mark 4 HAMR @@ -3347,68 +3684,136 @@ Leupold Mark 4 HAMR Leupold Mark 4 HAMR Leupold Mark 4 HAMR + Leupold Mark 4 HAMR + Leupold Mark 4 HAMR + Leupold Mark 4 HAMR + Leupold Mark 4 HAMR + Leupold Mark 4 HAMR Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (卡其色) Leupold Mark 4 HAMR (卡其色) - Leupold Mark 4 HAMR (土埃) + Leupold Mark 4 HAMR (カーキ) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Khaki) + Leupold Mark 4 HAMR (Хаки) + Leupold Mark 4 HAMR (Khaki) + Leupold Mark 4 HAMR (Kaki) + Leupold Mark 4 HAMR (Khaki) + Leupold Mark 4 HAMR (Haki) + + + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR (2D) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Beige) ELCAN SpecterOS (黃褐色) ELCAN SpecterOS (黄褐色) - ELCAN SpecterOS (黄褐) + ELCAN SpecterOS (タン) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Tan) + ELCAN SpecterOS (Бронза) + ELCAN SpecterOS (Bege) + ELCAN SpecterOS (Tan) + ELCAN SpecterOS (Žlutohnědá) + ELCAN SpecterOS (Tan) ELCAN SpecterOS (Black) ELCAN SpecterOS (Schwarz) ELCAN SpecterOS (黑色) ELCAN SpecterOS (黑色) - ELCAN SpecterOS (黒) + ELCAN SpecterOS (ブラック) ELCAN SpecterOS (Nero) ELCAN SpecterOS (Czarny) + ELCAN SpecterOS (Черный) + ELCAN SpecterOS (Preto) + ELCAN SpecterOS (Noire) + ELCAN SpecterOS (Černá) + ELCAN SpecterOS (Siyah) ELCAN SpecterOS (Green Hex) ELCAN SpecterOS (綠色數位蜂巢迷彩) ELCAN SpecterOS (绿色数位蜂巢迷彩) - ELCAN SpecterOS (緑蜂巣) + ELCAN SpecterOS (緑ヘックス) ELCAN SpecterOS (Verde Hex) ELCAN SpecterOS (Zielony Hex) + ELCAN SpecterOS (Зеленый Гекс) + ELCAN SpecterOS (Verde Hex) + ELCAN SpecterOS (Hex Verte) + ELCAN SpecterOS (Zelený Hex) + ELCAN SpecterOS (Yeşil Hex) + + + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) + ELCAN SpecterOS (2D) SIG BRAVO4 / ROMEO3 (Black) SIG BRAVO4 / ROMEO3 (Schwarz) SIG BRAVO4 / ROMEO3 (黑色) SIG BRAVO4 / ROMEO3 (黑色) - SIG BRAVO4 / ROMEO3 (黒) + SIG BRAVO4 / ROMEO3 (ブラック) SIG BRAVO4 / ROMEO3 (Nero) SIG BRAVO4 / ROMEO3 (Czarny) + SIG BRAVO4 / ROMEO3 (Черный) + SIG BRAVO4 / ROMEO3 (Preto) + SIG BRAVO4 / ROMEO3 (Noire) + SIG BRAVO4 / ROMEO3 (Černá) + SIG BRAVO4 / ROMEO3 (Siyah) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (卡其色) SIG BRAVO4 / ROMEO3 (卡其色) - SIG BRAVO4 / ROMEO3 (土埃) + SIG BRAVO4 / ROMEO3 (カーキ) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Khaki) + SIG BRAVO4 / ROMEO3 (Хаки) + SIG BRAVO4 / ROMEO3 (Khaki) + SIG BRAVO4 / ROMEO3 (Kaki) + SIG BRAVO4 / ROMEO3 (Khaki) + SIG BRAVO4 / ROMEO3 (Haki) SIG BRAVO4 / ROMEO3 (Sand) SIG BRAVO4 / ROMEO3 (Beige) SIG BRAVO4 / ROMEO3 (沙色) SIG BRAVO4 / ROMEO3 (沙色) - SIG BRAVO4 / ROMEO3 (砂地) + SIG BRAVO4 / ROMEO3 (サンド) SIG BRAVO4 / ROMEO3 (Sabbia) SIG BRAVO4 / ROMEO3 (Piasek) + SIG BRAVO4 / ROMEO3 (Песочный) + SIG BRAVO4 / ROMEO3 (Areia) + SIG BRAVO4 / ROMEO3 (Beige) + SIG BRAVO4 / ROMEO3 (Písková) + SIG BRAVO4 / ROMEO3 (Kum) Nightforce NXS @@ -3417,63 +3822,116 @@ Nightforce NXS Nightforce NXS Nightforce NXS + Nightforce NXS + Nightforce NXS + Nightforce NXS + Nightforce NXS + Nightforce NXS Nightforce NXS (Green Hex) Nightforce NXS (綠色數位蜂巢迷彩) Nightforce NXS (绿色数位蜂巢迷彩) - Nightforce NXS (緑蜂巣) + Nightforce NXS (緑ヘックス) Nightforce NXS (Verde Hex) Nightforce NXS (Zielony Hex) + Nightforce NXS (Зеленый Гекс) + Nightforce NXS (Verde Hex) + Nightforce NXS (Hex Verte) + Nightforce NXS (Zelený Hex) + Nightforce NXS (Yeşil Hex) Nightforce NXS (Jungle) Nightforce NXS (Dschungel) Nightforce NXS (叢林色) Nightforce NXS (丛林色) - Nightforce NXS (熱帯) + Nightforce NXS (ジャングル) Nightforce NXS (Giungla) Nightforce NXS (Dżungla) + Nightforce NXS (Джунгли) + Nightforce NXS (Selva) + Nightforce NXS (Jungle) + Nightforce NXS (Džungle) + Nightforce NXS (Orman) + + + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) + Nightforce NXS (2D) US Optics MR-10 (Black) US Optics MR-10 (Black) US Optics MR-10 (Black) - US Optics MR-10 (黒) + US Optics MR-10 (ブラック) US Optics MR-10 (Czarny) Ottica US MR-10 (nera) + US Optics MR-10 (Черный) + US Optics MR-10 (Preto) + US Optics MR-10 (Noire) + US Optics MR-10 (Černá) + US Optics MR-10 (Siyah) US Optics MR-10 (Khaki) US Optics MR-10 (Khaki) US Optics MR-10 (Khaki) - US Optics MR-10 (土埃) + US Optics MR-10 (カーキ) US Optics MR-10 (Khaki) Ottica US MR-10 (cachi) + US Optics MR-10 (Хаки) + US Optics MR-10 (Khaki) + US Optics MR-10 (Kaki) + US Optics MR-10 (Khaki) + US Optics MR-10 (Haki) US Optics MR-10 (Sand) US Optics MR-10 (Sand) US Optics MR-10 (Sand) - US Optics MR-10 (砂地) + US Optics MR-10 (サンド) US Optics MR-10 (Piasek) Ottica US MR-10 (sabbia) + US Optics MR-10 (Песочный) + US Optics MR-10 (Areia) + US Optics MR-10 (Beige) + US Optics MR-10 (Písková) + US Optics MR-10 (Kum) KAHLES Helia (Black) KAHLES Helia (Black) KAHLES Helia (Black) - KAHLES ヘリア (黒) + KAHLES ヘリア (ブラック) KAHLES Helia (Czarny) KAHLES Helia (nero) + KAHLES Helia (Черный) + KAHLES Helia (Preto) + KAHLES Helia (Noire) + KAHLES Helia (Černá) + KAHLES Helia (Siyah) KAHLES Helia (Hex) KAHLES Helia (Hex) KAHLES Helia (Hex) - KAHLES ヘリア (蜂巣) + KAHLES ヘリア (ヘックス) KAHLES Helia (Hex) KAHLES Helia (esagonale) + KAHLES Helia (Гекс) + KAHLES Helia (Hex) + KAHLES Helia (Hex) + KAHLES Helia (Hex) + KAHLES Helia (Hex) KAHLES Helia (Old) @@ -3482,14 +3940,24 @@ KAHLES ヘリア (使い古し) KAHLES Helia (Stary) KAHLES Helia (vecchio) + KAHLES Helia (Старый) + KAHLES Helia (Velho) + KAHLES Helia (Usée) + KAHLES Helia (Stará) + KAHLES Helia (Eski) KAHLES Helia (Tan) KAHLES Helia (Tan) KAHLES Helia (Tan) - KAHLES Helia (黄褐) + KAHLES Helia (タン) KAHLES Helia (Tan) KAHLES Helia (marroncino) + KAHLES Helia (Бронза) + KAHLES Helia (Bege) + KAHLES Helia (Tan) + KAHLES Helia (Žlutohnědá) + KAHLES Helia (Tan) Burris XTR II @@ -3498,68 +3966,108 @@ Burris XTR II Burris XTR II Burris XTR II + Burris XTR II + Burris XTR II + Burris XTR II + Burris XTR II + Burris XTR II Burris XTR II (Green Hex) Burris XTR II (綠色數位蜂巢迷彩) Burris XTR II (绿色数位蜂巢迷彩) - Burris XTR II (緑蜂巣) + Burris XTR II (緑ヘックス) Burris XTR II (Green Hex) Burris XTR II (Zielony Hex) + Burris XTR II (Зеленый Гекс) + Burris XTR II (Verde Hex) + Burris XTR II (Hex Verte) + Burris XTR II (Zelený Hex) + Burris XTR II (Yeşil Hex) EOTech XPS3 (Tan) EOTech XPS3 (Beige) EOTech XPS3 (黃褐色) EOTech XPS3 (黄褐色) - EOTech XPS3 (黄褐) + EOTech XPS3 (タン) EOTech XPS3 (Tan) EOTech XPS3 (Tan) + EOTech XPS3 (Бронза) + EOTech XPS3 (Bege) + EOTech XPS3 (Tan) + EOTech XPS3 (Žlutohnědá) + EOTech XPS3 (Tan) EOTech XPS3 (Black) EOTech XPS3 (Schwarz) EOTech XPS3 (黑色) EOTech XPS3 (黑色) - EOTech XPS3 (黒) + EOTech XPS3 (ブラック) EOTech XPS3 (Black) EOTech XPS3 (Czarny) + EOTech XPS3 (Черный) + EOTech XPS3 (Preto) + EOTech XPS3 (Noire) + EOTech XPS3 (Černá) + EOTech XPS3 (Siyah) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) EOTech XPS3 (卡其色) EOTech XPS3 (卡其色) - EOTech XPS3 (土埃) + EOTech XPS3 (カーキ) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) + EOTech XPS3 (Хаки) + EOTech XPS3 (Khaki) + EOTech XPS3 (Kaki) + EOTech XPS3 (Khaki) + EOTech XPS3 (Haki) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Beige) EOTech XPS3 SMG (黃褐色) EOTech XPS3 SMG (黄褐色) - EOTech XPS3 SMG (黄褐) + EOTech XPS3 SMG (タン) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Tan) + EOTech XPS3 SMG (Бронза) + EOTech XPS3 SMG (Bege) + EOTech XPS3 SMG (Tan) + EOTech XPS3 SMG (Žlutohnědá) + EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Black) EOTech XPS3 SMG (Schwarz) EOTech XPS3 SMG (黑色) EOTech XPS3 SMG (黑色) - EOTech XPS3 SMG (黒) + EOTech XPS3 SMG (ブラック) EOTech XPS3 SMG (Nero) EOTech XPS3 SMG (Czarny) + EOTech XPS3 SMG (Черный) + EOTech XPS3 SMG (Preto) + EOTech XPS3 SMG (Noire) + EOTech XPS3 SMG (Černá) + EOTech XPS3 SMG (Siyah) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (卡其色) EOTech XPS3 SMG (卡其色) - EOTech XPS3 SMG (土埃) + EOTech XPS3 SMG (カーキ) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) + EOTech XPS3 SMG (Хаки) + EOTech XPS3 SMG (Khaki) + EOTech XPS3 SMG (Kaki) + EOTech XPS3 SMG (Khaki) + EOTech XPS3 SMG (Hakii) IOR-Valdada Pitbull 2 @@ -3568,6 +4076,24 @@ IOR-Valdada ピットブル 2 IOR-Valdada Pitbull 2 IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 + + + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada ピットブル 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) Burris FastFire 2 @@ -3576,6 +4102,11 @@ Burris ファストファイア 2 Burris FastFire 2 Burris FastFire 2 + Burris FastFire 2 + Burris FastFire 2 + Burris FastFire 2 + Burris FastFire 2 + Burris FastFire 2 C-More Railway (Red) @@ -3585,6 +4116,11 @@ C-More レイルウェイ (赤) C-More Railway (Rosso) C-More Railway (Czerwony) + C-More Railway (Красный) + C-More Railway (Vermelho) + C-More Railway (Rouge) + C-More Railway (Červený) + C-More Railway (Kırmızı) C-More Railway (Green) @@ -3594,6 +4130,11 @@ C-More レイルウェイ (緑) C-More Railway (Verde) C-More Railway (Zielony) + C-More Railway (Зеленый) + C-More Railway (Verde) + C-More Railway (Verte) + C-More Railway (Zelený) + C-More Railway (Yeşil) C-More Railway SMG (Red) @@ -3603,6 +4144,11 @@ C-More レイルウェイ SMG (赤) C-More Railway SMG (Rosso) C-More Railway SMG (Czerwony) + C-More Railway SMG (Красный) + C-More Railway SMG (Vermelho) + C-More Railway SMG (Rouge) + C-More Railway SMG (Červený) + C-More Railway SMG (Kırmızı) C-More Railway SMG (Green) @@ -3612,6 +4158,11 @@ C-More レイルウェイ SMG (緑) C-More Railway SMG (Verde) C-More Railway SMG (Zielony) + C-More Railway SMG (Зеленый) + C-More Railway SMG (Verde) + C-More Railway SMG (Verte) + C-More Railway SMG (Zelený) + C-More Railway SMG (Yeşil) P90 TR (Black) @@ -3628,6 +4179,7 @@ P90 TR (黑色) P90 TR (黑色) P90 TR (Black) + P90 TR (Siyah) P90 TR (Khaki) @@ -3644,6 +4196,7 @@ P90 TR (沙色) P90 TR (沙色) P90 TR (Khaki) + P90 TR (Haki) P90 TR (Camo) @@ -3660,6 +4213,7 @@ P90 TR (迷彩) P90 TR (迷彩) P90 TR (Camo) + P90 TR (Kamufulaj) P90 TR (Hex) @@ -3676,6 +4230,7 @@ P90 TR (數位蜂巢迷彩) P90 TR (数位蜂巢迷彩) P90 TR (Hex) + P90 TR (Hex) P90 (Black) @@ -3692,6 +4247,7 @@ P90 (黑色) P90 (黑色) P90 (Black) + P90 (Siyah) P90 (Khaki) @@ -3708,6 +4264,7 @@ P90 (沙色) P90 (沙色) P90 (Khaki) + P90 (Haki) P90 (Camo) @@ -3724,6 +4281,7 @@ P90 (迷彩) P90 (迷彩) P90 (Camo) + P90 (Kamufulaj) P90 (Hex) @@ -3740,6 +4298,7 @@ P90 (數位蜂巢迷彩) P90 (数位蜂巢迷彩) P90 (Hex) + P90 (Hex) PS90 TR (Black) @@ -3756,6 +4315,7 @@ PS90 TR (黑色) PS90 TR (黑色) PS90 TR (Black) + PS90 TR (Siyah) PS90 TR (Khaki) @@ -3772,6 +4332,7 @@ PS90 TR (沙色) PS90 TR (沙色) PS90 TR (Khaki) + PS90 TR (Haki) PS90 TR (Camo) @@ -3788,6 +4349,7 @@ PS90 TR (迷彩) PS90 TR (迷彩) PS90 TR (Camo) + PS90 TR (Kamufulaj) PS90 TR (Hex) @@ -3804,6 +4366,7 @@ PS90 TR (數位蜂巢迷彩) PS90 TR (数位蜂巢迷彩) PS90 TR (Hex) + PS90 TR (Hex) PS90 (Black) @@ -3820,6 +4383,7 @@ PS90 (黑色) PS90 (黑色) PS90 (Black) + PS90 (Siyah) PS90 (Khaki) @@ -3836,6 +4400,7 @@ PS90 (沙色) PS90 (沙色) PS90 (Khaki) + PS90 (Haki) PS90 (Camo) @@ -3852,6 +4417,7 @@ PS90 (迷彩) PS90 (迷彩) PS90 (Camo) + PS90 (Kamufulaj) PS90 (Hex) @@ -3868,13 +4434,14 @@ PS90 (數位蜂巢迷彩) PS90 (数位蜂巢迷彩) PS90 (Hex) + PS90 (Hex) 5.7mm 50Rnd Mag 5,7mm 50-as Tár 5,7mm 50-Patronen-Magazin Cargador de 50 balas SD de 5,7mm - Ch. 5,7mm 50Cps + Ch. 5,7 mm 50 Cps Magazynek 5,7mm 50rd 5.7mm 50náb. Zásobník Carregador de 50 projéteis de 5.7mm @@ -3884,12 +4451,13 @@ 5.7mm 50發 彈匣 5.7mm 50发 弹匣 5.7mm 50Rnd Mag + 5.7mm 50Rnd Şarjör Caliber: 5.7mm<br />Rounds: 50<br />Used in: P90 Kaliber: 5,7mm<br />Patronen: 50<br />Eingesetzt von: P90 Kaliber: 5,7mm<br />Pociski: 50<br />Używany w: P90 - Calibre : 5,7mm<br />Cartouches : 50<br />Utilisé avec : P90 + Calibre : 5,7 mm<br />Cartouches : 50<br />Utilisé avec : P90 Calibre: 5.7mm<br />Balas: 50<br />Se usa en: P90 Калибр: 5,7 мм<br />Патронов: 50<br />Используются с: P90 Calibro: 5.7mm<br />Munizioni: 50<br />In uso su: P90 @@ -3897,9 +4465,554 @@ Calibre: 5.7mm<br />Cartuchos: 50<br />Usado em: P90 Kaliber: 5,7mm<br />Lövedékek: 50<br />Használható: P90 口径: 5.7mm<br />装弾数: 50<br />次で使用: P90 - 口徑: 5.7mm<br />發數: 50<br />使用於: P90 + 口徑: 5.7毫米<br />發數: 50<br />使用於: P90 口径: 5.7mm<br />发数: 50<br />使用于: P90 구경: 5.7mm<br />장탄수: 50<br />사용됨: P90 + Kalibre: 5.7mm<br />Mermi: 50<br />Kullanıyor: P90 + + + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + AKM + + + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + AKS-74U + + + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + AK-15 + + + AK-15 (Lush) + AK-15 (草木茂盛) + AK-15 (Forêt) + AK-15 (exuberante) + AK-15 (verdeggiante) + AK-15 (region z bujną roślinnością) + AK-15 (обильная растительность) + AK-15 (Grün) + AK-15 (bujný porost) + AK-15 (Exuberante) + AK-15 (초목) + AK-15 (繁茂) + AK-15 (緑地) + AK-15 (Gür) + AK-15 (esőerdő) + + + AK-15 (Arid) + AK-15 (乾燥氣候) + AK-15 (Désert) + AK-15 (árido) + AK-15 (arido) + AK-15 (region suchy) + AK-15 (засушливая местность) + AK-15 (Trocken) + AK-15 (suchý porost) + AK-15 (Árido) + AK-15 (건조) + AK-15 (干旱) + AK-15 (乾燥地帯) + AK-15 (Kurak) + AK-15 (sivatag) + + + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + AK-15 GL + + + AK-15 GL (Lush) + AK-15 GL (草木茂盛) + AK-15 GL (Forêt) + AK-15 GL (exuberante) + AK-15 GL (verdeggiante) + AK-15 GL (region z bujną roślinnością) + AK-15 GL (обильная растительность) + AK-15 GL (Grün) + AK-15 GL (bujný porost) + AK-15 GL (Exuberante) + AK-15 GL (초목) + AK-15 GL (繁茂) + AK-15 GL (緑地) + AK-15 GL (Gür) + AK-15 GL (esőerdő) + + + AK-15 GL (Arid) + AK-15 GL (乾燥氣候) + AK-15 GL (Désert) + AK-15 GL (árido) + AK-15 GL (arido) + AK-15 GL (region suchy) + AK-15 GL (засушливая местность) + AK-15 GL (Trocken) + AK-15 GL (suchý porost) + AK-15 GL (Árido) + AK-15 GL (건조) + AK-15 GL (干旱) + AK-15 GL (乾燥地帯) + AK-15AK-15 GL (Kurak) + AK-15 GL (sivatag) + + + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + AK-15K + + + AK-15K (Lush) + AK-15K (草木茂盛) + AK-15K (Forêt) + AK-15K (exuberante) + AK-15K (verdeggiante) + AK-15K (region z bujną roślinnością) + AK-15K (обильная растительность) + AK-15K (Grün) + AK-15K (bujný porost) + AK-15K (Exuberante) + AK-15K (초목) + AK-15K (繁茂) + AK-15K (緑地) + AK-15K (Gür) + AK-15K (esőerdő) + + + AK-15K (Arid) + AK-15K (乾燥氣候) + AK-15K (Désert) + AK-15K (árido) + AK-15K (arido) + AK-15K (region suchy) + AK-15K (засушливая местность) + AK-15K (Trocken) + AK-15K (suchý porost) + AK-15K (Árido) + AK-15K (건조) + AK-15K (干旱) + AK-15K (乾燥地帯) + AK-15K (Kurak) + AK-15K (sivatag) + + + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + RPK + + + RPK (Lush) + RPK (草木茂盛) + RPK (Forêt) + RPK (exuberante) + RPK (verdeggiante) + RPK (region z bujną roślinnością) + RPK (обильная растительность) + RPK (Grün) + RPK (bujný porost) + RPK (Exuberante) + RPK (초목) + RPK (繁茂) + RPK (緑地) + RPK (Gür) + RPK (esőerdő) + + + RPK (Arid) + RPK (乾燥氣候) + RPK (Désert) + RPK (árido) + RPK (arido) + RPK (region suchy) + RPK (засушливая местность) + RPK (Trocken) + RPK (suchý porost) + RPK (Árido) + RPK (건조) + RPK (干旱) + RPK (乾燥地帯) + RPK (Kurak) + RPK (sivatag) + + + M14 (classic) + M14 (经典) + M14 (classique) + M14 (clásico) + M14 (classico) + M14 (klasyczny) + M14 (классический) + M14 (klassisch) + M14 (klasický) + M14 (clássico) + M14 (표준) + M14 (經典) + M14 (クラシック) + M14 (klasik) + M14 (klasszikus) + + + Stoner 99 LMG (Black) + 斯通納99輕機槍(黑色) + Stoner 99 LMG (Noire) + Stoner 99 LMG (Negro) + Stoner 99 LMG (Nero) + Stoner 99 LMG (Czarny) + Stoner 99 LMG (Чёрный) + Stoner 99 LMG (Schwarz) + Stoner 99 LMG (Černá) + Stoner 99 LMG (Preto) + Stoner 99 LMG (검정) + 斯通纳99轻机枪(黑色) + ストーナー 99 LMG(ブラック) + Stoner 99 LMG (Siyah) + Stoner 99 Könnyűgéppuska (Fekete) + + + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + MSBS Grot + + + MSBS Grot (Black) + MSBS Grot(黑色) + MSBS Grot (Noir) + MSBS Grot (Negro) + MSBS Grot (Nero) + MSBS Grot (Czarny) + MSBS Grot (Чёрный) + MSBS Grot (Schwarz) + MSBS Grot (Černá) + MSBS Grot (Preto) + MSBS Grot (검정) + MSBS Grot(黑色) + MSBS Grot(ブラック) + MSBS Grot (Siyah) + MSBS Grot (Fekete) + + + MSBS Grot (Camo) + MSBS Grot(迷彩) + MSBS Grot (Camo) + MSBS Grot (Camuflaje) + MSBS Grot (Camo) + MSBS Grot (Kamuflaż) + MSBS Grot (Камо) + MSBS Grot (Tarnmuster) + MSBS Grot (Kamufláž) + MSBS Grot (Camo) + MSBS Grot (위장) + MSBS Grot(迷彩) + MSBS Grot (カモフラージュ) + MSBS Grot (Kamuflaj) + MSBS Grot (Terepmintás) + + + MSBS Grot (Sand) + MSBS Grot(沙色) + MSBS Grot (Beige) + MSBS Grot (Arena) + MSBS Grot (Sabbia) + MSBS Grot (Piaskowy) + MSBS Grot (Песочный) + MSBS Grot (Sandfarben) + MSBS Grot (Písková) + MSBS Grot (Deserto) + MSBS Grot (모래) + MSBS Grot(沙色) + MSBS Grot (サンド) + MSBS Grot (Kum) + MSBS Grot (Homok) + + + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + MSBS Grot GL + + + MSBS Grot GL (Black) + MSBS Grot GL(黑色) + MSBS Grot GL (Noir) + MSBS Grot GL (Negro) + MSBS Grot GL (Nero) + MSBS Grot GL (Czarny) + MSBS Grot GL (Чёрный) + MSBS Grot GL (Schwarz) + MSBS Grot GL (Černá) + MSBS Grot GL (Preto) + MSBS Grot GL (검정) + MSBS Grot GL(黑色) + MSBS Grot GL(ブラック) + MSBS Grot GL (Siyah) + MSBS Grot GL (Fekete) + + + MSBS Grot GL (Camo) + MSBS Grot GL(迷彩) + MSBS Grot GL (Camo) + MSBS Grot GL (Camuflaje) + MSBS Grot GL (Camo) + MSBS Grot GL (Kamuflaż) + MSBS Grot GL (Камо) + MSBS Grot GL (Tarnmuster) + MSBS Grot GL (Kamufláž) + MSBS Grot GL (Camo) + MSBS Grot GL (위장) + MSBS Grot GL(迷彩) + MSBS Grot GL (カモフラージュ) + MSBS Grot GL (Kamuflaj) + MSBS Grot GL (Terepmintás) + + + MSBS Grot GL (Sand) + MSBS Grot GL(沙色) + MSBS Grot GL (Beige) + MSBS Grot GL (Arena) + MSBS Grot GL (Sabbia) + MSBS Grot GL (Piaskowy) + MSBS Grot GL (Песочный) + MSBS Grot GL (Sandfarben) + MSBS Grot GL (Písková) + MSBS Grot GL (Deserto) + MSBS Grot GL (모래) + MSBS Grot GL(沙色) + MSBS Grot GL (サンド) + MSBS Grot GL (Kum) + MSBS Grot GL (Homok) + + + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + MSBS Grot MR + + + MSBS Grot MR (Black) + MSBS Grot MR(黑色) + MSBS Grot MR (Noir) + MSBS Grot MR (Negro) + MSBS Grot MR (Nero) + MSBS Grot MR (Czarny) + MSBS Grot MR (Чёрный) + MSBS Grot MR (Schwarz) + MSBS Grot MR (Černá) + MSBS Grot MR (Preto) + MSBS Grot MR (검정) + MSBS Grot MR(黑色) + MSBS Grot MR(ブラック) + MSBS Grot MR (Siyah) + MSBS Grot MR (Fekete) + + + MSBS Grot MR (Camo) + MSBS Grot MR(迷彩) + MSBS Grot MR (Camo) + MSBS Grot MR (Camuflaje) + MSBS Grot MR (Camo) + MSBS Grot MR (Kamuflaż) + MSBS Grot MR (Камо) + MSBS Grot MR (Tarnmuster) + MSBS Grot MR (Kamufláž) + MSBS Grot MR (Camo) + MSBS Grot MR (위장) + MSBS Grot MR(迷彩) + MSBS Grot MR (カモフラージュ) + MSBS Grot MR (Kamuflaj) + MSBS Grot MR (Terepmintás) + + + MSBS Grot MR (Sand) + MSBS Grot MR(沙色) + MSBS Grot MR (Beige) + MSBS Grot MR (Arena) + MSBS Grot MR (Sabbia) + MSBS Grot MR (Piaskowy) + MSBS Grot MR (Песочный) + MSBS Grot MR (Sandfarben) + MSBS Grot MR (Písková) + MSBS Grot MR (Deserto) + MSBS Grot MR (모래) + MSBS Grot MR(沙色) + MSBS Grot MR (サンド) + MSBS Grot MR (Kum) + MSBS Grot MR (Homok) + + + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + MSBS Grot SG + + + MSBS Grot SG (Black) + MSBS Grot SG(黑色) + MSBS Grot SG (Noir) + MSBS Grot SG (Negro) + MSBS Grot SG (Nero) + MSBS Grot SG (Czarny) + MSBS Grot SG (Чёрный) + MSBS Grot SG (Schwarz) + MSBS Grot SG (Černá) + MSBS Grot SG (Preto) + MSBS Grot SG (검정) + MSBS Grot SG(黑色) + MSBS Grot SG(ブラック) + MSBS Grot SG (Siyah) + MSBS Grot SG (Fekete) + + + MSBS Grot SG (Camo) + MSBS Grot SG(迷彩) + MSBS Grot SG (Camo) + MSBS Grot SG (Camuflaje) + MSBS Grot SG (Camo) + MSBS Grot SG (Kamuflaż) + MSBS Grot SG (Камо) + MSBS Grot SG (Tarnmuster) + MSBS Grot SG (Kamufláž) + MSBS Grot SG (Camo) + MSBS Grot SG (위장) + MSBS Grot SG(迷彩) + MSBS Grot SG (カモフラージュ) + MSBS Grot SG (Kamuflaj) + MSBS Grot SG (Terepmintás) + + + MSBS Grot SG (Sand) + MSBS Grot SG(沙色) + MSBS Grot SG (Beige) + MSBS Grot SG (Arena) + MSBS Grot SG (Sabbia) + MSBS Grot SG (Piaskowy) + MSBS Grot SG (Песочный) + MSBS Grot SG (Sandfarben) + MSBS Grot SG (Písková) + MSBS Grot SG (Deserto) + MSBS Grot SG (모래) + MSBS Grot SG(沙色) + MSBS Grot SG (サンド) + MSBS Grot SG (Kum) + MSBS Grot SG (Homok) diff --git a/addons/realisticweights/CfgWeapons.hpp b/addons/realisticweights/CfgWeapons.hpp index 25b83815b46..47b35410bb7 100644 --- a/addons/realisticweights/CfgWeapons.hpp +++ b/addons/realisticweights/CfgWeapons.hpp @@ -218,6 +218,18 @@ class CfgWeapons { }; }; + class ACE_launch_NLAW_ready_F: launch_NLAW_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 195; // 275 - 80 + }; + }; + + class ACE_launch_NLAW_used_F: launch_NLAW_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 195; // 275 - 80 + }; + }; + // - RPG-32 --------------------------------------------------------------- class launch_RPG32_F: Launcher_Base_F { class WeaponSlotsInfo: WeaponSlotsInfo { diff --git a/addons/realisticweights/config.cpp b/addons/realisticweights/config.cpp index a26144aeca6..91c1ea00aa9 100644 --- a/addons/realisticweights/config.cpp +++ b/addons/realisticweights/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; + requiredAddons[] = {"ace_common","ace_disposable"}; author = ECSTRING(common,ACETeam); authors[] = {"BaerMitUmlaut"}; url = ECSTRING(main,URL); diff --git a/addons/rearm/ACE_ZeusActions.hpp b/addons/rearm/ACE_ZeusActions.hpp index 89fd4a6537e..2d05e34a4c0 100644 --- a/addons/rearm/ACE_ZeusActions.hpp +++ b/addons/rearm/ACE_ZeusActions.hpp @@ -4,13 +4,7 @@ class ACE_ZeusActions { displayName = CSTRING(Rearm); icon = QPATHTOF(ui\icon_rearm_interact.paa); condition = QUOTE(ZEUS_ACTION_CONDITION && {-1 < (curatorSelected select 0) findIf {_x isKindOf 'AllVehicles' && {!(_x isKindOf 'Man')}}}); - statement = QUOTE( \ - { \ - if (_x isKindOf 'AllVehicles' && {!(_x isKindOf 'Man')}) then { \ - [ARR_2(objNull,_x)] call ace_rearm_fnc_rearmEntireVehicleSuccess; \ - }; \ - } forEach (curatorSelected select 0); \ - ); + statement = QUOTE(call FUNC(rearm_statement)); }; }; }; diff --git a/addons/rearm/CfgAmmo.hpp b/addons/rearm/CfgAmmo.hpp index 54ff37e2799..78151796c07 100644 --- a/addons/rearm/CfgAmmo.hpp +++ b/addons/rearm/CfgAmmo.hpp @@ -60,6 +60,9 @@ class CfgAmmo { class B_20mm : BulletBase { GVAR(caliber) = 20; }; + class B_20mm_AP: BulletBase { + GVAR(caliber) = 20; + }; class B_25mm : BulletBase { GVAR(caliber) = 25; diff --git a/addons/rearm/XEH_PREP.hpp b/addons/rearm/XEH_PREP.hpp index 9ce53291444..79bd6c737fc 100644 --- a/addons/rearm/XEH_PREP.hpp +++ b/addons/rearm/XEH_PREP.hpp @@ -10,6 +10,7 @@ PREP(disable); PREP(dropAmmo); PREP(getAllRearmTurrets); PREP(getCaliber); +PREP(getMagazineName); PREP(getMaxMagazines); PREP(getNeedRearmMagazines); PREP(getSupplyCount); diff --git a/addons/rearm/XEH_postInit.sqf b/addons/rearm/XEH_postInit.sqf index e78f12e9f70..3da59af9bd8 100644 --- a/addons/rearm/XEH_postInit.sqf +++ b/addons/rearm/XEH_postInit.sqf @@ -29,3 +29,6 @@ if (isServer) then { [QGVAR(rearmSuccessEH), LINKFUNC(rearmSuccess)] call CBA_fnc_addEventHandler; [QGVAR(rearmSuccessLocalEH), LINKFUNC(rearmSuccessLocal)] call CBA_fnc_addEventHandler; + +GVAR(magazineNameCache) = [] call CBA_fnc_createNamespace; +GVAR(originalMagazineNames) = []; diff --git a/addons/rearm/XEH_preInit.sqf b/addons/rearm/XEH_preInit.sqf index 9361d05015e..10156a7d1c0 100644 --- a/addons/rearm/XEH_preInit.sqf +++ b/addons/rearm/XEH_preInit.sqf @@ -8,4 +8,13 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +DFUNC(rearm_statement) = { // moved from config because of build problems + TRACE_1("rearm_statement",_this); + { + if (_x isKindOf 'AllVehicles' && {!(_x isKindOf 'Man')}) then { + [objNull, _x] call FUNC(rearmEntireVehicleSuccess); + }; + } forEach (curatorSelected select 0); +}; + ADDON = true; diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index fdf1fe7e026..480cc900076 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -5,38 +5,44 @@ * * Arguments: * 0: Ammo Truck + * 1: Player * * Return Value: * ChildActions * * Example: - * [tank] call ace_rearm_fnc_addRearmActions + * [tank, player] call ace_rearm_fnc_addRearmActions * * Public: No */ -params ["_truck"]; +params ["_truck", "_player"]; -private _vehicles = nearestObjects [_truck, ["AllVehicles"], 20]; +private _vehicles = nearestObjects [_truck, ["AllVehicles"], GVAR(distance)]; _vehicles = _vehicles select {(_x != _truck) && {!(_x isKindOf "CAManBase")} && {!(_x getVariable [QGVAR(disabled), false])}}; -if (missionNamespace getVariable [QEGVAR(mk6mortar,useAmmoHandling), false]) then { - _vehicles = _vehicles select {!(_x isKindOf "Mortar_01_base_F")}; -}; - +private _cswCarryMagazines = []; private _vehicleActions = []; { private _vehicle = _x; - + // Array of magazines that can be rearmed in the vehicle private _needRearmMags = ([_vehicle] call FUNC(getNeedRearmMagazines)) apply {_x select 0}; - + // _needRearmMags without duplicates private _magazineHelper = _needRearmMags arrayIntersect _needRearmMags; _magazineHelper = _magazineHelper select {[_truck, _x] call FUNC(hasEnoughSupply)}; + + if (["ace_csw"] call EFUNC(common,isModLoaded)) then { + ([_vehicle] call EFUNC(csw,aceRearmGetCarryMagazines)) params ["_turretMagsCSW", "_allCarryMags"]; + TRACE_3("csw compat",_vehicle,_turretMagsCSW,_allCarryMags); + _cswCarryMagazines append _allCarryMags; + _magazineHelper = _magazineHelper - _turretMagsCSW; + }; + TRACE_2("can add",_x,_magazineHelper); - + if (!(_magazineHelper isEqualTo [])) then { private _icon = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Icon"); if !((_icon select [0, 1]) == "\") then { @@ -60,7 +66,7 @@ private _vehicleActions = []; { private _action = [ _x, - getText(configFile >> "CfgMagazines" >> _x >> "displayName"), + _x call FUNC(getMagazineName), getText(configFile >> "CfgMagazines" >> _x >> "picture"), {_this call FUNC(takeAmmo)}, {true}, @@ -80,10 +86,29 @@ private _vehicleActions = []; {}, [] ] call EFUNC(interact_menu,createAction); - + _vehicleActions pushBack [_action, _actions, _truck]; }; }; } forEach _vehicles; +if (!(_cswCarryMagazines isEqualTo [])) then { + _cswCarryMagazines = _cswCarryMagazines arrayIntersect _cswCarryMagazines; + _cswCarryMagazines = _cswCarryMagazines select {[_truck, _x] call FUNC(hasEnoughSupply)}; + private _baseAction = [QGVAR(cswTake), "CSW", "", {}, {true}] call EFUNC(interact_menu,createAction); + private _subActions = _cswCarryMagazines apply { + private _action = [ + _x, + _x call FUNC(getMagazineName), + getText(configFile >> "CfgMagazines" >> _x >> "picture"), + {_this call FUNC(takeAmmo)}, + {true}, + {}, + [_x, _player] + ] call EFUNC(interact_menu,createAction); + [_action, [], _truck]; + }; + _vehicleActions pushBack [_baseAction, _subActions, _truck]; +}; + _vehicleActions diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf index 6c37deb9384..c43c0ecbf28 100644 --- a/addons/rearm/functions/fnc_getCaliber.sqf +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -33,7 +33,7 @@ if (_tmpCal > 0) then { if (_tmpCal > 0) then { _cal = _tmpCal; } else { - diag_log format ["[ACE] ERROR: Undefined Ammo [%1 : %2]", _ammo, inheritsFrom (configFile >> "CfgAmmo" >> _ammo)]; + diag_log format ["[ACE] ERROR: Undefined Ammo [%1 : %2]", _ammo, configName inheritsFrom (configFile >> "CfgAmmo" >> _ammo)]; if (_ammo isKindOf "BulletBase") then { _cal = 8; } else { diff --git a/addons/rearm/functions/fnc_getMagazineName.sqf b/addons/rearm/functions/fnc_getMagazineName.sqf new file mode 100644 index 00000000000..f83d71e4702 --- /dev/null +++ b/addons/rearm/functions/fnc_getMagazineName.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Gets a non-ambigious display name for a magazine using displayNameShort (AP/HE) + * + * Arguments: + * 0: Magazine Classname + * + * Return Value: + * Display Name + * + * Example: + * ["B_20mm_AP"] call ace_rearm_fnc_getMagazineName + * + * Public: No + */ + +params ["_className"]; +TRACE_1("getMagazineName",_className); + +private _magName = GVAR(magazineNameCache) getVariable _className; +if (isNil "_magName") then { + private _displayName = getText(configFile >> "CfgMagazines" >> _className >> "displayName"); + if (_displayName == "") then { + _displayName = _className; + WARNING_1("Magazine is missing display name [%1]",_className); + }; + + if ((_displayName select [0,6]) == "[CSW] ") then { _displayName = _displayName select [6]; }; + + GVAR(magazineNameCache) setVariable [_className, _displayName]; + GVAR(originalMagazineNames) pushBack _displayName; + TRACE_2("Adding to cache",_className,_displayName); + + // go through all existing cache entries and update if there now are duplicates + { + private _xMagName = GVAR(magazineNameCache) getVariable _x; + if ((_xMagName == _displayName) && {({_xMagName == _x} count GVAR(originalMagazineNames)) > 1}) then { + private _xMagName = format ["%1: %2", _displayName, getText(configFile >> "CfgMagazines" >> _x >> "displayNameShort")]; + GVAR(magazineNameCache) setVariable [_x, _xMagName]; + TRACE_2("Using unique name",_x,_xMagName); + }; + } forEach (allVariables GVAR(magazineNameCache)); + + _magName = GVAR(magazineNameCache) getVariable _className; +}; + +_magName diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index e2a06075d5c..9dbcf463eb9 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -33,19 +33,19 @@ private _magazineInfo = []; private _pylonConfigs = configProperties [configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; { private _pylonConfig = _x; - + // Strangely, a 1-based index. private _pylonIndex = _forEachIndex + 1; - + // Retrieving pylon magazine by index. If the pylon is empty, it is marked with "". private _pylonMagazine = (getPylonMagazines _vehicle) select (_pylonIndex - 1); - + // Only care about pylons that have a magazine. if (!(_pylonMagazine isEqualTo "")) then { - + private _maxRounds = getNumber (configFile >> "CfgMagazines" >> _pylonMagazine >> "count"); private _currentRounds = _vehicle ammoOnPylon _pylonIndex; - + if (_currentRounds < _maxRounds) then { // getPylonTurret expects 0 based index, and returns driver turret as [-1] private _pylonTurret = [_vehicle, (_pylonIndex - 1)] call EFUNC(common,getPylonTurret); @@ -62,13 +62,13 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); // _magazines without duplicates private _magazineClasses = _magazines arrayIntersect _magazines; - + { private _magazineClass = _x; - + private _maxMagazines = [_vehicle, _turretPath, _magazineClass] call FUNC(getMaxMagazines); private _maxRoundsPerMag = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); - + /* Array of ammo counts in every magazine. Example: [200, 200, 152] means 2 mags with 200 * rounds and 1 mag with 152 rounds. */ private _currentRounds = [_vehicle, _turretPath, _magazineClass] call FUNC(getTurretMagazineAmmo); @@ -77,9 +77,10 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); /* If there is space for new magazines or if some magazines are not full, add the magazine * type to _magazineInfo. */ if ((_currentMagazines < _maxMagazines) || {({_x < _maxRoundsPerMag} count _currentRounds) > 0}) then { + if (_magazineClass == "FakeWeapon") exitWith {}; _magazineInfo pushBack [_magazineClass, _turretPath, false, -1, _maxMagazines, _currentMagazines, _maxRoundsPerMag, _currentRounds]; }; - + } forEach _magazineClasses; } forEach _turrets; diff --git a/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf b/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf index 2e914f3e7a6..fa73b59d847 100644 --- a/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf +++ b/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf @@ -23,5 +23,4 @@ params ["_vehicle", "_turretPath", "_magazineClass"]; -private _ammo = magazinesAllTurrets _vehicle select {(_x select 0) isEqualTo _magazineClass && {(_x select 1) isEqualTo _turretPath}} apply {_x select 2}; -_ammo +magazinesAllTurrets _vehicle select {(_x select 0) == _magazineClass && {(_x select 1) isEqualTo _turretPath}} apply {_x select 2} diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf index 232d6776ada..1af5d96a507 100644 --- a/addons/rearm/functions/fnc_hasEnoughSupply.sqf +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -1,20 +1,20 @@ #include "script_component.hpp" /* -* Author: GitHawk -* Check whether enough supply is left to take the magazine. -* -* Arguments: -* 0: Ammo Truck -* 1: Magazine Classname -* -* Return Value: -* Enough supply -* -* Example: -* [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply -* -* Public: No -*/ + * Author: GitHawk + * Check whether enough supply is left to take the magazine. + * + * Arguments: + * 0: Ammo Truck + * 1: Magazine Classname + * + * Return Value: + * Enough supply + * + * Example: + * [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply + * + * Public: No + */ params ["_truck", "_magazineClass"]; diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index 31edaa2684d..238e618dd2d 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -51,10 +51,10 @@ if (GVAR(supply) == 1) then { private _numChars = count (localize LSTRING(Hint_RemainingAmmo)); private _text = ""; private _magazines = _truck getVariable QGVAR(magazineSupply); - if !(isNil "_magazines") then { + if (!isNil "_magazines") then { { _x params ["_magazineClass", "_rounds"]; - private _line = format ["%1: %2", getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), _rounds]; + private _line = format ["%1: %2", _magazineClass call FUNC(getMagazineName), _rounds]; _numChars = _numChars max (count _line); _text = format ["%1
%2", _text, _line]; _supply = _supply + 0.5; diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf index bf703e9b6ba..6b5a3da12c6 100644 --- a/addons/rearm/functions/fnc_rearm.sqf +++ b/addons/rearm/functions/fnc_rearm.sqf @@ -36,11 +36,7 @@ if ((count _needRearmMagsOfClass) == 0) exitWith {ERROR_2("Could not find turret private _currentRearmableMag = _needRearmMagsOfClass select 0; _currentRearmableMag params ["", "_turretPath", "", "_pylon", "", "_magazineCount"]; -private _magazineDisplayName = getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"); -if (_magazineDisplayName == "") then { - _magazineDisplayName = _magazineClass; - ERROR_1("Magazine is missing display name [%1]",_magazineClass); -}; +private _magazineDisplayName = _magazineClass call FUNC(getMagazineName); [ TIME_PROGRESSBAR(REARM_DURATION_REARM select _idx), @@ -50,7 +46,7 @@ if (_magazineDisplayName == "") then { format [localize LSTRING(RearmAction), getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName"), _magazineDisplayName], { param [0] params ["_target", "_unit"]; - (_unit distanceSqr _target) <= REARM_ACTION_DISTANCE_SQR + _player distance _target <= GVAR(distance); }, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf index b3147f976c2..df06d384d45 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf @@ -28,7 +28,7 @@ TRACE_3("rearmEntireVehicle",_truck,_player,_vehicle); format [localize LSTRING(BasicRearmAction), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], { param [0] params ["", "_vehicle", "_player"]; - (_player distanceSqr _vehicle) <= REARM_ACTION_DISTANCE_SQR + _player distance _vehicle <= GVAR(distance); }, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf index 6d48cd338fd..8bf8244dd7a 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf @@ -22,6 +22,14 @@ TRACE_3("rearmEntireVehicleSuccessLocal",_truck,_vehicle,_turretPath); // Fetching all rearmable magazines in this turret private _magazines = ([_vehicle] call FUNC(getNeedRearmMagazines)) select {(_x select 1) isEqualTo _turretPath}; +if (["ace_csw"] call EFUNC(common,isModLoaded)) then { + ([_vehicle, _turretPath] call EFUNC(csw,aceRearmGetCarryMagazines)) params ["_turretMagsCSW", "_allCarryMags"]; + TRACE_1("skipping",_turretMagsCSW); + _magazines = _magazines select { + _x params ["_magazineClass"]; + (_turretMagsCSW findIf {_x == _magazineClass}) == -1 + }; +}; { _x params ["_magazineClass", "_magTurretPath", "_isPylonMag", "_pylonIndex", "_maxMagazines", "_currentMagazines", "_maxRoundsPerMag", "_currentRounds"]; diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index d141ca4a648..922d25b6469 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -30,7 +30,7 @@ if (_pylon > 0) exitWith { if (GVAR(level) == 1) then { // Fill magazine completely if (_turretPath isEqualTo [-1]) then {_turretPath = [];}; // Convert back to pylon turret format - TRACE_2("",_pylon,_magazineClass,_rounds); + TRACE_3("",_pylon,_magazineClass,_rounds); _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath]; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), @@ -40,7 +40,7 @@ if (_pylon > 0) exitWith { if (_turretPath isEqualTo [-1]) then {_turretPath = [];}; // Convert back to pylon turret format private _currentCount = _vehicle ammoOnPylon _pylon; private _newCount = ((_currentCount max 0) + _numRounds) min _rounds; - TRACE_2("",_pylon,_magazineClass,_newCount); + TRACE_3("",_pylon,_magazineClass,_newCount); _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath]; _vehicle setAmmoOnPylon [_pylon, _newCount]; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _numRounds, @@ -51,62 +51,43 @@ if (_pylon > 0) exitWith { private _currentRounds = 0; private _maxMagazines = [_vehicle, _turretPath, _magazineClass] call FUNC(getMaxMagazines); +private _ammoCounts = [_vehicle, _turretPath, _magazineClass] call FUNC(getTurretMagazineAmmo); +TRACE_3("start",_magazineClass,_maxMagazines,_ammoCounts); -if (_maxMagazines == 1) then { - private _currentMagazines = { _x == _magazineClass } count (_vehicle magazinesTurret _turretPath); - if (_currentMagazines == 0 && {!(_turretPath isEqualTo [-1])}) then { - // Driver gun will always retain it's magazines - _vehicle addMagazineTurret [_magazineClass, _turretPath]; - _vehicle setMagazineTurretAmmo [_magazineClass, 0, _turretPath]; +private _ammoToAdd = if (GVAR(level) == 2) then {_numRounds} else {_rounds}; +private _ammoAdded = 0; +private _arrayModified = false; // skip needing to remove and re-add mags, if we are only adding new ones + +{ + if (_x < _rounds) then { + private _xAdd = _ammoToAdd min (_rounds - _x); + _ammoToAdd = _ammoToAdd - _xAdd; + _ammoAdded = _ammoAdded + _xAdd; + TRACE_3("adding to existing mag",_forEachIndex,_x,_xAdd); + _ammoCounts set [_forEachIndex, _x + _xAdd]; + _arrayModified = true; }; - if (GVAR(level) == 1) then { - // Fill magazine completely - _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; - [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _rounds, - getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; +} forEach _ammoCounts; + +while {((count _ammoCounts) < _maxMagazines) && {_ammoToAdd > 0}} do { + private _xAdd = _ammoToAdd min _rounds; + _ammoToAdd = _ammoToAdd - _xAdd; + _ammoAdded = _ammoAdded + _xAdd; + _ammoCounts pushBack _xAdd; + if (!_arrayModified) then { + TRACE_1("adding new mag to array",_xAdd); } else { - // Fill only at most _numRounds - _vehicle setMagazineTurretAmmo [_magazineClass, ((_vehicle magazineTurretAmmo [_magazineClass, _turretPath]) + _numRounds) min _rounds, _turretPath]; - [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _numRounds, - getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; - }; -} else { - for "_idx" from 1 to (_maxMagazines+1) do { - _currentRounds = _vehicle magazineTurretAmmo [_magazineClass, _turretPath]; - if (_currentRounds > 0 || {_idx == (_maxMagazines+1)}) exitWith { - if (_idx == (_maxMagazines+1) && {!(_turretPath isEqualTo [-1])}) then { - _vehicle addMagazineTurret [_magazineClass, _turretPath]; - }; - if (GVAR(level) == 2) then { - //hint format ["Target: %1\nTurretPath: %2\nNumMagazines: %3\nMaxMagazines %4\nMagazine: %5\nNumRounds: %6\nMagazine: %7", _vehicle, _turretPath, _numMagazines, _maxMagazines, _currentRounds, _numRounds, _magazineClass]; - // Fill only at most _numRounds - if ((_currentRounds + _numRounds) > _rounds) then { - _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; - if (_numMagazines < _maxMagazines) then { - _vehicle addMagazineTurret [_magazineClass, _turretPath]; - _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds - _rounds, _turretPath]; - }; - } else { - _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds, _turretPath]; - }; - [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _numRounds, - getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; - } else { - // Fill current magazine completely and fill next magazine partially - _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; - if (_numMagazines < _maxMagazines) then { - _vehicle addMagazineTurret [_magazineClass, _turretPath]; - _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds, _turretPath]; - }; - [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _rounds, - getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; - }; - }; - _vehicle removeMagazineTurret [_magazineClass, _turretPath]; - _numMagazines = _numMagazines - 1; + TRACE_1("adding new mag directly",_xAdd); + _vehicle addMagazineTurret [_magazineClass, _turretPath, _xAdd]; }; }; +TRACE_3("finish",_ammoToAdd,_ammoAdded,_arrayModified); +if (_arrayModified) then { // only need to call this if we modified the array, otherwise they are already added + [_vehicle, _turretPath, _magazineClass, _ammoCounts] call FUNC(setTurretMagazineAmmo); +}; + +if (_ammoAdded == 0) exitWith {ERROR_1("could not load any ammo - %1",_this);}; + +[QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _ammoAdded, +_magazineClass call FUNC(getMagazineName), +getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; diff --git a/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf b/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf index 984d382e089..a8b83c723aa 100644 --- a/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf +++ b/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf @@ -30,7 +30,7 @@ private _magLoadedInWeapon = false; private _loadedWeapon = ""; { private _currentlyLoadedMag = (weaponState [_vehicle, _turretPath, _x]) select 3; - + if (_currentlyLoadedMag isEqualTo _magazineClass) exitWith { _magLoadedInWeapon = true; _loadedWeapon = _x; @@ -47,37 +47,36 @@ if (!_magLoadedInWeapon) then { { _vehicle addMagazineTurret [_magazineClass, _turretPath, _x]; } forEach _ammoCounts; - } else { /* Special hack case: * The magazine class was loaded into a weapon. If the weapon has more than one type of * magazine (e.g. AP and HEAT in a cannon), then removing all magazines would trigger the * weapon to load a different magazine type. For example, removing the HEAT shells while HEAT * is loaded makes the cannon switch to AP. - * + * * To prevent that, we must remove all magazines that would fit into the weapon and then add * them back with the magazine-to-be-loaded being the first. */ - private _allowedMagClassesInWeapon = getArray (configFile >> "CfgWeapons" >> _loadedWeapon >> "magazines"); - + private _allowedMagClassesInWeapon = [_loadedWeapon, true] call CBA_fnc_compatibleMagazines; + /* Current ammo counts of all allowed magazine classes in weapon. * Example: [["8Rnd_82mm_Mo_shells", [8, 8, 2]], ["8Rnd_82mm_Mo_Flare_white", [7]]] */ private _ammoCountsByMagClass = _allowedMagClassesInWeapon apply {[_x, ([_vehicle, _turretPath, _x] call FUNC(getTurretMagazineAmmo))]}; - + // Removing all magazines that fit into the weapon. { _vehicle removeMagazinesTurret [_x, _turretPath]; } forEach _allowedMagClassesInWeapon; - + // Adding the mags of the given class first with updated ammo counts. { _vehicle addMagazineTurret [_magazineClass, _turretPath, _x]; } forEach _ammoCounts; - + // Adding back all other magazines with their original ammo counts. { _x params ["_loopMagClass", "_loopAmmoCounts"]; - + if (!(_loopMagClass isEqualTo _magazineClass)) then { { _vehicle addMagazineTurret [_loopMagClass, _turretPath, _x]; diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf index 7d4427e1a25..18b316d6015 100644 --- a/addons/rearm/functions/fnc_storeAmmo.sqf +++ b/addons/rearm/functions/fnc_storeAmmo.sqf @@ -21,6 +21,8 @@ params ["_truck", "_unit"]; private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; if (isNull _attachedDummy) exitwith {}; +private _magazineClass = _attachedDummy getVariable [QGVAR(magazineClass), "#noVar"]; + [ TIME_PROGRESSBAR(5), [_unit, _truck, _attachedDummy], @@ -31,7 +33,7 @@ if (isNull _attachedDummy) exitwith {}; [_unit, true, true] call FUNC(dropAmmo); }, "", - format [localize LSTRING(StoreAmmoAction), getText(configFile >> "CfgMagazines" >> (_attachedDummy getVariable QGVAR(magazineClass)) >> "displayName"), getText(configFile >> "CfgVehicles" >> (typeOf _truck) >> "displayName")], + format [localize LSTRING(StoreAmmoAction), _magazineClass call FUNC(getMagazineName), getText(configFile >> "CfgVehicles" >> (typeOf _truck) >> "displayName")], {true}, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf index 1576044eb1b..1c1e325de88 100644 --- a/addons/rearm/functions/fnc_takeAmmo.sqf +++ b/addons/rearm/functions/fnc_takeAmmo.sqf @@ -8,7 +8,7 @@ * 1: Unit * 2: Params * 0: Magazine Classname - * 1: Vehicle to be armed + * 1: Vehicle to be armed or player * * Return Value: * None @@ -27,12 +27,18 @@ TRACE_5("takeAmmo",_truck,_unit,_args,_magazineClass,_vehicle); REARM_HOLSTER_WEAPON; +private _targetName = if (_vehicle == _unit) then { + "CSW" +} else { + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName") +}; + [ TIME_PROGRESSBAR(REARM_DURATION_TAKE select _idx), - [_unit, _magazineClass, _truck], + [_unit, _magazineClass, _truck, _vehicle], FUNC(takeSuccess), "", - format [localize LSTRING(TakeAction), getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], + format [localize LSTRING(TakeAction), _magazineClass call FUNC(getMagazineName), _targetName], {true}, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf index 3986b21484d..e00d430f999 100644 --- a/addons/rearm/functions/fnc_takeSuccess.sqf +++ b/addons/rearm/functions/fnc_takeSuccess.sqf @@ -8,19 +8,20 @@ * 0: Unit * 1: Magazine Classname * 2: Ammo Truck + * 3: Target Vehicle or Player * * Return Value: * None * * Example: - * [[player, "500Rnd_127x99_mag_Tracer_Red"]] call ace_rearm_fnc_takeSuccess + * [[player, "500Rnd_127x99_mag_Tracer_Red", ammoTruck, targetVehicle]] call ace_rearm_fnc_takeSuccess * * Public: No */ params ["_args"]; -_args params ["_unit", "_magazineClass", "_truck"]; -TRACE_3("takeSuccess",_unit,_magazineClass,_truck); +_args params ["_unit", "_magazineClass", "_truck", "_vehicle"]; +TRACE_4("takeSuccess",_unit,_magazineClass,_truck,_vehicle); private _success = true; if (GVAR(supply) > 0) then { @@ -28,6 +29,13 @@ if (GVAR(supply) > 0) then { }; if !(_success) exitWith {WARNING_2("takeSuccess failed to take [%1] from [%2]",_magazineClass,_truck);}; +if (_vehicle == _unit) exitWith { + ([_magazineClass] call FUNC(getCaliber)) params ["", "_idx"]; + private _rounds = (REARM_COUNT select _idx); + TRACE_4("passing to csw",_unit,_magazineClass,_idx,_rounds); + [_unit, _magazineClass, _rounds] call EFUNC(csw,reload_handleReturnAmmo); +}; + [_unit, "forceWalk", "ACE_rearm", true] call EFUNC(common,statusEffect_set); [_unit, "blockThrow", "ACE_rearm", true] call EFUNC(common,statusEffect_set); private _dummy = [_unit, _magazineClass] call FUNC(createDummy); diff --git a/addons/rearm/initSettings.sqf b/addons/rearm/initSettings.sqf index 0e5e4217476..3cac2fead7e 100644 --- a/addons/rearm/initSettings.sqf +++ b/addons/rearm/initSettings.sqf @@ -17,3 +17,12 @@ true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_settings_fnc_init; + +[ + QGVAR(distance), "SLIDER", + [localize LSTRING(RearmSettings_distance_DisplayName), localize LSTRING(RearmSettings_distance_Description)], + [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + [10, 50, 20, 0], + true, // isGlobal + {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_settings_fnc_init; diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index 31210642f45..d35e0fbec68 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -10,6 +10,9 @@ 再武装 Réarmement Dozbrajanie + Перевооружение + Rearme + Přezbrojení Rearm Settings @@ -35,7 +38,7 @@ Tento modul umožňuje upravovat systém přezbrojení. Questo modulo ti consente di cambiare le impostazioni del sistema Riarmo. Este módulo permite cambiar los parámetros de rearme. - Ce module autorise l'amélioration du système de réarmement. + Ce module vous permet d'ajuster les paramètres du système de réarmement. 再武装システムの設定を微調整します。 이 모듈은 재보급시의 설정을 바꿀수 있게해줍니다. 此模块允许你调整整装系统设定 @@ -45,7 +48,7 @@ Rearm Amount Aufmunitioniermenge Szybkość dozbrajania - Количество вооружения + Степень перевооружения Quantidade de rearme Rychlost přezbrojení Ammontare Riarmo @@ -60,12 +63,12 @@ How fast should a vehicle be rearmed? Wie schnell soll ein Fahrzeug aufmunitioniert werden? Jak szybko pojazd zostanie dozbrajania? - Как быстро техника должна перевооружаться? + Насколько быстро должна перевооружаться техника? Quão rápido o veículo deve ser rearmado? Jak rychle bude vozidlo přezbrojeno? Quanto velocemente dovrebbe essere riarmato un veicolo? Cuán rápido es el proceso de rearme? - A quelle vitesse devrait être réarmé un véhicule ? + Définit la vitesse à laquelle s'effectue le réarmement. 車両を再武装する早さを設定します。 차량을 얼마나 빨리 재보급 시킵니까? 载具多快会整装完毕? @@ -75,12 +78,12 @@ Entire Vehicle Gesamtes Fahrzeug Cały pojazd - Полностью техника + Техника полностью Todo o veículo Celé vozidlo Tutto il Veicolo Vehículo completo - Véhicule entier + Tout le véhicule 車両全体 모든 차량 整个载具 @@ -90,12 +93,12 @@ Entire Magazine Gesamtes Magazin Cały magazynek - Полный магазин + Магазин полностью Todo o carregador Celý zásobník Tutto il Caricatore Cargador completo - Chargeur entier + Le chargeur entier マガジン全体 모든 탄창 整个弹匣 @@ -105,12 +108,12 @@ Amount based on caliber Kaliberbasierte Anzahl Ilość zależna od kalibru - Количество зависит от калибра + В зависимости от калибра Quantidade baseada no calibre Rychlost závisí na ráži Ammontare basato sul calibro Cantidad basada en el calibre - Quantité basée sur le calibre + En fonction du calibre 口径に基づいた量 구경에 따라 수량 설정 基于口径决定所耗时间 @@ -125,7 +128,10 @@ 彈藥補給 Zapas amunicji 탄약 보급 - Approvisionnement en munitions + Quantité d'approvisionnement + Запас боеприпасов + Suprimento de Munições + Zásoba munice How much ammunition does an ammo truck carry? @@ -136,7 +142,10 @@ 彈藥卡車會攜帶多少的彈藥? Ile amunicji przewozi ciężarówka? 탄약 차량은 얼마나 많은 양의 탄약을 가질 수 있음? - Quelle quantité de munitions un camion doit-il transporter ? + Définit la quantité de munitions que le camion de ravitaillement transporte. + Какой боезапас перевозит грузовик с боеприпасами? + Quanta munição um caminhão de munições carrega? + Kolik munice naklaďák uveze? Unlimited ammo supply @@ -147,7 +156,10 @@ 無限彈藥 Nielimitowany zapas amunicji 무한의 탄약 - Approvisionnement en munitions illimité + Munitions illimitées + Неограниченный боезапас + Suprimento Ilimitado de Munição + Nekonečná zásoba Limited ammo supply based on caliber @@ -158,7 +170,10 @@ 基於口徑限制彈藥數量 Zapas amunicji zależny od kalibru 구경에 따라 제한된 탄약 - Approvisionnement en munitions limité basé sur le calibre. + En fonction du calibre + Ограниченный боезапас в зависимости от калибра + Munição Limitada ao Calibre + Konečná zásoba v závislosti na kalibru Only specific Magazines @@ -169,7 +184,10 @@ 只有指定的彈藥 Tylko konkretne magazynki 특정 탄약만 - Seulement des chargeurs spécifiques + Chargeurs spécifiques uniquement + Только определенные магазины + Apenas carregadores específicos + Pouze specifické zásobníky Check remaining ammunition @@ -181,6 +199,9 @@ Sprawdź ilość amunicji 남은 탄약 확인 Vérifier les munitions restantes + Проверить остаток БК + Checar munição restante + Zkontrolovat zbývající munici Checking remaining ammunition... @@ -192,6 +213,9 @@ Sprawdzanie ilości amunicji... 남은 탄약 확인중... Vérification des munitions restantes... + Проверка остатка боекомплекта... + Checando Munição... + Kontroluji zbývající munici... There is ammunition worth %1 points left. @@ -203,6 +227,9 @@ Pozostało %1 punktów amunicji. 여기에는 최소 %1 포인트의 탄약이 남았습니다. Il reste des munitions d'une valeur de %1 points. + Остаток единиц БК: %1 + Possui munição equivalente a %1 pontos restantes. + Zbývá ještě %1 muničních bodů. The following ammunition is left:%1 @@ -213,7 +240,10 @@ 以下剩餘的彈藥:%1 Pozostała amunicja: %1 다음의 탄약이 남음 : %1 - Il reste les munitions suivantes %1 + Il reste les munitions suivantes : %1. + Оставшийся боекомплект: %1 + A munição que restou: %1 + Zbývá následující munice:%1 There is no ammunition left. @@ -224,7 +254,10 @@ 已經沒有剩餘的彈藥了. Brak amunicji w zapasie. 여기에는 탄약이 남지 않았습니다. - Il n'y a plus de munitions + Il n'y a plus de munitions. + Запас боекомплекта пуст + Não há munição sobrando. + Už nezbývá žádná munice. Rearm @@ -240,6 +273,7 @@ 재보급 整装 整裝 + Yeniden Doldur Rearming %1 with %2... @@ -280,7 +314,7 @@ Beru %1 pro %2... Sto prendendo %1 per %2... Tomando %1 para %2... - Prend %1 pour %2... + Prise de %1 pour %2... %1を%2用として取得中… %2를 위해 %1 가져오는중... 拿取%1给%2中... @@ -300,6 +334,7 @@ 탄약 가지기 取得弹药 取得彈藥 + Cephane al Pick up ammo @@ -315,6 +350,7 @@ 탄약 줍기 捡起弹药 撿起彈藥 + Cephaneyi al Store ammo @@ -359,6 +395,7 @@ 탄약 줍는중... 捡起弹药中... 撿起彈藥中... + Sbírám munici... Rearmed %1 rounds of %2 on %3 @@ -369,7 +406,7 @@ Přezbrojeno % nábojů z %2 u %3 Riarmati %1 colpi di %2 su %3 Rearmadas %1 rondas de %2 en %3 - %1 balles réarmées de %2 dans %3 + %1 balles réarmées de %2 dans %3. %1発の%2を%3に装填しました %3에 2%의 %1 탄약 재보급 整装了%1发%2到%3上 @@ -389,6 +426,7 @@ 연막 차장 烟幕弹 煙幕彈 + Sis Ekranı Flares @@ -404,6 +442,7 @@ 기만체 热焰弹 熱焰彈 + Flareler 30mm HEI @@ -414,11 +453,12 @@ 30mm HEI 30mm HEI 30mm HEI - 30mm HEI - 30mm 焼夷りゅう弾 + 30 mm HEI + 30mm HEI 30mm 고폭소이탄 30mm 高爆燃烧弹 30mm 高爆燃燒彈 + 30mm HEI 30mm HEI-T @@ -429,11 +469,12 @@ 30mm HEI-T 30mm HEI-T 30mm HEI-T - 30mm HEI-T - 30mm 焼夷曳光りゅう弾 + 30 mm HEI-T + 30mm HEI-T 30mm 고폭소이예광탄 30mm 高爆燃烧曳光弹 30mm 高爆燃燒曳光彈 + 30mm HEI-T AIM-9 Sidewinder @@ -449,6 +490,7 @@ AIM-9 Sidewinder AIM-9 响尾蛇 AIM-9 響尾蛇 + AIM-9 Sidewinder Wympel R-73 @@ -464,6 +506,7 @@ Vympel R-73 Wympel R-73 Wympel R-73 + Wympel R-73 AGM-65 Maverick @@ -479,6 +522,7 @@ AGM-65 Maverick AGM-65 小牛 AGM-65 小牛 + AGM-65 Maverick Kh-25MTP @@ -494,6 +538,7 @@ Kh-25MTP Kh-25MTP Kh-25MTP + Kh-25MTP Hydra 70 HE @@ -505,10 +550,11 @@ Hydra 70 HE Hydra 70 HE Hydra 70 HE - ハイドラ 70 りゅう弾 + ハイドラ 70 HE Hydra 70 고폭탄 九头蛇 70 高爆弹 九頭蛇 70 高爆彈 + Hydra 70 HE S-8 HE @@ -520,10 +566,11 @@ S-8 HE S-8 HE S-8 HE - S-8 りゅう弾 + S-8 HE S-8 고폭탄 S-8 高爆弹 S-8 高爆彈 + S-8 HE Hydra 70 AP @@ -534,11 +581,12 @@ Hydra 70 AP Hydra 70 AP Hydra 70 AP - Hydra 70 徹甲弾 + Hydra 70 AP ハイドラ 70 AP Hydra 70 철갑탄 九头蛇 70 反人员弹 九頭蛇 70 反人員彈 + Hydra 70 AP S-8 AP @@ -550,10 +598,11 @@ S-8 AP S-8 AP S-8 AP - S-8 徹甲弾 + S-8 AP S-8 철갑탄 S-8 反人员弹 S-8 反人員彈 + S-8 AP GBU-12 @@ -569,6 +618,7 @@ GBU-12 GBU-12 GBU-12 + GBU-12 FAB-250M-54 @@ -584,6 +634,7 @@ FAB-250M-54 FAB-250M-54 FAB-250M-54 + FAB-250M-54 Rearm Cargo @@ -591,6 +642,11 @@ 再武装用カーゴ Ładunek Dozbrajający Rifornimento Munizioni + Боеприпасы для перевооружения + Carga de Rearme + 整裝用貨物 + Stock de munitions + Sklad munice The cargo for rearming (-1 disable) @@ -598,6 +654,35 @@ カーゴからの再武装 (-1 で無効化) Ładunek do dozbrajania (-1 wyłączy) Il rifornimento delle munizioni (-1 per disabilitarlo) + Объем боеприпасов для перевооружения (-1 для отмены) + A Carga para Rearmamento (-1 para desativar) + 貨物可以提高多少次整裝(-1為停用) + Le quantité de munitions (en points), qui est disponible pour du réarmement (-1 pour désactiver). + Objekt pro přezbrojování (-1 pro vypnutí) + + + Rearm distance + Distance de réarmement + Aufrüstbereich + Distância para Rearmar + 再武装距離 + 整裝距離 + Distanza di riarmo + Přezbrojovací vzdálenost + Odległość przezbrojenia + Дистанция перевооружения + + + The maximum distance a vehicle can be rearmed at + Distance maximale à laquelle un véhicule peut être réarmé. + Die maximale Distanz, über die ein Fahrzeug Aufmunitioniert werden kann + A distância máxima que um veículo pode ser rearmado/municiado. + 車両から再武装できる範囲を決定します。 + 與載具之最大可整裝距離 + La distanza massima a cui un veicolo può essere riarmato + Maximální vzdálenost na jakou může být vozidlo přezbrojeno + Maksymalna odległość na jakiej pojazd może zostać przezbrojony + Максимальная дистанция для перевооружения diff --git a/addons/recoil/CfgEventHandlers.hpp b/addons/recoil/CfgEventHandlers.hpp index c0726f161a5..becf3950523 100644 --- a/addons/recoil/CfgEventHandlers.hpp +++ b/addons/recoil/CfgEventHandlers.hpp @@ -13,6 +13,6 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/recoil/functions/fnc_camshake.sqf b/addons/recoil/functions/fnc_camshake.sqf index fff9fecd6c4..72b9bcd0607 100644 --- a/addons/recoil/functions/fnc_camshake.sqf +++ b/addons/recoil/functions/fnc_camshake.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [player, (currentWeapon player), (currentMuzzle player)] call ace_recoil_fnc_camShake; + * [player, (currentWeapon player), (currentMuzzle player)] call ace_recoil_fnc_camshake; * * Public: No */ @@ -69,6 +69,6 @@ private _camshake = [ BASE_FREQ ]; -TRACE_4("addCamShake",_recoil,_powerCoef,_powerMod,_camshake);\ +TRACE_4("addCamShake",_recoil,_powerCoef,_powerMod,_camshake); addCamShake _camshake; diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp index efcd1aa3a23..445cfeaad74 100644 --- a/addons/refuel/CfgVehicles.hpp +++ b/addons/refuel/CfgVehicles.hpp @@ -358,6 +358,11 @@ class CfgVehicles { GVAR(canReceive) = 0; }; + class UGV_02_Base_F: Tank_F { + // ED-1D and ED-1E are electrical + GVAR(canReceive) = 0; + }; + class UAV: Plane {}; class UAV_02_base_F: UAV { diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index 43933f2cf53..e6c0ad5b932 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -62,36 +62,26 @@ GVAR(actions) = [ ]; // init menu for config refuel vehicles -private _sourceClasses = []; +private _cacheRefuelClasses = call (uiNamespace getVariable [QGVAR(cacheRefuelClasses), {[[],[]]}]); +_cacheRefuelClasses params [["_staticClasses", [], [[]]], ["_dynamicClasses", [], [[]]]]; + { - private _fuelCargo = getNumber (_x >> QGVAR(fuelCargo)); - if (_fuelCargo > 0 || {_fuelCargo == REFUEL_INFINITE_FUEL}) then { - private _sourceClass = configName _x; - // check if we can use actions with inheritance - if ( - !isText (_x >> "EventHandlers" >> "CBA_Extended_EventHandlers" >> "init") // addActionToClass relies on XEH init - || {configName _x isKindOf "Static"} // CBA_fnc_addClassEventHandler doesn't support "Static" class - ) then { - if (2 == getNumber (_x >> "scope")) then { - [_sourceClass, 0, ["ACE_MainActions"], GVAR(mainAction)] call EFUNC(interact_menu,addActionToClass); - { - [_sourceClass, 0, ["ACE_MainActions", QGVAR(Refuel)], _x] call EFUNC(interact_menu,addActionToClass); - } forEach GVAR(actions); - TRACE_1("add menu to static",_sourceClass); - }; - } else { - if (0 == {_sourceClass isKindOf _x} count _sourceClasses) then { - _sourceClasses pushBack _sourceClass; - [_sourceClass, 0, ["ACE_MainActions"], GVAR(mainAction), true] call EFUNC(interact_menu,addActionToClass); - { - [_sourceClass, 0, ["ACE_MainActions", QGVAR(Refuel)], _x, true] call EFUNC(interact_menu,addActionToClass); - } forEach GVAR(actions); - TRACE_1("add menu to dynamic",_sourceClass); - }; - }; - }; -} forEach ('true' configClasses (configFile >> "CfgVehicles")); + private _className = _x; + [_className, 0, ["ACE_MainActions"], GVAR(mainAction)] call EFUNC(interact_menu,addActionToClass); + { + [_className, 0, ["ACE_MainActions", QGVAR(Refuel)], _x] call EFUNC(interact_menu,addActionToClass); + } forEach GVAR(actions); + TRACE_1("add menu to static",_x); +} forEach _staticClasses; +{ + private _className = _x; + [_className, 0, ["ACE_MainActions"], GVAR(mainAction), true] call EFUNC(interact_menu,addActionToClass); + { + [_className, 0, ["ACE_MainActions", QGVAR(Refuel)], _x, true] call EFUNC(interact_menu,addActionToClass); + } forEach GVAR(actions); + TRACE_1("add menu to dynamic",_x); +} forEach _dynamicClasses; #ifdef DRAW_HOOKS_POS addMissionEventHandler ["Draw3D", { diff --git a/addons/refuel/XEH_preStart.sqf b/addons/refuel/XEH_preStart.sqf index 022888575ed..fa5fe4acda1 100644 --- a/addons/refuel/XEH_preStart.sqf +++ b/addons/refuel/XEH_preStart.sqf @@ -1,3 +1,30 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +// cache refuel vehicles, see XEH_postInit.sqf +private _staticClasses = []; +private _dynamicClasses = []; + +{ + private _fuelCargo = getNumber (_x >> QGVAR(fuelCargo)); + if (_fuelCargo > 0 || {_fuelCargo == REFUEL_INFINITE_FUEL}) then { + private _sourceClass = configName _x; + // check if we can use actions with inheritance + if ( + !isText (_x >> "EventHandlers" >> "CBA_Extended_EventHandlers" >> "init") // addActionToClass relies on XEH init + || {configName _x isKindOf "Static"} // CBA_fnc_addClassEventHandler doesn't support "Static" class + ) then { + if (2 == getNumber (_x >> "scope")) then { + _staticClasses pushBackUnique _sourceClass; + }; + } else { + if (-1 == _dynamicClasses findIf {_sourceClass isKindOf _x}) then { + _dynamicClasses pushBackUnique _sourceClass; + }; + }; + }; +} forEach ('true' configClasses (configFile >> "CfgVehicles")); + +TRACE_2("compiled",count _staticClasses,count _dynamicClasses); +uiNamespace setVariable [QGVAR(cacheRefuelClasses), compileFinal str [_staticClasses, _dynamicClasses]]; diff --git a/addons/refuel/functions/fnc_dropNozzle.sqf b/addons/refuel/functions/fnc_dropNozzle.sqf index e49872a2790..69b08b90261 100644 --- a/addons/refuel/functions/fnc_dropNozzle.sqf +++ b/addons/refuel/functions/fnc_dropNozzle.sqf @@ -29,11 +29,16 @@ _nozzle setVelocity [0, 0, 0]; private _groundPosition = getPosASL _nozzle; private _posA = (getPosASL _nozzle) vectorAdd [0,0,0.05]; -private _posB = (getPosASL _nozzle) vectorAdd [0,0,-1000]; +private _posB = (getPosASL _nozzle) vectorAdd [0,0,- GVAR(hoseLength)]; private _intersections = lineIntersectsSurfaces [_posA, _posB, _unit, _nozzle, true, 1, "GEOM"]; TRACE_1("",_intersections); if (_intersections isEqualTo []) then { - _groundPosition set [2, (getTerrainHeightASL _groundPosition) + 0.005]; + WARNING_1("no ground intersections for nozzle drop @ %1",_groundPosition); + if (!isNull _unit) then { + _groundPosition = getPosASL _unit; // place at unit's feet + } else { + _groundPosition set [2, (getTerrainHeightASL _groundPosition) + 0.005]; + }; } else { _groundPosition = ((_intersections select 0) select 0) vectorAdd [0,0,0.005]; }; diff --git a/addons/refuel/functions/fnc_refuel.sqf b/addons/refuel/functions/fnc_refuel.sqf index 4717f1206c8..f3e042cd563 100644 --- a/addons/refuel/functions/fnc_refuel.sqf +++ b/addons/refuel/functions/fnc_refuel.sqf @@ -93,6 +93,8 @@ if (_maxFuel == 0) then { }; _unit setVariable [QGVAR(tempFuel), _fuelInSink]; + [QGVAR(tick), [_source, _sink, _rateTime]] call CBA_fnc_localEvent; + [QEGVAR(common,setFuel), [_sink, _fuelInSink], _sink] call CBA_fnc_targetEvent; [_source, _fuelInSource] call FUNC(setFuel); } else { @@ -100,6 +102,7 @@ if (_maxFuel == 0) then { }; if (_finished) exitWith { + [QGVAR(stopped), [_source, _sink]] call CBA_fnc_localEvent; _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; }; diff --git a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf index 7f4d936ed37..9fae9abdabb 100644 --- a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf +++ b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf @@ -72,7 +72,7 @@ TRACE_2("start",_unit,_nozzle); }; if !(_unit == vehicle _unit && {_unit isEqualTo ACE_player}) exitWith { - TRACE_1("stop vehicle/player",_unit,vehicle _unit); + TRACE_2("stop vehicle/player",_unit,vehicle _unit); DROP_NOZZLE UNHOLSTER_WEAPON END_PFH diff --git a/addons/refuel/functions/fnc_turnOff.sqf b/addons/refuel/functions/fnc_turnOff.sqf index 1448a0d1450..6b5f17a95df 100644 --- a/addons/refuel/functions/fnc_turnOff.sqf +++ b/addons/refuel/functions/fnc_turnOff.sqf @@ -21,3 +21,4 @@ params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; [LSTRING(Hint_Stopped), 1.5, _unit] call EFUNC(common,displayTextStructured); +[QGVAR(stopped), [_nozzle getVariable QGVAR(source), _nozzle getVariable QGVAR(sink)]] call CBA_fnc_localEvent; diff --git a/addons/refuel/functions/fnc_turnOn.sqf b/addons/refuel/functions/fnc_turnOn.sqf index 4cbbc0033d2..b96cc6cda4e 100644 --- a/addons/refuel/functions/fnc_turnOn.sqf +++ b/addons/refuel/functions/fnc_turnOn.sqf @@ -21,3 +21,4 @@ params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; _nozzle setVariable [QGVAR(lastTickMissionTime), CBA_missionTime]; _nozzle setVariable [QGVAR(isRefueling), true, true]; [LSTRING(Hint_Started), 1.5, _unit] call EFUNC(common,displayTextStructured); +[QGVAR(started), [_nozzle getVariable QGVAR(source), _nozzle getVariable QGVAR(sink)]] call CBA_fnc_localEvent; diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml index 9595ad40c14..3bd3d3cfda0 100644 --- a/addons/refuel/stringtable.xml +++ b/addons/refuel/stringtable.xml @@ -10,11 +10,12 @@ Nastavení tankování Impostazioni Rifornimento Parámetros de reabastecimiento - Réglages de ravitaillement + Paramètres de ravitaillement 給油設定 재급유 설정 加油设定 加油設定 + Yakıt Doldurma Ayarları Flow Rate @@ -25,11 +26,12 @@ Rychlost tankování Portata Flusso Caudal de llenado - Vitesse du ravitaillement + Débit de la pompe 流量 주유량 油料流量 油料流量 + Doldurma Hızı How fast should a vehicle be refueled? @@ -40,11 +42,12 @@ Jak rychle bude vozidlo natankováno? Quanto velocemente dovrebbe essere rifornito un veicolo? Cuán rápido se reabastecen los vehículos? - A quelle vitesse devrait être ravitaillé un véhicule ? + Définit la vitesse de ravitaillement en carburant des véhicules. どのくらいの速さで車両へ給油しますか? 차량이 얼마나 빨리 재급유될 수 있습니까? 载具多快会加油完毕? 載具多快會加油完畢? + Bir araca ne kadar hızlı yakıt ikmali yapılmalıdır? Refuel @@ -55,11 +58,12 @@ Natankovat Rifornisci Reabastecer - Ravitaillement + Faire le plein 給油 재급유 加油 加油 + Yakıt Doldurma Take fuel nozzle @@ -70,11 +74,12 @@ Vzít výdejní pistoli Prendi manica benzina Tomar surtidor - Prendre la pompe + Prendre le pistolet 給油ノズルを取る 주유기 획득 拿取燃料喷嘴 拿取燃料噴嘴 + Yakıt Pompasını Al Taking fuel nozzle... @@ -85,11 +90,12 @@ Beru výdejní pistoli... Prendendo manicotto benzina... Tomando surtidor... - Prise de la pompe... + Prise du pistolet... 給油ノズルを取っています・・・ 주유기 획득중... 拿取燃料喷嘴中... 拿取燃料噴嘴中... + Yakıt Pompası Alınıyor... Connect fuel nozzle @@ -100,11 +106,12 @@ Připojit výdejní pistoli Collega manica benzina Conectar surtidor - Connecter la pompe + Introduire le pistolet 給油ノズルを接続する 주유기 꼽기 连接燃料喷嘴 連接燃料噴嘴 + Yakıt Pompasını Bağla Connecting fuel nozzle... @@ -115,11 +122,12 @@ Připojuji výdejní pistoli... Collegando manicotto benzina... Conectando surtidor... - Connection de la pompe... + Introduction du pistolet... 給油ノズルを接続しています・・・ 주유기 꼽는중... 连结燃料喷嘴中... 連結燃料噴嘴中... + Yakıt Pompası Bağlanıyor... Disconnect fuel nozzle @@ -130,11 +138,12 @@ Odpojit výdejní pistoli Scollega manicotto benzina Desconectar surtidor - Déconnecter la pompe - 給油ノズルを外しました + Retirer le pistolet + 給油ノズルを外す 주유기 뽑기 断开燃料喷嘴 斷開燃料噴嘴 + Yakıt Pompası Çıkar Connect @@ -145,11 +154,12 @@ Připojit Collega Conectar - Connecter + Raccorder 接続 꼽기 连结 連結 + Bağlan Check remaining fuel @@ -165,6 +175,7 @@ 남은 연료 확인 检查剩余燃料 檢查剩餘燃料 + Kalan yakıtı kontrol et Checking remaining fuel... @@ -175,11 +186,12 @@ Kontroluji zůstatek paliva... Controllando la benzina rimanente... Verificando combustible remanente,,, - Vérifie le carburant restant... + Vérification du carburant restant... 残燃料を見ています・・・ 남은 연료 확인중... 检查剩余燃料中... 檢查剩餘燃料中... + Kalan Yakıt Kontrol Ediliyor... There are %1 liters left. @@ -195,6 +207,7 @@ %1 리터 남음 剩下%1公升的燃料。 剩下%1公升的燃料。 + %1 litre kaldı. There is no fuel left. @@ -210,6 +223,7 @@ 연료 없음. 没有剩余的燃料 沒有剩餘的燃料 + Yakıt Kalmadı Cancel @@ -225,6 +239,7 @@ 취소 取消 取消 + Iptal Failed @@ -235,11 +250,12 @@ Neúspěšný Fallito Falló - Echoué + Échec 失敗 실패 失败 失敗 + Başarısız Stop fueling @@ -255,6 +271,7 @@ 그만 재급유하기 停止加油 停止加油 + Yakıt Doldurmayı Durdur Start fueling @@ -265,11 +282,12 @@ Začít tankovat Inizia rifornimento Comenzar reabastecimiento - Débute le ravitaillement + Débuter le ravitaillement 給油を始める 재급유 시작 开始加油 開始加油 + Yakıt Doldurmayı Başlat Couldn't turn on fuel nozzle @@ -280,6 +298,10 @@ 无法开启燃料喷嘴 주유기를 켤 수 없습니다. Nie można włączyć dyszy paliwowej + Не удалось включить топливный пистолет + Não foi possível ativar o bico de combustível + Impossible de démarrer la pompe + Nepodařilo se zapnout trysku %1 Liters fueled @@ -290,11 +312,12 @@ %1 litrů natankováno %1 litri riforniti %1 lt reabastecido - %1 litres ravitaillés + %1 litres pompés. %1 リッターを給油しました %1 리터 재급유됨 已加入%1公升的燃料 已加入%1公升的燃料 + %1 Litre Dolduruldu The fuel source is empty. @@ -310,6 +333,7 @@ 燃料来源已空. 燃料來源已空. 연료공급처가 비었음. + Yakıt tankı boş. Maximum fuel hose length reached. @@ -320,11 +344,12 @@ Dosažena maximální délka hadice Distanza massima della pompa raggiunta. Máxima longitud de manguera alcanzada. - Tuyau tendu au maximum + Tuyau tendu au maximum. 給油ホースはもうこれ以上届きません。 주유기 호스 최대 거리에 도달함. 已加满至最大油量。 已加滿至最大油量。 + Maksimum yakıt hortumu uzunluğuna ulaşıldı. Fueling completed @@ -335,11 +360,12 @@ Tankování dokončeno Rifornimento completato Reabastecimiento completado - Ravitaillement terminé + Ravitaillement terminé. 給油を完了しました 재급유 완료함 加油完毕 加油完畢 + Yakıt Doldurma Tamamlandı Fueling stopped @@ -350,11 +376,12 @@ Tankování zastaveno Rifornimento fermato Reabastecimiento detenido - Ravitaillement stoppé + Ravitaillement arrêté. 給油を止めました 재급유 멈춤 已停止加油 已停止加油 + Yakıt Doldurma Durduruldu Fueling started @@ -365,11 +392,12 @@ Tankování zahájeno Rifornimento iniziato Comenzó el reabastecimiento - Ravitaillement débuté + Ravitaillement démarré. 給油を始めました 재급유 시작함 已开始加油 已開始加油 + Yakıt Doldurma Başlatıldı Return fuel nozzle @@ -380,11 +408,12 @@ Vrátit výdejní pistoli Riponi manicotto benzina Devolver surtidor - Retourner la pompe + Ranger le pistolet 給油ノズルを戻す 주유기 반환 放回燃料喷嘴 放回燃料噴嘴 + Yakıt Pompasını Geri Koy Returning fuel nozzle... @@ -395,11 +424,12 @@ Vracím výdejní pistoli... Riponendo la manica della benzina... Devolviendo el surtidor... - Retourne la pompe + Rangement du pistolet... 給油ノズルを戻しています・・・ 주유기 반환중 放回燃料喷嘴中... 放回燃料噴嘴中... + Yakıt Pompası Geri Koyuluyor Check fuel counter @@ -415,6 +445,7 @@ 연로카운터 확인 检查燃料表 檢查燃料表 + Yakıt tankını kontrol et %1 liters have been fueled. @@ -425,7 +456,7 @@ %1 litrů bylo natankováno. %1 litri sono stati riforniti. Se reabastecieron %1 lt - %1 litres ont été écoulés. + %1 litres ont été pompés. %1 リッターが給油されました。 %1 리터가 재급유되었습니다. 已加入%1公升 @@ -441,6 +472,11 @@ 加油軟管長度 Długość węża paliwowego 주유기 호스 길이 + Длина заправочного шланга + Comprimento da Mangueira de Combustível + Longueur du tuyau + Délka hadice na palivo + Yakıt poması uzunluğu Fuel Cargo Volume @@ -452,6 +488,10 @@ 储油量 연료통 크기 Pojemność Ładunku Paliwa + Capacidade de Combustível + Volume de la citerne + Objem palivové cisterny + Doldurma Hız @@ -464,6 +504,9 @@ 设定有多少油料可供载具进行加油(-1时关闭,-10为无限油量) 재급유에 사용 할 수 있는 연료량 (-1=비활성, -10=무한) Pojemność paliwa dostępnego do tankowania (-1 wyłącz, -10 jeśli nieskończone) + Quantidade de combustível disponível para abastecer (-1 para desativar, -10 para infinito) + Le volume de carburant disponible pour le ravitaillement (-1 pour désactiver, -10 pour quantité illimitée). + Objem paliva k tankování (-1 pro vypnutí, -10 pro nekonečno) Refuel Hose attach coordinates @@ -475,6 +518,9 @@ 加油软管安装位置 재급유기 부착 좌표 Koordynaty przyłączenia węża paliwowego + Coords. do encaixe para Mangueira + Coordonnées du pistolet + Souřadnice pro připojení hadice na palivo Model coordinates used to attach refuel hose @@ -486,6 +532,9 @@ 设定加油软管会安装到模型的哪个位置上 재급유기 부착에 쓰이는 모델 좌표 Modelowe koordynaty wykorzystane do przyłączenia węża paliwowego + As coordenadas do modelo usado para conectar a mangueira ao veículo + Coordonnées du modèle 3D où est attaché le tuyau ravitaillement. + Souřadnice na modelu pro připojení hadice na palivo. diff --git a/addons/reload/CfgEventHandlers.hpp b/addons/reload/CfgEventHandlers.hpp index 6016e7712a7..3b9b676ffbb 100644 --- a/addons/reload/CfgEventHandlers.hpp +++ b/addons/reload/CfgEventHandlers.hpp @@ -13,14 +13,22 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; class Extended_Take_EventHandlers { class CAManBase { class ACE_AmmoIndicatorReload { - clientTake = QUOTE(params ['_unit']; if (_unit == ACE_player && {GVAR(DisplayText)} && {(_this select 1) in [ARR_3(uniformContainer _unit, vestContainer _unit, backpackContainer _unit)]} && {_this select 2 == currentMagazine _unit}) then {[ARR_2(_unit, vehicle _unit)] call FUNC(displayAmmo)};); + clientTake = QUOTE( \ + params [ARR_3('_unit', '_container', '_item')]; \ + if ( \ + _unit == ACE_player \ + && {GVAR(DisplayText)} \ + && {_container in [ARR_3(uniformContainer _unit, vestContainer _unit, backpackContainer _unit)]} \ + && {_item == currentMagazine _unit} \ + ) then {_unit call DFUNC(displayAmmo)}; \ + ); }; }; }; diff --git a/addons/reload/CfgVehicles.hpp b/addons/reload/CfgVehicles.hpp index 7a1d483bd9a..f6723510e09 100644 --- a/addons/reload/CfgVehicles.hpp +++ b/addons/reload/CfgVehicles.hpp @@ -1,6 +1,17 @@ class CfgVehicles { class Man; class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(checkAmmo) { + displayName = CSTRING(checkAmmo); + condition = QUOTE(GVAR(showCheckAmmoSelf) && {_player call FUNC(canCheckAmmoSelf)}); + statement = QUOTE(call FUNC(checkAmmo)); + exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; + }; + }; + }; + class ACE_Actions { class ACE_Weapon { class GVAR(LinkBelt) { @@ -13,8 +24,8 @@ class CfgVehicles { class GVAR(CheckAmmo) { displayName = CSTRING(checkAmmo); distance = 2.0; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(checkAmmo)); + condition = QUOTE(call FUNC(canCheckAmmo)); + statement = QUOTE(call FUNC(checkAmmo)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; }; }; @@ -28,8 +39,8 @@ class CfgVehicles { class GVAR(CheckAmmo) { displayName = CSTRING(checkAmmo); distance = 2.0; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(checkAmmo)); + condition = QUOTE(call FUNC(canCheckAmmo)); + statement = QUOTE(call FUNC(checkAmmo)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; }; }; diff --git a/addons/reload/XEH_PREP.hpp b/addons/reload/XEH_PREP.hpp index f2b386ac37e..0a7fd80fbbb 100644 --- a/addons/reload/XEH_PREP.hpp +++ b/addons/reload/XEH_PREP.hpp @@ -1,5 +1,6 @@ PREP(canCheckAmmo); +PREP(canCheckAmmoSelf); PREP(getAmmoToLinkBelt); PREP(checkAmmo); PREP(displayAmmo); diff --git a/addons/reload/XEH_postInit.sqf b/addons/reload/XEH_postInit.sqf index eda5c61faa7..26f7f303ff4 100644 --- a/addons/reload/XEH_postInit.sqf +++ b/addons/reload/XEH_postInit.sqf @@ -8,12 +8,12 @@ if (!hasInterface) exitWith {}; // Conditions: canInteract if !([ACE_player, vehicle ACE_player, ["isNotInside", "isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(ACE_player call CBA_fnc_canUseWeapon || {(vehicle ACE_player) isKindOf "StaticWeapon"}) exitWith {false}; + if !(ACE_player call FUNC(canCheckAmmoSelf)) exitWith {false}; // Ignore if controlling UAV (blocks radar keybind) if (!isNull (ACE_controlledUAV param [0, objNull])) exitWith {false}; // Statement - [ACE_player] call FUNC(checkAmmo); + [ACE_player, ACE_player] call FUNC(checkAmmo); true }, {false}, [19, [false, true, false]], false] call CBA_fnc_addKeybind; diff --git a/addons/reload/XEH_preInit.sqf b/addons/reload/XEH_preInit.sqf index b47cf6628db..9361d05015e 100644 --- a/addons/reload/XEH_preInit.sqf +++ b/addons/reload/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf index a0aa0c5c709..9632d0b4b1b 100644 --- a/addons/reload/functions/fnc_canCheckAmmo.sqf +++ b/addons/reload/functions/fnc_canCheckAmmo.sqf @@ -4,19 +4,18 @@ * Check if the player can check the ammo of the target. * * Arguments: - * 0: Unit - * 1: Target + * 0: Target * * Return Value: - * Can link belt + * Can link belt * * Example: - * [player, bob] call ace_reload_fnc_canCheckAmmo + * [cursorObject] call ace_reload_fnc_canCheckAmmo * * Public: No */ -params ["", "_target"]; +params ["_target"]; // Return true for static weapons if they have been fired once, @todo 1.40 this work-around doesn't work anymore if (_target isKindOf "StaticWeapon") exitWith { diff --git a/addons/reload/functions/fnc_canCheckAmmoSelf.sqf b/addons/reload/functions/fnc_canCheckAmmoSelf.sqf new file mode 100644 index 00000000000..2c8c03dccec --- /dev/null +++ b/addons/reload/functions/fnc_canCheckAmmoSelf.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Check if the player can check his own ammo. + * + * Arguments: + * 0: Player + * + * Return Value: + * Can check ammo + * + * Example: + * [cursorObject] call ace_reload_fnc_canCheckAmmoSelf + * + * Public: No + */ + +params ["_player"]; + +_player call CBA_fnc_canUseWeapon && {!((vehicle _player) isKindOf "StaticWeapon")} diff --git a/addons/reload/functions/fnc_checkAmmo.sqf b/addons/reload/functions/fnc_checkAmmo.sqf index 156ca30a32d..995e72dc3fe 100644 --- a/addons/reload/functions/fnc_checkAmmo.sqf +++ b/addons/reload/functions/fnc_checkAmmo.sqf @@ -4,39 +4,25 @@ * Count the ammo of the currently loaded magazine or count rifle grenades. Play animation and display message. * * Arguments: - * 0: Player - * 1: Target. Optional, if not suplied the player counts his personal or static weapon ammo + * 0: Target. + * 1: Player * * Return Value: * None * * Example: - * [bob, kevin] call ace_reload_fnc_checkAmmo + * [cursorObject, player] call ace_reload_fnc_checkAmmo * * Public: No */ -#define COUNT_BARS 12 +params ["_target", "_player"]; -params ["_unit"]; - -private _target = vehicle _unit; - -if (count _this > 1) then { - _target = _this select 1; -} else { - - // If the unit is on foot, count it's own ammo - if (_unit == _target) exitWith {}; - - // If it's mounted on a movile weapon, count it's own ammo - if !(_target isKindOf "StaticWeapon") then { - _target = _unit; +if (_player == _target) then { + if ((vehicle _target) isKindOf "StaticWeapon") then { + _target = vehicle _target; }; + [_player, "Gear", 1] call EFUNC(common,doGesture); }; -if (_unit == _target) then { - [_unit, "Gear", 1] call EFUNC(common,doGesture); -}; - -[FUNC(displayAmmo), [_target], 1, 0.1] call CBA_fnc_waitAndExecute; +[FUNC(displayAmmo), [_target], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/reload/functions/fnc_displayAmmo.sqf b/addons/reload/functions/fnc_displayAmmo.sqf index 9b018131d41..329c3859353 100644 --- a/addons/reload/functions/fnc_displayAmmo.sqf +++ b/addons/reload/functions/fnc_displayAmmo.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [bob] call ace_reload_fnc_displayAmmo + * player call ace_reload_fnc_displayAmmo * * Public: No */ @@ -19,12 +19,16 @@ params ["_target"]; -private _weapon = currentWeapon _target; -private _muzzle = currentMuzzle _target; -private _magazine = currentMagazine _target; +private _isStaticWeapon = _target isKindOf "StaticWeapon"; + +if (_isStaticWeapon) then { + [currentWeapon _target, currentMuzzle _target, "", currentMagazine _target] +} else { + weaponState _target +} params ["_weapon", "_muzzle", "", "_magazine"]; // currentWeapon returns "" for static weapons before they are shot once -if (_target isKindOf "StaticWeapon") then { +if (_isStaticWeapon) then { if (_weapon == "") then { if (count (weapons _target) == 1) then { _weapon = (weapons _target) select 0; @@ -42,22 +46,40 @@ if (_target isKindOf "StaticWeapon") then { }; } forEach _magazines; }; + + // For static weapons the muzzle seemingly never returns anything for static weapons with/without people inside + if (_muzzle == "") then { + _muzzle = _weapon; + }; }; -if (_magazine == "") exitWith {}; -if (_weapon == "") exitWith {}; -if (!( _muzzle isEqualType "")) then {_muzzle = _weapon}; +TRACE_3("",_weapon,_muzzle,_magazine); -private _showNumber = false; -private _ammo = 0; -private _maxRounds = 1; -private _count = 0; +if ("" in [_weapon, _magazine]) exitWith {}; -// not grenade launcher -if (_muzzle == _weapon) then { - _maxRounds = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count") max 1; +private _ammo = _target ammo _muzzle; +private _magazineConfig = configFile >> "CfgMagazines" >> _magazine; +private _maxRounds = getNumber (_magazineConfig >> "count") max 1; +private _count = -1; // Show a count instead of ammo bars (ignore if -1) - _ammo = _target ammo _weapon; +if (_muzzle != _weapon) then { + // grenade launcher (or some kind of seconday muzzle) + if (_ammo > 0) then { + if (_maxRounds == 1) then { // singleShot so show count of identical mags available instead of ammo bars + _count = 1 + ({_x == _magazine} count magazines _target); + }; + } else { + if (_maxRounds <= 3) then { // empty GL/3GL - don't have a real magazine so just show count of any compatible mag + _magazine = ""; + private _compatibleMagazines = [configFile >> "CfgWeapons" >> _weapon >> _muzzle] call CBA_fnc_compatibleMagazines; + _count = {_x in _compatibleMagazines} count (magazines _target); // safe because everything is config case + }; + }; +}; + +private _ammoBarsStructuredText = if (_count >= 0) then { + parseText format ["%1x", _count] +} else { if (_maxRounds >= COUNT_BARS) then { _count = round (COUNT_BARS * _ammo / _maxRounds); @@ -67,20 +89,6 @@ if (_muzzle == _weapon) then { _count = _ammo; }; - // grenade launcher -} else { - _showNumber = true; - - _count = if (_magazine != "") then { - {_x == _magazine} count (magazines _target + [_magazine]) - } else { - {_x in getArray (configFile >> "CfgWeapons" >> _weapon >> _muzzle >> "Magazines")} count magazines _target - }; -}; - -private _ammoBarsStructuredText = if (_showNumber) then { - parseText format ["%1x", _count] -} else { private _color = [((2 * (1 - _ammo / _maxRounds)) min 1), ((2 * _ammo / _maxRounds) min 1), 0]; private _string = ""; @@ -98,13 +106,17 @@ private _ammoBarsStructuredText = if (_showNumber) then { }; -if (_target isKindOf "StaticWeapon") then { +if (_isStaticWeapon) then { //Vehicle mags (usualy) don't have pictures, so just show the text above ammo count - private _loadedName = getText (configFile >> "CfgMagazines" >> _magazine >> "displaynameshort"); + private _loadedName = getText (_magazineConfig >> "displaynameshort"); _loadedName = parseText format ["%1", _loadedName]; private _text = composeText [_loadedName, linebreak, _ammoBarsStructuredText]; [_text] call EFUNC(common,displayTextStructured); } else { - private _picture = getText (configFile >> "CfgMagazines" >> _magazine >> "picture"); - [_ammoBarsStructuredText, _picture] call EFUNC(common,displayTextPicture); + if (_magazine != "") then { + private _picture = getText (_magazineConfig >> "picture"); + [_ammoBarsStructuredText, _picture] call EFUNC(common,displayTextPicture); + } else { + [_ammoBarsStructuredText, 1] call EFUNC(common,displayTextStructured); + }; }; diff --git a/addons/reload/initSettings.sqf b/addons/reload/initSettings.sqf new file mode 100644 index 00000000000..bf692c20de4 --- /dev/null +++ b/addons/reload/initSettings.sqf @@ -0,0 +1,9 @@ + +[ + QGVAR(showCheckAmmoSelf), + "CHECKBOX", + [LSTRING(SettingShowCheckAmmoSelf), LSTRING(SettingShowCheckAmmoSelfDesc)], + localize ELSTRING(common,ACEKeybindCategoryWeapons), + false, // default value + 0 // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 2a7764dc045..9decf775fca 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -8,7 +8,7 @@ Проверять боезапас при перезарядке Zkontrolovat munici při nabití Sprawdź stan amunicji przy przeładowaniu broni - Vérification des munitions au rechargement + Vérifier les munitions au rechargement Lőszer ellenőrzése a fegyver újratöltésekor Controlla le munizioni durante il ricaricamento Conferir munição ao recarregar a arma @@ -24,7 +24,7 @@ Проверяет количество патронов в новом магазине при перезарядке. Kontroluje munice při nabití nového zásobníku. Pokaż stan amunicji w nowym magazynku przy przeładowaniu broni - Vérification du nombre de munition au rechargement + Vérifie les munitions du nouveau chargeur lors du rechargement d'une arme. A lőszer ellenőrzése az új tárad behelyezésekor újratöltés közben. Controlla le munizioni rimanenti nel caricatore in fase di cambio caricatore. Confere a munição no seu novo carregador ao recarregar a arma @@ -33,12 +33,34 @@ 在重新装填时检查新弹匣上的弹药. 在重新裝填時檢查新彈匣上的彈藥. + + Always show check ammo self interaction + Zawsze pokazuj interakcję od sprawdzania amunicji + Mostra sempre l'interazione di autocontrollo delle munizioni + Vždy zobrazit kontrolu munice v menu vlastní interakce + セルフ インタラクションへ弾薬確認を常に表示 + 總是在自我互動中顯示檢查彈藥動作 + Toujours afficher l'action de vérification des munitions + Sempre mostrar a opção de checar a própria munição + Всегда показывать проверку боеприпасов в меню взаимодействия с собой + + + Shows check ammo self interaction even when not in static weapons. + Pokazuje interakcję od sprawdzania amunicji poza bronią statyczną. + Mostra il controllo dell'interazione tra le munizioni anche quando non sono in armi statiche. + Zobrazuje kontrolu munice v menu vlastní interakce i pokud hráč nepoužívá statickou zbraň. + 設置型火器を使っていなくても、セルフ インタラクションへ弾薬確認を常に表示します。 + 即使不是固定式支援武器也依然在自我互動中顯示檢查彈藥動作 + Permet d'afficher l'action de vérification des munitions du menu d'interaction personnel, même si le joueur n'utilise pas d'arme statique. + Mostra a opção de ver sua própria munição mesmo quando não em armas estáticas. + Показывать проверку боеприпасов даже вне стационарного орудия + Check Ammo Munition prüfen Comprobar munición Sprawdź amunicję - Vérifier Munitions + Vérifier les munitions Lőszerellenőrzés Zkontrolovat Munici Controlla le munizioni @@ -48,6 +70,7 @@ 장탄수 확인 检查弹药 檢查彈藥 + Cephaneni Kontrol Et Ammo @@ -64,6 +87,7 @@ 장탄수 弹药 彈藥 + Cephane Link belt @@ -76,14 +100,14 @@ Töltényheveder összekötése Attacca la tracolla Ligar cintos de munição - ベルトをつなげる + ベルトを繋げる 벨트 연결 连接弹链 連接彈鏈 Linking belt... - Attache d'une bande... + Attachage d'une bande... Enlazando cinta... Сцепка лент... Spojuji pás... @@ -92,7 +116,7 @@ Töltényheveder összekötése folyamatban... Attaccando la tracolla... Ligando cintos... - ベルトをつなげています・・・ + ベルトを繋げています・・・ 벨트 연결중... 连接弹链中... 連接彈鏈中... diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index 58f6b6556a5..b0e5a9c332f 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -13,7 +13,7 @@ * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_realoadLauncher + * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_reloadLauncher * * Public: No */ @@ -27,4 +27,4 @@ if (currentWeapon _target != _weapon) exitWith {}; if (currentMagazine _target != "") exitWith {}; // command is wip, reload time for launchers is not intended. -_target addWeaponItem [_weapon, _magazine]; +_target addWeaponItem [_weapon, _magazine, true]; diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index eef4c9e50a1..3dacbe6cbe5 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -16,6 +16,7 @@ 무기 재장전 装载发射器 裝載發射器 + Fırlatıcıyı Yükle Loading launcher... @@ -32,6 +33,7 @@ 무기 재장전중... 装载发射器中... 裝載發射器中... + Fırlatıcı Yükleniyor... Launcher loaded @@ -48,10 +50,11 @@ 무기 재장전됨 发射器装载完毕 發射器裝載完畢 + Fırlatıcı Yüklendi Load %1 - Charge %1 + Charge %1. Lade %1 Cargar %1 Загрузка %1 @@ -64,6 +67,7 @@ %1 장전 装载%1 裝載%1 + %1 Yüklendi diff --git a/addons/repair/ACE_Repair.hpp b/addons/repair/ACE_Repair.hpp index ec0624e2dce..97710940e7c 100644 --- a/addons/repair/ACE_Repair.hpp +++ b/addons/repair/ACE_Repair.hpp @@ -37,7 +37,7 @@ class ACE_Repair { requiredEngineer = QGVAR(engineerSetting_Repair); repairingTime = 15; callbackSuccess = QUOTE(call FUNC(doRepair)); - items[] = {"ToolKit"}; + items = QGVAR(miscRepairRequiredItems); itemConsumed = QGVAR(consumeItem_ToolKit); claimObjects[] = {}; }; @@ -74,6 +74,7 @@ class ACE_Repair { repairingTime = 30; condition = "-1 != ((getAllHitPointsDamage _target param [2,[]]) findIf {_x > 0})"; callbackSuccess = QUOTE(call FUNC(doFullRepair)); + items = QGVAR(fullRepairRequiredItems); itemConsumed = QGVAR(consumeItem_ToolKit); }; }; diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index 82217bc5ad3..45e8b15aa9e 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -1,4 +1,3 @@ -// Warning: do not remove without handling wheelRepairRequiredItems's _values config on line 32 [used in repair/canRepair] class ACE_Settings { class GVAR(displayTextOnRepair) { movedToSQF = 1; @@ -29,7 +28,6 @@ class ACE_Settings { }; class GVAR(wheelRepairRequiredItems) { movedToSQF = 1; - _values[] = {{}, {"ToolKit"}}; }; class GVAR(autoShutOffEngineWhenStartingRepair) { movedToSQF = 1; diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index 7f0255d2a54..cb9183ba0e5 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -100,7 +100,7 @@ class CfgVehicles { defaultValue = 1; }; class wheelRepairRequiredItems { - displayName = CSTRING(wheelRepairRequiredItems_name); + displayName = CSTRING(WheelRepairRequiredItems_DisplayName); description = CSTRING(wheelRepairRequiredItems_description); typeName = "NUMBER"; class values { @@ -456,8 +456,7 @@ class CfgVehicles { GVAR(hitpointPositions)[] = {{"HitTurret", {0,-2,0}}}; }; - class Car_F; - class Offroad_01_base_F: Car_F {}; + class Offroad_01_base_F; class Offroad_01_repair_base_F: Offroad_01_base_F { GVAR(canRepair) = 1; transportRepair = 0; @@ -483,7 +482,25 @@ class CfgVehicles { GVAR(canRepair) = 0; }; - class Truck_03_base_F; + class Car_F: Car { + class HitPoints; + }; + class Truck_F: Car_F { + class HitPoints: HitPoints { + class HitLBWheel; + class HitRBWheel; + }; + }; + class Truck_03_base_F: Truck_F { + class HitPoints: HitPoints { + class HitLBWheel: HitLBWheel { + name = "wheel_1_4_steering"; // return original values back to fix double wheel hitpoint + }; + class HitRBWheel: HitRBWheel { + name = "wheel_2_4_steering"; + }; + }; + }; class O_Truck_03_repair_F: Truck_03_base_F { GVAR(canRepair) = 1; transportRepair = 0; diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index 2f0bbe7869c..2cbbd8c3e1d 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -4,4 +4,17 @@ [QGVAR(setVehicleHitPointDamage), {_this call FUNC(setHitPointDamage)}] call CBA_fnc_addEventHandler; // wheels -[QGVAR(setWheelHitPointDamage), {(_this select 0) setHitPointDamage [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler; +[QGVAR(setWheelHitPointDamage), { + params ["_object", "_hitPoint", "_damage"]; + private _damageDisabled = !isDamageAllowed _object; + + if (_damageDisabled) then { + _object allowDamage true; + }; + + _object setHitPointDamage [_hitPoint, _damage]; + + if (_damageDisabled) then { + _object allowDamage false; + }; +}] call CBA_fnc_addEventHandler; diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf index 5761206b3e0..96eff28d4af 100644 --- a/addons/repair/functions/fnc_addRepairActions.sqf +++ b/addons/repair/functions/fnc_addRepairActions.sqf @@ -34,20 +34,23 @@ if (_type in _initializedClasses) exitWith {}; private _hitPointsAddedNames = []; private _hitPointsAddedStrings = []; private _hitPointsAddedAmount = []; -private _processedHitpoints = []; +private _processedSelections = []; private _icon = ["a3\ui_f\data\igui\cfg\actions\repair_ca.paa", "#FFFFFF"]; +private _vehCfg = configFile >> "CfgVehicles" >> _type; // Custom position can be defined via config for associated hitpoint -private _hitpointPositions = getArray (configFile >> "CfgVehicles" >> _type >> QGVAR(hitpointPositions)); +private _hitpointPositions = getArray (_vehCfg >> QGVAR(hitpointPositions)); // Associated hitpoints can be grouped via config to produce a single repair action -private _hitpointGroups = getArray(configFile >> "CfgVehicles" >> _type >> QGVAR(hitpointGroups)); +private _hitpointGroups = getArray (_vehCfg >> QGVAR(hitpointGroups)); +// Get turret paths +private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehicle, "commander", true])) apply {_x # 3}; { private _selection = _x; private _hitpoint = toLower (_hitPoints select _forEachIndex); if (_selection in _wheelHitSelections) then { // Wheels should always be unique - if (_hitpoint in _processedHitpoints) exitWith {TRACE_3("Duplicate Wheel",_hitpoint,_forEachIndex,_selection);}; + if (_selection in _processedSelections) exitWith {TRACE_3("Duplicate Wheel",_hitpoint,_forEachIndex,_selection);}; private _position = compile format ["_target selectionPosition ['%1', 'HitPoints'];", _selection]; @@ -68,23 +71,43 @@ private _hitpointGroups = getArray(configFile >> "CfgVehicles" >> _type >> QGVAR _statement = {[_this select 1, _this select 0, _this select 2 select 0, "ReplaceWheel"] call DFUNC(repair)}; _action = [_name, _text, _icon, _statement, _condition, {}, [_hitpoint], _position, 2] call EFUNC(interact_menu,createAction); [_type, 0, [], _action] call EFUNC(interact_menu,addActionToClass); + + _processedSelections pushBack _selection; } else { - // Empty selections don't exist - if (_selection isEqualTo "") exitWith { TRACE_3("Skipping Empty Sel",_hitpoint,_forEachIndex,_selection); }; // Empty hitpoints don't contain enough information if (_hitpoint isEqualTo "") exitWith { TRACE_3("Skipping Empty Hit",_hitpoint,_forEachIndex,_selection); }; // Ignore glass hitpoints - if ((_hitPoint find "glass") != -1) exitWith { TRACE_3("Skipping Glass",_hitpoint,_forEachIndex,_selection); }; + if ((_hitpoint find "glass") != -1) exitWith { TRACE_3("Skipping Glass",_hitpoint,_forEachIndex,_selection); }; // Ignore hitpoints starting with # (seems to be lights) if ((_hitpoint select [0,1]) == "#") exitWith { TRACE_3("Skipping # hit",_hitpoint,_forEachIndex,_selection); }; // Ignore ERA/Slat armor (vanilla uses hitera_/hitslat_, pre-1.82 RHS uses era_) // ToDo: see how community utilizes new armor system, could also check getText (_hitpointConfig >> "simulation") if (((_hitpoint select [0,7]) == "hitera_") || {(_hitpoint select [0,8]) == "hitslat_"} || {(_hitpoint select [0,4]) == "era_"}) exitWith { TRACE_3("Skipping ERA/SLAT",_hitpoint,_forEachIndex,_selection); }; + // Some hitpoints do not have a selection but do have an armorComponent value (seems to mainly be RHS) + // Ref https://community.bistudio.com/wiki/Arma_3_Damage_Enhancement + // this code won't support identically named hitpoints (e.g. commander turret: Duplicate HitPoint name 'HitTurret') + private _armorComponent = ""; + if (_selection == "") then { + { + private _turretHitpointCfg = ([_vehCfg, _x] call CBA_fnc_getTurret) >> "HitPoints"; + private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg; + if (!(_hitpointsCfg isEqualTo [])) exitWith { + TRACE_2("turret hitpoint configFound",_hitpoint,_x); + // only do turret hitpoints for now or we get some weird stuff + if ((_hitpoint in ["hitturret", "hitgun"]) || {(getNumber (_hitpointsCfg # 0 >> "isGun")) == 1} || {(getNumber (_hitpointsCfg # 0 >> "isTurret")) == 1}) then { + _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); + }; + }; + } forEach _turretPaths; + if (_armorComponent != "") then { INFO_3("%1: %2 no selection: using armorComponent %3",_type,_hitpoint,_armorComponent); }; + }; + if ((_selection == "") && {_armorComponent == ""}) exitWith { TRACE_3("Skipping no selection OR armor component",_hitpoint,_forEachIndex,_selection); }; + //Depends hitpoints shouldn't be modified directly (will be normalized) // Biki: Clearing 'depends' in case of inheritance cannot be an empty string (rpt warnings), but rather a "0" value. - if (!((getText (configFile >> "CfgVehicles" >> _type >> "HitPoints" >> _hitpoint >> "depends")) in ["", "0"])) exitWith { + if (!((getText (_vehCfg >> "HitPoints" >> _hitpoint >> "depends")) in ["", "0"])) exitWith { TRACE_3("Skip Depends",_hitpoint,_forEachIndex,_selection); }; @@ -114,6 +137,17 @@ private _hitpointGroups = getArray(configFile >> "CfgVehicles" >> _type >> QGVAR }; } forEach _hitpointPositions; + // if no selection then use the FireLOD to position the action + if ((_selection == "") && {_position isEqualTo {_target selectionPosition ['', 'HitPoints'];}}) then { + if ((_vehicle selectionPosition [_armorComponent, "FireGeometry"]) isEqualTo [0,0,0]) then { + WARNING_3("[%1: %2: %3] armorComponent does not exist?",_type,_hitpoint,_armorComponent); + _position = [0,0,0]; // just stick it on mainActions + } else { + _position = compile format ["_target selectionPosition ['%1', 'FireGeometry'];", _armorComponent]; + }; + TRACE_1("using armorComponent position",_position); + }; + // Prepare the repair action private _name = format ["Repair_%1_%2", _forEachIndex, _selection]; @@ -125,7 +159,7 @@ private _hitpointGroups = getArray(configFile >> "CfgVehicles" >> _type >> QGVAR if (_hitpoint in TRACK_HITPOINTS) then { // Tracks should always be unique - if (_hitpoint in _processedHitpoints) exitWith {TRACE_3("Duplicate Track",_hitpoint,_forEachIndex,_selection);}; + if (_selection in _processedSelections) exitWith {TRACE_3("Duplicate Track",_hitpoint,_forEachIndex,_selection);}; _position = compile format ["private _return = _target selectionPosition ['%1', 'HitPoints']; _return set [1, 0]; _return", _selection]; TRACE_4("Adding RepairTrack",_hitpoint,_forEachIndex,_selection,_text); private _condition = {[_this select 1, _this select 0, _this select 2 select 0, "RepairTrack"] call DFUNC(canRepair)}; @@ -145,7 +179,7 @@ private _hitpointGroups = getArray(configFile >> "CfgVehicles" >> _type >> QGVAR }; }; - _processedHitPoints pushBack _hitpoint; + _processedSelections pushBack _selection; }; } forEach _hitSelections; diff --git a/addons/repair/functions/fnc_canRepair.sqf b/addons/repair/functions/fnc_canRepair.sqf index 93d5eef7a0f..2b9ac713643 100644 --- a/addons/repair/functions/fnc_canRepair.sqf +++ b/addons/repair/functions/fnc_canRepair.sqf @@ -37,16 +37,11 @@ private _engineerRequired = if (isNumber (_config >> "requiredEngineer")) then { }; if !([_caller, _engineerRequired] call FUNC(isEngineer)) exitWith {false}; -//Items can be an array of required items or a string to a ACE_Setting array +// Items can be an array of required items or a string to a missionNamespace variable private _items = if (isArray (_config >> "items")) then { getArray (_config >> "items"); } else { - private _settingName = getText (_config >> "items"); - private _settingItemsArray = getArray (configFile >> "ACE_Settings" >> _settingName >> "_values"); - if ((isNil _settingName) || {(missionNamespace getVariable _settingName) >= (count _settingItemsArray)}) exitWith { - ERROR("bad setting"); ["BAD"] - }; - _settingItemsArray select (missionNamespace getVariable _settingName); + missionNamespace getVariable [getText (_config >> "items"), []] }; if (count _items > 0 && {!([_caller, _items] call FUNC(hasItems))}) exitWith {false}; @@ -82,7 +77,7 @@ if (!("All" in _repairLocations)) then { if (_x == "field") exitWith {_return = true;}; if (_x == "RepairFacility" && _repairFacility) exitWith {_return = true;}; if (_x == "RepairVehicle" && _repairVeh) exitWith {_return = true;}; - if !(isNil _x) exitWith { + if (!isNil _x) exitWith { private _val = missionNamespace getVariable _x; if (_val isEqualType 0) then { _return = switch (_val) do { diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf index 8394b4f5ac9..7439d35c127 100644 --- a/addons/repair/functions/fnc_getHitPointString.sqf +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -33,6 +33,7 @@ if (_track) then { }; // Prepare first part of the string from stringtable +//IGNORE_STRING_WARNING(str_ace_repair_hit); private _text = LSTRING(Hit); // Remove "Hit" from hitpoint name if one exists diff --git a/addons/repair/functions/fnc_isInRepairFacility.sqf b/addons/repair/functions/fnc_isInRepairFacility.sqf index 10ef95ed66d..dcbd141fb77 100644 --- a/addons/repair/functions/fnc_isInRepairFacility.sqf +++ b/addons/repair/functions/fnc_isInRepairFacility.sqf @@ -15,7 +15,7 @@ * Public: Yes */ -params ["_object"]; +params [["_object", objNull, [objNull]]]; TRACE_1("params",_object); private _position = getPosASL _object; diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 9363f536718..1c0707f7eda 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -43,16 +43,11 @@ if ((isEngineOn _target) && {!GVAR(autoShutOffEngineWhenStartingRepair)}) exitWi false }; -//Items can be an array of required items or a string to a ACE_Setting array +// Items can be an array of required items or a string to a missionNamespace variable private _items = if (isArray (_config >> "items")) then { getArray (_config >> "items"); } else { - private _settingName = getText (_config >> "items"); - private _settingItemsArray = getArray (configFile >> "ACE_Settings" >> _settingName >> "_values"); - if ((isNil _settingName) || {(missionNamespace getVariable _settingName) >= (count _settingItemsArray)}) exitWith { - ERROR("bad setting"); ["BAD"] - }; - _settingItemsArray select (missionNamespace getVariable _settingName); + missionNamespace getVariable [getText (_config >> "items"), []] }; if (count _items > 0 && {!([_caller, _items] call FUNC(hasItems))}) exitWith {false}; @@ -87,7 +82,7 @@ if (!("All" in _repairLocations)) then { if (_x == "field") exitWith {_return = true;}; if (_x == "RepairFacility" && _repairFacility) exitWith {_return = true;}; if (_x == "RepairVehicle" && _repairVeh) exitWith {_return = true;}; - if !(isNil _x) exitWith { + if (!isNil _x) exitWith { private _val = missionNamespace getVariable _x; if (_val isEqualType 0) then { _return = switch (_val) do { @@ -139,12 +134,16 @@ if (_consumeItems > 0) then { // Parse the config for the progress callback private _callbackProgress = getText (_config >> "callbackProgress"); if (_callbackProgress == "") then { - _callbackProgress = "true"; -}; -if (isNil _callbackProgress) then { - _callbackProgress = compile _callbackProgress; + _callbackProgress = { + (_this select 0) params ["", "_target"]; + (alive _target) && {(abs speed _target) < 1} // make sure vehicle doesn't drive off + }; } else { - _callbackProgress = missionNamespace getVariable _callbackProgress; + if (isNil _callbackProgress) then { + _callbackProgress = compile _callbackProgress; + } else { + _callbackProgress = missionNamespace getVariable _callbackProgress; + }; }; diff --git a/addons/repair/functions/fnc_setDamage.sqf b/addons/repair/functions/fnc_setDamage.sqf index fbae505fae7..ba51c22c0df 100644 --- a/addons/repair/functions/fnc_setDamage.sqf +++ b/addons/repair/functions/fnc_setDamage.sqf @@ -26,6 +26,11 @@ if !(local _vehicle) exitWith {}; (getAllHitPointsDamage _vehicle) params [["_allHitPoints", []], ["_allHitPointsSelections", []], ["_allHitPointDamages", []]]; // set damage of the vehicle +private _damageDisabled = !isDamageAllowed _vehicle; +if (_damageDisabled) then { + _vehicle allowDamage true; +}; + _vehicle setDamage _damage; // restore original hitpoint damage values @@ -35,3 +40,7 @@ _vehicle setDamage _damage; // normalize hitpoints [_vehicle] call FUNC(normalizeHitPoints); + +if (_damageDisabled) then { + _vehicle allowDamage false; +}; diff --git a/addons/repair/functions/fnc_setHitPointDamage.sqf b/addons/repair/functions/fnc_setHitPointDamage.sqf index f0313315e90..0e8a8056893 100644 --- a/addons/repair/functions/fnc_setHitPointDamage.sqf +++ b/addons/repair/functions/fnc_setHitPointDamage.sqf @@ -62,6 +62,11 @@ if (_hitPointDamageSumOld > 0) then { TRACE_5("structuralDamage",_damageOld,_damageNew,_hitPointDamageRepaired,_hitPointDamageSumOld,_realHitpointCount); // set new structural damage value +private _damageDisabled = !isDamageAllowed _vehicle; +if (_damageDisabled) then { + _vehicle allowDamage true; +}; + _vehicle setDamage [_damageNew, _useEffects]; //Repair the hitpoint in the damages array: @@ -74,3 +79,7 @@ _allHitPointDamages set [_hitPointIndex, _hitPointDamage]; // normalize hitpoints [_vehicle] call FUNC(normalizeHitPoints); + +if (_damageDisabled) then { + _vehicle allowDamage false; +}; diff --git a/addons/repair/initSettings.sqf b/addons/repair/initSettings.sqf index e226085a290..38e9e19e970 100644 --- a/addons/repair/initSettings.sqf +++ b/addons/repair/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_repair]: - [ QGVAR(displayTextOnRepair), "CHECKBOX", [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], @@ -11,7 +9,7 @@ [ QGVAR(engineerSetting_repair), "LIST", - [LSTRING(engineerSetting_Repair_name), LSTRING(engineerSetting_Repair_description)], + [LSTRING(engineerSetting_Repair_name), LSTRING(engineerSetting_Repair_description)], [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],1], // [values, titles, defaultIndex] true, // isGlobal @@ -83,12 +81,30 @@ ] call CBA_settings_fnc_init; [ - QGVAR(wheelRepairRequiredItems), "LIST", - [LSTRING(wheelRepairRequiredItems_name), LSTRING(wheelRepairRequiredItems_description)], + QGVAR(wheelRepairRequiredItems), + "LIST", + [LSTRING(WheelRepairRequiredItems_DisplayName), LSTRING(WheelRepairRequiredItems_Description)], [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [[0,1],["None", "ToolKit"],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QGVAR(wheelRepairRequiredItems), _this] call EFUNC(common,cbaSettings_settingChanged)} + [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 0], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(miscRepairRequiredItems), + "LIST", + [LSTRING(MiscRepairRequiredItems_DisplayName), LSTRING(MiscRepairRequiredItems_Description)], + [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(fullRepairRequiredItems), + "LIST", + [LSTRING(FullRepairRequiredItems_DisplayName), LSTRING(FullRepairRequiredItems_Description)], + [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], + true ] call CBA_settings_fnc_init; [ diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 467721b8f5f..5c5d9528048 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -1,11 +1,11 @@ - + Spare Track Ersatzkette Oruga de repuesto - Chenille de réserve + Chenille de rechange Zapasowa gąsienica Esteira reserva Náhradní pásy @@ -16,6 +16,7 @@ 예비 궤도 备用履带 備用履帶 + Yedek Parça Spare Wheel @@ -32,12 +33,13 @@ 예비 바퀴 备用轮胎 備用輪胎 + Yedek Tekerlek Change Wheel Reifen wechseln Cambiar rueda - Changer Roue + Changer la roue Wymień koło Trocar roda Sostituisci la ruota @@ -48,6 +50,7 @@ 바퀴 교체 更换轮胎 更換輪胎 + Tekerleği Değiştir Replacing Wheel... @@ -63,6 +66,7 @@ 바퀴 교체중... 更换轮胎中... 更換輪胎中... + Tekerlek Takılıyor Wheel replaced @@ -73,17 +77,18 @@ Kolo vyměněno Rueda cambiada Ruota sostituita - Roue remplacée + Roue remplacée. タイヤを交換しました 바퀴 교체됨 轮胎更换完毕 輪胎更換完畢 + Tekerlek Takıldı Remove Wheel Reifen entfernen Quitar rueda - Démonter Roue + Démonter la roue Zdejmij koło Odstranit kolo Remover roda @@ -94,6 +99,7 @@ 바퀴 제거 卸下轮胎 卸下輪胎 + Tekerleği Sök Removing Wheel... @@ -109,6 +115,7 @@ 바퀴 제거중... 卸下轮胎中... 卸下輪胎中... + Tekerlek Sökülüyor Wheel removed @@ -119,11 +126,12 @@ Kolo odstraněno Rueda quitada Ruota rimossa - Roue démontée + Roue démontée. タイヤを外しました 바퀴 제거됨 轮胎卸下完毕 輪胎卸下完畢 + Tekerlek Söküldü Change Track @@ -139,6 +147,7 @@ 궤도 교체 更换履带 更換履帶 + Parçayı Değiştir Replacing Track... @@ -154,6 +163,7 @@ 궤도 교체중... 更换履带中... 更換履帶中... + Parça Değişiyor... Track replaced @@ -164,11 +174,12 @@ Pás vyměněn Oruga cambiada Cingolo sostituito - Chenille remplacée + Chenille remplacée. 履帯を交換しました 궤도 교체됨 履带更换完毕 履帶更換完畢 + Parça Değişti Remove Track @@ -179,11 +190,12 @@ Odstranit pás Quitar oruga Rimuovi cingolo - Enlever la chenille + Démonter la chenille 履帯を外す 궤도 제거 卸下履带 卸下履帶 + Parçayı Sök Removing Track... @@ -194,11 +206,12 @@ Odstraňuji pás... Quitando oruga... Rimuovendo il cingolo... - Enlèvement de la chenille... + Démontage de la chenille... 履帯を外しています・・・ 궤도 제거중... 卸下履带中... 卸下履帶中... + Parça Sökülüyor... Track removed @@ -209,11 +222,12 @@ Pás odstraněn Oruga quitada Cingolo rimosso - Chenille enlevée + Chenille démontée. 履帯を外しました 궤도 제거됨 履带卸下完毕 履帶卸下完畢 + Parça Söküldü Full Repair @@ -224,11 +238,12 @@ Kompletní oprava Reparación completa Riparazione completa - Réparations complètes + Réparer complètement 完全に修理 완전수리 完整维修 完整維修 + Tam Onarım Repairing Vehicle... @@ -244,6 +259,7 @@ 차량 수리중... 维修载具中... 維修載具中... + Tamir Ediliyor... Full Repair Locations @@ -254,11 +270,12 @@ Oblast pro kompletní opravu Lugares de reparación completa Luoghi Riparazione Completa - Lieu de réparation complète + Endroits pour réparation complète 完全修理できる場所 완전수리 구역 完整维修地点 完整維修地點 + Tam Onarım Konumu At what locations can a vehicle be fully repaired? @@ -269,7 +286,7 @@ ¿En qué lugares puede un vehículo ser reparado totalmente? V které oblasti může být vozidlo plně opraveno? In quali luoghi è possibile riparare completamente un veicolo? - Où peuvent être réparés complètement les véhicules ? + Définit les lieux permettant de réparer intégralement un véhicule. どのような場所で車両の完全な修理を出来るようにしますか? 어느 구역에서 차량을 완전히 수리할 수 있게 합니까? 什么位置可以完整维修载具? @@ -284,11 +301,12 @@ Povolit kompletní opravu Permitir reparación completa Consenti Riparazione Completa - Autoriser les réparations complètes. + Réparations complètes autorisées pour 完全修理を許可 완전 수리 활성화 允许完整维修 允許完整維修 + Tam Onarıma Izin Ver Who can perform a full repair on a vehicle? @@ -299,11 +317,12 @@ ¿Quién puede realizar una reparación completa de un vehículo? Kdo může provést úplné opravy na vozidle? Chi può eseguire una riparazione completa su un veicolo? - Qui peut faire une réparation complète ? + Définit qui peut effectuer une réparation complète sur un véhicule. 誰が車両の完全な修理を出来るようにしますか? 누가 완전 수리를 할 수 있습니까? 谁可以完整维修载具? 誰可以完整維修載具? + Kimler araçta tam onarım yapabilir? Add Spare Parts @@ -319,6 +338,7 @@ 예비 부품 더하기 添加备件 添加備件 + Yedek Parça Ekle Add spare parts to vehicles (requires Cargo component)? @@ -329,7 +349,7 @@ Добавлять запасные части в технику (требуется модуль Грузоперевозок)? Přidat náhradní díly do vozidla (vyžaduje úložný prostor)? Aggiungi parti di ricambio ai veicoli (richiede componente Cargo)? - Ajouter des pièces de rechage aux véhicules ? (à besoin du système de cargaison) + Ajoute des pièces de rechange aux véhicules (nécessite le système de cargaison). 車両へ予備部品を追加しますか(カーゴ コンポーネントが必要)? 차량에 예비 부품을 더합니까?(짐칸 요소 필요) 添加载具备件 (需相关货物组件)? @@ -339,7 +359,7 @@ Repair Reparieren Reparación - Réparer + Réparation Napraw Opravit Reparar @@ -350,6 +370,7 @@ 수리 维修 維修 + Tamir Display text on repair @@ -360,7 +381,7 @@ Zobrazit text při opravě Mostrar texto en la reparación Mostra testo mentre ripari - Afficher du texte pendant la réparation + Afficher du texte lors des réparations 修理時に文章で通知する 수리시 화면에 글자 표시 显示维修文本 @@ -375,7 +396,7 @@ Mostrar una notificación cada vez que se reparare un vehículo Zobrazit oznámení kdykoliv opravíš vozidlo Mostra una notifica quando stai riparando un veicolo - Afficher une notification lorsque l'on répare un véhicule + Affiche une notification lorsque vous réparez un véhicule. 車両の修理を始めると、画面に通知を出します 수리시 화면에 글자로 알림이 뜹니다 每当维修载具时显示通知 @@ -396,12 +417,13 @@ 수리중... 维修中... 維修中... + Tamir Ediliyor... Repairing %1... Repariere %1... Reparando %1... - Réparation %1... + Réparation de %1... Naprawianie %1... Opravuji %1... Reparando %1... @@ -412,12 +434,13 @@ %1 수리중... 维修%1中... 維修%1中... + Tamir Ediliyor %1... Repaired %1 %1 repariert Reparado %1 - %1 réparé(e) + %1 réparé(e). Naprawiono %1 %1 - opraveno Reparado %1 @@ -428,6 +451,7 @@ %1 수리됨 已维修%1 已維修%1 + Tamir Edildi %1 Fully repaired part @@ -438,7 +462,7 @@ Kompletně opravená část Parte totalmente reparado Parte riparata completamente - Pièce entièrement réparée + Pièce entièrement réparée. 完全に修理された部品 부분 완벽히 수리됨 完整维修部分 @@ -453,7 +477,7 @@ Parcialmente reparada %1 %1 - částečně opraveno %1 parzialmente riparato - %1 pratiquement réparée + %1 partiellement réparé(e). %1 を部分的に修理しました %1 부분적으로 수리됨 %1已完成部分维修 @@ -468,7 +492,7 @@ %1 - kompletně opraveno Totalmente reparada %1 %1 completamente riparato - %1 entièrement réparée + %1 entièrement réparé(e). %1 を完全に修理しました %1 완전히 수리됨 %1已完整维修 @@ -483,7 +507,7 @@ Parcialmente reparada %1 %1 - částečně opraveno %1 parzialmente riparato - %1 pratiquement réparée + %1 partiellement réparé(e). %1 を部分的に修理しました %1 부분적으로 수리됨 %1已完成部分维修 @@ -504,6 +528,7 @@ 몸체 车身 車身 + Vücut Hull @@ -520,6 +545,7 @@ 선체 车壳 車殼 + Gövde Engine @@ -536,6 +562,7 @@ 엔진 引擎 引擎 + Motor Left Horizontal Stabilizer @@ -551,6 +578,7 @@ 왼쪽 수평안정판 左侧悬挂稳定 左側懸掛穩定 + Sol Yatay Sabitleyici Right Horizontal Stabilizer @@ -566,6 +594,7 @@ 오른쪽 수평안정판 右侧悬挂稳定 右側懸掛穩定 + Sağ Yatay Sabitleyici Vertical Stabilizer @@ -581,6 +610,7 @@ 수직 안정판 垂直稳定 垂直穩定 + Dikey Sabitleyici Fuel Tank @@ -597,6 +627,7 @@ 연료 탱크 油箱 油箱 + Yakıt Tankeri Transmission @@ -607,11 +638,12 @@ Transmissão Transmisión Trasmissione - Instruments + Transmission 変速機 변속기 变速箱 變速箱 + Vites Gear @@ -622,11 +654,12 @@ Rueda Podvozek Motore - Trains d'attérissage + Trains d'atterrissage ギア 기어 齿轮 齒輪 + Vites Starter @@ -642,6 +675,7 @@ 점화기 发动机 發動機 + Marş Tail @@ -657,6 +691,7 @@ 꼬리 尾翼 尾翼 + Kuyruk Pitot Tube @@ -667,11 +702,12 @@ Tubo de Pitot Tubo del pitot Tubo di Pitot - Sonde pitot + Tube de Pitot ピトー管 동압관 空速管 空速管 + Pilot Tüpü Static Port @@ -682,7 +718,7 @@ Puerto estático Statický port Porta Statica - Port statique + Système pitot-statique スタティック ポート 정압공 静态端口 @@ -702,6 +738,7 @@ 탄약 弹药 彈藥 + Cephane Turret @@ -718,6 +755,7 @@ 포탑 炮塔 砲塔 + Taret Gun @@ -734,6 +772,7 @@ + Silah Commander Turret @@ -750,6 +789,7 @@ 지휘관 포탑 指挥官 炮塔 指揮官 砲塔 + Komutan Tareti Commander Gun @@ -766,6 +806,7 @@ 지휘관 포 指挥官 枪 指揮官 槍 + Komutan Silahı Missiles @@ -781,6 +822,7 @@ 미사일 导弹 導彈 + Füzeler Left Track @@ -818,7 +860,7 @@ Left Front Wheel Linkes Vorderrad Rueda frontal izquierda - Roue avant-gauche + Roue avant gauche Przednie lewe koło Levé přední Kolo Roda Dianteira Esquerda @@ -834,7 +876,7 @@ Right Front Wheel Rechtes Vorderrad Rueda frontal derecha - Roue avant-droite + Roue avant droite Przednie prawe koło Pravé přední Kolo Roda Dianteira Direita @@ -850,7 +892,7 @@ Second Left Front Wheel Zweites linkes Vorderrad Segunda rueda frontal izquierda - Deuxième roue avant-gauche + Deuxième roue avant gauche Drugie przednie lewe koło Druhé Levé přední Kolo Segunda Roda Dianteira Esquerda @@ -866,7 +908,7 @@ Second Right Front Wheel Zweites rechtes Vorderrad Segunda rueda frontal derecha - Deuxième roue avant-droite + Deuxième roue avant droite Drugie przednie prawe koło Druhé Pravé přední Kolo Segunda Roda Dianteira Direita @@ -882,7 +924,7 @@ Left Middle Wheel Linkes mittleres Rad Rueda central izquierda - Roue centre-gauche + Roue centrale gauche Środkowe lewe koło Levé prostřední Kolo Roda Intermediária Esquerda @@ -898,7 +940,7 @@ Right Middle Wheel Rechtes mittleres Rad Rueda central derecha - Roue centre-droite + Roue centrale droite Środkowe prawe koło Pravé prostřední Kolo Roda Intermediária Direita @@ -914,7 +956,7 @@ Left Rear Wheel Linkes Hinterrad Rueda trasera izquierda - Roue arrière-gauche + Roue arrière gauche Tylnie lewe koło Levé zadní Kolo Roda Traseira Esquerda @@ -930,7 +972,7 @@ Right Rear Wheel Rechtes Hinterrad Rueda trasera derecha - Roue arrière-droite + Roue arrière droite Tylnie prawe koło Pravé zadní Kolo Roda Traseira Direita @@ -973,12 +1015,13 @@ 주 로터 主旋翼 主旋翼 + Ana Rotor Tail Rotor Heckrotor Rotor de cola - Rotor anticouple + Rotor de queue Tylni rotor Ocasní Rotor Rotor de Cauda @@ -989,6 +1032,7 @@ 꼬리 로터 尾桨 尾槳 + Arka Rotor Winch @@ -1004,6 +1048,7 @@ 윈치 绞盘 絞盤 + Vinç Glass (right) @@ -1020,6 +1065,7 @@ 유리 (오른쪽) 玻璃 (右) 玻璃 (右) + Cam(Sağ) Glass (left) @@ -1036,6 +1082,7 @@ 유리 (왼쪽) 玻璃 (左) 玻璃 (左) + Cam (sol) Glass @@ -1052,6 +1099,7 @@ 유리 玻璃 玻璃 + Cam ERA @@ -1060,7 +1108,7 @@ ERA Reaktivpanzerung ERA - ERA + Blindage réactif ERA ДЗ ERA @@ -1077,7 +1125,7 @@ Ajustes de reparación Nastavení oprav Impostazioni Riparazioni - Réglages de réparation + Paramètres des réparations 修理設定 수리 설정 修复设定 @@ -1107,11 +1155,12 @@ Kdokoliv Cualquiera Chiunque - Tout le monde + N'importe qui だれでも 모두 任何人 任何人 + Herkes Engineer only @@ -1122,11 +1171,12 @@ Pouze inženýr Solo ingeniero Solo Geniere - Ingénieurs seulement + Ingénieurs uniquement 工兵のみ 오직 정비공만 只有工兵 只有工兵 + Sadece Mühendis Advanced Engineer only @@ -1137,6 +1187,12 @@ 只有維修專精兵 Tylko zaawansowani mechanicy 고급 정비공만 + Только продвинутые инженеры + Somente engenheiro avançado + Ing. avancés uniquement + Pouze pokročilý inženýr + Solo ingeniero avanzado + Sadece Gelişmiş Mühendis Allow Wheel @@ -1147,7 +1203,7 @@ Možnost Výměny Kol Permitir rueda Consenti Ruota - Autoriser les roues + Roues autorisées pour タイヤを許可 바퀴 허가 允许轮胎 @@ -1162,7 +1218,7 @@ Kdo může odstranit a vyměnit kola? ¿Quién puede quitar y cambiar las ruedas? Chi può rimuovere e sostituire le ruote? - Qui peut enlever et remplacer les roues ? + Définit qui peut démonter et remplacer des roues. 誰がタイヤの除去と交換を出来るようにしますか? 누가 바퀴를 제거 및 교체할 수 있습니까? 谁可维修轮胎? @@ -1177,7 +1233,7 @@ Možnost Opravování Permitir reparación Consenti Riparazioni - Autoriser les réparations + Réparations autorisées pour 修理を許可 수리 허가 允许维修 @@ -1192,7 +1248,7 @@ Kdo může provádět opravy? ¿Quién puede realizar reparaciones? Chi può eseguire riparazioni? - Qui peut réparer ? + Définit qui peut effectuer des réparations. 誰が修理を出来るようににしますか? 누가 수리를 할 수 있습니까? 谁可以进行维修操作? @@ -1207,7 +1263,7 @@ Umbral de reparación Práh oprav Limite Riparazioni - Seuil de réparation + Seuil de réparabilité 修理のしきい値 정비 한계치 维修门槛 @@ -1222,7 +1278,7 @@ ¿Cuál es el daño máximo que puede ser reparado con una caja de herramientas? Jaké maximální poškození může být opraveno pomocí opravárenské sady? Qual'è il danno massimo che può essere riparato con il Toolkit? - Quel est le maximum de dommages réparable par une trousse à outils ? + Définit la quantité maximale de dégâts pouvant être réparés avec une trousse à outils. ツールキットで修理できる、最大の損傷許容範囲を設定しますか? 어느정도의 피해까지 툴킷으로 수리가 가능합니까? 工具包可以修复的最大损坏值? @@ -1237,7 +1293,7 @@ Umbral de Reparación (Ingeniero) Práh oprav (Inženýr) Limite Riparazioni (Geniere) - Seuil de réparatoin (ingénieur) + Seuil de réparabilité (ingénieurs) 修理のしきい値 (工兵) 정비 한계치 (정비공) 维修门槛 (工兵) @@ -1252,7 +1308,7 @@ ¿Cuál es el daño máximo que puede ser reparado por un ingeniero? Jaké maximální poškození může být opraveno pomoci inženýra? Qual'è il danno massimo che può essere riparato da un Geniere? - Quel est le maximum de dommages qui peuvent être réparés par un ingénieur ? + Définit la quantité maximale de dégâts qu'un ingénieur peut réparer. 工兵が修理できる、最大の損傷許容範囲を設定しますか? 정비공은 어느정도의 피해까지 수리할 수 있습니까? 工兵可以修复的最大损坏值? @@ -1267,7 +1323,7 @@ Eliminar conjunto de herramientas al usarlo Odstranit sadu nástrojů po použití Rimuovi Toolkit dopo l'uso - Enlever la trousse à outils après usage + Retirer la trousse à outils après usage ツールキットを使うと削除 툴킷 사용후 제거 使用后删除工具包 @@ -1282,7 +1338,7 @@ ¿Deben retirarse las herramientas al usarlas? Má být odstraněna sada nástroju po použití? Il Toolkit dev'essere rimosso dopo l'uso? - La trousse à outils devrait-elle être enlevée après usage ? + Définit si la trousse à outils doit être retirée après usage. ツールキットを使うと削除しますか? 툴킷을 사용하면 제거를 합니까? 要在使用后删除工具包吗? @@ -1312,7 +1368,7 @@ Reparar solo en vehículo Pouze opravárenské vozidlo Solo Veicoli Riparazioni - Véhicule de réparation seulement + Véhicules de réparation seulement 修理車両のみ 오직 수리 차량만 维修载具旁 @@ -1327,7 +1383,7 @@ Reparar solo en instalación Pouze opravárenské zařízení Solo Strutture Riparazioni - Installation de réparation seulement + Ateliers de réparation seulement 修理施設のみ 오직 수리 시설만 维修设施旁 @@ -1342,7 +1398,7 @@ Reparar en instalación o vehículo Opravárenské zařízení nebo vozidlo Strutture Riparazioni o Veicoli - Installations ou véhicule de réparation + Ateliers ou véhicules de réparation 修理施設または車両のみ 수리 시설혹은 차량 维修设施或载具旁 @@ -1357,7 +1413,7 @@ Přiřadit Inženýra Asignar ingeniero Assegna Geniere - Assigner le rôle d'ingénieur + Assigner ingénieur(s) 工兵にする 정비공 등록 指派工兵 @@ -1387,7 +1443,7 @@ Lista de los nombres de las unidades que serán clasificados como ingeniero, separados por comas. Seznam jmen jednotek, které budou klasifikovány jako inženýr, oddělit čárkami. Lista di unità che verranno classificate come genieri, separate da virgole. - Liste des noms d'unités qui seront considérées ingénieurs. Séparé par des virgules + Liste d'unités qui seront classées comme ingénieurs, séparées par des virgules. 一覧に記載されたユニット名を、工兵として指定します。コンマで複数を指定できます。 목록내 보직이름은 정비공으로 분류됩니다. 쉼표로 구분합니다. 工兵名单,把单位名称输入在这边即可定义其为工兵。每个单位使用逗号以做区隔。 @@ -1402,7 +1458,7 @@ Es un ingeniero Inženýr E' Geniere - Est ingénieur + Qualification technique 工兵とする 은 정비공이다 是工兵 @@ -1417,7 +1473,7 @@ Selecciona el nivel de conocimientos de ingeniería de la unidad Vyberte úroveň dovednosti inženýra pro jednotku Seleziona il livello di abilità geniere dell'unità - Sélectionner le niveau d'habilité en réparation de l'unité + Choix du niveau de compétence technique de l'unité. ユニットへの工兵スキルを選択 선택한 인원의 정비 실력을 고르십시요 选择工兵的技术水平 @@ -1432,11 +1488,12 @@ Nikdo Ningún Nessuna - Aucun + Aucune なし 없음 + Hiçbiri Engineer @@ -1452,6 +1509,7 @@ 정비공 工兵 工兵 + Mühendis @@ -1463,6 +1521,12 @@ 專精 Zaaw. mechanik 고급 정비공 + Продв. Инженер + Engenheiro Avançado + Ing. avancé + Pokročilý Inženýr + Ingeniero avanzado + Gelişmiş Mühendis Assign one or multiple units as an engineer @@ -1473,7 +1537,7 @@ Asignar una o varias unidades como ingeniero Přiřaďte jednu nebo více osob jako inženýra Assegna una o più unità come genieri - Assigner un ou plusieurs unités comme ingénieur + Assigne une ou plusieurs unités en tant qu'ingénieur. 修理車両として指定 하나 혹은 여러 인원을 정비공으로 등록합니다 指定一个或多个单位为工兵 @@ -1488,7 +1552,7 @@ Asignar vehículo de reparación Přiřaďte opraváresnké vozidlo Assegna Veicolo Riparazioni - Assigner en tant que véhicule de réparation + Affecter véhicule(s) de réparation 修理車両として指定 정비 차량 등록 指定维修载具 @@ -1518,7 +1582,7 @@ Lista de los vehículos que se clasifican como vehículo de reparación, separados por comas. Seznam vozidel, která budou klasifikována jako opravárenská, oddělit čárkami. Lista di Veicoli che verranno considerati veicoli riparazioni, separati da virgole. - Liste de véhicules qui seront considérés comme véhicules de réparation. Séparé par des virgules. + Liste de véhicules qui seront classés comme véhicules de réparation, séparés par des virgules. 一覧に記載されたユニット名を、修理車両として指定します。コンマで複数を指定できます。 목록내 차량은 정비 차량으로 분류됩니다. 쉼표로 구분합니다. 载具名单,把载具名称输入在这边即可定义其为维修载具。每个载具使用逗号以做区隔。 @@ -1548,7 +1612,7 @@ ¿Está el vehículo clasificado como un vehículo de reparación? Je vozidlo klasifikováno jako opravárenské? Il veicolo è classificato dome veicolo riparazioni? - Le véhicule est-il considéré comme un véhicule de réparation ? + Définit s'il s'agit d'un véhicule de réparation. 車両を修理車両と指定しますか? 이 차량을 정비 차량으로 분류합니까? 此载具是维修载具吗? @@ -1563,7 +1627,7 @@ Asignar uno o varios vehículos como vehículo de reparación Přiřaďte jedno nebo více vozidel jako opravárenské vozidlo Assegna uno o più veicoli come veicoli riparazioni - Assigner un ou plusieurs véhicules en tant que véhicule de réparation + Affecte un ou plusieurs véhicules en tant que véhicule de réparation 単体、または複数の車両を修理車両とします 하나 혹은 여러 차량을 정비 차량으로 등록합니다 指定一个或多个载具作为维修载具 @@ -1578,7 +1642,7 @@ Asignar instalación de reparación Přiřaďte opravárenské zařízení Assegna Struttura Riparazioni - Assigner en tant qu'installation de réparation + Affecter atelier(s) de réparation 修理施設とする 정비 시설 등록 指定维修设施 @@ -1608,7 +1672,7 @@ Lista de los objetos que se clasifican como instalaciones para la reparación, separados por comas. Seznam objektů, které budou klasifikovány jako opravárenské zařízení, oddělit čárkami. Lista di oggetti che verranno classificati come strutture riparazioni, separate da virgole. - Liste des objets considérés comme installations de réparation. Séparé par des virgules + Liste d'objets qui seront classés comme ateliers de réparation, séparés par des virgules. 一覧に記載されたユニット名を、修理施設として指定します。コンマで複数を指定できます。 목록내 시설은 정비 시설으로 분류됩니다. 쉼표로 구분합니다. 设施名单,把设施名称输入在这边即可定义其为维修设施。每个设施使用逗号以做区隔。 @@ -1623,7 +1687,7 @@ Es una instalación de reparación Opravárenské zařízení E' Struttura Riparazioni - Est une installation de réparation + Est un atelier de réparation 修理施設とする 은 정비 시설이다 是维修设施 @@ -1638,7 +1702,7 @@ ¿Está el objeto clasificado como una instalación de reparación? Je objekt klasifikován jako opravárenské zařízení? L'oggetto è classificato come struttura riparazioni? - L'objet est-il considéré comme une installation de réparation ? + Définit l'objet comme étant un atelier de réparation. オブジェクトを修理施設として指定しますか? 이 시설을 정비 시설로 분류합니까? 此设施是维修设施吗? @@ -1653,7 +1717,7 @@ Asignar uno o varios objetos como una instalación de reparación Přiřaďte jeden nebo více objektů jako opravárenské zařízení Assegna uno o più oggetti come strutture riparazioni - Assigner un ou plusieurs objets en tant que véhicule de réparation + Assigne un ou plusieurs objets en tant qu'atelier de réparation. ひとつ、または複数オブジェクトに予備部品を追加 하나 혹은 여러 시설을 정비 시설로 등록합니다 指定一个或多个对象作为维修设施 @@ -1683,7 +1747,7 @@ Добавить запасные части в одно или несколько транспортных средств Přidat náhradní díly do jednoho nebo více objektů Aggiungi parti di ricambio ad uno o più oggetti - Ajouter des pièces de rechange à un ou plusieurs objets + Ajoute des pièces de rechange à un ou plusieurs objets. 一覧に追加されたオブジェクトへ予備部品を与えます。コンマで複数を指定できます。 하나 혹은 여러 물체가 예비 부품을 더합니다 添加备件到一个或多个对象上 @@ -1703,6 +1767,7 @@ 목록 名单 名單 + Liste List of objects that will get spare parts added, separated by commas. @@ -1713,7 +1778,7 @@ Список транспортных средств, в которые будут добавляться запчасти, разделенный запятыми. Seznam objektů, které dostanou náhradní díly, oddělit čárkami. Lista di oggetti a cui verranno aggiunte parti di ricambio, separate da virgole. - Liste des objets qui recevront des pièces de réparation en plus. Séparé par des virgules + Liste d'objets dans lesquels des pièces de rechange seront ajoutées, séparés par des virgules. 一覧に追加されたオブジェクトへ予備部品を与えます。コンマで複数を指定できます。 목록내 물체는 예비 부품을 받습니다, 쉼표로 구분합니다. 添加备件到名单的载具上。每个载具使用逗号以做区隔。 @@ -1773,29 +1838,29 @@ Число выбранных запасных частей. Počet vybraných náhradních dílů. Numero di parti di ricambio selezionate. - Nombre de pièces de rechange séléctionnées + Nombre de pièces de rechange séléctionnées. 選択された予備部品の数を選択します。 선택한 부품의 수 选择的备件数量 選擇的備件數量 - - Wheel repair requirements - Erfordernisse zur Reifenreperatur + + Wheel Repair Requirements + Bedingungen für die Reifenreperatur Wym. naprawy kół Requisitos de reparación de ruedas Для ремонта колес требуется Requerimentos para reparo de rodas Vyžaduje opravu kol Requisiti riparazione ruote - Exigences de réparation de roue + Exigences pour réparation des roues タイヤの修理を必要 바퀴 교체 요구사항 维修轮胎限制 維修輪胎限制 - - Items required to remove/replace wheels + + Items required to remove/replace wheels. Gegenstänge, die zum Entfernen/Austauschen eines Reifens benötigt werden Przedmioty potrzebne do wymiany kół Elementos necesarios para quitar/cambiar ruedas @@ -1803,19 +1868,71 @@ Itens requeridos para remover/trocar rodas Položka vyžaduje odstraněná/vyměněná kola Oggetti richiesti per riparare/rimuovere ruote - Items exigés pour enlever/remplacer les roues + Outils nécessaires pour le démontage ou le remplacement des roues. タイヤの除去と交換にアイテムを必要としますか? 바퀴를 제거/교체하는데 필요한 물건 需要特定物品来移除/更换车轮 需要特定物品來移除/更換車輪 + + Misc Repair Requirements + Sonstige Reparaturbedingungen + 部分修理条件 + 額外修理條件 + Exigences pour réparations diverses + Requisiti di riparazione vari + Požadavky pro částečnou opravu + Rózne wymagania do naprawy + Requerimentos para reparo miscelâneo + Requisitos de objetos misceláneos de reparación + Требования к разному ремонту + + + Items required to repair a specific vehicle component or remove/replace tracks. + Gegenstände die benötigt werden, um eine spezifische Fahrzeugkomponente oder eine Kette zu entfernen/auszutauschen. + 車両の特定コンポーネントか履帯の除去/交換にアイテムを必要とします。 + 是否需要物品來修復一些特別載具部位或者移除/替換履帶 + Outils nécessaires pour la réparation d'un équipement spécifique du véhicule, et pour le démontage ou le remplacement des chenilles. + Předměty potřebné k provedení opravy konkrétní části vozidla nebo sundání/výměny pásů. + Przedmioty wymagane do naprawy określonego elementu pojazdu lub usunięcia/wymiany gąsienicy. + Items necessários para reparar uma peça específica ou remover/substituir lagarta. + Objetos necesarios para reparar un componente específico del vehículo o quitar/reemplazar las orugas. + Elementi necessari per riparare un componente specifico del veicolo o per rimuovere/sostituire i cingoli + Предметы, необходимые для ремонта отдельных компонентов или снятия/замены гусеницы. + + + Full Repair Requirements + Bedingungen für vollständige Reparatur + 完全修理条件 + 完整修復條件 + Exigences pour réparations complètes + Requisiti per la riparazione completa + Požadavky pro plnou opravu + Wymagania pełnej naprawy + Requerimentos de Reparo Completo + Requisitos para reparación completa + Требования к полному ремонту + + + Items required to perform a full vehicle repair. + Gegenstände die benötigt werden um ein Fahrzeug vollständig zu reparieren. + 車両の完全修理にアイテムを必要とします。 + 是否需要物品來完整修復載具 + Outils nécessaires pour effectuer une réparation complète des véhicules. + Předměty potřebné k provedení plné opravy vozidla. + Przedmioty wymagane do przeprowadzenia pełnej naprawy pojazdu. + Itens requeridos para realizar um reparo veicular completo. + Objetos requeridos para una reparación completa + Elementi necessari per eseguire una riparazione completa del veicolo. + Предметы, необходимые для полного ремонта техники. + Engine must be off to repair - Motor muss ausgeschaltet zu reparieren sein + Motor muss ausgeschaltet sein um zu reparieren El motor necesita desactivado para la reparación Pro opravu je zapotřebí vypnout motor O motor deve estar desligado para manutenção - Le moteur doit être éteins pour réparer + Le moteur doit être arrêté pour la réparation. Двигатель должен быть выключен для ремонта 修理のためにエンジンを停止させる必要があります。 Silnik musi być wyłączony w celu naprawy @@ -1832,6 +1949,11 @@ 備用履帶 备用履带 Zapasowe Gąsienice + Запасные траки + Esteiras Reservas + Chenilles de rechange + Náhradní pásy + Orugas de repuesto Number of spare tracks in cargo. @@ -1841,6 +1963,11 @@ 設定載具在貨艙內攜帶的備用履帶數量 设定载具在货舱内携带的备用履带数量。 Liczba zapasowych gąsienic w ładunku. + Количество запасных траков в грузовом отсеке + Número de esteiras reservas na Carga + Nombre de chenilles de rechange dans la cargaison. + Počet náhradních pásů v nákladovém prostoru vozidla. + Número de orugas de repuesto en la carga Spare Wheels @@ -1850,6 +1977,11 @@ 備用輪胎 备用轮胎 Zapasowe Koła + Запасные колеса + Pneus Reservas + Roues de secours + Náhradní kola + Ruedas de repuesto Number of spare wheels in cargo. @@ -1859,22 +1991,39 @@ 設定載具在貨艙內攜帶的備用輪胎數量 设定载具在货舱内携带的备用轮胎数量。 Liczba zapasowych kół w ładunku. + Количество запасных колес в грузовом отсеке + Número de pneus reservas na Carga + Nombre de roues de secours dans la cargaison. + Počet náhradních kol v nákladovém prostoru vozidla. + Número de ruedas de repuesto en la carga Auto shut off engine on repair + Motor automatisch ausschalten 修理時にエンジン自動停止 维修时自动关闭发动机。 維修時自動關閉引擎 Motore spento automaticamente durante la riparazione Automatycznie wyłącz silnik podczas napraw + Автоотключение двигателя при ремонте + Desligar motor automaticamente enquanto reparar + Arrêt auto du moteur lors d'une réparation + Automaticky vypnout motor při opravách + Apagar el motor automáticamente al reparar Automatically shut off the engine when doing repairs. + Schaltet den Motor automatisch aus, sobald das Fahrzeug repariert wird. 修理時にエンジンを自動で停止します。 修理时自动关闭发动机。 維修時自動關閉引擎 Spegne automaticamente il motore quando si fanno riparazioni. Automatycznie wyłącz silnik podczas napraw. + Автоматически отключать двигатель при выполнении ремонта + Automaticamente desliga o motor quando iniciar o reparo do veículo. + Coupe automatiquement le moteur lorsque des réparations sont effectuées. + Automaticky vypne motor při zahájení oprav. + Apagar el motor automáticamente al efectuar una reparación diff --git a/addons/respawn/functions/fnc_handleKilled.sqf b/addons/respawn/functions/fnc_handleKilled.sqf index 0a6fcd8ce80..905cd7987be 100644 --- a/addons/respawn/functions/fnc_handleKilled.sqf +++ b/addons/respawn/functions/fnc_handleKilled.sqf @@ -22,6 +22,7 @@ params ["_unit"]; if (ACE_player == _unit && {GVAR(SavePreDeathGear)}) then { _unit setVariable [QGVAR(unitGear), getUnitLoadout _unit]; _unit setVariable [QGVAR(activeWeaponAndMuzzle), [currentWeapon _unit, currentMuzzle _unit, currentWeaponMode _unit]]; + [QGVAR(saveGear), _unit] call CBA_fnc_localEvent; }; if (missionNamespace getVariable [QGVAR(showFriendlyFireMessage), false]) then { diff --git a/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf b/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf index a20c9926f5c..4b1f7e44d83 100644 --- a/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf +++ b/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [ACE_Player, killer] call ace_module_fnc_functionName + * [ACE_Player, killer] call ace_respawn_fnc_showFriendlyFireMessage * * Public: No */ diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index d87b6efa7c6..9311f2a351d 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -3,11 +3,17 @@ Respawn + Wiedereinstieg Riapparizione 重生 重生 - リスポン + リスポーン Odrodzenie + Возрождение + Ressurgimento + Réapparition + Znovuzrození + Yeniden Doğma Deploy in 5 seconds... @@ -16,7 +22,7 @@ Despliegue en 5 segundos... Возрождение через 5 секунд... Rozmieszczenie za 5 sekund... - Respawn za 5 sekund... + Znovuzrození za 5 sekund... Kihelyezés 5 másodperc múlva... Dispiegamento in 5 secondi... Será posicionado em 5 segundos... @@ -56,10 +62,11 @@ 기지로 순간이동 传送至基地 傳送至基地 + Üsse Işınlan Teleport to Rallypoint - Teleport na Rallypoint + Teleport na Bod shromáždění Teletransportar a Punto de reunión Zum Sammelpunkt teleportieren Teleport do punktu zbiórki @@ -88,6 +95,7 @@ 기지로 순간이동함 已传送至基地 已傳送至基地 + Üsse Işınlan Teleported to Rallypoint @@ -96,7 +104,7 @@ Teletransportado al punto de reunión Вы были телепортированы на точку сбора Przeteleportowano do punktu zbiórki - Teleportován na rallypoint + Teleportován na bod shromáždění Gyülekezőpontra teleportálva Teleportato al rallypoint Teletransportado para o Rallypoints @@ -114,7 +122,7 @@ Point de ralliement OUEST (Base) Rallypoint West (Base) Gyülekezőpont, Nyugat (Bázis) - Rallypoint Západ (Základna) + Bod shromáždění Západ (Základna) Ponto de encontro Oeste (Base) ラリーポイント 同盟軍 (ベース) 蓝方集合点 (基地) @@ -130,7 +138,7 @@ Point de ralliement EST (Base) Rallypoint East (Base) Gyülekezőpont, Kelet (Bázis) - Ralllypoint Východ (Základna) + Bod shromáždění Východ (Základna) Ponto de encontro Lest (Base) ラリーポイント OPFOR軍 (ベース) 红方集合点 (基地) @@ -146,7 +154,7 @@ Point de ralliement Indépendant (Base) Rallypoint Independent (Base) Gyülekezőpont, Független (Bázis) - Rallypoint Nezávislý (Základna) + Bod shromáždění Nezávislý (Základna) Ponto de encontro Independente (Base) ラリーポイント 独立軍 (ベース) 独立方集合点 (基地) @@ -162,7 +170,7 @@ Point de ralliement OUEST Rallypoint West Gyülekezőpont, Nyugat - Rallypoint Západ + Bod shromáždění Západ Ponto de encontro Oeste ラリーポイント 同盟軍 蓝方集合点 @@ -178,7 +186,7 @@ Point de ralliement EST Rallypoint East Gyülekezőpont, Kelet - Rallypoint Východ + Bod shromáždění Východ Ponto de encontro Leste ラリーポイント OPFOR軍 红方集合点 @@ -194,7 +202,7 @@ Point de ralliement Indépendant Rallypoint Independent Gyülekezőpont, Független - Rallypoint Nezávislý + Bod shromáždění Nezávislý Ponto de encontro Independente ラリーポイント 独立軍 独立方集合点 @@ -208,7 +216,7 @@ Wiedereinstiegs-System Systém znovuzrození Sistema de Renascimento - Système de Respawn + Système de réapparition Respawn-rendszer Возрождение Sistema Respawn @@ -224,14 +232,15 @@ Ausrüstung speichern? Uložit výbavu? Salvar equipamento? - Sauver l'équipement? + Sauver l'équipement Felszerelés elmentése? Сохранять снаряжение? Salva Equipaggiamento? - 装備を保存? + 装備保存を有効化 장비를 저장합니까? 储存装备? 儲存裝備? + Kıyafetleri Kaydet? Respawn with the gear a soldier had just before his death? @@ -240,11 +249,11 @@ Mit der Ausrüstung, die ein Soldat vor seinem Tod hatte, wiedereinsteigen? Znovuubjevit s výbavou kterou měl voják před smrtí? Renascer com o equipamento que um soldado tinha antes de sua morte? - Conserve l'équipement au Respawn + Le soldat réapparaît avec l'équipement qu'il avait juste avant sa mort. Az egység halála előtti felszerelésével való respawnolása? Возрождать солдата с тем же снаряжением, которое было на нем при смерти? Respawna con l'equipaggiamento che il soldato aveva appena prima di morire? - ユニットが死ぬ前に持っていた装備でリスポンしますか? + ユニットが死ぬ前に持っていた装備でリスポーンできるように設定できます。 죽기 전에 가지고 있던 장비로 재배치합니까? 是否在重生时载入死亡前的装备? 是否在重生時載入死亡前的裝備? @@ -256,14 +265,15 @@ Sollen Leichen automatisch verschwinden? Odstranit těla? Remover corpos? - Enlever les coprs? + Enlever les corps Holttestek eltávolítása? Удалять трупы? Rimuovi corpi? - 死体を削除? + 死体を削除 시체를 제거합니까? 删除尸体? 刪除屍體? + Bedeni Sil ? Remove player bodies after disconnect? @@ -272,31 +282,37 @@ Entferne Spielerkörper nach dem Trennen einer Verbindung? Odstranit hráčova těla po odpojení? Remover corpos dos jogadores depois de desconectar? - Enlève les corps de joueurs après déconnection + Enlève le cadavre des joueurs quand ils se déconnectent. Játékosi testek eltávolítása távozás után? Удалять трупы игроков после дисконнекта? Rimuovi i corpi dei giocatori quando si disconnettono? - 切断後はプレイヤーの死体を削除しますか? + 切断後はプレイヤーの死体を削除するかどうかを設定できます。 접속이 끊긴 플레이어의 시체를 제거합니까? 要删除已离线的玩家尸体吗? 要刪除已離線的玩家屍體嗎? Body remove timer + Zeit bis Körper entfernt werden Timer rimozione corpo 屍體移除計時器 尸体移除计时器 死体削除タイマー Czas usunięcia ciała + Время удаления трупов + Tempo para remover corpo + Minuterie enlèvement corps + Časovač odstranění mrtvol + Bedenin Silinme Süresi This module enables you to configure ACE functionality specific to respawns. Moduł ten pozwala dostosować ustawienia odrodzenia (respawnu). Dieses Modul erlaubt es, die Wiedereinstiegs-Einstellungen anzupassen. - Tento modul umožňuje nastavení znovuzrození (spawn). + Tento modul umožňuje nastavení znovuzrození (respawn). Este módulo permite que você personalize as configurações do renascimento (Spawn). Этот модуль позволяет настроить систему возрождения. - Ce module permet de régler les options de Respawn + Ce module vous permet de configurer les fonctionnalités ACE spécifiques à la réapparition des joueurs. Questo modulo ti permette di configurare le funzionalità ACE specifiche dei respawn. Este módulo permite configurar parámetros relacionados con la reaparición 有効化するとリスポンへ ACE 機能を設定できます。 @@ -311,7 +327,7 @@ Nachricht bei Freundbeschuss Upozornění na přátelskou střelbu Mensagens de fogo amigo - Message de tirs fraticides + Messages de tir ami Baráti tűz üzenetek Сообщения об огне по своим Messaggi Fuoco Amico @@ -327,7 +343,7 @@ Zobrazí zprávu v chatu v případě, když budete střílet na vlastní jednotky. Ve zprávě se zobrazí kdo na koho střílel, popř. kdo koho zabil. Usando este módulo em uma missão para exibir mensagens chat, no caso de quando você faz um fogo amigo - então a mensagem será exibida mostrando quem matou quem. Отображает сообщение в чате, в случае, когда убивают союзных игроков. В докладе указывается, кто стрелял, в кого. Кто кого убил. - Ce module permet l'affiche de message dans le chat lors d'un tir fraticide et indique qui a tué qui. + L'utilisation de ce module fait en sorte qu'à chaque joueur mort par un tir ami, un rapport sera affiché dans le chat, indiquant qui a tué qui. Usando questo modulo nella tua missione farà in modo che ogni uccisione per fuoco amico venga mostrata in forma di messaggio in chat. El usar este módulo, todas las muertes por fuego amigo serán indicadas en el chat. もし友軍誤射による死者が出た場合は、チャットにてその旨を表示します。 @@ -342,7 +358,7 @@ Sammelpunktssystem Systém shromáždění Sistema de ponto de encontro - Système de point de ralliement + Système de points de ralliement Gyülekezőpont-rendszer Система точек сбора Sistema Punto di Raccolta @@ -360,7 +376,7 @@ Этот модуль позволяет вам указать место сбора, куда вы можете быстро телепортироваться с "базы". Требуется наличие соответствующих объектов на карте - базы и флага. Они могут быть найдены в категории Пусто -> ACE Возрождения. Questo modulo ti consente di usare Punti di Raccolta in missione, a cui ti puoi teleportare rapidamente dalla bandiera in base. Richiede il piazzamento di oggetti speciali in mappa - base e bandiera. Entrambi disponibili nella categoria Vuoto -> Respawn ACE Este módulo permite usar puntos de reunión en la misión, a los que pueden teletransportarse las unidades desde la bandera de base. Requiere colocar objetos especiales en el mapa: las banderas de base y de reunión, ambas disponibles en la categoría Vacio-> Reaparición ACE - Ce module vous permet d'utiliser les "rally points" auxquels vous pouvez vous téléporter rapidement depuis un drapeau à la base. Il nécessite le placement d'objets spéciaux sur la carte - base et drapeau, disponibles dans la catégorie Vide -> ACE Respawn. + Ce module vous permet d'utiliser des points de ralliement dans les missions, vers lesquels vous pouvez vous téléporter rapidement depuis le drapeau de la base.\nNécessite de placer des objets spéciaux sur la carte - base et drapeau, tous deux disponibles dans la catégorie "Vide -> ACE Réapparition". ミッションでベースから素早く移動できるラリーポイントを使えるようにします。ゲーム内に専用オブジェクトとなるベースとフラッグを設置している必要があります。両オブジェクトは Empty 下の ACE リスポンから設置できます。 이 모듈은 미션 중에 기지 깃발에서 집결지로 빠르게 텔레포트 시켜주는 역활을 합니다. 지도 상에 기지 및 깃발이 필요합니다. 두 가지 모두 Empty->ACE Respawn 카테고리에서 찾을 수 있습니다. 摆放此模块后,你将能在任务中布署集合点,使你可以快速往返基地与前线。要使用本功能,请记得放上空物件->ACE 重生里面的基地与旗帜。 @@ -373,7 +389,7 @@ Bewege Sammelpunkt Přesun na shromaždiště Mover para ponto de encontro - Bouger le point de ralliement + Déplacer le point de ralliement Gyülekezőpont mozgatása Двигать точку сбора Sposta Punto di Raccolta @@ -389,7 +405,7 @@ ACE-Wiedereinstieg ACE Znovuzrození ACE Respawn - ACE Respawn + ACE Réapparition ACE Respawn ACE Возрождение Rigenerazione ACE @@ -397,6 +413,7 @@ ACE 재배치 ACE 重生 ACE 重生 + ACE Yeniden Doğma diff --git a/addons/safemode/XEH_PREP.hpp b/addons/safemode/XEH_PREP.hpp index ab2a755a663..2f23aa02c9e 100644 --- a/addons/safemode/XEH_PREP.hpp +++ b/addons/safemode/XEH_PREP.hpp @@ -3,3 +3,4 @@ PREP(lockSafety); PREP(playChangeFiremodeSound); PREP(setSafeModeVisual); PREP(unlockSafety); +PREP(setWeaponSafety); diff --git a/addons/safemode/functions/fnc_lockSafety.sqf b/addons/safemode/functions/fnc_lockSafety.sqf index e3c1b71f309..44c7208b433 100644 --- a/addons/safemode/functions/fnc_lockSafety.sqf +++ b/addons/safemode/functions/fnc_lockSafety.sqf @@ -17,9 +17,6 @@ * Public: No */ -// don't immediately switch back -if (inputAction "nextWeapon" > 0) exitWith {}; - params ["_unit", "_weapon", "_muzzle"]; private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []]; @@ -60,7 +57,19 @@ if (_unit getVariable [QGVAR(actionID), -1] == -1) then { }; if (_muzzle isEqualType "") then { + private _laserEnabled = _unit isIRLaserOn _weapon || {_unit isFlashlightOn _weapon}; + _unit selectWeapon _muzzle; + + if ( + _laserEnabled + && { + _muzzle == primaryWeapon _unit // prevent UGL switch + || {"" == primaryWeapon _unit} // Arma switches to primary weapon if exists + } + ) then { + {_unit action [_x, _unit]} forEach ["GunLightOn", "IRLaserOn"]; + }; }; // play fire mode selector sound diff --git a/addons/safemode/functions/fnc_setWeaponSafety.sqf b/addons/safemode/functions/fnc_setWeaponSafety.sqf new file mode 100644 index 00000000000..4ad0174b202 --- /dev/null +++ b/addons/safemode/functions/fnc_setWeaponSafety.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: Brostrom.A + * Safe or unsafe the given weapon based on weapon state; locked or unlocked. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: State + * + * Return Value: + * None + * + * Example: + * [ACE_player, currentWeapon ACE_player, true] call ace_safemode_fnc_setWeaponSafety + * + * Public: Yes + */ + +params [ + ["_unit", objNull, [objNull]], + ["_weapon", "", [""]], + ["_state", true, [true]] +]; + +if (_weapon == "") exitWith {}; + +private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []]; + +_weapon = configName (configFile >> "CfgWeapons" >> _weapon); + +private _muzzle = currentMuzzle _unit; + +if !(_state isEqualTo (_weapon in _safedWeapons)) then { + [_unit, _weapon, _muzzle] call FUNC(lockSafety); +}; diff --git a/addons/safemode/functions/fnc_unlockSafety.sqf b/addons/safemode/functions/fnc_unlockSafety.sqf index 5a787277e4f..3194de6f14d 100644 --- a/addons/safemode/functions/fnc_unlockSafety.sqf +++ b/addons/safemode/functions/fnc_unlockSafety.sqf @@ -30,8 +30,20 @@ if (_safedWeapons isEqualTo []) then { _unit setVariable [QGVAR(actionID), -1]; }; +private _laserEnabled = _unit isIRLaserOn _weapon || {_unit isFlashlightOn _weapon}; + _unit selectWeapon _muzzle; +if ( + _laserEnabled + && { + _muzzle == primaryWeapon _unit // prevent UGL switch + || {"" == primaryWeapon _unit} // Arma switches to primary weapon if exists + } +) then { + {_unit action [_x, _unit]} forEach ["GunLightOn", "IRLaserOn"]; +}; + if (inputAction "nextWeapon" > 0) then { // switch to the last mode to roll over to first after the default nextWeapon action // get weapon modes diff --git a/addons/safemode/stringtable.xml b/addons/safemode/stringtable.xml index e5eff7255cc..9cabffca46d 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -16,6 +16,7 @@ 안전 모드 保险模式 保險模式 + Emniyet Modu Take off Safety @@ -25,7 +26,7 @@ Uvolnit pojistku Biztonsági kapcsoló eltolása Снять с предохранителя - Enlever sécurité + Enlever la sécurité Togli la sicura Tirar segurança 安全装置を外す @@ -48,6 +49,7 @@ 안전장치 적용 关保险 關保險 + Emniyete alındı Took off Safety @@ -64,6 +66,7 @@ 안전장치 해제됨 已开保险 已開保險 + Emniyetten çıkartıldı diff --git a/addons/sandbag/stringtable.xml b/addons/sandbag/stringtable.xml index 9284d234680..3848e1d6d3c 100644 --- a/addons/sandbag/stringtable.xml +++ b/addons/sandbag/stringtable.xml @@ -1,6 +1,6 @@ - + Sandbag Sandsack @@ -16,6 +16,7 @@ 모래주머니 沙包 沙包 + Kum Torbası Sandbag (empty) @@ -32,6 +33,7 @@ 모래주머니(비어있음) 沙包 (空) 沙包 (空) + Kum Torbası (Boş) Cannot build here @@ -39,7 +41,7 @@ Установка на этом месте невозможна Nie można tu budować No se puede construir aqui - Impossible de construire ici + Impossible de construire ici. Zde nelze postavit Impossibile costruire qui Nem teheted ide @@ -48,6 +50,7 @@ 여기에 지을 수 없습니다 无法放置在此 無法放置在此 + Buraya inşa edilemez Pick up Sandbag @@ -55,7 +58,7 @@ Взять мешок с песком Zabierz worek Coger saco de arena - Prendre sac de sable + Prendre le sac de sable Zvednout pytel Prendi Sacco di Sabbia Homokzsák felvétele @@ -64,6 +67,7 @@ 모래주머니 줍기 捡起沙包 撿起沙包 + Kum torbasını al Carry Sandbag @@ -71,7 +75,7 @@ Нести мешок с песком Przenieś worek Portar saco de arena - Porter sac de sable + Porter le sac de sable Nést pytel Trasporta Sacco di Sabbia Homokzsák cipelése @@ -80,6 +84,7 @@ 모래주머니 옮기기 搬运沙包 搬運沙包 + Kum torbasını taşı End Carrying @@ -87,7 +92,7 @@ Завершить переноску Zostaw worek Dejar de portar - Arreter de porter + Arrêter de porter Položit Fine Trasporto Cipelés abbahagyása @@ -96,6 +101,7 @@ 그만 옮기기 停止搬运 停止搬運 + Taşımayı bitir Drop Sandbag @@ -103,7 +109,7 @@ Положить мешок Upuść worek Soltar saco de arena - Lacher sac de sable + Lâcher le sac de sable Odložit pytel Lascia Sacco di Sabbia Homokzsák eldobása @@ -112,6 +118,7 @@ 여기에 놓기 放下沙包 放下沙包 + Kum Torbasını Bırak Confirm Deployment @@ -119,7 +126,7 @@ Подтвердить установку Potwierdź rozłożenie Confirmar despliegue - Confirmer Déploiement + Confirmer l'installation Potvrdit Položení Conferma Posizionamento Lerak @@ -135,7 +142,7 @@ Отменить установку Anuluj rozłożenie Cancelar despliegue - Annuler Déploiement + Annuler l'installation Zrušit Položení Cancella Posizionamento Visszavonás @@ -151,7 +158,7 @@ Установить мешок с песком Rozłóż worek z piaskiem Desplegar saco de arena - Deployer sac de sable + Installer un sac de sable Umístit pytel Posiziona Sacco di Sabbia Homokzsák lerakása @@ -176,6 +183,7 @@ 모래주머니 상자 沙包箱 沙包箱 + Kum Torbası Kutusu Here is no sand @@ -183,7 +191,7 @@ Здесь нет песка Tu nie ma piasku Aqui no hay arena - Pas de sable ici + Il n'y a pas de sable ici. Tady není písek Qui non cè Sabbia Itt nincs homok @@ -208,6 +216,7 @@ 돌리기 旋转 旋轉 + Yönlendir diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index 86c4820caa7..c533cf04c26 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -218,11 +218,16 @@ class CfgWeapons { class Rifle_Short_Base_F: Rifle_Base_F {}; class Rifle_Long_Base_F: Rifle_Base_F {}; + class DMR_06_base_F: Rifle_Long_Base_F { + ACE_IronSightBaseAngle = 0.018227; + ACE_RailHeightAboveBore = 3.27488; + }; + class DMR_07_base_F: Rifle_Long_Base_F { ACE_RailHeightAboveBore = 5.07109; ACE_IronSightBaseAngle = -0.00160721; }; - + class arifle_MX_Base_F: Rifle_Base_F { class Single: Mode_SemiAuto {}; class FullAuto: Mode_FullAuto {}; @@ -307,7 +312,7 @@ class CfgWeapons { ACE_RailHeightAboveBore = 5.75468; ACE_IronSightBaseAngle = 0.0863227; }; - + class arifle_MX_F: arifle_MX_Base_F { ACE_RailHeightAboveBore = 2.80201; ACE_IronSightBaseAngle = 0.19502; @@ -375,6 +380,14 @@ class CfgWeapons { ACE_IronSightBaseAngle = -0.1532926; }; + class arifle_MSBS65_base_F: Rifle_Base_F { + ACE_RailHeightAboveBore = 5.2; + ACE_IronSightBaseAngle = -0.028648; + }; + class arifle_MSBS65_Mark_base_F: arifle_MSBS65_base_F { + ACE_IronSightBaseAngle = -0.045837; + }; + class EBR_base_F: Rifle_Long_Base_F {}; class LRR_base_F: Rifle_Long_Base_F {}; class GM6_base_F: Rifle_Long_Base_F {}; @@ -383,7 +396,6 @@ class CfgWeapons { class DMR_03_base_F: Rifle_Long_Base_F {}; class DMR_04_base_F: Rifle_Long_Base_F {}; class DMR_05_base_F: Rifle_Long_Base_F {}; - class DMR_06_base_F: Rifle_Long_Base_F {}; class srifle_EBR_F: EBR_base_F { ACE_RailHeightAboveBore = 1.98812; @@ -417,10 +429,6 @@ class CfgWeapons { ACE_RailHeightAboveBore = 3.91334; ACE_IronSightBaseAngle = 0.0123425; }; - class srifle_DMR_06_camo_F: DMR_06_base_F { - ACE_RailHeightAboveBore = 3.27488; - ACE_IronSightBaseAngle = 0.018227; - }; class MMG_01_base_F; class MMG_02_base_F; diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index a7720c62f54..23530f868b1 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -34,7 +34,7 @@ GVAR(scopeAdjust) = [[[0,0],0,[0,0],0], [[0,0],0,[0,0],0], [[0,0],0,[0,0],0]]; private _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; _layer cutText ["", "PLAIN", 0]; - if !(isNil QGVAR(fadePFH)) then { + if (!isNil QGVAR(fadePFH)) then { [GVAR(fadePFH)] call CBA_fnc_removePerFrameHandler; GVAR(fadePFH) = nil; }; diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index ada869b5fdf..679ebdb08a6 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -67,7 +67,7 @@ if (GVAR(simplifiedZeroing)) then { // Set the time when to hide the knobs GVAR(timeToHide) = diag_tickTime + 3.0; -if !(isNil QGVAR(fadePFH)) exitWith {}; +if (!isNil QGVAR(fadePFH)) exitWith {}; // Launch a PFH to wait and fade out the knobs GVAR(fadePFH) = [{ diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 2c6030801f7..0cc4b3e7cd5 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -7,10 +7,14 @@ スコープ 조준경 Celowniki optyczne - Scopes + Lunettes de visée Mirini 瞄准镜 瞄準鏡 + Прицелы + Mira Telescópica + Puškohledy + Dürbünler Enable ACE Scope adjustment @@ -18,10 +22,13 @@ ACE スコープ調節を有効化 ACE 조준경 영점조작 활성화 Włącz ustawienia celowników optycznych ACE - Active ACE Scope adjustment + Activer le réglage ACE des lunettes Abilita Regolazione mirino ACE 开启ACE瞄准镜归零调节 開啟ACE瞄準鏡歸零調節 + Включить настройку прицелов ACE + Permitir ajustes de Mira do ACE + Povolit ACE náměr puškohledů Enable adjustment turrets on high powered scopes @@ -29,10 +36,13 @@ 高倍率スコープでACE スコープ調節を有効化 고성능 조준경 조절 나사 활성화 Włącz pokrętła regulacyjne - Permet de régler la hausse et la dérive sur les optiques de visée à fort grossissement + Active les tourelles de réglage des lunettes de visée à fort grossissement. Abilita la regolazione delle torrette nei mirini a lunga gittata 开启高倍率瞄准镜归零调节 開啟高倍率瞄準鏡歸零調節 + Включает регулировочные барабанчики ввода поправок на прицелах с высокой кратностью + Permite que as Miras Telescópicas sejam ajustadas com ACE + Povolí náměr puškohledů pomocí komínků optiky na seřízení zameřovacího kříže u kompatibilních puškohledů. Force adjustment turrets @@ -40,21 +50,27 @@ ACE スコープ調節を有効化 조절 나사 강제 Wymuś użycie pokręteł regulacyjnych - Impose le réglage de la hausse/dérive + Forcer les tourelles de réglage Forza la regolazione delle torrette 强制使用归零调节 強制使用歸零調節 + Включить регулировку ненастроенных прицелов + Força ajustes ACE para Miras + Vynutit použití komínků - Force usage of adjustmet turrets on high powered scopes + Force usage of adjustment turrets on high powered scopes Erzwinge Absehenverstellungen für Waffen mit Zielfernrohren 高倍率スコープで調整の使用を強制させます 고성능 조준경의 조절 나사 사용을 강제합니다 Wymuś użycie pokręteł regulacyjnych dla celowników o dużym powiększeniu - Impose le réglage de la hausse/dérive sur les optiques de visée à fort grossissement + Force l'utilisation des tourelles de réglage sur les lunettes de visée à fort grossissement. Forza l'uso della regolazione nei mirini a lunga gittata 强制为高倍率瞄准镜开启归零调节 強制為高倍率瞄準鏡開啟歸零調節 + Принудительно использовать барабанчики ввода поправок для ненастроенных прицелов с высокой кратностью + Força o uso dos controles de ajuste de Mira do ACE em Miras Telescópicas + Vynutí používání komínků u puškohledů. Correct zeroing @@ -62,10 +78,13 @@ ゼロイン調節 영점 고치기 Poprawka zerowania - Corrige le zérotage + Corriger le zérotage Correggi azzeramento 修正归零 修正歸零 + Корректировать пристрелку + Corrigir Zeramento + Opravit náměr Corrects the zeroing of all small arms sights @@ -73,10 +92,13 @@ 全ての小口径用照準器のゼロインを調節します 모든 소화기의 영점을 고칩니다 Poprawia zerowanie wszystkich celowników broni ręcznej - Corrige le zérotage des optiques de visée des petites armes + Corrige le zérotage de tous les viseurs d'armes légères. Corregge l'azzeramento di tutti i mirini di bassa portata 为所有小口径武器修正归零 為所有小口徑武器修正歸零 + Позволяет корректировать пристрелку для всех прицелов стрелкового оружия + Corrige o Zeramento de todas as miras de armas pequenas. (Zeroing) + Opravuje náměr mířidel všech ručních zbraní Overwrite zero distance @@ -84,10 +106,13 @@ ゼロイン距離を上書き 영점거리 덮어쓰기 Nadpisuje ustawienie dla zerowego dystansu - Remplace la distance de zérotage + Écraser la distance de zérotage Sovrascrivi la distanza zero 覆写归零距离 覆寫歸零距離 + Перезаписать дальность пристрелки + Sobrepor distância zero + Přepsat vzdálenost náměru Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes @@ -95,10 +120,13 @@ 'defaultZeroRange'設定を使う高倍率スコープのゼロイン距離を上書きします 기존 고성능 조준경의 영점거리에 '기본설정 영점거리' 를 덮어씌웁니다 Używa 'defaultZeroRange' zamiast ustawionej odległości zerowania dla celowników o duzym przybliżeniu - Utilise le paramètre 'defaultZeroRange' pour remplacer la distance de zérotage sur les optiques de visée à fort grossissement + Utilise le paramètre "Distance de zérotage par défaut" pour remplacer la distance de zérotage des lunettes de visée à fort grossissement. Usa le impostazioni di "defaultZeroRange" (Portata Zero Predefinita) per sovrascrivere la portata zero dei mirini a lunga gittata 使用'defaultZeroRange'来为高倍率瞄准镜覆写预设归零距离 使用'defaultZeroRange'來為高倍率瞄準鏡覆寫預設歸零距離 + Использует настройку 'defaultZeroRange' для перенастройки дальности пристрелки прицелов с высокой кратностью + Utiliza a configuração 'Distância Zero Padrão' para sobrepor a distância zero de Miras Telescópicas + Používá nastavení 'defaultZeroRange' na přepsání vzdálenosti náměru pro puškohledy Default zero distance @@ -110,6 +138,9 @@ Distanza zero predefinita 预设归零距离 預設歸零距離 + Дальность пристрелки по умолчанию + Distância Zero Padrão + Standardní vzdálenost náměru High powered scopes will be zeroed at this distance @@ -117,10 +148,13 @@ 高倍率スコープのゼロイン距離はこの設定になります 고성능 조준경이 정해진 수만큼 영점거리를 맞추게 됩니다. Celowniki o dużym powiększeniu będą zerowane dla tej odległości - Distance de zérotage par défaut des optiques de visée à fort grossissement + Distance de zérotage des lunettes de visée à fort grossissement. I mirini a lunga gittata verranno azzerrati a questa distanza 高倍率瞄准镜将归零在这个距离上 高倍率瞄準鏡將歸零在這個距離上 + Дальность, на которую будут пристреляны прицелы с высокой кратностью + Miras Telescópicas serão zeradas nessa distância + Puškohledy budou naměřené na tuto vzdálenost Reference temperature @@ -132,6 +166,9 @@ Temperatura di riferimento 参考温度 參考溫度 + Референсная температура + Temperatura de Referência + Referenční teplota Temperature at which the scope was zeroed @@ -139,10 +176,13 @@ スコープがゼロインされる温度 조준경 영점조준시 온도 Temperatura, przy której celownik został wyzerowany - Température de référence pour le zérotage des optiques + Température de référence pour le zérotage des lunettes. Temperatura a cui è stato azzerato il mirino 武器参考多少温度来进行归零. 武器參考多少溫度來進行歸零. + Температура, при которой выполнена пристрелка прицела + Temperatura na qual a mira foi zerada. + Teplota za které byl puškohled naměřen Reference barometric pressure @@ -154,6 +194,9 @@ Pressione barometrica di riferimento 参考大气压力 參考大氣壓力 + Референсное давление + Pressão Barométrica de Referência + Referenční barometrický tlak Barometric pressure at which the scope was zeroed @@ -161,10 +204,13 @@ スコープがゼロインされる気圧 조준경 영점조준시 기압 Ciśnienie barometryczne, przy którym celownik został wyzerowany - Pression barométrique de référence pour le zérotage des optiques + Pression barométrique de référence pour le zérotage des lunettes. Pressione barometrica a cui è stato azzerato il mirino 武器参考多少大气压力来进行归零。 武器參考多少大氣壓力來進行歸零。 + Давление, при котором выполнена пристрелка прицела + Pressão Barométrica de quando a mira foi zerada. + Barometrický tlak za kterého byl puškohled naměřen Reference humidity @@ -176,6 +222,9 @@ Umidità di riferimento 参考湿度 參考濕度 + Референсная влажность + Humidade de Referência + Referenční vlhkost vzduchu Humidity at which the scope was zeroed @@ -183,10 +232,13 @@ スコープがゼロインされる湿度 조준경 영점조준시 습도 Wilgotność powietrza, przy której celownik został wyzerowany - Taux d'humidité de référence pour le zérotage des optiques + Taux d'humidité de référence pour le zérotage des lunettes. Umidità a cui è stato azzerato il mirino 武器参考多少湿度来进行归零。 武器參考多少濕度來進行歸零。 + Влажность, при которой выполнена пристрелка прицела + Humidade na qual a mira foi zerada. + Vlhkost vzduchu za které byl puškohled naměřen Deduce pressure from altitude @@ -194,10 +246,13 @@ 高度により圧が減少 고도에 맞춰 기압 설정 Ciśnienie określone na podstawie wysokości - Pression selon l'altitude + Déterminer la pression selon l'altitude Ricava la pressione dall'altitudine 高度影响大气压力 高度影響大氣壓力 + Просчитать давление из высоты + Deduzir pressão pela altitude + Snížit tlak podle nadmořské výšky Deduce the barometric pressure from the terrain altitude @@ -205,10 +260,13 @@ 標高により気圧が減少されます 주변 고도에 맞춰 기압을 설정합니다 Określ ciśnienie barometryczne na podstawie wysokości terenu - Détermine la pression barométrique selon l'altitude du terrain + Détermine la pression barométrique en fonction de l'altitude du terrain. Ricava la pressione barometrica dall'altitudine del terreno 在不同高度上会有不同的大气压力 在不同高度上會有不同的大氣壓力 + Давление определяется по высоте + Deduz a pressão barométrica pela altitude do terreno. + Snížit barometrický tlak podle současné nadmořské výšky terénu Use legacy UI @@ -219,6 +277,10 @@ 昔の UI を使用 기존 UI 사용 Wykorzystaj legacy UI + Использовать устаревший интерфейс + Usar Interface Antiga + Utiliser l'ancienne IU + Používat staré UI Displays elevation and windage with signed numbers @@ -229,6 +291,10 @@ 印付きの数字で仰角と横風を表示 기존의 부호가 있는 숫자로 표고와 폭을 표시합니다. Wyświetla elewację i tarcie powietrza poprzez podpisane liczby + Отображает горизонтальные и вертикальные поправки с подписанными числами + Exibir elevação e vento com número sinalizados. + Affiche les valeurs de hausse et de dérive avec des nombres signés. + Zobrazovat elevaci a vítr s znaménky plus a mínus. Simplified zeroing @@ -239,6 +305,10 @@ 簡單歸零 简单归零 Uproszczone zerowanie + Упрощенная пристрелка + Zeramento Simplificado + Zérotage simplifié + Zjednodušené naměřování Replicates the vanilla zeroing system for riflescopes. @@ -249,12 +319,16 @@ 使用原版的歸零系統來取代ACE複雜的歸零模擬。 使用原版的归零系统来取代ACE复杂的归零模拟。 Replikuje system zerowania, dla celowników karabinowych, z domyślnej gry. + Использует ванильную систему прицеливания для прицелов + Imita o sistema de zeramento vanilla para miras de rifle. + Reproduit le système de zérotage vanilla pour les lunettes. + Replikuje systém naměřování puškohledů ze základní hry. Minor adjustment up Kleine Korrektur hoch Zerowanie powoli w górę - Малая корректировка ВВЕРХ + Малая поправка ВВЕРХ Ajuste menor arriba Regola leggermente alzata in alto Hausse + @@ -270,7 +344,7 @@ Minor adjustment down Kleine Korrektur runter Zerowanie powoli w dół - Малая корректировка ВНИЗ + Малая поправка ВНИЗ Ajuste menor abajo Regola leggermente alzata in basso Hausse - @@ -286,7 +360,7 @@ Minor adjustment right Kleine Korrektur rechts Zerowanie powoli w prawo - Малая корректировка ВПРАВО + Малая поправка ВПРАВО Ajuste menor derecha Regola leggermente il tiro a destra Dérive + @@ -302,7 +376,7 @@ Minor adjustment left Kleine Korrektur links Zerowanie powoli w lewo - Малая корректировка ВЛЕВО + Малая поправка ВЛЕВО Ajuste menor izquierda Regola leggermete il tiro a sinistra Dérive - @@ -318,7 +392,7 @@ Major adjustment up Große Korrektur hoch Zerowanie w górę - Большая корректировка ВВЕРХ + Большая поправка ВВЕРХ Ajuste mayor arriba Regola l'alzata in alto Hausse +++ @@ -334,7 +408,7 @@ Major adjustment down Große Korrektur runter Zerowanie w dół - Большая корректировка ВНИЗ + Большая поправка ВНИЗ Ajuste mayor abajo Regola l'alzata in basso Hausse - - - @@ -350,7 +424,7 @@ Major adjustment right Große Korrektur rechts Zerowanie w prawo - Большая корректировка ВПРАВО + Большая поправка ВПРАВО Ajuste mayor derecha Regola il tiro a destra Dérive +++ @@ -366,7 +440,7 @@ Major adjustment left Große Korrektur links Zerowanie w lewo - Большая корректировка ВЛЕВО + Большая поправка ВЛЕВО Ajuste mayor izquierda Regola il tiro a sinistra Dérive - - - @@ -382,10 +456,10 @@ Set zero adjustment Nullung durchführen Ustaw wyzerowanie - Сбросить корректировку + Установить дальность пристрелки Establecer ajuste a cero Imposta i valori dell'azzeramento - RAZ corrections + Réglage du zéro Állítások nullázása Zerar ajuste Vynulovat korekci @@ -403,6 +477,10 @@ 重設歸零 重设归零 Zresetuj wyzerowanie + Сбросить дальность пристрелки + Resetar Ajuste Zero + Réinitialiser le réglage du zéro + Reset vynulování This module adds windage and elevation adjustment turrets on high power rifle scopes. @@ -410,10 +488,13 @@ このモジュールは高倍率ライフル スコープにおいて横風と仰角の調節ができます。 이 모듈은 고성능 조준경에 조준 나사를 이용한 편차 및 고도 조절 기능을 더해줍니다. Ten moduł włącza pokrętła kalibracyjne poprawki na wiatr oraz poprawki wysokości dla celowników o dużym powiększeniu. - Ce module ajoute les tambours de correction de la hausse et de dérive sur les optiques de visée à fort grossissement. + Ce module ajoute les tourelles de correction de hausse et de dérive sur les lunettes de visée à fort grossissement. Questo modulo aggiunge lo spostamento dell'aria e la regolazione dell'elevazione delle torrette in mirini a lunga gittata 此模块可为高倍率瞄准镜新增归零风偏,距离用的调整纽。 此模塊可為高倍率瞄準鏡新增歸零風偏,距離用的調整紐。 + Этот модуль добавляет барабанчики ввода горизонтальных и вертикальных поправок для прицелов с высокой кратностью + Esse módulo implementa vento e elevação para os ajustes de miras telescópicas. + Tento modul přidává korekci zaměrovacího kříže puškohledů pro vítr a výšku. %1D @@ -425,6 +506,10 @@ %1D %1D %1D + %1D + %1D + %1D + %1D %1L @@ -436,6 +521,10 @@ %1L %1L %1L + %1L + %1L + %1L + %1L %1R @@ -447,20 +536,34 @@ %1R %1R %1R + %1R + %1R + %1R + %1R Horizontal limits + Horizontale Grenzen 水平限制 水平制限 Limite orrizontale Limit poziomy + Лимит по горизонтали + Limite Horizontal + Limites horizontales + Horizontální limity Vertical limits + Vertikale Grenzen 垂直限制 垂直制限 Limite verticale Limit pionowy + Лимит по вертикали + Limite Vertical + Limites verticales + Vertikální limity diff --git a/addons/slideshow/functions/fnc_createSlideshow.sqf b/addons/slideshow/functions/fnc_createSlideshow.sqf index 965a8239417..290fad89b44 100644 --- a/addons/slideshow/functions/fnc_createSlideshow.sqf +++ b/addons/slideshow/functions/fnc_createSlideshow.sqf @@ -64,6 +64,11 @@ if !(["ace_interact_menu"] call EFUNC(common,isModLoaded)) then { // Add interactions if automatic transitions are disabled, else setup automatic transitions if (_duration == 0) then { + + // Reverse the arrays so that the interactions will be added in the right order + reverse _images; + reverse _names; + { if (_setName == "") then { _setName = localize LSTRING(Interaction); diff --git a/addons/slideshow/functions/fnc_moduleInit.sqf b/addons/slideshow/functions/fnc_moduleInit.sqf index b3cbf8bf438..a8cf27ceec8 100644 --- a/addons/slideshow/functions/fnc_moduleInit.sqf +++ b/addons/slideshow/functions/fnc_moduleInit.sqf @@ -42,4 +42,4 @@ private _duration = _logic getVariable ["Duration", 0]; // Prepare with actions [_objects, _controllers, _images, _names, _duration, _setName] call FUNC(createSlideshow); -INFO_1("Slideshow Module Initialized on %1 Objects", count _objects); +INFO_1("Slideshow Module Initialized on %1 Objects",(count _objects)); diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 7f37e06b01c..02dd20c94dc 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -16,11 +16,12 @@ 슬라이드 쇼 幻燈片 幻灯片 + Slayt This module allows you to set up slide-shows on different objects. One module per image list. Only objects with hiddenSelection 0 are supported. Dieses Modul erlaubt eine Diavorführung auf unterschiedlichen Objekten. Ein Modul, eine Bilderliste. Nur Objekte mit "hiddenSelection 0" werden unterstützt. - Ce module permet d'afficher des diaporamas sur différents objets. Un module par liste d'image. Seul les objets avec le paramètre "HiddenSelection 0" sont supportés + Ce module permet d'afficher des diaporamas sur différents objets. Un module par liste d'images.\nSeuls les objets avec le paramètre `HiddenSelection 0` sont supportés. Ten moduł pozwala skonfigurować pokaz slajdów na różnych obiektach. Jeden moduł na jedną liste slajdów. Tylko obiekty z hiddenSelection 0 są wspierane. Ez a modul lehetővé teszi a különböző objektumokon való vetítést. Egy modul/képlista. Csak "hiddenSelection 0"-t tartalmazó objektumok felelnek meg. Este módulo permite que você monte apresentações de slides em diferentes objetos. Um módulo por lista de imagem. Somente objetos com hiddenSelection 0 são suportados. @@ -48,11 +49,12 @@ 물체 物件 物件 + Objeler Object names (can also be synchronized objects) slide-show will be displayed on, separated by commas if multiple. Objektnamen (können auch synchronisierte Objekte sein) auf denen die Diavorführung abgepielt wird. Werden ggf. durch Kommata getrennt. - Nom d'objets (peuvent aussi être des objets synchronisés) sur lesquels les diaporamas vont être affichées, séparation par virgule si plusieurs. + Noms des objets (pouvant aussi être des objets synchronisés) sur lesquels le diaporama sera affiché, séparés par des virgules s'ils sont plusieurs. Nazwy obiektów (mogą to też być zsynchronizowane obiekty) na których pokaz slajdów zostanie pokazany, oddzielony przecinkiem jeżeli jest ich więcej niż 1. Objektum nevek (szinkronizált is lehet) amik a vetítésen megjelennek, több darab esetén vesszővel elválasztva. Nomes dos objetos (também podem ser objetos sincronizados) em que a apresentação de slides será mostrada, separado por vírgulas se for mais de um. @@ -68,23 +70,24 @@ Controllers Steuereinheit - Contrôleurs + Commandes Kontroler Vezérlők Controles Контроллеры Controladores - Kontrolor + Kontrolní objekty Controllori コントローラ 조종 장치 控制器 控制器 + Kontroller Controller object names, separated by commas if multiple. Objekte die als Steuereinheit fungieren. Werden ggf. durch Kommata getrennt. - Noms de contrôleur d'objets, séparation par virgule si plusieurs + Noms des objets servant d'unité de commande, séparés par des virgules s'ils sont plusieurs. Nazwa obiektu - kontrolera, oddzielona przecinkami jeżeli jest ich więcej niż 1. Vezérlő objektum nevek, vesszővel elválasztva több darab esetén. Nome dos objetos de controle, separado por vírgula se mais de um. @@ -95,6 +98,7 @@ 조종 장치 물체 명칭, 다수의 경우 쉼표로 구분됩니다. 指定是控制器的物件名稱,如有多個物件,請以逗號作區隔 指定是控制器的物件名称,如有多个物件,请以逗号作区隔 + Jména kontrolních objektů, v případě více oddělená čárkami. Images @@ -111,11 +115,12 @@ 사진 圖片 图片 + Resimler List of images that will be used for the slide-show, separated by commas, with full path correctly formatted (eg. images\image.paa). Eine Liste von Bildern, die bei der Vorführung verwendet werden. (Durch Kommata getrennt, mit vollem Pfad angegeben (z.B Bilder\bild.paa)). - Liste d'images qui seront utilisées dans des diaporamas, séparation par virgule, avec le chemin d'accès complet et formaté correctement (ie. images\image.paa) + Liste des images qui seront utilisées dans le diaporama, séparées par des virgules, avec le chemin complet correctement formaté (p. ex. images\image.paa). Lista obrazów, które zostaną użyte do pokazu slajdów, oddzielone przecinkiem, z poprawnym pełnym formatem ścieżki do obrazka (np. slajdy\obrazek.paa). A képek listája amit a vetítés használni fog, vesszővel elválasztva, megfelelően formázott teljes útvonallal (pl. képek\kép.paa) Lista das imagens que serão utilizadas na apresentação de slides, separadas por vírgula, com o caminho completo corretamente formatado (ex: imagens\imagem.paa). @@ -146,7 +151,7 @@ List of names that will be used for interaction entries, separated by commas, in order of images. - Liste de noms qui seront utilisés pour des interactions, séparation par virgule, dans l'ordre des images + Liste des noms qui seront utilisés pour les entrées d'interaction, séparés par des virgules, dans l'ordre des images. Lista nazw, które zostaną użyte do nazwania wpisów interakcji, oddzielone przecinkiem, w kolejności obrazów. Olyan nevek listája, melyek interakciós célra kellenek, vesszővel elválasztva, kép szerinti sorrendben. Lista dos nomes que serão usados para entradas de interação, separados por vírgulas, na ordem das imagens. @@ -158,10 +163,11 @@ 상호작용 메세지에 쓰일 명칭입니다, 쉼표로 구분합니다, 이미지의 순서입니다. 設定互動鍵切換圖片時的按鈕名稱,多個按鈕請以逗號做區隔,有多少圖片就輸入多少個按鈕,以利切換圖片 设定互动键切换图片时的按钮名称,多个按钮请以逗号做区隔,有多少图片就输入多少个按钮,以利切换图片 + Seznam jmen které budou použity pro interakce, oddělené čárkami, v pořadí obrázků. Set Name - Setze Namen + Name der Diavorführung Ustaw nazwę 名前設定 Définir le nom @@ -169,21 +175,27 @@ 設定名稱 设定名称 이름 설정 + Установить имя + Definir Nome + Jméno setu Name that will be used for main interaction entry (to distinguish multiple slideshows). Default: "Slides" Name der für den Hauptinteraktionseintrag benutzt wird (um mehrere Diavorführungen voneinander zu trennen). Nazwa, która będzie użyta w głównym menu interakcji (w celu rozróżnienia różnych slajdów). Domyślnie: "Slides" メイン インタラクション エントリで使われる名前を設定します。(複数のスライドショーを区別するため)。標準: "Slides" - Un nom qui sera utilisé pour interagir avec plusieurs diaporamas. Par défaut : "Slides" + Nom qui sera utilisé pour l'entrée d'interaction principale (pour distinguer plusieurs diaporamas). Valeur par défaut : "Slides". Nome che sarà utilizzato per le principali interazioni (per distinguere le multiple diapositive). Predefinito: "Slides" 設定該幻燈片的標題名稱 (用來區分多個不同標題的幻燈片) 預設名稱: "幻燈片" 设定该幻灯片的标题名称 (用来区分多个不同标题的幻灯片) 预设名称: "幻灯片" 상위 상호작용 이름 (여러개의 슬라이드 쇼를 구분하기 위해 사용됨) 기본: "Slides" + Имя, которое будет использоваться для основных взаимодействий (для различения нескольких слайдов). По умолчанию: «Slides» + Nome que será usado para a entrada principal de interação (para separar vários slideshows). Padrão: "Slides" + Jméno, které bude použito pro hlavní interakci (pro rozlišení více prezentací). Standard: Snímky Slide Duration - Durée d'un diaporama + Durée de la diapositive Czas trwania slajdów Dia időtartam Duração do Slide @@ -199,7 +211,7 @@ Duration of each slide. Default: 0 (Automatic Transitions Disabled) - Durée de chaque diaporama. Défaut: 0 (transition automatique désactivée) + Temps d'affichage de chaque diapositive. Valeur par défaut : 0 (transition automatique désactivée). Czas trwania poszczególnych slajdów. Domyślnie: 0 (Automatyczne przejścia wyłączone) A diák időtartama. Alapértelmezett: 0 (Automatikus váltás letiltva) Duração de cada slide. Padrão: 0 (Transição automática desabilitada) @@ -215,7 +227,7 @@ Slides - Diapo + Diapositives Slajdy Diák Slides @@ -228,6 +240,7 @@ 슬라이드 幻燈片 幻灯片 + Slaytlar diff --git a/addons/smallarms/CfgWeapons.hpp b/addons/smallarms/CfgWeapons.hpp index cc7e3cbf2eb..17cda1d7fbf 100644 --- a/addons/smallarms/CfgWeapons.hpp +++ b/addons/smallarms/CfgWeapons.hpp @@ -191,16 +191,9 @@ class CfgWeapons { class EBR_base_F: Rifle_Long_Base_F { // EMR/EBR is typically issued semi-auto AFAIK modes[] = {"Single", "single_close_optics1", "single_medium_optics1", "single_far_optics1"}; - cursor = "arifle"; - }; - - class LRR_base_F: Rifle_Long_Base_F { - cursor = "arifle"; }; class GM6_base_F: Rifle_Long_Base_F { - cursor = "arifle"; - // Fuck your balancing, BI. class Single: Mode_SemiAuto { // 250 rpm is probably the limit of the finger on a heavy bullpup trigger like this thing must have. diff --git a/addons/spectator/ACE_Settings.hpp b/addons/spectator/ACE_Settings.hpp index ef745804284..3bd0f0bc509 100644 --- a/addons/spectator/ACE_Settings.hpp +++ b/addons/spectator/ACE_Settings.hpp @@ -1,25 +1,11 @@ class ACE_Settings { class GVAR(enableAI) { - category = CSTRING(Module_DisplayName); - displayName = CSTRING(ai_DisplayName); - description = CSTRING(ai_Description); - typeName = "BOOL"; - value = 0; + movedToSQF = 1; }; class GVAR(restrictModes) { - category = CSTRING(Module_DisplayName); - displayName = CSTRING(modes_DisplayName); - description = CSTRING(modes_Description); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(modes_all), CSTRING(modes_unit), "$STR_A3_Spectator_free_camera_tooltip", "$STR_A3_Spectator_1pp_camera_tooltip", "$STR_A3_Spectator_3pp_camera_tooltip"}; + movedToSQF = 1; }; class GVAR(restrictVisions) { - category = CSTRING(Module_DisplayName); - displayName = CSTRING(visions_DisplayName); - description = CSTRING(visions_Description); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(modes_all), CSTRING(visions_nv), CSTRING(visions_ti), "$STR_Special_None"}; + movedToSQF = 1; }; }; diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 8220b215207..1e3d019177c 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + // Used by public functions GVAR(availableModes) = [MODE_FREE, MODE_FPS, MODE_FOLLOW]; GVAR(availableSides) = [west,east,resistance,civilian]; diff --git a/addons/spectator/functions/fnc_getCameraAttributes.sqf b/addons/spectator/functions/fnc_getCameraAttributes.sqf index d9e53082edf..9998d374313 100644 --- a/addons/spectator/functions/fnc_getCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_getCameraAttributes.sqf @@ -15,7 +15,7 @@ * Public: Yes */ -if !(isNil QGVAR(camera)) then { +if (!isNil QGVAR(camera)) then { [GVAR(camMode), GVAR(camFocus), GVAR(camVision), getPosATL GVAR(camera), getDirVisual GVAR(camera)] } else { // These values could be pre-set by function diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf index 2ee5140d80f..91db9c70c7d 100644 --- a/addons/spectator/functions/fnc_setCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf @@ -42,13 +42,13 @@ params [ ]; // Apply if camera exists -if !(isNil QGVAR(camera)) then { +if (!isNil QGVAR(camera)) then { // These functions are smart and handle unavailable inputs - if !(isNil "_focus") then { + if (!isNil "_focus") then { [_focus] call FUNC(setFocus); }; - if !(isNil "_mode") then { + if (!isNil "_mode") then { // If mode not free and no focus, find focus if ((_mode != MODE_FREE) && {isNull GVAR(camFocus)}) then { [true] call FUNC(setFocus); @@ -57,19 +57,19 @@ if !(isNil QGVAR(camera)) then { [_mode] call FUNC(cam_setCameraMode); }; - if !(isNil "_vision") then { + if (!isNil "_vision") then { [_vision] call FUNC(cam_setVisionMode); }; - if !(isNil "_position") then { + if (!isNil "_position") then { GVAR(camera) setPosATL _position; }; - if !(isNil "_direction") then { + if (!isNil "_direction") then { GVAR(camera) setDir _direction; }; } else { - if !(isNil "_focus") then { + if (!isNil "_focus") then { // If there are no entities this becomes nil, handled on camera startup if (_focus isEqualType true) then { _focus = ([] call FUNC(getTargetEntities)) select 0; @@ -78,20 +78,20 @@ if !(isNil QGVAR(camera)) then { GVAR(camFocus) = _focus; }; - if !(isNil "_mode") then { + if (!isNil "_mode") then { GVAR(camMode) = _mode; }; - if !(isNil "_vision") then { + if (!isNil "_vision") then { GVAR(camVision) = _vision; }; // GVARs exits purely for pre-setting of these attributes - if !(isNil "_position") then { + if (!isNil "_position") then { GVAR(camPos) = ATLtoASL _position; }; - if !(isNil "_direction") then { + if (!isNil "_direction") then { GVAR(camDir) = _direction; }; }; diff --git a/addons/spectator/functions/fnc_ui.sqf b/addons/spectator/functions/fnc_ui.sqf index c135c74a698..f97dea3eb82 100644 --- a/addons/spectator/functions/fnc_ui.sqf +++ b/addons/spectator/functions/fnc_ui.sqf @@ -33,7 +33,7 @@ while {dialog} do { BIS_fnc_feedback_allowPP = !_init; // Removes death blur if present -if !(isNil "BIS_DeathBlur") then { +if (!isNil "BIS_DeathBlur") then { BIS_DeathBlur ppEffectAdjust [0]; BIS_DeathBlur ppEffectCommit 0; }; @@ -187,4 +187,7 @@ if (_init) then { // Ensure chat is shown again showChat true; + + // Restore HUD + [] call EFUNC(common,showHud); }; diff --git a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf index aa10af03585..25a50d140bf 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Nelson Duarte, AACO, SilentSpike * Function used to handle key down event diff --git a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf index 1ab7213aa13..cf08d4caf68 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Nelson Duarte, SilentSpike * Function used to handle key up event diff --git a/addons/spectator/functions/fnc_ui_handleLoad.sqf b/addons/spectator/functions/fnc_ui_handleLoad.sqf index bcaf90a6999..bc6493e3f58 100644 --- a/addons/spectator/functions/fnc_ui_handleLoad.sqf +++ b/addons/spectator/functions/fnc_ui_handleLoad.sqf @@ -19,6 +19,13 @@ params ["_display"]; uiNamespace setVariable [QGVAR(display), _display]; +if (["ace_map_gestures"] call EFUNC(common,isModLoaded)) then { + [_display displayCtrl IDC_MAP] call EFUNC(map_gestures,initDisplaySpectator); +}; + +[QGVAR(displayLoaded), _display] call CBA_fnc_localEvent; + + // Handle ACRE2 Toggle Spectator (if present) if (!isNil "acre_api_fnc_addDisplayPassthroughKeys") then { [_display] call acre_api_fnc_addDisplayPassthroughKeys; diff --git a/addons/spectator/functions/fnc_ui_handleMapDraw.sqf b/addons/spectator/functions/fnc_ui_handleMapDraw.sqf index 0602c7b4d2d..676774df2df 100644 --- a/addons/spectator/functions/fnc_ui_handleMapDraw.sqf +++ b/addons/spectator/functions/fnc_ui_handleMapDraw.sqf @@ -76,7 +76,7 @@ GVAR(uiMapHighlighted) = _nearestEntity; CTRL_MAP_FOOTER ctrlSetText _text; // Draw camera icon -if !(isNil QGVAR(camera)) then { +if (!isNil QGVAR(camera)) then { private _cameraPos = getPosASLVisual GVAR(camera); private _cameraDir = getDirVisual GVAR(camera); _map drawIcon [ICON_CAMERA, [0.5, 1, 0.5, 1], _cameraPos, 32, 48, _cameraDir, "", 1, 0.05, "TahomaB", "right"]; diff --git a/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf b/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf index 8b109d430c5..b402d9830e4 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf @@ -15,12 +15,11 @@ * * Public: No */ -#define FOLLOW_CAMERA_MAX_DISTANCE 5 if (GVAR(camMode) == MODE_FOLLOW) then { if ((_this select 1) > 0) then { GVAR(camDistance) = (GVAR(camDistance) - 1) max 0; } else { - GVAR(camDistance) = (GVAR(camDistance) + 1) min FOLLOW_CAMERA_MAX_DISTANCE; + GVAR(camDistance) = (GVAR(camDistance) + 1) min GVAR(maxFollowDistance); }; }; diff --git a/addons/spectator/functions/fnc_ui_handleUnload.sqf b/addons/spectator/functions/fnc_ui_handleUnload.sqf new file mode 100644 index 00000000000..8d9f92a2629 --- /dev/null +++ b/addons/spectator/functions/fnc_ui_handleUnload.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Function used to handle unload event. + * + * Arguments: + * 0: Spectator display + * + * Return Value: + * None + * + * Example: + * _this call ace_spectator_fnc_ui_handleUnload + * + * Public: No + */ + +params ["_display"]; + +[QGVAR(displayUnloaded), _display] call CBA_fnc_localEvent; diff --git a/addons/spectator/functions/fnc_ui_updateHelp.sqf b/addons/spectator/functions/fnc_ui_updateHelp.sqf index f715cb1ecab..d1187ae3556 100644 --- a/addons/spectator/functions/fnc_ui_updateHelp.sqf +++ b/addons/spectator/functions/fnc_ui_updateHelp.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Nelson Duarte, SilentSpike * Updates spectator UI help element diff --git a/addons/spectator/functions/fnc_updateCameraModes.sqf b/addons/spectator/functions/fnc_updateCameraModes.sqf index f6408c786d1..c3adf327daa 100644 --- a/addons/spectator/functions/fnc_updateCameraModes.sqf +++ b/addons/spectator/functions/fnc_updateCameraModes.sqf @@ -45,7 +45,7 @@ if (_newModes isEqualTo []) then { }; // Update camera in case of change -if !(isNil QGVAR(camera)) then { +if (!isNil QGVAR(camera)) then { // If mode was free and no longer available, find a focus if (!(MODE_FREE in _newModes) && {GVAR(camMode) == MODE_FREE} && {isNull GVAR(camFocus)}) then { [true] call FUNC(setFocus); diff --git a/addons/spectator/functions/fnc_updateVisionModes.sqf b/addons/spectator/functions/fnc_updateVisionModes.sqf index eb0e07f256d..ba19bca86b2 100644 --- a/addons/spectator/functions/fnc_updateVisionModes.sqf +++ b/addons/spectator/functions/fnc_updateVisionModes.sqf @@ -53,7 +53,7 @@ if (_newModes isEqualTo []) then { }; // Update camera in case of change -if !(isNil QGVAR(camera)) then { +if (!isNil QGVAR(camera)) then { [GVAR(camVision)] call FUNC(cam_setVisionMode); }; diff --git a/addons/spectator/initSettings.sqf b/addons/spectator/initSettings.sqf new file mode 100644 index 00000000000..c970fe77c79 --- /dev/null +++ b/addons/spectator/initSettings.sqf @@ -0,0 +1,39 @@ +[ + QGVAR(enableAI), + "CHECKBOX", + [LSTRING(ai_DisplayName), LSTRING(ai_Description)], + LSTRING(Settings_DisplayName), + false, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(restrictModes), + "LIST", + [LSTRING(modes_DisplayName), LSTRING(modes_Description)], + LSTRING(Settings_DisplayName), + [[0, 1, 2, 3, 4], [LSTRING(modes_all), LSTRING(modes_unit), "STR_A3_Spectator_free_camera_tooltip", "STR_A3_Spectator_1pp_camera_tooltip", "STR_A3_Spectator_3pp_camera_tooltip"], 0], + true, + {}, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(restrictVisions), + "LIST", + [LSTRING(visions_DisplayName), LSTRING(visions_Description)], + LSTRING(Settings_DisplayName), + [[0, 1, 2, 3], [LSTRING(modes_all), LSTRING(visions_nv), LSTRING(visions_ti), "STR_Special_None"], 0], + true, + {}, + true +] call CBA_settings_fnc_init; + +[ + QGVAR(maxFollowDistance), + "SLIDER", + [LSTRING(MaxFollowDistance_DisplayName), LSTRING(MaxFollowDistance_Description)], + LSTRING(Settings_DisplayName), + [5, 25, 5, 1], + false +] call CBA_settings_fnc_init; diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 634fd675cf8..3ca8c3ba17e 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -11,17 +11,25 @@ 관전자 Spectateur Obserwator + Зритель + Espectador + Divák + Izleyici ACE Spectator ACE Zuschauer ACE スペクテイター Spettatore ACE - Spectateur ACE + ACE Spectateur ACE 旁观者 ACE 旁觀者 Obserwator ACE ACE 관전자 + ACE Зритель + ACE Espectador + ACE Divák + ACE Izleyici Configure how the spectator system will operate by default. @@ -32,7 +40,7 @@ Configurar cómo el sistema de espectador funcionará por defecto. Konfigurovat výchozí nastavení pozorovatele Configura come il sistema spettatore si comporterà di default. - Configure comment le système de spectateurs opère par défaut. + Configure le fonctionnement par défaut du système spectateur. スペクテイター システムが標準でどのように動作するか設定できます。 어떻게 관전자 시스템이 기본적으로 작동되는지 설정합니다 设定旁观者系统相关配置 @@ -46,8 +54,12 @@ 可觀察AI 可观察AI AI 활성 - IA Activée + IA visible SI Aktywowane + Разрешить для ИИ + IA Ativado + AI povoleno + AI Etkin Make AI viewable in spectator @@ -57,8 +69,11 @@ 開啟此功能後可在觀察者模式下觀察AI單位 开启此功能后可在观察者模式下观察AI单位。 관전자가 AI를 관전 할 수 있습니다. - Rends les IA visibles en spectateur + Rend les unités IA visibles en spectateur. Spraw, aby SI było widoczne jako obserwator + Сделать ИИ видимыми в режиме зрителя + Permite que IA seja visivel no espectador + Umožňuje sledovat AI v módu diváka Camera modes @@ -69,11 +84,12 @@ Módy kamery Modos de cámara Modalità camera - Mode de caméra + Modes de caméra カメラ モード 카메라 모드 摄影机模式 攝影機模式 + Kamera Modları Camera modes that can be used @@ -84,7 +100,7 @@ Modos de la cámara que se pueden utilizar. Módy kamery které mohou být použity. Modalità che la camera può utilizzare. - Modes de caméra qui peuvent être utilisés + Modes de caméra pouvant être utilisés. カメラ モードを設定できます。 사용할 수 있는 카메라 모드들 입니다 设定可使用的摄影机模式 @@ -104,10 +120,11 @@ 모두 所有 所有 + Hepsi 1PP and 3PP - 1ère et 3e personne + 1ère et 3ème personne 1.ª y 3.ª persona 1° e 3° pers 1 i 3 os. @@ -119,6 +136,7 @@ 一人称と三人称 第一人稱與第三人稱 第一人称与第三人称 + 1PP ve 3PP Vision modes @@ -129,11 +147,12 @@ Modos de visión Módy zobrazení Modalità visuali - Modes de vision + Modes de visualisation ビジョン モード 시야 모드 视觉模式 視覺模式 + Görüş Modları Vision modes that can be used @@ -144,7 +163,7 @@ Modos de visión que pueden ser utilizados. Módy zobrazení které mohou být použity. Modalità visuali che possono essere usate. - Modes de visions qui peuvent être utilisés + Modes de visualisation pouvant être utilisés. ビジョン モードを設定できます。 사용할 수 있는 시야 모드들 입니다 设定可使用的视觉模式 @@ -164,6 +183,7 @@ 야간투시경 夜视 夜視 + Geçe Görüşü Thermal imaging @@ -179,6 +199,31 @@ 열화상 热成像 熱成像 + Termal Görüş + + + Max Follow Distance + Maximale Beobachtungsdistance + Макс. дистанция следования + 最大追随距離 + Distância Máxima de Acompanhamento + 最大跟隨距離 + Distance maximale de suivi + Distanza massima per seguire + Maximální vzdálenost sledování objektu + Maksymalna odległość śledzenia + + + Maximum distance the follow camera can be from the target + Maximale Distanz in welcher die Kamera dem Ziel folgen kann. + Максимальная дистанция от камеры слежения до цели + カメラが目標へ追随できる最大距離を決定できます。 + A distância máxima que a câmera de acompanhamento pode estar do alvo. + 攝影機能追隨目標的最大距離 + Distanza massima che la telecamera seguente può percorrere dall'obiettivo + Distance maximale à laquelle la caméra de suivi peut se trouver par rapport à la cible. + Maximální vzdálenost při které může kamera sledovat cíl + Maksymalna odległość na jakiej kamera może podążać od celu @@ -195,6 +240,7 @@ 정비공 工兵 工兵 + Mühendis Free @@ -210,6 +256,7 @@ 자유 自由模式 自由模式 + Serbest Normal @@ -225,6 +272,7 @@ 정상 正常 正常 + Normal Night @@ -235,11 +283,12 @@ Noční Nocturna Notturno - Nuit + Nocturne 暗視装置 야간 夜视 夜視 + Gece Thermal @@ -255,6 +304,7 @@ 열상 热成像 熱成像 + Termal @@ -267,6 +317,10 @@ 아이콘 Icônes Ikony + Иконки + Ícones + Ikony + Ikonlar Projectiles @@ -278,6 +332,10 @@ 발사체 Projectiles Pociski + Осколки + Projéteis + Projektily + Mermiler Next Unit @@ -293,6 +351,7 @@ 다음 인원 下个单位 下個單位 + Sonraki Takım Previous Unit @@ -308,6 +367,7 @@ 이전 인원 上个单位 上個單位 + Önceki Takım Vision Mode @@ -319,6 +379,10 @@ 보기 모드 Mode de vision Tryb Wizji + Режим видения + Modo de Visão + Režim sledování + Görüş Modu Slow Speed @@ -330,6 +394,10 @@ 느린 속도 Vitesse lente Wolna Prędkość + Замедление + Velocidade Lenta + Pomalá rychlost + Yavaş Hız diff --git a/addons/spectator/ui.hpp b/addons/spectator/ui.hpp index 7a49c72a864..8ffd1b5ebd2 100644 --- a/addons/spectator/ui.hpp +++ b/addons/spectator/ui.hpp @@ -20,6 +20,7 @@ class GVAR(display) { closeOnMissionEnd = 1; onLoad = QUOTE(_this call FUNC(ui_handleLoad)); + onUnload = QUOTE(_this call FUNC(ui_handleUnload)); onKeyDown = QUOTE(_this call FUNC(ui_handleKeyDown)); onKeyUp = QUOTE(_this call FUNC(ui_handleKeyUp)); diff --git a/addons/spottingscope/CfgOpticsEffect.hpp b/addons/spottingscope/CfgOpticsEffect.hpp new file mode 100644 index 00000000000..2b9542ba9c0 --- /dev/null +++ b/addons/spottingscope/CfgOpticsEffect.hpp @@ -0,0 +1,7 @@ +class CfgOpticsEffect { + class GVAR(OpticsRadBlur1) { + type = "radialblur"; + params[] = {0.01,0.01,0.18,0.36}; + priority = 950; + }; +}; diff --git a/addons/spottingscope/CfgVehicles.hpp b/addons/spottingscope/CfgVehicles.hpp index d961f0d36b9..660a3d6749a 100644 --- a/addons/spottingscope/CfgVehicles.hpp +++ b/addons/spottingscope/CfgVehicles.hpp @@ -27,23 +27,16 @@ class CfgVehicles { class LandVehicle; class StaticWeapon: LandVehicle { - class Turrets; - class ACE_Actions { - class ACE_MainActions; - }; - }; - - class StaticATWeapon: StaticWeapon { - class Turrets: Turrets { + class Turrets { class MainTurret; }; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions {}; + class ACE_Actions { + class ACE_MainActions; }; }; - class ACE_SpottingScopeObject: StaticATWeapon { + class ACE_SpottingScopeObject: StaticWeapon { EGVAR(dragging,canDrag) = 1; EGVAR(dragging,dragPosition)[] = {0,1,0}; EGVAR(dragging,dragDirection) = 0; @@ -68,6 +61,8 @@ class CfgVehicles { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers_base {}; }; + CBA_ScriptedOpticClass = "ACE_SpottingScopeOptic"; + author = ECSTRING(common,ACETeam); scope = 1; side = 1; @@ -84,6 +79,7 @@ class CfgVehicles { accuracy = 0.12; cost = 10000; icon = "\A3\Static_F_Gamma\data\UI\map_StaticTurret_AT_CA.paa"; + attenuationEffectType = ""; class SpeechVariants { class Default { @@ -123,15 +119,15 @@ class CfgVehicles { initAngleY = 0; minAngleY = -100; maxAngleY = 100; - minFov = 0.0025; - maxFov = 0.05; - initFov= 0.05; + minFov = "0.25/35"; // real one is 15x-45x, but max mag in game is 37x + maxFov = "0.25/5"; + initFov= "0.25/5"; }; weapons[] = {}; magazines[] = {}; gunnerOpticsColor[] = {1,1,1,1}; - gunnerOpticsModel = "\A3\Weapons_F\empty"; + gunnerOpticsModel = "\A3\Weapons_F\empty.p3d"; gunnerOpticsEffect[] = {"OpticsCHAbera1","OpticsBlur2"}; gunnerOutOpticsShowCursor = 0; gunnerOpticsShowCursor = 0; @@ -140,7 +136,7 @@ class CfgVehicles { gunnerGetOutAction = "PlayerProne"; gunnerForceOptics = 0; ejectDeadGunner = 0; - turretInfoType = QGVAR(RscUnitInfo); + turretInfoType = "CBA_ScriptedOptic_zooming"; opticsDisablePeripherialVision = 1; }; }; diff --git a/addons/spottingscope/CfgWeapons.hpp b/addons/spottingscope/CfgWeapons.hpp index 9548b30aee9..29499206024 100644 --- a/addons/spottingscope/CfgWeapons.hpp +++ b/addons/spottingscope/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class ACE_ItemCore; class CBA_MiscItem_ItemInfo; @@ -15,4 +14,31 @@ class CfgWeapons { mass = 40; }; }; + + class ItemCore; + class ACE_SpottingScopeOptic: ItemCore { + scope = 1; + + class CBA_ScriptedOptic { + minMagnificationReticleScale[] = {5,1}; + maxMagnificationReticleScale[] = {25,5}; + + reticleDetailTextures[] = { + // start at > this magnification, reticleTexture, reticleTextureSize, reticleTextureNight (optional) + {0, PATHTOF(data\ace_spottingscope_reticle_b1_ca.paa), 1, PATHTOF(data\ace_spottingscope_reticle_b1_ca.paa)}, + {9, PATHTOF(data\ace_spottingscope_reticle_b2_ca.paa), 1/2, PATHTOF(data\ace_spottingscope_reticle_b2_ca.paa)}, + {14, PATHTOF(data\ace_spottingscope_reticle_b3_ca.paa), 1/3, PATHTOF(data\ace_spottingscope_reticle_b3_ca.paa)}, + {19, PATHTOF(data\ace_spottingscope_reticle_b4_ca.paa), 1/4, PATHTOF(data\ace_spottingscope_reticle_b4_ca.paa)}, + {24, PATHTOF(data\ace_spottingscope_reticle_b5_ca.paa), 1/5, PATHTOF(data\ace_spottingscope_reticle_b5_ca.paa)} + }; + fadeReticleInterval[] = {10.5,9.5}; + + bodyTexture = QPATHTOF(data\ace_spottingscope_body_co.paa); + //bodyTextureNight = QPATHTOF(data\ace_spottingscope_body_co.paa); + bodyTextureSize = 1.5; + reticleSafezoneSize = 1; + hidePeripheralVision = 1; + opticsPPEffects[] = {QGVAR(OpticsRadBlur1)}; + }; + }; }; diff --git a/addons/spottingscope/RscInGameUI.hpp b/addons/spottingscope/RscInGameUI.hpp deleted file mode 100644 index bf4f086dd7b..00000000000 --- a/addons/spottingscope/RscInGameUI.hpp +++ /dev/null @@ -1,56 +0,0 @@ - -class RscOpticsValue; -class RscMapControl; -class RscText; -class RscPicture; - -class RscInGameUI { - class RscUnitInfo; - class GVAR(RscUnitInfo): RscUnitInfo { - onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); {((_this select 0) displayCtrl _x) ctrlShow false} forEach [ARR_4(IDC_RETICLE,IDC_BODY,IDC_BLACK_LEFT,IDC_BLACK_RIGHT)]); - controls[] = {"CA_FOVMode","ScriptedReticleHelper","trippleHeadLeft","trippleHeadRight","Reticle","Body"}; // don't change this order - - class CA_FOVMode: RscOpticsValue { // idea by Taosenai. Apparently this can be used via isNil check to determine wheter the scope or the kolimator is used - idc = 154; - w = 0; - h = 0; - }; - - class ScriptedReticleHelper: RscMapControl { - onDraw = QUOTE(ctrlParent (_this select 0) call FUNC(animateReticle)); - idc = -1; - w = 0; - h = 0; - }; - - class Reticle: RscPicture { - idc = IDC_RETICLE; - text = QPATHTOF(rsc\spotting_scope_reticle_co.paa); - x = POS_X; - y = POS_Y; - w = POS_W; - h = POS_H; - }; - - class Body: Reticle { - idc = IDC_BODY; - text = QPATHTOF(rsc\spotting_scope_body_co.paa); - }; - - //These are just black side panels to cover the areas that the optics p3d doesn't cover - //It will ONLY effect tripple head users as (safezoneX == safeZoneXAbs) for everyone else - class trippleHeadLeft: RscText { - idc = IDC_BLACK_LEFT; - x = "safeZoneXAbs"; - Y = "safezoneY"; - w = QUOTE(POS_X_BASE(SIZEX) - safeZoneXAbs); - h = "safeZoneH"; - colorBackground[] = {0,0,0,1}; - }; - - class trippleHeadRight: trippleHeadLeft { - idc = IDC_BLACK_RIGHT; - x = QUOTE(safeZoneXAbs + safeZoneWAbs - (POS_X_BASE(SIZEX) - safeZoneXABS)); - }; - }; -}; diff --git a/addons/spottingscope/XEH_PREP.hpp b/addons/spottingscope/XEH_PREP.hpp index 98398723604..75bc471556f 100644 --- a/addons/spottingscope/XEH_PREP.hpp +++ b/addons/spottingscope/XEH_PREP.hpp @@ -1,4 +1,2 @@ - PREP(pickup); PREP(place); -PREP(animateReticle); diff --git a/addons/spottingscope/XEH_preInit.sqf b/addons/spottingscope/XEH_preInit.sqf index e80d5e4ef9f..13d220d9591 100644 --- a/addons/spottingscope/XEH_preInit.sqf +++ b/addons/spottingscope/XEH_preInit.sqf @@ -16,4 +16,12 @@ PREP_RECOMPILE_END; _tube addTorque (vectorNormalized [1 - random 2, 1 - random 2, 1 - random 2] vectorMultiply 4); }] call CBA_fnc_addClassEventHandler; +["ACE_SpottingScopeObject", "GetOut", { + params ["_vehicle", "", "_unit"]; + + if (local _unit) then { + _unit setDir getDir _vehicle; + }; +}] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/spottingscope/config.cpp b/addons/spottingscope/config.cpp index 5e8576eb598..c7a0b8a8c95 100644 --- a/addons/spottingscope/config.cpp +++ b/addons/spottingscope/config.cpp @@ -18,5 +18,8 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "CfgMoves.hpp" +#include "CfgOpticsEffect.hpp" -#include "RscInGameUI.hpp" +class CBA_PIPItems { + GVAR(enable) = "-"; +}; diff --git a/addons/spottingscope/rsc/spotting_scope_body_co.paa b/addons/spottingscope/data/ace_spottingscope_body_co.paa similarity index 100% rename from addons/spottingscope/rsc/spotting_scope_body_co.paa rename to addons/spottingscope/data/ace_spottingscope_body_co.paa diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a1_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a1_ca.paa new file mode 100644 index 00000000000..01fb142cf16 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a1_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a1_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a1_night_ca.paa new file mode 100644 index 00000000000..332c5e9630e Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a1_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a2_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a2_ca.paa new file mode 100644 index 00000000000..5c2c5cedf74 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a2_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a2_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a2_night_ca.paa new file mode 100644 index 00000000000..d95f44fad44 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a2_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a3_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a3_ca.paa new file mode 100644 index 00000000000..815d283700b Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a3_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a3_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a3_night_ca.paa new file mode 100644 index 00000000000..e018ceb7e28 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a3_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a4_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a4_ca.paa new file mode 100644 index 00000000000..5a0ce5dd4ab Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a4_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a4_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a4_night_ca.paa new file mode 100644 index 00000000000..129571c875d Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a4_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a5_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a5_ca.paa new file mode 100644 index 00000000000..990a1299d4e Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a5_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a5_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a5_night_ca.paa new file mode 100644 index 00000000000..614946f358c Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a5_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b1_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b1_ca.paa new file mode 100644 index 00000000000..dc938d7376c Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b1_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b2_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b2_ca.paa new file mode 100644 index 00000000000..dee69b091f2 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b2_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b3_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b3_ca.paa new file mode 100644 index 00000000000..a7eec0cf63a Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b3_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b4_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b4_ca.paa new file mode 100644 index 00000000000..b0978523f8c Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b4_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b5_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b5_ca.paa new file mode 100644 index 00000000000..40837aa44c3 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b5_ca.paa differ diff --git a/addons/spottingscope/functions/fnc_animateReticle.sqf b/addons/spottingscope/functions/fnc_animateReticle.sqf deleted file mode 100644 index adca733814e..00000000000 --- a/addons/spottingscope/functions/fnc_animateReticle.sqf +++ /dev/null @@ -1,47 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Animate scripted reticle of spotting scope. - * - * Arguments: - * 0: Reticles RSC info display - * - * Return Value: - * None - * - * Example: - * [DISPLAY] call ace_spottingscope_fnc_animateReticle - * - * Public: No - */ - -disableSerialization; - -params ["_display"]; -uinamespace setVariable [QGVAR(dlgSpottingScope), _display]; - -private _ctrlReticle = _display displayCtrl IDC_RETICLE; -private _ctrlBody = _display displayCtrl IDC_BODY; -private _ctrlBlackLeft = _display displayCtrl IDC_BLACK_LEFT; -private _ctrlBlackRight = _display displayCtrl IDC_BLACK_RIGHT; - -// check if optics are used -// hide all controls otherwise -private _isUsingOptic = ctrlShown (_display displayCtrl 154); - -_ctrlReticle ctrlShow _isUsingOptic; -_ctrlBody ctrlShow _isUsingOptic; -_ctrlBlackLeft ctrlShow _isUsingOptic; -_ctrlBlackRight ctrlShow _isUsingOptic; - -// animate reticle -private _zoom = ([] call EFUNC(common,getZoom)) * MAGIC_SCOPE_NUMBER; - -_ctrlReticle ctrlSetPosition [ - POS_X_BASE(_zoom), - POS_Y_BASE(_zoom), - POS_W_BASE(_zoom), - POS_H_BASE(_zoom) -]; - -_ctrlReticle ctrlCommit 0; diff --git a/addons/spottingscope/rsc/spotting_scope_reticle_co.paa b/addons/spottingscope/rsc/spotting_scope_reticle_co.paa deleted file mode 100644 index a2d299d9379..00000000000 Binary files a/addons/spottingscope/rsc/spotting_scope_reticle_co.paa and /dev/null differ diff --git a/addons/spottingscope/script_component.hpp b/addons/spottingscope/script_component.hpp index 14e78672856..6b2d95abbd5 100644 --- a/addons/spottingscope/script_component.hpp +++ b/addons/spottingscope/script_component.hpp @@ -16,14 +16,6 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define IDC_RETICLE 10000 -#define IDC_BODY 10001 -#define IDC_BLACK_LEFT 10002 -#define IDC_BLACK_RIGHT 10003 - -#define MAGIC_SCOPE_NUMBER 0.0235 -//#define MAGIC_SCOPE_NUMBER (uiNamespace getVariable ['magic', 1]) - #define POS_X_BASE(size) safezoneX + 0.5 * safezoneW - 0.5 * (size) / (getResolution select 5) #define POS_Y_BASE(size) safezoneY + 0.5 * safezoneH - 0.5 * (size) / (getResolution select 5) * 4/3 #define POS_W_BASE(size) (size) / (getResolution select 5) diff --git a/addons/spottingscope/stringtable.xml b/addons/spottingscope/stringtable.xml index b11bff24ac0..1eb19396b6f 100644 --- a/addons/spottingscope/stringtable.xml +++ b/addons/spottingscope/stringtable.xml @@ -1,13 +1,13 @@ - + Spotting Scope Teleskop Зрительная труба Teleskop Telescopio - Téléscope de visée + Longue-vue Zaměřovací dalekohled Cannocchiale Megfigyelő távcső @@ -16,6 +16,7 @@ 감적 망원경 观测镜 觀測鏡 + Gözcü Dürbünü Pick up Spotting Scope @@ -23,7 +24,7 @@ Поднять зрительная трубу Zabierz teleskop Coger telescopio - Prendre téléscope de visée + Récupérer la longue-vue Zvednout zaměřovací dalekohled Raccogli Cannocchiale Mefgigy. távcső felvétele @@ -32,6 +33,7 @@ 감적 망원경 줍기 捡起观测镜 撿起觀測鏡 + Gözcü Dürbününü al Place Spotting Scope @@ -39,7 +41,7 @@ Установить зрительная трубу Ustaw teleskop Colocar telescopio - Placer téléscope de visée + Placer la longue-vue Položit zaměřovací dalekohled Posiziona Cannocchiale Megfigy. távcső elhelyezése @@ -48,6 +50,7 @@ 감적 망원경 배치 放置观测镜 放置觀測鏡 + Gözcü Dürbününü Yerleştir diff --git a/addons/switchunits/ACE_Settings.hpp b/addons/switchunits/ACE_Settings.hpp index 31c74f28892..3b1478f2709 100644 --- a/addons/switchunits/ACE_Settings.hpp +++ b/addons/switchunits/ACE_Settings.hpp @@ -1,6 +1,7 @@ class ACE_Settings { class GVAR(enableSwitchUnits) { category = CSTRING(DisplayName); + displayName = CSTRING(EnableSwitchUnits_DisplayName); value = 0; typeName = "BOOL"; }; diff --git a/addons/switchunits/CfgEventHandlers.hpp b/addons/switchunits/CfgEventHandlers.hpp index 5da5fd0dc24..becf3950523 100644 --- a/addons/switchunits/CfgEventHandlers.hpp +++ b/addons/switchunits/CfgEventHandlers.hpp @@ -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)); }; }; diff --git a/addons/switchunits/functions/fnc_addMapFunction.sqf b/addons/switchunits/functions/fnc_addMapFunction.sqf index 28d9f05b789..fc8c181925b 100644 --- a/addons/switchunits/functions/fnc_addMapFunction.sqf +++ b/addons/switchunits/functions/fnc_addMapFunction.sqf @@ -16,12 +16,9 @@ * Public: No */ -params ["_unit", "_sides"]; - -["theMapClick", "onMapSingleClick", { - // IGNORE_PRIVATE_WARNING(_pos,_shift,_alt) +addMissionEventHandler ["MapSingleClick", { + params ["", "_pos"]; if (alive ACE_player && {GVAR(OriginalUnit) getVariable ["ACE_CanSwitchUnits", false]}) then { - [_this, _pos, _shift, _alt] call FUNC(handleMapClick); + [GVAR(switchableSides), _pos] call FUNC(handleMapClick); }; - -}, [_unit, _sides]] call BIS_fnc_addStackedEventHandler; +}]; diff --git a/addons/switchunits/functions/fnc_handleMapClick.sqf b/addons/switchunits/functions/fnc_handleMapClick.sqf index 73f48c1fc03..dfd7ac686b2 100644 --- a/addons/switchunits/functions/fnc_handleMapClick.sqf +++ b/addons/switchunits/functions/fnc_handleMapClick.sqf @@ -18,8 +18,7 @@ * Public: No */ -params ["_faction", "_pos"]; -_faction params ["", "_sides"]; +params ["_sides", "_pos"]; private _nearestObjects = nearestObjects [_pos, ["Man"], 15]; diff --git a/addons/switchunits/functions/fnc_initPlayer.sqf b/addons/switchunits/functions/fnc_initPlayer.sqf index 5fe6d5be6e7..1174331ae12 100644 --- a/addons/switchunits/functions/fnc_initPlayer.sqf +++ b/addons/switchunits/functions/fnc_initPlayer.sqf @@ -16,10 +16,10 @@ * Public: No */ -params ["_playerUnit", "_sides"]; +params ["_playerUnit"]; if (vehicle _playerUnit == _playerUnit) then { - [_sides] call FUNC(markAiOnMap); + [GVAR(switchableSides)] call FUNC(markAiOnMap); _playerUnit setVariable [QGVAR(IsPlayerUnit), true, true]; _playerUnit allowDamage false; @@ -38,5 +38,5 @@ if (vehicle _playerUnit == _playerUnit) then { [_playerUnit, "forceWalk", "ACE_SwitchUnits", true] call EFUNC(common,statusEffect_set); - [_playerUnit, _sides] call FUNC(addMapFunction); + [] call FUNC(addMapFunction); }; diff --git a/addons/switchunits/functions/fnc_startSwitchUnits.sqf b/addons/switchunits/functions/fnc_startSwitchUnits.sqf index f5cc4c13300..f9c3a5e1def 100644 --- a/addons/switchunits/functions/fnc_startSwitchUnits.sqf +++ b/addons/switchunits/functions/fnc_startSwitchUnits.sqf @@ -18,14 +18,14 @@ params ["_player"]; if (GVAR(EnableSwitchUnits)) then { - private _sides = []; + GVAR(switchableSides) = []; - if (GVAR(SwitchToWest)) then {_sides pushBack west;}; - if (GVAR(SwitchToEast)) then {_sides pushBack east;}; - if (GVAR(SwitchToIndependent)) then {_sides pushBack independent;}; - if (GVAR(SwitchToCivilian)) then {_sides pushBack civilian;}; + if (GVAR(SwitchToWest)) then {GVAR(switchableSides) pushBack west;}; + if (GVAR(SwitchToEast)) then {GVAR(switchableSides) pushBack east;}; + if (GVAR(SwitchToIndependent)) then {GVAR(switchableSides) pushBack independent;}; + if (GVAR(SwitchToCivilian)) then {GVAR(switchableSides) pushBack civilian;}; if (_player getVariable ["ACE_CanSwitchUnits", false]) then { - [_player, _sides] call FUNC(initPlayer); + [_player] call FUNC(initPlayer); }; }; diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index 539a755bc41..46f1602bcf4 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -10,6 +10,11 @@ 병력 전환 Einheitenwechsel Przełącz Jednostki + Переключение юнитов + Trocar Unidades + Přepnout jednotky + Changement de camp + Birlik Değiştir Switched unit @@ -18,7 +23,7 @@ Prohozená jednotka Przełączona jednostka Cambiado de unidad - Unité changée + Camp changé Egység átváltva Unità cambiata Trocado de unidade @@ -26,6 +31,7 @@ 切换单位 切換單位 인원 전환 + Birlik Değiştirildi Trying to switch @@ -34,13 +40,14 @@ Próba zmiany Provando a cambiare Intentando cambiar - Essaye de basculer + Essaie de changer Tentando trocar Попытка переключения 切り替えを試す 전환 시도중 尝试切换中 嘗試切換中 + Birlik değiştirilme deneniyor This unit is too close to the enemy. @@ -49,7 +56,7 @@ Tato jednotka je moc blízko k nepříteli. Ta jednostka jest zbyt blisko przeciwnika. Esta unidad está demasiado cerca del enemigo. - Cette unité est trop proche des ennemis + Cette unité est trop proche de l'ennemi. Ez az egység túl közel van az ellenséghez. Questa unità è troppo vicina al nemico. Essa unidade está muito perto do inimigo. @@ -58,6 +65,17 @@ 这单位太接近敌人了 這單位太接近敵人了 + + Enable switch side + Ermögliche Seitenwechsel + Permettre le changement de camp + 啟用陣營切換 + Povolit změnu strany + Włącz zmiane strony + Habilita troca de time + 陣営切り替えを有効化 + Включить смену стороны + Switch to West? Zmiana na Zachód? @@ -65,14 +83,15 @@ Nach BLUFOR wechseln? Přesunout k BLUFOR? Trocar para Oeste? - Changer en OUEST? + Passage en BLUFOR Átváltás BLUFOR-ra? На синих? Cambia per BLUFOR? - 同盟軍へ切り替えますか? + 同盟軍へ切り替え許可 切换至蓝方? 切換至藍方? 청군으로 전환합니까? + Batıya Geç? Allow switching to west units? @@ -81,11 +100,11 @@ Erlaube das Wechseln zu BLUFOR-Einheiten? Povolit přesun k BLUFOR? Permitir troca de unidades para o Oeste? - Permettre le changement en unité OUEST? + Autorise le passage en unité BLUFOR. Nyugat-fakciós egységekre való váltás engedélyezése? Разрешить переключаться на синих юнитов? Consenti passaggio ad unità BLUFOR? - 同盟軍側ユニットへ切り替えられるようにしますか? + 同盟軍側ユニットへ切り替えられるようにします。 允许切换至蓝方? 允許切換至藍方? 청군 인원으로 전환합니까? @@ -97,14 +116,15 @@ Nach OPFOR wechseln? Přesunout k OPFOR? Trocar para Leste? - Changer en EST? + Passage en OPFOR Átváltás OPFOR-ra? На красных? Cambia per OPFOR? - OPFOR軍側へ切り替えますか? + OPFOR軍側へ切り替え許可 切换至红方? 切換至紅方? 대항군으로 전환합니까? + Doğuya Geç ? Allow switching to east units? @@ -113,11 +133,11 @@ Erlaube das Wechseln zu OPFOR-Einheiten? Povolit přesun k OPFOR? Permitir troca de unidades para o Leste? - Permettre le changement en unité EST? + Autorise le passage en unité OPFOR. Kelet-fakciós egységekre való váltás engedélyezése? Разрешить переключаться на красных юнитов? Consenti passaggio ad unità OPFOR? - OPFOR軍側ユニットへ切り替えられるようにしますか? + OPFOR軍側ユニットへ切り替えられるようにします。 允许切换至红方? 允許切換至紅方? 대항군 인원으로 전환합니까? @@ -129,14 +149,15 @@ Nach INDFOR wechseln? Přesunout k INDFOR? Trocar para Indenpendente - Changer en INDE? + Passage en Indépendant Átváltás INDFOR-ra? На независимых? Cambia per INDFOR? - 独立軍へ切り替えますか? + 独立軍へ切り替え許可 切换至独立方? 切換至獨立方? 독립군 으로 전환합니까? + Bağımsıza Geç? Allow switching to independent units? @@ -145,11 +166,11 @@ Erlaube das Wechseln zu INDFOR-Einheiten? Povolit přesun k INDFOR? Permitir troca de unidades para o Indenpendente? - Permettre le changement en unité INDE? + Autorise le passage en unité Indépendante. Független egységekre való váltás engedélyezése? Разрешить переключаться на независимых юнитов? Consenti passaggio ad unità INDFOR? - 独立軍側ユニットへ切り替えられるようにしますか? + 独立軍側ユニットへ切り替えられるようにします。 允许切换至独立方? 允許切換至獨立方? 독립군 인원으로 전환합니까? @@ -161,14 +182,15 @@ Nach CIVILIAN wechseln? Přesunout k CIVILISTŮM? Trocar para Civis? - Changer en CIV? + Passage en Civil Átváltás civilre? На гражданских? Cambia per Civili? - 市民へ切り替えますか? + 市民へ切り替え許可 민간인으로 전환합니까? 切换至平民方? 切換至平民方? + Sivillere Geç? Allow switching to civilian units? @@ -177,11 +199,11 @@ Erlaube das Wechseln zu CIVILIAN-Einheiten? Povolit přesun k CIVILISTŮM? Permitir troca de unidades para o Civil? - Permettre le changement en unité CIV? + Autorise le passage en unité Civile. Civil egységekre való váltás engedélyezése? Разрешить переключаться на гражданских юнитов? Consenti passaggio ad unità civili? - 市民側ユニットへ切り替えられるようにしますか? + 市民側ユニットへ切り替えられるようにします。 민간인으로 전환하는걸 허가합니까? 允许切换至平民方? 允許切換至平民方? @@ -193,11 +215,11 @@ Aktiviere Sicherheitszone? Povolit bezpečné oblasti? Habilitar zona segura? - Activer la zone sécurisée? + Créer une zone sécurisée Biztonságos zóna engedélyezése? Безопасная зона Abilita Zona Sicura? - 安全地帯を有効にしますか? + 安全地帯を有効化 안전 지대 활성화? 启用安全区? 啟用安全區? @@ -207,13 +229,13 @@ Aktywuje bezpieczną strefę wokół jednostek przeciwnika. Gracze nie mogą zmieniać strony wewnątrz tej strefy. Habilita una zona segura alrededor de las unidades enemigas. Los jugadores no pueden cambiar de unidad dentro de la zona segura. Aktiviere eine Sicherheitszone um feindliche Einheiten? Spieler können nicht zu Einheiten in der Sicherheitszone wechseln. - Povolit bezpečnou zónu kolem nepřátelských jednotek? Hráči se nemohou změnit strany/jednotky uvnitř bezpečné zóny. + Povolit bezpečnou zónu kolem nepřátelských jednotek? Hráči nemohou změnit strany/jednotky uvnitř bezpečné zóny. Habilitar uma zona segur ao redor das unidades inimigas? Jogadores não conseguirão trocar para unidades dentro dessa zona segura. - Activer une zone sécurisée autour des enemis ? Les joueurs ne peuvent changer d'unité dand la zone sécurisée + Active une zone de sécurité autour des unités ennemies. Les joueurs ne peuvent pas changer de camp à l'intérieur de cette zone. Engedélyezve legyen-e egy biztonságos zóna az ellenségek körül? A játékosok nem tudnak a biztonságos zónán belüli egységekre váltani. Включить безопасную зону вокруг вражеских юнитов? Игроки не могут переключаться на юнитов, находящихся в безопасной зоне. Abilita una zona sicura attorno ad unità nemiche? I giocatori non possono cambiare ad unità dentro la zona sicura. - 敵ユニットから逃れる安全地帯を有効にしますか?プレイヤーは安全地帯内のユニットへ切り替えできません。 + 敵ユニットから逃れる安全地帯を生成できます。プレイヤーは安全地帯内のユニットへ切り替えできません。 적 주위로 안전 지대를 활성화합니까? 안전 지대 내에서는 플레이어가 인원 전환을 할 수 없습니다. 启用敌方周围安全地带? 玩家不能切换到安全区内的单位 啟用敵方周圍安全地帶? 玩家不能切換到安全區內的單位 @@ -241,7 +263,7 @@ Die Sicherheitszone um Spieler von einem anderen Team. Standard: 100 Bezpečná zóna kolem hráče z jiných týmu. Výchozí: 100 A zona segura ao redor dos jogadores de diferentes equipes. Padrão: 100 - Rayon de la zone sécurisée autour de joueurs d'équipe différentes. Défaut: 100 + Rayon de la zone de sécurité autour des joueurs d'équipes différentes. Valeur par défaut : 100 mètres. A biztonságos zóna más csapatból lévő játékosok körül. Alapértelmezett: 100 Радиус безопасной зоны вокруг ироков из противоположной команды. По-умолчанию: 100 La zona sicura attorno ai giocatori di un team diverso. Default: 100 @@ -257,7 +279,7 @@ Tento modul umožňuje přepínání mazi dostupnými stranami. Este módulo permite mudar o lado à disposição dos jogadores. Этот модуль позволяет игрокам переключаться между доступными юнитами. - Ce module permet le changement de faction des joueurs + Ce module vous permet de changer de camp en cours de partie. Questo modulo ti permette di cambiare lato durante la partita. El módulo permite a las unidades cambiar de bando durante el juego. モジュールはゲームにおいて、陣営の切り替えを有効にします。 diff --git a/addons/tacticalladder/CfgEventHandlers.hpp b/addons/tacticalladder/CfgEventHandlers.hpp index cb09874dabc..5b2eb3a0533 100644 --- a/addons/tacticalladder/CfgEventHandlers.hpp +++ b/addons/tacticalladder/CfgEventHandlers.hpp @@ -7,13 +7,13 @@ 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)); }; }; diff --git a/addons/tacticalladder/data/model.cfg b/addons/tacticalladder/data/model.cfg index bc7da07960a..ec200139ffd 100644 --- a/addons/tacticalladder/data/model.cfg +++ b/addons/tacticalladder/data/model.cfg @@ -28,121 +28,114 @@ class CfgSkeletons { skeletonInherit = ""; skeletonBones[] = { "Pelvis","", - "Spine","Pelvis", - "Spine1","Spine", - "Spine2","Spine1", - "Spine3","Spine2", - "Camera","Pelvis", - "weapon","Spine1", - "launcher","Spine1", - - // Head skeleton in hierarchy - "neck","Spine3", - "neck1","neck", - "head","neck1", - - // New facial features - "Face_Hub","head", - "Face_Jawbone","Face_Hub", - "Face_Jowl","Face_Jawbone", - "Face_chopRight","Face_Jawbone", - "Face_chopLeft","Face_Jawbone", - "Face_LipLowerMiddle","Face_Jawbone", - "Face_LipLowerLeft","Face_Jawbone", - "Face_LipLowerRight","Face_Jawbone", - "Face_Chin","Face_Jawbone", - "Face_Tongue","Face_Jawbone", - "Face_CornerRight","Face_Hub", - "Face_CheekSideRight","Face_CornerRight", - "Face_CornerLeft","Face_Hub", - "Face_CheekSideLeft","Face_CornerLeft", - "Face_CheekFrontRight","Face_Hub", - "Face_CheekFrontLeft","Face_Hub", - "Face_CheekUpperRight","Face_Hub", - "Face_CheekUpperLeft","Face_Hub", - "Face_LipUpperMiddle","Face_Hub", - "Face_LipUpperRight","Face_Hub", - "Face_LipUpperLeft","Face_Hub", - "Face_NostrilRight","Face_Hub", - "Face_NostrilLeft","Face_Hub", - "Face_Forehead","Face_Hub", - "Face_BrowFrontRight","Face_Forehead", - "Face_BrowFrontLeft","Face_Forehead", - "Face_BrowMiddle","Face_Forehead", - "Face_BrowSideRight","Face_Forehead", - "Face_BrowSideLeft","Face_Forehead", - "Face_Eyelids","Face_Hub", - "Face_EyelidUpperRight","Face_Hub", - "Face_EyelidUpperLeft","Face_Hub", - "Face_EyelidLowerRight","Face_Hub", - "Face_EyelidLowerLeft","Face_Hub", - "EyeLeft","Face_Hub", - "EyeRight","Face_Hub", - - // Left upper side - "LeftShoulder","Spine3", - "LeftArm","LeftShoulder", - "LeftArmRoll","LeftArm", - "LeftForeArm","LeftArmRoll", - "LeftForeArmRoll","LeftForeArm", - "LeftHand","LeftForeArmRoll", - "LeftHandRing","LeftHand", - "LeftHandRing1","LeftHandRing", - "LeftHandRing2","LeftHandRing1", - "LeftHandRing3","LeftHandRing2", - "LeftHandPinky1","LeftHandRing", - "LeftHandPinky2","LeftHandPinky1", - "LeftHandPinky3","LeftHandPinky2", - "LeftHandMiddle1","LeftHand", - "LeftHandMiddle2","LeftHandMiddle1", - "LeftHandMiddle3","LeftHandMiddle2", - "LeftHandIndex1","LeftHand", - "LeftHandIndex2","LeftHandIndex1", - "LeftHandIndex3","LeftHandIndex2", - "LeftHandThumb1","LeftHand", - "LeftHandThumb2","LeftHandThumb1", - "LeftHandThumb3","LeftHandThumb2", - - // Right upper side - "RightShoulder","Spine3", - "RightArm","RightShoulder", - "RightArmRoll","RightArm", - "RightForeArm","RightArmRoll", - "RightForeArmRoll","RightForeArm", - "RightHand","RightForeArmRoll", - "RightHandRing","RightHand", - "RightHandRing1","RightHandRing", - "RightHandRing2","RightHandRing1", - "RightHandRing3","RightHandRing2", - "RightHandPinky1","RightHandRing", - "RightHandPinky2","RightHandPinky1", - "RightHandPinky3","RightHandPinky2", - "RightHandMiddle1","RightHand", - "RightHandMiddle2","RightHandMiddle1", - "RightHandMiddle3","RightHandMiddle2", - "RightHandIndex1","RightHand", - "RightHandIndex2","RightHandIndex1", - "RightHandIndex3","RightHandIndex2", - "RightHandThumb1","RightHand", - "RightHandThumb2","RightHandThumb1", - "RightHandThumb3","RightHandThumb2", - - // Left lower side - "LeftUpLeg","Pelvis", - "LeftUpLegRoll","LeftUpLeg", - "LeftLeg","LeftUpLegRoll", - "LeftLegRoll","LeftLeg", - "LeftFoot","LeftLegRoll", - "LeftToeBase","LeftFoot", - - // Right lower side - "RightUpLeg","Pelvis", - "RightUpLegRoll","RightUpLeg", - "RightLeg","RightUpLegRoll", - "RightLegRoll","RightLeg", - "RightFoot","RightLegRoll", - "RightToeBase","RightFoot" - }; + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", + "camera","Pelvis",// case has changed for arma3 + "weapon","Spine1", + "launcher","Spine1", + "Neck","Spine3", + "Neck1","Neck", + "Head","Neck1", //Head skeleton in hierarchy + //Left upper side + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", + //Right upper side + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot", + //New facial features arma3 only + "Face_Hub","Head", + "Face_Jawbone","Face_Hub", + "Face_Jowl","Face_Jawbone", + "Face_chopRight","Face_Jawbone", + "Face_chopLeft","Face_Jawbone", + "Face_LipLowerMiddle","Face_Jawbone", + "Face_LipLowerLeft","Face_Jawbone", + "Face_LipLowerRight","Face_Jawbone", + "Face_Chin","Face_Jawbone", + "Face_Tongue","Face_Jawbone", + "Face_CornerRight","Face_Hub", + "Face_CheekSideRight","Face_CornerRight", + "Face_CornerLeft","Face_Hub", + "Face_CheekSideLeft","Face_CornerLeft", + "Face_CheekFrontRight","Face_Hub", + "Face_CheekFrontLeft","Face_Hub", + "Face_CheekUpperRight","Face_Hub", + "Face_CheekUpperLeft","Face_Hub", + "Face_LipUpperMiddle","Face_Hub", + "Face_LipUpperRight","Face_Hub", + "Face_LipUpperLeft","Face_Hub", + "Face_NostrilRight","Face_Hub", + "Face_NostrilLeft","Face_Hub", + "Face_Forehead","Face_Hub", + "Face_BrowFrontRight","Face_Forehead", + "Face_BrowFrontLeft","Face_Forehead", + "Face_BrowMiddle","Face_Forehead", + "Face_BrowSideRight","Face_Forehead", + "Face_BrowSideLeft","Face_Forehead", + "Face_Eyelids","Face_Hub", + "Face_EyelidUpperRight","Face_Hub", + "Face_EyelidUpperLeft","Face_Hub", + "Face_EyelidLowerRight","Face_Hub", + "Face_EyelidLowerLeft","Face_Hub", + "EyeLeft","Face_Hub", + "EyeRight","Face_Hub" + };// end of skeleton array // location of pivot points (local axes) for hierarchical animation pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d"; }; diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml index bec5b05e643..190616685e6 100644 --- a/addons/tacticalladder/stringtable.xml +++ b/addons/tacticalladder/stringtable.xml @@ -1,13 +1,13 @@ - + Telescopic Ladder Teleskopleiter Телескопическая лестница Drabina teleskopowa Escalera telescópica - Echelle téléscopique + Echelle télescopique Teleskopický žebřík Scala Telescopica Teleszkopikus létra @@ -16,6 +16,7 @@ 로프 사다리 伸缩梯子 伸縮梯子 + Katlanabilir Merdiven Deploy ladder @@ -32,6 +33,7 @@ 사다리 배치 布署梯子 佈署梯子 + Merdiveni Konuşlandır Drop ladder @@ -39,7 +41,7 @@ Положить лестницу Zostaw drabinę Soltar escalera - Lacher l'échelle + Lâcher l'échelle Položit žebřík Lascia scala Létra eldobása @@ -48,6 +50,7 @@ 사다리 놓기 降下梯子 降下梯子 + Merdiveni Bırak Extend @@ -58,11 +61,12 @@ Prodloužit Estendi Extender - Déployer + Ajuster 伸ばす 늘리기 伸长梯子 伸長梯子 + Uzat +Ctrl tilt @@ -94,6 +98,7 @@ 사다리 위치 梯子位置 梯子位置 + Merdiveni Taşı Pickup ladder @@ -101,7 +106,7 @@ Взять лестницу Zabierz drabinę Recoger escalera - Prendre l'échelle + Récupérer l'échelle Vzít žebřík Prendi scala Létra felvétele @@ -110,6 +115,7 @@ 사다리 줍기 捡起梯子 撿起梯子 + Merdiveni Al diff --git a/addons/tagging/ACE_Settings.hpp b/addons/tagging/ACE_Settings.hpp index a5367187955..af9bca12d19 100644 --- a/addons/tagging/ACE_Settings.hpp +++ b/addons/tagging/ACE_Settings.hpp @@ -1,11 +1,5 @@ class ACE_Settings { class GVAR(quickTag) { - category = CSTRING(Tagging); - displayName = CSTRING(QuickTag); - description = CSTRING(QuickTagDesc); - typeName = "SCALAR"; - value = 1; - values[] = {ECSTRING(Common,Disabled), CSTRING(LastUsed), CSTRING(RandomX), CSTRING(Random)}; - isClientSettable = 1; + movedToSQF = 1; }; }; diff --git a/addons/tagging/XEH_PREP.hpp b/addons/tagging/XEH_PREP.hpp index 44bd74b992f..449a0a6cb25 100644 --- a/addons/tagging/XEH_PREP.hpp +++ b/addons/tagging/XEH_PREP.hpp @@ -5,6 +5,7 @@ PREP(checkTaggable); PREP(compileConfigTags); PREP(createTag); PREP(moduleInit); +PREP(parseConfigTag); PREP(quickTag); PREP(tag); PREP(tagTestingThread); diff --git a/addons/tagging/XEH_postInit.sqf b/addons/tagging/XEH_postInit.sqf index 1e7003281a7..7fefa5757e6 100644 --- a/addons/tagging/XEH_postInit.sqf +++ b/addons/tagging/XEH_postInit.sqf @@ -4,39 +4,10 @@ // Cache for static objects GVAR(cacheStaticModels) = [false] call CBA_fnc_createNamespace; - -// Consider static everything vehicle that inherit from Static -// This include houses (which we don't need), but also walls, that we do -private _cfgBase = configFile >> "CfgVehicles"; -private _countOptions = count _cfgBase; -for "_index" from 0 to (_countOptions - 1) do { - private _cfgClass = _cfgBase select _index; - if (isClass _cfgClass) then { - if ((configName _cfgClass) isKindOf "Static") then { - private _model = getText (_cfgClass >> "model"); - if (_model != "") then { - private _array = _model splitString "\"; - GVAR(cacheStaticModels) setVariable [(_array select ((count _array) - 1)), true]; - }; - }; - }; -}; - -// Also consider static all object inheriting from bridges -_cfgBase = configFile >> "CfgNonAIVehicles"; -_countOptions = count _cfgBase; -for "_index" from 0 to (_countOptions - 1) do { - private _cfgClass = _cfgBase select _index; - if (isClass _cfgClass) then { - if ((configName _cfgClass) isKindOf ["Bridge_base_F", _cfgBase]) then { - private _model = getText (_cfgClass >> "model"); - if (_model != "") then { - private _array = _model splitString "\"; - GVAR(cacheStaticModels) setVariable [(_array select ((count _array) - 1)), true]; - }; - }; - }; -}; +private _cacheStaticModels = call (uiNamespace getVariable [QGVAR(cacheStaticModels), {[]}]); +{ + GVAR(cacheStaticModels) setVariable [_x, true]; +} forEach _cacheStaticModels; if (hasInterface) then { // Compile and cache config tags diff --git a/addons/tagging/XEH_preInit.sqf b/addons/tagging/XEH_preInit.sqf index e1487c671f8..2f0e3158a64 100644 --- a/addons/tagging/XEH_preInit.sqf +++ b/addons/tagging/XEH_preInit.sqf @@ -9,4 +9,6 @@ PREP_RECOMPILE_END; GVAR(cachedTags) = []; GVAR(cachedRequiredItems) = []; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/tagging/XEH_preStart.sqf b/addons/tagging/XEH_preStart.sqf index 022888575ed..342b4b6407e 100644 --- a/addons/tagging/XEH_preStart.sqf +++ b/addons/tagging/XEH_preStart.sqf @@ -1,3 +1,32 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _cacheStaticModels = []; + +private _vehicleClasses = "isClass _x && (configName _x) isKindOf 'Static'" configClasses (configFile >> "CfgVehicles"); + +// Consider static everything vehicle that inherit from Static +// This include houses (which we don't need), but also walls, that we do +{ + private _model = getText (_x >> "model"); + if (_model != "") then { + private _array = _model splitString "\"; + _cacheStaticModels pushBackUnique toLower (_array select ((count _array) - 1)); + }; +} forEach _vehicleClasses; + +private _nonAIVehicleClasses = "isClass _x" configClasses (configFile >> "CfgNonAIVehicles"); + +// Also consider static all object inheriting from bridges +private _cfgBase = configFile >> "CfgNonAIVehicles"; +{ + private _model = getText (_x >> "model"); + if (_model != "") then { + private _array = _model splitString "\"; + _cacheStaticModels pushBackUnique toLower (_array select ((count _array) - 1)); + }; +} forEach (_nonaivehicleClasses select {(configName _x) isKindOf ["Bridge_base_F", _cfgBase]}); + +uiNamespace setVariable [QGVAR(cacheStaticModels), compileFinal str _cacheStaticModels]; +TRACE_1("compiled",count _cacheStaticModels); diff --git a/addons/tagging/functions/fnc_addCustomTag.sqf b/addons/tagging/functions/fnc_addCustomTag.sqf index 6dccf3bfb2d..4de0fc016c3 100644 --- a/addons/tagging/functions/fnc_addCustomTag.sqf +++ b/addons/tagging/functions/fnc_addCustomTag.sqf @@ -10,6 +10,7 @@ * 3: Textures Paths * 4: Icon Path (default: "") * 5: Material Paths (optional) + * 6: Tag Model (optional) * * Return Value: * Sucessfully Added Tag @@ -26,7 +27,8 @@ params [ ["_requiredItem", "", [""]], ["_textures", [], [[]]], ["_icon", "", [""]], - ["_materials", [], [[]]] + ["_materials", [], [[]]], + ["_tagModel", "UserTexture1m_F", [""]] ]; // Verify @@ -52,4 +54,4 @@ if (_textures isEqualTo []) exitWith { _identifier = [_identifier] call CBA_fnc_removeWhitespace; // Add -[QGVAR(applyCustomTag), [_identifier, _displayName, _requiredItem, _textures, _icon, _materials]] call CBA_fnc_globalEventJIP; +[QGVAR(applyCustomTag), [_identifier, _displayName, _requiredItem, _textures, _icon, _materials, _tagModel]] call CBA_fnc_globalEventJIP; diff --git a/addons/tagging/functions/fnc_applyCustomTag.sqf b/addons/tagging/functions/fnc_applyCustomTag.sqf index d7a14820a89..cfe4f55212e 100644 --- a/addons/tagging/functions/fnc_applyCustomTag.sqf +++ b/addons/tagging/functions/fnc_applyCustomTag.sqf @@ -10,6 +10,7 @@ * 3: Textures Paths * 4: Icon Path (default: "") * 5: Material Paths + * 6: Tag Model (optional) * * Return Value: * None diff --git a/addons/tagging/functions/fnc_compileConfigTags.sqf b/addons/tagging/functions/fnc_compileConfigTags.sqf index df9f01ac453..be88a3df62c 100644 --- a/addons/tagging/functions/fnc_compileConfigTags.sqf +++ b/addons/tagging/functions/fnc_compileConfigTags.sqf @@ -16,40 +16,25 @@ */ { - private _failure = false; private _class = configName _x; + private _result = [_x, false] call FUNC(parseConfigTag); - private _displayName = getText (_x >> "displayName"); - if (_displayName == "") then { - ERROR_1("Failed compiling ACE_Tags for tag: %1 - missing displayName",_class); - _failure = true; - }; - - private _requiredItem = getText (_x >> "requiredItem"); - if (_requiredItem == "") then { - ERROR_1("Failed compiling ACE_Tags for tag: %1 - missing requiredItem",_class); - _failure = true; - } else { - if (!isClass (configFile >> "CfgWeapons" >> _requiredItem)) then { - ERROR_2("Failed compiling ACE_Tags for tag: %1 - requiredItem %2 does not exist",_class,_requiredItem); - _failure = true; - } else { - _requiredItem = configName (configFile >> "CfgWeapons" >> _requiredItem); // convert to config case - }; - }; + if !(_result isEqualTo []) then { + _result params ["_tagInfo", "_requiredItem"]; - private _textures = getArray (_x >> "textures"); - if (_textures isEqualTo []) then { - ERROR_1("Failed compiling ACE_Tags for tag: %1 - missing textures",_class); - _failure = true; + GVAR(cachedTags) pushBack _tagInfo; + GVAR(cachedRequiredItems) pushBackUnique _requiredItem; }; +} forEach ("true" configClasses (configFile >> "ACE_Tags")); - private _materials = getArray (_x >> "materials"); +{ + private _class = configName _x; + private _result = [_x, true] call FUNC(parseConfigTag); - private _icon = getText (_x >> "icon"); + if !(_result isEqualTo []) then { + _result params ["_tagInfo", "_requiredItem"]; - if (!_failure) then { - GVAR(cachedTags) pushBack [_class, _displayName, _requiredItem, _textures, _icon, _materials]; + GVAR(cachedTags) pushBack _tagInfo; GVAR(cachedRequiredItems) pushBackUnique _requiredItem; }; -} forEach ("true" configClasses (configFile >> "ACE_Tags")); +} forEach ("true" configClasses (missionConfigFile >> "ACE_Tags")); diff --git a/addons/tagging/functions/fnc_createTag.sqf b/addons/tagging/functions/fnc_createTag.sqf index 5f2a60cf86a..a993e6675f7 100644 --- a/addons/tagging/functions/fnc_createTag.sqf +++ b/addons/tagging/functions/fnc_createTag.sqf @@ -20,7 +20,7 @@ * Public: No */ -params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_object", "_unit", ["_material","",[""]]]; +params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_object", "_unit", ["_material","",[""]], ["_tagModel", "UserTexture1m_F", [""]]]; TRACE_5("createTag:",_tagPosASL,_vectorDirAndUp,_texture,_object,_unit); if (_texture == "") exitWith { @@ -28,7 +28,7 @@ if (_texture == "") exitWith { false }; -private _tag = createSimpleObject ["UserTexture1m_F", _tagPosASL]; +private _tag = createSimpleObject [_tagModel, _tagPosASL]; _tag setObjectTextureGlobal [0, _texture]; if (_material != "") then { _tag setObjectMaterialGlobal [0, _material] }; _tag setVectorDirAndUp _vectorDirAndUp; @@ -46,7 +46,7 @@ if (_object getVariable [QGVAR(testVar), false]) then { // If the object already has tags attached, just add the new one to the list private _attachedTags = _object getVariable QGVAR(attachedTags); - if !(isNil "_attachedTags ") exitWith { + if (!isNil "_attachedTags") exitWith { _attachedTags pushBack _tag; }; diff --git a/addons/tagging/functions/fnc_parseConfigTag.sqf b/addons/tagging/functions/fnc_parseConfigTag.sqf new file mode 100644 index 00000000000..41242529eee --- /dev/null +++ b/addons/tagging/functions/fnc_parseConfigTag.sqf @@ -0,0 +1,91 @@ +#include "script_component.hpp" +/* + * Author: Jonpas, Dedmen + * Parses tags from ACE_Tags config. + * + * Arguments: + * 0: The config class + * 1: Is Mission + * + * Return Value: + * Tag Information + * + * Example: + * [_x, false] call ace_tagging_fnc_parseConfigTag + * + * Public: No + */ + +#define GET_MOD_OR_MISSION_PATH(thing) \ + if (thing select [0,1] != "@") then { \ + getMissionPath thing; \ + } else { \ + thing select [1]; \ + } + +params ["_cfg", ["_isMission", false, [false]]]; + + +private _failure = false; +private _class = configName _cfg; + +private _displayName = getText (_cfg >> "displayName"); +if (_displayName == "") then { + ERROR_1("Failed compiling ACE_Tags for tag: %1 - missing displayName",_class); + _failure = true; +}; + +private _requiredItem = getText (_cfg >> "requiredItem"); +if (_requiredItem == "") then { + ERROR_1("Failed compiling ACE_Tags for tag: %1 - missing requiredItem",_class); + _failure = true; +} else { + if (!isClass (configFile >> "CfgWeapons" >> _requiredItem)) then { + ERROR_2("Failed compiling ACE_Tags for tag: %1 - requiredItem %2 does not exist",_class,_requiredItem); + _failure = true; + } else { + _requiredItem = configName (configFile >> "CfgWeapons" >> _requiredItem); // convert to config case + }; +}; + +private _textures = getArray (_cfg >> "textures"); +if (_textures isEqualTo []) then { + ERROR_1("Failed compiling ACE_Tags for tag: %1 - missing textures",_class); + _failure = true; +}; + +private _materials = getArray (_cfg >> "materials"); + +private _icon = getText (_cfg >> "icon"); + +private _tagModel = getText (_cfg >> "tagModel"); +if (_tagModel == "") then { + _tagModel = "UserTexture1m_F"; +}; + +// Need to parse mission vs mod path for mission config +if (_isMission) then { + _materials = _materials apply { + GET_MOD_OR_MISSION_PATH(_x); + }; + + _textures = _textures apply { + GET_MOD_OR_MISSION_PATH(_x); + }; + + // Only if path to model, either has subfolders or atleast a .p3d + if ("\" in _tagModel || {"." in _tagModel}) then { + _tagModel = GET_MOD_OR_MISSION_PATH(_tagModel); + }; +}; + + + +if (_failure) then { + [] +} else { + [ + [_class, _displayName, _requiredItem, _textures, _icon, _materials, _tagModel], + _requiredItem + ] +} diff --git a/addons/tagging/functions/fnc_quickTag.sqf b/addons/tagging/functions/fnc_quickTag.sqf index 1939ce16798..7c61dc7b37d 100644 --- a/addons/tagging/functions/fnc_quickTag.sqf +++ b/addons/tagging/functions/fnc_quickTag.sqf @@ -49,7 +49,7 @@ if (GVAR(quickTag) == 3) then { // Tag if !(_possibleTags isEqualTo []) then { private _availableTags = _possibleTags select {(_x select 2) in (_unit call EFUNC(common,uniqueItems))}; - (selectRandom _availableTags) params ["", "", "", "_textures", "", "_materials"]; + (selectRandom _availableTags) params ["", "", "", "_textures", "", "_materials", "_tagModel"]; ( if (count _textures == count _materials) then { @@ -60,5 +60,5 @@ if !(_possibleTags isEqualTo []) then { } ) params ["_randomTexture", "_randomMaterial"]; - [_unit, _randomTexture, _randomMaterial] call FUNC(tag); + [_unit, _randomTexture, _randomMaterial, _tagModel] call FUNC(tag); }; diff --git a/addons/tagging/functions/fnc_tag.sqf b/addons/tagging/functions/fnc_tag.sqf index 2e14906d43a..7ea0ed2d380 100644 --- a/addons/tagging/functions/fnc_tag.sqf +++ b/addons/tagging/functions/fnc_tag.sqf @@ -7,6 +7,7 @@ * 0: Unit * 1: The colour of the tag (valid colours are black, red, green and blue or full path to custom texture) * 2: Material of the tag (Optional) + * 3: Tag Model (optional) * * Return Value: * Sucess @@ -20,7 +21,8 @@ params [ ["_unit", objNull, [objNull]], ["_texture", "", [""]], - ["_material", "", [""]] + ["_material", "", [""]], + ["_tagModel", "UserTexture1m_F", [""]] ]; if (isNull _unit || {_texture == ""}) exitWith { @@ -37,7 +39,7 @@ private _intersections = lineIntersectsSurfaces [_startPosASL, _endPosASL, _unit // If there's no intersections if (_intersections isEqualTo []) exitWith { - TRACE_3("No intersections",_intersections); + TRACE_1("No intersections",_intersections); false }; @@ -95,7 +97,7 @@ if ( !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || {!([ 0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk) || {!([-0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || {!([-0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk)}}}) exitWith { - TRACE_3("Unsuitable location:",_touchingPoint); + TRACE_1("Unsuitable location:",_touchingPoint); false }; @@ -108,10 +110,10 @@ private _vectorDirAndUp = [_surfaceNormal vectorMultiply -1, _v3]; params ["", "", "", "", "_unit"]; TRACE_2("Unit:",_unit,_this); - playSound3D [QUOTE(PATHTO_R(sounds\spray.ogg)), _unit, false, (eyePos _unit), 10, 1, 15]; + playSound3D [QUOTE(PATHTO_R(sounds\spray.ogg)), _unit, false, (eyePos _unit), 5, 1, 15]; // Tell the server to create the tag and handle its destruction [QGVAR(createTag), _this] call CBA_fnc_serverEvent; -}, [_touchingPoint vectorAdd (_surfaceNormal vectorMultiply 0.06), _vectorDirAndUp, _texture, _object, _unit, _material], 0.6] call CBA_fnc_waitAndExecute; +}, [_touchingPoint vectorAdd (_surfaceNormal vectorMultiply 0.06), _vectorDirAndUp, _texture, _object, _unit, _material, _tagModel], 0.6] call CBA_fnc_waitAndExecute; true diff --git a/addons/tagging/initSettings.sqf b/addons/tagging/initSettings.sqf new file mode 100644 index 00000000000..c5d0fbfa423 --- /dev/null +++ b/addons/tagging/initSettings.sqf @@ -0,0 +1,9 @@ +[ + QGVAR(quickTag), "LIST", + [LLSTRING(QuickTag), LLSTRING(QuickTagDesc)], + ["ACE Uncategorized", LLSTRING(Tagging)], + [[0,1,2,3], [LELSTRING(Common,Disabled), LLSTRING(LastUsed), LLSTRING(RandomX), LLSTRING(Random)], 1], // [values, titles, defaultIndex] + false, // isGlobal + {[QGVAR(quickTag), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml index 75de55efcc5..bcb9e34d5d8 100644 --- a/addons/tagging/stringtable.xml +++ b/addons/tagging/stringtable.xml @@ -6,24 +6,29 @@ Маркировка タグ付け Tagowanie - Markierungssystem (Spraydose) + Markieren (Spraydose) 뿌리기 Marquage Marcamento 喷漆 噴漆 + Marcação + Označování + Işaretleme Configure how the tagging system will operate by default. Настройка работы системы спрей-маркеров по-умолчанию. 標準で開くタグ付けシステムの設定を行います。 Skonfiguruj zachowanie systemu tagowania. - Konfiguriert, wie das Markierungssystem standardmäßig funktioniert. + Konfiguriert, wie das Markieren standardmäßig funktioniert. 뿌리기 시스템의 기본사항을 설정합니다. Configure le fonctionnement par défaut du système de marquage. Configura quanto il sistema di marcamento agirà da se. 定义喷漆系统预设设定 定義噴漆系統預設設定 + Configura como o sistema de Marcação funcionará como padrão. (Tagging) + Nakonfigurujte, jak bude systém značkování ve výchozím nastavení fungovat. Spray Paint - Quick Tag @@ -32,10 +37,13 @@ Szybkie tagowanie Schnelle Markierung (Spraydose) 빠른 뿌리기 - Marquage rapide + Peinture en spray - Marquage rapide Marcamento Rapido 快速喷漆 快速噴漆 + Lata de Tinta - Marcação Rápida + Stříkací barva - Rychlá značka + Sprey Boya- Hızlı Işaretleme Action performed on main tag interaction point. @@ -44,10 +52,12 @@ Akcja wykonywana na głównym punkcie interakcji tagu. Aktion, die am Haupt-Interaktionspunkt ausgeführt werden soll. 이 동작은 상호작용에서 뿌리기를 할 수 있게 해준다 - Action réalisé au point de marquage principal. + Type de marquage à appliquer sur le point visé. Azione eseguita sul punto di interazione dei tag principali. 直接喷漆在互动选单瞄准的点上。 直接噴漆在互動選單瞄準的點上。 + Ação executada no ponto principal de marcação + Akce prováděná v hlavním bodě značky interakce. Last Used @@ -60,6 +70,9 @@ Ultimo Usato 上次最后使用 上次最後使用 + Último usado + Naposledy použitý + Son Kullanan Random X @@ -68,10 +81,13 @@ Losowy X Zufällig X 무작위 X - Aléatoire X + X aléatoire Random X 随机X标记 隨機X標記 + Aleatório X + Náhodné X + Rasgele X Random @@ -84,6 +100,9 @@ Random 随机 隨機 + Aleatório + Náhodný + Rasgele Tag @@ -99,6 +118,7 @@ Tag 喷漆 噴漆 + Işaretle X black @@ -114,6 +134,7 @@ 검정 X 黑色X标记 黑色X標記 + X Siyah X red @@ -129,6 +150,7 @@ 빨간 X 红色X标记 紅色X標記 + X Red X green @@ -144,6 +166,7 @@ 초록 X 绿色X标记 綠色X標記 + X Yeşil X blue @@ -159,13 +182,14 @@ 파랑 X 蓝色X标记 藍色X標記 + X Mavi - Black spray paint - Schwarze Sprühfarbe + Spray Paint (Black) + Sprühfarbe (Schwarz) Pintura negra - Czarna farba w sprayu - Peinture pulvérisée noire + Farba w Sprayu (Czarna) + Peinture en spray (Noire) Bomboletta spray nera Černý sprej Spray de tinta preta @@ -174,13 +198,14 @@ 검정 스프레이 黑色喷漆 黑色噴漆 + Sprey Boya (Siyah) - Red spray paint - Rote Sprühfarbe + Spray Paint (Red) + Sprühfarbe (Rot) Pintura roja - Czerwona farba w sprayu - Peinture pulvérisée rouge + Farba w Sprayu (Czerwona) + Peinture en spray (Rouge) Bomboletta spray rossa Červený sprej Spray de tinta vermelha @@ -189,13 +214,14 @@ 빨강 스프레이 红色喷漆 紅色噴漆 + Sprey Boya (Kırmızı) - Green spray paint - Grüne Sprühfarbe + Spray Paint (Green) + Sprühfarbe (Grün) Pintura verde - Zielona farba w sprayu - Peinture pulvérisée verte + Farba w Sprayu (Zielona) + Peinture en spray (Verte) Bomboletta spray verde Zelený sprej Spray de tinta verde @@ -204,13 +230,14 @@ 초록 스프레이 绿色喷漆 綠色噴漆 + Sprey Boya (Yeşil) - Blue spray paint - Blaue Sprühfarbe + Spray Paint (Blue) + Sprühfarbe (Blau) Pintura azul - Niebieska farba w sprayu - Peinture pulvérisée bleue + Farba w Sprayu (Niebieska) + Peinture en spray (Bleue) Bomboletta spray blu Modrý sprej Spray de tinta azul @@ -219,13 +246,14 @@ 파랑 스프레이 蓝色喷漆 藍色噴漆 + Sprey Boya (Mavi) A can of spray paint for tagging walls. Eine Farbsprühdose um Wände zu markieren. Lata de pintura en aerosol para marcar. Farba w sprayu, służy do oznakowywania terenu. - Un spray de peinture pour marquer les murs. + Une bombe de peinture en spray pour tagger les murs. Una bomboletta di spay per contrassegnare i muri. Plechovka se sprejem k vytváření značek. Uma lata de tinta spray para marcar paredes. diff --git a/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf b/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf index 09a0603da19..642e90b769e 100644 --- a/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf @@ -19,7 +19,7 @@ params ["_trench", "_unit"]; if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; -if ((_trench getVariable [QGVAR(progress), 0]) >= 1) exitWith {false}; +if ((_trench getVariable [QGVAR(progress), 1]) >= 1) exitWith {false}; // Prevent removing/digging trench while it is being changed if (_trench getVariable [QGVAR(digging), false]) exitWith {false}; diff --git a/addons/trenches/functions/fnc_continueDiggingTrench.sqf b/addons/trenches/functions/fnc_continueDiggingTrench.sqf index 46d75f1915b..907e7dbed85 100644 --- a/addons/trenches/functions/fnc_continueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_continueDiggingTrench.sqf @@ -20,7 +20,7 @@ params ["_trench", "_unit", ["_switchingDigger", false, [true]]]; TRACE_2("continueDiggingTrench", _trench, _unit, _switchingDigger); -private _actualProgress = _trench getVariable [QGVAR(progress), 0]; +private _actualProgress = _trench getVariable [QGVAR(progress), 1]; if (_actualProgress >= 1) exitWith {}; // Mark trench as being worked on @@ -76,12 +76,12 @@ private _fnc_onFailure = { [_unit, "", 1] call EFUNC(common,doAnimation); }; private _fnc_condition = { - (_this select 0) params ["", "_trench"]; + (_this select 0) params ["_unit", "_trench"]; if !(_trench getVariable [QGVAR(digging), false]) exitWith {false}; if (count (_trench getVariable [QGVAR(diggers),[]]) <= 0) exitWith {false}; if (GVAR(stopBuildingAtFatigueMax) && {EGVAR(advanced_fatigue,anReserve) <= 0}) exitWith {false}; - true + "ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems)) }; [_digTime, [_unit, _trench], _fnc_onFinish, _fnc_onFailure, localize LSTRING(DiggingTrench), _fnc_condition, [], ((_trench getVariable [QGVAR(progress), 0]) >= 1)] call EFUNC(common,progressBar); diff --git a/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf b/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf index 682cbae81e1..3873e40b4a1 100644 --- a/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf +++ b/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [bob, "weapon"] call ace_trenches_fnc_handlePlayerInverntoryChanged + * [bob, "weapon"] call ace_trenches_fnc_handlePlayerInventoryChanged * * Public: No */ diff --git a/addons/trenches/functions/fnc_removeTrench.sqf b/addons/trenches/functions/fnc_removeTrench.sqf index 480f4d60a3d..fc5a4cdae37 100644 --- a/addons/trenches/functions/fnc_removeTrench.sqf +++ b/addons/trenches/functions/fnc_removeTrench.sqf @@ -20,7 +20,7 @@ params ["_trench", "_unit", ["_switchingDigger", false, [true]]]; TRACE_2("removeTrench", _trench, _unit, _switchingDigger); -private _actualProgress = _trench getVariable [QGVAR(progress), 0]; +private _actualProgress = _trench getVariable [QGVAR(progress), 1]; if (_actualProgress <= 0) exitWith {}; // Mark trench as being worked on @@ -37,6 +37,9 @@ if (_diggerCount > 0) then { }; private _removeTime = missionNamespace getVariable [getText (configFile >> "CfgVehicles" >> (typeOf _trench) >> QGVAR(removalDuration)), 20]; +if (isNil {_trench getVariable QGVAR(placeData)}) then { + _trench setVariable [QGVAR(placeData), [getPosASL _trench, [vectorDir _trench, vectorUp _trench]], true]; +}; private _placeData = _trench getVariable [QGVAR(placeData), [[], []]]; _placeData params ["", "_vecDirAndUp"]; @@ -74,12 +77,12 @@ private _fnc_onFailure = { [_unit, "", 1] call EFUNC(common,doAnimation); }; private _fnc_condition = { - (_this select 0) params ["", "_trench"]; + (_this select 0) params ["_unit", "_trench"]; if !(_trench getVariable [QGVAR(digging), false]) exitWith {false}; if (count (_trench getVariable [QGVAR(diggers),[]]) <= 0) exitWith {false}; - if (GVAR(stopBuildingAtFatigueMax) && {EGVAR(advanced_fatigue,anReserve) <= 0}) exitWith {false}; - true + if (GVAR(stopBuildingAtFatigueMax) && {EGVAR(advanced_fatigue,anReserve) <= 0}) exitWith {false}; + "ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems)) }; [_removeTime, [_unit, _trench], _fnc_onFinish, _fnc_onFailure, localize LSTRING(RemovingTrench), _fnc_condition, [], ((_trench getVariable [QGVAR(progress), 1]) <= 0)] call EFUNC(common,progressBar); diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml index 5c1ea0ac89b..6967789678e 100644 --- a/addons/trenches/stringtable.xml +++ b/addons/trenches/stringtable.xml @@ -1,6 +1,6 @@ - + - + Trenches Gräben @@ -11,7 +11,7 @@ Saperka Pala da Trincea Pala para trincheras - Outil de tranchée + Pelle tactique Polní lopatka Ferramenta de trincheira Саперная лопата @@ -19,6 +19,7 @@ 야전삽 战备锹 戰備鍬 + Kürek Entrenching Tool @@ -26,7 +27,7 @@ Mit dem Klappspaten können Erdwälle oder Gräben ausgehoben werden. Pala da Trincea Pala para trincheras - Outil de tranchée + Outil permettant de creuser des tranchées. Polní lopatky se používají k zákopovým a jiným pracem. Ferramenta de trincheira Саперная лопата @@ -34,18 +35,19 @@ 야전용 삽. 군인들의 영원한 친구 战备锹 戰備鍬 + Kürek Trench (Envelope - Small) Schützengraben (Rund - Klein) - + Small Personal Trench Kleiner Schützengraben Mała jednoosobowa wnęka Piccola Trincea Personale Trinchera personal pequeña - Petite tranchée personelle + Petite tranchée personnelle Malý zákop pro jednoho Trincheira pessoal pequena Малый персональный окоп @@ -53,6 +55,7 @@ 소형 개인참호 小型个人掩体 小型個人掩體 + Küçük Kişisel Siper Dig Small Trench @@ -68,6 +71,7 @@ 소형참호 파기 盖小掩体 蓋小掩體 + Küçük Siper Trench (Envelope - Big) @@ -79,7 +83,7 @@ Duża jednoosobowa wnęka Grande Trincea Personale Trinchera personal grande - Grande tranchée personelle + Grande tranchée personnelle Velký zákop pro jednoho Trincheira pessoal grande Большой персональный окоп @@ -87,6 +91,7 @@ 대형 참호 大型个人掩体 大型個人掩體 + Geniş Kişisel Siper Dig Big Trench @@ -102,6 +107,7 @@ 대형참호 파기 盖大掩体 蓋大掩體 + Büyük Siper Confirm Dig @@ -109,7 +115,7 @@ Potwierdź kopanie Conferma Scavo Confirmar cavado - Confirmer la creusée + Confirmer l'excavation Potvrdit kopání Confirmar excavação Копать @@ -117,6 +123,7 @@ 여기에 파기 确认开工 確認開工 + Kazmayı Onayla Cancel Dig @@ -124,7 +131,7 @@ Anuluj kopanie Annulla Scavo Cancelar cavado - Annuler la creusée + Annuler l'excavation Zrušit kopání Cancelar excavação Отменить копание @@ -132,12 +139,13 @@ 취소하기 取消动作 取消動作 + Kazmayı Iptal Et Rotate Drehen Girar - Tourner + Rotation Rotazione Otočit Forgatás @@ -148,6 +156,7 @@ 돌리기 旋转 旋轉 + Yönlendir Digging Trench @@ -155,7 +164,7 @@ Kopanie wnęki Scavando la Trincea Cavando trinchera - Creuse la tranchée + Excavation de la tranchée Vykopat zákop Cavando trincheira Копание окопа @@ -163,12 +172,13 @@ 참호 파는중 正在盖掩体中 正在蓋掩體中 + Siper Kazılıyor Continue Digging Trench Wzów kopanie wnęki Continuar cavando trincheira - Continuer à creuser la tranchée + Poursuivre l'excavation de la tranchée Продолжить копание окопа Pokračovat v kopání 塹壕を掘りつづける @@ -177,6 +187,7 @@ Continuando a Scavare la Trincea 继续盖掩体 繼續蓋掩體 + Kazmaya Devam Et Remove Trench @@ -191,12 +202,13 @@ Rimuovi Trincea 移除掩体 移除掩體 + Siperi Kaldır Removing Trench Usuwanie wnęki Removendo tricnheira - Retirement de la tranchée + Retrait de la tranchée Убирание окопа Odstraňuji zákop 塹壕を消しています @@ -205,6 +217,7 @@ Rimuovendo la Trincea 移除掩体中 移除掩體中 + Siper Kaldırılıyor Place camouflage diff --git a/addons/tripod/CfgEventHandlers.hpp b/addons/tripod/CfgEventHandlers.hpp index eaec430c1e9..3a79000a3c2 100644 --- a/addons/tripod/CfgEventHandlers.hpp +++ b/addons/tripod/CfgEventHandlers.hpp @@ -7,13 +7,13 @@ 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)); }; }; diff --git a/addons/tripod/functions/fnc_adjust.sqf b/addons/tripod/functions/fnc_adjust.sqf index 42af65be74a..d2a837c89ee 100644 --- a/addons/tripod/functions/fnc_adjust.sqf +++ b/addons/tripod/functions/fnc_adjust.sqf @@ -40,7 +40,7 @@ GVAR(adjustPFH) = [{ [_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); // add mouse button action and hint -[localize "STR_ACE_Tripod_Done", "", localize "STR_ACE_Tripod_ScrollAction"] call EFUNC(interaction,showMouseHint); +[LLSTRING(Done), "", LLSTRING(ScrollAction)] call EFUNC(interaction,showMouseHint); _unit setVariable [QGVAR(Adjust), [ _unit, "DefaultAction", diff --git a/addons/tripod/stringtable.xml b/addons/tripod/stringtable.xml index daea7e95fd2..7934238dfec 100644 --- a/addons/tripod/stringtable.xml +++ b/addons/tripod/stringtable.xml @@ -1,6 +1,6 @@ - + SSWT Kit Scharfschützendreibein @@ -16,6 +16,7 @@ SSWT 키트 狙击手专用三脚架 狙擊手專用三腳架 + SSWT Kiti Place SSWT Kit @@ -32,6 +33,7 @@ SSWT 키트 배치 放置狙击手专用三脚架 放置狙擊手專用三腳架 + Yerleştir SSWT Kit Pick up SSWT Kit @@ -48,6 +50,7 @@ SSWT 키트 줍기 捡起狙击手专用三脚架 撿起狙擊手專用三腳架 + Al SSWT Kit Adjust SSWT Kit @@ -64,6 +67,7 @@ SSWT 키트 조절 调整狙击手专用三脚架 調整狙擊手專用三腳架 + Ayarla SSWT Kit Done @@ -80,6 +84,7 @@ 완료 完成 完成 + Bitti adjust @@ -88,7 +93,7 @@ regulace anpassen ajuste - régler + Régler szabályzás подстройка regola @@ -96,6 +101,7 @@ 조절 调整 調整 + Ayarlamak diff --git a/addons/ui/functions/fnc_setAdvancedElement.sqf b/addons/ui/functions/fnc_setAdvancedElement.sqf index 0b5a174c5aa..4e2ececf6c9 100644 --- a/addons/ui/functions/fnc_setAdvancedElement.sqf +++ b/addons/ui/functions/fnc_setAdvancedElement.sqf @@ -6,7 +6,7 @@ * Arguments: * 0: Element Name * 1: Show/Hide Element - * 2: Show Hint + * 2: Show Hint (default: false) * 3: Force change even when disallowed (default: false) * * Return Value: @@ -18,12 +18,13 @@ * Public: No */ -params ["_element", "_show", ["_showHint", false, [true]], ["_force", false, [true]] ]; +params ["_element", "_show", ["_showHint", false, [true]], ["_force", false, [true]]]; private _cachedElement = GVAR(configCache) getVariable _element; -if (isNil "_cachedElement") exitWith {}; +if (isNil "_cachedElement") exitWith {TRACE_1("nil element",_this)}; if (!_force && {!GVAR(allowSelectiveUI)}) exitWith { + TRACE_1("not allowed",_this); [LSTRING(Disallowed), 2] call EFUNC(common,displayTextStructured); false }; @@ -31,8 +32,14 @@ if (!_force && {!GVAR(allowSelectiveUI)}) exitWith { _cachedElement params ["_idd", "_elements", "_location", "_conditions"]; // Exit if main vehicle type condition not fitting -private _canUseWeapon = ACE_player call CBA_fnc_canUseWeapon; -if ((_canUseWeapon && {_location == 2}) || {!_canUseWeapon && {_location == 1}}) exitWith {false}; +private _canUseWeaponOrInCargo = ACE_player call CBA_fnc_canUseWeapon || {-1 < vehicle ACE_player getCargoIndex ACE_player}; +if ( + (_canUseWeaponOrInCargo && {_location == VEHICLE_ONLY}) + || {!_canUseWeaponOrInCargo && {_location == GROUND_ONLY}} +) exitWith { + TRACE_3("skip location",_this,_canUseWeaponOrInCargo,_location); + false +}; // Get setting from config API { @@ -59,7 +66,7 @@ if (!_force) then { }; }; -_show = [1, 0] select _show; +private _fade = [1, 0] select _show; // Disable/Enable elements private _success = false; @@ -69,9 +76,9 @@ private _success = false; // Loop through IGUI displays as they can be present several times for some reason { if (_idd == ctrlIDD _x) then { - //TRACE_3("Setting Element Visibility",_show,_idd,_idc); + TRACE_4("Setting Element Visibility",_element,_fade,_idd,_idc); - (_x displayCtrl _idc) ctrlSetFade _show; + (_x displayCtrl _idc) ctrlSetFade _fade; (_x displayCtrl _idc) ctrlCommit 0; _success = true; diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml index 06b253238b1..423f5e07a8c 100644 --- a/addons/ui/stringtable.xml +++ b/addons/ui/stringtable.xml @@ -5,7 +5,7 @@ User Interface Uživatelské rozhraní Interface do usuário - Interface utilisateur + Interface Utilisateur Интерфейс ユーザ インタフェイス Interfejs użytkownika @@ -14,12 +14,14 @@ Interfaccia Utente 使用者介面 使用者介面 + Interfaz de usuario + Kullanıcı Arayüzü User Interface Uživatelské rozhraní Interface do usuário - Interface utilisateur + Interface Utilisateur Пользовательский интерфейс ユーザ インタフェイス Interfejs użytkownika @@ -28,11 +30,13 @@ Interfaccia Utente 使用者介面 使用者介面 + Interfaz de usuario + Kullanıcı Arayüzü This module allows toggling visible user interface parts. Este módulo permite ligar ou desligar partes da interface do usuário - Ce module permet le basculement de parties visibles de l'interface utlisateur + Ce module permet d'activer ou de désactiver certains éléments de l'Interface Utilisateur (IU). Этот модуль позволяет переключать видимость элементов пользовательского интерфейса. モジュールではユーザ インタフェイスの一部表示を切り替えできます。 Moduł ten pozwala zmienić stan widoczności poszczególnych elementów UI. @@ -41,12 +45,13 @@ Questo modulo consente di commutare parti di interfaccia utente visibili. 此模块允许你调整使用者介面的任何一个元件 此模塊允許你調整使用者介面的任何一個元件 + Tento modul umožňuje přepínání viditelných částí uživatelského rozhraní. Allow Selective UI Povolit selektivní UI Permitir IU Selecionável - Permettre l'IU selective + Autoriser la personnalisation de l'IU Включить настраиваемый интерфейс UI 選択性を許可 Zezwól na selektywne UI @@ -55,12 +60,13 @@ Permette l'UI Selettiva 允许调整使用者介面 允許調整使用者介面 + Permitir IU selectiva Allow client to modify their UI. Povolit klientovi měnit jeho UI Permite o cliente modificar sua IU. - Permet aux clients de modifier leur IU + Permet aux clients de modifier leur Interface Utilisateur. Позволить клиентам изменять их пользовательский интерфейс. クライアントがユーザ インタフェイスを編集できるようにします。 Zezwól klientowi na modyfikację UI. @@ -69,12 +75,13 @@ Permette al client di modificare la propria UI. 允许客户端自行调整使用者介面 允許客戶端自行調整使用者介面 + Permitir al cliente modificar su interfaz. Soldier/Vehicle/Weapon Information Informace o Vojákovi/Vozidlu/Zbrani Informação de Soldado/Veículo/Armamento - Soldat/Véhicule/Arme/Informations + Information soldat/véhicule/arme Информация о Солдате/Технике/Оружии 兵士/車両/武器の情報 Informacje o żołnierzu/pojeździe/broni @@ -83,6 +90,7 @@ Informazioni Soldato/Veicolo/Arma 士兵/载具/武器资讯栏 士兵/載具/武器資訊欄 + Información de soldado / vehículo / arma Vehicle Radar @@ -97,12 +105,14 @@ Rada Veicolo 载具雷达 載具雷達 + Radar de vehículos + Araç Radarı Vehicle Compass Kompas vozidla Bússola de Veículo - Compas de véhicule + Boussole de véhicule Компас в технике 車両のレーダ Kompas w pojeździe @@ -111,6 +121,8 @@ Bussola Veicolo 载具指北针 載具指北針 + Brújula del vehículo + Araç Pusulası Command Menu @@ -125,6 +137,8 @@ Menù di Comando 指挥选单 指揮選單 + Menú de Comando + Komut Menüsü Group Bar @@ -139,12 +153,14 @@ Barra del Gruppo 小队状态栏 小隊狀態欄 + Barra de grupo + Grup Göstergesi Weapon Name Název zbraně Nome do Armamento - Nom de l''arme + Nom de l'arme Название оружия 武器名 Nazwa broni @@ -153,12 +169,14 @@ Nome Arma 武器名称 武器名稱 + Nombre del arma + Silah Ismi Weapon Name Background Název zbraně v pozadí Fundo do Nome do Armamento - Arrière-plan du nom de l'arme + Fond pour le nom de l'arme Фон названия оружия 武器名の背景表示 Tło nazwy broni @@ -167,6 +185,7 @@ Nome Sfondo Arma 武器名称背景 武器名稱背景 + Fondo de nombre de arma Firing Mode @@ -181,6 +200,8 @@ Modalità di Fuoco 射击模式 射擊模式 + Modo de disparo + Ateşleme Modu Ammo Type @@ -195,6 +216,8 @@ Tipo Munizioni 弹药类型 彈藥類型 + Tipo de munición + Mermi Türü Ammo Count @@ -209,6 +232,8 @@ Contatore Munizioni 弹药数量 彈藥數量 + Cantidad de munición + Mermi Sayısı Magazine Count @@ -223,12 +248,14 @@ Contatore Caricatore 弹匣数量 彈匣數量 + Recuento de cargadores + Şarjör Sayısı Throwable Type Typ granátů apod. Tipo de Arremessável - Type d'objets de lancer + Type d'objet lançable Тип гранаты 投げる種類 Typ granatu @@ -237,12 +264,14 @@ Tipo Lanciabile 投掷物类型 投擲物類型 + Tipo arrojable + Fırlatılabilir Türü Throwable Count Počet granátů apod. Quantidade de Arremessável - Nombre d'objets de lancer + Nombre d'objets lançables Количество гранат 投げられる数 Ilość granatów @@ -251,12 +280,14 @@ Contatore Lanciabili 投掷物数量 投擲物數量 + Cantidad arrojable + Fırlatılabilir Sayısı Zeroing Náměr Zerar a mira - Mise à zéro + Zérotage Дальность стрельбы ゼロイン Wyzerowanie broni @@ -265,11 +296,13 @@ Azzeramento 归零距离 歸零距離 + Reducción a cero + Sıfırlama Weapon Lower Info Background Informações na parte de baixo do fundo do Armamento - Arrière-plan des informations inférieures de l'arme + Fond pour la barre d'informations inférieure de l'arme Фон ниформации об оружии снизу 武器名の背景表示 (下側) Tło dolnej części informacji o broni @@ -278,6 +311,8 @@ Informazioni Sfondo Arma Bassa 武器底部资讯栏背景 武器底部資訊欄背景 + Fondo de información inferior de arma + Nižší pozadí panulu s informacemi o zbrani Stance @@ -292,6 +327,8 @@ Postura 姿态 姿態 + Postura + Duruş Stamina Bar @@ -306,11 +343,13 @@ Barra Stamina 体力栏 體力欄 + Barra de resistencia + Yorulma Çubuğu Gunner Weapon Name Nome da arma do fuzileiro - Nom de l'arme du tireur + Nom de l'arme (tireur) Название орудия наводчика 射手用の武器名 Nazwa broni strzelca @@ -319,11 +358,13 @@ Nome Arma Artigliere 炮手武器名称 砲手武器名稱 + Jméno zbraně vozidla + Nişancı Silah Ismi Gunner Weapon Name Background Fundo do nome da arma do fuzileiro - Arrière-plan du nom de l'arme (tireur) + Fond pour le nom de l'arme (tireur) Фон названия орудия наводчика 射手用の武器名の背景表示 Tło nazwy broni strzelca @@ -332,6 +373,7 @@ Nome Sfondo Arma Artigliere 炮手武器名称背景 砲手武器名稱背景 + Pozadí jména zbraně vozidla Gunner Firing Mode @@ -345,6 +387,8 @@ Modalità di Fuoco Artigliere 炮手射击模式 砲手射擊模式 + Režim palby zbraně vozidla + Nişancı Ateşleme Modu Gunner Ammo Type @@ -358,6 +402,8 @@ Tipo Munizioni Artigliere 炮手弹药类型 砲手彈藥類型 + Typ munice zbraně vozidla + Nişancı Mermi Türü Gunner Ammo Count @@ -371,6 +417,8 @@ Contatore Munizioni Artigliere 炮手弹药数量 砲手彈藥數量 + Počet zásobníků zbraně vozidla + Nişancı Mermi Sayısı Gunner Magazine Count @@ -384,11 +432,13 @@ Contatore Caricatore Artigliere 炮手弹匣数量 砲手彈匣數量 + Počet munice zbraně vozidla + Nişancı Şarjör Sayısı Gunner Launchable Type Tipo de Arremessável do fuzileiro - Type d'objets jetable ( tireur) + Type d'objet lançable (tireur) Тип пусковой установки наводчика 射手用のランチャーの種類 Typ rakiet strzelca @@ -397,11 +447,12 @@ Tipo Lanciabile Artigliere 炮手发射物类型 砲手發射物類型 + Typ odpalitelných granátů vozidla Gunner Launchable Count Quantidade de Arremessável do fuzileiro - Nombre d'objets jetable (tireur) + Nombre d'objets lançables (tireur) Количество снарядов пусковой установки наводчика 射手用のランチャー弾薬数 Ilość rakiet strzelca @@ -410,11 +461,12 @@ Contatore Lanciabili Artigliere 炮手发射物数量 砲手發射物數量 + Počet odpalitelných granátů vozidla Gunner Zeroing Zerar a mira do fuzileiro - Mise à zéro ( tireur) + Zérotage (tireur) Дальность стрельбы наводчика 射手用ゼロイン Wyzerowanie broni strzelca @@ -423,11 +475,12 @@ Azzeramento Artigliere 炮手归零距离 砲手歸零距離 + Náměr zbraně vozidla Gunner Weapon Lower Info Background Informações na parte de baixo do fundo do Armamento do fuzileiro - Arrière-plan des informations inférieures (tireur) + Fond pour la barre d'informations inférieure (tireur) Фон ниформации об орудии наводчика снизу 射手用の武器名の背景表示 (下側) Tło dolnej części informacji o broni strzelca @@ -436,6 +489,7 @@ Informazioni Sfondo Arma Artigliere Bassa 炮手武器底部资讯栏背景 砲手武器底部資訊欄背景 + Nižší pozadí panelu s informacemi o zbrani vozidla Vehicle Name @@ -450,12 +504,14 @@ Nome Veicolo 载具名称 載具名稱 + Nombre del vehiculo + Araç Ismi Vehicle Name Background Název vozidla v pozadí Fundo do Nome do Veículo - Arrière-plan du nom du véhicule + Fond pour le nom du véhicule Фон названия техники 車両名の背景 Tło nazwy pojazdu @@ -464,12 +520,13 @@ Nome Sfondo Veicolo 载具名称背景 載具名稱背景 + Fondo del nombre del vehículo Vehicle Fuel Bar Ukazatel paliva Barra de Combustível do Veículo - Barre d'éssence du véhicule + Barre d'essence du véhicule Полоса топлива 車両の燃料計 Pasek paliwa @@ -478,6 +535,8 @@ Barra Carburante Veicolo 载具燃料栏 載具燃料欄 + Barra de combustible del vehículo + Araç Yakıt Göstergesi Vehicle Speed @@ -492,6 +551,8 @@ Velocità Veicolo 载具速度 載具速度 + Velocidad del vehículo + Araç Hızı Vehicle Altitude @@ -506,12 +567,14 @@ Altitudine Veicolo 载具高度 載具高度 + Altitud del vehículo + Araç Yüksekliği Vehicle Damage Poškození vozidla Dano do Veículo - Dégats du véhicule + Dégâts du véhicule Повреждение техники 車両の損傷表示 Uszkodzenia pojazdu @@ -520,12 +583,14 @@ Danno Veicolo 载具伤害 載具傷害 + Daño vehicular + Araç Hasarı Vehicle Info Background Info o vozidle v pozadí Fundo das informações do veículo - Arrière-plan des informations du véhicule + Fond pour les informations du véhicule Фон информации о технике 車両状態の背景 Tło informacji o pojeździe @@ -534,12 +599,13 @@ Informazioni Sfondo Veicolo 载具资讯栏背景 載具資訊欄背景 + Fondo de información del vehículo Requires Soldier/Vehicle/Weapon Information. Vyžaduje informace o Vojákovi/Vozidlu/Zbrani Requer informações de Soldado/Veículo/Armamento - Requiert les informations de soldat/Vehicule/Arme. + Requiert l'option "Information soldat/véhicule/arme". Требуется Информация о Солдате/Технике/Оружии. 兵士/車両/武器の情報を必要とします。 Wymaga informacji o żołnierzu/pojeździe/broni. @@ -553,7 +619,7 @@ Modifying User Interface is disabled. Změna uživatelského rozhraní je zakázána. A modificação da interface do usuário está desabilitada. - Modifications de l'interface utilisateur désactivé. + La personnalisation de l'Interface Utilisateur est désactivée. Изменение пользовательского интерфейса запрещено. ユーザ インタフェイスの変更は無効化されています。 Modyfikacja interfejsu użytkownika jest wyłączona. @@ -566,7 +632,7 @@ Cannot modify a forced User Interface element. Não é possível modificar um elemento forçado da interface do usuário. - Impossible de modifier un élément de l'interface utilisateur forcé. + Impossible de modifier un élément forcé de l'Interface Utilisateur. Невозможно изменить зафиксированный элемент пользовательского интерфейса. ユーザー インタフェイス要素の強制はできません。 Nie można modyfikować wymuszonego elementu interfejsu użytkownika. @@ -575,6 +641,7 @@ Impossibile modificare un elemento forzato d' Interfaccia Utente. 无法编辑已被锁定的使用者介面元件 無法編輯已被鎖定的使用者介面元件 + Nelze upravit prvek vynuceného uživatelského rozhraní. diff --git a/addons/vector/CfgOpticsEffect.hpp b/addons/vector/CfgOpticsEffect.hpp new file mode 100644 index 00000000000..2b9542ba9c0 --- /dev/null +++ b/addons/vector/CfgOpticsEffect.hpp @@ -0,0 +1,7 @@ +class CfgOpticsEffect { + class GVAR(OpticsRadBlur1) { + type = "radialblur"; + params[] = {0.01,0.01,0.18,0.36}; + priority = 950; + }; +}; diff --git a/addons/vector/CfgVehicles.hpp b/addons/vector/CfgVehicles.hpp index 23aa8d7412f..3854ea675aa 100644 --- a/addons/vector/CfgVehicles.hpp +++ b/addons/vector/CfgVehicles.hpp @@ -5,16 +5,36 @@ class CfgVehicles { scope = 2; scopeCurator = 2; displayName = CSTRING(VectorName); + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; vehicleClass = "Items"; + model = "\A3\Weapons_F\DummyBinoc.p3d"; + class TransportItems { MACRO_ADDITEM(ACE_Vector,1); }; }; + class ACE_Item_VectorDay: Item_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + scopeCurator = 2; + displayName = CSTRING(VectorDayName); + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; + vehicleClass = "Items"; + model = "\A3\Weapons_F\DummyBinoc.p3d"; + + class TransportItems { + MACRO_ADDITEM(ACE_VectorDay,1); + }; + }; + class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { class TransportItems { - MACRO_ADDITEM(ACE_Vector,6); + MACRO_ADDITEM(ACE_Vector,3); + MACRO_ADDITEM(ACE_VectorDay,3); }; }; }; diff --git a/addons/vector/CfgWeapons.hpp b/addons/vector/CfgWeapons.hpp index cc2cf985f66..5ffe99eea9e 100644 --- a/addons/vector/CfgWeapons.hpp +++ b/addons/vector/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class Binocular; class ACE_Vector: Binocular { @@ -6,13 +5,24 @@ class CfgWeapons { displayName = CSTRING(VectorName); descriptionShort = CSTRING(VectorDescription); model = QPATHTOF(ace_vector.p3d); - modelOptics = QPATHTOF(ace_vector_optics.p3d); picture = QPATHTOF(UI\ace_vector_x_ca.paa); visionMode[] = {"Normal","NVG"}; - opticsZoomMax = 0.06621; - opticsZoomMin = 0.06621; + opticsZoomMax = 0.25/7; + opticsZoomMin = 0.25/7; + modelOptics = "\A3\Weapons_F\empty.p3d"; + + class CBA_ScriptedOptic { + reticleTexture = QPATHTOF(data\reticles\ace_vector_reticle_ca.paa); + reticleTextureSize = 1.026; + bodyTexture = QPATHTOF(data\reticles\ace_vector_body_co.paa); + bodyTextureSize = 1.25; + reticleSafezoneSize = 1; + hidePeripheralVision = 1; + opticsPPEffects[] = {QGVAR(OpticsRadBlur1)}; + }; weaponInfoType = "ACE_RscOptics_vector"; }; + class ACE_VectorDay: ACE_Vector { author = ECSTRING(common,ACETeam); displayName = CSTRING(VectorDayName); diff --git a/addons/vector/RscInGameUI.hpp b/addons/vector/RscInGameUI.hpp index 704dd4838c9..7e2f7057650 100644 --- a/addons/vector/RscInGameUI.hpp +++ b/addons/vector/RscInGameUI.hpp @@ -1,163 +1,138 @@ - class RscText; class RscPicture; - -//class ScrollBar; -class RscControlsGroup { - class VScrollbar;//: ScrollBar {}; - class HScrollbar;//: ScrollBar {}; -}; +class RscControlsGroupNoScrollbars; class RscInGameUI { - class RscUnitInfo; - class ACE_RscOptics_vector: RscUnitInfo { - onLoad = "[""onLoad"",_this,""RscUnitInfo"",'IGUI'] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable ['ACE_dlgVector', _this select 0];"; - onUnload = "[""onUnload"",_this,""RscUnitInfo"",'IGUI'] call (uinamespace getvariable 'BIS_fnc_initDisplay')"; - idd = 300; - controls[] = {"CA_Distance","CA_Heading","CA_OpticsPitch","CA_Elev","CA_OpticsZoom","CA_VisionMode","ACE_ScriptedDisplayControlsGroup"}; + class RscWeaponZeroing; + class CBA_ScriptedOptic: RscWeaponZeroing { + class CA_Zeroing; + }; + + class ACE_RscOptics_vector: CBA_ScriptedOptic { + controls[] = { + "CA_FOVMode","ScopeBlack","Reticle","BodyNight","BodyDay","TrippleHeadLeft","TrippleHeadRight","CA_Zeroing","Magnification","ActiveDisplayHelper", + "CA_Distance","CA_Heading","CA_OpticsPitch","CA_Elev","CA_OpticsZoom","CA_VisionMode","ACE_ScriptedDisplayControlsGroup" + }; class CA_Distance: RscText { - idc = 151; // distance + idc = 151; // distance w = 0; h = 0; }; - class CA_Heading: RscText { - idc = 156; // azimuth + idc = 156; // azimuth w = 0; h = 0; }; - class CA_OpticsPitch: RscText { - idc = 182; // inclination + idc = 182; // inclination w = 0; h = 0; }; - class CA_Elev: RscText { - idc = 175; // inclination, more accurate + idc = 175; // inclination, more accurate w = 0; h = 0; }; - class CA_OpticsZoom: RscText { - idc = 180; // some kind of zoom + idc = 180; // some kind of zoom w = 0; h = 0; }; - class CA_VisionMode: RscText { - idc = 179; // ??? + idc = 179; // ??? w = 0; h = 0; }; + class CA_Zeroing: CA_Zeroing { + onLoad = "(_this select 0) ctrlShow false"; + }; - class ACE_ScriptedDisplayControlsGroup: RscControlsGroup { + class ACE_ScriptedDisplayControlsGroup: RscControlsGroupNoScrollbars { + onLoad = "uiNamespace setVariable ['ACE_dlgVector', ctrlParent (_this select 0)];"; idc = 170; - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; - - class VScrollbar: VScrollbar { - width = 0; - }; - - class HScrollbar: HScrollbar { - height = 0; - }; + x = "safezoneX"; + y = "safezoneY"; + w = "safezoneW"; + h = "safezoneH"; class controls { class Center: RscPicture { - idc = 1301; - text = ""; + idc = IDC_CENTER; colorText[] = {1,0,0,0.5}; - x = 0.488 * safezoneW /*+ safezoneX*/; - y = 0.4783 * safezoneH /*+ safezoneY*/; - w = 0.4 / 16 * safezoneW; - h = 0.4 / 9 * safezoneH; + x = "0.5 - (0.8 / 16 * safezoneW)/2 - safezoneX"; + y = "0.5 - (0.8 / 9 * safezoneH)/2 - safezoneY"; + w = "0.8 / 16 * safezoneW"; + h = "0.8 / 9 * safezoneH"; }; - class Crosshair: Center { - idc = 1302; - x = 0.4848 * safezoneW /*+ safezoneX*/; - y = 0.4732 * safezoneH /*+ safezoneY*/; - w = 0.5 / 16 * safezoneW; - h = 0.5 / 9 * safezoneH; + idc = IDC_CROSSHAIR; + x = "0.5 - (0.7 / 16 * safezoneW)/2 - safezoneX"; + y = "0.5 - (0.7 / 9 * safezoneH)/2 - safezoneY"; + w = "0.7 / 16 * safezoneW"; + h = "0.7 / 9 * safezoneH"; }; class Digit0: Center { - idc = 1310; - x = (0.54 + 0 * 0.02) * safezoneW /*+ safezoneX*/; - y = 0.54 * safezoneH /*+ safezoneY*/; - w = 0.5 / 16 * safezoneW; - h = 0.5 / 9 * safezoneH; + idc = IDC_DIGIT_0; + x = "(0.54 + 0 * 0.02) * safezoneW"; + y = "0.54 * safezoneH"; + w = "0.5 / 16 * safezoneW"; + h = "0.5 / 9 * safezoneH"; }; - class Digit1: Digit0 { - idc = 1311; - x = (0.54 + 1 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_1; + x = "(0.54 + 1 * 0.02) * safezoneW"; }; - class Digit2: Digit0 { - idc = 1312; - x = (0.54 + 2 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_2; + x = "(0.54 + 2 * 0.02) * safezoneW"; }; - class Digit3: Digit0 { - idc = 1313; - x = (0.54 + 3 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_3; + x = "(0.54 + 3 * 0.02) * safezoneW"; }; - class Digit4: Digit0 { - idc = 1314; - x = (0.54 + 4 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_4; + x = "(0.54 + 4 * 0.02) * safezoneW"; }; - class Digit5: Digit0 { - idc = 1315; - x = (0.35 + 0 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_5; + x = "(0.35 + 0 * 0.02) * safezoneW"; }; - class Digit6: Digit0 { - idc = 1316; - x = (0.35 + 1 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_6; + x = "(0.35 + 1 * 0.02) * safezoneW"; }; - class Digit7: Digit0 { - idc = 1317; - x = (0.35 + 2 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_7; + x = "(0.35 + 2 * 0.02) * safezoneW"; }; - class Digit8: Digit0 { - idc = 1318; - x = (0.35 + 3 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_8; + x = "(0.35 + 3 * 0.02) * safezoneW"; }; - class Digit9: Digit0 { - idc = 1319; - x = (0.35 + 4 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_9; + x = "(0.35 + 4 * 0.02) * safezoneW"; }; class DigitE1: Digit0 { - idc = 1321; - x = (0.39 + 0 * 0.02) * safezoneW /*+ safezoneX*/; - y = 0.42 * safezoneH /*+ safezoneY*/; + idc = IDC_DIGIT_E1; + x = "(0.39 + 0 * 0.02) * safezoneW"; + y = "0.42 * safezoneH"; }; - class DigitE2: DigitE1 { - idc = 1322; - x = (0.39 + 1 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_E2; + x = "(0.39 + 1 * 0.02) * safezoneW"; }; - class DigitE3: DigitE1 { - idc = 1323; - x = (0.39 + 2 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_E3; + x = "(0.39 + 2 * 0.02) * safezoneW"; }; - class DigitE4: DigitE1 { - idc = 1324; - x = (0.39 + 3 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_E4; + x = "(0.39 + 3 * 0.02) * safezoneW"; }; }; }; diff --git a/addons/vector/XEH_PREP.hpp b/addons/vector/XEH_PREP.hpp index f03d99ed838..1f259e3ff9c 100644 --- a/addons/vector/XEH_PREP.hpp +++ b/addons/vector/XEH_PREP.hpp @@ -1,4 +1,3 @@ - PREP(clearDisplay); PREP(convertToTexturesDegree); PREP(convertToTexturesDistance); diff --git a/addons/vector/ace_vector_optics.p3d b/addons/vector/ace_vector_optics.p3d deleted file mode 100644 index 15cfb1c9101..00000000000 Binary files a/addons/vector/ace_vector_optics.p3d and /dev/null differ diff --git a/addons/vector/config.cpp b/addons/vector/config.cpp index cf6f235a5ee..10371047e62 100644 --- a/addons/vector/config.cpp +++ b/addons/vector/config.cpp @@ -3,8 +3,8 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {"ACE_Item_Vector"}; - weapons[] = {"ACE_Vector", "ACE_VectorDay"}; + units[] = {"ACE_Item_Vector","ACE_Item_VectorDay"}; + weapons[] = {"ACE_Vector","ACE_VectorDay"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); @@ -15,8 +15,11 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" - #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" - +#include "CfgOpticsEffect.hpp" #include "RscInGameUI.hpp" + +class CBA_PIPItems { + GVAR(enable) = "-"; +}; diff --git a/addons/vector/data/reticles/ace_vector_body_co.paa b/addons/vector/data/reticles/ace_vector_body_co.paa new file mode 100644 index 00000000000..71e1984c6e5 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_body_co.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle.paa b/addons/vector/data/reticles/ace_vector_reticle.paa deleted file mode 100644 index 425dbb85b2e..00000000000 Binary files a/addons/vector/data/reticles/ace_vector_reticle.paa and /dev/null differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_1_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_1_ca.paa new file mode 100644 index 00000000000..255d8fa3389 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_1_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_2_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_2_ca.paa new file mode 100644 index 00000000000..98ab3d04baa Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_2_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_3_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_3_ca.paa new file mode 100644 index 00000000000..85d4e6940d2 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_3_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_4_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_4_ca.paa new file mode 100644 index 00000000000..85a38b41456 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_4_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_5_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_5_ca.paa new file mode 100644 index 00000000000..ff4f89edd48 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_5_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_ca.paa new file mode 100644 index 00000000000..4db7c71ff6f Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_ca.paa differ diff --git a/addons/vector/functions/fnc_adjustBrightness.sqf b/addons/vector/functions/fnc_adjustBrightness.sqf index 2cf2d5a9232..8fa17aae095 100644 --- a/addons/vector/functions/fnc_adjustBrightness.sqf +++ b/addons/vector/functions/fnc_adjustBrightness.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [5] call ace_vector_fnc_adjustBrigthness + * [5] call ace_vector_fnc_adjustBrightness * * Public: No */ @@ -20,22 +20,22 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); private _color = [[1,0,0,0.5], [1,0,0,1]] select (_this select 0); -(_dlgVector displayCtrl 1301) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1302) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1310) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1311) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1312) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1313) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1314) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1315) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1316) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1317) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1318) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1319) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1321) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1322) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1323) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1324) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_CENTER) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_CROSSHAIR) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetTextColor _color; GVAR(illuminate) = _this select 0; diff --git a/addons/vector/functions/fnc_clearDisplay.sqf b/addons/vector/functions/fnc_clearDisplay.sqf index 8d4578a2da4..1f723dd2f8b 100644 --- a/addons/vector/functions/fnc_clearDisplay.sqf +++ b/addons/vector/functions/fnc_clearDisplay.sqf @@ -20,18 +20,18 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); switch (_this select 0) do { case ("azimuth"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText ""; - (_dlgVector displayCtrl 1318) ctrlSetText ""; - (_dlgVector displayCtrl 1319) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText ""; }; case ("distance"): { - (_dlgVector displayCtrl 1310) ctrlSetText ""; - (_dlgVector displayCtrl 1311) ctrlSetText ""; - (_dlgVector displayCtrl 1312) ctrlSetText ""; - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; }; diff --git a/addons/vector/functions/fnc_getRelativeHeightLength.sqf b/addons/vector/functions/fnc_getRelativeHeightLength.sqf index 2bd6e4795cb..1049ba84b67 100644 --- a/addons/vector/functions/fnc_getRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_getRelativeHeightLength.sqf @@ -15,24 +15,20 @@ * Public: No */ -private _distanceP1 = GVAR(pData) select 0; -private _directionP1 = GVAR(pData) select 1; -private _azimuthP1 = _directionP1 select 0; -private _inclinationP1 = _directionP1 select 1; +GVAR(pData) params ["_distanceP1", "_directionP1"]; +_directionP1 params ["_azimuthP1", "_inclinationP1"]; private _distanceP2 = call FUNC(getDistance); private _directionP2 = call FUNC(getDirection); -private _azimuthP2 = _directionP2 select 0; -private _inclinationP2 = _directionP2 select 1; - -private _azimuth = abs (_azimuthP1 - _azimuthP2); -private _inclination = abs (_inclinationP1 - _inclinationP2); -private _height = sqrt (_distanceP1 ^ 2 + _distanceP2 ^ 2 - 2 * _distanceP1 * _distanceP2 * cos _inclination); -private _length = sqrt (_distanceP1 ^ 2 + _distanceP2 ^ 2 - 2 * _distanceP1 * _distanceP2 * cos _azimuth); - -if (_inclination < 0) then {_height = -1 * _height}; +_directionP2 params ["_azimuthP2", "_inclinationP2"]; if (_distanceP1 < -999 || {_distanceP2 < -999}) exitWith { [-1000, -1000] // return }; +private _position1 = [_distanceP1, _azimuthP1, _inclinationP1] call CBA_fnc_polar2vect; +private _position2 = [_distanceP2, _azimuthP2, _inclinationP2] call CBA_fnc_polar2vect; + +private _length = _position1 distance2D _position2; +private _height = abs ((_position1 vectorDiff _position2) select 2); + [_height, _length] diff --git a/addons/vector/functions/fnc_illuminate.sqf b/addons/vector/functions/fnc_illuminate.sqf index 999fc5c29a5..0c91da0ac03 100644 --- a/addons/vector/functions/fnc_illuminate.sqf +++ b/addons/vector/functions/fnc_illuminate.sqf @@ -20,31 +20,28 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); if (_this select 0) then { { - if (ctrlIDC _x != 170) then { - private _string = ctrlText _x; - private _index = _string find ".paa"; + private _control = _dlgVector displayCtrl _x; + private _string = ctrlText _control; + private _index = _string find ".paa"; - if (_index != -1 && {_string find "_illum.paa" == -1}) then { - _string = toArray _string; - _string resize _index; + if (_index != -1 && {_string find "_illum.paa" == -1}) then { + _string = toArray _string; + _string resize _index; - _x ctrlSetText format ["%1_illum.paa", toString _string]; - }; + _control ctrlSetText format ["%1_illum.paa", toString _string]; }; - } forEach allControls _dlgVector; + } forEach ILLUM_CONTROLS; } else { { - if (ctrlIDC _x != 170) then { - private _string = ctrlText _x; - private _index = _string find "_illum.paa"; + private _control = _dlgVector displayCtrl _x; + private _string = ctrlText _control; + private _index = _string find "_illum.paa"; - if (_index != -1) then { - _string = toArray _string; - _string resize _index; - - _x ctrlSetText format ["%1.paa", toString _string]; - }; + if (_index != -1) then { + _string = toArray _string; + _string resize _index; + _control ctrlSetText format ["%1.paa", toString _string]; }; - } forEach allControls _dlgVector; + } forEach ILLUM_CONTROLS; }; diff --git a/addons/vector/functions/fnc_showAzimuth.sqf b/addons/vector/functions/fnc_showAzimuth.sqf index 4a0854f3d50..e07f093b5d3 100644 --- a/addons/vector/functions/fnc_showAzimuth.sqf +++ b/addons/vector/functions/fnc_showAzimuth.sqf @@ -22,9 +22,9 @@ private _direction = call FUNC(getDirection); private _digits = _direction call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showAzimuthInclination.sqf b/addons/vector/functions/fnc_showAzimuthInclination.sqf index 15e206fbbd6..e7769a3e7b7 100644 --- a/addons/vector/functions/fnc_showAzimuthInclination.sqf +++ b/addons/vector/functions/fnc_showAzimuthInclination.sqf @@ -23,17 +23,17 @@ private _direction = call FUNC(getDirection); // azimuth private _digits = [_direction select 0] call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); // inclination _digits = [_direction select 1] call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showCenter.sqf b/addons/vector/functions/fnc_showCenter.sqf index fef128240f6..d9e3542fac8 100644 --- a/addons/vector/functions/fnc_showCenter.sqf +++ b/addons/vector/functions/fnc_showCenter.sqf @@ -15,6 +15,6 @@ * Public: No */ -((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl 1301) ctrlSetText (["", QPATHTOF(rsc\vector_center.paa)] select (_this select 0)); +((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl IDC_CENTER) ctrlSetText (["", QPATHTOF(rsc\vector_center.paa)] select (_this select 0)); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showDistance.sqf b/addons/vector/functions/fnc_showDistance.sqf index 447622355ce..3009d5ea5d3 100644 --- a/addons/vector/functions/fnc_showDistance.sqf +++ b/addons/vector/functions/fnc_showDistance.sqf @@ -22,9 +22,9 @@ private _distance = call FUNC(getDistance); private _digits = [_distance] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showFallOfShot.sqf b/addons/vector/functions/fnc_showFallOfShot.sqf index 3df9fa83578..ac03fc6bbfa 100644 --- a/addons/vector/functions/fnc_showFallOfShot.sqf +++ b/addons/vector/functions/fnc_showFallOfShot.sqf @@ -26,37 +26,37 @@ if !(_this select 0) then { // of ordinate private _digits = [_fosData, 1] call FUNC(convertToTexturesFOS); - (_dlgVector displayCtrl 1310) ctrlSetText (_digits select 0); - (_dlgVector displayCtrl 1311) ctrlSetText (_digits select 1); - (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 2); - (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 3); - (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 4); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText (_digits select 0); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 1); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 2); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 3); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 4); // of abscissa _digits = [_fosData, 0] call FUNC(convertToTexturesFOS); - (_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); - (_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); - (_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); - (_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); - (_dlgVector displayCtrl 1319) ctrlSetText (_digits select 4); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText (_digits select 4); } else { // applicate private _digits = [_fosData, 2] call FUNC(convertToTexturesFOS); - (_dlgVector displayCtrl 1310) ctrlSetText (_digits select 0); - (_dlgVector displayCtrl 1311) ctrlSetText (_digits select 1); - (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 2); - (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 3); - (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 4); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText (_digits select 0); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 1); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 2); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 3); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 4); // nothing - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText ""; - (_dlgVector displayCtrl 1318) ctrlSetText ""; - (_dlgVector displayCtrl 1319) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText ""; }; diff --git a/addons/vector/functions/fnc_showHeightDistance.sqf b/addons/vector/functions/fnc_showHeightDistance.sqf index 7c8c0cc02e5..ce4e3011a95 100644 --- a/addons/vector/functions/fnc_showHeightDistance.sqf +++ b/addons/vector/functions/fnc_showHeightDistance.sqf @@ -23,17 +23,17 @@ private _heightDistance = call FUNC(getHeightDistance); // height private _digits = [_heightDistance select 0] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); // non-slope distance _digits = [_heightDistance select 1] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showP1.sqf b/addons/vector/functions/fnc_showP1.sqf index 2d587e03d11..4cb25adfaa0 100644 --- a/addons/vector/functions/fnc_showP1.sqf +++ b/addons/vector/functions/fnc_showP1.sqf @@ -19,15 +19,15 @@ disableSerialization; private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); if (_this select 0) then { - (_dlgVector displayCtrl 1321) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1322) ctrlSetText QPATHTOF(rsc\vector_minus.paa); - (_dlgVector displayCtrl 1323) ctrlSetText QPATHTOF(rsc\vector_p.paa); - (_dlgVector displayCtrl 1324) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText QPATHTOF(rsc\vector_minus.paa); + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText QPATHTOF(rsc\vector_p.paa); + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText ""; } else { - (_dlgVector displayCtrl 1321) ctrlSetText ""; - (_dlgVector displayCtrl 1322) ctrlSetText ""; - (_dlgVector displayCtrl 1323) ctrlSetText ""; - (_dlgVector displayCtrl 1324) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText ""; }; [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf index 82f1f7eaf66..74365cc6c7a 100644 --- a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf @@ -23,17 +23,17 @@ private _azimuthDistance = call FUNC(getRelativeAzimuthDistance); // relative azimuth private _digits = [_azimuthDistance select 0] call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); // relative non-slope distance _digits = [_azimuthDistance select 1] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showRelativeDistance.sqf b/addons/vector/functions/fnc_showRelativeDistance.sqf index 0bd4d23ec0d..b8ddd9f04f3 100644 --- a/addons/vector/functions/fnc_showRelativeDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeDistance.sqf @@ -23,7 +23,7 @@ private _distance = call FUNC(getRelativeDistance); // relative slope distance private _digits = [_distance] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); diff --git a/addons/vector/functions/fnc_showRelativeHeightLength.sqf b/addons/vector/functions/fnc_showRelativeHeightLength.sqf index fe9823e1708..1fb9ddcb2fb 100644 --- a/addons/vector/functions/fnc_showRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_showRelativeHeightLength.sqf @@ -23,17 +23,17 @@ private _heightLength = call FUNC(getRelativeHeightLength); // height private _digits = [_heightLength select 0] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); // length _digits = [_heightLength select 1] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showReticle.sqf b/addons/vector/functions/fnc_showReticle.sqf index 5fd1729c4f3..fabf3cad153 100644 --- a/addons/vector/functions/fnc_showReticle.sqf +++ b/addons/vector/functions/fnc_showReticle.sqf @@ -15,6 +15,6 @@ * Public: No */ -((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl 1302) ctrlSetText (["", QPATHTOF(rsc\vector_crosshair.paa)] select (_this select 0)); +((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl IDC_CROSSHAIR) ctrlSetText (["", QPATHTOF(rsc\vector_crosshair.paa)] select (_this select 0)); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showText.sqf b/addons/vector/functions/fnc_showText.sqf index a8556e7a583..23f44810827 100644 --- a/addons/vector/functions/fnc_showText.sqf +++ b/addons/vector/functions/fnc_showText.sqf @@ -20,149 +20,149 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); switch (_this select 0) do { case ("config"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_c.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_g.paa); - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_c.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_g.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("settings"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_u.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_5.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_u.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_5.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("nigt"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_g.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_g.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_t.paa); }; case ("eret"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_r.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_r.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_t.paa); }; case ("on"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1312) ctrlSetText ""; - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("off"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("deg"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_3.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_6.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_0.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_degree.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_3.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_6.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_0.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_degree.paa); }; case ("mil"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_6.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_4.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_0.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_0.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_6.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_4.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_0.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_0.paa); }; case ("meter"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_5.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_minus.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_u.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_5.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_minus.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_u.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("feet"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("stor"): { - (_dlgVector displayCtrl 1321) ctrlSetText QPATHTOF(rsc\vector_5.paa); - (_dlgVector displayCtrl 1322) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1323) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1324) ctrlSetText QPATHTOF(rsc\vector_r.paa); + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText QPATHTOF(rsc\vector_5.paa); + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText QPATHTOF(rsc\vector_r.paa); }; case ("old_config"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_d.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_c.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_d.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_c.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("old_settings"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_d.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_u.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_d.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_u.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("clear_left"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText ""; - (_dlgVector displayCtrl 1318) ctrlSetText ""; - (_dlgVector displayCtrl 1319) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText ""; }; case ("clear_right"): { - (_dlgVector displayCtrl 1310) ctrlSetText ""; - (_dlgVector displayCtrl 1311) ctrlSetText ""; - (_dlgVector displayCtrl 1312) ctrlSetText ""; - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("clear_stor"): { - (_dlgVector displayCtrl 1321) ctrlSetText ""; - (_dlgVector displayCtrl 1322) ctrlSetText ""; - (_dlgVector displayCtrl 1323) ctrlSetText ""; - (_dlgVector displayCtrl 1324) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText ""; }; }; diff --git a/addons/vector/initKeybinds.sqf b/addons/vector/initKeybinds.sqf index 5b099235da8..7d815619936 100644 --- a/addons/vector/initKeybinds.sqf +++ b/addons/vector/initKeybinds.sqf @@ -1,11 +1,8 @@ -// by commy2 - -["ACE3 Equipment", QGVAR(AzimuthKey), localize LSTRING(AzimuthKey), -{ +["ACE3 Equipment", QGVAR(AzimuthKey), localize LSTRING(AzimuthKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(((currentWeapon ACE_player) isKindOf ["ACE_Vector", configFile >> "CfgWeapons"]) && {cameraView == "GUNNER"}) exitWith {false}; + if !(currentWeapon ACE_player isKindOf ["ACE_Vector", configFile >> "CfgWeapons"] && {cameraView == "GUNNER"}) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey1,false)) exitWith {false}; @@ -14,8 +11,7 @@ // Statement ["azimuth"] call FUNC(onKeyDown); false -}, -{ +}, { // prevent holding down GVAR(isDownStateKey1) = false; @@ -25,16 +21,13 @@ // Statement ["azimuth"] call FUNC(onKeyUp); false -}, -[15, [false, false, false]], false, 0] call CBA_fnc_addKeybind; //Tab Key - +}, [DIK_TAB, [false, false, false]], false, 0] call CBA_fnc_addKeybind; -["ACE3 Equipment", QGVAR(DistanceKey), localize LSTRING(DistanceKey), -{ +["ACE3 Equipment", QGVAR(DistanceKey), localize LSTRING(DistanceKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(((currentWeapon ACE_player) isKindOf ["ACE_Vector", configFile >> "CfgWeapons"]) && {cameraView == "GUNNER"}) exitWith {false}; + if !(currentWeapon ACE_player isKindOf ["ACE_Vector", configFile >> "CfgWeapons"] && {cameraView == "GUNNER"}) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey2,false)) exitWith {false}; @@ -43,8 +36,7 @@ // Statement ["distance"] call FUNC(onKeyDown); false -}, -{ +}, { // prevent holding down GVAR(isDownStateKey2) = false; @@ -54,5 +46,4 @@ // Statement ["distance"] call FUNC(onKeyUp); false -}, -[19, [false, false, false]], false] call CBA_fnc_addKeybind; //R Key +}, [DIK_R, [false, false, false]], false, 0] call CBA_fnc_addKeybind; diff --git a/addons/vector/script_component.hpp b/addons/vector/script_component.hpp index 15787b140fa..0c3646f1ff4 100644 --- a/addons/vector/script_component.hpp +++ b/addons/vector/script_component.hpp @@ -15,3 +15,31 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +#define IDC_CENTER 1301 +#define IDC_CROSSHAIR 1302 + +#define IDC_DIGIT_0 1310 +#define IDC_DIGIT_1 1311 +#define IDC_DIGIT_2 1312 +#define IDC_DIGIT_3 1313 +#define IDC_DIGIT_4 1314 +#define IDC_DIGIT_5 1315 +#define IDC_DIGIT_6 1316 +#define IDC_DIGIT_7 1317 +#define IDC_DIGIT_8 1318 +#define IDC_DIGIT_9 1319 + +#define IDC_DIGIT_E1 1321 +#define IDC_DIGIT_E2 1322 +#define IDC_DIGIT_E3 1323 +#define IDC_DIGIT_E4 1324 + +#define ILLUM_CONTROLS [\ + IDC_CENTER, IDC_CROSSHAIR,\ + IDC_DIGIT_0, IDC_DIGIT_1, IDC_DIGIT_2, IDC_DIGIT_3, IDC_DIGIT_4,\ + IDC_DIGIT_5, IDC_DIGIT_6, IDC_DIGIT_7, IDC_DIGIT_8, IDC_DIGIT_9,\ + IDC_DIGIT_E1, IDC_DIGIT_E2, IDC_DIGIT_E3, IDC_DIGIT_E4\ +] diff --git a/addons/vector/stringtable.xml b/addons/vector/stringtable.xml index 76feaa2b5cd..765722f5851 100644 --- a/addons/vector/stringtable.xml +++ b/addons/vector/stringtable.xml @@ -16,6 +16,7 @@ Vector 21 Nite Vector 21 Nite Vector 21 Nite + Vector 21 Nite Vector 21 @@ -29,9 +30,10 @@ Vector 21 Vector 21 ベクター 21 - Vector 21 + Vector 21 Vector 21 Vector 21 + Vector 21 Rangefinder @@ -48,12 +50,13 @@ 거리측정기 测距仪 測距儀 + Menzil Bulucu Vector - Azimuth Key Vector - Azimuth-Taste Vector - Tecla de acimut - Vector - Touche Azimuth + Vector - Touche azimuth Vector - Azymut Vector - Zobrazit azimut Vector - Tasto Azimuth @@ -64,12 +67,13 @@ Vector - 방위각 키 Vector - 方位按键 Vector - 方位按鍵 + Vector - Azimuth Tuşu Vector - Distance Key Vector - Entfernungs-Taste Vector - Tecla de distancia - Vector - Touche Distance + Vector - Touche distance Vector - Odległość Vector - Zobrazit vzdálenost Vector - Tasto Distanza @@ -80,6 +84,7 @@ Vector - 거리 키 Vector - 距离按键 Vector - 距離按鍵 + Vector - Mesafe Tuşu diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 738e4904543..78ea5133dd1 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -10,6 +10,11 @@ ACE 차량 잠금 ACE Fahrzeugsperre ACE Zamknięcie Pojazdu + ACE Блокировка транспорта + ACE Trancar Veículos + ACE Verrouillage véhicule + ACE Zamykání Vozidel + ACE Araç Kilidi Unlock Vehicle @@ -26,6 +31,7 @@ 차량 잠금열기 载具解锁 載具解鎖 + Araç Kilidini Aç Lock Vehicle @@ -42,12 +48,13 @@ 차량 잠그기 载具上锁 載具上鎖 + Aracı Kilitle Lockpick Vehicle Fahrzeug knacken Forzar vehículo - Crocheter le véhicule + Crocheter la serrure Otwórz zamek Vypáčit vozidlo Jármű feltörése @@ -58,12 +65,13 @@ 차량 문따기 解锁载具 解鎖載具 + Aracı Maymuncukla Picking Lock... Schloss knacken... Forzando cerradura... - Crochetage... + Crochetage de la serrure... Otwieranie zamka... Páčim vozidlo... Zár feltörése... @@ -74,12 +82,13 @@ 문따는중... 解锁中... 解鎖中... + Maymuncuklanıyor... A custom key that will open a specific vehicle. Ein Schlüssel der ein bestimmtes Fahrzeug aufschließt. Una llave concreta abrirá un vehículo concreto. - Une clé propre à un seul véhicule. + Une clé personnalisée qui ouvrira un véhicule spécifique. Unikatowy klucz, który otworzy konkretny pojazd. Vlastní klíč, který otevře konkrétní vozidlo. Egy egyedi kulcs, ami egy meghatározott járművet nyit ki. @@ -111,7 +120,7 @@ A lockpick set that can pick the locks of most vehicles. Ein Dietrich der die meisten Fahrzeugschlösser knacken kann. Un set de ganzúas que puede abrir las cerraduras de la mayoría vehículos. - Un crochet qui ouvrira la plupart des véhicules. + Un set de crochetage permettant de forcer la plupart des serrures de véhicules. Zestaw wytrychów, dzięki któremu można otworzyć zamki w większości pojazdów. Sada paklíčů, která dokáže odemknout zámky u většiny vozidel. Egy tolvajkulcs-készlet, mely a legtöbb jármű zárjait fel tudja törni. @@ -127,7 +136,7 @@ A key that should open most WEST vehicles. Ein Schlüssel der die meisten westlichen Fahrzeuge öffnen sollte. Una llave que abrirá la mayoría de vehículos occidentales. - Une clé qui ouvrira la plupart des véhicules OUEST. + Une clé qui devrait ouvrir la plupart des véhicules OUEST. Klucz, który powinien otworzyć większość pojazdów ZACHODU. Klíč který by měl otevřít většinou Západních vozidel. Egy kulcs, ami a NYUGAT egységeinek legtöbb járművét ki tudja nyitni. @@ -143,7 +152,7 @@ A key that should open most EAST vehicle. Ein Schlüssel der die meisten östlichen Fahrzeuge öffnen sollte. Una llave que abrirá la mayoría de vehículos orientales. - Une clé qui ouvrira la plupart des véhicules EST. + Une clé qui devrait ouvrir la plupart des véhicules EST. Klucz, który powinien otworzyć większość pojazdów WSCHODU. Egy kulcs, ami a KELET egységeinek legtöbb járművét ki tudja nyitni. Klíč který by měl otevřít vetšinu Východních vozidel. @@ -159,7 +168,7 @@ A key that should open most INDEP vehicle. Ein Schlüssel der die meisten Fahrzeuge der Aufständischen öffnen sollte. Una llave que abrirá la mayoría de vehículos independientes. - Une clé qui ouvrira la plupart des véhicules INDEP. + Une clé qui devrait ouvrir la plupart des véhicules INDEP. Klucz, który powinien otworzyć większość pojazdów INDFOR. Egy kulcs, ami a FÜGGETLEN egységek legtöbb járművét ki tudja nyitni. Klíč který by měl otevřít většinu Nezávislých vozidel. @@ -175,7 +184,7 @@ A key that should open most CIV vehicle. Ein Schlüssel der die meisten zivilen Fahrzeuge öffnen sollte. Una llave que abrirá la mayoría de vehículos civiles. - Une clé qui ouvrira la plupart des véhicules CIV. + Une clé qui devrait ouvrir la plupart des véhicules CIV. Klucz, który powinien otworzyć większość pojazdów CYWILNYCH. Klíč který by měl otevřít většinu Civilních vozidel. Egy kulcs, ami a CIVIL járművek többségét ki tudja nyitni. @@ -226,7 +235,7 @@ Sperrt das Inventar von gesperrten Fahrzeugen Zamknout inventář u zamčených vozidel Bloqueia o inventário de veículos fechados - Verrouille l'inventaire de véhicule fermés à clé + Verrouille l'inventaire des véhicules fermés à clé. Bezárja a zárt járművek rakterét is Закрывать инвентарь транспорта, если транспорт закрыт Blocca l'inventario di un veicolo bloccato @@ -242,7 +251,7 @@ Fahrzeuge spawnen gesperrt Počáteční stav zámku vozidla Estado inicial da fechadura dos veículos - Etat du verrouillage du véhicule au démarrage + État initial du verrouillage Jármű kezdő zár-állapot Начальное состояние замков Stato Iniziale del Blocco per Veicoli @@ -258,7 +267,7 @@ Setze Sperrstatus für alle Fahrzeuge (entfernt unklare Sperrzustände) Nastavit stav zámku u všech vozidel (odstraňuje nejednoznačné stavy zámků) Definir estados de fechadura para todos os veículos (remove estados de fechadura ambíguos) - Défini l'état de vérrouillage pour tous les véhicules (supprime les vérrouillage ambigue) + Définit l'état de verrouillage pour tous les véhicules (supprime les états de verrouillage ambigus). Beállítja a zár-állapotot az összes járműhöz (eltávolítja az azonosíthatatlan zárállapotokat) Устанавливает начальное состояние замков всех транспортных средств (устраняет неоднозначные состояния) Imposta lo stato di blocco per tutti i veicoli (rimuove stati di blocco ambigui) @@ -274,7 +283,7 @@ Unverändert Jak je Como está - Pas de changement + Tel quel Úgy-ahogy Как есть Com'è @@ -322,7 +331,7 @@ Standard-Pick-Stärke Výchozí síla páčidla Durabilidade padrão da chave micha - Force de crochetage par défaut + Difficulté par défaut du crochetage Alapértelmezett zártörő-erősség Сила отмычки по-умолчанию Durabilità Default del Grimaldello @@ -330,6 +339,7 @@ 기본 해정도구 설정 预设开锁能力 預設開鎖能力 + Varsayılan Maymuncuk Gücü Default Time to lockpick (in seconds). Default: 10 @@ -338,7 +348,7 @@ Standardzeit um ein Schloss zu knacken (in Sekunden). Standard: 10 Čas k vypáčení zámku (v sekundách). Výchozí: 10 Tempo padrão para forçar a fechadura (em segundos). Padrão: 10 - Temps par défaut pour le crochetage + Temps par défaut requis pour crocheter une serrure. Valeur par défaut : 10 secondes. Alapértelmezett idő a zárfeltöréshez (másodpercben). Alapértelmezett: 10 Время для взлома замка отмычкой (в секундах). По-умолчанию: 10 Tempo Default richiesto per forzare serrature (in secondi). Default: 10 @@ -354,7 +364,7 @@ Einstellungen für Pick-Stärke und anfänglichen Fahrzeugsperrzustand. Entfernt unklare Sperrzustände. Nastavení síly vypáčení a počáteční stav zámku vozidla. Odstraňuje nejednoznačné stavy zámků. Definições para a durabilidade da chave micha e estado inicial da fechadura do veículo. Remove estados de fechadura ambíguas - Paramètres pour le crochetage et état inital des véhicules. Supprime les états de verrouillage ambigue. + Réglage de la difficulté du crochetage et de l'état de verrouillage initial des véhicules. Supprime les états de verrouillage ambigus. Beállítások a zártörő erősségére és alapértelmezett zár-állapotra a járműveken. Eltávolítja az azonosíthatatlan zár-állapotokat. Настройки силы отмычек и начальное состояние замков транспорта. Устраняет неоднозначные состояния замков. Impostazioni per resistenza iniziale delle serrature e stato di blocco dei veicoli. Rimuove stati di blocco ambigui. @@ -380,13 +390,13 @@ 指定載具鑰匙 - Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start. + Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start. Zsynchronizuj z pojazdami i graczami. Rozda klucze dla graczy dla każdego zsynchronizowanego pojazdu. Działa tylko na pojazdy obecne na misji od samego początku (postawione w edytorze). Sincronizar con vehiculos y jugadores. Distribuirá llaves personalizadas a los jugadores para todos los vehículos sincronizados. Solo valido para objetos presentes al inicio de la mision. Synchronisiere mit Fahrzeugen und Spielern. Wird eigene Schlüssel an Spieler für jedes synchronisierte Fahrzeuge aushändigen. Nur gültig für am Missionsstart existierende Fahrzeuge. Synchronizuj s vozidly a hráči. Hráč dostane klíč ke každému synchonizovanému vozidlu. Platné pouze pro objekty přítomné na začátku mise. Sincronizar com veículos e jogadores. Irá distribuir chaves personalizadas para os jogadores para cada veículo sincronizado. Só é válido para objetos presentes no início da missão. - Synchronise avec les véhicules et les joueurs. Distribue les clés aux joueurs pour chaque véhicule synchronisé. Uniquement valide pour les objects présent au démarrage. + Synchroniser avec les véhicules et les joueurs. Remettra des clés personnalisées aux joueurs pour chaque véhicule synchronisé.\nValable uniquement pour les objets présents dès le début de la mission. Szinkronizál a járművekkel és játékosokkal. Egyedi kulcsokat oszt ki a játékosoknak minden szinkronizált járműhöz. Csak a küldetés indításakor jelenlévő járművekhez érvényes. Синхронизируйте с транспортом и игроком. Это выдаст игроку ключи от всех синхронизированных транспортных средств. Работает только для объектов, присутствующих на старте миссии Sincronizza con veicoli e giocatori. Distribuirà chiavi ai giocatori per ogni veicolo sincronizzato. Valido solo per oggetti presenti ad inizio missione. diff --git a/addons/vehicles/CfgActions.hpp b/addons/vehicles/CfgActions.hpp new file mode 100644 index 00000000000..a15b9e9a185 --- /dev/null +++ b/addons/vehicles/CfgActions.hpp @@ -0,0 +1,7 @@ +class CfgActions { + class None; + class Eject: None { + show = QUOTE(call compile getText (configFile >> 'CfgActions' >> 'Eject' >> 'GVAR(setting)')); + GVAR(setting) = QUOTE(profileNamespace getVariable [ARR_2('GVAR(showEjectAction)',0)]); + }; +}; diff --git a/addons/vehicles/XEH_postInit.sqf b/addons/vehicles/XEH_postInit.sqf index 3afea03187b..757e7a921a7 100644 --- a/addons/vehicles/XEH_postInit.sqf +++ b/addons/vehicles/XEH_postInit.sqf @@ -33,7 +33,7 @@ GVAR(isSpeedLimiter) = false; ["ACE3 Vehicles", QGVAR(scrollUp), localize LSTRING(IncreaseSpeedLimit), { if (GVAR(isSpeedLimiter)) then { - GVAR(speedLimit) = round (GVAR(speedLimit) + 1) max 5; + GVAR(speedLimit) = round (GVAR(speedLimit) + GVAR(speedLimiterStep)) max (5 max GVAR(speedLimiterStep)); [["%1: %2", LSTRING(SpeedLimit), GVAR(speedLimit)]] call EFUNC(common,displayTextStructured); true }; @@ -41,7 +41,7 @@ GVAR(isSpeedLimiter) = false; ["ACE3 Vehicles", QGVAR(scrollDown), localize LSTRING(DecreaseSpeedLimit), { if (GVAR(isSpeedLimiter)) then { - GVAR(speedLimit) = round (GVAR(speedLimit) - 1) max 5; + GVAR(speedLimit) = round (GVAR(speedLimit) - GVAR(speedLimiterStep)) max (5 max GVAR(speedLimiterStep)); [["%1: %2", LSTRING(SpeedLimit), GVAR(speedLimit)]] call EFUNC(common,displayTextStructured); true }; diff --git a/addons/vehicles/XEH_preInit.sqf b/addons/vehicles/XEH_preInit.sqf index b47cf6628db..028a8aec1c3 100644 --- a/addons/vehicles/XEH_preInit.sqf +++ b/addons/vehicles/XEH_preInit.sqf @@ -6,4 +6,37 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + +[ + "AllVehicles", + "initPost", + { + params ["_vehicle"]; + _vehicle setVariable [QGVAR(engineState), isEngineOn _vehicle]; + } +] call CBA_fnc_addClassEventHandler; +[ + "AllVehicles", + "engine", + { + params ["_vehicle", "_state"]; + _vehicle setVariable [QGVAR(engineState), _state]; + } +] call CBA_fnc_addClassEventHandler; +[ + "AllVehicles", + "getout", + { + params ["_vehicle", "_position", "_unit"]; + if (!GVAR(keepEngineRunning)) exitWith {}; + if (_unit == ACE_player && {_position == "driver" && {_vehicle getVariable [QGVAR(engineState), false]}}) then { + [{ + params ["_vehicle"]; + [QEGVAR(common,engineOn), _this, _vehicle] call CBA_fnc_targetEvent; + }, [_vehicle, true]] call CBA_fnc_execNextFrame; + }; + } +] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/vehicles/config.cpp b/addons/vehicles/config.cpp index 9b0d595fc84..9ec0d73aef7 100644 --- a/addons/vehicles/config.cpp +++ b/addons/vehicles/config.cpp @@ -21,3 +21,4 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgActions.hpp" diff --git a/addons/vehicles/functions/fnc_startEngine.sqf b/addons/vehicles/functions/fnc_startEngine.sqf index 507036b0cb9..4277f518e18 100644 --- a/addons/vehicles/functions/fnc_startEngine.sqf +++ b/addons/vehicles/functions/fnc_startEngine.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [vehicle player, false] call ace_vehicle_fnc_startEngine + * [vehicle player, false] call ace_vehicles_fnc_startEngine * * Public: No */ diff --git a/addons/vehicles/initSettings.sqf b/addons/vehicles/initSettings.sqf new file mode 100644 index 00000000000..500cd8d852e --- /dev/null +++ b/addons/vehicles/initSettings.sqf @@ -0,0 +1,29 @@ +[ + QGVAR(keepEngineRunning), + "CHECKBOX", + [LSTRING(SettingKeepEngineRunningName), LSTRING(SettingKeepEngineRunningDesc)], + ELSTRING(common,ACEKeybindCategoryVehicles), + false, // default value + true // isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(hideEjectAction), + "CHECKBOX", + [LSTRING(HideEjectAction), LSTRING(HideEjectActionTooltip)], + ELSTRING(common,ACEKeybindCategoryVehicles), + true, + 2, { + profileNamespace setVariable [QGVAR(showEjectAction), parseNumber !_this]; + saveProfileNamespace; + }, + true // needs restart +] call CBA_fnc_addSetting; + +[ + QGVAR(speedLimiterStep), + "SLIDER", + LSTRING(SpeedLimiterStep), + ELSTRING(common,ACEKeybindCategoryVehicles), + [1, 10, 5, 0] +] call CBA_fnc_addSetting; diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index b2d282b3055..18716d48876 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -3,11 +3,11 @@ Speed Limiter on - Begrenzer an + Geschwindigkeitsbegrenzer an Limitador de velocidad activado Ogranicznik prędkości włączony Omezovač rychlosti zapnut - Limiteur de vitesse Activé + Limiteur de vitesse activé Ограничение скорости включено Sebességkorlátozó bekapcsolva Limitador de Velocidade Ativo @@ -16,14 +16,15 @@ 속도 제한기 켜짐 启用速度限制 啟用速度限制 + Hız Sabitleyeciı Açık Speed Limiter off - Begrenzer aus + Geschwindigkeitsbegrenzer aus Limitador de velocidad desactivado Ogranicznik prędkości wyłączony Omezovač rychlosti vypnut - Limiteur de vitesse Désactivé + Limiteur de vitesse désactivé Ограничение скорости выключено Sebességkorlátozó kikapcsolva Limitador de Velocidade Desativado @@ -32,21 +33,30 @@ 속도 제한기 꺼짐 停用速度限制 停用速度限制 + Hız Sabitleyeci Kapalı Speed Limit + Geschwindigkeitsbegrenzung Limite di velocità 速度制限 Ograniczenie prędkości + Ограничение скорости + Limite de Velocidade + Límite de velocidad + Rychlostní omezení + 速限 + Vitesse limite + Hız Limiti Speed Limiter - Begrenzer + Geschwindigkeitsbegrenzer Limitador de velocidad Ogranicznik prędkości Omezovač rychlosti Limiteur de vitesse - Ограничение скорости + Ограничитель скорости Sebességkorlátozó Limitador de Velocidade Limitatore di Velocità @@ -54,18 +64,98 @@ 속도 제한기 速度限制器 速度限制器 + Hız Sabitleyici Increase Speed Limit + Maximale Geschwindigkeit erhöhen Aumenta limite di velocità 速度制限を増やす Zwiększ ograniczenie prędkości + Увеличить ограничение скорости + Aumentar Limite de Velocidade + Aumentar límite de velocidad + Zvyš rychlostní limit + 增加速限 + Augmenter la vitesse limite + Hız Limitini Arttır Decrease Speed Limit + Maximale Geschwindigkeit verringern Diminuisce limite di velocità 速度制限を減らす Zmniejsz ograniczenie prędkości + Уменьшить ограничение скорости + Diminuir Limite de Velocidade + Disminuir límite de velocidad + Sniž rychlostní limit + 降低速限 + Diminuer la vitesse limite + Hız Limitini Azalt + + + Disable automatic engine shut-off + Motor nach Verlassen laufen lassen + エンジン自動停止を無効化 + Убрать автовыключение двигателя + Desativar desligamento automático do motor + Desactivar apagado automático del motor + Vypni automatické vypnutí motoru + 關閉引擎自動熄火 + Désactiver l'arrêt automatique du moteur + Wyłącz automatyczne wyłączanie silnika + Disattivare lo spegnimento automatico del motore + Otomatik motor durdurmayı devre dışı bırak + + + Prevent the automatic shut-off of the engine when exiting vehicles. + Verhindere das automatische Abschalten des Motors beim Verlassen des Fahrzeugs. + 車両から降りた時のエンジンの自動停止を防ぎます。 + Запрещает автоматическое выключение двигателя при выходе из транспорта + Previne que o motor do veículo seja desligado automaticamente quando o motorista sair. + Desactivar el apagado automático del motor al salir de los vehículos. + Zabraň automatickému vypnutí motoru při opuštění vozidla. + 避免離開載具時自動熄火。 + Impedire lo spegnimento automatico del motore quando si esce dai veicoli. + Empêche l'arrêt automatique du moteur à la sortie des véhicules. + Araçtan inerken motorun otomatik kapatılmasını engelleyin. + Zapobiegaj automatycznemu wyłączaniu silnika podczas wychodzenia z pojazdu. + + + Hide Eject Action + Abspringen-Aktion verstecken + Ukryj akcję Wyskocz + Убрать действие 'Выпрыгнуть' + 脱出アクションを非表示 + Ocultar opção de Ejetar + Ocultar acción de expulsión + 隱藏逃脫動作 + Masquer l'action d'éjection + Nascondi azione di espulsione + Schovat vyskočení z vozidla + + + Hides the Eject entry from the action menu. Requires a game restart. + Versteckt den Abspringen-Eintrag aus dem Aktionsmenü. Benötigt Neustart des Spiels. + Usuwa akcję Wyskocz z menu akcji. Wymaga restartu gry. + Убирает действие 'Выпрыгнуть' из меню. (Требует перезагрузки) + アクション メニューから脱出アクションを消します。ゲームの再起動が必要です。 + Oculta a opção de interação para ejetar. Requer que o jogo seja reiniciado. + Oculta la entrada Expulsar del menú de acciones. Requiere un reinicio del juego. + 隱藏在動作選單中逃脫動作的選項。要求遊戲重新啟動。 + Masque l'entrée "Éjection" du menu Action. Nécessite un redémarrage du jeu. + Nasconde la voce Espelli dal menu azione. Richiede il riavvio del gioco. + Schová akci vyskošení z vozidla z akčního menu. Vyžaduje restart hry. + + + Speed Limiter Step + Schrittgröße des Geschwindigkeitsbegrenzers + Przeskok limitera prędkości + Pas du limiteur de vitesse + 設定速度の増減量 + Krokování omezovače rychlosti + Шаг ограничителя скорости diff --git a/addons/viewdistance/functions/fnc_changeViewDistance.sqf b/addons/viewdistance/functions/fnc_changeViewDistance.sqf index 40d07cf100e..cb8a07db2d0 100644 --- a/addons/viewdistance/functions/fnc_changeViewDistance.sqf +++ b/addons/viewdistance/functions/fnc_changeViewDistance.sqf @@ -29,9 +29,11 @@ if (_objectViewDistanceCoeff isEqualType 0) then { if (_objectViewDistanceCoeff > 0) then { setObjectViewDistance (_objectViewDistanceCoeff * viewDistance); } else { - // Restore correct view distance when changing from FoV Based to Off - // Restoring directly inside PFH's self-exit resulted in the need of selecting another option to take effect - setObjectViewDistance GVAR(fovBasedPFHminimalViewDistance); + if (!isNil QGVAR(fovBasedPFHminimalViewDistance)) then { + // Restore correct view distance when changing from FoV Based to Off + // Restoring directly inside PFH's self-exit resulted in the need of selecting another option to take effect + setObjectViewDistance GVAR(fovBasedPFHminimalViewDistance); + }; }; } else { if (isNil QGVAR(fovBasedPFHminimalViewDistance)) then { diff --git a/addons/viewdistance/functions/fnc_returnValue.sqf b/addons/viewdistance/functions/fnc_returnValue.sqf index 480a9ce7aea..b1727dddee6 100644 --- a/addons/viewdistance/functions/fnc_returnValue.sqf +++ b/addons/viewdistance/functions/fnc_returnValue.sqf @@ -10,7 +10,7 @@ * View Distance * * Example: - * [2] call ace_viewdistance_fnc_returnViewDistanceValue + * [2] call ace_viewdistance_fnc_returnValue * * Public: No */ diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index 5c2d2ec2874..664a9df6688 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -8,7 +8,7 @@ Omezovač dohlednosti Sichtweitenbegrenzung Limitador de distância de visão - Limiteur de distance de vue + Limiteur de visibilité Látótáv-korlátozó Ограничитель дальности видимости Limitatore Distanza Visiva @@ -16,6 +16,7 @@ 시야 제한기 视野距离限制器 視野距離限制器 + Görüş Uzaklığı Sınırlayıcısı Allows limiting maximum view distance that can be set by players. @@ -24,7 +25,7 @@ Umožňuje určit maximální dohlednost, kterou si může hráč nastavit Erlaubt das Einschränken der maximalen Sichtweite, welche von Spielern eingestellt werden kann. Permite limitar a distância máxima de visão que pode ser definida pelos jogadores. - Permet de limiter la distance de vue que les joueurs peuvent choisir + Permet de restreindre la distance maximale de visibilité pouvant être définie par les joueurs. Lehetővé teszi a játékosok által a látótávolság maximumának korlátozását. Позволяет ограничить максимальную дальность видимости, которая может быть установлена игроками. Consente di limitare la distanza visiva massima che può essere impostata dai giocatori. @@ -40,7 +41,7 @@ Povolit ACE dohlednost Aktiviere ACE-Sichtweite Habilitar distância de visão ACE - Activer la distance de vue ACE + Activer la visibilité ACE ACE látótávolság engedélyezése Ограничить дальность видимости Abilita distanza visiva ACE @@ -48,6 +49,7 @@ ACE 시야 활성화 启用ACE视距 啟用ACE視距 + ACE Görüş Uzaklığını Aktif Et Enables ACE viewdistance @@ -56,7 +58,7 @@ Povolit ACE dohlednost Aktiviert ACE-Sichtweite Habilita a distância de visão ACE - Activer la distance de vue ACE + Active la visibilité ACE. Engedélyezi az ACE látótávolságot Включает ограничитель дальности видимости ACE Abilita distanza visiva ACE @@ -64,6 +66,7 @@ ACE 시야 활성화 启用ACE视距 啟用ACE視距 + ACE Görüş Uzaklığını Aktif Et View Distance Limit @@ -72,7 +75,7 @@ Limit dohlednosti Sichtweitengrenze Limite da distância de visão - Limite de distance de vue + Limite de visibilité Látótáv-korlát Дальность видимости Limite Distanza Visiva @@ -80,6 +83,7 @@ 시야 제한기 视野距离限制 視野距離限制 + Görüş Uzaklığı Limiti Sets the limit for how high clients can raise their view distance (up to 10000) @@ -88,7 +92,7 @@ Stanoví limit jak daleko si může client zvýšit dohlednost (do 10000) Setze die Grenze fest, wie weit Spieler ihre Sichtweite erhöhen können (bis 10000) Estabelecer um limite de quão alto os clientes podem aumentar sua distância de visão (até 10000) - Défini pour les clients la limite de distance de vue maximale (jusqu'à 10000) + Définit la limite maximale à laquelle les clients peuvent augmenter leur distance de visibilité (jusqu'à 10000). Korlátozza, mekkora látótávolságot állíthatnak be a kliensek (maximum 10000-ig) Устанавливает предел дальности, насколько клиенты могут увеличить свою дальность видимости (до 10000) Imposta il limite massimo a cui i client possono alzare la propria distanza visiva (massimo 10000) @@ -96,6 +100,7 @@ 클라이언트가 최대 얼마나 멀리 볼 수 있는지 제한을 둡니다 (10000 까지 가능) 设定客户端最高可显示的视野距离 (最高至10000) 設定客戶端最高可顯示的視野距離 (最高至10000) + Kişilerin görüş mesafelerini ne kadar yükseltebileceğine ilişkin sınırı belirler (En Fazla 10000) Limit for client's view distance set here and can overridden by module @@ -104,7 +109,7 @@ Limit dohlednoti pro klienty se nastavuje zde a může být potlačeno pomocí modulu. Stellt die Grenze für die Sichtweite des Spielers ein. Das kann von einem Modul überschrieben werden. Permite limitar a distância de visão máxima que pode ser definida por jogadores. Pode ser substituído por módulo. - Limite de la distance de vue pour les clients et peut être forcé par ce module + La limite de portée visuelle du joueur est définie ici, pouvant être écrasée par un autre module. A kliens látótávolsága itt állítható be, és felülbírálható modulok által Предел дальности видимости клиентов устанавливается здесь и может быть переопределен модулем Limite per la distanza visiva del client impostato qui e può essere scavalcato dal modulo @@ -120,7 +125,7 @@ Dohlednost (Pěšák) Spielersichtweite (zu Fuß) Distância de visão do cliente (A pé) - Distance de vue (à pied) + Visibilité (à pied) Kliens látótáv (gyalog) Дальность видимости (Пешком) Distanza Visiva Client (a Piedi) @@ -128,6 +133,7 @@ 클라이언트 시야 (보병) 客户端视野距离 (步行) 客戶端視野距離 (步行) + Kişilerin Görüş Uzaklığı Mesafesi (Yerde) Changes in game view distance when the player is on foot. @@ -136,7 +142,7 @@ Změna dohlednosti pro hráče pokud jde po svých. Verändert die Sichtweite, wenn ein Spieler zu Fuß unterwegs ist. Muda a distância de visão do jogador dentro do jogo quando ele está a pé. - Change la distance de vue quand le joueur est à pied + Change la distance d'affichage du jeu quand le joueur est à pied. Megváltoztatja a játékon belüli látótávolságot, amennyiben a játékos gyalogosan van. Изменяет дальность видимости в игре, когда игрок перемещается пешком. Cambia la distanza visiva in gioco quando il giocatore è a piedi. @@ -144,6 +150,7 @@ 플레이어가 보병일 경우의 시야를 바꿀 수 있습니다. 改变玩家步行时的视野距离. 改變玩家步行時的視野距離. + Oyuncular ayakta iken görebileceği uzaklığı değiştir. Client View Distance (Land Vehicle) @@ -152,7 +159,7 @@ Dohlednost (Pozemní technika) Spielersichtweite (Landfahrzeuge) Distância de visão do cliente (Veículo terrestre) - Distance de vue (à pied) + Visibilité (véhicule terrestre) Kliens látótáv (szárazföldi jármű) Дальность видимости (В наземном трансп.) Distanza Visiva Client (Veicolo Terrestre) @@ -160,6 +167,7 @@ 클라이언트 시야 (차량) 客户端视野距离 (地面载具) 客戶端視野距離 (地面載具) + Kişilerin Görüş Uzaklığı Mesafesi (Kara Araçların da) Changes in game view distance when the player is in a land vehicle. @@ -168,7 +176,7 @@ Změna dohlednosti pro hráče pokud je v pozemní technice. Verändert die Sichtweite, wenn ein Spieler in einem Landfahrzeug ist. Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo terrestre. - Change la distance de vue quand le joueur est dans un véhicule + Change la distance d'affichage du jeu quand le joueur se trouve dans un véhicule terrestre. Megváltoztatja a játékon belüli látótávolságot, amennyiben a játékos szárazföldi járműben van. Изменяет дальность видимости в игре, когда игрок перемещается в наземном транспорте. Cambia la distanza visiva in gioco quando il giocatore è in un veicolo terrestre. @@ -176,6 +184,7 @@ 플레이어가 차량 내부일 경우의 시야를 바꿀 수 있습니다. 改变玩家于地面载具内时的视野距离 改變玩家於地面載具內時的視野距離 + Oyuncular kara araçlarında iken görebileceği uzaklığı değiştir. Client View Distance (Air Vehicle) @@ -184,7 +193,7 @@ Dohlednost (Vzdušná technika) Spielersichtweite (Luftfahrzeuge) Distância de visão do cliente (Veículo aéreo) - Distance de vue (véhicule aérien) + Visibilité (véhicule aérien) Kliens látótáv (légi jármű) Дальность видимости (В воздушном трансп.) Distanza Visiva Client (Veicoli d'Aria) @@ -192,6 +201,7 @@ 클라이언트 시야 (항공기) 客户端视野距离 (空中载具) 客戶端視野距離 (空中載具) + Kişilerin Görüş Uzaklığı Mesafesi (Hava Araçların da) Changes in game view distance when the player is in an air vehicle. @@ -200,7 +210,7 @@ Změna dohlednosti pro hráče pokud je ve vzdušné technice. Verändert die Sichtweite wenn ein Spieler in einem Luftfahrzeug ist. Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo aéreo. - Change la distance de vue quand le joueur est dans un véhicule aérien + Change la distance d'affichage du jeu quand le joueur se trouve dans un véhicule aérien. Megváltoztatja a játékon belüli látótávolságot, amennyiben a játékos légi járműben van. Изменяет дальность видимости в игре, когда игрок перемещается в воздушном транспорте. Cambia la distanza visiva in gioco quando il giocatore è in un mezzo aereo. @@ -208,6 +218,7 @@ 플레이어가 항공기 내부일 경우의 시야를 바꿀 수 있습니다. 改变玩家于空中载具内时的视野距离 改變玩家於空中載具內時的視野距離 + Oyuncular hava araçların da iken görebileceği uzaklığı değiştir. Dynamic Object View Distance @@ -216,7 +227,7 @@ Dynamická dohlednost objektů Dynamische Objektsichtweite Distância de visão dinâmica dos objetos - Distance de vue pour les objet dynamique + Distance d'affichage dynamique des objets Dinamikus objektum-látótáv Динамич. дальность отрисовки объектов Distanza Visiva Oggetti Dinamica @@ -232,7 +243,7 @@ Nastaví objekt dohlednosti jako koeficient dohlednosti. Passt die Objektsichtweite dynamisch der Sichtweite an. Estabelece a distância de visão dos objetos com um coeficiente da distância de visão. - Défini la distance d'affichage des objets comme un coefficient de la distance de vue + Définit la distance d'affichage des objets en fonction de la distance de visibilité, ou selon le champ de vision (FoV).\nLorsque l'affichage basé sur le FoV est choisi, les valeurs minimales et maximales varient en fonction de l'angle de vue. Beállítja az objektum-látótávot a megadott látótáv koefficienseként. Устанавливает дальность отрисовки объектов как коэффициент от общей дальности видимости. Imposta la distanza visiva degli oggetti come un coefficiente basato sulla distanza visiva oppure basato sul campo visivo. @@ -248,7 +259,7 @@ Vypnout Aus Desligado - Eteint + Désactivée Kikapcsolva Выкл. Disabilitato @@ -256,6 +267,7 @@ 끄기 关闭 關閉 + Kapalı Very Low @@ -264,7 +276,7 @@ Velmi málo Sehr niedrig Muito baixo - Très bas + Très basse Minimális Очень низкая Molto Basso @@ -272,6 +284,7 @@ 매우 낮음 非常低 非常低 + Çok Düşük Low @@ -280,7 +293,7 @@ Málo Niedrig Baixo - Bas + Basse Alacsony Низкая Basso @@ -288,6 +301,7 @@ 낮음 + Düşük Medium @@ -296,7 +310,7 @@ Středně Mittel Médio - Moyen + Moyenne Közepes Средняя Medio @@ -304,6 +318,7 @@ 중간 + Orta High @@ -312,7 +327,7 @@ Hodně Hoch Alto - Haut + Haute Magas Высокая Alto @@ -320,6 +335,7 @@ 높음 + Yüksek Very High @@ -328,7 +344,7 @@ Velmi hodně Sehr hoch Muito alto - Très haut + Très haute Maximális Очень высокая Molto Alto @@ -336,6 +352,7 @@ 매우 높음 非常高 非常高 + Çok Yüksek FoV Based @@ -346,7 +363,7 @@ Oparty na FoV Basato su Campo Visivo (FoV) Basada en campo de visión - Champ de vision basé + Basée sur le champ de vision 視野角を元にする 시계(FoV) 由视野角度决定 @@ -359,7 +376,7 @@ Dohlednost: Sichtweite: Distância de visão: - Distance de vue + Distance de vue : Látótávolság: Дальность видимости: Distanza Visiva: @@ -367,6 +384,7 @@ 시야: 视野距离: 視野距離: + Görüş Uzaklığı: Object View Distance is @@ -375,7 +393,7 @@ Dohlednost objektů je Objektsichtweite ist Distância de visão do objeto é - La distance d'affichage des objets est: + La distance d'affichage des objets est de Az objektum-látótávolság: Дальность видимости объектов: Distanza Visiva Oggetti è @@ -391,7 +409,7 @@ Tato volba je neplatná! Limit je Diese Option ist ungültig! Die Grenze ist Essa opção é inválida. O limte é - Cette option est non valide! La limite est + Cette option est non valide ! La limite est de Ez a beállítás érvénytelen! A maximum mennyiség Настройка не верна! Текущий предел Questa opzione è invalida! Il limite è @@ -399,6 +417,7 @@ 이 옵션은 불가능합니다! 제한은 该选项是无效的! 限制是 該選項是無效的! 限制是 + Bu seçenek geçersiz! Limit Video Settings @@ -415,6 +434,7 @@ 영상 설정 影像设定 影像設定 + Grafik Ayarları diff --git a/addons/weaponselect/functions/fnc_putWeaponAway.sqf b/addons/weaponselect/functions/fnc_putWeaponAway.sqf index e74a9c4c6b2..0622d62ae04 100644 --- a/addons/weaponselect/functions/fnc_putWeaponAway.sqf +++ b/addons/weaponselect/functions/fnc_putWeaponAway.sqf @@ -17,6 +17,4 @@ params ["_unit"]; -_unit call EFUNC(common,fixLoweredRifleAnimation); - _unit action ["SwitchWeapon", _unit, _unit, 299]; diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 5148114b0f0..185cfdc948e 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -8,7 +8,7 @@ Показывать текст при броске Zobrazí text při hodu granátem Wyświetl tekst przy rzucie granatem - Afficher texte lors d'un lancé de grenade + Afficher du texte lors d'un lancé de grenade Szöveg mutatása gránát eldobásakor Mostra indicazioni nel lancio granate Mostrat texto ao lançar granada @@ -24,7 +24,7 @@ Показывать текст или подсказку при броске гранаты. Zobrazí upozornění nebo text při hodu granátem. Wyświetla powiadomienie lub tekst przy rzucie granatem. - Afficher texte/info au lancé de grenade + Affiche un texte ou une notification lors d'un lancé de grenade. Jelez egy súgót vagy szöveget a gránát eldobásakor. Mostra una notifica quando si lanciano granate Mostra um hint ou texto ao lançar uma granada @@ -40,7 +40,7 @@ Wybierz pistolet Zvolit Pistoly Выбрать пистолет - Sélectionner Pistolet + Sélectionner le pistolet Pisztoly Kiválasztása Selecionar Pistola Seleziona la Pistola @@ -48,6 +48,7 @@ 권총 선택 选择手枪 選擇手槍 + Tabancayı Seç Select Rifle @@ -56,7 +57,7 @@ Wybierz karabin Zvolit Pušku Выбрать винтовку - Sélectionner Fusil + Sélectionner le fusil Puska Kiválasztása Selecionar Rifle Seleziona il fucile @@ -64,6 +65,7 @@ 소총 선택 选择步枪 選擇步槍 + Tüfeği Seç Select Launcher @@ -72,7 +74,7 @@ Wybierz wyrzutnię Zvolit Raketomet Выбрать гранатомёт - Sélectionner Lanceur + Sélectionner le lanceur Rakétavető Kiválasztása Selecionar Lançador Seleziona il lanciamissili @@ -80,6 +82,7 @@ 발사기 선택 选择发射器 選擇發射器 + Fırlatılabiliri Seç Select Grenade Launcher @@ -88,7 +91,7 @@ Wybierz granatnik Zvolit Granátomet Выбрать подствольный гранатомёт - Sélectionner Lance-grenades + Sélectionner le lance-grenades Gránátvető Kiválasztása Selecionar Lança-Granadas Seleziona il lanciagranate @@ -96,6 +99,7 @@ 유탄발사기 선택 选择榴弹发射器 選擇榴彈發射器 + Bombaatarı Seç Select Binoculars @@ -104,7 +108,7 @@ Wybierz lornetkę Zvolit Dalekohled Выбрать бинокль - Sélectionner Jumelles + Sélectionner les jumelles Távcső Kiválasztása Selecionar Binóculos Seleziona il Binocolo @@ -112,6 +116,7 @@ 망원경 선택 选择望远镜 選擇望遠鏡 + Dürbünü Seç Holster Weapon @@ -128,13 +133,14 @@ 무기 집어넣기 武器套 武器套 + Silahını Kılıfına Koy Engine on Motor an Encender motor Włącz silnik - Moteur allumé + Démarrer le moteur Motor indítása Zapnout motor Ligar Motor @@ -144,13 +150,14 @@ 엔진 켜기 引擎发动 引擎發動 + Motor Açık Engine off Motor aus Apagar motor Wyłącz silnik - Moteur éteint + Couper le moteur Motor leállítása Vypnout motor Desligar Motor @@ -160,13 +167,14 @@ 엔진 끄기 引擎熄火 引擎熄火 + Motor Kapalı Select Main Gun Hauptgeschütz auswählen Seleccionar arma principal Wybierz główną broń - Sélectionner l'Arme Principale + Sélectionner l'arme principale Elsődleges Fegyver Kiválasztása Zvolit Hlavní Zbraň Selecionar Arma Principal @@ -176,13 +184,14 @@ 주포 선택 选择主武器 選擇主武器 + Ana Silahı Seç Select Machine Gun Maschinengewehr auswählen Seleccionar ametralladora Wybierz karabin maszynowy - Sélectionner Mitrailleuse + Sélectionner la mitrailleuse Géppuska Kiválasztása Zvolit Kulomet Selecionar Metralhadora @@ -192,13 +201,14 @@ 기관총 선택 选择机枪 選擇機槍 + Makineli Silahı Seç Select Missiles Raketen auswählen Seleccionar misiles Wybierz rakiety - Sélectionner Missiles + Sélectionner les missiles Rakéták Kiválasztása Zvolit Rakety Selecionar Mísseis @@ -208,6 +218,7 @@ 미사일 선택 选择导弹 選擇導彈 + Füzeleri Seç Grenade %1 @@ -224,6 +235,7 @@ %1 수류탄 手榴弹 %1 手榴彈 %1 + El Bombası %1 Ready Grenade @@ -240,13 +252,14 @@ 투척물 준비 准备手榴弹 準備手榴彈 + El Bombası Hazır Select Frag Grenade Explosive Granate auswählen Seleccionar granada de fragmenación Wybierz granat odłamkowy - Sélectionner grenade à fragmentation + Sélectionner les grenades à fragmentation Repeszgránát Kiválasztása Zvolit výbušný granát Selecionar Granada de Fragmentação @@ -256,13 +269,14 @@ 살상 투척물 선택 选择破片手榴弹 選擇破片手榴彈 + El Bombasını Seç Select Non-Frag Grenade Nichtexplosive Granate auswählen Seleccionar granada de no fragmentación Wybierz granat nieodłamkowy - Sélectionner grenade non-léthale + Sélectionner les grenades non létales Nem-robbanó Gránát Kiválasztása Zvolit ne-výbušný granát Selecionar Granada @@ -272,6 +286,7 @@ 비살상 투척물 선택 选择非破片手榴弹 選擇非破片手榴彈 + El Bombası Dışındakileri Seç Throw Selected Grenade @@ -288,12 +303,13 @@ 선택된 투척물 투척 投掷选择的手榴弹 投擲選擇的手榴彈 + Seçilen Bombayı Fırlat No grenades left Keine Granaten übrig No quedan granadas - Plus de grenades + Il n'y a plus de grenades. Brak granatów Žádné granáty Nincs több gránát @@ -304,13 +320,14 @@ 투척물 없음 已无手榴弹 已無手榴彈 + El Bombası Kalmadı No frags left Keine explosiven Granaten übrig No quedan granadas de fragmentación Brak granatów odłamkowych - Plus de grenades à fragmentation + Il n'y a plus de grenades à fragmentation. Nincs több repeszgránát Žádné výbušné granáty Não há granadas de fragmentação restantes @@ -326,7 +343,7 @@ Keine nichtexplosiven Granaten übrig Sin granadas misc. Brak granatów nieodłamkowych - Plus de grenades non-léthales + Il n'y a plus de grenades non létales. Nincs több egyéb gránát Už nejsou žádné ostatní granáty Não há outras granadas restantes @@ -342,7 +359,7 @@ Keine Granate ausgewählt Granada no seleccionada Nie wybrano żadnego granatu - Aucune grenade sélectionnée + Aucune grenade sélectionnée. Nincs semmilyen gránát kiválasztva Není zvolen žádný granát Nenhuma granada selecionada @@ -352,13 +369,14 @@ 선택된 수류탄 없음 未选择手榴弹 未選擇手榴彈 + Bomba Seçilmedi Fire Smoke Launcher Rauchwand abfeuern Disparar lanzador de humo Kouřový odpalovač - Tirer le lance-pots fumigènes + Lancer les pots fumigènes Wystrzel granat dymny Füstvető eltüzelése Пустить дымовую завесу @@ -368,15 +386,23 @@ 연막발사기 박사 发射烟雾发射器 發射煙霧發射器 + Ateşli Sis Fırlatıcısı Toggle Collision Lights + Kollisionslichter an/ausschalten Attiva Luci di Collisione 충돌 표시등 토글 切換碰撞燈 切换碰撞灯 衝突防止灯を切り替え Przełącz światła kolizyjne + Вкл/Выкл Бортовые огни + Alternar Luzes de Colisão + Alternar luces de colisión + Přepnout kolizní světla + Allumer les feux anti-collision + Çarpışma Işıklarını Aç/Kapat diff --git a/addons/weather/ACE_Settings.hpp b/addons/weather/ACE_Settings.hpp index e2eb4590b75..2028beac3ec 100644 --- a/addons/weather/ACE_Settings.hpp +++ b/addons/weather/ACE_Settings.hpp @@ -1,24 +1,11 @@ class ACE_Settings { class GVAR(enabled) { - category = CSTRING(Module_DisplayName); - displayName = CSTRING(enabled_DisplayName); - description = CSTRING(enabled_Description); - typeName = "BOOL"; - value = 1; + movedToSQF = 1; }; class GVAR(updateInterval) { - category = CSTRING(Module_DisplayName); - displayName = CSTRING(updateInterval_DisplayName); - description = CSTRING(updateInterval_Description); - typeName = "SCALAR"; - value = 60; - sliderSettings[] = {0, 300, 0, 0}; + movedToSQF = 1; }; class GVAR(windSimulation) { - category = CSTRING(Module_DisplayName); - displayName = CSTRING(windSimulation_DisplayName); - description = CSTRING(windSimulation_Description); - typeName = "BOOL"; - value = 1; + movedToSQF = 1; }; }; diff --git a/addons/weather/CfgVehicles.hpp b/addons/weather/CfgVehicles.hpp index cab16183a8b..151b756c497 100644 --- a/addons/weather/CfgVehicles.hpp +++ b/addons/weather/CfgVehicles.hpp @@ -1,4 +1,17 @@ class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_CheckAirTemperature { + displayName = CSTRING(CheckAirTemperature); + condition = QUOTE(GVAR(enabled) && GVAR(showCheckAirTemperature)); + exceptions[] = {"isNotInside", "isNotSitting"}; + statement = QUOTE([ACE_player] call FUNC(getApproximateAirTemp)); + icon = QPATHTOF(UI\temp_ca.paa); + }; + }; + }; + class ACE_Module; class GVAR(ModuleSettings): ACE_Module { scope = 1; diff --git a/addons/weather/UI/temp_ca.paa b/addons/weather/UI/temp_ca.paa new file mode 100644 index 00000000000..3bbc441e266 Binary files /dev/null and b/addons/weather/UI/temp_ca.paa differ diff --git a/addons/weather/XEH_PREP.hpp b/addons/weather/XEH_PREP.hpp index 48788c0546c..5f17905849b 100644 --- a/addons/weather/XEH_PREP.hpp +++ b/addons/weather/XEH_PREP.hpp @@ -10,7 +10,9 @@ PREP(calculateTemperatureAtHeight); PREP(calculateWetBulb); PREP(calculateWindChill); PREP(calculateWindSpeed); +PREP(displayAirTemp); PREP(displayWindInfo); +PREP(getApproximateAirTemp); PREP(getMapData); PREP(initModuleSettings); PREP(initWind); diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index 1b551f133ef..438c3e99629 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -7,6 +7,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + // Make sure this data is read before client/server postInit call FUNC(getMapData); diff --git a/addons/weather/functions/fnc_displayAirTemp.sqf b/addons/weather/functions/fnc_displayAirTemp.sqf new file mode 100644 index 00000000000..e32d60a159c --- /dev/null +++ b/addons/weather/functions/fnc_displayAirTemp.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" +/* + * Author: LorenLuke + * Displays an abstracted depiction of air temperature to a unit. + * + * Arguments: + * 0: Temperature + * 1: Unit Bias range + * + * Return Value: + * None + * + * Example: + * [15.8] call ace_weather_fnc_displayAirTemp + * + * Public: No + */ + +params ["_apparent_temperature", "_bias"]; +TRACE_2("params",_temperature, _bias); + +_temperature1 = floor(_temperature + (_bias select 0) - (random 2)); +_temperature2 = floor(_temperature + (_bias select 1) + (random 2)); + +private _color1 = [ +// Colors obtained by quartic regression formula of RGB values at corresponding temperatures as marked on advanced_ballistics rangecard + ( (((-0.000238348 * (_temperature1 ^ 4)) - (0.00865642 * (_temperature1 ^ 3)) + (0.794548 * (_temperature1 ^2)) - (0.323314 * _temperature1) +6.78445) min 255) /255) max 0, + ( (((-0.000308515 * (_temperature1 ^ 4)) + (0.000245732 * (_temperature1 ^ 3)) + (0.308531 * (_temperature1 ^2)) - (02.78916 * _temperature1) +164.326) min 255) /255) max 0, + ( (((-0.000107648 * (_temperature1 ^ 4)) + (0.00106365 * (_temperature1 ^ 3)) - (0.0989707 * (_temperature1 ^2)) - (9.66256 * _temperature1) +171.402) min 255) /255) max 0 +]; + +private _text = composeText ["", [format ["%1C", _temperature1],_color1] call EFUNC(common,stringToColoredText)]; +_text = composeText [_text, [" --- ", [1,1,1]] call EFUNC(common,stringToColoredText)]; + +private _color2 = [ +// Colors obtained by quartic regression formula of RGB values at corresponding temperatures as marked on advanced_ballistics rangecard + ( (((-0.000238348 * (_temperature2 ^ 4)) - (0.00865642 * (_temperature2 ^ 3)) + (0.794548 * (_temperature2 ^2)) - (0.323314 * _temperature2) +6.78445) min 255) /255) max 0, + ( (((-0.000308515 * (_temperature2 ^ 4)) + (0.000245732 * (_temperature2 ^ 3)) + (0.308531 * (_temperature2 ^2)) - (02.78916 * _temperature2) +164.326) min 255) /255) max 0, + ( (((-0.000107648 * (_temperature2 ^ 4)) + (0.00106365 * (_temperature2 ^ 3)) - (0.0989707 * (_temperature2 ^2)) - (9.66256 * _temperature2) +171.402) min 255) /255) max 0 +]; + + _text = composeText [_text, [format ["%1C", _temperature2], _color2] call EFUNC(common,stringToColoredText)]; + +[_text, QPATHTOF(UI\temp_ca.paa),_color, ACE_player, 2] call EFUNC(common,displayTextPicture); + +/* +for "_i" from -40 to 40 step 4 do { + _temp_color = _color; + + if (_i == 0) then { + _text = composeText [_text, ["[", _temp_color] call EFUNC(common,stringToColoredText)]; + _text = composeText [_text, ["0", [0.6, 1, 0.6]] call EFUNC(common,stringToColoredText)]; + _text = composeText [_text, ["]", _temp_color] call EFUNC(common,stringToColoredText)]; + } else { + _string = "I"; + }; + + if (abs( _i - _apparent_temperature) < 8.5) then { + _temp_color = [ + // Colors obtained by quartic regression formula of RGB values at corresponding temperatures as marked on advanced_ballistics rangecard + ( (((-0.000238348 * (_i ^ 4)) - (0.00865642 * (_i ^ 3)) + (0.794548 * (_i ^2)) - (0.323314 * _i) +6.78445) min 255) /255) max 0, + ( (((-0.000308515 * (_i ^ 4)) + (0.000245732 * (_i ^ 3)) + (0.308531 * (_i ^2)) - (02.78916 * _i) +164.326) min 255) /255) max 0, + ( (((-0.000107648 * (_i ^ 4)) + (0.00106365 * (_i ^ 3)) - (0.0989707 * (_i ^2)) - (9.66256 * _i) +171.402) min 255) /255) max 0 + ]; + }; + + _text = composeText [_text, [_string, [_temp_color select 0, _temp_color select 1, _temp_color select 2]] call EFUNC(common,stringToColoredText)]; +}; + +_text = composeText [_text, [" +40C", [1,0,0]] call EFUNC(common,stringToColoredText)]; +*/ +[_text, QPATHTOF(UI\temp_ca.paa),[1,1,1], ACE_player, 2] call EFUNC(common,displayTextPicture); diff --git a/addons/weather/functions/fnc_getApproximateAirTemp.sqf b/addons/weather/functions/fnc_getApproximateAirTemp.sqf new file mode 100644 index 00000000000..e9d00570df4 --- /dev/null +++ b/addons/weather/functions/fnc_getApproximateAirTemp.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: LorenLuke + * Returns an approximate representation of temperature at a unit's location. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [ACE_player] call ace_weather_fnc_getApproximateAirTemp + * + * Public: No + */ + +params ["_unit"]; +TRACE_1("params",_unit); + +if (isNil (format ["%1", _unit getVariable "ACE_airTemperatureBias"])) then { + _unit setVariable ["ACE_airTemperatureBias", [-(random(3) + 1), random(3) + 1]]; +}; + +private _temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight); +private _humidity = EGVAR(weather,currentHumidity); +private _heatIndex = [_temperature, _humidity] call EFUNC(weather,calculateHeatIndex); +private _chill = [_temperature, _humidity] call EFUNC(weather,calculateWindChill); + +private _e = 2^(1/(ln 2)); + +/* +// Windchill calc with wind vars; https://en.wikipedia.org/wiki/Wind_chill#Australian_Apparent_Temperature +private _windspeed = [getPosASL _unit, true, true, true] call EFUNC(weather,calculateWindSpeed); +private _water_vapor_pressure = _humidity * 6.105 *(_e ^ ((17.27 * _temperature)/(237.7 + _temperature))) / 100; +private _chill = _temperature + (0.33 * _water_vapor_pressure) - (0.70 * _windspeed) - 400; +*/ + +// sigmoid = f(x) = L / (1 + e^(-k * (x - x_0))); +// L max value, e = euler, k = steepness, + +// L = max value +private _sigmoid_L = 1; + +// x_0 = sigmoid midpoint, aka 50% proportion; 18.5C, ~65F +private _sigmoid_midpoint = 18.5; + +// place +- midpoint with desired proportion +private _sigmoid_valuation = 8.5; + +// desired upper and proportion on sigmoid +private _sigmoid_proportion_at_valuation = 0.95; +private _sigmoid_proportion_at_lower_valuation = 1 - _sigmoid_proportion_at_valuation; + +// k = steepness +private _sigmoid_k = (ln ((_sigmoid_proportion_at_lower_valuation^-1) - 1) ) / _sigmoid_valuation; + +// 5$/95% @ 10C/27C; [5% and 95% values at 50F and ~80F]; +// 5% = 0.05 = 1/20 = f(_midpoint - _valuation) = L / (1 + e^(-k * ((_midpoint - _valuation) - _midpoint) +// (0.05)^-1 = 20 = (L / (1 + e^(-k * (-_valuation))) )^-1 = (1 + e^(-k * -_valuation))/L; +// L = 1;> 20 = (1 + e^(k * valuation)); 20 - 1 = e^(k * valuation); +// 19 = e^(k * 8.5); (log_e 19) = (k * 8.5); (log_e 19)/8.5 = k; + +// retrieve sigmoid proportion at _temperature +private _temperature_sigmoid = _sigmoid_L / (1 + _e^(-_sigmoid_k * (_temperature - _sigmoid_midpoint))); + +// Weighted average between windchill and heat index based on sigmoid levels, plus +- 4deg randomisation +private _apparent_temperature = ((_temperature_sigmoid * _heatIndex) + ((1 - _temperature_sigmoid) * _chill) + random(8) - 4); + +[_apparent_temperature, (_unit getVariable "ACE_airTemperatureBias")] call FUNC(displayAirTemp); diff --git a/addons/weather/initSettings.sqf b/addons/weather/initSettings.sqf new file mode 100644 index 00000000000..00aa324db09 --- /dev/null +++ b/addons/weather/initSettings.sqf @@ -0,0 +1,39 @@ +private _category = [format ["ACE %1", LLSTRING(Module_DisplayName)]]; + +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(enabled_DisplayName), LSTRING(enabled_Description)], + _category, + true, // default value + true, // isGlobal + {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(updateInterval), "SLIDER", + [LSTRING(updateInterval_DisplayName), LSTRING(updateInterval_Description)], + _category, + [0,300,60,0], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(updateInterval), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(windSimulation), "CHECKBOX", + [LSTRING(windSimulation_DisplayName), LSTRING(windSimulation_Description)], + _category, + true, // default value + true, // isGlobal + {[QGVAR(windSimulation), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(showCheckAirTemperature), "CHECKBOX", + [LSTRING(showCheckAirTemperature_DisplayName), LELSTRING(common,showActionInSelfInteraction)], + _category, + true, // default value + false // isGlobal +] call CBA_settings_fnc_init; diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index c5cf4d4a379..050d5a68d36 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -5,7 +5,7 @@ Show Wind Info Pokaż inf. o wietrze Показать информацию о ветре - Afficher information sur le vent + Afficher les informations sur le vent Mostrar información del viento Mostra informazioni sul vento Zeige Windinformationen @@ -16,12 +16,13 @@ 바람 정보 표시 显示风力资讯 顯示風力資訊 + Rüzgar Bilgilerini Göster Show Wind Info (Toggle) Pokaż inf. o wietrze (przełącz) Показать информацию о ветре (перекл.) - Afficher information sur le vent (bascule) + Afficher les informations sur le vent (bascule) Mostrar información del viento (cambiar) Mostra informazioni sul vento (camb.) Zeige Windinformationen (umsch.) @@ -32,6 +33,7 @@ 바람 정보 표시 (토글) 显示风力资讯(切换) 顯示風力資訊(切換) + Rüzgar Bilgilerini Göster (Değiştir) Weather @@ -48,6 +50,7 @@ 기후 天气 天氣 + Hava Durumu Multiplayer synchronized ACE weather module @@ -56,7 +59,7 @@ ACE-Wettermodul (synchron im Multiplayer) Synchronizovat ACE počasí v multiplayeru Módulo climático ACE para sincronismo multiplayer - Module ACE de synchronisation de la météo en multi. + Module météo ACE synchronisé en multijoueur. Többjátékos szinkronizált ACE időjárás modul ACE Модуль для синхронизации погоды в мультиплеере Modulo Sincronizzazione Meteo ACE Multiplayer @@ -64,6 +67,7 @@ ACE 기후 모듈과 멀티플레이가 동기화됩니다. 使用ACE天气模块来同步所有客户端的天气状态(多人游戏) 使用ACE天氣模塊來同步所有客戶端的天氣狀態(多人遊戲) + Çok oyunculu ACE ACE Weather @@ -80,6 +84,7 @@ ACE 기후 ACE 天气 ACE 天氣 + ACE Hava Durumu Expands the existing weather by temperature, humidity and air pressure. @@ -90,6 +95,10 @@ 気温や湿度、大気圧によって既存の天候を拡張します。 온도, 습도 및 기압에 따라 기존 날씨를 확장합니다. Poszerza istniejącą pogodę o temperaturę, wilgotność i ciśnienie powietrza. + Расширяет текущие возможности погоды с учетом температуры, влажности и давления + Expande o clima existente com temperatura, humidade e pressão do ar. + Rozšiřuje stávající počasí o teplotu, vlhkost a tlak vzduchu. + Améliore le module météo existant en y ajoutant la température, l'humidité et la pression atmosphérique. Update Interval @@ -98,7 +107,7 @@ Aktualisierungsintervall Interval aktualizace Intervalo de atualização - Intervalle de synchronisation + Intervalle de mises à jour Frissítési intervallum Интервал обновления Intervallo Aggiornamento @@ -106,6 +115,7 @@ 갱신 간격 更新间隔 更新間隔 + Güncelleştirme Aralığı Defines the interval (seconds) between weather updates @@ -114,7 +124,7 @@ Definiert das Intervall (in Sekunden) zwischen Wetteraktualisierungen Určit interval (v sekundách) mezi aktualizacemi počasí Defina o intervalo (em segundos) entre as atualizações de clima - Défini un intervalle (secondes) entre deux synchronisations + Définit l'intervalle (en secondes) entre les mises à jour des conditions météo. Megadja az intervallumot (másodpercben) az időjárás-frissítések között Определяет интервал (в секундах) между обновлениями погоды Definisce l'intervallo(in secondi) tra aggiornamenti del meteo @@ -122,6 +132,7 @@ 기후를 갱신 하는 간격을 초 단위로 정합니다. 设定天气更新的时间间隔(秒) 設定天氣更新的時間間隔(秒) + Hava durumu güncellemeleri arasındaki aralığı (saniye) tanımlar Wind Simulation (map based) @@ -132,6 +143,11 @@ 風シミュレーション (マップを基に) 바람 시뮬레이션 (지도 기반) Symulacja Wiatru (bazowana na mapie) + Симуляция ветра (на основе местности) + Simulação de Vento (baseado no mapa) + Simulace větru (podle mapy) + Simulation du vent (basée sur la carte) + Rüzgar Simülasyonu (harita tabanlı) Enables the map based wind simulation (overwrites vanilla wind) @@ -142,6 +158,37 @@ マップを基にした風シミュレーションを有効化 (標準の風を上書き) 지도 기반의 바람 시뮬레이션을 활성화합니다 (바닐라 바람을 덮음) Aktywuje symulację wiatru bazującą na mapie (nadpisuje wind z domyślnej wersji gry) + Включает симуляцию ветра на основе текущей местности (переписывает ванильный ветер) + Ativar a simulação de vento dos mapas. (sobrepõe vento vanilla) + Povoluje simulaci větru založenou na mapě (přepíše původní vítr) + Active la simulation du vent basée sur la carte (écrase le vent vanilla). + Harita tabanlı rüzgar simülasyonunu etkinleştirir (Normal rüzgarının üzerine yazar) + + + Check Air Temperature + Überprüfe Lufttemperatur + 檢查氣溫 + Controllare la temperatura dell'aria + Zkontrolovat teplotu vzduchu + 気温を確認 + Sprawdź temperaturę powietrza + Vérifier la température + Checar a temperatura do ar + Hava Sıcaklığını Kontrol Et + Проверить температуру воздуха + + + Show Check Air Temperature Action + Zeige "Überprüfe Lufttemperatur" im Selbstinteraktionsmenü + 顯示檢查氣溫動作 + Mostra Controlla l'azione della temperatura dell'aria + Ukázat akci kontroly teploty vzduchu + 気温の確認動作を表示 + Pokaż akcje sprawdzającą temperaturę powietrza + Afficher l'interaction "Vérifier la température" + Mostrar a ação "Checar a temperatura do ar" + Hava Sıcaklığını Kontrol Etme Eylemini Göster + Показывать действие проверки температуры diff --git a/addons/winddeflection/config.cpp b/addons/winddeflection/config.cpp index 0e193dace50..2d224d066e1 100644 --- a/addons/winddeflection/config.cpp +++ b/addons/winddeflection/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_weather"}; + requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); authors[] = {ECSTRING(common,ACETeam), "Glowbal", "Ruthberg"}; url = ECSTRING(main,URL); diff --git a/addons/winddeflection/functions/fnc_handleFired.sqf b/addons/winddeflection/functions/fnc_handleFired.sqf index f43b40f455a..df1e1665dfa 100644 --- a/addons/winddeflection/functions/fnc_handleFired.sqf +++ b/addons/winddeflection/functions/fnc_handleFired.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [clientFiredBIS-XEH] call ace_advanced_ballistics_fnc_handleFired + * [clientFiredBIS-XEH] call ace_winddeflection_fnc_handleFired * * Public: No */ diff --git a/addons/winddeflection/functions/fnc_initModuleSettings.sqf b/addons/winddeflection/functions/fnc_initModuleSettings.sqf index 39e7fc6f317..c980a054701 100644 --- a/addons/winddeflection/functions/fnc_initModuleSettings.sqf +++ b/addons/winddeflection/functions/fnc_initModuleSettings.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [LOGIC, [bob, kevin], true] call ace_winddeflection_fnc_initModuelSettings + * [LOGIC, [bob, kevin], true] call ace_winddeflection_fnc_initModuleSettings * * Public: No */ diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index e0a6b5da549..9c5b752b249 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -25,6 +25,7 @@ _args set [0, CBA_missionTime]; private _isWind = (vectorMagnitude wind > 0); + private _deleted = false; { _x params ["_bullet", "_airFriction"]; @@ -32,7 +33,8 @@ private _bulletSpeedSqr = vectorMagnitudeSqr _bulletVelocity; if ((!alive _bullet) || {(_bullet isKindOf "BulletBase") && {_bulletSpeedSqr < 10000}}) then { - GVAR(trackedBullets) deleteAt (GVAR(trackedBullets) find _x); + GVAR(trackedBullets) set [_forEachIndex, objNull]; + _deleted = true; } else { if (_isWind) then { private _trueVelocity = _bulletVelocity vectorDiff wind; @@ -48,7 +50,11 @@ }; _bullet setVelocity _bulletVelocity; }; - nil - } count +GVAR(trackedBullets); + } forEach GVAR(trackedBullets); + + if (_deleted) then { + GVAR(trackedBullets) = GVAR(trackedBullets) - [objNull]; + }; + // END_COUNTER(pfeh); }, GVAR(simulationInterval), [CBA_missionTime]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index 53648b2e37d..f9b0ca56e49 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -16,6 +16,7 @@ 바람 정보 风力资讯 風力資訊 + Rüzgar Bilgisi Direction: %1 @@ -23,7 +24,7 @@ Dirección: %1 Направление: %1° Směr: %1 - Direction %1 + Direction : %1 Windrichtung: %1 Irány: %1 Direzione: %1° @@ -32,6 +33,7 @@ 방향: %1 风向: %1 風向: %1 + Yön: %1 Speed: %1 m/s @@ -39,7 +41,7 @@ Velocidad: %1 m/s Скорость: %1 м/с Rychlost: %1 m/s - Vitesse %1 m/s + Vitesse : %1 m/s Geschwindigkeit: %1 m/s Sebesség: %1 m/s Velocità: %1 m/s @@ -48,6 +50,7 @@ 풍속: %1 m/s 风速: %1 m/s 風速: %1 m/s + Hız: %1 m/s Weather Information @@ -64,6 +67,7 @@ 기상 정보 天气资讯 天氣資訊 + Hava Durumu Bilgisi Humidity: %1% @@ -71,7 +75,7 @@ Humedad: %1% Влажность: %1% Vlhkost: %1% - Humidité: %1% + Humidité : %1% Luftfeuchtigkeit: %1 Páratartalom: %1% Umidità: %1% @@ -80,6 +84,7 @@ 습도: %1% 湿度: %1% 濕度: %1% + Nem Oranı: %1% Wind Deflection @@ -88,7 +93,7 @@ Účinky větru Windablenkung Desvio de vento - Déflexion du vent + Déflexion due au vent Szél-hárítás Отклонение ветром Deviazione del Vento @@ -96,6 +101,7 @@ 풍향 변화 风偏 風偏 + Rüzgar Sapması Wind Deflection @@ -104,7 +110,7 @@ Windablenkung Účinky větru Desvio de vento - Déflexion du vent + Déflexion due au vent Szél-hárítás Отклонение ветром Deviazione del Vento @@ -112,6 +118,7 @@ 풍향 변화 风偏 風偏 + Rüzgar Sapması Enables wind deflection @@ -120,7 +127,7 @@ Aktiviert Windablenkung Umožňit vliv větru Ativa o desvio de vento - Active la déflexion dûe au vent + Active la déflexion due au vent. Engedélyezi a szél-hárítást Включает отклонение ветром Abilita deviazione del vento @@ -128,6 +135,7 @@ 풍향 변화를 적용합니다 开启风偏效果 開啟風偏效果 + Rüzgar sapmasını aktif et Vehicle Enabled @@ -136,7 +144,7 @@ Fahrzeuge aktiviert Vozidla povolena Ativado em veículos - Activer les véhicules + Activer pour les véhicules Jármű engedélyezve Для техники Abilita per Veicoli @@ -144,6 +152,7 @@ 차량 적용 启用风偏给载具 啟用風偏給載具 + Araçlar da etkin Enables wind deflection for static/vehicle gunners @@ -152,7 +161,7 @@ Aktiviere Windablenkung für statische oder Fahrzeugschützen Umožnit vliv větru pro střelce z vozidla/statiky Ativa o desvio de vento para atiradores de estáticas e veículos - Activer la déflection dûe au vent pour les armes statique et les véhicules + Active la déflexion due au vent pour les armes statiques et les mitrailleuses des véhicules. Engedélyezi a szél-hárítást a statikus/jármű-lövészeknél Включает отклонение ветром для стрелков стационарных орудий и техники Abilita deviazione del vento per artiglieri di statiche/veicoli @@ -160,6 +169,7 @@ 차량이나 거치식 무기 사수에게 풍향 변화를 적용합니다 使风偏作用在固定式武器与载具炮手身上 使風偏作用在固定式武器與載具砲手身上 + Araç nişancıları için rüzgar sapmasını etkinleştirir. Simulation Interval @@ -184,7 +194,7 @@ Definiert das Intervall zwischen jedem Berechnungsschritt Určuje interval mezi každým výpočtem Define o intervalo entre cada cálculo - Défini l'intervalle entre deux points de calcul + Définit l'intervalle entre chacune des étapes de calcul. Megszabja a számítási lépések közötti intervallumot Определяет временной интервал между расчетами Definisce l'intervallo tra ogni passaggio di calcolo @@ -200,7 +210,7 @@ Windeinfluss auf die Geschossbahnen Vítr ovlivňuje trajektorii projektilu Influência do vento na trajetória dos projéteis - Le vent influe sur la trajectoire des projectiles + Le vent influe sur la trajectoire des projectiles. Szél hatása a lövedékek röppályájára Влияние втера на траекторию снарядов Influenza del vento sulla traiettoria dei proiettili diff --git a/addons/yardage450/CfgEventHandlers.hpp b/addons/yardage450/CfgEventHandlers.hpp index 10dce0a9bfe..2bed8a2eef7 100644 --- a/addons/yardage450/CfgEventHandlers.hpp +++ b/addons/yardage450/CfgEventHandlers.hpp @@ -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)); }; }; diff --git a/addons/yardage450/initKeybinds.sqf b/addons/yardage450/initKeybinds.sqf index 9ad3005d289..fa4f52b6c55 100644 --- a/addons/yardage450/initKeybinds.sqf +++ b/addons/yardage450/initKeybinds.sqf @@ -1,5 +1,5 @@ -["ACE3 Equipment", QGVAR(DistanceKey), localize "STR_ACE_Yardage450_PowerButtonKey", +["ACE3 Equipment", QGVAR(DistanceKey), LLSTRING(PowerButtonKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/yardage450/stringtable.xml b/addons/yardage450/stringtable.xml index 6ab95aff7f4..8e73904da78 100644 --- a/addons/yardage450/stringtable.xml +++ b/addons/yardage450/stringtable.xml @@ -1,6 +1,6 @@ - + Yardage 450 Yardage 450 @@ -16,6 +16,7 @@ Yardage 450 Yardage 450 Yardage 450 + Yardage 450 Laser Rangefinder @@ -32,6 +33,7 @@ 레이저 거리측정기 雷射测距仪 雷射測距儀 + Lazer Menzil Bulucu Yardage 450 - Power Button @@ -43,11 +45,12 @@ Yardage 450 - Főkapcsoló gomb Yardage 450 - Кнопка питания Yardage 450 - Bottone Accensione - Yardage 450 - bouton d'alimentation + Yardage 450 - Bouton d'alimentation ヤードエイジ 450 - 起動ボタン Yardage 450 - 전원 버튼 Yardage 450 - 电源按钮 Yardage 450 - 電源按鈕 + Yardage 450 - Güç Tuşu diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 74095cb4a2d..1d86d5fee32 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -186,6 +186,13 @@ class CfgVehicles { function = QFUNC(moduleLoadIntoCargo); icon = "a3\ui_f\data\IGUI\Cfg\Actions\loadVehicle_ca.paa"; }; + class GVAR(moduleCargoParadrop): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(AI); + displayName = CSTRING(moduleCargoParadrop_DisplayName); + function = QFUNC(moduleCargoParadrop); + icon = QPATHTOF(UI\Icon_Module_Zeus_ParadropCargo_ca.paa); + }; class GVAR(modulePatrolArea): GVAR(moduleBase) { curatorCanAttach = 1; category = QGVAR(AI); @@ -317,4 +324,27 @@ class CfgVehicles { class ModuleArsenal_F: Module_F { function=QFUNC(bi_moduleArsenal); }; + + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class GVAR(create) { + displayName = CSTRING(CreateZeus); + condition = QUOTE(call FUNC(canCreateModule)); + exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; + //Set GVAR(zeus) to null first to disable the action through the isNil check + statement = QUOTE(GVAR(zeus) = objNull; [ARR_2(QQGVAR(createZeus), ACE_player)] call CBA_fnc_serverEvent); + showDisabled = 1; + icon = "\A3\Ui_F_Curator\Data\Logos\arma3_curator_eye_32_ca.paa"; + }; + class GVAR(delete) { + displayName = CSTRING(DeleteZeus); + condition = QUOTE(!(isNil QQGVAR(zeus) || {isNull GVAR(zeus)})); + exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"}; + statement = QUOTE(deleteVehicle GVAR(zeus); GVAR(zeus) = nil); + showDisabled = 1; + icon = "\A3\Ui_F_Curator\Data\Logos\arma3_curator_eye_32_ca.paa"; + }; + }; + }; }; diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 910b0db4d18..2d218ddb8fe 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -5,6 +5,7 @@ PREP(bi_moduleCurator); PREP(bi_moduleMine); PREP(bi_moduleProjectile); PREP(bi_moduleRemoteControl); +PREP(canCreateModule); PREP(getModuleDestination); PREP(handleZeusUnitAssigned); PREP(moduleAddArsenal); @@ -13,6 +14,7 @@ PREP(moduleAddSpareTrack); PREP(moduleAddSpareWheel); PREP(moduleAddOrRemoveFRIES); PREP(moduleCaptive); +PREP(moduleCargoParadrop); PREP(moduleConfigurePylons); PREP(moduleGarrison); PREP(moduleGlobalSetSkill); diff --git a/addons/zeus/XEH_postInit.sqf b/addons/zeus/XEH_postInit.sqf index 85527f0ab26..6de64b6d999 100644 --- a/addons/zeus/XEH_postInit.sqf +++ b/addons/zeus/XEH_postInit.sqf @@ -81,36 +81,4 @@ if (hasInterface) then { GVAR(zeus) = _zeus; [localize "str_a3_cfgvehicles_moduletasksetstate_f_arguments_state_values_created_0"] call EFUNC(common,displayTextStructured); }] call CBA_fnc_addEventHandler; - - private _action = [ - QGVAR(create), - LLSTRING(CreateZeus), - "\A3\Ui_F_Curator\Data\Logos\arma3_curator_eye_32_ca.paa", - { - GVAR(zeus) = objNull; // to disable menu while zeus is being created - [QGVAR(createZeus), ACE_player] call CBA_fnc_serverEvent; - }, - { - switch (GVAR(canCreateZeus)) do { - case CAN_CREATE_ADMIN: {isServer || {IS_ADMIN_LOGGED}}; - case CAN_CREATE_CONSOLE: {call BIS_fnc_isDebugConsoleAllowed}; - case CAN_CREATE_ALL: {true}; - default {false}; - } - && {isNil QGVAR(zeus)} - } - ] call EFUNC(interact_menu,createAction); - ["CAManBase", 1, ["ACE_SelfActions"], _action, true] call EFUNC(interact_menu,addActionToClass); - - _action = [ - QGVAR(delete), - LLSTRING(DeleteZeus), - "\A3\Ui_F_Curator\Data\Logos\arma3_curator_eye_32_ca.paa", - { - deleteVehicle GVAR(zeus); - GVAR(zeus) = nil; - }, - {!(isNil QGVAR(zeus) || {isNull GVAR(zeus)})} - ] call EFUNC(interact_menu,createAction); - ["CAManBase", 1, ["ACE_SelfActions"], _action, true] call EFUNC(interact_menu,addActionToClass); }; diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 37cfa24dd4e..932d5e09c8b 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -54,7 +54,8 @@ class CfgPatches { }; class GVAR(cargo): ADDON { units[] = { - QGVAR(moduleLoadIntoCargo) + QGVAR(moduleLoadIntoCargo), + QGVAR(moduleCargoParadrop) }; }; class GVAR(repair): ADDON { diff --git a/addons/zeus/functions/fnc_bi_moduleArsenal.sqf b/addons/zeus/functions/fnc_bi_moduleArsenal.sqf index fffca62fc3b..65c394a67e4 100644 --- a/addons/zeus/functions/fnc_bi_moduleArsenal.sqf +++ b/addons/zeus/functions/fnc_bi_moduleArsenal.sqf @@ -39,6 +39,9 @@ if (_activated && local _logic) then { [{ params ["_unit"]; + player remoteControl _unit; + EGVAR(arsenal,moduleUsed) = true; + [_unit, _unit, true] call EFUNC(arsenal,openBox); }, [_unit]] call CBA_fnc_directCall; } else { diff --git a/addons/zeus/functions/fnc_canCreateModule.sqf b/addons/zeus/functions/fnc_canCreateModule.sqf new file mode 100644 index 00000000000..df6cb994003 --- /dev/null +++ b/addons/zeus/functions/fnc_canCreateModule.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Dystopian + * Check whether local player is currently allowed to create a Zeus Module + * + * Arguments: + * None + * + * Return Value: + * Allowed to create module + * + * Example: + * call ace_zeus_fnc_canCreateModule + * + * Public: No + */ + +(isNil QGVAR(zeus)) && { + switch (GVAR(canCreateZeus)) do { + case CAN_CREATE_ADMIN: {isServer || {IS_ADMIN_LOGGED}}; + case CAN_CREATE_CONSOLE: {call BIS_fnc_isDebugConsoleAllowed}; + case CAN_CREATE_ALL: {true}; + default {false}; + } +} diff --git a/addons/zeus/functions/fnc_moduleCargoParadrop.sqf b/addons/zeus/functions/fnc_moduleCargoParadrop.sqf new file mode 100644 index 00000000000..948a54a7a90 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleCargoParadrop.sqf @@ -0,0 +1,71 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Commands the selected vehicle to paradrop all cargo at the specified location + * + * Arguments: + * 0: Module logic + * 1: Synchronized units + * 2: Activated + * + * Return Value: + * None + * + * Example: + * [LOGIC, [], true] call ace_zeus_fnc_moduleCargoParadrop + * + * Public: No + */ + +if (canSuspend) exitWith {[FUNC(moduleCargoParadrop), _this] call CBA_fnc_directCall;}; + +params ["_logic", "", "_activated"]; + +if ((!local _logic) || {!_activated}) exitWith {}; + +// Validate the module target +private _vehicle = attachedTo _logic; +private _pilot = driver _vehicle; +TRACE_4("moduleCargoParadrop placed",_logic,typeOf _vehicle,_pilot,typeOf _pilot); + +deleteVehicle _logic; // cleanup logic now, we just needed it to get the attached vehicle + +if (!(missionNamespace getVariable [QEGVAR(cargo,enable), false])) exitWith { + [LSTRING(RequiresAddon)] call FUNC(showMessage); +}; +if (isNull _vehicle) exitWith { + [LSTRING(NothingSelected)] call FUNC(showMessage); +}; +if (!(_vehicle isKindOf "Air")) exitWith { + [format ["%1 %2", localize "str_dn_aircraft", localize "str_msg_no_veh_select"]] call FUNC(showMessage); +}; +if ((!alive _vehicle) || {!alive _pilot}) exitWith { + [LSTRING(OnlyAlive)] call FUNC(showMessage); +}; +if ([_pilot] call EFUNC(common,isPlayer)) exitWith { + ["str_a3_cfgvehicles_moduleremotecontrol_f_errorPlayer"] call FUNC(showMessage); +}; +if ((_vehicle getVariable [QEGVAR(cargo,loaded), []]) isEqualTo []) exitWith { + [LSTRING(paradrop_noCargoLoaded)] call FUNC(showMessage); +}; + +[_vehicle, { + params ["_successful", "_vehicle", "_mousePosASL"]; + TRACE_3("getModuleDestination return",_successful,_vehicle,_mousePosASL); + + if ((!_successful) || {!alive _vehicle}) exitWith {}; + + private _pilot = driver _vehicle; + private _group = group _pilot; + + if ((!alive _vehicle) || {!alive _pilot} || {[_pilot] call EFUNC(common,isPlayer)}) exitWith {TRACE_2("invalid",_vehicle,_pilot);}; + + [_group] call CBA_fnc_clearWaypoints; + + private _wp = _group addWaypoint [ASLtoAGL _mousePosASL, 0]; + _wp setWaypointType "SCRIPTED"; + _wp setWaypointScript QPATHTOF(functions\DOUBLES(fnc,moduleCargoParadropWaypoint).sqf); + + TRACE_2("Waypoint Added",_wp,local _group); // Locality is handled by the waypoint + +}, localize LSTRING(moduleCargoParadrop_DisplayName), "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], 45] call FUNC(getModuleDestination); diff --git a/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf b/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf new file mode 100644 index 00000000000..1b4e00960cc --- /dev/null +++ b/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf @@ -0,0 +1,75 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Handles the paradrop cargo scripted waypoint (Scheduled Environment) + * + * Arguments: + * 0: Group + * 1: Waypoint Position + * + * Return Value: + * Waypoint Finished + * + * Example: + * [group, [0,0,0]] call ace_zeus_fnc_moduleCargoParadropWaypoint + * + * Public: No + */ + +params [["_vehicleGroup", grpNull, [grpNull]], ["_wpPos", [0, 0, 0], [[]], 3]]; +TRACE_2("moduleCargoParadropWaypoint",_vehicleGroup,_wpPos); + +private _vehicle = vehicle leader _vehicleGroup; +private _commander = driver _vehicle; +private _cargo = _vehicle getVariable [QEGVAR(cargo,loaded), []]; +if (!(_vehicle isKindOf "Air")) exitWith {WARNING_1("not in a air vehicle",typeOf _vehicle); true}; +if (_cargo isEqualTo []) exitWith {WARNING_1("no cargo",_cargo); true}; + +private _previousSpeedMode = speedMode _vehicleGroup; +private _nextMoveUpdate = -1; +private _closeEnoughTicks = 0; // should prevent aircraft from endlessly going in circles trying to hit a point + +// Start moving the vehicle to the drop off point +waitUntil { + sleep 0.1; + if ((!alive _vehicle) || {!alive _commander}) exitWith {true}; + + if (CBA_missionTime > _nextMoveUpdate) then { + private _heading = _vehicle getDir _wpPos; + private _movePos = _vehicle getPos [1000, _heading]; + TRACE_2("move",_vehicleGroup,_movePos); + _vehicle flyInHeight 150; + _vehicleGroup move _movePos; + _nextMoveUpdate = CBA_missionTime + 3; + }; + if ((_vehicle distance2D _wpPos) < 300) then {_closeEnoughTicks = _closeEnoughTicks + 1}; + private _leadDistance = _closeEnoughTicks * 3 + linearConversion [0, 300, (speed _vehicle), 50, 100, true]; + (_vehicle distance2D _wpPos) < _leadDistance +}; +TRACE_2("Finished primary movement",_vehicle distance2D _wpPos,_closeEnoughTicks); + +if ((!alive _vehicle) || {!alive _commander}) exitWith {TRACE_2("died",alive _vehicle, alive _commander); true}; +if (((getPos _vehicle) select 2) < 25) exitWith {TRACE_1("too low",getPos _vehicle); true}; + +// Fly level and straight +private _unloadFlightPos = _vehicle getRelPos [1000, 0]; +_vehicle flyInHeight 150; +_vehicleGroup setSpeedMode "LIMITED"; +_vehicleGroup move _unloadFlightPos; + +sleep 0.5; + +TRACE_2("Starting unload",_vehicle,_cargo); +{ + TRACE_1("cargo-paradropItem",_x); + [QEGVAR(cargo,paradropItem), [_x, _vehicle, false], _vehicle] call CBA_fnc_targetEvent; + sleep 1; +} forEach (+_cargo); // copy because array will be modified after each drop + +TRACE_1("Unload finished",_vehicle); + +sleep 0.5; +_vehicleGroup setSpeedMode _previousSpeedMode; + +TRACE_1("WP Done",_vehicle); +true diff --git a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf index a43ba781891..4659fba2d5e 100644 --- a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf +++ b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf @@ -20,7 +20,7 @@ params ["_varName", "_varValue"]; _varValue params ["_general", "_accuracy", "_handling", "_spotting", "_cover", "_combat"]; TRACE_1("Params",_this); -TRACE_6("AI settings updated",GVAR(GlobalSkillAI)); +TRACE_1("AI settings updated",GVAR(GlobalSkillAI)); { if (local _x) then { _x setSkill ["general", _general]; diff --git a/addons/zeus/functions/fnc_moduleHeal.sqf b/addons/zeus/functions/fnc_moduleHeal.sqf index 647112f67af..627c48ef36c 100644 --- a/addons/zeus/functions/fnc_moduleHeal.sqf +++ b/addons/zeus/functions/fnc_moduleHeal.sqf @@ -43,8 +43,9 @@ switch (false) do { }; // Heal validated target -if (["ace_medical"] call EFUNC(common,isModLoaded) && {EGVAR(medical,level) > 0}) then { - [QEGVAR(medical,treatmentAdvanced_fullHealLocal), [_unit, _unit], _unit] call CBA_fnc_targetEvent; +if (["ace_medical"] call EFUNC(common,isModLoaded)) then { + TRACE_1("healing with ace_medical",_unit); + [QEGVAR(medical_treatment,fullHealLocal), [_unit], _unit] call CBA_fnc_targetEvent; } else { // BI's scripted revive system if ((missionNamespace getVariable ["bis_revive_mode", 0]) != 0) then { diff --git a/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf b/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf index b13c0cc29bb..9021e118f65 100644 --- a/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf +++ b/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf @@ -43,7 +43,7 @@ if (!alive _cargo) exitWith { params ["_successful", "_cargo", "_mousePosASL"]; if (!_successful) exitWith {}; - private _holder = (nearestObjects [ASLToAGL _mousePosASL, EGVAR(cargo,cargoHolderTypes), 5, true]) param [0, objNull]; // 2d distance search + private _holder = (nearestObjects [ASLToAGL _mousePosASL, EGVAR(cargo,cargoHolderTypes), 15, true]) param [0, objNull]; // 2d distance search if (isNull _holder) exitWith { [LSTRING(NothingSelected)] call FUNC(showMessage); }; @@ -56,6 +56,7 @@ if (!alive _cargo) exitWith { private _loadedItem = [localize ELSTRING(cargo,LoadedItem), "
", " "] call CBA_fnc_replace; private _holderDisplayName = [_holder] call EFUNC(common,getName); [_loadedItem, _displayName, _holderDisplayName] call FUNC(showMessage); + ["ace_cargoLoaded", [_cargo, _holder]] call CBA_fnc_globalEvent; } else { private _loadingFailed = [localize ELSTRING(cargo,LoadingFailed), "
", " "] call CBA_fnc_replace; [_loadingFailed, _displayName] call FUNC(showMessage); diff --git a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf index afcacc0c259..fa3ced078c1 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf @@ -40,9 +40,9 @@ if !(["ACE_Medical"] call EFUNC(common,isModLoaded)) then { if (GETVAR(_unit,EGVAR(captives,isHandcuffed),false)) then { [LSTRING(OnlyNonCaptive)] call FUNC(showMessage); } else { - private _medicN = GETVAR(_unit,EGVAR(medical,medicClass),0); - if (_medicN < 1) then { - _unit setVariable [QEGVAR(medical,medicClass), 1, true]; + private _medicN = GETVAR(_unit,EGVAR(medical,isMedicalVehicle),false); + if !(_medicN) then { + _unit setVariable [QEGVAR(medical,isMedicalVehicle), true, true]; }; }; }; diff --git a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf index c659ca7a9ab..47ada09c00a 100644 --- a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf +++ b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf @@ -77,7 +77,7 @@ if (_autoSeek) then { private _nearestObjects = nearestObjects [_unit, [], _range] select {side _x == _activationSide && {_x != _unit} && {alive _x}}; #ifdef DEBUG_MODE_FULL - if !(isNil "_lastMove") then { + if (!isNil "_lastMove") then { drawLine3D [_unit modelToWorldVisual [0, 0, 1], _lastMove, [1, 0, 0, 1]]; }; for "_i" from 0 to 35 do { diff --git a/addons/zeus/functions/fnc_moduleUnGarrison.sqf b/addons/zeus/functions/fnc_moduleUnGarrison.sqf index 5ac9ea5dcf7..2d380d2cf2c 100644 --- a/addons/zeus/functions/fnc_moduleUnGarrison.sqf +++ b/addons/zeus/functions/fnc_moduleUnGarrison.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [LOGIC] call ace_zeus_fnc_moduleUngarrison + * [LOGIC] call ace_zeus_fnc_moduleUnGarrison * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index fbba773b045..9bcec2cdcba 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -37,9 +37,9 @@ if (isNil QEFUNC(medical,setUnconscious)) then { if !(alive _unit) then { [LSTRING(OnlyAlive)] call FUNC(showMessage); } else { - private _conscious = GETVAR(_unit,ACE_isUnconscious,false); + private _unconscious = GETVAR(_unit,ACE_isUnconscious,false); // Function handles locality for me - [_unit, !_conscious, 10e10, true] call EFUNC(medical,setUnconscious); + [_unit, !_unconscious, 10e10] call EFUNC(medical,setUnconscious); }; }; }; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index c841f28f917..2cb411258f6 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -6,9 +6,15 @@ Zeus 宙斯 宙斯 + Zeus Zeus 제우스 Zeus + Зевс + Zeus + Zeus + Zeus + Zeus Zeus Settings @@ -25,6 +31,7 @@ Zeus 설정 宙斯设定 宙斯設定 + Zeus Ayarları Provides control over various aspects of Zeus. @@ -33,7 +40,7 @@ Poskytuje kontrolu na různými aspekty Zeuse. Bietet die Steuerung verschiedener Zeus-Optionen an. Proporciona controle sobre diversos aspectos do Zeus. - Fourni le contrôle des différents aspects de Zeus. + Fournit un contrôle sur divers aspects de Zeus. Különböző beállítási lehetőségeket biztosít a Zeus részeihez. Позволяет контролировать различные аспекты Зевса. Fornisce controllo su vari aspetti di Zeus. @@ -49,7 +56,7 @@ Zpráva o novém Zeusovi Aufstiegsnachrichten Mensagens de ascensão - Message d'ascension + Message d'Ascension Felemelkedési üzenetek Сообщения о вознесении Messaggi di Ascesa @@ -65,7 +72,7 @@ Zobrazit globální zprávu když je hráč přiřazen jako Zeus. Zeige globale Popup-Nachrichten wenn ein Spieler zu Zeus wird. Mostra uma mensagem popup quando um jogador é atribuido ao Zeus. - Affiche un message global quand un joueur est assigné en tant que Zeus. + Affiche des messages popup globaux lorsqu'un joueur est élevé au rang de Zeus. Globális üzeneteket jelez ki, ha egy játékos Zeus-nak lesz beosztva. Отображает глобальное всплывающее сообщение, когда один из игроков становится Зевсом. Mostra messaggi popup globali quando un giocatore viene assegnato come Zeus. @@ -89,6 +96,7 @@ Zeus 독수리 宙斯鹰眼模式 宙斯鷹眼模式 + Zeus Kartalı Spawn an eagle that follows the Zeus camera. @@ -97,7 +105,7 @@ Vytvoří orla, který následuje kameru Zeuse. Erstelle einen Adler, der der Zeus-Kamera folgt. Cria uma águia que segue a câmera do Zeus - Faire apparaitre un aigle qui suit la caméra Zeus + Crée un aigle qui suit la caméra Zeus. Lerak egy sast, ami követi a Zeus kamerát. Спавнит орла, который следует за камерой Зевса. Crea un'aquila che segue la camera Zeus. @@ -113,7 +121,7 @@ Zvuky větru Windgeräusche Sons de vento - Bruit de vent + Bruits de vent Szélhangok Звук ветра Suoni del Vento @@ -121,6 +129,7 @@ 바람 소리 风声 風聲 + Rüzgar sesi Play wind sounds when Zeus remote controls a unit. @@ -129,7 +138,7 @@ Přehrát varování (vítr) když Zeus převezmě kontrolu nad jednotkou. Spiele Windgeräusche ab, wenn Zeus eine Einheit steuert. Reproduz sons de vento quando uma unidade é remotamente controlada pelo Zeus. - Joue des bruits de vent quand Zeus controle une unité. + Joue des bruits de vent lorsque Zeus contrôle une unité distante. Szélhangokat játszik le, ha a Zeus távvezérel egy egységet. Проигрывает звук ветра каждый раз, когда Зевс вселяется в юнита. Esegui rumori di vento quando Zeus controlla un'unità in remoto. @@ -145,11 +154,11 @@ Varování před dělostřelectvem Artilleriewarnung Aviso de explosivos - Alerte d'équipement militaire + Alerte d'artillerie Tüzérségi figyelmeztetés Предупреждение об арте Allarme Esplosivi - 砲撃の警告 + 砲撃警告 폭격 경고 武装警告 武裝警告 @@ -161,7 +170,7 @@ Přehrát varování (rádio) když Zeus použije dělostřelectvo. Spiele eine Radiowarnung ab, wenn Zeus Artillerie verwendet. Reproduz uma aviso via rádio quando o Zeus usa um explosivo. - Joue un son radio quand le Zeus utilise du matériel militaire. + Diffuse un avertissement radio lorsque Zeus utilise de l'artillerie. Rádiós figyelmeztetés kiadása, ha a Zeus tüzérséget használ. Проигрывает звук радио каждый раз, когда Зевс использует артиллерию. Riproduci un messaggio radio quando Zeus usa esplosivi. @@ -193,7 +202,7 @@ Odhalí miny pro spojence a umístnit jejich značku na mapu. Melde Minen gegenüber Verbündeten und platziere entsprechende Kartenmarkierungen. Revelar minas para aliados e colocar marcadores no mapa. - Révéler les mines et placer un marqueur sur la carte. + Révèle les mines aux alliés et place des marqueurs sur la carte. Feltárja az aknákat a szövetségeseknek, és jelölőket helyez el a térképen. Показывает мины союзникам и отмечает их маркерами на карте. Rivela mine ad alleati e piazza marcatori in mappa. @@ -241,14 +250,15 @@ Přepnout - Vězeň Gefangennahme umschalten Alternar prisioneiro - Basculer en captif + Commuter captivité Elfogott állapot váltása Пленный (вкл./выкл.) Attivatore Prigioniero - 捕虜として切り替え + 捕虜に切り替え 포로 토글 切换俘虏 切換俘虜 + Tutuklamayı Aç/Kapat Defend Area @@ -262,96 +272,141 @@ Difendi Area 防御区域 防禦區域 + Defender Área + Bölgeyi Koru Update Editable Objects Aktualisiere bearbeitbare Objekte - 編集可能なオブジェクトを更新 + 編集可能オブジェクトを更新 Aktualizuj edytowalne obiekty 수정 가능한 물체 갱신 - Màj les objets éditables + Màj les objets modifiables Aggiorna Oggetti Modificabili 更新可编辑的物件 更新可編輯的物件 + Обновить редактируемые объекты + Atualizar objetos editáveis + Aktualizujte upravitelné objekty Editing Mode 編輯模式 Modalità per editare + Bearbeitungsmodus 編集モード Tryb Edytowania + Режим редактирования + Modo de edição + Režim úprav + Mode d'édition Add or remove editable objects from Zeus 新增或移除可編輯物件給宙斯 + Aktiviere oder deaktiviere zu bearbeitende Objekte von Zeus Agguingi o rimuovi oggetti che Zeus può modificare Zeus から編集可能オブジェクトの追加と削除をする Dodaj lub usuń edytowalne obiekty z Zeus'a + Добавить или удалить редактируемые объекты от Зевса + Adiciona ou remove objetos editáveis do Zeus + Přidej nebo odeber upravitelné objekty ze Zeusu + Ajoute ou supprime les objets modifiables depuis Zeus. Add Objects + Füge Objekte hinzu 新增物件 Aggiungi Oggetti - オブジェクトを追加 + オブジェクト追加 Dodaj obiekty + Добавить объекты + Adicionar Objetos + Přidat objekty + Ajouter des objets + Obje Ekle Remove Objects Entferne Objekte - オブジェクトの削除 + オブジェクト削除 물체 삭제 Usuń obiekty - Enlève les objets + Enlever des objets Rimuovi Oggetti 移除物件 移除物件 + Удалить объекты + Remover Objetos + Odebrat objekty + Objeyi Kaldır All Curators - Alle Zeus' + Alle Kuratoren 全キュレーター 모든 큐레이터 Wszyscy kuratorzy - Tous curateurs + Tous les curateurs Tutti i Moderatori 所有编辑者 所有編輯者 + Все кураторы + Todos os Curadores + Všichni kurátoři Apply changes to all curators - Änderungen bei allen Zeus' aktualisieren - 全キュレーターへ変更を適用 + Änderungen bei allen Kuratoren aktualisieren + 全キュレーターへ変更を適用します。 모든 큐레이터에 변화를 적용합니다 Zatwierdź zmiany dla wszystkich kuratorów - Applique les changements à tous les curateurs + Applique les changements à tous les curateurs. Applica i cambiamenti a tutti i moderatori 确认变更给所有编辑者 確認變更給所有編輯者 + Применить изменения ко всем кураторам + Aplicar mudanças à todos os Curadores + Použít změny na všechny kurátory Additional Objects + Zusätzliche Objekte Oggetti aggiuntivi - オブジェクトの増加 + オブジェクト増加 Dodatkowe obiekty + Доп. объекты + Objetos adicionais + Další objekty + 額外物件 + Objets supplémentaires Additional objects to include in the action regardless of Task Radius + Zusätzliche Objekte unabhängig vom Aufgabenradius einbeziehen Oggetti aggiuntivi da includere nell'azione indipendentemente dal Raggio di Attività タスク範囲に関係無くオブジェクトを更に増加させます Dodatkowe obiekty do uwzględnienia w akcji niezależnie od zasięgu zadania + Дополнительные объекты для включения в действие, независимо от радиуса выполнения задачи + Objetos adicionais para incluir na ação, ignorando a distância da tarefa + Další objekty, které mají být zahrnuty do akce, bez ohledu na poloměr úlohy + 無論任務範圍何處,都在行動中包含著額外的物件 + Objets supplémentaires à intégrer dans l'action, quel que soit le rayon de la tâche. Global AI Skill - Compétence global de l'IA + Compétence globale de l'IA Мастерство ботов Globální zkušenosti AI - 総合的な AI スキル + 総合的 AI スキル Globalne umiejętności AI Globale KI-Fähigkeit 서버 인공지능 실력 Abilità AI Globale AI技巧设定 AI技巧設定 + Habilidade Global da IA + Genel AI Yetenekleri General Skill @@ -365,10 +420,12 @@ Abilità Generale 总体技巧 總體技巧 + Habilidade Geral + Genel Yetenekler Changes: general, commanding, courage - Change: general, commanding, courage + Changements : `general`, `commanding`, `courage`. Изменяет: general, commanding, courage Upravuje: general, commanding, courage 変更: general, commanding, courage @@ -378,6 +435,7 @@ Cambia: generale, comando, 改变: 战斗技巧,指挥技巧,勇气大小 改變: 戰鬥技巧,指揮技巧,勇氣大小 + Muda: general, commanding, courage Accuracy @@ -391,10 +449,11 @@ Precisione 精确度 精確度 + Precisão Changes: aimingAccuracy - Change : aimingAccuracy + Changements : `aimingAccuracy`. Изменяет: aimingAccuracy Upravuje: aimingAccuracy 変更: aimingAccuracy @@ -404,10 +463,11 @@ Cambia: aimingAccuracy 改变: 瞄准精确度 改變: 瞄準精確度 + Muda: aimingAccuracy Weapon Handling - Maniement d'armes + Manipulation des armes Владение оружием Zacházení se zbraní 武器の扱い @@ -417,10 +477,11 @@ Uso dell'Arma 武器掌握 武器掌握 + Uso de Arma Changes: aimingShake, aimingSpeed, reloadSpeed - Change : aimingShake, aimingSpeed, reloadSpeed + Changements : `aimingShake`, `aimingSpeed`, `reloadSpeed`. Изменяет: aimingShake, aimingSpeed, reloadSpeed Upravuje: aimingShake, aimingSpeed, reloadSpeed 変更: aimingShake, aimingSpeed, reloadSpeed @@ -430,6 +491,7 @@ Cambia: aimingShake, aimingSpeed, reloadSpeed 改变: 手晃幅度,瞄准速度, 重新装填速度 改變: 手晃幅度,瞄準速度, 重新裝填速度 + Muda: aimingShake, aimingSpeed, reloadSpeed Spotting @@ -443,10 +505,11 @@ Ricognizione 索敌能力 索敵能力 + Detecção Changes: spotDistance, spotTime - Change : spotDistance, spotTime + Changements : `spotDistance`, `spotTime`. Изменяет: spotDistance, spotTime Upravuje: spotDistance, spotTime 変更: spotDistance, spotTime @@ -456,10 +519,11 @@ Cambia: spotDistance, spotTime 改变: 搜索距离, 发现时间 改變: 搜索距離, 發現時間 + Muda: spotDistance, spotTime Seek Cover - Chercher des couvertures + Chercher des couverts Поиск укрытий Vyhledávat krytí 遮蔽 @@ -469,10 +533,11 @@ Cerca Copertura 寻找掩护 尋找掩護 + Procurar Cobertura Should AI seek cover - L'IA devrait elle chercher des couvertures + L'IA se met à couvert. Должны ли боты искать укрытия AI se bude snažit vyhledávat krytí AI は遮蔽を取るようになります @@ -482,6 +547,7 @@ Le AI dovrebbero cercare una copertura 决定AI是否会寻找掩护 決定AI是否會尋找掩護 + A IA dever buscar cobertura Auto Combat @@ -495,10 +561,11 @@ Combattimento Automatico 自动交战 自動交戰 + Combate automático Should AI automatically switch to combat mode - L'IA devrait elle passer automatiquement en mode combat + L'IA passe automatiquement en mode combat. Должны ли боты автоматически переходить в режим боя AI se automaticky přepne do bojového režimu AI は自動的に戦闘状態へ切り替えます @@ -508,10 +575,11 @@ Le AI dovrebbero passare in modalità di combattimento automaticamente 决定AI是否会自动与敌人交战 決定AI是否會自動與敵人交戰 + A IA deveria automaticamente mudar para modo de combate Group Side - Côté du groupe + Camp du groupe Сторона группы Strana skupiny グループ側 @@ -521,6 +589,8 @@ Fazione del Gruppo 小队阵营 小隊陣營 + Lado do Grupo + Tarafı Değiştir Patrol Area @@ -534,6 +604,8 @@ Area di Pattugliamento 巡逻区域 巡邏區域 + Patrulhar Área + Devriye ayarla Toggle Surrender @@ -542,7 +614,7 @@ Přepnout - Vzdávání Aufgabe umschalten Alternar rendição - Basculer en capitulation + Commuter capitulation Kapituláló állapot váltása Сдавшийся (вкл./выкл.) Attivatore Resa @@ -550,6 +622,7 @@ 항복 토글 切换投降 切換投降 + Teslim olmayı Aç/Kapat Add/Remove FRIES @@ -557,10 +630,14 @@ FRIES の追加と削除 패스트로프 추가/제거 Dodaj/usuń FRIES - Aj./Enlève FRIES + Ajouter/Enlever le FRIES Aggiungi/Rimuovi FRIES 增加/移除快速垂降进场撤离系统 增加/移除快速垂降進場撤離系統 + Добавить/Удалить FRIES + Adicionar/Remover FRIES + Přidat/Odebrat FRIES (slaňování) + Ekle/Kaldır FRIES %1 is not fastrope compatible. @@ -568,10 +645,13 @@ %1 はファストロープに対応していません。 %1은 패스트로프하기에 적합하지 않습니다. %1 nie jest kompatybilny ze zjazdem linowym. - %1 n'est pas compatible. + Le %1 n'est pas compatible avec l'aérocordage. %1 non è compatibile con il fastrope. %1无法使用快速绳降系统 %1無法使用快速繩降系統 + %1 несовместим с быстрым спуском + %1 não é compatível com sistema de corda. + %1 není kompatibilní se slaňováním. Unable to remove FRIES, ropes are deployed. @@ -579,10 +659,13 @@ 既にロープが展開されているため、FRIES を削除できません。 패스트로프 제거 불가능, 줄이 이미 배치되었습니다. Nie można usunąć FRIES, liny są wypuszczone. - Pas en mesure d'enlever le FRIES, les cordes ne sont pas déployées. + Impossible d'enlever le FRIES, les cordes sont déployées. Impossibile rimuovere le FRIES, le corde sono ancora dispiegate 无法移除快速绳降系统,因为绳索已被释放出来 無法移除快速繩降系統,因為繩索已被釋放出來 + Невозможно удалить FRIES, канаты развернуты. + Não foi possível remover o FRIES, as cordas estão soltas. + Nemohu odebrat FRIES, lana jsou vytažena. Teleport Players @@ -596,6 +679,9 @@ Teletrasporta Giocatori 传送玩家 傳送玩家 + Teleportar Jogadores + Teletransportadores + Oyuncuları Işınla Player @@ -609,10 +695,13 @@ Giocatore 玩家 玩家 + Jogador + Player + Oyuncu Teleport selected player to module position - Téléporter le joueur sélectionné à la position du module + Téléporte le joueur sélectionné à la position du module. Телепортирует выбранного игрока к местоположению модуля Teleportuje vybraného hráče na pozici modulu 選択したプレイヤーをモジュール位置へ移動します @@ -622,6 +711,7 @@ Teletrasporta il giocatore selezionato nella posizione del modulo 传送选定的玩家至模块位置 傳送選定的玩家至模塊位置 + Teleporta o jogador selecionado para a posição do módulo Teleport Group @@ -635,10 +725,12 @@ Teletrasporta Gruppo 传送小队 傳送小隊 + Teleportar Grupo + Grubu ışınla Teleports all units in group - Téléporte toutes les unités du groupe + Téléporte toutes les unités du groupe. Телепортирует всех юнитов в группе Teleportuje všechny jednotky ve skupině グループ内の全ユニットを移動させます @@ -648,6 +740,8 @@ Teletrasporta tutte le unità del gruppo 传送全部小队成员 傳送全部小隊成員 + Teleporta todas as unidades do grupo + Teletransporta todas las unidades en el grupo Toggle Unconscious @@ -656,7 +750,7 @@ Přepnout - Bezvědomí Bewusstlosigkeit umschalten Alternar inconsciência - Basculer en inconscient + Commuter état de conscience Eszméletlen állapot váltása Без сознания (вкл./выкл.) Attivatore Incoscienza @@ -664,10 +758,11 @@ 기절 토글 切换昏迷 切換昏迷 + Bayıltmayı Aç/Kapat Search Area - Chercher la zone + Zone de recherche Обыскать зону Prohledat oblast 捜索範囲 @@ -677,10 +772,13 @@ Area di Ricerca 搜索区域 搜索區域 + Procurar Área + Área de búsqueda + Bölgeyi Ara Search Nearby Building - Chercher le bâtiment proche + Chercher un bâtiment proche Обыскать ближайшие здания Prohledat nejbližší budovu 近くの建物を捜索します @@ -690,6 +788,8 @@ Cerca Edifici nelle Vicinanze 搜索附近的建筑物 搜索附近的建築物 + Procurar construções próximas + Buscar edificios cercanos Assign Medic @@ -715,7 +815,7 @@ Určit zdravotnické vozidlo Asignar vehículo médico Assegna Veicolo Medico - Assigner véhicule médical + Affecter véhicule sanitaire 医療車両として割り当て 의무 차량 임명 指定医疗载具 @@ -730,7 +830,7 @@ Určit zdravotnické zařízení Asignar instalación médica Assegna Struttura Medica - Assigner installation médicale + Affecter installation sanitaire 医療施設として割り当て 의무 시설 임명 指定医疗设施 @@ -742,25 +842,31 @@ Przełącz symulację シミュレーションを切り替え 재현 토글 - Bascule Simulation + Commuter Simulation Attivatore Simulazione 切换模拟 切換模擬 + Вкл/Выкл симуляцию + Alternar Simulação + Activar simulación + Přepnout simulaci objektu + Similasyonu Aç/Kapat Add Spare Wheel - Adicionar roda sobressalente + Adicionar roda sobressalente (estepe) Dodaj koło zapasowe Добавить запасное колесо Přidat rezervní kolo Aggiungi Ruota di Scorta Ersatzrad hinzufügen Agregar rueda de auxilio - Ajouter pièce de rechange + Ajouter une pièce de rechange 予備タイヤを追加 예비 바퀴 추가 增加备用轮胎 增加備用輪胎 + Tekerlek Ekle Add Spare Track @@ -771,15 +877,16 @@ Aggiungi Cingolo di Scorta Ersatzkette hinzufügen Agregar oruga de repuesto - Ajouter une chenille de secours - 車両へ予備タイヤを追加します。 + Ajouter une chenille de rechange + 車両へ予備タイヤを追加 예비 궤도 추가 增加备用履带 增加備用履帶 + Yedek Parça Ekle Unit must be alive - Utiliser uniquement sur une unité vivante + L'unité doit être vivante. Einheit muss lebendig sein. Utilizar solo en unidades vivas Použitelné jen na živé jednotky @@ -787,15 +894,16 @@ Применимо только к живым юнитам Csak élő egységeken használni Si può fare solo su persone vive - Usar somente em unidades vivas + Unidade deve estar viva ユニットを生存させます 대상이 반드시 살아있어야 합니다 单位必须是活着 單位必須是活著 + Birliğin yaşaması gerekiyor Unit must be infantry - Utiliser uniquement sur du personnel à pied + L'unité doit être un fantassin. Nur bei abgesessener Infanterie verwendbar Utilizar solo en infanteria desmontada Použitelné jen na pěsích jednotkách @@ -803,7 +911,7 @@ Применимо только к пехоте вне техники Csak járműben kívül lévő egységeken használni Si può usare solo su fanteria a piedi - Usar somente em infantaria desmontada + Unidade deve ser uma infantaria desmontada ユニットを歩兵にさせます 대상이 반드시 보병이어야 합니다 单位必须是步兵 @@ -818,7 +926,7 @@ La unidad debe ser una estructura Jednotka musí být budova Si può usare solo su strutture - L'unité doit être une structure + L'unité doit être une structure. ユニットを構造物とします 대상이 반드시 건축물이어야만 합니다 单位必须是建筑 @@ -833,7 +941,7 @@ La unidad debe ser un vehículo Jednotka musí být vozidlo Si può usare solo su veicoli - L'unité doit être un véhicule + L'unité doit être un véhicule. ユニットを車両とします 대상이 반드시 차량이어야만 합니다 单位必须是载具 @@ -848,7 +956,7 @@ L'unità dev'essere un veicolo con spazio di carico Einheit muss ein Fahrzeug mit Ladekapazität sein La unidad debe ser un vehículo con espacio de carga - L'unité doit être un véhicule avec de l'espace de cargaison + L'unité doit être un véhicule muni d'un espace de stockage. ユニットをカーゴ スペースがある車両にします 대상이 반드시 화물을 실을 수 있는 차량이어야 합니다 单位必须是载具且有载货空间 @@ -856,14 +964,14 @@ Unit must have cargo space left - Unidade deve conter espaço sobressalente + Unidade deve conter espaço sobressalente de carga Jednostka musi mieć wolną przestrzeń cargo Юнит должен иметь свободное место в грузовом отсеке Jednotka musí mít místo v úložném prostoru L'unità deve avere spazio di carico disponibile Einheit muss freie Ladekapazität haben La unidad debe tener espacio de carga disponible - L'unité doit avoir de l'espace libre en cargaison + L'unité doit avoir de l'espace de chargement disponible. ユニットへカーゴ スペースを与えます 대상의 화물공간이 남아있어야합니다 单位必须有剩余的载货空间 @@ -876,7 +984,7 @@ Jednotka nemí být vězeň Einheit darf nicht gefangen sein Unidade não pode ser prisioneira - L'unité ne doit pas être captive + L'unité ne doit pas être en captivité. Csak elfogatlan egységeken használni Юнит не должен быть пленным L'unità non dev'essere un prigioniero @@ -887,7 +995,7 @@ Unit must belong to an appropriate side - L'unité doit appartenir à un côté approprié + L'unité doit appartenir à un camp approprié. Юнит должен принадлежать соответствующей стороне Jednotka musí patřit k příslušné straně ユニットを適切な陣営にします @@ -897,10 +1005,12 @@ L'unità deve appartenere ad una fazione coerente 单位必须属于一个合适的一边 單位必須屬於一個合適的一邊 + Unidade deve pertencer á um lado apropriado + La unidad debe pertenecer al bando apropiado Nearest building is too far away - Le bâtiment le plus proche est trop loin + Le bâtiment le plus proche est trop éloigné. Ближайшие здания слишком далеко Nejbližší budova je příliš daleko 近くに建物がありません。 @@ -910,10 +1020,12 @@ L'edificio più vicino è troppo lontano 最近的房子离太远了 最近的房子離太遠了 + A construção mais próxima está longe demais + El edificio más cercano está muy lejos. Place on a unit - Placez sur une unité + Placer sur une unité. Es wurde nichts ausgewählt Nada bajo el ratón Coloque em uma unidade @@ -926,6 +1038,7 @@ 대상에 배치하기 放置在一个单位上 放置在一個單位上 + Bir birim yerleştir Requires an addon that is not present @@ -934,7 +1047,7 @@ Vyžaduje addon, který není přítomen Benötigt ein Addon, das nicht vorhanden ist Requer um addon que não está presente - Requiert un addon qui n'est pas présent + Nécessite un addon qui n'est pas présent. Egy jelenleg hiányzó bővítményt igényel Требуется аддон, который отсутствует Richiede un addon che non è presente @@ -945,18 +1058,45 @@ None + Keiner Niente Żadne + なし + Нет + Nenhum + Ninguno + + Nikdo + Aucun + Hiçbiri Players + Spieler Giocatori Gracze + プレイヤー + Игроки + Jogadores + Jugadores + 玩家 + Hráči + Joueurs + Oyuncular Players and AI + Spieler und KI's Giocati e AI Gracze i SI + プレイヤーと AI + Игроки и ИИ + Jogadores e IA + Jugadores e IA + 玩家與AI + Hráči a AI + Joueurs et IA + Oyuncular ve AI Add Objects to Curator @@ -981,7 +1121,7 @@ Añadir cualquier objeto creado a todos los directores en la misión Přidá jakékoliv spawnuté objekty všem kurátorům v misi Aggiungi ogni oggetto creato a tutti i Curatori in missione - Ajoute n'importe quel objet spawné à tous les curateurs de la mission + Ajoute n'importe quel objet créé à tous les curateurs de la mission. Fügt jedes gespawnte Objekt allen Kuratoren der Mission hinzu ミッション内で作成されたオブジェクトに全キュレーターを追加 미션 내 큐레이터에 모든 생성 물체 추가 @@ -990,7 +1130,7 @@ Cargo: - Cargo : + Cargaison : Груз: Náklad: カーゴ: @@ -1000,13 +1140,21 @@ Cargo: 货物: 貨物: + Carga: + Kargo: Select cargo to unload + Ladung zum ausladen auswählen 選擇要卸載的貨物 Scegli il carico da scaricare 選択したカーゴを降ろす Wybierz ładunek do wyładowania + Выберите груз для выгрузки + Selecione objeto para descarregar + Vyberte náklad na vyložení + Sélectionner une cargaison à décharger + Seçilen kargo boşaltıldı Task Radius @@ -1019,10 +1167,13 @@ Raggio Incarico 目标半径 目標半徑 + Área da tarefa + Radio de tarea + Okruh úkolu Radius to perform the task within - Rayon dans lequel la tâche prend place + Rayon dans lequel effectuer la tâche. Радиус выполнения задания 次の範囲をタスクとして実行 Obszar na którym zadanie powinno zostać wykonane @@ -1031,10 +1182,12 @@ Raggio per eseguire un incarico 设定目标范围半径 設定目標範圍半徑 + Raio para se executar uma tarefa + Okruh ve kterém bude úkol vykonán Invalid radius entered - Rayon invalide entré + Rayon entré invalide. Введен неправильный радиус Vložen neplatný parametr 無効な半径が入力されました @@ -1044,6 +1197,7 @@ Raggio Invalido Inserito 错误的半径值 錯誤的半徑值 + Raio inválido inserido Suppressive Fire @@ -1055,28 +1209,40 @@ 火力壓制 Ogień zaporowy 엄호사격 + Огонь на подавление + Fogo de Supressão + Fuego supresivo + Krycí palba Add Full Arsenal Füge ganzes Arsenal hinzu - Ajouter Arsenal Complet + Ajouter un arsenal complet Aggiungi Arsenale Completo オブジェクトに完全なアーセナルを追加 增加完整的虚拟军火库到物件上 增加完整的虛擬軍火庫到物件上 Dodaj Wirtualny Arsenał 아스날 놓기 + Добавить весь Арсенал + Adicionar Arsenal Completo + Přidat plný arzenál + Arsenal Ekle Remove Arsenal Entferne Arsenal - Retirer Arsenal + Retirer un arsenal Rimuovi Arsenale オブジェクトからアーセナルを削除 移除物件上的虚拟军火库 移除物件上的虛擬軍火庫 Usuń Wirtualny Arsenał 아스날 제거 + Убрать Арсенал + Remover Arsenal + Odebrat arzenál + Arsenali Kaldır Load into Cargo @@ -1087,55 +1253,81 @@ 装载到货物中 화물 싣기 Załaduj do ładunku + Загрузить в отсек + Carregar na carga + Naložit do nákladového prostoru + Charger dans le véhicule Toggle NVGs Nachtsichtgeräte Hinzufügen/Entfernen - Basculer JVN + Commuter JVN Attiva NVGs 暗視装置の切り替え 切換夜視鏡 切换夜视镜 야시경 토글 Przełącz NVG + Вкл/Выкл ПНВ + Alternar Visão Noturna + Přepnout noktovizory NVG Equipment Nachtsichtgeräte - Equipment de vision nocturne + Équipement JVN Attrezzatura NVG 暗視装置 夜視鏡裝備 夜视镜装备 야시경 장비 Ekwipunek NVG + Приборы ночного видения + Equipamento de Visão Noturna + Noktovizory - vybavení + Gece Görüşü Ekipmanı Add or remove NVGs from units Nachtsichtgeräte Hinzufügen/Entfernen - Ajouter ou retirer JVN des unités + Ajoute ou retire l'équipement de vision nocturne aux unités. Aggiunge o rimuove NVGs alle unità ユニットから暗視装置の追加と削除 增加或移除單位的夜視鏡 增加或移除单位的夜视镜 야시경 추가/제거 Dodaj lub usuń noktowizję z jednostek + Добавить/Убрать ПНВ у юнитов + Adiciona ou remove visão noturna de unidades + Přidat nebo odebrat noktovizory jednotkám + Gece Görüşü ekle veya kaldır Toggle Target + Ziel umschalten 目標を切り替え 切换目标 切換目標 Scambia obiettivo Przełącz cel + Кому переключить + Alternar alvo + Objetivo de palanca + Přepnout cíl + Unités cible Units affected by the toggle + Betroffene Spieler beim umschalten ユニットは切り替えに影響を受けます 被选单位受切换影响 受切換所影響的單位 Unità influenzate dallo scambio Jednostki pod wpływem przełączenia + Юниты, к которым применяется переключение + Unidades afetadas pela alteração + Jednotky ovlivněné přepnutím + Unités affectées par le changement. Selected Group @@ -1147,42 +1339,61 @@ 选择小队 그룹 선택 Wybrana grupa + Выбранная группа + Grupo Selecionado + Vybraná skupina + Seçilen Grup Toggle Flashlights Ändere Taschenlampen - Basculer lampes torches + Commuter lampes torches Attiva torce フラッシュライトの切り替え 切換手電筒 切换手电筒 손전등 토글 Przełącz latarki + Вкл/Выкл Фонари + Alternar Lanternas + Alternar linternas + Přepnout svítilny + Feneriı Aç/Kapat Flashlights Taschenlampe - Lampe torche + Lampes torches Torcia フラッシュライト 手電筒 手电筒 손전등 Latarki + Фонари + Lanternas + Linternas + Svítilny + Fenerler Add Gear Ausrüstung hinzufügen - Ajouter équipement + Ajouter du matériel Aggiungi equipaggiamento 装備を追加 增加裝備 增加装备 장비 추가 Dodaj wyposażenie + Добавить снаряжение + Adicionar equipamento + Přidat vybavení + Tekerlek Ekle Garrison Group + Gebäude besetzen Garnir zone 歩哨グループ Proteggi gruppo @@ -1190,9 +1401,13 @@ 布置驻军 그룹 주둔 Rozmieść grupę w garnizonie + Разместить группу в здании + Guarnecer grupo + Umístit posádku (jednotka) Fill from top to bottom + Von oben nach unten befüllen Remplir de haut en bas 上から下まで占拠 Riempi dall'alto al basso @@ -1200,39 +1415,55 @@ 由上而下进行填满 위에서부터 채우기 Wypełnij od góry do dołu + Занять здание сверху до низу + Preencher de cima para baixo + Naplnit odshora dolů Fill buildings from the highest position first - Remplir les bâtiments par la position la plus haute d'abord + Gebäude von der höchsten Position zuerst befüllen + Les bâtiments se remplissent en commençant par le haut. 建物を最も高い位置から占拠していきます Riempi gli edifici dalla posizione più alta prima 從建築物的最高點開始布置衛哨 从建筑物的最高点开始布置卫哨 건물의 높은 위치부터 먼저 채움 Wypełnij budynki zaczynając od najwyższej pozycji + Занять здание начиная с верхних позиций + Preencher construções do lugar mais alto primeiro + Naplní nejdříve nejvyšší pozice v budovách Building filling mode - Mode de remplissage de bâtiment + Gebäude befüllen + Mode de remplissage des bâtiments 建物占拠モード Modalità riempimento edifici 駐軍填充建築物模式 驻军填充建筑物模式 건물 채우기 모드 Tryb wypełniania budynków + Режим заполнения здания + Modo de preenchimento da construção + Režim plnění budov Even filling - Remplissage égal + Gleichmäßig befüllen + Remplissage homogène 均一に占拠 Riempimento uguale 平均分配 平均分配 평균 채우기 Równe wypełnienie + Равномерно + Preenchimento equilibrado + Rovnoměrné plnění Building by building + Gebäude nach Gebäude Bâtiment par bâtiment 建物から建物へ Edificio per edificio @@ -1240,19 +1471,27 @@ 一栋填满后再换下一栋 건물에서 건물로 Budynek za budynkiem + Здание за зданием + Construção por construção + Budova za budovou Random filling - Remplir au hasard + Zufällig füllen + Remplissage aléatoire ランダムに占拠 Riempimento casuale 隨機分配 随机分配 무작위 채우기 Losowe wypełnienie + Случайно + Preenchimento aleatório + Náhodné plnění Teleport + Teleportieren Téléporter テレポート Teletrasporto @@ -1260,9 +1499,15 @@ 传送 순간이동 Teleport + Телепорт + Teleportar + Teletransporte + Teleportovat + Işınla Un-garrison Group + Garnisionsgruppe auflösen Dégarnir zone 非歩哨グループ Non proteggere gruppo @@ -1270,13 +1515,16 @@ 解除驻军驻守状态 주둔해제 Cofnij rozmieszczenie grupu w garnizonie + Вывести группу из здания + Desguarnecer grupo + Zrušit posádku - uvolnit jednotku No players found 沒有玩家找到 没有玩家找到 - Nije pronađen nijedan igrač - Aucun joueur trouvé + Nenalezen žádný hráč + Aucun joueur trouvé. Keine Spieler gefunden Nincsenek játékosok Nessun giocatore trovato @@ -1286,6 +1534,7 @@ Nenhum jogador encontrado Игроки не найдены No se encontraron jugadores + Kullanıcı bulunamadı Assign Repair Vehicle @@ -1299,48 +1548,51 @@ 修理車両を割り当てる 수리 차량 지정 Przydziel pojazd do naprawy - Atribuir veículo de reparação + Definir como veículo de reparo Назначить ремонтный автомобиль Asignar vehículo de reparación + Tamir Aracı Yap Assign Repair Facility 分配修理設施 分配修理设施 Přiřaďte opravu - Affecter une installation de réparation + Affecter un atelier de réparation Zuweisen von Reparatureinrichtung Hozzárendelés javításhoz Assegna struttura di riparazione 修理施設を割り当てる 수리 시설 지정 Przydziel naprawę - Atribuir facilidade de reparação + Definir como oficina de reparo Назначить ремонтный комплекс Asignar instalación de reparación + Tamir Tesisi Yap Assign Engineer 指派工程師 指派工程师 Přiřadit inženýra - Affecter ingénieur + Assigner ingénieur Engineer zuweisen Engedélyezze a mérnököt Assign Engineer 担当エンジニア 엔지니어 지정 Przydziel inżyniera - Encarregar o engenheiro + Definir como engenheiro Назначить инженера Asignar Ingeniero + Mühendis yap Engineer Skill 工程師技能 工程师技能 Inženýrská dovednost - Compétence d'ingénieur + Qualification technique Ingenieur Fähigkeit Mérnöki készség Abilità ingegnere @@ -1350,6 +1602,7 @@ Habilidade do engenheiro Инженерное мастерство Habilidad de Ingeniero + Mühendislik yeteneği Full Heal @@ -1366,6 +1619,7 @@ Cura completa Полное исцеление Totalmente curado + Full Can Suicide Bomber @@ -1382,45 +1636,48 @@ Bombardeiro suicida Террорист-смертник Bombardeo suicida + Intihar Bombacısı Activation Side 激活方 激活方 Aktivační strana - Activation latérale + Camp cible Aktivierungsseite Aktiválási oldal Lato di attivazione 対象陣営 활성화면 Strona aktywacji - Lado de ativação + Explodir em: Сторона активации Lado de activación + Aktivasyon tarafı Activation Radius 激活半徑 激活半径 Aktivační poloměr - Rayon d'activation + Rayon de déclenchement Aktivierungsradius Aktiválási sugár Raggio di attivazione 活性化半径 활성화 반경 Promień aktywacji - Rádio de ativação + Raio de ativação Радиус активации Radio de activación + Aktivasyon yarıçapı Explosion Size 爆炸尺寸 爆炸尺寸 Velikost výbuchu - Taille d'explosion + Taille de l'explosion Explosionsgröße Robbanásméret Dimensione di esplosione @@ -1430,6 +1687,7 @@ Tamanho da Explosão Размер взрыва Tamaño de Explosión + Patlama boyutu Auto Seek @@ -1443,16 +1701,17 @@ 自動誘導 자동 탐색 Auto Seek - Busca automática + Buscar alvos automaticamente Автоматический поиск Búsqueda automática + Otomatik arama Unit will actively try to find and move towards nearby units of the activation side. The range of Auto Seek is based on the unit's spot distance skill with a minimum of 100 meters. 單位將主動嘗試尋找並移動到附近的激活方單位。自動搜索的範圍是基於單位的距離技能,最少100米 单位将主动尝试寻找并移动到附近的激活方单位。自动搜索的范围是基于单位的距离技能,最少100米。 Jednotka se bude aktivně snažit najít a přejít na blízké jednotky na straně aktivace. Rozsah Auto Seek je založen na dovednosti spotové vzdálenosti jednotky s minimem 100 metrů. - L'unité essayera activement de trouver et de se déplacer vers les unités à proximité du côté d'activation. La portée d'Auto Seek est basée sur la compétence de distance de l'unité avec un minimum de 100 mètres. + L'unité essaiera de trouver activement des unités proches appartenant à au camp cible, puis elle se déplacera dans leur direction.\nLa portée de la recherche automatique est basée sur l'aptitude en repérage de l'unité, avec une distance minimale de 100 mètres. Die Einheit versucht aktiv, in der Nähe befindliche Einheiten der Aktivierungsseite zu finden und sich dorthin zu bewegen. Der Bereich der automatischen Suche basiert auf der Fähigkeit der Zielentfernung der Einheit mit einer Mindestentfernung von 100 Metern. Az egység aktívan megpróbálja megtalálni és elmozdulni az aktivációs oldal közeli egységei felé.Az automatikus keresési tartomány az egység helyszíni szakértelmén alapul, legalább 100 méterrel. L'unità cercherà attivamente di trovare e spostarsi verso le unità vicine del lato di attivazione. La gamma di Auto Seek si basa sull'abilità a distanza spot dell'unità con un minimo di 100 metri. @@ -1468,7 +1727,7 @@ 這個單位已經是自殺炸彈手了 这个单位已经是自杀炸弹手了 Jednotka je již samovražedným bombardérem - L'unité est déjà un kamikaze + L'unité est déjà un kamikaze. Die Einheit ist bereits ein Selbstmordattentäter Az egység már öngyilkos bombázó L'unità è già un kamikaze @@ -1478,43 +1737,105 @@ A unidade já é um suicida Единица уже является террористом-смертником La unidad ya es un terrorista suicida + Kişi zaten bir intihar bombacısı Add full ACE Arsenal + Vollständiges ACE Arsenal hinzufügen ACE 武器庫を追加 添加ACE模式军火库 增加完整的ACE軍火庫 Aggiungi l'arsenale ACE completo Dodaj pełny arsenał ACE + Добавить полный ACE Арсенал + Adicionar Arsenal ACE Completo + Añadir ACE Arsenal completo + Přidat plný ACE Arzenál + Ajouter arsenal ACE complet + ACE Arsenal ekle Remove ACE Arsenal + ACE Arsenal entfernen ACE 武器庫を削除 删除ACE模式军火库 移除ACE軍火庫 Rimuovi l'arsenale ACE Usuń arsenał ACE + Убрать ACE Арсенал + Remover Arsenal ACE + Eliminar ACE Arsenal + Odebrat plný ACE Arzenál + Retirer un arsenal ACE + ACE Arsenali sil Create Zeus + Zeus erstellen Создать Зевса Zeus を作る Stwórz Zeus'a Crea Zeus + Criar Zeus + Crear Zeus + 新增宙斯 + Vytvořit Zeuse + Créer Zeus + Zeus oluştur Delete Zeus + Zeus löschen Удалить Зевса Zeus を消す Usuń Zeus'a Cancella Zeus + Apagar Zeus + Eliminar Zeus + 刪除宙斯 + Smazat Zeuse + Supprimer Zeus + Zeus sil "%1" menu + "%1" Menü Меню "%1" "%1" メニュー "%1" menu menu "%1" + Menu "%1" + 選單 %1 + "%1" menu + Menu "%1" + "%1" menü + + + Paradrop Cargo + Ladung abwerfen (Fallschirm) + カーゴを空中投下 + Zrzut ładunku (cargo) + Десантировать груз + Soltar carga de paraquedas + 空投貨物 + Paradrop Cargo + Výsadek nákladu + Paralargage de cargaison + Paraşüt Kargosu + + + No cargo loaded + Keine Ladung geladen + カーゴは未積載 + Niczego nie załadowano do cargo + Грузовой отсек пуст + Nenhuma carga carregada + No hay carga cargada + 沒有貨物裝載 + Nessun carico caricato + Žádný náklad není naložen + Aucune cargaison chargée + Kargo yüklenmedi diff --git a/addons/zeus/ui/Icon_Module_Zeus_ParadropCargo_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_ParadropCargo_ca.paa new file mode 100644 index 00000000000..d1790a405b6 Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_ParadropCargo_ca.paa differ diff --git a/build.bat b/build.bat new file mode 100644 index 00000000000..3392b5bf8d3 --- /dev/null +++ b/build.bat @@ -0,0 +1,3 @@ +@echo off +hemtt.exe build +pause diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 77b01ba2051..00000000000 --- a/circle.yml +++ /dev/null @@ -1,63 +0,0 @@ -version: 2 -jobs: - validate-scripts: - docker: - - image: acemod/sqflint:latest - steps: - - checkout - - run: - name: Validate SQF and Config style - command: python tools/sqf_validator.py && python tools/config_style_checker.py - - linting: - docker: - - image: acemod/sqflint:latest - steps: - - checkout - - run: - name: Lint sqf code - command: sqflint -d addons || true - - armake: - docker: - - image: acemod/armake:master - steps: - - checkout - - run: - name: Version - command: armake --version - - run: - name: Build - command: | - make -j 4 - - update-docs: - docker: - - image: acemod/armake:latest - steps: - - checkout - - run: - name: Update documentation and translation statistics - command: | - if [ "${CIRCLE_BRANCH}" == "master" ] && [ "${CIRCLE_PROJECT_USERNAME}" == "acemod" ]; then - pip install pygithub pygithub3 - python3 tools/deploy.py - else - echo "Skipping, not on acemod/ACE3 master branch..." - fi - -workflows: - version: 2 - build-job: - jobs: - - linting - - validate-scripts - - armake: - requires: - - validate-scripts - - update-docs: - requires: - - armake - filters: - branches: - only: master diff --git a/docs/Dockerfile b/docs/Dockerfile index d8ae94bc6a2..b979f76fe3c 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,6 +1,6 @@ -FROM phpcommunity/github-pages +FROM starefossen/github-pages LABEL maintainer "bux" -COPY ./entrypoint.sh /usr/src/app +COPY entrypoint.sh /usr/local/bin/entrypoint -ENTRYPOINT ["./entrypoint.sh"] +ENTRYPOINT ["/usr/local/bin/entrypoint"] diff --git a/docs/README.zh-TW.md b/docs/README.zh-TW.md new file mode 100644 index 00000000000..933c2b50cb4 --- /dev/null +++ b/docs/README.zh-TW.md @@ -0,0 +1,128 @@ +

+ +

+ +

+ + ACE3 版本 + + + ACE3 問題 + + + ACE3 下載 + + + 波希米亞互動論壇上的文章 + + + ACE3 條款 + + + 加入ACE3 Slack + + + ACE3 建構狀態 + +

+ +

+ 需要最新版本之 CBA A3.
+ 在以下社群網站拜訪我們 推特 | 臉書 | YouTube | Reddit
+

+ +**進階戰鬥環境3(ACE3)** 是由 **進階戰鬥環境2(ACE2)**, **可靠性遊戲模改(AGM)** 以及 **戰鬥空間強化(CSE)**的幕後團隊人員精心打造,用於改善武裝行動三裡面的真實與可靠性。 + +這整個項目是 **開放原始碼**並且樂意接受任何的維護。若要歡迎你建立維護你自訂版本的ACE3,只要你所做的向公眾所做更改是有遵守著「GNU通用公眾授權條款」 ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). + +這個模組架構為 **模組化**設計,所以幾乎任何模組內包含的PBO元件可以輕鬆地從設置來移除。因此,一個團隊可以維護著藉由免除自己沒有打算加入的元件來量身訂製的ACE3版本,或者如果有與其他模組衝突。模塊本身,例如醫療系統,那就可以簡單的去除掉。而且,也包含許多可自訂義的設定,允許任務設計者來為整體的任務體驗從頭到尾的調教。 + +## 核心功能 + +- 全新的立體互動/動作系統 +- 可靠又高效的框架 +- 專注於可模組化與可自訂性 +- 客戶端及伺服端全新的靈活的設置及配置 +- 改進醫療系統並劃分為多層次(基礎/進階)以此專注於遊玩向或者真實向體驗 +- 透過網路同步的精確且一致的天氣 +- 以風和天氣為考量的彈道系統 +- 戰俘系統 +- 爆裂物系統,內含不同的觸發爆裂物的類型 +- 地圖畫面的改進 - 標記的擺放以及地圖工具 +- 後勤系統 +- 進階的飛彈引導以及雷射指示器 + +### 添加功能 + +- 揹起與拖動。 +- 還原真實世界的載具及武器名稱 +- 裝甲載具以及直升機有著火控系統(FCS) +- 以C/C++編寫的真實彈道及火控運算插件 +- 尾焰以及高壓範圍的模擬 +- 一次性使用發射器 +- 真實G力 +- 載具上鎖系統 +- 真實的熱傳導以及夜視模式 +- 彈匣重填功能 +- 真實的武器過熱機制 +- 戰鬥耳聾(暫時性失去聽覺)模擬 +- 改進行動後預覽以及火力掩護 +- 可調性狙擊槍瞄具 +- 當放下武器時沒有閒置動作 +- 去除說話中玩家的提示 +- 跳過障礙物,翻牆以及割開柵欄。 +- Vector望遠鏡, 微型軍用GPS接收器以及獵隼4500測風儀裝置
+***不只這些呢...*** + +## 新手起步 + +ACE3需要最新版本的武裝行動3以及最新版本的 CBA A3模組。以下的網頁可用於幫助以及提供安裝ACE3上的資訊。 +- [安裝指南-英文](https://ace3mod.com/wiki/user/installation-guide.html) +- [資訊中心-英文](https://ace3mod.com/wiki/user/information-center.html) + +## 維護 + +你透過幫忙找出我們原始碼的漏洞來幫助我們接下來的開發,或者維護著新功能。我們總是歡迎提交漏洞修補以及程式碼重構或者新功能。我們有列出我們遇到的問題或者目標在Github上如果有想要維護的話請在問題上留言避免多餘重複的付出。 + +### 維護指南 + +如果想要維護ACE3的某個部件的話, 簡單的分支該儲存庫並申請提交來讓合作者檢視。請記得如果你有修改PBO部件請將自己加入到作者們的文件 - [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt);包括可連絡的電子信箱。 + +### 提交問題或者申請功能 + +麻煩,請使用我們的 [問題追蹤](https://github.com/acemod/ACE3/issues)來回報漏洞,想要的功能,或者建議調整目前已有的功能,也請到以下參閱: +- [如何回報問題-英文](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [如何申請功能-英文](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) + +### 測試與建構。 + +若要幫助我們測試最新的開發版所造成的更改,下載我們的主分支([直接下載](https://github.com/acemod/ACE3/archive/master.zip),或者 [git](https://help.github.com/articles/fetching-a-remote/)),然後用於編譯組建: + +- [設置開發環境-英文](https://ace3mod.com/wiki/development/setting-up-the-development-environment.html) –一步一步的引導如何為了測試目的來正確的建構ACE3 + +### 聯繫 + + + + + + + + + + + + + + + + + + + + +
Slack我們有著公共的Slack團隊供大家加入,而該模組所有開發者以及維護者也會在此出現並公告
推特你可以追隨我們的推特帳號來獲得更新消息以及一些指南聯結。
臉書你可以追隨我們的臉書帳號來獲得更新消息以及一些指南聯結。
波希米亞論壇我們在波希米亞互動論壇上也有專門的ACE3之文章
+ +## 條款 + +ACE3遵守在GNU通用公眾授權條款之下 ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). diff --git a/docs/_config.yml b/docs/_config.yml index 8db58136dac..3f37e6004bd 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -8,17 +8,17 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 12 - patch: 5 - build: 40 + minor: 13 + patch: 3 + build: 52 acex: githubUrl: https://github.com/acemod/ACEX version: major: 3 - minor: 4 - patch: 1 - build: 11 + minor: 5 + patch: 3 + build: 21 markdown: kramdown diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index 28ce7d695ab..4eefeb933bd 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -8,17 +8,17 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 12 - patch: 4 - build: 39 + minor: 13 + patch: 2 + build: 49 acex: githubUrl: https://github.com/acemod/ACEX version: major: 3 - minor: 4 - patch: 0 - build: 10 + minor: 5 + patch: 2 + build: 19 markdown: kramdown diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 216b1355e2c..e8130732caf 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -26,6 +26,10 @@ `ace_common` {% endif %} +{% if include.component == "artillerytables" %} +`ace_interaction` +{% endif %} + {% if include.component == "atragmx" %} `ACE_Advanced_Ballistics`, `ACE_common`, `ACE_weather` {% endif %} @@ -43,7 +47,7 @@ {% endif %} {% if include.component == "captives" %} -`ACE_Interaction` +`ace_interaction` {% endif %} {% if include.component == "cargo" %} @@ -66,12 +70,16 @@ `ace_common` {% endif %} +{% if include.component == "csw" %} +`ace_interaction` +{% endif %} + {% if include.component == "dagr" %} `ace_weather` {% endif %} {% if include.component == "disarming" %} -`ACE_Interaction` +`ace_interaction` {% endif %} {% if include.component == "disposable" %} @@ -86,6 +94,10 @@ `ace_interaction` {% endif %} +{% if include.component == "dragon" %} +`ace_hot`, `ace_csw` +{% endif %} + {% if include.component == "explosives" %} `ace_interaction` {% endif %} @@ -219,19 +231,51 @@ {% endif %} {% if include.component == "medical" %} -`ace_interaction`, `ace_apl` +`ace_medical_engine` {% endif %} {% if include.component == "medical_ai" %} -`ace_medical` +`ace_medical_treatment` {% endif %} {% if include.component == "medical_blood" %} -`ace_main` +`ace_medical_status` +{% endif %} + +{% if include.component == "medical_damage" %} +`ace_medical_engine` +{% endif %} + +{% if include.component == "medical_engine" %} +`ace_common` +{% endif %} + +{% if include.component == "medical_feedback" %} +`ace_medical_status` +{% endif %} + +{% if include.component == "medical_gui" %} +`ace_medical_treatment`, `ace_interaction` +{% endif %} + +{% if include.component == "medical_statemachine" %} +`ace_medical_vitals` +{% endif %} + +{% if include.component == "medical_status" %} +`ace_medical_engine` {% endif %} -{% if include.component == "medical_menu" %} -`ace_medical` +{% if include.component == "medical_treatment" %} +`ace_medical_status`, `ace_medical_damage`, `ace_apl` +{% endif %} + +{% if include.component == "medical_vitals" %} +`ace_medical_status` +{% endif %} + +{% if include.component == "metis" %} +`ace_missileguidance` {% endif %} {% if include.component == "microdagr" %} @@ -251,7 +295,7 @@ {% endif %} {% if include.component == "mk6mortar" %} -`ace_interaction` +`ace_csw`, `ace_artillerytables` {% endif %} {% if include.component == "modules" %} @@ -311,7 +355,7 @@ {% endif %} {% if include.component == "pylons" %} -`ace_interact_menu`, `ace_zeus` +`ace_interact_menu` {% endif %} {% if include.component == "quickmount" %} @@ -323,11 +367,11 @@ {% endif %} {% if include.component == "realisticnames" %} -`ace_common` +`ace_common`, `ace_optics` {% endif %} {% if include.component == "realisticweights" %} -`ace_common` +`ace_common`, `ace_disposable` {% endif %} {% if include.component == "rearm" %} @@ -439,7 +483,7 @@ {% endif %} {% if include.component == "winddeflection" %} -`ace_weather` +`ace_common` {% endif %} {% if include.component == "yardage450" %} @@ -471,19 +515,19 @@ {% endif %} {% if include.component == "compat_rhs_afrf3" %} -`ace_rearm`, `ace_refuel`, `ace_repair`, `rhs_c_weapons`, `rhs_c_troops`, `rhs_c_bmd`, `rhs_c_bmp`, `rhs_c_bmp3`, `rhs_c_a2port_armor`, `rhs_c_btr`, `rhs_c_sprut`, `rhs_c_t72`, `rhs_c_tanks`, `rhs_c_a2port_air`, `rhs_c_a2port_car`, `rhs_c_cars`, `rhs_c_trucks`, `rhs_c_2s3`, `rhs_c_rva`, `rhs_c_heavyweapons` +`ace_explosives`, `ace_csw`, `ace_rearm`, `ace_refuel`, `ace_repair`, `rhs_c_weapons`, `rhs_c_airweapons`, `rhs_c_troops`, `rhs_c_bmd`, `rhs_c_bmp`, `rhs_c_bmp3`, `rhs_c_a2port_armor`, `rhs_c_btr`, `rhs_c_sprut`, `rhs_c_t72`, `rhs_c_tanks`, `rhs_c_a2port_air`, `rhs_c_a2port_car`, `rhs_c_cars`, `rhs_c_trucks`, `rhs_c_2s3`, `rhs_c_rva`, `rhs_c_heavyweapons` {% endif %} {% if include.component == "compat_rhs_gref3" %} -`rhsgref_main`, `rhsgref_c_weapons` +`ace_explosives`, `ace_csw`, `rhsgref_main`, `rhsgref_c_weapons` {% endif %} {% if include.component == "compat_rhs_usf3" %} -`ace_javelin`, `ace_rearm`, `ace_refuel`, `ace_repair`, `rhsusf_c_weapons`, `rhsusf_c_troops`, `rhsusf_c_m1a1`, `rhsusf_c_m1a2`, `RHS_US_A2_AirImport`, `rhsusf_c_m109`, `rhsusf_c_HEMTT_A4`, `rhsusf_c_hmmwv`, `rhsusf_c_rg33`, `rhsusf_c_fmtv`, `rhsusf_c_m113`, `RHS_US_A2Port_Armor`, `rhsusf_c_melb` +`ace_explosives`, `ace_javelin`, `ace_rearm`, `ace_refuel`, `ace_repair`, `ace_csw`, `rhsusf_c_weapons`, `rhsusf_c_troops`, `rhsusf_c_m1a1`, `rhsusf_c_m1a2`, `RHS_US_A2_AirImport`, `rhsusf_c_m109`, `rhsusf_c_HEMTT_A4`, `rhsusf_c_hmmwv`, `rhsusf_c_rg33`, `rhsusf_c_fmtv`, `rhsusf_c_m113`, `RHS_US_A2Port_Armor`, `rhsusf_c_melb` {% endif %} {% if include.component == "compat_rksl_pm_ii" %} -`RKSL_PMII` +`RKSL_PMII`, `RKSL_PMII_525` {% endif %} {% if include.component == "compat_sma3_iansky" %} @@ -506,6 +550,10 @@ `ace_common` {% endif %} +{% if include.component == "realisticdispersion" %} +`ace_ballistics` +{% endif %} + {% if include.component == "tracers" %} `ace_ballistics` {% endif %} diff --git a/docs/_posts/2019-12-18-medical-rewrite.md b/docs/_posts/2019-12-18-medical-rewrite.md new file mode 100644 index 00000000000..ae278adaa1a --- /dev/null +++ b/docs/_posts/2019-12-18-medical-rewrite.md @@ -0,0 +1,46 @@ +--- +title: Medical Rewrite +description: Status report on the ACE3 Medical Rewrite +parent: posts +image: +author: Glowbal, mharis001 +layout: post +--- + +One of ACE3's longest development projects (and probably most discussed) is the Medical Rewrite. Started back in July 2016, the medical rewrite received contributions by over a dozen individual contributors. Unfortunately, it has taken a bit more time than we originally hoped. + +Fortunately, thanks to recent strides, the project is approaching its end. Meaning, over the next couple weeks, the focus will shift into finalizing the last bits and pieces of the rewrite. + + + +Along with this final push, a release candidate has been prepared in order to gather additional feedback (more on this below). + +## Medical Rewrite? + +The medical component is one of the most used features from ACE3. It does a lot of things well, however, in some areas it falls short. It is prone to weird behaviour that is difficult to fix, or features we are just not happy with. + +Besides things affecting gameplay, the medical component's code is quite complex. This is a large obstacle against the introduction of fixes or new features. The medical rewrite aims to address both the issues with gameplay and the code. + +It does this by removing the concept of "Basic vs Advanced Medical", instead opting to provide users a set of settings to more finely tweak the medical system to their liking. A major push has been made in cleaning up (and removing) settings that were unclear or unnecessary. Our goal was to provide settings that offer granular control of the system, all while keeping it clear exactly what each setting does. + +In addition, the entire system has been split up into multiple smaller, more approachable parts (meaning you will see a couple new PBOs for medical). + +## Backwards Compatibility + +We have always attempted to maintain backwards compatibility whenever possible. This has been our policy for the past 4 years. We have also tried to do this for the medical rewrite, however due to significant changes to the entire system, complete backwards compatibility is not possible for the rewrite. + +We know there are some communities and mods out there that depend on functions or code from ACE3 Medical. If you or your project depend on ACE3 Medical, we encourage you to try out the medical rewrite release candidate. This way, if any functionality you depend on is no longer available or is different with the new system, we can assist you in migrating over to the new system or include a patch to fix it on our side. + +## Release Candidate and Feedback Survey + +As mentioned earlier, a [release candidate](https://github.com/acemod/ACE3/releases/tag/v3.13.0-rc1) of the medical rewrite is available to give players and communities the opportunity to provide feedback before its public release. We will continue to utilize user feedback after release to further improve and expand the system. + +In order to make it easier for both users to submit feedback and us to utilize it towards balancing the new medical system and fix any issues, a [feedback survey](https://forms.gle/5pKeXMJ5hfZYjuxZ6) is also available. + +## Closing Remarks + +The medical rewrite will be released publicly in ACE3 v3.13.0. It will bring an exciting, more streamlined medical system to ACE3 for players and communities to explore. + +We are still in need for translations for some languages within the ACE3 project. Please have a look at [this GitHub issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is very appreciated. + +Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. diff --git a/docs/_posts/2019-12-31-ace3-version3130.md b/docs/_posts/2019-12-31-ace3-version3130.md new file mode 100644 index 00000000000..21390cb8510 --- /dev/null +++ b/docs/_posts/2019-12-31-ace3-version3130.md @@ -0,0 +1,117 @@ +--- +title: ACEREP #00010 +description: Status report on ACE3 version 3.13.0 +parent: posts +image: /img/news/191231_medical1.jpg +author: alganthe, mharis001 +layout: post +--- + +This post marks the release of ACE3 v3.13.0 and, as a result, the public release of the medical rewrite. The [previous news post]({{site.baseUrl}}/2019/12/18/medical-rewrite.html) provided perspective on the guiding principles and goals of the medical rewrite. In this post, we detail the key changes of the rewrite in order to give users a better starting point as they explore ACE3's new medical system. + + + +As the name suggests, the medical rewrite was a complete overhaul of the medical system. The majority of the changes and improvements were made to the code base and as a result will not always be noticeable to end users. However, a better code base sets the stage for easier and faster development of the system in the future, opening possibilities for more features. + +
+
+ A medic treating a wounded soldier while another holds security. +
+
+ +### Medical Settings + +Customizability through settings has always been at the heart (no pun intended) of ACE3's medical system. Immediately, users will notice the absence of any differentiation between _basic_ and _advanced_ medical and the removal of some settings. Instead, the settings have been cleaned up and changed to offer granular control over the system, all while keeping it clear exactly what each setting does. The settings are also sorted into more approachable sub-categories. + +Most of the changes described below can be controlled and fine tuned (or even disabled) to better suit the needs of individual users and communities. + +### Fractures + +Fractures are a new addition to the medical system. A direct hit to a limb has a chance to cause a fracture, a fractured limb will cause a person to be at a severe disadvantage. Leg fractures will cause a person to limp whereas arm fractures will lead to severe aiming shake. + +The only way to treat a fracture is by using a splint. These are single use and anyone can apply one to themselves or others. + +Fractures are shown as a bone overlay on their associated limb on the body image displays. The color of the bone describes the current state of the fracture: + +- a red bone indicates an untreated fracture. +- a blue bone indicates a treated fracture (and may prevent the patient from sprinting depending on settings) + +Lastly, fractures have a unique set of sounds that play when they occur and **induce severe amounts of pain**. + +### Damage and Vitals + +Changes have been made to the way damage is handled, only direct hits to the torso or head can be immediately fatal if the incoming damage is high enough. All other wounds induce bleeding and later cardiac arrest. + +Pain is now part of the vitals loop, meaning that pain caused by an injury will affect heart rate. Severe amounts of pain and blood loss can cause the heart rate to reach extremely high values and make the patient run the risk of cardiac arrest. + +In those scenarios adenosine can be used to reduce the heart rate while open wounds are treated, morphine could also be used but it has a much longer time in system than adenosine. + +Bleeding requires consistent attention otherwise you risk the patient going into cardiac arrest. Consequently, cardiac arrest scenarios will be much more common, learning to treat them accordingly will be crucial. + +The first signs of trauma induced cardiac arrest are: + +- large amount of blood loss. +- the heart rate will quickly rise, at this stage fluids and possibly adenosine could save the patient. +- the heart rate and blood pressure are zero, at this point there is only a small amount of time available to take action. + +Once a patient enters cardiac arrest the best option is to designate multiple people to work on the patient. One being assigned to procuring CPR non-stop until vitals return, others treating open wounds, providing fluids and checking vitals. + +### User Interface + +Body image coloration has been improved to better describe the current state of the patient as follows: + +- Light Yellow to Dark Red: bleeding wound(s), darker means faster bleeding rate. +- Dark Blue: bandaged wound(s). +- Light Blue: stitched. + +These colors are now also used for the interaction menu medical icons. In addition, limbs with tourniquets appear with a circle around the medical cross. + +Wound descriptions are prefixed to indicate if they are bandaged `[B]` or stitched `[S]`. + +
+
+ The new medical body image coloration. +
+
+ +### Feedback Effects + +Pain effects have been reworked to cause less visual strain while still maintaining their intensity. In addition, there are now four pain effect types: white pulsing, chromatic aberration, pulsing blur, and only high pain blur. + +Unconsciousness in now preceded by a ragdoll and unconsciousness effects have been reworked. + +### Stitching and IVs + +Stitching no longer requires the patient to be stable, instead, it can be performed whenever a patient has any stitchable wounds. A stitchable wound is a bandaged wound on a body part that does not have any bleeding wounds. + +Self stitching can now be controlled through a setting (disabled by default). + +Similarly, self IV transfusion can also be controlled though a setting (enabled by default). A setting to control the flow rate of IVs was added. + +### Items + +Atropine has been removed and will be replaced with adenosine if item conversion is not disabled through settings. + +As mentioned previously, a splint item was added to serve as the treatment for fractures. + +Equipment sharing has been properly implemented and is controllable through its setting. It can either be: + +- enabled, and set to use the patient's equipment first. +- enabled, and set to use the medic's equipment first. +- or, disabled completely. + +### Other Changes + +Medical AI has received several healing logic improvements and should respond more consistently to different situations. + +It is faster to treat others than yourself, medics are also faster in performing treatments. Carrying animations have been sped up. + +### The End Things + +The [feedback survey](https://forms.gle/5pKeXMJ5hfZYjuxZ6) is still available and we will continue to utilize user feedback to balance the new medical system and fix any issues with future ACE3 releases. + +The change log for ACE3 v3.13.0 can be found [here](https://github.com/acemod/ACE3/releases/v3.13.0). + +We are still in need for translations for some languages within the ACE3 project. Please have a look at [this GitHub issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is very appreciated. + +Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. diff --git a/docs/css/app.css b/docs/css/app.css index 8130470b226..505903a5d06 100644 --- a/docs/css/app.css +++ b/docs/css/app.css @@ -1,4 +1,4 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}meta.foundation-version{font-family:"/5.5.1/"}meta.foundation-mq-small{font-family:"/only screen/";width:0em}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0em}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;padding:0;margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}[class*="block-grid-"]{display:block;padding:0;margin:0 -.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;height:auto;float:left;padding:0 .625rem 1.25rem}@media only screen{.small-block-grid-1>li{width:100%;list-style:none}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{width:50%;list-style:none}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{width:33.3333333333%;list-style:none}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{width:25%;list-style:none}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{width:20%;list-style:none}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{width:16.6666666667%;list-style:none}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{width:14.2857142857%;list-style:none}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{width:12.5%;list-style:none}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{width:11.1111111111%;list-style:none}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{width:10%;list-style:none}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{width:9.0909090909%;list-style:none}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{width:8.3333333333%;list-style:none}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{width:100%;list-style:none}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{width:50%;list-style:none}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{width:33.3333333333%;list-style:none}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{width:25%;list-style:none}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{width:20%;list-style:none}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{width:16.6666666667%;list-style:none}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{width:14.2857142857%;list-style:none}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{width:12.5%;list-style:none}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{width:11.1111111111%;list-style:none}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{width:10%;list-style:none}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{width:9.0909090909%;list-style:none}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{width:8.3333333333%;list-style:none}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{width:100%;list-style:none}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{width:50%;list-style:none}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{width:33.3333333333%;list-style:none}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{width:25%;list-style:none}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{width:20%;list-style:none}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{width:16.6666666667%;list-style:none}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{width:14.2857142857%;list-style:none}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{width:12.5%;list-style:none}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{width:11.1111111111%;list-style:none}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{width:10%;list-style:none}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{width:9.0909090909%;list-style:none}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{width:8.3333333333%;list-style:none}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}button,.button{border-style:solid;border-width:0;cursor:pointer;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.25rem;position:relative;text-decoration:none;text-align:center;-webkit-appearance:none;-moz-appearance:none;border-radius:0;display:inline-block;padding-top:1rem;padding-right:2rem;padding-bottom:1.0625rem;padding-left:2rem;font-size:1rem;background-color:#ba2619;border-color:#951e14;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#951e14}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding-top:1.125rem;padding-right:2.25rem;padding-bottom:1.1875rem;padding-left:2.25rem;font-size:1.25rem}button.small,.button.small{padding-top:.875rem;padding-right:1.75rem;padding-bottom:.9375rem;padding-left:1.75rem;font-size:.8125rem}button.tiny,.button.tiny{padding-top:.625rem;padding-right:1.25rem;padding-bottom:.6875rem;padding-left:1.25rem;font-size:.6875rem}button.expand,.button.expand{padding-right:0;padding-left:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:.75rem}button.right-align,.button.right-align{text-align:right;padding-right:.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#ba2619;border-color:#951e14;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#951e14}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#ba2619}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}.clearing-thumbs,[data-clearing]{margin-bottom:0;margin-left:0;list-style:none}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.clearing-touch-label{position:absolute;top:50%;left:50%;color:#aaa;font-size:0.6em}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;transform:translateY(-50%) translateX(-50%);-webkit-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{color:#ccc;font-size:.875em;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#333;width:100%;padding:10px 30px 20px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:30px;line-height:1;color:#ccc;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 12px}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:0.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:120px;min-height:inherit;float:left;overflow:hidden;margin-right:0;padding:0;position:relative;cursor:pointer;opacity:0.4;clear:none}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:0.8}.clearing-assembled .clearing-container .visible-img{background:#333;overflow:hidden;height:85%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}form{margin:0 0 1rem}form .row .row{margin:0 -.5rem}form .row .row .column,form .row .row .columns{padding:0 .5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:.5rem}label{font-size:.875rem;color:#4d4c4c;cursor:pointer;display:block;font-weight:400;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;border-style:solid;border-width:1px;overflow:visible;font-size:.875rem;height:2.3125rem;line-height:2.3125rem}.postfix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;border-radius:0;background-color:#fff;font-family:inherit;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:.875rem;margin:0 0 1rem 0;padding:.5rem;height:2.3125rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:all .15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}select{-webkit-appearance:none !important;border-radius:0;background-color:#FAFAFA;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;padding:.5rem;font-size:.875rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;color:rgba(0,0,0,0.75);line-height:normal;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f2f2;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;padding:1.25rem;margin:1.125rem 0}fieldset legend{font-weight:700;background:#fff;padding:0 .1875rem;margin:0;margin-left:-.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error>label>small{color:#676767;background:transparent;padding:0;text-transform:capitalize;font-style:normal;font-size:60%;margin:0;display:inline}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5rem}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-.9375rem;margin-right:-.9375rem;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}@media only screen{.small-push-0{position:relative;left:0%;right:auto}.small-pull-0{position:relative;right:0%;left:auto}.small-push-1{position:relative;left:8.3333333333%;right:auto}.small-pull-1{position:relative;right:8.3333333333%;left:auto}.small-push-2{position:relative;left:16.6666666667%;right:auto}.small-pull-2{position:relative;right:16.6666666667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.3333333333%;right:auto}.small-pull-4{position:relative;right:33.3333333333%;left:auto}.small-push-5{position:relative;left:41.6666666667%;right:auto}.small-pull-5{position:relative;right:41.6666666667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.3333333333%;right:auto}.small-pull-7{position:relative;right:58.3333333333%;left:auto}.small-push-8{position:relative;left:66.6666666667%;right:auto}.small-pull-8{position:relative;right:66.6666666667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.3333333333%;right:auto}.small-pull-10{position:relative;right:83.3333333333%;left:auto}.small-push-11{position:relative;left:91.6666666667%;right:auto}.small-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.3333333333%}.small-2{width:16.6666666667%}.small-3{width:25%}.small-4{width:33.3333333333%}.small-5{width:41.6666666667%}.small-6{width:50%}.small-7{width:58.3333333333%}.small-8{width:66.6666666667%}.small-9{width:75%}.small-10{width:83.3333333333%}.small-11{width:91.6666666667%}.small-12{width:100%}.small-offset-0{margin-left:0% !important}.small-offset-1{margin-left:8.3333333333% !important}.small-offset-2{margin-left:16.6666666667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.3333333333% !important}.small-offset-5{margin-left:41.6666666667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.3333333333% !important}.small-offset-8{margin-left:66.6666666667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.3333333333% !important}.small-offset-11{margin-left:91.6666666667% !important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0%;right:auto}.medium-pull-0{position:relative;right:0%;left:auto}.medium-push-1{position:relative;left:8.3333333333%;right:auto}.medium-pull-1{position:relative;right:8.3333333333%;left:auto}.medium-push-2{position:relative;left:16.6666666667%;right:auto}.medium-pull-2{position:relative;right:16.6666666667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.3333333333%;right:auto}.medium-pull-4{position:relative;right:33.3333333333%;left:auto}.medium-push-5{position:relative;left:41.6666666667%;right:auto}.medium-pull-5{position:relative;right:41.6666666667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.3333333333%;right:auto}.medium-pull-7{position:relative;right:58.3333333333%;left:auto}.medium-push-8{position:relative;left:66.6666666667%;right:auto}.medium-pull-8{position:relative;right:66.6666666667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.3333333333%;right:auto}.medium-pull-10{position:relative;right:83.3333333333%;left:auto}.medium-push-11{position:relative;left:91.6666666667%;right:auto}.medium-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.3333333333%}.medium-2{width:16.6666666667%}.medium-3{width:25%}.medium-4{width:33.3333333333%}.medium-5{width:41.6666666667%}.medium-6{width:50%}.medium-7{width:58.3333333333%}.medium-8{width:66.6666666667%}.medium-9{width:75%}.medium-10{width:83.3333333333%}.medium-11{width:91.6666666667%}.medium-12{width:100%}.medium-offset-0{margin-left:0% !important}.medium-offset-1{margin-left:8.3333333333% !important}.medium-offset-2{margin-left:16.6666666667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.3333333333% !important}.medium-offset-5{margin-left:41.6666666667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.3333333333% !important}.medium-offset-8{margin-left:66.6666666667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.3333333333% !important}.medium-offset-11{margin-left:91.6666666667% !important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0%;right:auto}.large-pull-0{position:relative;right:0%;left:auto}.large-push-1{position:relative;left:8.3333333333%;right:auto}.large-pull-1{position:relative;right:8.3333333333%;left:auto}.large-push-2{position:relative;left:16.6666666667%;right:auto}.large-pull-2{position:relative;right:16.6666666667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.3333333333%;right:auto}.large-pull-4{position:relative;right:33.3333333333%;left:auto}.large-push-5{position:relative;left:41.6666666667%;right:auto}.large-pull-5{position:relative;right:41.6666666667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.3333333333%;right:auto}.large-pull-7{position:relative;right:58.3333333333%;left:auto}.large-push-8{position:relative;left:66.6666666667%;right:auto}.large-pull-8{position:relative;right:66.6666666667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.3333333333%;right:auto}.large-pull-10{position:relative;right:83.3333333333%;left:auto}.large-push-11{position:relative;left:91.6666666667%;right:auto}.large-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.3333333333%}.large-2{width:16.6666666667%}.large-3{width:25%}.large-4{width:33.3333333333%}.large-5{width:41.6666666667%}.large-6{width:50%}.large-7{width:58.3333333333%}.large-8{width:66.6666666667%}.large-9{width:75%}.large-10{width:83.3333333333%}.large-11{width:91.6666666667%}.large-12{width:100%}.large-offset-0{margin-left:0% !important}.large-offset-1{margin-left:8.3333333333% !important}.large-offset-2{margin-left:16.6666666667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.3333333333% !important}.large-offset-5{margin-left:41.6666666667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.3333333333% !important}.large-offset-8{margin-left:66.6666666667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.3333333333% !important}.large-offset-11{margin-left:91.6666666667% !important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}.inline-list{margin:0 auto 1.0625rem auto;margin-left:-1.375rem;margin-right:0;padding:0;list-style:none;overflow:hidden}.inline-list>li{list-style:none;float:left;margin-left:1.375rem;display:block}.inline-list>li>*{display:block}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#f6c4bf;margin-bottom:1.25rem;padding:1.25rem;background:#fdf0ef;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#ba2619}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#a02116}.panel.radius{border-radius:3px}.side-nav{display:block;margin:0;padding:.875rem 0;list-style-type:none;list-style-position:outside;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li{margin:0 0 .4375rem 0;font-size:.875rem;font-weight:400}.side-nav li a:not(.button){display:block;color:#ba2619;margin:0;padding:.4375rem .875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#e65346}.side-nav li.active>a:first-child:not(.button){color:#e65346;font-weight:400;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#fff}.side-nav li.heading{color:#ba2619;font-size:.875rem;font-weight:bold;text-transform:uppercase}table{background:#fff;margin-bottom:1.25rem;border:solid 1px #ddd;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#f5f5f5}table thead tr th,table thead tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tfoot{background:#f5f5f5}table tfoot tr th,table tfoot tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tr th,table tr td{padding:.5625rem .625rem;font-size:.875rem;color:#222;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.th{line-height:0;display:inline-block;border:solid 4px #fff;max-width:100%;box-shadow:0 0 0 1px rgba(0,0,0,0.2);transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(186,38,25,0.5)}.th.radius{border-radius:3px}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{width:100%;left:0;position:fixed;top:0;z-index:99}.fixed.expanded:not(.top-bar){overflow-y:auto;height:auto;width:100%;max-height:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{z-index:98;margin-top:2.8125rem}.top-bar{overflow:hidden;height:2.8125rem;line-height:2.8125rem;position:relative;background:#333;margin-bottom:0}.top-bar ul{margin-bottom:0;list-style:none}.top-bar .row{max-width:none}.top-bar form,.top-bar input{margin-bottom:0}.top-bar input{height:1.75rem;padding-top:.35rem;padding-bottom:.35rem;font-size:.75rem}.top-bar .button,.top-bar button{padding-top:0.4125rem;padding-bottom:0.4125rem;margin-bottom:0;font-size:.75rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{position:relative;margin:0}.top-bar .name{height:2.8125rem;margin:0;font-size:16px}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{line-height:2.8125rem;font-size:1.0625rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{font-weight:400;color:#fff;width:75%;display:block;padding:0 .9375rem}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;text-transform:uppercase;font-size:.8125rem;font-weight:700;position:relative;display:block;padding:0 .9375rem;height:2.8125rem;line-height:2.8125rem}.top-bar .toggle-topbar.menu-icon{top:50%;margin-top:-16px}.top-bar .toggle-topbar.menu-icon a{height:34px;line-height:33px;padding:0 2.5rem 0 .9375rem;color:#fff;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-8px;right:.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{padding:0;width:100%;height:auto;display:block;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1919;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:.9375rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:.8125rem;font-weight:400;text-transform:none}.top-bar-section ul li>a.button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#951e14}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#951e14}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;background:#333;color:#fff}.top-bar-section ul li.active>a{background:#ba2619;color:#fff}.top-bar-section ul li.active>a:hover{background:#a02116;color:#fff}.top-bar-section .has-form{padding:.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{padding:0;position:absolute;left:100%;top:0;z-index:99;display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .dropdown li{width:100%;height:auto}.top-bar-section .dropdown li a{font-weight:400;padding:8px .9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:400}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px .9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{padding:8px .9375rem 2px;margin-bottom:0;text-transform:uppercase;color:#777;font-weight:700;font-size:.625rem}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar .button,.top-bar button{font-size:.875rem;position:relative;height:1.75rem;top:.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{max-width:62.5rem;margin:0 auto;margin-bottom:0}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{width:auto;height:auto !important;display:inline}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#333;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;background:#333}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#333}.top-bar-section li.active:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;color:#fff;background:#ba2619}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#a02116;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:1rem;margin-top:-1px;right:5px;line-height:1.2}.top-bar-section .dropdown{left:0;top:auto;background:transparent;min-width:100%}.top-bar-section .dropdown li a{color:#fff;line-height:2.8125rem;white-space:nowrap;padding:12px .9375rem;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){color:#fff;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){color:#fff;background-color:#555;background:#333}.top-bar-section .dropdown li label{white-space:nowrap;background:#333}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-bottom:none;border-top:none;border-right:solid 1px #4e4e4e;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;padding:0 .9375rem;height:2.8125rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#333;color:#fff}.no-js .top-bar-section ul li:active>a{background:#ba2619;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 99999999em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#ba2619;text-decoration:none;line-height:inherit}a:hover,a:focus{color:#a02116}a img{border:none}p{font-family:inherit;font-weight:400;font-size:1rem;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;line-height:1.35;font-style:italic}h1,h2,h3,h4,h5,h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:700;font-style:normal;color:#222;text-rendering:optimizeLegibility;margin-top:.2rem;margin-bottom:.5rem;line-height:1.4}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:80%;color:#6f6f6f;line-height:0}h1{font-size:1.5625rem}h2{font-size:1.25rem}h3{font-size:1.0625rem}h4{font-size:.9375rem}h5{font-size:1rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:400;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:1.25rem 0 1.1875rem;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:700;line-height:inherit}small{font-size:80%;line-height:inherit}code{font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#333;background-color:rgba(0,0,0,0.04);border-width:1px;border-style:none;border-color:rgba(0,0,0,0.04);padding:.125rem .3125rem .0625rem}ul,ol,dl{font-size:1rem;line-height:1.6;margin-bottom:1.25rem;list-style-position:outside;font-family:inherit}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:.3rem;font-weight:700}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:700;font-size:.9375rem}.vevent .summary{font-weight:700}.vevent abbr{cursor:default;text-decoration:none;font-weight:700;border:none;padding:0 .0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:1.875rem}h2{font-size:1.5625rem}h3{font-size:1.375rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.print-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}.slick-slider{position:relative;display:block;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.slick-track{position:relative;left:0;top:0;display:block}.slick-track:before,.slick-track:after{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;height:100%;min-height:1px;display:none}[dir="rtl"] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-loading .slick-list{background:#fff url("../img/ajax-loader.gif") center center no-repeat}.slick-prev,.slick-next{position:absolute;display:block;height:20px;width:20px;line-height:0;font-size:0;cursor:pointer;background:transparent;color:transparent;top:50%;margin-top:-10px;padding:0;border:none;outline:none}.slick-prev:hover,.slick-prev:focus,.slick-next:hover,.slick-next:focus{outline:none;background:transparent;color:transparent}.slick-prev:hover:before,.slick-prev:focus:before,.slick-next:hover:before,.slick-next:focus:before{opacity:1}.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before{opacity:.25}.slick-prev:before,.slick-next:before{font-family:"FontAwesome";font-size:20px;line-height:1;color:#ba2619;opacity:.75;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:15px}[dir="rtl"] .slick-prev{left:auto;right:15px}.slick-prev:before{content:""}[dir="rtl"] .slick-prev:before{content:""}.slick-next{right:15px}[dir="rtl"] .slick-next{left:15px;right:auto}.slick-next:before{content:""}[dir="rtl"] .slick-next:before{content:""}.slick-slider{margin-bottom:30px}.slick-dots{margin:0;position:absolute;bottom:30px;list-style:none;display:block;text-align:center;padding:0;width:100%}.slick-dots li{position:relative;display:inline-block;height:20px;width:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{border:0;background:transparent;display:block;height:20px;width:20px;outline:none;line-height:0;font-size:0;color:transparent;padding:5px;cursor:pointer}.slick-dots li button:hover,.slick-dots li button:focus{outline:none}.slick-dots li button:hover:before,.slick-dots li button:focus:before{opacity:1}.slick-dots li button:before{position:absolute;top:0;left:0;content:"";width:20px;height:20px;font-family:"FontAwesome";font-size:12px;line-height:20px;text-align:center;color:#000;opacity:.25;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-dots li.slick-active button:before{color:#ba2619;opacity:.75}/*! +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}meta.foundation-version{font-family:"/5.5.1/"}meta.foundation-mq-small{font-family:"/only screen/";width:0em}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0em}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;padding:0;margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}[class*="block-grid-"]{display:block;padding:0;margin:0 -.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;height:auto;float:left;padding:0 .625rem 1.25rem}@media only screen{.small-block-grid-1>li{width:100%;list-style:none}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{width:50%;list-style:none}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{width:33.3333333333%;list-style:none}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{width:25%;list-style:none}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{width:20%;list-style:none}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{width:16.6666666667%;list-style:none}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{width:14.2857142857%;list-style:none}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{width:12.5%;list-style:none}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{width:11.1111111111%;list-style:none}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{width:10%;list-style:none}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{width:9.0909090909%;list-style:none}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{width:8.3333333333%;list-style:none}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{width:100%;list-style:none}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{width:50%;list-style:none}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{width:33.3333333333%;list-style:none}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{width:25%;list-style:none}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{width:20%;list-style:none}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{width:16.6666666667%;list-style:none}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{width:14.2857142857%;list-style:none}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{width:12.5%;list-style:none}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{width:11.1111111111%;list-style:none}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{width:10%;list-style:none}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{width:9.0909090909%;list-style:none}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{width:8.3333333333%;list-style:none}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{width:100%;list-style:none}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{width:50%;list-style:none}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{width:33.3333333333%;list-style:none}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{width:25%;list-style:none}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{width:20%;list-style:none}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{width:16.6666666667%;list-style:none}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{width:14.2857142857%;list-style:none}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{width:12.5%;list-style:none}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{width:11.1111111111%;list-style:none}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{width:10%;list-style:none}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{width:9.0909090909%;list-style:none}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{width:8.3333333333%;list-style:none}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}button,.button{border-style:solid;border-width:0;cursor:pointer;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.25rem;position:relative;text-decoration:none;text-align:center;-webkit-appearance:none;-moz-appearance:none;border-radius:0;display:inline-block;padding-top:1rem;padding-right:2rem;padding-bottom:1.0625rem;padding-left:2rem;font-size:1rem;background-color:#ba2619;border-color:#951e14;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#951e14}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding-top:1.125rem;padding-right:2.25rem;padding-bottom:1.1875rem;padding-left:2.25rem;font-size:1.25rem}button.small,.button.small{padding-top:.875rem;padding-right:1.75rem;padding-bottom:.9375rem;padding-left:1.75rem;font-size:.8125rem}button.tiny,.button.tiny{padding-top:.625rem;padding-right:1.25rem;padding-bottom:.6875rem;padding-left:1.25rem;font-size:.6875rem}button.expand,.button.expand{padding-right:0;padding-left:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:.75rem}button.right-align,.button.right-align{text-align:right;padding-right:.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#ba2619;border-color:#951e14;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#951e14}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#ba2619}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}.clearing-thumbs,[data-clearing]{margin-bottom:0;margin-left:0;list-style:none}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.clearing-touch-label{position:absolute;top:50%;left:50%;color:#aaa;font-size:0.6em}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;transform:translateY(-50%) translateX(-50%);-webkit-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{color:#ccc;font-size:.875em;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#333;width:100%;padding:10px 30px 20px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:30px;line-height:1;color:#ccc;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 12px}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:0.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:120px;min-height:inherit;float:left;overflow:hidden;margin-right:0;padding:0;position:relative;cursor:pointer;opacity:0.4;clear:none}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:0.8}.clearing-assembled .clearing-container .visible-img{background:#333;overflow:hidden;height:85%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}form{margin:0 0 1rem}form .row .row{margin:0 -.5rem}form .row .row .column,form .row .row .columns{padding:0 .5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:.5rem}label{font-size:.875rem;color:#4d4c4c;cursor:pointer;display:block;font-weight:400;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;border-style:solid;border-width:1px;overflow:visible;font-size:.875rem;height:2.3125rem;line-height:2.3125rem}.postfix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;border-radius:0;background-color:#fff;font-family:inherit;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:.875rem;margin:0 0 1rem 0;padding:.5rem;height:2.3125rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:all .15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}select{-webkit-appearance:none !important;border-radius:0;background-color:#FAFAFA;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;padding:.5rem;font-size:.875rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;color:rgba(0,0,0,0.75);line-height:normal;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f2f2;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;padding:1.25rem;margin:1.125rem 0}fieldset legend{font-weight:700;background:#fff;padding:0 .1875rem;margin:0;margin-left:-.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error>label>small{color:#676767;background:transparent;padding:0;text-transform:capitalize;font-style:normal;font-size:60%;margin:0;display:inline}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5rem}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-.9375rem;margin-right:-.9375rem;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}@media only screen{.small-push-0{position:relative;left:0%;right:auto}.small-pull-0{position:relative;right:0%;left:auto}.small-push-1{position:relative;left:8.3333333333%;right:auto}.small-pull-1{position:relative;right:8.3333333333%;left:auto}.small-push-2{position:relative;left:16.6666666667%;right:auto}.small-pull-2{position:relative;right:16.6666666667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.3333333333%;right:auto}.small-pull-4{position:relative;right:33.3333333333%;left:auto}.small-push-5{position:relative;left:41.6666666667%;right:auto}.small-pull-5{position:relative;right:41.6666666667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.3333333333%;right:auto}.small-pull-7{position:relative;right:58.3333333333%;left:auto}.small-push-8{position:relative;left:66.6666666667%;right:auto}.small-pull-8{position:relative;right:66.6666666667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.3333333333%;right:auto}.small-pull-10{position:relative;right:83.3333333333%;left:auto}.small-push-11{position:relative;left:91.6666666667%;right:auto}.small-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.3333333333%}.small-2{width:16.6666666667%}.small-3{width:25%}.small-4{width:33.3333333333%}.small-5{width:41.6666666667%}.small-6{width:50%}.small-7{width:58.3333333333%}.small-8{width:66.6666666667%}.small-9{width:75%}.small-10{width:83.3333333333%}.small-11{width:91.6666666667%}.small-12{width:100%}.small-offset-0{margin-left:0% !important}.small-offset-1{margin-left:8.3333333333% !important}.small-offset-2{margin-left:16.6666666667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.3333333333% !important}.small-offset-5{margin-left:41.6666666667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.3333333333% !important}.small-offset-8{margin-left:66.6666666667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.3333333333% !important}.small-offset-11{margin-left:91.6666666667% !important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0%;right:auto}.medium-pull-0{position:relative;right:0%;left:auto}.medium-push-1{position:relative;left:8.3333333333%;right:auto}.medium-pull-1{position:relative;right:8.3333333333%;left:auto}.medium-push-2{position:relative;left:16.6666666667%;right:auto}.medium-pull-2{position:relative;right:16.6666666667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.3333333333%;right:auto}.medium-pull-4{position:relative;right:33.3333333333%;left:auto}.medium-push-5{position:relative;left:41.6666666667%;right:auto}.medium-pull-5{position:relative;right:41.6666666667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.3333333333%;right:auto}.medium-pull-7{position:relative;right:58.3333333333%;left:auto}.medium-push-8{position:relative;left:66.6666666667%;right:auto}.medium-pull-8{position:relative;right:66.6666666667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.3333333333%;right:auto}.medium-pull-10{position:relative;right:83.3333333333%;left:auto}.medium-push-11{position:relative;left:91.6666666667%;right:auto}.medium-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.3333333333%}.medium-3{width:25%}.medium-4{width:33.3333333333%}.medium-5{width:41.6666666667%}.medium-6{width:50%}.medium-7{width:58.3333333333%}.medium-8{width:66.6666666667%}.medium-9{width:75%}.medium-10{width:83.3333333333%}.medium-11{width:91.6666666667%}.medium-12{width:100%}.medium-offset-0{margin-left:0% !important}.medium-offset-1{margin-left:8.3333333333% !important}.medium-offset-2{margin-left:16.6666666667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.3333333333% !important}.medium-offset-5{margin-left:41.6666666667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.3333333333% !important}.medium-offset-8{margin-left:66.6666666667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.3333333333% !important}.medium-offset-11{margin-left:91.6666666667% !important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0%;right:auto}.large-pull-0{position:relative;right:0%;left:auto}.large-push-1{position:relative;left:8.3333333333%;right:auto}.large-pull-1{position:relative;right:8.3333333333%;left:auto}.large-push-2{position:relative;left:16.6666666667%;right:auto}.large-pull-2{position:relative;right:16.6666666667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.3333333333%;right:auto}.large-pull-4{position:relative;right:33.3333333333%;left:auto}.large-push-5{position:relative;left:41.6666666667%;right:auto}.large-pull-5{position:relative;right:41.6666666667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.3333333333%;right:auto}.large-pull-7{position:relative;right:58.3333333333%;left:auto}.large-push-8{position:relative;left:66.6666666667%;right:auto}.large-pull-8{position:relative;right:66.6666666667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.3333333333%;right:auto}.large-pull-10{position:relative;right:83.3333333333%;left:auto}.large-push-11{position:relative;left:91.6666666667%;right:auto}.large-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.3333333333%}.large-2{width:16.6666666667%}.large-3{width:25%}.large-4{width:33.3333333333%}.large-5{width:41.6666666667%}.large-6{width:50%}.large-7{width:58.3333333333%}.large-8{width:66.6666666667%}.large-9{width:75%}.large-10{width:83.3333333333%}.large-11{width:91.6666666667%}.large-12{width:100%}.large-offset-0{margin-left:0% !important}.large-offset-1{margin-left:8.3333333333% !important}.large-offset-2{margin-left:16.6666666667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.3333333333% !important}.large-offset-5{margin-left:41.6666666667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.3333333333% !important}.large-offset-8{margin-left:66.6666666667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.3333333333% !important}.large-offset-11{margin-left:91.6666666667% !important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}.inline-list{margin:0 auto 1.0625rem auto;margin-left:-1.375rem;margin-right:0;padding:0;list-style:none;overflow:hidden}.inline-list>li{list-style:none;float:left;margin-left:1.375rem;display:block}.inline-list>li>*{display:block}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#f6c4bf;margin-bottom:1.25rem;padding:1.25rem;background:#fdf0ef;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#ba2619}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#a02116}.panel.radius{border-radius:3px}.side-nav{display:block;margin:0;padding:.875rem 0;list-style-type:none;list-style-position:outside;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li{margin:0 0 .4375rem 0;font-size:.875rem;font-weight:400}.side-nav li a:not(.button){display:block;color:#ba2619;margin:0;padding:.4375rem .875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#e65346}.side-nav li.active>a:first-child:not(.button){color:#e65346;font-weight:400;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#fff}.side-nav li.heading{color:#ba2619;font-size:.875rem;font-weight:bold;text-transform:uppercase}table{background:#fff;margin-bottom:1.25rem;border:solid 1px #ddd;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#f5f5f5}table thead tr th,table thead tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tfoot{background:#f5f5f5}table tfoot tr th,table tfoot tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tr th,table tr td{padding:.5625rem .625rem;font-size:.875rem;color:#222;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.th{line-height:0;display:inline-block;border:solid 4px #fff;max-width:100%;box-shadow:0 0 0 1px rgba(0,0,0,0.2);transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(186,38,25,0.5)}.th.radius{border-radius:3px}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{width:100%;left:0;position:fixed;top:0;z-index:99}.fixed.expanded:not(.top-bar){overflow-y:auto;height:auto;width:100%;max-height:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{z-index:98;margin-top:2.8125rem}.top-bar{overflow:hidden;height:2.8125rem;line-height:2.8125rem;position:relative;background:#333;margin-bottom:0}.top-bar ul{margin-bottom:0;list-style:none}.top-bar .row{max-width:none}.top-bar form,.top-bar input{margin-bottom:0}.top-bar input{height:1.75rem;padding-top:.35rem;padding-bottom:.35rem;font-size:.75rem}.top-bar .button,.top-bar button{padding-top:0.4125rem;padding-bottom:0.4125rem;margin-bottom:0;font-size:.75rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{position:relative;margin:0}.top-bar .name{height:2.8125rem;margin:0;font-size:16px}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{line-height:2.8125rem;font-size:1.0625rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{font-weight:400;color:#fff;width:75%;display:block;padding:0 .9375rem}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;text-transform:uppercase;font-size:.8125rem;font-weight:700;position:relative;display:block;padding:0 .9375rem;height:2.8125rem;line-height:2.8125rem}.top-bar .toggle-topbar.menu-icon{top:50%;margin-top:-16px}.top-bar .toggle-topbar.menu-icon a{height:34px;line-height:33px;padding:0 2.5rem 0 .9375rem;color:#fff;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-8px;right:.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{padding:0;width:100%;height:auto;display:block;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1919;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:.9375rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:.8125rem;font-weight:400;text-transform:none}.top-bar-section ul li>a.button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#951e14}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#951e14}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;background:#333;color:#fff}.top-bar-section ul li.active>a{background:#ba2619;color:#fff}.top-bar-section ul li.active>a:hover{background:#a02116;color:#fff}.top-bar-section .has-form{padding:.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{padding:0;position:absolute;left:100%;top:0;z-index:99;display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .dropdown li{width:100%;height:auto}.top-bar-section .dropdown li a{font-weight:400;padding:8px .9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:400}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px .9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{padding:8px .9375rem 2px;margin-bottom:0;text-transform:uppercase;color:#777;font-weight:700;font-size:.625rem}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar .button,.top-bar button{font-size:.875rem;position:relative;height:1.75rem;top:.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{max-width:62.5rem;margin:0 auto;margin-bottom:0}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{width:auto;height:auto !important;display:inline}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#333;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;background:#333}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#333}.top-bar-section li.active:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;color:#fff;background:#ba2619}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#a02116;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:1rem;margin-top:-1px;right:5px;line-height:1.2}.top-bar-section .dropdown{left:0;top:auto;background:transparent;min-width:100%}.top-bar-section .dropdown li a{color:#fff;line-height:2.8125rem;white-space:nowrap;padding:12px .9375rem;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){color:#fff;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){color:#fff;background-color:#555;background:#333}.top-bar-section .dropdown li label{white-space:nowrap;background:#333}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-bottom:none;border-top:none;border-right:solid 1px #4e4e4e;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;padding:0 .9375rem;height:2.8125rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#333;color:#fff}.no-js .top-bar-section ul li:active>a{background:#ba2619;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 99999999em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#ba2619;text-decoration:none;line-height:inherit}a:hover,a:focus{color:#a02116}a img{border:none}p{font-family:inherit;font-weight:400;font-size:1rem;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;line-height:1.35;font-style:italic}h1,h2,h3,h4,h5,h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:700;font-style:normal;color:#222;text-rendering:optimizeLegibility;margin-top:.2rem;margin-bottom:.5rem;line-height:1.4}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:80%;color:#6f6f6f;line-height:0}h1{font-size:1.5625rem}h2{font-size:1.25rem}h3{font-size:1.0625rem}h4{font-size:.9375rem}h5{font-size:1rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:400;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:1.25rem 0 1.1875rem;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:700;line-height:inherit}small{font-size:80%;line-height:inherit}code{font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#333;background-color:rgba(0,0,0,0.04);border-width:1px;border-style:none;border-color:rgba(0,0,0,0.04);padding:.125rem .3125rem .0625rem}ul,ol,dl{font-size:1rem;line-height:1.6;margin-bottom:1.25rem;list-style-position:outside;font-family:inherit}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:.3rem;font-weight:700}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:700;font-size:.9375rem}.vevent .summary{font-weight:700}.vevent abbr{cursor:default;text-decoration:none;font-weight:700;border:none;padding:0 .0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:1.875rem}h2{font-size:1.5625rem}h3{font-size:1.375rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.print-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}.slick-slider{position:relative;display:block;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.slick-track{position:relative;left:0;top:0;display:block}.slick-track:before,.slick-track:after{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;height:100%;min-height:1px;display:none}[dir="rtl"] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-loading .slick-list{background:#fff url("../img/ajax-loader.gif") center center no-repeat}.slick-prev,.slick-next{position:absolute;display:block;height:20px;width:20px;line-height:0;font-size:0;cursor:pointer;background:transparent;color:transparent;top:50%;margin-top:-10px;padding:0;border:none;outline:none}.slick-prev:hover,.slick-prev:focus,.slick-next:hover,.slick-next:focus{outline:none;background:transparent;color:transparent}.slick-prev:hover:before,.slick-prev:focus:before,.slick-next:hover:before,.slick-next:focus:before{opacity:1}.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before{opacity:.25}.slick-prev:before,.slick-next:before{font-family:"FontAwesome";font-size:20px;line-height:1;color:#ba2619;opacity:.75;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:15px}[dir="rtl"] .slick-prev{left:auto;right:15px}.slick-prev:before{content:""}[dir="rtl"] .slick-prev:before{content:""}.slick-next{right:15px}[dir="rtl"] .slick-next{left:15px;right:auto}.slick-next:before{content:""}[dir="rtl"] .slick-next:before{content:""}.slick-slider{margin-bottom:30px}.slick-dots{margin:0;position:absolute;bottom:30px;list-style:none;display:block;text-align:center;padding:0;width:100%}.slick-dots li{position:relative;display:inline-block;height:20px;width:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{border:0;background:transparent;display:block;height:20px;width:20px;outline:none;line-height:0;font-size:0;color:transparent;padding:5px;cursor:pointer}.slick-dots li button:hover,.slick-dots li button:focus{outline:none}.slick-dots li button:hover:before,.slick-dots li button:focus:before{opacity:1}.slick-dots li button:before{position:absolute;top:0;left:0;content:"";width:20px;height:20px;font-family:"FontAwesome";font-size:12px;line-height:20px;text-align:center;color:#000;opacity:.25;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-dots li.slick-active button:before{color:#ba2619;opacity:.75}/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url("./fonts/fontawesome-webfont.eot?v=4.4.0");src:url("./fonts/fontawesome-webfont.eot?#iefix&v=4.4.0") format("embedded-opentype"),url("./fonts/fontawesome-webfont.woff2?v=4.4.0") format("woff2"),url("./fonts/fontawesome-webfont.woff?v=4.4.0") format("woff"),url("./fonts/fontawesome-webfont.ttf?v=4.4.0") format("truetype"),url("./fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.maxWidth{width:100%}.hidden{display:none}*{transition:all 0.15s ease}body{background-color:#333}body>main{padding:2.5rem 0;background-color:#fff}@media only screen and (max-width: 40em){body>main{padding:1.25rem 0}}body>main img{margin-bottom:1.25rem}@media only screen and (max-width: 40em){aside{margin-bottom:1.5rem}}@media only screen and (max-width: 40em){.row{overflow:hidden}}body>footer{background-color:#333;padding:2.5rem 0;color:#999}body>footer p,body>footer h1,body>footer h2,body>footer h3,body>footer h4,body>footer h5,body>footer h6{color:inherit}body>footer a{color:#e23424}code{font-size:85%;color:inherit !important;overflow-x:scroll;-webkit-overflow-scrolling:touch}pre.highlight{border:solid 1px #ddd;background:#fff;padding:1em;line-height:23px;margin-bottom:30px;white-space:pre;overflow-x:auto;word-break:inherit;word-wrap:inherit;background:#ffffff}@media only screen and (max-width: 40em){pre.highlight{overflow-x:scroll;-webkit-overflow-scrolling:touch}}pre.highlight code{background-color:transparent;border:none;padding:0}pre.highlight td{padding:8px 15px}pre.highlight .gl{background:#fafafa;border-right:1px solid #ddd;color:#999;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}pre.highlight .c{color:#999988;font-style:italic}pre.highlight .err{color:#a61717;background-color:#e3d2d2}pre.highlight .k{font-weight:bold}pre.highlight .o{font-weight:bold}pre.highlight .cm{color:#999988;font-style:italic}pre.highlight .cp{color:#999999;font-weight:bold}pre.highlight .c1{color:#999988;font-style:italic}pre.highlight .cs{color:#999999;font-weight:bold;font-style:italic}pre.highlight .gd{color:#000000;background-color:#ffdddd}pre.highlight .gd .x{color:#000000;background-color:#ffaaaa}pre.highlight .ge{font-style:italic}pre.highlight .gr{color:#aa0000}pre.highlight .gh{color:#999999}pre.highlight .gi{color:#000000;background-color:#ddffdd}pre.highlight .gi .x{color:#000000;background-color:#aaffaa}pre.highlight .go{color:#888888}pre.highlight .gp{color:#555555}pre.highlight .gs{font-weight:bold}pre.highlight .gu{color:#aaaaaa}pre.highlight .gt{color:#aa0000}pre.highlight .kc{font-weight:bold}pre.highlight .kd{font-weight:bold}pre.highlight .kp{font-weight:bold}pre.highlight .kr{font-weight:bold}pre.highlight .kt{color:#445588;font-weight:bold}pre.highlight .m{color:#009999}pre.highlight .s{color:#d14}pre.highlight .na{color:#008080}pre.highlight .nb{color:#0086B3}pre.highlight .nc{color:#445588;font-weight:bold}pre.highlight .no{color:#008080}pre.highlight .ni{color:#800080}pre.highlight .ne{color:#990000;font-weight:bold}pre.highlight .nf{color:#990000;font-weight:bold}pre.highlight .nn{color:#555555}pre.highlight .nt{color:#000080}pre.highlight .nv{color:#008080}pre.highlight .ow{font-weight:bold}pre.highlight .w{color:#bbbbbb}pre.highlight .mf{color:#009999}pre.highlight .mh{color:#009999}pre.highlight .mi{color:#009999}pre.highlight .mo{color:#009999}pre.highlight .sb{color:#d14}pre.highlight .sc{color:#d14}pre.highlight .sd{color:#d14}pre.highlight .s2{color:#d14}pre.highlight .se{color:#d14}pre.highlight .sh{color:#d14}pre.highlight .si{color:#d14}pre.highlight .sx{color:#d14}pre.highlight .sr{color:#009926}pre.highlight .s1{color:#d14}pre.highlight .ss{color:#990073}pre.highlight .bp{color:#999999}pre.highlight .vc{color:#008080}pre.highlight .vg{color:#008080}pre.highlight .vi{color:#008080}pre.highlight .il{color:#009999}kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.social__icons{margin-bottom:10px}.social__icon{display:inline-block;margin-right:10px}.slider picture img{width:100%}.videoWrapper{position:relative;padding-top:56.25%;margin-bottom:1.25rem}.videoWrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}.icon{position:relative;top:1px;display:inline-block;width:16px;height:16px}.icon-color{border:1px solid #aaa}.icon-color-white{background-color:#fff}.icon-color-black{background-color:#000}.icon-color-red{background-color:#ba2619}.toc-header{margin-bottom:0}#toc{display:block;margin:1rem 0 0 0}#toc>ol{margin-left:0}#toc>ol>li{margin-bottom:0.5rem}#toc ol{list-style-type:none}.clickable-header{cursor:pointer}.clickable-header:hover{text-decoration:underline}.top-level-header{display:inline-block}.back-to-top{position:relative;margin-left:8px;cursor:pointer;top:-3px}.contentSearch{margin-bottom:30px}@media only screen and (max-width: 40em){.contentSearch{margin-bottom:5px}}.contentSearch-wrapper{position:relative}.contentSearch-wrapper.small-collapse{margin:0 !important}.liveSearch-field{margin-bottom:0 !important}.liveSearch-button{margin-bottom:0}.liveSearch-result-list{position:absolute;width:100%;height:auto;background:white;border:1px #ccc;border-style:none solid solid solid;z-index:99;margin:0;list-style-type:none}@media only screen and (max-width: 40em){.liveSearch-result-list{position:relative}}.liveSearch-result-list li a{-webkit-transition:all 0.15s ease;transition:all 0.15s ease;padding:4px 10px;display:block;width:100%;height:100%;line-height:1.2}.liveSearch-result-list li a:hover{background-color:#eee}.liveSearch-result-list li a:first-child{padding-top:8px}.liveSearch-result-list li a:last-child{padding-bottom:8px}.searchPage-result-list{line-height:1.2;list-style-type:none}.searchPage-result-list li{margin-bottom:20px}@media only screen and (max-width: 40em){.searchPage-result-list li{margin-bottom:15px}}.searchPage-result-list li a{font-weight:bold;color:#1a0dab}.searchPage-result-list li a:hover{color:#1a0dab;text-decoration:underline}.searchPage-result-list li .url{color:#006621}@media only screen and (max-width: 40em){.searchPage-result-list li .additionalInfo{display:none}}.article-list{margin:0;padding:0;list-style-type:none}.article-list header h1{font-size:1.5rem}article header{margin-bottom:0.5rem}article header h1{margin-bottom:0}article .meta{font-size:0.9em}.table-wrapper{width:100%;overflow-y:auto;_overflow:auto;margin:0 0 1em} diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml index e99c7da763c..ca25a38c0a8 100644 --- a/docs/docker-compose.yml +++ b/docs/docker-compose.yml @@ -8,7 +8,6 @@ services: dockerfile: Dockerfile environment: JEKYLLARGS: --incremental - ports: - - "4000:4000" + ports: ['4000:4000'] volumes: - - ./:/usr/src/app + - './:/usr/src/app' diff --git a/docs/entrypoint.sh b/docs/entrypoint.sh old mode 100644 new mode 100755 diff --git a/docs/img/news/191231_medical1.jpg b/docs/img/news/191231_medical1.jpg new file mode 100644 index 00000000000..fd78b668cb0 Binary files /dev/null and b/docs/img/news/191231_medical1.jpg differ diff --git a/docs/img/news/191231_medical2.jpg b/docs/img/news/191231_medical2.jpg new file mode 100644 index 00000000000..e4ddee5b36a Binary files /dev/null and b/docs/img/news/191231_medical2.jpg differ diff --git a/docs/img/wiki/feature/abtools_inventory.png b/docs/img/wiki/feature/abtools_inventory.png deleted file mode 100644 index 72e16076897..00000000000 Binary files a/docs/img/wiki/feature/abtools_inventory.png and /dev/null differ diff --git a/docs/img/wiki/feature/m47_flank.png b/docs/img/wiki/feature/m47_flank.png new file mode 100644 index 00000000000..fbbf9c9403b Binary files /dev/null and b/docs/img/wiki/feature/m47_flank.png differ diff --git a/docs/img/wiki/feature/m47_fro_obl_fla.png b/docs/img/wiki/feature/m47_fro_obl_fla.png new file mode 100644 index 00000000000..bbd3013d8b7 Binary files /dev/null and b/docs/img/wiki/feature/m47_fro_obl_fla.png differ diff --git a/docs/img/wiki/feature/m47_frontal.png b/docs/img/wiki/feature/m47_frontal.png new file mode 100644 index 00000000000..48730b02c8a Binary files /dev/null and b/docs/img/wiki/feature/m47_frontal.png differ diff --git a/docs/img/wiki/feature/m47_oblique_45.png b/docs/img/wiki/feature/m47_oblique_45.png new file mode 100644 index 00000000000..616940aba73 Binary files /dev/null and b/docs/img/wiki/feature/m47_oblique_45.png differ diff --git a/docs/img/wiki/feature/m47_oblique_60.png b/docs/img/wiki/feature/m47_oblique_60.png new file mode 100644 index 00000000000..65c3cd23eb3 Binary files /dev/null and b/docs/img/wiki/feature/m47_oblique_60.png differ diff --git a/docs/img/wiki/user/issue_flowchart.drawio b/docs/img/wiki/user/issue_flowchart.drawio new file mode 100644 index 00000000000..f13bae169ad --- /dev/null +++ b/docs/img/wiki/user/issue_flowchart.drawio @@ -0,0 +1 @@ +7Vxbc6M2FP41fkyG++Uxa3tzaXc2s+nOdvvSkUE2NIAYIcdmf30lEDYg6kuCjdwkDw46CJDP5dOnc4RH+jhe32KQBl+QD6ORpvjrkT4ZaZqqKzr9xyR5KdF00y4lCxz6vNdW8BT+glyocOky9GHW6EgQikiYNoUeShLokYYMYIxWzW5zFDWfmoIFFARPHohE6Y/QJ0EpdTR7K7+D4SKonqxabnkmBlVn/k2yAPhoVRPp05E+xgiR8ihej2HEtFfppbzu83+c3QwMw4QccsHL3cOXyW8/F/69YlgPd742eXm4svloM5JX3xj6VAG8iTAJ0AIlIJpupZ8wWiY+ZLdVaOufZZxyu1m0ub3kd4RSKlRZH0hIzjuBJUFUFJA44mfpF8D5n+x212bV/MnvXjQm60Yr5605Sgi/qcbaoka4kjK0xB7coYbKswBeQLJLXVbZkemo9gSu8FuIYkgHSDtgGAESvjSdCHBfXGz6bc1FD7jFjrAev+8LiJb8SfdscIlHDUQgpiaiD03YXbKM9tCUVUidUlNuxtNrwe5Nq66CkMCnFBRqW9HgbppsHkbRGEUIF9fqc8eDnkflGcHoGdbOzBzTMHca5wViAtc7tcnPai4PJQ4mV2qFEqttaKoGlwW1sLSUE1lAMwUT5BSu3hpTFxlE+oFBpGpSBVEF5TUTJkgCVGwb5rUGPr1Bdbtvg/JLH1FIx7yJf6sV/6rTCutypPyqlltshvF6T9EFR7mJaZthbhqBPEwW9AgxvAVMhGEMfIa6MYXfkMr1zyLoBiieLbPjAXc+17oB17dmlmn1A7iG1VK41YG3Wgfetg3TX7A6EkTm8FBbQeh+rDWkwtpq3LUQ+sYHsImbBK4iJvAwBKSgMDx++qUsvgkd3+iKIEeb6VZPEdSmLJo5OGMxZGEsw09wVXTsDyPnPDOcpjTdxTDPO8NVnng5XEgyRzkbFTJbjmIc5ig3GIO81i1lHbIjnqMoLb8r79irF6oiRN3zBSx1G3h5PEpvhbU+OI+yRC4rRaBLQK2cQ0NdrmWsKyaD+pjX+zRpw6Bb+8pjUtU9CXofC7pGEy3MdmJ3d3fbOgdEOyJENzg7CRhczxioJrUlMD3KMxjNO7i81AiutomZMzSCV75az0Zkz9VC6mY8pZ9PEfCYCCTMJD7MPBzOmF1yGjJFigLNIhj3vLAC0Jl3GsTyHDib92OQ1rrK1odeV7maVFg7WBL44MxE71j7JvNV466F05gqBXhkA2ZbDKOKDxC+xHxEK2yswQsohlhA+SCijaXk3kgydKkiybAkJaJDmEaVyjS6WOrqqGDwIjGiqEdJggViBlzJLEsLnSkx8rPLW4JbmmwEzvgoZdRDZH8sybXeNsT19iTMAOXT7GnF9UWk0AGvPZgyGjH+dLMh471vwTgPfzBM2QhENSDZCMSBKeu9aZA3RNahVLx/AtGdqLBb5WTbPm91wxSTnnIwEwlQ+FBfMeViNNW4/zelgvaWC1sbnKeIUfOIMrLNIlWbC4ulcblULtNPtyG5W85qPQgG3jMjlXwSBIQusIMR36T47fEP+km1Di8xIbUBM2kyUqb5AW01xNoPbXLtlTFFgjlNOL+kzJJ+zvLN4TIhYbQJvyreMLwCaQoBzi6Ra7aTVc7ge2fMjsL0aFfVo7DNZVY82jVrd/CatS3pRt3hIa56LWF/zVoqhHNPsxXtXVnUlcuktpj8vc+EeQlEFDF9NiofecuYaqdAzxqBbDPGi+PxG/gcDC4dsbIiVLSK+elyq1lthqAq7tAUwe14SeD9luVV+4z2WP+lG+u/v37/joB2lcOvCXB+dbwi9z44w6lzeXr71RBFd6/d2p/ZvGM54wmpvQPu654sSdjpMGJCSTZOclz++GCPqVONTs2cJkt87Oa49nY3VWluSd5/QSXo3CAnOqSiXCu1P0d4euP0YW7fl7O+78lGmG20c1ajOg1iSIUUJ5pbBkKK/XOF2n5d5tXhR5vbX2You29/4EKf/gs= \ No newline at end of file diff --git a/docs/img/wiki/user/issue_flowchart.png b/docs/img/wiki/user/issue_flowchart.png new file mode 100644 index 00000000000..a62421f369f Binary files /dev/null and b/docs/img/wiki/user/issue_flowchart.png differ diff --git a/docs/src/package-lock.json b/docs/src/package-lock.json index a20abaa185c..d7cdb02d4be 100644 --- a/docs/src/package-lock.json +++ b/docs/src/package-lock.json @@ -4,27 +4,40 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true, + "optional": true + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true, + "optional": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "ansi-regex": { @@ -39,29 +52,30 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", "dev": true, - "requires": { - "file-type": "3.9.0" - } + "optional": true }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", "dev": true, + "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true, + "optional": true + } } }, "argparse": { @@ -70,17 +84,14 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", @@ -88,10 +99,10 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-find-index": { @@ -100,6 +111,15 @@ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -107,21 +127,21 @@ "dev": true }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, "async": { @@ -130,35 +150,10 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, - "async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", - "dev": true, - "optional": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "balanced-match": { @@ -167,201 +162,466 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, - "optional": true, "requires": { - "tweetnacl": "0.14.5" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true, + "optional": true }, "bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", "dev": true, "optional": true, "requires": { - "archive-type": "3.2.0", - "decompress": "3.0.0", - "download": "4.4.3", - "exec-series": "1.0.3", - "rimraf": "2.2.8", - "tempfile": "1.1.1", - "url-regex": "3.2.0" + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" } }, "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", "dev": true, "optional": true, "requires": { - "executable": "1.1.0" + "execa": "^0.7.0", + "executable": "^4.1.0" } }, "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.0.0.tgz", + "integrity": "sha512-Ekhwm6AUiMbZ1LgVCNMkgjovpMR30FyQN74laAW9gs0NPjZR5gdY0ARNB0YsQG8GOme3CsHbxmeyq/7Ofq6QYQ==", "dev": true, "optional": true, "requires": { - "find-versions": "1.2.1" + "execa": "^1.0.0", + "find-versions": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true, + "optional": true + } } }, "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", "dev": true, "optional": true, "requires": { - "bin-version": "1.0.4", - "minimist": "1.2.0", - "semver": "4.3.6", - "semver-truncate": "1.1.2" + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" }, "dependencies": { "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true, "optional": true } } }, "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", "dev": true, "optional": true, "requires": { - "bin-check": "2.0.0", - "bin-version-check": "2.1.0", - "download": "4.4.3", - "each-async": "1.1.1", - "lazy-req": "1.1.0", - "os-filter-obj": "1.0.3" + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "dependencies": { + "download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "optional": true, + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true, + "optional": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "optional": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + } + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true, + "optional": true + }, + "p-event": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.1.0.tgz", + "integrity": "sha512-sDEpDVnzLGlJj3k590uUdpfEUySP5yAYlvfTCu5hTDvSTXQVecYWKcEwdO49PrZlnJ5wkfAvtawnno/jyXeqvA==", + "dev": true, + "optional": true, + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "optional": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "optional": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^2.0.0" + } + } } }, "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, + "optional": true, "requires": { - "bytes": "2.2.0", - "content-type": "1.0.4", - "debug": "2.2.0", - "depd": "1.1.2", - "http-errors": "1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "2.3.0", - "qs": "5.2.0", - "raw-body": "2.1.7", - "type-is": "1.6.16" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" }, "dependencies": { - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "optional": true }, - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", "dev": true, "requires": { - "hoek": "2.16.3" + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true, + "optional": true + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dev": true, + "optional": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, + "optional": true, "requires": { - "pako": "0.2.9" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true, + "optional": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "dev": true, + "optional": true }, - "buffer-to-vinyl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true, - "requires": { - "file-type": "3.9.0", - "readable-stream": "2.3.3", - "uuid": "2.0.3", - "vinyl": "1.2.0" - } + "optional": true }, "builtin-modules": { "version": "1.1.1", @@ -370,9 +630,57 @@ "dev": true }, "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "optional": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true, + "optional": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, "camelcase": { @@ -387,50 +695,21 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "requires": { - "get-proxy": "1.1.0", - "is-obj": "1.0.1", - "object-assign": "3.0.0", - "tunnel-agent": "0.4.3" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", "dev": true, + "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" } }, "chalk": { @@ -439,121 +718,162 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "optional": true, "requires": { - "chalk": "1.1.3" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, + "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "mimic-response": "^1.0.0" } }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true - }, "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "optional": true, "requires": { - "q": "1.5.1" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "coffeescript": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, "commander": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, + "optional": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, + "optional": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "console-stream": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", @@ -561,51 +881,126 @@ "dev": true, "optional": true }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", "dev": true }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "dev": true, + "optional": true }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, + "optional": true, "requires": { - "capture-stack-trace": "1.0.0" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true, + "optional": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, + "optional": true, "requires": { - "boom": "2.10.1" + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } } }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true, + "optional": true + }, "csso": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", - "integrity": "sha1-F4tDpEYhIhwndWCG9THgL0KQDug=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "optional": true, "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } } }, "currently-unhandled": { @@ -614,24 +1009,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "array-find-index": "^1.0.1" } }, "dateformat": { @@ -640,17 +1018,17 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } }, "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "0.7.1" + "ms": "^2.1.1" } }, "decamelize": { @@ -659,285 +1037,371 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, + "optional": true, "requires": { - "buffer-to-vinyl": "1.1.0", - "concat-stream": "1.6.0", - "decompress-tar": "3.1.0", - "decompress-tarbz2": "3.1.0", - "decompress-targz": "3.1.0", - "decompress-unzip": "3.4.0", - "stream-combiner2": "1.1.1", - "vinyl-assign": "1.2.1", - "vinyl-fs": "2.4.4" + "mimic-response": "^1.0.0" } }, "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, + "optional": true, "requires": { - "is-tar": "1.0.0", - "object-assign": "2.1.1", - "strip-dirs": "1.1.1", - "tar-stream": "1.5.4", - "through2": "0.6.5", - "vinyl": "0.4.6" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" }, "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "optional": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "optional": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true, + "optional": true }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dev": true, + "optional": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } } } }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-bzip2": "1.0.0", - "object-assign": "2.1.1", - "seek-bzip": "1.0.5", - "strip-dirs": "1.1.1", - "tar-stream": "1.5.4", - "through2": "0.6.5", - "vinyl": "0.4.6" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true } } }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "is-gzip": "1.0.0", - "object-assign": "2.1.1", - "strip-dirs": "1.1.1", - "tar-stream": "1.5.4", - "through2": "0.6.5", - "vinyl": "0.4.6" + "arrify": "^1.0.1", + "path-type": "^3.0.0" }, "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "pify": "^3.0.0" } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "optional": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true, + "optional": true } } }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "requires": { - "is-zip": "1.0.0", - "read-all-stream": "3.1.0", - "stat-mode": "0.2.2", - "strip-dirs": "1.1.1", - "through2": "2.0.3", - "vinyl": "1.2.0", - "yauzl": "2.9.1" + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true, + "optional": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "optional": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "optional": true, + "requires": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" }, "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } + "optional": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true } } }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "optional": true }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "requires": { - "caw": "1.2.0", - "concat-stream": "1.6.0", - "each-async": "1.1.1", - "filenamify": "1.2.1", - "got": "5.7.1", - "gulp-decompress": "1.2.0", - "gulp-rename": "1.2.2", - "is-url": "1.2.2", - "object-assign": "4.1.1", - "read-all-stream": "3.1.0", - "readable-stream": "2.3.3", - "stream-combiner2": "1.1.1", - "vinyl": "1.2.0", - "vinyl-fs": "2.4.4", - "ware": "1.3.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, + "optional": true, "requires": { - "readable-stream": "2.3.3" + "once": "^1.4.0" } }, - "duplexify": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", - "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true, - "requires": { - "end-of-stream": "1.4.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "stream-shift": "1.0.0" - } + "optional": true }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", "dev": true, "requires": { - "onetime": "1.1.0", - "set-immediate-shim": "1.0.1" + "string-template": "~0.2.1", + "xtend": "~4.0.0" } }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, - "optional": true, "requires": { - "jsbn": "0.1.1" + "is-arrayish": "^0.2.1" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { - "once": "1.4.0" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "escape-string-regexp": { @@ -947,9 +1411,9 @@ "dev": true }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "eventemitter2": { @@ -959,35 +1423,76 @@ "dev": true }, "exec-buffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-2.0.1.tgz", - "integrity": "sha1-ACijG+CxRgth0HX5avRYO54zXqA=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", "dev": true, "optional": true, "requires": { - "rimraf": "2.2.8", - "tempfile": "1.1.1" + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + } } }, - "exec-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "optional": true, "requires": { - "async-each-series": "1.1.0", - "object-assign": "4.1.1" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } } }, "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dev": true, "optional": true, "requires": { - "meow": "3.7.0" + "pify": "^2.2.0" } }, "exit": { @@ -997,69 +1502,180 @@ "dev": true }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", "dev": true, + "optional": true, "requires": { - "fill-range": "2.2.3" + "mime-db": "^1.28.0" } }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "optional": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } }, "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "is-extglob": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "fast-glob": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz", + "integrity": "sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==", "dev": true, "requires": { - "chalk": "1.1.3", - "time-stamp": "1.1.0" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" } }, "faye-websocket": { @@ -1068,16 +1684,17 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, + "optional": true, "requires": { - "pend": "1.2.0" + "pend": "~1.2.0" } }, "figures": { @@ -1086,50 +1703,56 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.7.0.tgz", + "integrity": "sha512-AbaGtdWYYRaVrv2MwL/65myuRJ9j3e79e7etJ79US18QHuVlzJBcQHUH+HxDUoLtbyWRTUfLzLkGXX3pP9kfZg==", "dev": true }, "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true, + "optional": true }, "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", "dev": true, + "optional": true, "requires": { - "filename-reserved-regex": "1.0.0", - "strip-outer": "1.0.0", - "trim-repeated": "1.0.0" + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" } }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "find-up": { @@ -1138,21 +1761,28 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", + "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", "dev": true, "optional": true, "requires": { - "array-uniq": "1.0.3", - "get-stdin": "4.0.1", - "meow": "3.7.0", - "semver-regex": "1.0.0" + "array-uniq": "^2.0.0", + "semver-regex": "^2.0.0" + }, + "dependencies": { + "array-uniq": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", + "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", + "dev": true, + "optional": true + } } }, "findup-sync": { @@ -1161,7 +1791,7 @@ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", "dev": true, "requires": { - "glob": "5.0.15" + "glob": "~5.0.0" }, "dependencies": { "glob": { @@ -1170,136 +1800,77 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "for-in": "1.0.2" + "map-cache": "^0.2.2" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, + "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.2.8" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, "gaze": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", "dev": true, "requires": { - "globule": "1.2.0" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" + "globule": "^1.0.0" } }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", "dev": true, + "optional": true, "requires": { - "rc": "1.2.2" + "npm-conf": "^1.1.0" } }, "get-stdin": { @@ -1308,129 +1879,162 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "optional": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "getobject": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "gifsicle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-4.0.1.tgz", + "integrity": "sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==", "dev": true, + "optional": true, "requires": { - "assert-plus": "1.0.0" + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "execa": "^1.0.0", + "logalot": "^2.0.0" }, "dependencies": { - "assert-plus": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true, + "optional": true } } }, - "gifsicle": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", - "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", - "dev": true, - "optional": true, - "requires": { - "bin-build": "2.2.0", - "bin-wrapper": "3.0.2", - "logalot": "2.1.0" - } - }, "glob": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^2.1.0" } } } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - } + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "globby": { + "version": "8.0.1", + "resolved": "http://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { - "extend": "3.0.1", - "glob": "5.0.15", - "glob-parent": "3.1.0", - "micromatch": "2.3.11", - "ordered-read-streams": "0.3.0", - "through2": "0.6.5", - "to-absolute-glob": "0.1.1", - "unique-stream": "2.2.1" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, @@ -1440,9 +2044,9 @@ "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "minimatch": "3.0.4" + "glob": "~7.1.1", + "lodash": "~4.17.4", + "minimatch": "~3.0.2" }, "dependencies": { "glob": { @@ -1451,46 +2055,37 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "dev": true, + "optional": true, "requires": { - "create-error-class": "3.0.2", - "duplexer2": "0.1.4", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "node-status-codes": "1.0.0", - "object-assign": "4.1.1", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "read-all-stream": "3.1.0", - "readable-stream": "2.3.3", - "timed-out": "3.1.3", - "unzip-response": "1.0.2", - "url-parse-lax": "1.0.0" + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" } }, "graceful-fs": { @@ -1503,30 +2098,32 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "dev": true, + "optional": true }, "grunt": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", - "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", - "dev": true, - "requires": { - "coffeescript": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.2", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.21", - "js-yaml": "3.5.5", - "minimatch": "3.0.4", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", + "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", + "dev": true, + "requires": { + "coffeescript": "~1.10.0", + "dateformat": "~1.0.12", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.3.0", + "glob": "~7.0.0", + "grunt-cli": "~1.2.0", + "grunt-known-options": "~1.1.0", + "grunt-legacy-log": "~2.0.0", + "grunt-legacy-util": "~1.1.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.13.0", + "minimatch": "~3.0.2", + "mkdirp": "~0.5.1", + "nopt": "~3.0.6", + "path-is-absolute": "~1.0.0", + "rimraf": "~2.6.2" }, "dependencies": { "grunt-cli": { @@ -1535,10 +2132,10 @@ "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", "dev": true, "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" + "findup-sync": "~0.3.0", + "grunt-known-options": "~1.1.0", + "nopt": "~3.0.6", + "resolve": "~1.1.0" } } } @@ -1549,259 +2146,231 @@ "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", "dev": true, "requires": { - "chalk": "1.1.3", - "source-map": "0.5.7" + "chalk": "^1.0.0", + "source-map": "^0.5.3" } }, "grunt-contrib-imagemin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz", - "integrity": "sha1-5Ho1YTN29MqpwfkERlA8rhyUTXk=", - "dev": true, - "requires": { - "async": "1.5.2", - "chalk": "1.1.3", - "gulp-rename": "1.2.2", - "imagemin": "4.0.0", - "pretty-bytes": "3.0.1" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-3.1.0.tgz", + "integrity": "sha512-c0duAb018eowVVfqNMN0S5Esx8mRZ1OP/hkEoKnJkOCaD9/DywKGvLuhschF+DByPSs4k1u1y38w9Bt+ihJG8A==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "imagemin": "^6.0.0", + "imagemin-gifsicle": "^6.0.1", + "imagemin-jpegtran": "^6.0.0", + "imagemin-optipng": "^6.0.0", + "imagemin-svgo": "^7.0.0", + "p-map": "^1.2.0", + "plur": "^3.0.1", + "pretty-bytes": "^5.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "grunt-contrib-uglify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.3.0.tgz", - "integrity": "sha1-s9AmDr3WzvoS/y+Onh4ln33kIW8=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "maxmin": "1.1.0", - "object.assign": "4.0.4", - "uglify-js": "2.8.29", - "uri-path": "1.0.0" - } - }, - "grunt-contrib-watch": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.1.tgz", - "integrity": "sha512-8Zka/svGl6+ZwF7d6z/CfXwsb4cDODnajmZsY4nUAs9Ob0kJEcsLiDf5qm2HdDoEcm3NHjWCrFiWx+PZ2y4D7A==", - "dev": true, - "requires": { - "async": "1.5.2", - "gaze": "1.1.2", - "lodash": "4.17.10", - "tiny-lr": "0.2.1" - } - }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true - }, - "grunt-legacy-log": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.2.tgz", - "integrity": "sha512-WdedTJ/6zCXnI/coaouzqvkI19uwqbcPkdsXiDRKJyB5rOUlOxnCnTVbpeUdEckKVir2uHF3rDBYppj2p6N3+g==", - "dev": true, - "requires": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "4.17.10" - } - }, - "grunt-legacy-log-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.0.tgz", + "integrity": "sha512-vy3Vop2KDqdiwcGOGAjyKvjHFrRD/YK4KPQWR3Yt6OdYlgFw1z7HCuk66+IJ9s7oJmp9uRQXuuSHyawKRAgiMw==", "dev": true, "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" + "chalk": "^2.4.1", + "maxmin": "^2.1.0", + "uglify-js": "~3.4.8", + "uri-path": "^1.0.0" }, "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "grunt-legacy-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", "dev": true, "requires": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" + "async": "^2.6.0", + "gaze": "^1.1.0", + "lodash": "^4.17.10", + "tiny-lr": "^1.1.1" }, "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } } } }, - "grunt-sass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-2.1.0.tgz", - "integrity": "sha512-XkexnQt/9rhReNd+Y7T0n/2g5FqYOQKfi2iSlpwDqvgs7EgEaGTxNhnWzHnbW5oNRvzL9AHopBG3AgRxL0d+DA==", - "dev": true, - "requires": { - "each-async": "1.1.1", - "node-sass": "4.9.0", - "object-assign": "4.1.1" - } + "grunt-known-options": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "dev": true }, - "gulp-decompress": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", + "grunt-legacy-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", + "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", "dev": true, "requires": { - "archive-type": "3.2.0", - "decompress": "3.0.0", - "gulp-util": "3.0.8", - "readable-stream": "2.3.3" + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.5" } }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "grunt-legacy-log-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", + "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", "dev": true, "requires": { - "convert-source-map": "1.5.0", - "graceful-fs": "4.1.11", - "strip-bom": "2.0.0", - "through2": "2.0.3", - "vinyl": "1.2.0" + "chalk": "~2.4.1", + "lodash": "~4.17.10" }, "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "color-convert": "^1.9.0" } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" - }, - "dependencies": { - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" + "has-flag": "^3.0.0" } } } }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "grunt-legacy-util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", + "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", "dev": true, "requires": { - "glogg": "1.0.0" + "async": "~1.5.2", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.10", + "underscore.string": "~3.3.4", + "which": "~1.3.0" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, + "grunt-sass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.0.2.tgz", + "integrity": "sha512-Ogq4cWqBre71gZIkgxIxevgzZHSIIsrKu/5yvPDl4Mvib0A4TRTJEQUdpQ0YV1iai0DPjayz02vDJE6KUVHQ2w==", + "dev": true + }, "gzip-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", - "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "dev": true, "requires": { - "browserify-zlib": "0.1.4", - "concat-stream": "1.6.0" + "duplexer": "^0.1.1" } }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.15.1", - "is-my-json-valid": "2.17.2", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - } + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -1810,41 +2379,69 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true, - "requires": { - "sparkles": "1.0.0" - } + "optional": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "has-symbol-support-x": "^1.4.1" } }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "hooker": { "version": "0.2.3", @@ -1858,140 +2455,123 @@ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", "dev": true, - "requires": { - "inherits": "2.0.3", - "statuses": "1.5.0" - } + "optional": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true, + "optional": true }, "http-parser-js": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", - "integrity": "sha1-uc+/Sizybw/DSxDKFImid3HjR08=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", "dev": true }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "safer-buffer": ">= 2.1.2 < 3" } }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } + "optional": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true }, "imagemin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz", - "integrity": "sha1-6Q5/CTaDZZXxj6Ff6Qb0+iWeqEc=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", + "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", "dev": true, "requires": { - "buffer-to-vinyl": "1.1.0", - "concat-stream": "1.6.0", - "imagemin-gifsicle": "4.2.0", - "imagemin-jpegtran": "4.3.2", - "imagemin-optipng": "4.3.0", - "imagemin-svgo": "4.2.1", - "optional": "0.1.4", - "readable-stream": "2.3.3", - "stream-combiner2": "1.1.1", - "vinyl-fs": "2.4.4" + "file-type": "^10.7.0", + "globby": "^8.0.1", + "make-dir": "^1.0.0", + "p-pipe": "^1.1.0", + "pify": "^4.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "imagemin-gifsicle": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz", - "integrity": "sha1-D++butNHbmt2iFc2zFsLh6CHV8o=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz", + "integrity": "sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==", "dev": true, "optional": true, "requires": { - "gifsicle": "3.0.4", - "is-gif": "1.0.0", - "through2": "0.6.5" + "exec-buffer": "^3.0.0", + "gifsicle": "^4.0.0", + "is-gif": "^3.0.0" } }, "imagemin-jpegtran": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz", - "integrity": "sha1-G8bR4r0T/bZNJFUm1jWn5d/rEvw=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz", + "integrity": "sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g==", "dev": true, "optional": true, "requires": { - "is-jpg": "1.0.0", - "jpegtran-bin": "3.2.0", - "through2": "2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - } + "exec-buffer": "^3.0.0", + "is-jpg": "^2.0.0", + "jpegtran-bin": "^4.0.0" } }, "imagemin-optipng": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz", - "integrity": "sha1-dgRmOrLuMVczJ0cm/Rw3TStErbY=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz", + "integrity": "sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A==", "dev": true, "optional": true, "requires": { - "exec-buffer": "2.0.1", - "is-png": "1.1.0", - "optipng-bin": "3.1.4", - "through2": "0.6.5" + "exec-buffer": "^3.0.0", + "is-png": "^1.0.0", + "optipng-bin": "^5.0.0" } }, "imagemin-svgo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-4.2.1.tgz", - "integrity": "sha1-VPB9xW9HJgRi32phxUvvtEtXvlU=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz", + "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==", "dev": true, "optional": true, "requires": { - "is-svg": "1.1.1", - "svgo": "0.6.6", - "through2": "2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - } + "is-svg": "^4.2.1", + "svgo": "^1.3.2" } }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true, + "optional": true }, "indent-string": { "version": "2.1.0", @@ -1999,7 +2579,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { @@ -2008,8 +2588,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2019,31 +2599,36 @@ "dev": true }, "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "into-stream": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "optional": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "is-relative": "0.1.3" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -2064,28 +2649,47 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, - "is-bzip2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-extendable": { @@ -2106,87 +2710,74 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-gif": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", - "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", + "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "file-type": "^10.4.0" + } }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", - "dev": true - }, "is-jpg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.0.tgz", - "integrity": "sha1-KVnBfnNDDbOCZNp1uQ3VTy2G2hw=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz", + "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=", "dev": true, "optional": true }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true, + "optional": true }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "kind-of": "^3.0.2" } }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true, + "optional": true }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "kind-of": "3.2.2" + "isobject": "^3.0.1" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, "is-png": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", @@ -2194,72 +2785,47 @@ "dev": true, "optional": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "dev": true, + "optional": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz", - "integrity": "sha1-rA76r7ZTrFhHNwix+HNjbKEQ4xs=", "dev": true, "optional": true }, - "is-tar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "is-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.2.1.tgz", + "integrity": "sha512-PHx3ANecKsKNl5y5+Jvt53Y4J7MfMpbNZkv384QNiswMKAWIbvcqbPz+sYbFKJI8Xv3be01GSFniPmoaP+Ai5A==", + "dev": true, + "optional": true, + "requires": { + "html-comment-regex": "^1.1.2" + } }, - "is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", - "dev": true + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, "is-utf8": { "version": "0.2.1", @@ -2267,16 +2833,10 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "is-zip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isarray": { @@ -2292,106 +2852,59 @@ "dev": true }, "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, + "optional": true, "requires": { - "isarray": "1.0.0" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "jpegtran-bin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", - "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", + "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", "dev": true, "optional": true, "requires": { - "bin-build": "2.2.0", - "bin-wrapper": "3.0.2", - "logalot": "2.1.0" + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" } }, - "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", - "dev": true - }, "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true, "optional": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, + "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "json-buffer": "3.0.0" } }, "kind-of": { @@ -2400,44 +2913,13 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", - "dev": true, - "optional": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "2.3.3" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" + "is-buffer": "^1.1.5" } }, "livereload-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", "dev": true }, "load-json-file": { @@ -2446,161 +2928,17 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA==" }, "logalot": { "version": "2.1.0", @@ -2609,15 +2947,16 @@ "dev": true, "optional": true, "requires": { - "figures": "1.7.0", - "squeak": "1.3.0" + "figures": "^1.3.5", + "squeak": "^1.0.0" } }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "loud-rejection": { "version": "1.6.0", @@ -2625,15 +2964,16 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "optional": true }, "lpad-align": { "version": "1.1.2", @@ -2642,47 +2982,90 @@ "dev": true, "optional": true, "requires": { - "get-stdin": "4.0.1", - "indent-string": "2.1.0", - "longest": "1.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" } }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, "maxmin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", - "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", "dev": true, "requires": { - "chalk": "1.1.3", - "figures": "1.7.0", - "gzip-size": "1.0.0", - "pretty-bytes": "1.0.4" + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^3.0.0", + "pretty-bytes": "^3.0.0" }, "dependencies": { "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "number-is-nan": "^1.0.0" } } } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true, + "optional": true }, "meow": { "version": "3.7.0", @@ -2690,79 +3073,66 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" } }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "2.3.3" - } + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } } } }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true, + "optional": true }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, - "requires": { - "mime-db": "1.33.0" - } + "optional": true }, "minimatch": { "version": "3.0.4", @@ -2770,171 +3140,84 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "duplexer2": "0.0.2" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "is-plain-object": "^2.0.4" } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true } } }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true - }, - "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", - "dev": true, - "requires": { - "fstream": "1.0.11", - "glob": "7.0.6", - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.79.0", - "rimraf": "2.2.8", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.2.14" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" } }, - "node-sass": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", - "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", - "dev": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.2", - "get-stdin": "4.0.1", - "glob": "7.0.6", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.10.0", - "node-gyp": "3.6.2", - "npmlog": "4.1.2", - "request": "2.79.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0", - "true-case-path": "1.0.2" + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "4.1.2", - "which": "1.2.14" - } - }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true } } }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "optional": true }, "nopt": { "version": "3.0.6", @@ -2942,7 +3225,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -2951,31 +3234,81 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "optional": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "optional": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, + "optional": true, "requires": { - "remove-trailing-separator": "1.1.0" + "path-key": "^2.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, + "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "boolbase": "~1.0.0" } }, "number-is-nan": { @@ -2984,52 +3317,98 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, + "optional": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, + "optional": true, "requires": { - "ee-first": "1.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "once": { @@ -3038,114 +3417,99 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, "optipng-bin": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", - "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz", + "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==", "dev": true, "optional": true, "requires": { - "bin-build": "2.2.0", - "bin-wrapper": "3.0.2", - "logalot": "2.1.0" + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" } }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", "dev": true, + "optional": true, "requires": { - "is-stream": "1.1.0", - "readable-stream": "2.3.3" + "arch": "^2.1.0" } }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true, "optional": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", "dev": true, + "optional": true, "requires": { - "lcid": "1.0.0" + "p-timeout": "^1.1.1" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "optional": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true, + "optional": true + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", "dev": true, + "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "p-reduce": "^1.0.0" } }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "p-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", "dev": true }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true, + "optional": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, + "optional": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "p-finally": "^1.0.0" } }, "parse-json": { @@ -3154,13 +3518,13 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-dirname": { @@ -3175,7 +3539,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -3184,22 +3548,30 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "optional": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "dev": true, + "optional": true }, "pify": { "version": "2.3.0", @@ -3219,147 +3591,110 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" + } + }, + "plur": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.0.1.tgz", + "integrity": "sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA==", + "dev": true, + "requires": { + "irregular-plurals": "^2.0.0" } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "dev": true, + "optional": true }, "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz", + "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==", + "dev": true }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true, "optional": true }, - "qs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true, + "optional": true }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - } + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "rc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", - "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", + "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, + "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", "dev": true, "requires": { - "pinkie-promise": "2.0.1", - "readable-stream": "2.3.3" + "bytes": "1", + "string_decoder": "0.10" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } } }, "read-pkg": { @@ -3368,9 +3703,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -3379,8 +3714,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -3388,14 +3723,15 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, + "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "redent": { @@ -3404,29 +3740,24 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -3441,67 +3772,13 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.11.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.4.3", - "uuid": "3.2.1" - }, - "dependencies": { - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, "resolve": { @@ -3510,85 +3787,81 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, + "optional": true, "requires": { - "align-text": "0.1.4" + "lowercase-keys": "^1.0.0" } }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true, + "optional": true + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", "dev": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "7.0.6", - "lodash": "4.17.10", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - } - } - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -3596,34 +3869,14 @@ "dev": true, "optional": true }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "2.4.3", - "source-map": "0.4.4" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, "seek-bzip": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "dev": true, + "optional": true, "requires": { - "commander": "2.8.1" + "commander": "~2.8.1" } }, "semver": { @@ -3633,9 +3886,9 @@ "dev": true }, "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true, "optional": true }, @@ -3646,20 +3899,48 @@ "dev": true, "optional": true, "requires": { - "semver": "5.4.1" + "semver": "^5.3.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "optional": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "optional": true }, "signal-exit": { "version": "3.0.2", @@ -3667,13 +3948,147 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "optional": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "sort-keys": "^1.0.0" } }, "source-map": { @@ -3682,10 +4097,23 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "spdx-correct": { @@ -3694,7 +4122,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -3709,6 +4137,15 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3722,81 +4159,92 @@ "dev": true, "optional": true, "requires": { - "chalk": "1.1.3", - "console-stream": "0.1.1", - "lpad-align": "1.1.2" + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" } }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "optional": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } } } }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "optional": true }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", "dev": true }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { - "readable-stream": "2.3.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", "dev": true, "requires": { - "duplexer2": "0.1.4", - "readable-stream": "2.3.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -3804,15 +4252,10 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true + "safe-buffer": "~5.1.0" + } }, "strip-ansi": { "version": "3.0.1", @@ -3820,7 +4263,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -3829,32 +4272,25 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, + "optional": true, "requires": { - "first-chunk-stream": "1.0.0", - "strip-bom": "2.0.0" + "is-natural-number": "^4.0.1" } }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true, - "requires": { - "chalk": "1.1.3", - "get-stdin": "4.0.1", - "is-absolute": "0.1.7", - "is-natural-number": "2.1.1", - "minimist": "1.2.0", - "sum-up": "1.0.3" - } + "optional": true }, "strip-indent": { "version": "1.0.1", @@ -3862,31 +4298,17 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, "strip-outer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", - "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "sum-up": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", - "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, + "optional": true, "requires": { - "chalk": "1.1.3" + "escape-string-regexp": "^1.0.2" } }, "supports-color": { @@ -3896,167 +4318,159 @@ "dev": true }, "svgo": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", - "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "optional": true, "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.0.0", - "js-yaml": "3.6.1", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" }, "dependencies": { - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "optional": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "has-flag": "^3.0.0" } } } }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, + "optional": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" } }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", "dev": true, - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } + "optional": true }, "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", "dev": true, + "optional": true, "requires": { - "os-tmpdir": "1.0.2", - "uuid": "2.0.3" + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } + "optional": true }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true, + "optional": true + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", "dev": true, "requires": { - "through2": "2.0.3", - "xtend": "4.0.1" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - } + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true, + "optional": true }, - "tiny-lr": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", - "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "body-parser": "1.14.2", - "debug": "2.2.0", - "faye-websocket": "0.10.0", - "livereload-js": "2.3.0", - "parseurl": "1.3.2", - "qs": "5.1.0" + "kind-of": "^3.0.2" } }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "extend-shallow": "2.0.1" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "punycode": "1.4.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "trim-newlines": { @@ -4070,133 +4484,159 @@ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", "dev": true, + "optional": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.2" } }, - "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "requires": { - "glob": "6.0.4" + "commander": "~2.17.1", + "source-map": "~0.6.1" }, "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "unbzip2-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.1.tgz", + "integrity": "sha512-sgDYfSDPMsA4Hr2/w7vOlrJBlwzmyakk1+hW8ObLvxSp0LA36LcL2XItGvOT3OSblohSdevMuT8FQjLsqyy4sA==", "dev": true, - "optional": true + "optional": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "underscore.string": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.18" + "sprintf-js": "^1.0.3", + "util-deprecate": "^1.0.2" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true, "optional": true }, - "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", - "dev": true - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "json-stable-stringify": "1.0.1", - "through2-filter": "2.0.0" + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } } }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, "uri-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", "dev": true }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, + "optional": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", "dev": true, - "optional": true, - "requires": { - "ip-regex": "1.0.3" - } + "optional": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "util-deprecate": { "version": "1.0.2", @@ -4204,112 +4644,34 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, + "optional": true, "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true, - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-assign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "readable-stream": "2.3.3" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "3.5.1", - "glob-stream": "5.3.5", - "graceful-fs": "4.1.11", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "0.3.0", - "lazystream": "1.0.0", - "lodash.isequal": "4.5.0", - "merge-stream": "1.0.1", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "readable-stream": "2.3.3", - "strip-bom": "2.0.0", - "strip-bom-stream": "1.0.0", - "through2": "2.0.3", - "through2-filter": "2.0.0", - "vali-date": "1.0.0", - "vinyl": "1.2.0" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - } - } + "optional": true }, - "ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "wrap-fn": "0.1.5" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "websocket-driver": { @@ -4318,76 +4680,24 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "0.4.12", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true, - "optional": true - }, "which": { "version": "1.2.14", "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "dev": true, + "optional": true, "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "dev": true, - "requires": { - "co": "3.1.0" + "isexe": "^2.0.0" } }, "wrappy": { @@ -4402,63 +4712,22 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } + "optional": true }, "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, + "optional": true, "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } diff --git a/docs/src/package.json b/docs/src/package.json index f1a4c361a0f..5a7586ac7e2 100644 --- a/docs/src/package.json +++ b/docs/src/package.json @@ -1,12 +1,15 @@ { "name": "ACE3", "version": "0.1.0", + "dependencies": { + "lodash": "^4.17.13" + }, "devDependencies": { - "grunt": "^1.0.2", + "grunt": "^1.0.4", "grunt-contrib-concat": "^1.0.1", - "grunt-contrib-imagemin": "^1.0.1", - "grunt-contrib-uglify": "^2.0.0", - "grunt-contrib-watch": "^1.0.1", - "grunt-sass": "^2.1.0" + "grunt-contrib-imagemin": "^3.1.0", + "grunt-contrib-uglify": "^4.0.0", + "grunt-contrib-watch": "^1.1.0", + "grunt-sass": "^3.0.2" } } diff --git a/docs/team.md b/docs/team.md index 4998330e97c..1fb00c4085f 100644 --- a/docs/team.md +++ b/docs/team.md @@ -58,6 +58,8 @@ This lists all the maintainers responsible for project management and the overal - [Kieran](https://github.com/kieran-s){:target="_blank"} - [Giallustio](https://github.com/Giallustio){:target="_blank"} - [654wak654](https://github.com/654wak654){:target="_blank"} +- [mharis001](https://github.com/mharis001){:target="_blank"} +- [Brandon (TCVM)](https://github.com/TheCandianVendingMachine){:target="_blank"} ## Contributors diff --git a/docs/tools/document_functions.py b/docs/tools/document_functions.py new file mode 100644 index 00000000000..b51aae18a30 --- /dev/null +++ b/docs/tools/document_functions.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python3 +""" +Author: SilentSpike +Crawl function headers to produce appropriate documentation of public functions. + +Supported header sections: + - Author(s) (with description below) + - Arguments + - Return Value + - Example(s) + - Public (by default function will only be documented if set to "Yes") + +EXAMPLES + document_functions common --debug + Crawl only functions in addons/common and only reports debug messages. +""" + +import os +import sys +import re +import argparse + +class FunctionFile: + def __init__(self, directory="."): + self.directory = directory + + # False unless specified in processing + self.debug = False + + # Empty until imported from file + self.path = "" + self.header = "" + + # Defaults until header is processed + self.public = False + self.authors = [] + self.description = "" + self.arguments = [] + self.return_value = [] + self.example = "" + + # Filepath should only be logged once + self.logged = False + + def import_header(self, file_path): + self.path = file_path + + with open(file_path) as file: + code = file.read() + + header_match = re.match(r"\s*/\*.+?\*/", code, re.S) + if header_match: + self.header = header_match.group(0) + else: + self.feedback("Missing header", 3) + + def has_header(self): + return bool(self.header) + + def process_header(self, debug=False): + # Detailed debugging occurs here so value is set + self.debug = debug + + # Preemptively cut away the comment characters (and leading/trailing whitespace) + self.header_text = "\n".join([x[3:].strip() for x in self.header.splitlines()]) + + # Split the header into expected sections + self.sections = re.split(r"^(Author|Argument|Return Value|Example|Public)s?:\s?", self.header_text, 0, re.M) + + # If public section is missing we can't continue + public_raw = self.get_section("Public") + if not public_raw: + self.feedback("Public value undefined", 3) + return + + # Determine whether the header is public + self.public = self.process_public(public_raw) + + # Don't bother to process the rest if private + # Unless in debug mode + if not self.public and not self.debug: + return + + # Retrieve the raw sections text for processing + author_raw = self.get_section("Author") + arguments_raw = self.get_section("Argument") + return_value_raw = self.get_section("Return Value") + example_raw = self.get_section("Example") + + # Author and description are stored in first section + if author_raw: + self.authors = self.process_author(author_raw) + self.description = self.process_description(author_raw) + + if arguments_raw: + self.arguments = self.process_arguments(arguments_raw) + + # Process return + if return_value_raw: + self.return_value = self.process_return_value(return_value_raw) + + # Process example + if example_raw: + self.example = example_raw.strip() + + def get_section(self, section_name): + try: + section_text = self.sections[self.sections.index(section_name) + 1] + return section_text + except ValueError: + self.feedback("Missing \"{}\" header section".format(section_name), 2) + return "" + + def process_public(self, raw): + # Raw just includes an EOL character + public_text = raw[:-1] + + if not re.match(r"(Yes|No)", public_text, re.I): + self.feedback("Invalid public value \"{}\"".format(public_text), 2) + + return public_text.capitalize() == "Yes" + + def is_public(self): + return self.public + + def process_author(self, raw): + # Authors are listed on the first line + authors_text = raw.splitlines()[0] + + # Seperate authors are divided by commas + return authors_text.split(", ") + + def process_description(self, raw): + # Just use all the lines after the authors line + description_text = "".join(raw.splitlines(1)[1:]) + + return description_text + + def process_arguments(self, raw): + lines = raw.splitlines() + + if lines[0] == "None": + return [] + + if lines.count("") == len(lines): + self.feedback("No arguments provided (use \"None\" where appropriate)", 2) + return [] + + if lines[-1] == "": + lines.pop() + else: + self.feedback("No blank line after arguments list", 1) + + arguments = [] + for argument in lines: + valid = re.match(r"^(\d+):\s(.+?)\<([\s\w]+?)\>(\s\(default: (.+)\))?$", argument) + + if valid: + arg_index = valid.group(1) + arg_name = valid.group(2) + arg_types = valid.group(3) + arg_default = valid.group(5) + arg_notes = [] + + if arg_index != str(len(arguments)): + self.feedback("Argument index {} does not match listed order".format(arg_index), 1) + + if arg_default == None: + arg_default = "" + + arguments.append([arg_index, arg_name, arg_types, arg_default, arg_notes]) + else: + # Notes about the above argument won't start with an index + # Only applies if there exists an above argument + if re.match(r"^(\d+):", argument) or not arguments: + self.feedback("Malformed argument \"{}\"".format(argument), 2) + arguments.append(["?", "Malformed", "?", "?", []]) + else: + arguments[-1][-1].append(argument) + + return arguments + + def process_return_value(self, raw): + return_value = raw.strip() + + if return_value == "None": + return [] + + valid = re.match(r"^(.+?)\<([\s\w]+?)\>", return_value) + + if valid: + return_name = valid.group(1) + return_types = valid.group(2) + else: + self.feedback("Malformed return value \"{}\"".format(return_value), 2) + return ["Malformed",""] + + return [return_name, return_types] + + def document(self, component): + str_list = [] + + # Title + str_list.append("\n## ace_{}_fnc_{}\n".format(component,os.path.basename(self.path)[4:-4])) + # Description + str_list.append("__Description__\n\n" + self.description) + # Arguments + if self.arguments: + str_list.append("__Parameters__\n\nIndex | Description | Datatype(s) | Default Value\n--- | --- | --- | ---\n") + for argument in self.arguments: + str_list.append("{} | {} | {} | {}\n".format(*argument)) + str_list.append("\n") + else: + str_list.append("__Parameters__\n\nNone\n\n") + # Return Value + if self.return_value: + str_list.append("__Return Value__\n\nDescription | Datatype(s)\n--- | ---\n{} | {}\n\n".format(*self.return_value)) + else: + str_list.append("__Return Value__\n\nNone\n\n") + # Example + str_list.append("__Example__\n\n```sqf\n{}\n```\n\n".format(self.example)) + # Authors + str_list.append("\n__Authors__\n\n") + for author in self.authors: + str_list.append("- {}\n".format(author)) + # Horizontal rule + str_list.append("\n---\n") + + return ''.join(str_list) + + def log_file(self, error=False): + # When in debug mode we only want to see the files with errors + if not self.debug or error: + if not self.logged: + rel_path = os.path.relpath(self.path, self.directory) + + self.write("Processing... {}".format(rel_path), 1) + self.logged = True + + def feedback(self, message, level=0): + priority_str = ["Info","Warning","Error","Aborted"][level] + + self.log_file(level > 0) + self.write("{0}: {1}".format(priority_str, message)) + + def write(self, message, indent=2): + to_print = [" "]*indent + to_print.append(message) + print("".join(to_print)) + +def document_functions(components): + os.makedirs('../wiki/functions/', exist_ok=True) + + for component in components: + output = os.path.join('../wiki/functions/',component) + ".md" + with open(output, "w") as file: + for function in components[component]: + file.write(function.document(component)) + +def crawl_dir(directory, debug=False): + components = {} + + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(".sqf") and file.startswith("fnc_"): + file_path = os.path.join(root, file) + + # Attempt to import the header from file + function = FunctionFile(directory) + function.import_header(file_path) + + # Undergo data extraction and detailed debug + if function.has_header(): + function.process_header(debug) + + if function.is_public() and not debug: + # Add functions to component key (initalise key if necessary) + component = os.path.basename(os.path.dirname(root)) + components.setdefault(component,[]).append(function) + + function.feedback("Publicly documented") + + document_functions(components) + +def main(): + print(""" + ######################### + # Documenting Functions # + ######################### + """) + + parser = argparse.ArgumentParser() + parser.add_argument('directory', nargs="?", type=str, default=".", help='only crawl specified module addon folder') + parser.add_argument('--debug', action="store_true", help='only check for header debug messages') + args = parser.parse_args() + + # abspath is just used for the terminal output + prospective_dir = os.path.abspath(os.path.join('../../addons/',args.directory)) + if os.path.isdir(prospective_dir): + print("Directory: {}".format(prospective_dir)) + crawl_dir(prospective_dir, args.debug) + else: + print("Invalid directory: {}".format(prospective_dir)) + +if __name__ == "__main__": + main() diff --git a/docs/wiki/class-names.md b/docs/wiki/class-names.md index b373a367b46..ed7173d9730 100644 --- a/docs/wiki/class-names.md +++ b/docs/wiki/class-names.md @@ -38,7 +38,7 @@ ACE_200Rnd_65x39_cased_Box_Tracer_Dim | 6.5mm IR-DIM | Magazine | ACE_30Rnd_65x39_caseless_mag_Tracer_Dim | 6.5mm IR-DIM | Magazine | ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim | 6.5mm IR-DIM | Magazine | ACE_30Rnd_556x45_Stanag_M995_AP_mag | 5.56mm AP | Magazine | -ACE_30Rnd_556x45_Stanag_Mk262_mag | 5.56mm Mk262 | Magazine | +ACE_30Rnd_556x45_Stanag_Mk262_mag | 5.56mm Mk262 | Magazine | ACE_30Rnd_556x45_Stanag_Mk318_mag | 5.56mm Mk318 | Magazine | ACE_30Rnd_556x45_Stanag_Tracer_Dim | 5.56mm IR-DIM | Magazine | ACE_20Rnd_762x51_Mag_Tracer | 7.62mm Tracer | Magazine | @@ -230,6 +230,8 @@ ACE_salineIV_500 | Saline IV (500ml) | ACE_ItemCore | ACE_salineIV_250 | Saline IV (250ml) | ACE_ItemCore | ACE_surgicalKit | Surgical Kit | ACE_ItemCore | ACE_tourniquet | Tourniquet (CAT) | ACE_ItemCore | +ACE_medicalSupplyCrate | Simple ACE Medical Supply Crate | ammo box | +ACE_medicalSupplyCrate_advanced | Advanced ACE Medical Supply Crate | ammo box | ### MicroDAGR `Added in 3.0.0` diff --git a/docs/wiki/development/branching-and-release.md b/docs/wiki/development/branching-and-release.md index 7e6c1772da9..80216f3b92d 100644 --- a/docs/wiki/development/branching-and-release.md +++ b/docs/wiki/development/branching-and-release.md @@ -40,7 +40,7 @@ During this release process between the Friday and Tuesday, the day of release, ### 3.1 Branching * New features, bug fixes that are not a hotfix or other work will always be branched off `master` or another branch but never a `hotfix` or the `release` branch. -* Hotfixes are always branched off the `release` branch +* Hotfixes are always branched off the `release` branch. * The `release` branch is never merged or deleted. Only `master` or hotfixes are allowed to merge into the `release` branch. ### 3.2 Diagram diff --git a/docs/wiki/development/coding-guidelines.md b/docs/wiki/development/coding-guidelines.md index 23ad2317f93..0d2fb64ed39 100644 --- a/docs/wiki/development/coding-guidelines.md +++ b/docs/wiki/development/coding-guidelines.md @@ -126,7 +126,8 @@ These macros are allowed but are not enforced. |`GETVAR(player,MyVarName,false)` | `player getVariable ["MyVarName", false]` | |`GETMVAR(MyVarName,objNull)` | `missionNamespace getVariable ["MyVarName", objNull]` | |`GETUVAR(MyVarName,displayNull)` | `uiNamespace getVariable ["MyVarName", displayNull]` | -|`SETVAR(player,MyVarName,127)` | `player setVariable ["MyVarName", 127] SETPVAR(player,MyVarName,127) player setVariable ["MyVarName", 127, true]` | +|`SETVAR(player,MyVarName,127)` | `player setVariable ["MyVarName", 127]` | +|`SETPVAR(player,MyVarName,127)` | `player setVariable ["MyVarName", 127, true]` | |`SETMVAR(MyVarName,player)` | `missionNamespace setVariable ["MyVarName", player]` | |`SETUVAR(MyVarName,_control)` | `uiNamespace setVariable ["MyVarName", _control]` | @@ -134,14 +135,16 @@ These macros are allowed but are not enforced. Note that you need the strings in module `stringtable.xml` in the correct format: `STR_ACE__` -Example: `STR_Balls_Banana` +Example: `STR_ACE_Balls_Banana` -Script strings (still require `localize` to localize the string): +Script strings: | Macro | Expands to | | -------|---------| |`LSTRING(banana)` | `"STR_ACE_balls_banana"` | +|`LLSTRING(banana)` | `localize "STR_ACE_balls_banana"` | |`ELSTRING(leg,banana)` | `"STR_ACE_leg_banana"` | +|`LELSTRING(leg,banana)` | `localize "STR_ACE_leg_banana"` | Config Strings (require `$` as first character): @@ -298,7 +301,7 @@ call { call { if (/* condition */) then { /* code */ - }; + }; }; }; ``` @@ -394,6 +397,23 @@ Magic numbers are any of the following: [Source](http://en.wikipedia.org/wiki/Magic_number_%28programming%29){:target="_blank"} +### 5.7 Spaces between array elements +When using array notation `[]`, always use a space between elements to improve code readability. + +Good: + +```js +params ["_unit", "_vehicle"]; +private _pos = [0, 0, 0]; +``` + +Bad: + +```js +params ["_unit","_vehicle"]; +private _pos = [0,0,0]; +``` + ## 6. Code Standards @@ -603,14 +623,12 @@ Event handlers in ACE3 are implemented through the CBA event system (ACE3's own More information on the [CBA Events System](https://github.com/CBATeam/CBA_A3/wiki/Custom-Events-System){:target="_blank"} and [CBA Player Events](https://github.com/CBATeam/CBA_A3/wiki/Player-Events){:target="_blank"} pages. -
-
Warning about BIS event handlers:
-

BIS's event handlers (`addEventHandler`, `addMissionEventHandler`) are slow when passing a large code variable. Use a short code block that calls the function you want.

- ```js - player addEventHandler ["Fired", FUNC(handleFired)]; // bad - player addEventHandler ["Fired", {call FUNC(handleFired)}]; // good - ``` -
+**Warning about BIS event handlers:** +BIS's event handlers (`addEventHandler`, `addMissionEventHandler`) are slow when passing a large code variable. Use a short code block that calls the function you want. +```js +player addEventHandler ["Fired", FUNC(handleFired)]; // bad +player addEventHandler ["Fired", {call FUNC(handleFired)}]; // good +``` ### 7.4 Hashes diff --git a/docs/wiki/development/extension-guidelines.md b/docs/wiki/development/extension-guidelines.md index f4dc6e40bd1..d7f4fe08a67 100644 --- a/docs/wiki/development/extension-guidelines.md +++ b/docs/wiki/development/extension-guidelines.md @@ -58,3 +58,36 @@ extensions\ ``` ### 2.2 Creating a new Extension + +#### 2.2.1 Arma Config + +ACE3 loads extensions defined in `ACE_Extensions` root config class and supports the following entries: + +```cpp +// Platform +windows = 1; // Load on Windows +linux = 1; // Load on Linux + +// Type +client = 1; // Load on Client +server = 1; // Load on Server +``` + +```cpp +class ACE_Extensions { + // Windows Client only extension + class tag_extension { + windows = 1; + client = 1; + }; + + // Any platform Server extension + class tag_extension2 { + windows = 1; + linux = 1; + server = 1; + }; +}; +``` + +Combining platform and client/server values is possible to get all combinations currently supported by the game and more. diff --git a/docs/wiki/development/how-to-translate-ace3.md b/docs/wiki/development/how-to-translate-ace3.md index 6ceb41a01fd..55e460dcbb6 100644 --- a/docs/wiki/development/how-to-translate-ace3.md +++ b/docs/wiki/development/how-to-translate-ace3.md @@ -9,23 +9,24 @@ order: 20 This page describes in short how you can help translating ACE3 into your language. -1. If you don't already have a GitHub account create one at [http://github.com](http://github.com) -2. Open the ACE3 repository at [https://github.com/acemod/ACE3](https://github.com/acemod/ACE3) -3. In the top right corner press the `Fork` button -4. You are being redirected to your personal fork, a version that is hosted on your GitHub account (it says "yourUsername/ACE3") -5. Clone that fork to your PC (There are a lot of tools and tutorials how to do this (e.g. [GitHub for Windows](https://windows.github.com))) -6. Download [tabler](https://github.com/bux578/tabler/releases) and extract it somewhere -7. Open the tabler.exe and in the menu click "File > Open language files" -8. Point tabler to the cloned ACE3 directory -9. Start translating -10. When done go to the menu and click "File > Save language files" -11. Commit your changes to your local cloned repository -12. Sync (Push) your commit(s) to your fork -13. Create a Pull Request for your changes +1. If you don't already have a GitHub account create one at [http://github.com](http://github.com){:target="_blank"} +1. Open the ACE3 repository at [https://github.com/acemod/ACE3](https://github.com/acemod/ACE3){:target="_blank"} +1. Take a look at the [open translation pull requests](https://github.com/acemod/ACE3/pulls?q=is%3Aopen+is%3Apr+label%3Aarea%2Ftranslations){:target="_blank"} to see if someone is already translating ACE3 into your language +1. In the top right corner press the `Fork` button +1. You are being redirected to your personal fork, a version that is hosted on your GitHub account (it says "yourUsername/ACE3") +1. Clone that fork to your PC (There are a lot of tools and tutorials how to do this (e.g. [GitHub for Windows](https://windows.github.com){:target="_blank"})) +1. Download [tabler](https://github.com/bux578/tabler/releases){:target="_blank"} and extract it somewhere +1. Open the tabler.exe and in the menu click "File > Open language files" +1. Point tabler to the cloned ACE3 directory +1. Start translating +1. When done go to the menu and click "File > Save language files" +1. Commit your changes to your local cloned repository +1. Sync (Push) your commit(s) to your fork +1. Create a Pull Request for your changes (The last three steps require some git knowledge, but there are a lot of tutorials out there) -[GitHub for Windows help](https://windows.github.com/help.html) +[GitHub for Windows help](https://windows.github.com/help.html){:target="_blank"} #### Community Translation Guides -**Spanish:** [https://gist.github.com/Legolasindar/bf8a3b09cb835f72501f](https://gist.github.com/Legolasindar/bf8a3b09cb835f72501f) +**Spanish:** [https://gist.github.com/Legolasindar/bf8a3b09cb835f72501f](https://gist.github.com/Legolasindar/bf8a3b09cb835f72501f){:target="_blank"} diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index 4de655102d4..5a39f5fb1af 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -13,12 +13,13 @@ This page describes how you can setup your development environment for ACE3, all ## 1. Requirements - Arma 3 -- A proper installation of the Arma 3 Tools (available on Steam) -- A properly setup P-drive +- Arma 3 Tools (available on Steam) +- P-drive - Run Arma 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) - [Python 3.x](https://www.python.org/) -- [Mikero Tools](https://armaservices.maverick-applications.com/Products/MikerosDosTools/FileBrowserFree): DePbo, DeRap, DeOgg, Rapify, MakePbo, PboProject >=1.70 -- `*.hpp` removed from PboProject's "Exclude From Pbo" list +- [Mikero Tools](https://mikero.bytex.digital/Downloads): DePbo, DeOgg, DeTex, Rapify, MakePbo, PboProject >=1.70 + - `*.hpp` removed from PboProject's "Exclude From Pbo" list + - `-F rebuild RequiredAddons` disabled - Python, Mikero Tools and Git in PATH environment variable - [CBA](https://github.com/CBATeam/CBA_A3/releases/latest) mod (release or development version) diff --git a/docs/wiki/feature/atragmx.md b/docs/wiki/feature/atragmx.md index d3126e0ba5f..674a26f153e 100644 --- a/docs/wiki/feature/atragmx.md +++ b/docs/wiki/feature/atragmx.md @@ -38,10 +38,6 @@ Horus ATragMX software considers atmospheric conditions, gun data, ammunition, r - `OPTIONS` / `CONTROLS` / `CONFIGURE ADDONS` / `ACE3 Equipment` -#### 3.1.3 Inventory - -Inventory management - ### 3.2 Example with M14 and default 7.62mm 20Rnd Mag **Start of the mission:** @@ -89,7 +85,7 @@ Horus ATragMX software considers atmospheric conditions, gun data, ammunition, r ### 3.4 Example with overwritten zero distance -- The `Default zero distance` can be overwritten with the [Scopes module]({{ site.baseurl }}/wiki/feature/scopes.html), the [Scopes Framework]({{ site.baseurl }}/wiki/framework/scopes-framework.html) or the [CBA Settings System](https://github.com/CBATeam/CBA_A3/wiki/CBA-Settings-System). +- The `Default zero distance` can be overwritten with the [Scopes Options]({{ site.baseurl }}/wiki/feature/scopes.html), the [Scopes Framework]({{ site.baseurl }}/wiki/framework/scopes-framework.html) or the [CBA Settings System](https://github.com/CBATeam/CBA_A3/wiki/CBA-Settings-System). - In this case, the [Range Card]({{ site.baseurl }}/wiki/feature/rangecard.html) will be automatically updated, NOT the AtragMx. - Open the AtragMx and the `Atmsphr` column, select `Default` and `Done`. [[Manual]](https://horusvision.com/download/manual_Horus_ATrag-v385.pdf#page=15) - Open the `Gun` column, check and update the `Zero Range` and `Done`. @@ -128,12 +124,16 @@ Horus ATragMX software considers atmospheric conditions, gun data, ammunition, r - [ATragMX Framework]({{ site.baseurl }}/wiki/framework/atragmx.html) - -## 4. Official Manual and Horus Videos +### 3.7 Reseting the AtragMx `GunList` + +- Open the Eden Editor and the Extended Debug Console (Ctrl+D). +- Execute `call ace_atragmx_fnc_clear_user_data` (LOCAL EXEC). +- The original ACE3 `GunList` will be restored (all `Add New Gun` entries deleted). + + +## 4. Official References - [Official Manual]({{ site.ace.githubUrl }}/blob/master/extras/manual_Horus_ATrag-v385.pdf) -- [Horus video part1](https://www.youtube.com/watch?v=pg6oqT5jVds) -- [Horus video part2](https://www.youtube.com/watch?v=7SkRnbwoPmw) ## 5. Dependencies diff --git a/docs/wiki/feature/crew-served-weapons.md b/docs/wiki/feature/crew-served-weapons.md new file mode 100644 index 00000000000..33a01bb4602 --- /dev/null +++ b/docs/wiki/feature/crew-served-weapons.md @@ -0,0 +1,78 @@ +--- +layout: wiki +title: Crew Served Weapons +description: Static weapons that require multiple people to crew +group: feature +category: equipment +parent: wiki +mod: ace +version: + major: 3 + minor: 13 + patch: 0 +--- + +## 1. Overview + +Crew Served Weapons are static weapons that require multiple people to crew them. + +### 1.1 Loading/Unloading of ammo into static weapons + +Static weapons need to be manually loaded with ammo when placed down. The user can also unload ammo from static weapons, and place the ammo into their inventory for transport + +### 1.2 Assembling/Disassembling of static weapons + +Static weapons are assembled when a tripod is placed down, and the weapon mounted ontop. The user can then disassemble the weapon back into the tripod and weapon-bag and carry it around for the next deployment. + +## 2. Usage + +### 2.1 Loading Ammo + +- Apporach the static weapon with the relavent ammo in your inventory +- Interact with the weapon using ⊞ Win (ACE3 default) and navigate to the `CSW` menu. +- Select `Handle Ammo` +- Select `Load X` where X is the ammo you want loaded and wait for the timer to complete + +### 2.2 Unloading ammo + +- Apporach the static weapon and interact ⊞ Win (ACE3 default) +- Navigate to the `CSW` menu +- Select `Unload Ammo` and wait for the timer to complete +- The ammo will be placed to the left of the gun + +### 2.3 Assembling Weapon + +- Have the tripod and the relavent weapon in your launcher slot +- Place down tripod in the self-interact menu Ctrl + ⊞ Win (ACE3 default) +- Approach the tripod with the wanted weapon, and interact ⊞ Win (ACE3 default) +- Navigate to the `CSW` menu, and select `Assemble Weapon` +- Wait for the timer to complete, and the weapon will be assembled in the direction the tripod is facing + +### 2.4 Disassembling Weapon + +- Approach the static weapon and interact ⊞ Win (ACE3 default) +- Navigate to the `CSW` menu +- Select `Disassemble Weapon` +- Wait for the timer to complete +- The tripod, ammo, and weapon will spawn where the static weapon was + +## 3. Addon Options + +### 3.1 defaultAssemblyMode + +- Enables/Disables the ability to assemble the CSW through the addon (Non-Vanilla assembly) +- Default: Off + +### 3.2 handleExtraMagazines + +- Enables/Disables the magazines in the CSW will appear next to the gun on weapon initialization when using defaultAssemblyMode and you have a pre-placed static weapon +- Default: On + +### 3.3 ammoHandling + +- Whether or not you want to handle ammo using the CSW way. Does nothing if using defaultAssemblyMode +- Default: On + +## 4. Dependencies + +{% include dependencies_list.md component="csw" %} diff --git a/docs/wiki/feature/disposable.md b/docs/wiki/feature/disposable.md index acf7f78a40f..a6da6e3775a 100644 --- a/docs/wiki/feature/disposable.md +++ b/docs/wiki/feature/disposable.md @@ -14,7 +14,7 @@ version: ## 1. Overview -The NLAW is shoulder fired and disposable, firing just once before being needed to be disposed of. This feature makes the NLAW disposable and provides the tools for other addons to do the same. +The NLAW is shoulder fired and disposable, firing just once before being needed to be disposed of. This feature makes the NLAW disposable. ## 2. Dependencies diff --git a/docs/wiki/feature/dragon.md b/docs/wiki/feature/dragon.md new file mode 100644 index 00000000000..6a3e75becb1 --- /dev/null +++ b/docs/wiki/feature/dragon.md @@ -0,0 +1,80 @@ +--- +layout: wiki +title: M47 Dragon Missile +description: M47 Dragon +group: feature +category: equipment +parent: wiki +mod: ace +version: + major: 3 + minor: 13 + patch: 0 +--- + +## 1. Overview + +### 1.1 Guidance + +The M47 Dragon is a wire-guided SACLOS missile with a unique manuever system. It has a series of charges along the missile that fire every third of a second to adjust the missile on course + +### 1.2 Attack profiles + +The missile requires line of sight to the target at all times. Keep your crosshair on the target as the missile cruises toward it until impact. +If you lose line of sight the missile will stop tracking toward your crosshair and will fly on its current trajectory. You can regain control if the missile re-enters line of sight. +If the missile exceeds its maximum range the wire will snap and it will fly off in a random direction. +The missiles manuever system causes inaccuracy that cannot be corrected for by the gunner. This means that the risk of missing increases as range goes up + +## 2. Usage + +### 2.1 Placement + +- Ensure that you have the M47 Super-Dragon launcher as well as the SU-36/P sighting unit +- Use self interaction Ctrl+⊞ Win (ACE3 default key bind `Self Interaction Key`) +- Select 'Place Tripod' +- Interact with the missile ⊞ Win (ACE3 default key bind `Interaction Key`) +- Select 'Attach Sight' +- Get into the launcher +- Point at target +- Fire + +### 2.2 Tear Down +- Interact with the missile ⊞ Win (ACE3 default key bind `Interaction Key`) +- Select 'Disassemble' +- Look to the right of the launcher and pick up the sighting unit +- Move on + +## 3. Sight Ranging + +The Dragon gunners use the stadia lines in the daysight to determine if a target falls within range. Moving and stationary vehicles may present flank, oblique, and frontal or rear targets (Figure 1). +At maximum range (1,500 meters), a 7-meter (23-foot) long target completely fills the area between the stadia lines and exceeds the stadia lines at a closer range. + +**Figure 1. Frontal, oblique, and flank targets** +Frontal, Oblique, and Flank targets + +### 3.1 **Flanking Targets (Full Stadia)** + +Adjust the sight picture by moving the launcher so the target centers between the stadia lines (Figure 2). + +**Figure 2. Range determination for flank target.** +Frontal, Oblique, and Flank targets + +### 3.2 **Oblique Targets** + +If you can see more of the flank, use the full-stadia method (Figure 3.1). The vehicle should appear to fill the area between the stadia lines. If you see more of the front or rear, use the half-stadia method (Figure 3.2). The track of the vehicle should fit between one stadia line and the center. + +**Figure 3.1. Range determination for oblique target, more flank visible** +Frontal, Oblique, and Flank targets +**Figure 3.2. Range determination for oblique target, more front or rear visible** +Frontal, Oblique, and Flank targets + +### 3.3 **Frontal (Head-On) or Rear (Going Away, Half-Stadia) Targets** + +Adjust the sight picture by moving the launcher to align the vertical cross hair and one of the stadia lines on the target (Figure 4) + +**Figure 4. Range determination for frontal or rear target.** +Frontal, Oblique, and Flank targets + +## 4. Dependencies + +{% include dependencies_list.md component="dragon" %} diff --git a/docs/wiki/feature/hellfire.md b/docs/wiki/feature/hellfire.md index 0f8376db208..c2f4dd198a5 100644 --- a/docs/wiki/feature/hellfire.md +++ b/docs/wiki/feature/hellfire.md @@ -14,11 +14,14 @@ version: ## 1. Overview -### 1.1 Guidance -Hellfire missile is a semi-active laser guided weapon. -It requires an observer (either the launch platform or an external source) to provide laser designation. +### 1.1 AGM-114K/N Guidance +The AGM-114K/N Hellfire is a semi-active laser guided weapon. It requires an observer (either the launch platform or an external source) to provide laser designation. -### 1.2 Attack profiles +### 1.2 AGM-114L Guidance +The AGM-114L Hellfire is an active-radar homing guided weapon. It is fire and forget as long as you lock a target initially. This does not require an external laser designation +The missile uses an external radar source to guide the missile towards the target. If this radar lock is dropped or if it gets within range of the target, it switches to an internal radar to guide itself for the terminal phase. + +### 1.3 Attack profiles Missile does not need line of sight to target when fired and can Lock-On-After-Launch (can also delay lasing target). This and the attack profile used will effect missile's flight and max altitude. - LOBL: Lock-On-Before-Launch, standard top attack. @@ -26,12 +29,19 @@ This and the attack profile used will effect missile's flight and max altitude. - LOAL-LOW: Missile immediately gains ~90m altitude. - LOAL-HI: Missile immediately gains ~300m altitude. -## 2. Usage +## 2.1 AGM-114K/N Usage - Switching to the hellfire weapon will show additional information about the weapon in weapon status display. - Shows: lock mode, laser code and a laser receiver indicator. E.G. `LOAL-DIR CODE: 1111` - Laser receiver indicator turns red when it detects a laser pulse set the the current code. - Cycle attack profiles with vehicle's ACE3 Interaction Menu or with the missile guidance "Cycle Fire Mode" keybind (default: Ctrl + Tab) +## 2.2 AGM-114L Usage +- Switching to the hellfire weapon will show additional information about the weapon in weapon status display. +- Shows: lock mode. E.G. `LOAL-HI` +- Cycle attack profiles with vehicle's ACE3 Interaction Menu or with the missile guidance "Cycle Fire Mode" keybind (default: Ctrl + Tab) +- Lock onto a target using the default ARMA targeting (default: T) +- Once you fire the missile you can either stay locked on or abandon the lock and let the missile guide itself + ## 3 Adding to vehicles - Easiest way to add is via the 1.70 Pylons system. - Hellfires can also be added to other vehicles via config or script. diff --git a/docs/wiki/feature/kestrel4500.md b/docs/wiki/feature/kestrel4500.md index 861c3a82952..cf5a3f4ddd3 100644 --- a/docs/wiki/feature/kestrel4500.md +++ b/docs/wiki/feature/kestrel4500.md @@ -45,10 +45,6 @@ The Kestrel 4500 Pocket Weather Tracker is Kestrel's environmental meter. This i - `OPTIONS` / `CONTROLS` / `CONFIGURE ADDONS` / `ACE3 Equipment` -#### 2.1.3 Inventory - -Inventory management - ### 2.2 `CROSSWIND` / `HEADWIND` Feature - [Official Kestrel Instruments video](https://www.youtube.com/watch?v=4Q_qgXwlRqk) diff --git a/docs/wiki/feature/medical-system.md b/docs/wiki/feature/medical-system.md index 7f0b6ebbd66..3b078303888 100644 --- a/docs/wiki/feature/medical-system.md +++ b/docs/wiki/feature/medical-system.md @@ -1,7 +1,7 @@ --- layout: wiki title: Medical System -description: ACE3 provides users with a more realistic medical system and comes in both a basic and advanced version. Both versions have overlap but each have their own unique characteristics. +description: ACE3 provides users with a more realistic medical system. group: feature order: 4 category: realism @@ -12,402 +12,250 @@ version: minor: 0 patch: 0 --- -**Disclaimer:** With the documentation for the medical system being extremely long it's highly advised to use the table of contents at the top right corner of the page. ## 1. Overview -ACE3 provides users with a more realistic medical system and comes in both a basic and an advanced version. This page will detail the differences between both systems and what they do as well as how to use them efficiently. +ACE3 provides users with a more realistic medical system. -### 1.1 Basic medical -ACE3's basic medical system is quite a bit more complex than Arma 3's default system, but not really difficult to grasp. ACE3 basic medical is a mixture between the ACE2 and AGM medical systems. -All interactions in the medical system are done with the interaction menu. Non-medics can - by default - not perform all actions (Epinephrine and IVs) and their actions take more time as when performed by trained medics. +The old documentation (pre medical rewrite) can be [found on github](https://github.com/acemod/ACE3/blob/v3.12.6/docs/wiki/feature/medical-system.md){:target="_blank"} -### 1.2 Revive system -The revive system lets you bring downed units back up. -Upon receiving a deadly amount of damage a unit will fall unconscious for a determined amount of time. In that time a medic will need to treat them and give them epinephrine to bring them back up. +The medical rewrite has changed the focus from "basic" or "advanced" levels to a more personally tailored method by having users configure it exactly as they want it. -### 1.3 Advanced medical +### 1.1 Settings -The advanced medical system provides a more complex and detailed medical simulation and is based off the CSE CMS. It focuses on a more realistic model for injuries and treatments, thus resulting in a more important and prominent role for combat medics, and a bigger incentive to avoid getting shot. +#### 1.1.1 Wounds -The system behind advanced medical is designed to attempt to mimic important parts of the human body, as well as react to any injuries sustained and treatments applied in a realistic manner. The available treatments and supplies in advanced medical are based off the Tactical Combat Casualty Care (TCCC) guidelines, which are the same guidelines used by real-life combat medics around the world. +##### 1.1.1.1 Limping -Besides the 4 elements introduced by basic medical, advanced introduces the following: +Controls whether or not a leg wound will cause you to limp, can be set to "Disabled", "Open Wounds" or "Limp on Open or Bandaged Wounds". This effect will be removed upon Stitching or using a Personal Aid Kit respectively. -- More detailed wound system. -- Accurate blood loss based upon sustained injuries. -- Vitals, including heart rate and blood pressure. -- Cardiac Arrest. -- Various treatment methods such as CPR, different kinds of IVs and a working tourniquet. -- A basic medication simulation. +##### 1.1.1.2 Fractures -### 1.4 Tweaked hitpoints -Base soldiers hitpoints values tweaked. +Fractures: Fractured limbs cause pain, increased weapon sway or inability to jog or run, can be set to "Disabled", "Splints Fully Heal Fractures" or "Splints Heal, but Cannot Sprint". -## 2. Usage +Fracture Chance: The probability of a fracture causing wound to actually cause one. -### 2.1 Basic +##### 1.1.1.3 Unconscious Wake Up Chance -When hit, units start to lose blood depending on the severity of their wounds. Once the level of blood falls below a certain threshold, the unit will fall unconscious and eventually die. Units will also fall unconscious when sustaining large amounts of damage at once or from high amounts of pain. +Every 15 seconds during unconscious, a check is performed for stable vitals. By default this setting is set to 5% meaning that every 15 seconds there is a 5% chance a stable person will wake up from unconsciousness. +Additionally Epinephrine can boost the chances of waking up by increasing the amount of checks the wake up chance does while Epinephrine is in the patients system. -#### 2.1.1 Wounds, bandages and medications +##### 1.1.1.4 Fatal Damage Source +Fatal damage is now controlled by either "Large hits to vital organs", "Sum of trauma" or "Either". This means carefully placed shots or simply higher amounts of wounds can be fatal to players or AI. -##### 2.1.1.1 Wounds +##### 1.1.1.5 Damage Threshold -It's pretty straightforward compared to advanced, you only have two types of wounds. +Two sliders that dictate how much damage players and ai can take before going unconscious or dying if Sum of Trauma is enabled. Set to higher values to make units stronger, lower to make them weaker. -- Yellow: Small - medium sized wound, a single bandage is usually enough. -- Red: Large wound, 2 or more bandages are usually needed. +#### 1.1.2 AI -##### 2.1.1.2 Bandages +##### 1.1.2.1 Medic AI -- All of them have the same effect. +Medic AI means any AI set as a Medic will actually perform medical actions on group members if they are unsuppressed or safe. -##### 2.1.1.3 Tourniquet +#### 1.1.3 Blood -- Serves no use in basic +##### 1.1.3.1 Blood Drops -##### 2.1.1.4 IVs +Blood drops are generated by bleeding units, this can be a good indicator for teams that somebody hasn't noticed they are bleeding. This can be set to "Disabled", "Only Players" or "Enabled". -IV | Effect ----------- | ---------- | -Saline | Serves no use in basic -Plasma | Serves no use in basic -Blood | Restores the blood of the patient +##### 1.1.3.2 Max Blood Objects -Use the appropriate amount depending on the situation (low / heavy loss of blood) (250, 500 or 1 000 mL) +By default this setting is set to 500, ideally this number shouldn't be set too high as excessive amounts will cause FPS drops. +##### 1.1.3.3 Blood Lifetime -##### 2.1.1.5 Autoinjectors +Blood droplets are still classed as objects, this sets the timer at which they will be cleaned up and removed. By default this is 15 minutes. -Autoinjector | Effect ----------- | ---------- | -Morphine | Removes pain -Epinephrine | Wakes up the patient -Atropine | Serves no use in basic -Adenosine | Serves no use in basic +#### 1.1.4 Feedback -#### 2.1.2 Treating the patient +##### 1.1.4.1 Pain Effect Type -**Step 1:** Is the patient responsive? +When in pain the player will recieve a visual indicator in the form of either "White Flashing", "Pulsing Blur", "Chromatic Abberation" or "Only high pain effect". By default this is set to "White Flashing". This is personal preference and only impacts individuals. - - **Yes:** Ask him if he has wounds / he is in pain. - - **No:** Go to step 2. +##### 1.1.4.2 Low Blood Volume Effect Type +When a player has lost a larger amount of blood they will receive a visual indicator in the form of either "Color Fading", "Icon" or "Icon + Color Fading". This is personal preference and only impacts individuals. -**Step 2:** Is the patient wounded? +#### 1.1.5 GUI - - **Yes:** Treat the wounds and go to step 3. - - **No:** Skip this step. +##### 1.1.5.1 Enable Medical Actions +Sets availability and type of medical actions through ACE interaction. Can be set to "Selections (3D)", "Radial" or Disabled. Disabling this setting will only allow you to treat others via Medical menu. (If enabled.) -**Step 3:** Is the patient in pain? +##### 1.1.5.2 Enable Medical Self Actions - - **Yes:** Give him morphine. - - **No:** Skip this step. +Much the same as Medical Actions, This is a checkbox for Enabling/Disabling ACE self-interaction medical options. +##### 1.1.5.3 Medical Menu -**Step 4:** Did the patient lose a lot of blood? +Medical Menu: By default bound to "H", it can be accessed via ACE interaction/Self interaction. Usage of this comes down to personal preference as it offers a much easier method of actively treating patients where time is of essence. It can be set to "Enabled", "Disabled" or "Vehicles Only". - - **Yes:** Give blood via IV. - - **No:** Go to step 5. - - **No and patient responsive:** You're done. +Reopen Medical Menu: After initially treating a wound it will automatically re-open the menu so you can continue treating the patient, set by an Enabled/Disabled checkbox. +Maximum Distance: How far in meters you can be from your patient before the medical menu is unavailable or automatically closed. -**Step 5** +#### 1.1.6 Litter - - If at this point the patient is still not back on its feet it's time to use an epinephrine Autoinjector. +##### 1.1.6.1 Litter Objects -#### 2.1.3 Additional informations +Enable Litter: A checkbox for Enabling/Disabling litter creation after medical treatment. -- If the revive system is in place your character will not die until the revive timer is at 0. Even if a tank shoots your ass off an epinephrine shot will bring you back up after your wounds are treated. (The timer is invisible and may vary from mission to mission, it also depends on the amount of lives remaining you have.) -- You can't do an overdose in basic. +Max Litter Objects: By default this is set to 500 and it is not recommended to increase it, high amounts of objects can cause FPS loss. -#### 2.1.4 Revive (Basic Medical) -For the following procedure to work revive need to be enabled. +Litter Lifetime: Controls the lifetime of objects in seconds, this by default is set to 600 seconds (10 Minutes). It can be set to -1 for an infinite lifetime but this is not recommended for longer missions. -- A unit in the revive state will be unconscious and will stay unconscious until it is either woken up or the revive timer runs out. -- A unit in the revive state can't die from any source of damage, only the timer reaching 0 can kill it. -- Each successful CPR will increase the time the unit can stay in the revive state. -- To wake up a patient treat all of his wounds, make sure he isn't in pain and then use epinephrine. -- Each successful revive removes a life from the unit, once the lives run out the next time the unit will take fatal damage it will not enter the revive state and will die. +#### 1.1.7 States -### 2.2 Advanced +##### 1.1.7.1 Fatal Injuries -Same as with basic, when hit an injury is sustained. Different though is that the type of injury and the severity of it are based upon how the damage was done and what caused it. This affects both blood loss and immediate consequences, such as being knocked out or being killed right away. When a player has sustained an injury, this will be indicated by flashing red on the screen; this means the player is bleeding. +Player Fatal Injuries: This controls whether or not players will die to significant damage to the head or torso. Can be set to "Always", "In Cardiac Arrest" or "Never". If set to Cardiac Arrest you cannot be outright killed without first going unconscious. -#### 2.2.1 Wounds, bandages and medications +AI Fatal Injuries: This works exactly the same way as for Players. +##### 1.1.7.2 Unconsciousness & Cardiac Arrest -##### 2.2.1.1 Abrasions (or scrapes) +AI Unconsciousness: An enable/disable checkbox to set whether or not AI can fall into unconsciousness through damage. If AI Fatal Injuries is set to "In Cardiac Arrest" then unconsciousness must be enabled. -- They occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). -- Sources: falling, rope burn, vehicle crashes. -- Effects: pain - extremely light, bleeding - extremely slowly. +Cardiac Arrest Time: By default this is set to 5 minutes, Once a patients heart has stopped this begins a 5 minute countdown. If the patient is not stabilised and revived they will die. -##### 2.2.1.2 Avulsions +#### 1.1.8 Status -- Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. -- Sources: explosions, vehicle crashes, grenades, artillery shells, bullets, backblast, bites. -- Effects: pain - extremely high, bleeding - extremely fast (depends on wound size). +##### 1.1.8.1 Bleeding, Pain and IVs -##### 2.2.1.3 Contusions +Bleeding Coefficient: Controls bleeding speeds, set higher for faster, lower for slower. -- Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. -- Sources: bullets, backblast, punches, vehicle crashes, falling. -- Effects: pain - light, no bleeding. +Pain Coefficient: Controls intensity of pain, set higher for stronger intensity, lower for weaker intensity. -##### 2.2.1.4 Crush wounds +IV Transfusion Flow Rate: By default this slider is set to 1, increasing it will increase how fast IVs run into patients and decreasing it will slow the flow rate down. -- Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. -- Sources: falling, vehicle crashes, punches. -- Effects: pain - light, bleeding - extremely slowly. +#### 1.1.9 Treatment -##### 2.2.1.5 Cut wounds +##### 1.1.9.1 Diagnose, Medication and Bandages -- Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. -- Sources: vehicle crashes, grenades, explosions, artillery shells, backblast, stabs. -- Effects: pain - light, bleeding - speed depends on length and size of the wound. +Advanced Diagnose: Checkbox to enable "Check Pulse", "Check Blood Pressure" and "Check Response" treatment actions, if disabled CPR will only be shown when performing CPR is necessary. This setting is imperative to determining if a patient is unconscious or in cardiac arrest. +Advanced Medication: Checkbox to enable more in-depth usage of morphine, Epinephrine and enables the use of adenosine. -##### 2.2.1.6 Lacerations (tears) +Advanced Bandages: Enables treatment actions for different bandage types, can be set to "Enabled", "Disabled" and "Enabled & Can Reopen". To enable stitching this setting needs to be set to "Enabled & Can Reopen". -- these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source or from an external source like a punch. -- Sources: vehicle crashes, punches. -- Effects: pain - light, bleeding - slow to medium speed (depends on wound size). +Clear Trauma After Bandage: Checkbox to enable/disable full healing of body parts after medical attention. -##### 2.2.1.7 Velocity wound +##### 1.1.9.2 Medic Settings -- They are caused by an object entering the body at a high speed, typically a bullet or small pieces of shrapnel. -- Sources: bullets, grenades, explosions, artillery shells. -- Effects: pain - extremely high, bleeding - medium speed (depends on wound size). +Locations Boost Training: Checkbox to enable/disable medical facilities/vehicles boosting the level of medic, untrained becomes medic and medic becomes doctor when in the locations. +Allow Shared Equipment: Setting to control equipment shared between patient and medic. Can be set to "Patient's Equipment First", "Medic's Equipment First" or "No". By setting to Patient or Medics equipment first it controls from which inventory any medical supplies are taken from first until they run out. When setting to "No" any medic can only utilise what they have in their inventory and cannot use the patients equipment. -##### 2.2.1.8 Puncture wounds +Convert Vanilla Items: Controls whether Vanilla items are converted to ACE medical supplies. Can be set to "Enabled", "Disabled" or "Ignore". By enabling this will convert First Aid Kits into a small amount of basic medical equipment, a Medikit will convert into a medium sized amount of advanced medical equipment. Using "Ignore" as the setting it will simply leave you with a First Aid Kit or Medikit. -- Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. -- Sources: stabs, grenades. -- Effects: pain - light, bleeding - slowly. +Allow Epinephrine: This setting controls who can utilise epinephrine. Can be set to "Anyone", "Medics" or "Doctors". -In order to stop the bleeding, all bleeding injuries on every body part requires treatment. This is done by either applying a tourniquet to legs or arms as a temporary solution, or by using bandages to stop the bleeding as a more permanent fix. +Allow PAK: See "Allow Epinephrine". +Allow Surgical Kit: See "Allow Epinephrine". -##### 2.2.1.9 Bandages effectiveness +Allow IV Transfusion: See "Allow Epinephrine". -(Click the image for a better view) +Locations Epinephrine: This setting controls where epinephrine can be utilised. Can be set to "Anywhere", "Medical Vehicles", "Medical Facilities", "Vehicles & Facilities" or "Disabled". If set to "Vehicles & Facilities" this requires that the vehicle or facility in question is set as a medical facility or vehicle. -
    -
  • +Locations PAK: See "Locations Epinephrine". -
+Locations Surgical Kit: See "Locations Epinephrine". -Table legend: +Consume PAK: This setting controls if a Personal Aid Kit is consumed after a single use. By default this is set to "No". - - **Efficiency**: Bandage efficiency, _higher is better_. - - **Reopening chance**: Reopening chance when advanced wounds are enabled, _lower is better_. +Consume Surgical Kit: See "Consume PAK". -##### 2.2.1.10 Tourniquet +Self PAK Usage: This setting controls the ability to use a Personal Aid Kit on yourself. This is combined with the "Allow PAK" setting. -- Can only be applied on limbs. -- Stops bleeding from wounds. -- Should be taken off as fast as possible and applied only to give medic time to bandage all the wounds. -- If not taken off for a while it will cause pain to the patient. +Self Stitching: See "Self PAK Usage". -##### 2.2.1.11 IVs +Self IV Transfusion: See "Self PAK Usage". -IV | Effect ----------- | ---------- | -Saline plasma and blood | All three restore the volume of liquid in the blood stream. as a result blood pressure is raised for all of them. +Time Coefficient PAK: This setting controls how long a PAK takes to apply. Set to higher values to increase, lower to decrease. PAK has a minimum of 10 seconds usage time. -Use the appropriate amount depending on the situation (heavy loss of blood, blood pressure too low) (250, 500 or 1 000 mL) +CPR Success Chance: This setting controls the chance of a successful round of CPR. By default this is set to 40%. -##### 2.2.1.12 Autoinjectors +Holster Required: This setting controls whether or not you must first lower or holster your weapon to perform medical actions, with the exception of "Check Pulse", "Check Blood Pressure" and "Check Response". -Autoinjector | Effect ----------- | ---------- | -Morphine | Decreases the blood viscosity, suppress pain -Epinephrine | Raises the heart rate of the patient -Adenosine | Lowers the heart rate -Atropine | Lowers the heart rate of the patient +## 2. Curated Medical Settings -Note: Morphine stays much longer in the system compared to other medications. +These settings are curated presets for different playstyles. They are meant to be used with the user config for the [CBA settings system](https://github.com/CBATeam/CBA_A3/wiki/CBA-Settings-System){:target="_blank"}. -##### 2.2.1.13 Surgical kit +Feel free to tweak the values of the settings to adjust it to your likings. -- Is only useful when advanced wounds (reopening) is enabled. -- Stitch a wound to stop it from reopening. -- It's use may be limited to a certain class and / or near a vehicle / facility. -- It's use can also be limited according to the condition of the patient, you might need to stabilize him first before using it. +### 2.1 Settings for Co-Op missions -##### 2.2.1.14 PAK +#### 2.1.1 Preset 1 -- Used to fully heal someone. (Removes any injury, restore vitals to a stable state and reset the medical history, clears all medication in the system.) -- It's use may be limited to a certain class and / or near a vehicle / facility. -- It's use can also be limited according to the condition of the patient, you might need to stabilize him first before using it. +```c++ +force ace_medical_fatalDamageSource = 1; // Sum of Trauma death condition +force ace_medical_AIDamageThreshold = 0.2; // Decreased AI damage threshold so AI dies in single headshot and few torso taps depending on vest +force ace_medical_playerDamageThreshold = 3.5; // Increased damage threshold for players, high caliber weapons should still be fatal +force ace_medical_bleedingCoefficient = 0.25; +force ace_medical_spontaneousWakeUpChance = 0.85; // Stabilised players will wake up fast +force ace_medical_spontaneousWakeUpEpinephrineBoost = 3; +force ace_medical_statemachine_AIUnconsciousness = true; +force ace_medical_statemachine_cardiacArrestTime = 630; +``` -#### 2.2.2 Vitals +#### 2.1.2 "Basic" Preset -##### 2.2.2.1 Blood pressure +```c++ +force ace_medical_AIDamageThreshold = 0.2; // Decreased AI damage threshold so AI dies in single headshot and few torso taps depending on vest +force ace_medical_playerDamageThreshold = 3.5; // Increased damage threshold for players, high caliber weapons should still be fatal +force ace_medical_bleedingCoefficient = 0.25; +force ace_medical_fatalDamageSource = 1; // Sum of Trauma death condition +force ace_medical_fractures = 0; // Disabled Fractures +force ace_medical_limping = 0; // Disabled Limping +force ace_medical_statemachine_fatalInjuriesPlayer = 2; // Disabled fatal injuries by damage to head or torso +force ace_medical_treatment_advancedBandages = 0; // Disabled advanced bandages +force ace_medical_treatment_advancedDiagnose = false; // Disabled advanced diagnose +force ace_medical_treatment_advancedMedication = false; // Disabled advanced medication +``` - NOTE:the `systolic` blood pressure is the number on the left, the `diastolic` blood pressure is the number on the right. +#### 2.1.3 "Advanced" Preset -- Blood pressure is affected by the amount of blood lost as well as IVs and medication. - - **Non existent:** 0 - 20 `systolic`. - - **Low:** 20 - 100 `systolic`. - - **Normal:** 100 - 160 `systolic`. - - **High:** 160 and above `systolic`. +```c++ +force ace_medical_fractures = 1; // Splints Fully Heal Fractures - set to "2" to keep sprinting disabled after fracture +force ace_medical_limping = 1; // Limp on Open Wounds +force ace_medical_spontaneousWakeUpChance = 0.15; // 15% chance of waking up from unconscious after stable +force ace_medical_spontaneousWakeUpEpinephrineBoost = 1; // Epinephrine boosts wake up chance +force ace_medical_statemachine_fatalInjuriesPlayer = 1; // Fatal injuries only occur in Cardiac Arrest +force ace_medical_treatment_advancedBandages = 2; // Wounds can re-open until stitched. +force ace_medical_treatment_advancedDiagnose = true; // Enabled Advanced Diagnosis +force ace_medical_treatment_advancedMedication = true; // Enabled Advanced Medication +force ace_medical_treatment_allowSelfIV = 1; // Medics can Self-IV +force ace_medical_treatment_allowSelfPAK = 1; // Medics can Self-PAK +force ace_medical_treatment_allowSelfStitch = 1; // Medics can Self-Stitch +force ace_medical_treatment_clearTraumaAfterBandage = true; // Fully heals body part after bandage/stitch +force ace_medical_treatment_consumeSurgicalKit = 0; // Does not consume Surgical Kit +force ace_medical_treatment_cprSuccessChance = 0.4; // 40% chance of successful CPR +force ace_medical_treatment_locationEpinephrine = 0; // Epinephrine anywhere +force ace_medical_treatment_locationPAK = 3; // PAK only in Vehicles & Facilities +force ace_medical_treatment_locationSurgicalKit = 0; // Surgical Kit anywhere +force ace_medical_treatment_medicEpinephrine = 1; // Medics can use Epinephrine +force ace_medical_treatment_medicIV = 1; // Medics can give IVs +force ace_medical_treatment_medicPAK = 1; // Medics can PAK +force ace_medical_treatment_medicSurgicalKit = 1; // Medics can stitch +``` -##### 2.2.2.2 Heart rate +### 2.2 Settings for PvP missions -The heart rate (pulse) is affected by the amount of blood lost and medications. +#### 2.2.1 Preset 1 -- **Low:** 45 and below -- **Normal:** between 46 and 119 -- **High:** 120 and above +```c++ +force ace_medical_fatalDamageSource = 1; // Sum of Trauma death condition +force ace_medical_feedback_painEffectType = 2; // Forced pain effect type to ensure that everyone is handicapped in the same way +force ace_medical_spontaneousWakeUpChance = 0.15; // don't let players wake up too fast +force ace_medical_statemachine_cardiacArrestTime = 300; // players should die fast once they are down and not treated +force ace_medical_treatment_allowSelfStitch = 1; +force ace_medical_treatment_clearTraumaAfterBandage = true; // to increase the flow of the PvP match (reduce limping) +``` +_more tbd_ -##### 2.2.2.3 Cardiac arrest - -A patient will enter cardiac arrest when: - -- The heart rate is below 20. -- The heart rate is above 200. -- The systolic blood pressure is above 260. -- The diastolic blood pressure is below 40 and the heart rate is above 190. -- The systolic blood pressure is above 145 and the heart rate is above 150. - - -#### 2.2.3 Treating the patient -This is a step by step guide, follow the steps from 1 to 6 in order unless stated otherwise. - -- Keeping the patient's vitals stable is your first priority. -- If advanced wounds are enabled make sure from time to time that they didn't reopen. -- If a limb has a wound with a high bleeding rate (or multiple) such as a large avulsion or large cut; use a tourniquet immediately on it, otherwise the patient might loose large amounts of blood while you try to treat it. - - -**Step 1:** Is the patient responsive? - - - **Yes:** Ask him if he has wounds / he is in pain and act accordingly. - - **No:** Go to step 2. - - - **Step 2:** Is the patient wounded? - - - **Yes**: Treat the wounds. - - **No:** Skip this step. - - -**Step 3:** Does the patient have a pulse? - - - **Yes:** Go to step 4. - - **No:** If you are alone provide CPR, if you have someone else get him to do CPR while you treat the patient's wounds. Skip to step 4 or 5 depending on the situation. - - -**Step 4:** Did the patient lose a lot of blood? - - - **Yes:** Use IVs to restore the volume of liquid in the blood stream of the patient. - - **No:** Skip this step. - - -**Step 5:** Is the patient in pain? - - - **Yes and stable pulse:** Give him morphine. - - **Yes and unstable heart rate:** Stabilize the heart rate before administrating morphine. - - **No:** You're done. - - -**Step 6:** is the patient awake now? - - - **Yes:** You're done. - - **No:** Stabilize his pulse / make sure he isn't in pain or missing blood. - - -#### 2.2.4 Additional informations - -- As an infantryman you can use a tourniquet to stop a limb from bleeding, note that this is supposed to be a temporary solution and leaving the tourniquet more than 5 minutes will induce pain. -- Pain is only suppressed and not removed by default. -- You don't have to take epinephrine after you take morphine, just wait until your pulse stabilizes by itself (Provided that you are in a stable condition). - -#### 2.2.5 Revive (Advanced Medical) -For the following procedure to work revive needs to be enabled. - -- A unit in the revive state will be unconscious and will stay unconscious until it is either woken up or the revive timer runs out. -- A unit in the revive state can't die from any source of damage, only the timer reaching 0 can kill it. -- Each successful CPR will increase the time the unit can stay in the revive state. -- To wake up a patient the use of a PAK is required. -- Each successful revive removes a life from the unit, once the lives run out the next time the unit will take fatal damage it will not enter the revive state and will die. -- Each successful round of CPR (filled up completion bar) increases the time left in the revive state. - -## 3. Guides - -### 3.1 Example loadouts - -#### 3.1.1 Basic - -Soldier: - - - 10 × Bandage (Basic) - - 3 × Morphine Autoinjector - - 1 × Epinephrine Autoinjector - -Medic: - - - 15-25 × Bandage (Basic) - - 10 × Morphine Autoinjector - - 10 × Epinephrine Autoinjector - - 6 × Blood IV (500ml) - -#### 3.1.2 Advanced - -Soldier : - - - 3-6 × Bandage (Basic) - - 3-6 × Bandage (Elastic) - - 3-6 × Packing Bandage - - 3-6 × Basic Field Dressing (QuikClot) - - 1 × Morphine Autoinjector - - 1 × Epinephrine Autoinjector - - 1 × Tourniquet (CAT) - - **Optional**: 1 × Saline IV (500ml) - used only by a qualified medic - - -Combat First Responder (CFR): - - - 10-15 × Bandage (Basic) - - 10-15 × Bandage (Elastic) - - 10-15 × Packing Bandage - - 10-15 × Basic Field Dressing (QuikClot) - - 8 × Atropine Autoinjector - - 5 × Morphine Autoinjector - - 5 × Epinephrine Autoinjector - - 3 × Tourniquet (CAT) - - 4 × Saline IV (500ml) - - -Medic: - - - 10-15 × Bandage (Basic) - - 15-20 × Bandage (Elastic) - - 15-20 × Packing Bandage - - 10-15 × Basic Field Dressing (QuikClot) - - 12 × Atropine Autoinjector - - 8 × Morphine Autoinjector - - 8 × Epinephrine Autoinjector - - 5 × Tourniquet (CAT) - - 6 × Saline IV (500ml) - - 1-3 × *Surgical Kit* - - 1-3 × *Personal Aid Kit* - - -Paramedic: - - - 10-15 × Bandage (Basic) - - 15-20 × Bandage (Elastic) - - 15-20 × Packing Bandage - - 10-15 × Basic Field Dressing (QuikClot) - - 5 × Tourniquet (CAT) - - 2 × Saline IV (500ml) - -## 4. Dependencies +## 3. Dependencies {% include dependencies_list.md component="medical" %} diff --git a/docs/wiki/feature/mk6mortar.md b/docs/wiki/feature/mk6mortar.md index 8671d305789..de08727a41e 100644 --- a/docs/wiki/feature/mk6mortar.md +++ b/docs/wiki/feature/mk6mortar.md @@ -42,7 +42,7 @@ For this you need a `82mm Rangetable`, `Map Tools` and a `Vector 21` are also re - Under the `D ELEV for 100m DR` find the number that matches your ELEV and compensate: - _Example_, if you're 200m above your target multiply the number by 2 and add it to your ELEV. - If you're 200m below the target multiply the number by 2 and substract it to your ELEV. - - The lower the elevation the closer to you it will land. + - The higher the elevation the closer to you it will land. - Once you finished calculating the ELEV align the barrel of the mortar with your target (directly looking at it) and set your ELEV to what you calculated by using Page Up and Page Down. - Once the ELEV is correctly set and the barrel is facing the right direction, shoot and enjoy your bananas while watching hell rain on your enemies. diff --git a/docs/wiki/feature/rangecard.md b/docs/wiki/feature/rangecard.md index 43269693893..e9aed83cc00 100644 --- a/docs/wiki/feature/rangecard.md +++ b/docs/wiki/feature/rangecard.md @@ -29,15 +29,12 @@ Add a range card that updates itself for your weapon and the type of ammo you're #### 2.1.2 Custom key - `OPTIONS` / `CONTROLS` / `CONFIGURE ADDONS` / `ACE3 Equipment` -#### 2.1.3 Inventory -Inventory management - ### 2.2 Using the range card - To use this to it's full potential the use of a [Vector 21]({{ site.baseurl }}/wiki/feature/vector.html) is strongly recommended, a [Kestrel 4500]({{ site.baseurl }}/wiki/feature/kestrel4500.html) will also help. - Pull out your rangefinder ([Vector 21]({{ site.baseurl }}/wiki/feature/vector.html) preferred) and get the distance between you and your target. - Open your rangetable and look under the `Target range` column. - Move to the `Bullet Drop` column, the drop is in MRADs, you need to compensate for it by adjusting your sight. Example, you want to adjust for a bullet drop of -7.9 MRADs simply adjust your scope 7.9 MRADs vertically. (check [feature scopes]({{ site.baseurl }}/wiki/feature/scopes.html) ) for this. -- Possibility to modify, copy and share the range card between spotter and shooter. +- Possibility to copy and share the range card. Range card self interaction menu diff --git a/docs/wiki/feature/scopes.md b/docs/wiki/feature/scopes.md index 3eab4a1de0f..a5b30ee36bd 100644 --- a/docs/wiki/feature/scopes.md +++ b/docs/wiki/feature/scopes.md @@ -33,7 +33,7 @@ Please not that the following key combinations are ACE3 default key binds. - Major adjustment right Ctrl + ⇧ Shift + Page Up. - Major adjustment left Ctrl + ⇧ Shift + page Down. -### 2.3 Scopes Module +### 2.3 Scopes Options CBA Settings scopes module diff --git a/docs/wiki/feature/vehicles.md b/docs/wiki/feature/vehicles.md index d4f33bbeb59..480130cfba5 100644 --- a/docs/wiki/feature/vehicles.md +++ b/docs/wiki/feature/vehicles.md @@ -41,6 +41,11 @@ The rate of fire of vehicle mounted miniguns and machine guns is adjusted to mat ### 1.9 120mm gun and mortar behaviour MBT main guns and mortars can no longer lock on enemies. The AT rounds of both now have raised cost values to encourage the AI to not use those rounds against foot soldiers over their machine guns or HE rounds. +### 1.10 Disable automatic engine shut-off +`Added in 3.13.0` + +Adds the ability to prevent the automatic shut-off of the engine when exiting vehicles. + ## 2. Usage ### 2.1 Turning the engine on / off diff --git a/docs/wiki/framework/arsenal-framework.md b/docs/wiki/framework/arsenal-framework.md index 90f21c9d64a..aed0a8d1c89 100644 --- a/docs/wiki/framework/arsenal-framework.md +++ b/docs/wiki/framework/arsenal-framework.md @@ -80,7 +80,7 @@ copyToClipboard str _items; IV. Paste the created array from your clipboard into the space where the items are listed CTRL+V. The array is created with brackets. ``` - + Examples: For a new Box: - `[_box, ["item1", "item2", "itemN"]] call ace_arsenal_fnc_initBox` @@ -175,7 +175,7 @@ If a loadout with the same name exists, it will be overwritten. ACE Arsenal stats are customizable, this will show you how. -### 5.1. Adding stats via config +### 5.1 Adding stats via config ```cpp class ace_arsenal_stats { @@ -185,7 +185,7 @@ class ace_arsenal_stats { scope = 2; // Only scope 2 show up in arsenal, scope 1 is used for base classes. displayName= "Test entry title"; // Title of the stat. priority = 0; // A higher value means the stat will be displayed higher on the page. - stats[] = {"mySuperStat"}; // Array of strings to pass to the statements, typically + stats[] = {"mySuperStat"}; // Array of strings to pass to the statements, typically showBar = 1; // 0 disabled; 1 enabled; showText = 1; // 0 disabled; 1 enabled; barStatement = "1"; // Statement evaluated to set the bar progress, needs to return a NUMBER. @@ -305,7 +305,7 @@ Right tabs: | 6 | Put | | 7 | Misc | -#### 6.0 Eventhandlers +## 6. Eventhandlers All are local. diff --git a/docs/wiki/framework/cargo-framework.md b/docs/wiki/framework/cargo-framework.md index 7f009b4efaf..38e0d6d2672 100644 --- a/docs/wiki/framework/cargo-framework.md +++ b/docs/wiki/framework/cargo-framework.md @@ -118,6 +118,7 @@ Note first arg can be a in-game object or a classname of an object type. * Arguments: * 0: Item * 1: Vehicle + * 2: Ignore interaction distance and stability checks * * Return Value: * Object loaded diff --git a/docs/wiki/framework/crew-served-weapons-framework.md b/docs/wiki/framework/crew-served-weapons-framework.md new file mode 100644 index 00000000000..3f64b095874 --- /dev/null +++ b/docs/wiki/framework/crew-served-weapons-framework.md @@ -0,0 +1,147 @@ +--- +layout: wiki +title: Crew Served Weapons Framework +description: Explains how to add new Crew Served Weapons to ACE3 +group: framework +order: 5 +parent: wiki +mod: ace +version: + major: 3 + minor: 13 + patch: 0 +--- + +## 1. Making a new Crew Served Weapon + +### 1.1 CfgVehicles + +```cpp +class CfgVehicles { + class LandVehicle; + class StaticWeapon: LandVehicle { + class ACE_Actions; + }; + class StaticMGWeapon: StaticWeapon { + class Turrets { + class MainTurret; + }; + class ACE_Actions: ACE_Actions { + class ACE_MainActions; + }; + }; + class banana_csw: StaticMGWeapon { + class ace_csw { + enabled = 1; // whether or not the weapon is affected by CSW + proxyWeapon = QGVAR(HMG_Static); // The weapon that will be added to the CSW on initialization. Used to ensure lower ammo-reload time when using Ammo Handling + magazineLocation = "_target selectionPosition 'magazine'"; // The location of the magazine. Where the action for ammo-handling will appear on the weapon + disassembleWeapon = QGVAR(staticHMGCarry); // What the weapon will disassemble to + disassembleTurret = QGVAR(m3TripodLow); // Which tripod will appear when weapon has been disassembled + ammoLoadTime = 7; // How long it takes in seconds to load ammo into the weapon + ammoUnloadTime = 5; // How long it takes in seconds to unload ammo from the weapon + desiredAmmo = 69; // When the weapon is reloaded it will try and reload to this ammo capacity + disassembleFunc = "myCoolFunction.sqf"; // A callback function for when the CSW gets disassembled. Arguments: [tripod, staticWeapon] + }; + }; +}; +``` + +### 1.2 CfgMagazines + +```cpp +class CfgMagazines { + class 100Rnd_127x99_mag; // Example magazine used - does not have to be this + class banana_ammo: 100Rnd_127x99_mag { + scope=2; // Needs to be 2 to make sure it shows up in Arsenal + type=256; // Must be 256 to show up in Arsenal + count = 100; // How much ammo gets added per "Load Ammo" selection + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // default ammo box model + //ace_isbelt = 1; // Needed if your magazine has belt linking + }; +}; +``` + +### 1.3 CfgWeapons + +```cpp +class CfgWeapons { + class Launcher_Base_F; + class banana_carry_weapon: Launcher_Base_F { + class ACE_CSW { + type = "weapon"; // What type of carry it is. Must always be "weapon" for the carry weapon + deployTime = 4; // How long it takes to deploy the weapon onto the tripod + pickupTime = 4; // How long it takes to disassemble weapon from the tripod + class assembleTo { + ace_csw_m3Tripod = "banana_csw_mod1"; // What tripod can this weapon deploy onto, and what vehicle will it spawn when it is deployed + banana_tripod = "banana_csw"; + }; + }; + }; + + class HMG_Static; + class banana_proxy_weapon: HMG_Static { + magazineReloadTime = 0.5; // Proxy weapons are spawned onto the CSW when it is assembled. Because ammo loading times use defined values in the magazine, this number needs to be low to ensure low latency + }; +}; +``` + +### 1.4 CfgMagazineGroups + +```cpp + class ace_csw_groups { // Ammo that can be loaded into this CSW + class banana_ammo { // The magazine which the player can place into their inventory + banana_dummy_ammo = 1; // Magazine that is loaded into the weapon as per CfgWeapons >> weapon >> magazines + }; + + // Optional + class ace_csw_100Rnd_127x99_mag { // default magazine that CSW already implements + banana_dummy_ammo = 1; + }; + + /* + Ammo types already defined by CSW: + - ace_csw_100Rnd_127x99_mag + - ace_csw_100Rnd_127x99_mag_red + - ace_csw_100Rnd_127x99_mag_green + - ace_csw_100Rnd_127x99_mag_yellow + - ace_csw_50Rnd_127x108_mag + - ace_csw_20Rnd_20mm_G_belt + - ACE_1Rnd_82mm_Mo_HE + - ACE_1Rnd_82mm_Mo_Smoke + - ACE_1Rnd_82mm_Mo_Illum + - ACE_1Rnd_82mm_Mo_HE_Guided + - ACE_1Rnd_82mm_Mo_HE_LaserGuided + - Titan_AT + - Titan_AA + */ + }; +``` + +## 2. Making a new Tripod + +### 2.1 CfgVehicles + +```cpp +class CfgVehicles { + class ace_csw_baseTripod; + class banana_tripod: ace_csw_baseTripod { + class ace_csw { disassembleTo = "banana_carry_tripod"; }; // What will be spawned when "Pickup Tripod" is selected + }; +}; +``` + +### 2.2 CfgWeapons + +```cpp +class CfgWeapons { + class Launcher_Base_F; + class banana_carry_tripod: Launcher_Base_F { + class ACE_CSW { + type = "mount"; // What type of carry it is. Must always be "mount" for the tripod + deployTime = 4; // How long it takes to deploy the tripod + pickupTime = 4; // How long it takes to pickup the tripod + deploy = "banana_tripod"; // what vehicle will spawn when the tripod is deployed + }; + }; +}; +``` diff --git a/docs/wiki/framework/disposables-framework.md b/docs/wiki/framework/disposables-framework.md index 21ee778824b..78f609e3581 100644 --- a/docs/wiki/framework/disposables-framework.md +++ b/docs/wiki/framework/disposables-framework.md @@ -1,7 +1,7 @@ --- layout: wiki title: Disposables Framework -description: Explains how to set-up custom disposable launchers with the ACE3 disposables system. +description: Notes on old ACE3 disposable framework and link to CBA's. group: framework order: 5 parent: wiki @@ -12,32 +12,11 @@ version: patch: 0 --- -
-
Note:
-

This is just the necessary to make a launcher disposable, this is not a guide to make your own launcher.

-
- -## 1. Making a launcher disposable - -### 1.1 CfgWeapons +Support for the ACE3 disposable framework will be dropped in 3.13.0! +Switch to the [CBA Disposable Framework](https://github.com/CBATeam/CBA_A3/wiki/Disposable-Launchers) +Old weapon configs that are no longer supported: ```cpp -class CfgWeapons { - class Launcher_Base_F; - class launch_banana: Launcher_Base_F { - ACE_UsedTube = "launch_banana_Used_F"; // The class name of the used tube - magazines[] = {"ACE_PreloadedMissileDummy"}; // The dummy magazine - }; - class launch_banana_Used_F: launch_banana { // The used tube should be a sub class of the disposable launcher - scope = 1; - ACE_isUsedLauncher = 1; - author = "grandBanana"; - displayName = "Used banana launcher"; - descriptionShort = "A used banana launcher"; - magazines[] = {"ACE_FiredMissileDummy"}; // This will disable the used launcher class from being fired again - //picture = ""; // Not supported yet - //model = ""; // Not supported yet - weaponPoolAvailable = 0; - }; -}; +ACE_UsedTube = "launch_banana_Used_F"; +ACE_isUsedLauncher = 1; ``` diff --git a/docs/wiki/framework/events-framework.md b/docs/wiki/framework/events-framework.md index 37214ba1076..30feada6cfd 100644 --- a/docs/wiki/framework/events-framework.md +++ b/docs/wiki/framework/events-framework.md @@ -46,6 +46,7 @@ MenuType: 0 = Interaction, 1 = Self Interaction |----------|---------|---------|---------|---------|---------| |`ace_interactMenuOpened` | [_menuType] | Local | Listen | Interaction Menu Opened |`ace_interactMenuClosed` | [_menuType] | Local | Listen | Interaction Menu Closed +|`ace_interact_menu_newControllableObject` | [_typeOf] | Local | Listen | New controlable object, only fires once per type (add self interactions) ### 2.4 Cargo (`ace_cargo`) @@ -88,6 +89,21 @@ MenuType: 0 = Interaction, 1 = Self Interaction |----------|---------|---------|---------|---------|---------| |`ace_wireCuttingStarted` | [_unit, _fence] | Global | Listen | Fence cutting started +### 2.9 Refuel (`ace_refuel`) + +| Event Key | Parameters | Locality | Type | Description | +|----------|---------|---------|---------|---------|---------| +|`ace_refuel_started` | [_source, _target] | Local | Listen | Refueling has started +|`ace_refuel_tick` | [_source, _target, _amount] | Local | Listen | Amount of fuel transferred in a tick +|`ace_refuel_stopped` | [_source, _target] | Local | Listen | Refueling has stopped + +### 2.10 Cook Off (`ace_cookoff`) + +| Event Key | Parameters | Locality | Type | Description | +|----------|---------|---------|---------|---------|---------| +|`ace_cookoff_cookOff` | _vehicle | Global | Listen | Vehicle cook off has started +|`ace_cookoff_cookOffBox` | _box | Global | Listen | Ammo box cook off has started +|`ace_cookoff_engineFire` | _vehicle | Global | Listen | Engine fire has started ## 3. Usage Also Reference [CBA Events System](https://github.com/CBATeam/CBA_A3/wiki/Custom-Events-System){:target="_blank"} documentation. diff --git a/docs/wiki/framework/explosives-framework.md b/docs/wiki/framework/explosives-framework.md index bd6779b68ef..fe59e388ef5 100644 --- a/docs/wiki/framework/explosives-framework.md +++ b/docs/wiki/framework/explosives-framework.md @@ -204,3 +204,9 @@ Jammer that blocks RF triggers: true }] call ace_explosives_fnc_addDetonateHandler; ``` + +#### 5.4 Custom timer limits +`Added in 3.12.7` + +Can set custom min and max time for the timer trigger, can set one or both, time in seconds +`ace_explosives_customTimerMin` / `ace_explosives_customTimerMax` diff --git a/docs/wiki/framework/fastroping-framework.md b/docs/wiki/framework/fastroping-framework.md index 2a906802b36..3979243d7c8 100644 --- a/docs/wiki/framework/fastroping-framework.md +++ b/docs/wiki/framework/fastroping-framework.md @@ -80,3 +80,23 @@ To create a custom FRIES you will need to look out for a few things: The `onCut` and `onPrepare` functions are responsible for opening/closing the helicopter doors and animating the FRIES (if equipped) when the FRIES gets prepared and the ropes get cut. ACE3 provides two functions that are compatible with most helicopters and all ACE3 FRIES. It is recommended to use the naming scheme for doors that is present in the base game so you can use the already existing functions `ace_fastroping_fnc_onCutCommon` and `ace_fastroping_fnc_onPrepareCommon`. You can however define your own functions if you so desire. Note that these functions run in the unscheduled environment, so commands like `sleep` and `waitUntil` will not work unless you use `spawn`. It is recommended to use `ace_common_fnc_waitAndExecute` and `ace_common_fnc_waitUntilAndExecute` instead though. + +## 4. Scripting + +### 4.1. Add FRIES to helicopter + +`ace_fastroping_fnc_equipFRIES` + +| | Arguments | Type | Optional (default value) +---| --------- | ---- | ------------------------ +0 | Helicopter | Object | Required +**R** | None | None | Return value + +### 4.2. Remove FRIES from helicopter + +`ace_fastroping_fnc_unequipFRIES` + +| | Arguments | Type | Optional (default value) +---| --------- | ---- | ------------------------ +0 | Helicopter | Object | Required +**R** | None | None | Return value diff --git a/docs/wiki/framework/grenades-framework.md b/docs/wiki/framework/grenades-framework.md new file mode 100644 index 00000000000..a0b0ceeea7d --- /dev/null +++ b/docs/wiki/framework/grenades-framework.md @@ -0,0 +1,70 @@ +--- +layout: wiki +title: Grenades Framework +description: Explains how to set-up flashbangs, particularly multi-bangs. +group: framework +parent: wiki +order: 7 +mod: ace +version: + major: 3 + minor: 13 + patch: 0 +--- + +## 1. Overview + +ACE provides a simple interface for creating flashbang grenades and specifying their properties. It is important that one sets `timeToLive` to be greater than the total possible time until the last explosion, i.e, `ace_grenades_flashbangBangs * ace_grenades_flashbangInterval + ace_grenades_flashbangIntervalMaxDeviation`. Any explosions that occur after the `timeToLive` has expired will occur at `(0,0)`. + + +## 2. Config Values + +There are several config entries specific to ACE flashbangs. All successive values can be left undefined and they will be given the defaults shown in the first example below, with the exception of `ace_grenades_flashbang`, which is equal to `0` if left undefined. + +```cpp +class CfgAmmo { + class MyDefaultFlashbang { + ace_grenades_flashbang = 1; // A flashbang + ace_grenades_flashbangBangs = 1; // with one bang + ace_grenades_flashbangInterval = 0.5; // 0.5 seconds between each subsequent bang + ace_grenades_flashbangIntervalMaxDeviation = 0.1; // Deviation of up to ± 0.1 seconds on each fuse + }; + class ACE_G_M84 { + explosionTime = 2.3; // Seconds until the initial explosion + timeToLive = 6; // Seconds until the projectile is removed + ace_grenades_flashbang = 1; // A normal flashbang + }; + class ACE_G_CTS9 { + explosionTime = 1.5; + timeToLive = 10; + ace_grenades_flashbang = 1; + ace_grenades_flashbangBangs = 9; // 9 bangs + ace_grenades_flashbangInterval = 0.5; // 0.5 seconds between each subsequent bang + ace_grenades_flashbangIntervalMaxDeviation = "0.1 * sqrt (12*4) / 2"; // Standard deviation of 0.1 seconds on each fuse + }; + class 16aa_Ammo_6Bang { // British Armed Forces L107A1 + explosionTime = 1; + timeToLive = 5; + ace_grenades_flashbang = 1; + ace_grenades_flashbangBangs = 6; // 6 bangs + ace_grenades_flashbangInterval = 0.25; // 0.25 seconds between each subsequent bang + ace_grenades_flashbangIntervalMaxDeviation = 0.05; // Deviation of up to ± 0.05 seconds on each fuse + }; +}; +``` + +### 2.1 ace_grenades_flashbang + +If set to zero or left undefined, the grenade is not treated as a flashbang. If it is set to 1, the grenade will be treated as a flashbang with the associated effects. + +### 2.2 ace_grenades_flashbangBangs + +The flashbang will explode as many times as is specified. The default is 1. + +### 2.3 ace_grenades_flashbangInterval + +The average amount of time in seconds, after `explosionTime` has passed, between each subsequent bang. + +### 2.4 ace_grenades_flashbangIntervalMaxDeviation + +The amount of randomness in the fuse time. diff --git a/docs/wiki/framework/gunbag-framework.md b/docs/wiki/framework/gunbag-framework.md new file mode 100644 index 00000000000..a3df099abe1 --- /dev/null +++ b/docs/wiki/framework/gunbag-framework.md @@ -0,0 +1,39 @@ +--- +layout: wiki +title: Gunbag Framework +description: Explains how to set up gunbags +group: framework +parent: wiki +order: 7 +mod: ace +version: + major: 3 + minor: 13 + patch: 0 +--- + +## 1. Overview + +ACE Gunbag provides a framework that allows users to enable putting a gun inside a backpack. + + +## 2. Config Values + +The `ace_gunbag` config entry needs to be set to `1` to enable a backpack to be a gunbag. + +```cpp +class Bag_Base; +class ace_gunbag: Bag_Base { + author = "Ir0n1E"; + scope = 2; + displayName = CSTRING(Displayname); + model = QPATHTOF(data\ace_gunbag.p3d); + picture = QPATHTOF(ui\gunbag_ca.paa); + icon = QPATHTOF(ui\gunbag_icon_ca.paa); + hiddenSelections[] = {"Camo", "insignia"}; + hiddenSelectionsTextures[] = {QPATHTOF(data\gunbag_co.paa)}; + maximumLoad = 80; + mass = 11; + ace_gunbag = 1; +}; +``` diff --git a/docs/wiki/framework/interactionMenu-framework.md b/docs/wiki/framework/interactionMenu-framework.md index 44f4623ece8..54cb1fed38e 100644 --- a/docs/wiki/framework/interactionMenu-framework.md +++ b/docs/wiki/framework/interactionMenu-framework.md @@ -21,7 +21,7 @@ Something the user would do to themselves or to their vehicle (eg. Put in ear pl - **Zeus** (`ACE_ZeusActions`) Available to Zeus -`ACE_Actions` and `ACE_SelfActions` can be added via config or by calling functions, it is generally preferred to add actions via config. Zeus actions can only be added via config. +`ACE_Actions` and `ACE_SelfActions` can be added via config or by calling functions. Be aware that the functions modify the UI, and therefore need to be executed on client-side to take effect. The simplest action is just a condition and statement. The code to these are passed `[_target, _player, _actionParams]`. `_player` is `ace_player`; `_target` is the object being interacted with; and the 3rd argument is the optional action parameters (default `[]`). @@ -70,7 +70,7 @@ class CAManBase: Man { Two steps, creating an action (array) and then adding it to either a class or object. Important: `ace_common_fnc_canInteractWith` is not automatically checked and needs to be explicitly called. -### 2.1 fnc_createAction +### 3.1 fnc_createAction `ace_interact_menu_fnc_createAction` @@ -91,7 +91,7 @@ Important: `ace_common_fnc_canInteractWith` is not automatically checked and nee */ ``` -### 2.2 fnc_addActionToClass +### 3.2 fnc_addActionToClass `ace_interact_menu_fnc_addActionToClass` @@ -107,7 +107,7 @@ Important: `ace_common_fnc_canInteractWith` is not automatically checked and nee ``` By default this function will not use inheritance, so actions will only be added to the specific class. -### 2.3 fnc_addActionToObject +### 3.3 fnc_addActionToObject `ace_interact_menu_fnc_addActionToObject` @@ -121,7 +121,7 @@ By default this function will not use inheritance, so actions will only be added */ ``` -### 2.4 fnc_addActionToZeus +### 3.4 fnc_addActionToZeus `ace_interact_menu_fnc_addActionToZeus` @@ -133,7 +133,7 @@ By default this function will not use inheritance, so actions will only be added */ ``` -### 2.5 Examples +### 3.5 Examples External: @@ -177,7 +177,7 @@ _action = ["myMissionEvent1","Mission Event: Play Base Alarm","",_statement,{tru [["ACE_ZeusActions"], _action] call ace_interact_menu_fnc_addActionToZeus; ``` -### 2.6 Advanced Example +### 3.6 Advanced Example This adds an interaction to a unit that allows passing items that the player is carrying. @@ -221,3 +221,20 @@ _modifierFunc = { _action = ["GiveItems", "?","",_statement,_condition,_insertChildren,[123],"",4,[false, false, false, true, false], _modifierFunc] call ace_interact_menu_fnc_createAction; [q3, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToObject; ``` + +### 3.7 Using `ace_interact_menu_newControllableObject` event + +CBA event `ace_interact_menu_newControllableObject` fires only once the first time the player controls a new object (new man, vehicle or controlled UAV) +This is the ideal way to add self interaction actions, as adding them via `addActionToClass` will force self interaction actions to be compiled for classes that may never be used. + +```cpp +// Example: Add radio self-action to all civilian cars +["ace_interact_menu_newControllableObject", { + params ["_type"]; // string of the object's classname + if (!(_type isKindOf "Car")) exitWith {}; + if ((getNumber (configFile >> "CfgVehicles" >> _type >> "side")) != 3) exitWith {}; + + private _action = ["playRadio","Play Radio","",{playMusic "NeverGonnaGiveYouUp"},{true}] call ace_interact_menu_fnc_createAction; + [_type, 1, ["ACE_SelfActions"], _action, true] call ace_interact_menu_fnc_addActionToClass; +}] call CBA_fnc_addEventHandler; +``` diff --git a/docs/wiki/framework/nightvision-framework.md b/docs/wiki/framework/nightvision-framework.md index f3a0379bb54..8d9bf7eda7a 100644 --- a/docs/wiki/framework/nightvision-framework.md +++ b/docs/wiki/framework/nightvision-framework.md @@ -34,11 +34,3 @@ class CfgWeapons { }; }; ``` - -## 2. Events - -To change night vision settings with code use: - -`ace_nightvision_fogScaling = 0.5;` // More is more fog. - -`ace_nightvision_effectScaling = 0.5;` // More is more apparent effects. diff --git a/docs/wiki/framework/spectator-framework.md b/docs/wiki/framework/spectator-framework.md index 36c2d628f6b..1ea3ec09185 100644 --- a/docs/wiki/framework/spectator-framework.md +++ b/docs/wiki/framework/spectator-framework.md @@ -51,6 +51,8 @@ Note that these settings govern the default spectator behaviour. Through the use Event Name | Passed Parameter(s) | Locality | Description ---------- | ----------- | ------------------- | -------- `ace_spectatorSet` | [_isSpectator, _player] | Global | Player's spectator status was changed +`ace_spectator_displayLoaded` | _display | Local | Spectator display was loaded +`ace_spectator_displayUnloaded` | _display | Local | Spectator display was unloaded ## 4. Scripting @@ -94,7 +96,7 @@ Note that this function takes local effect, so only the local player will see th * Example: * [allPlayers, [player]] call ace_spectator_fnc_updateUnits ``` - + ### 4.3 Add/Remove sides available to spectate `ace_spectator_fnc_updateSides` @@ -117,7 +119,7 @@ Note that this function takes local effect, so only the local player will see th ### 4.4 Add/Remove available camera modes `ace_spectator_fnc_updateCameraModes` -You can change the spectator camera modes available at any point during the mission and independently on different machines with this function (e.g. if you only want one side of players to have a free camera). Remember that the **Camera modes** setting will change which modes are available to everyone by default - changes with this function will override that. +You can change the spectator camera modes available at any point during the mission and independently on different machines with this function (e.g. if you only want one side of players to have a free camera). Remember that the **Camera modes** setting will change which modes are available to everyone by default - changes with this function will override that. Note that this function takes local effect, so only the local player will experience these changes. @@ -141,7 +143,7 @@ Note that this function takes local effect, so only the local player will experi ### 4.5 Add/Remove available vision modes `ace_spectator_fnc_updateVisionModes` -You can change the spectator vision modes available at any point during the mission and independently on different machines with this function (e.g. if you only want one side of players to have night vision). Remember that the **Vision modes** setting will change which modes are available to everyone by default (if thermal is enabled via the setting then both black and white hot are available) - changes with this function will override that. +You can change the spectator vision modes available at any point during the mission and independently on different machines with this function (e.g. if you only want one side of players to have night vision). Remember that the **Vision modes** setting will change which modes are available to everyone by default (if thermal is enabled via the setting then both black and white hot are available) - changes with this function will override that. Note that this function takes local effect, so only the local player will experience these changes. diff --git a/docs/wiki/framework/tagging-framework.md b/docs/wiki/framework/tagging-framework.md index 75a80da179c..e263a2afaa5 100644 --- a/docs/wiki/framework/tagging-framework.md +++ b/docs/wiki/framework/tagging-framework.md @@ -27,7 +27,9 @@ class ACE_Tags { displayName = "My Tag"; // Name of your tag being displayed in the interaction menu requiredItem = "ACE_SpraypaintBlack"; // Required item to have in the inventory to be able to spray your tag (eg. `"ACE_SpraypaintBlack"`, `"ACE_SpraypaintRed"`, `"ACE_SpraypaintGreen"`, `"ACE_SpraypaintBlue"` or any custom item from `CfgWeapons`) textures[] = {"path\to\texture1.paa", "path\to\texture2.paa"}; // List of texture variations (one is randomly selected when tagging) + materials[] = {"path\to\material.rvmat"}; // Optional: List of material variations (one is randomly selected). Keep empty if you don't need a custom material. icon = "path\to\icon.paa"; // Icon being displayed in the interaction menu + tagModel = "UserTexture1m_F"; // Optional: The 3D Model that will be spawned with the texture on it, can either be CfgVehicles classname or P3D file path. }; }; ``` @@ -46,6 +48,8 @@ class ACE_Tags { 2 | Required Item | String | Required 3 | Textures | Array | Required 4 | Icon | String | Optional (default: `""` - Default white point) +5 | Material Paths | Array | Optional (default: `[]] - No custom material) +6 | Tag Model | String | Optional (default: `"UserTexture1m_F"` - 1x1m texture surface) **R** | Successfully Added Tag | Boolean | Return value #### 2.1.1 Example @@ -59,3 +63,24 @@ class ACE_Tags { 2 | `"ACE_SpraypaintRed"` | Required item to have in the inventory to be able to spray your tag 3 | `["tagTexture1.paa", "tagTexture2.paa"]` | List of texture variants (one is randomly selected when tagging) 4 | `"icon.paa"` | Icon being displayed in the interaction menu + + +### 2.2 Tags in description.ext + +Tags can also be configured in description.ext like shown above. +File Paths will be relative to your mission, if you want to define Tags inside description.ext but use Addon paths for `Texture`/`Material`/`TagModel` you need to prefix the path with `@`. + +This is how above config would look when using Addon paths from description.ext: + +```cpp +class ACE_Tags { + class yourTagClass { + displayName = "My Tag"; // Name of your tag being displayed in the interaction menu + requiredItem = "ACE_SpraypaintBlack"; // Required item to have in the inventory to be able to spray your tag (eg. `"ACE_SpraypaintBlack"`, `"ACE_SpraypaintRed"`, `"ACE_SpraypaintGreen"`, `"ACE_SpraypaintBlue"` or any custom item from `CfgWeapons`) + textures[] = {"@path\to\texture1.paa", "@path\to\texture2.paa"}; // List of texture variations (one is randomly selected when tagging) + materials[] = {"@path\to\material.rvmat"}; // Optional: List of material variations (one is randomly selected). Keep empty if you don't need a custom material. + icon = "@path\to\icon.paa"; // Icon being displayed in the interaction menu + tagModel = "UserTexture1m_F"; // Optional: The 3D Model that will be spawned with the texture on it, can either be CfgVehicles classname or P3D file path. + }; +}; +``` diff --git a/docs/wiki/frameworkx/field-rations-framework.md b/docs/wiki/frameworkx/field-rations-framework.md new file mode 100644 index 00000000000..c5080e230d0 --- /dev/null +++ b/docs/wiki/frameworkx/field-rations-framework.md @@ -0,0 +1,104 @@ +--- +layout: wiki +title: Field Rations Framework +description: Explains how to set-up ACEX Field Rations. +group: framework +parent: wiki +mod: acex +version: + major: 3 + minor: 4 + patch: 0 +--- + +## 1. Config Values + +### 1.1 Consumable Items + +Config Name | Type | Description +----------- | ---- | ----------- +`acex_field_rations_thirstQuenched` | Number | Amount of thirst quenched when item is consumed* +`acex_field_rations_hungerSatiated` | Number | Amount of hunger satiated when item is consumed* +`acex_field_rations_consumeTime` | Number | Time required to consume the item (in seconds) +`acex_field_rations_consumeText` | String | Progress bar text (OPTIONAL) +`acex_field_rations_consumeAnims` | Array | Animations to play when consuming item** (OPTIONAL) +`acex_field_rations_consumeSounds` | Array | Sounds to play when consuming item** (OPTIONAL) +`acex_field_rations_replacementItem` | String | Class name of replacement item to add on consumption (OPTIONAL) +`acex_field_rations_refillItem` | String | Makes an item refillable, class name of item added when refilled (OPTIONAL) +`acex_field_rations_refillAmount` | Number | Amount of water required to refill item (OPTIONAL) +`acex_field_rations_refillTime` | Number | Time required to refill item (in seconds) (OPTIONAL) + + +_* Value range is 0 to 100 and can be modified by the corresponding coefficient setting._ + +_** Array is in format: STAND, CROUCH, PRONE. If player is in vehicle, the first element is used._ + +### 1.2 Water Sources + +Config Name | Type | Description +----------- | ---- | ----------- +`acex_field_rations_waterSupply` | Number | Amount of water inside the object (-1 - disabled, -10 - infinite) (OPTIONAL) +`acex_field_rations_offset` | Array | Refill action offset relative to model (OPTIONAL) + +## 2. Events + +Event Name | Passed Parameter(s) | Locality | Description +---------- | ------------------- | -------- | ----------- +`acex_rationConsumed` | [_player, _consumeItem, _replacementItem, _thirstQuenched, _hungerSatiated] | Local | Item consumed +`acex_rationRefilled` | [_source, _player, _item, _refillItem, _refillAmount] | Local | Item refilled + +## 3. Scripting + +### 3.1 Getting water supply + +`acex_field_rations_fnc_getRemainingWater` + +```cpp +* Returns the remaining water in a source. +* +* Arguments: +* 0: Water source +* +* Return Value: +* Remaining water +* +* Example: +* [_source] call acex_field_rations_fnc_getRemainingWater +``` + +### 3.2 Setting water supply + +`acex_field_rations_fnc_setRemainingWater` + +```cpp +* Sets the remaining water supply for given water source. +* +* Arguments: +* 0: Water source +* 1: Amount (-10 - Infinite, -1 - Disabled) +* +* Return Value: +* None +* +* Example: +* [_source, 1000] call acex_field_rations_fnc_setRemainingWater +``` + +### 3.3 Adding a status modifier + +`acex_field_rations_fnc_addStatusModifier` + +```cpp +* Adds a status modifier. Should be called on all machines. +* Code must return a NUMBER which will be applied additively with other status changes. +* +* Arguments: +* 0: Status to modify (0 - Thirst, 1 - Hunger, 2 - Both) +* 1: Code (is passed the unit ) +* +* Return Value: +* None +* +* Example: +* [0, {random 1}] call acex_field_rations_fnc_addStatusModifier +``` diff --git a/docs/wiki/frameworkx/fortify-framework.md b/docs/wiki/frameworkx/fortify-framework.md index 045bc30e1a7..0da9679bba9 100644 --- a/docs/wiki/frameworkx/fortify-framework.md +++ b/docs/wiki/frameworkx/fortify-framework.md @@ -33,7 +33,7 @@ There are two ways of adding custom presets to your mission, either via code or To add a preset via code you use the function `call acex_fortify_fnc_registerObjects`. Also enables Fortify. -``` +```cpp * Registers the given objects in the given side's player interaction menu. * Players on that side must have the `Fortify Tool` item in their inventory to access the menu. * Classnames must be in the format [, ] @@ -53,25 +53,27 @@ To add a preset via code you use the function `call acex_fortify_fnc_registerObj Adding it through `description.ext` you use: -```c++ +```cpp class ACEX_Fortify_Presets { class myMissionObjects { + displayName = "My Preset"; objects[] = { {"Sandbag", 5}, {"Bunker", 50} }; }; +}; ``` - Then you will have to set the mission preset to `myMissionObjects` with `#fortify blufor myMissionObjects` to enable it. +Then you will have to set the mission preset to `myMissionObjects` by either using the Fortify editor module or the chat command: `#ace-fortify blufor myMissionObjects`. ## 1.3 Adding custom deploy handlers A custom deploy handler allows missions makers to decide if an object can be placed or not. -To verify that an object isn't above a certain terrain height we can check the heigt of the object before it is confirmed as placed. Returning `false` from the code block means that placement is not allowed. +To verify that an object isn't above a certain terrain height we can check the height of the object before it is confirmed as placed. Returning `false` from the code block means that placement is not allowed. -```sqf +```cpp [{ params ["_unit", "_object", "_cost"]; private _return = (getPosATL _object) select 2 < 1; diff --git a/docs/wiki/user/how-to-report-an-issue.md b/docs/wiki/user/how-to-report-an-issue.md index 2c244ebb2ed..fefbf8a73eb 100644 --- a/docs/wiki/user/how-to-report-an-issue.md +++ b/docs/wiki/user/how-to-report-an-issue.md @@ -7,6 +7,11 @@ order: 10 parent: wiki --- + +
Issue Flowchart
+
Issue Flowchart - click to enlarge
+
+ ### Before reporting If you have found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only `@CBA_A3` and `@ace` on a newly created mission. diff --git a/docs/wiki/user/information-center.md b/docs/wiki/user/information-center.md index fa6077ee3ec..8f828c69808 100644 --- a/docs/wiki/user/information-center.md +++ b/docs/wiki/user/information-center.md @@ -30,7 +30,7 @@ Downloaded ACE3 and have no idea where to start? This page serves as a starting ### 1.2 Issues -**Q:** Experiencing DLL errors. +**Q:** Experiencing extension errors. **A:** Start the game once with the Arma 3 Launcher, close it, then start the game with your usual launcher (ArmA3Sync, Play withSix, etc …). >The simple explanation is that the BattlEye process wasn't ended properly and is unable to start again properly, launching it with the Arma 3 Launcher is the only known solution to fix it. diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index ef6d8f8ded4..74f22ef9c38 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -8,8 +8,8 @@ add_definitions(/DWINVER=0x0600 /D_WIN32_WINNT=0x0600) endif() if (NOT CMAKE_BUILD_TYPE AND CMAKE_COMPILER_IS_GNUCXX) - message(STATUS "No build type selected, default to Debug") - set(CMAKE_BUILD_TYPE "Debug") + message(STATUS "No build type selected, default to Debug") + set(CMAKE_BUILD_TYPE "Debug") endif() option(DEVEL "DEVEL" OFF) @@ -18,19 +18,29 @@ option(USE_DIRECTX "USE_DIRECTX" OFF) option(USE_64BIT_BUILD "USE_64BIT_BUILD" OFF) option(USE_STATIC_LINKING "USE_STATIC_LINKING" ON) +if(CMAKE_GENERATOR_PLATFORM MATCHES "x64") + set(USE_64BIT_BUILD ON) +endif() if(CMAKE_COMPILER_IS_GNUCXX) - SET(CMAKE_CXX_FLAGS "-std=c++11 -pedantic -pedantic-errors -march=i686 -m32 -O2 -s -fPIC -fpermissive") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") - set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++") + SET(CMAKE_CXX_FLAGS "-std=c++11 -pedantic -pedantic-errors -march=i686 -m32 -O2 -s -fPIC -fpermissive") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++") elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") message(ERROR "SUPPORT NOT COMPLETE") elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /arch:SSE2 /Qpar-report:2") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} /D _DEBUG /MTd /Zi /Ob0 /Od /RTC1") - set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} /MT /O1 /Ob1 /D NDEBUG") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} /MT /O2 /Ob2 /D NDEBUG") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} /MT /Zi /O2 /Ob1 /D NDEBUG") + add_definitions(-D_CRT_SECURE_NO_WARNINGS) # Disable MSVC *_s function warnings + + if(USE_64BIT_BUILD) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /Qpar-report:2") # Default SSE2 + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /arch:SSE2 /Qpar-report:2") + endif() + + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} /D _DEBUG /MTd /Zi /Ob0 /Od /RTC1") + set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} /MT /O1 /Ob1 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} /MT /O2 /Ob2 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} /MT /Zi /O2 /Ob1 /D NDEBUG") endif() include_directories("common") @@ -89,8 +99,8 @@ endif() string(TIMESTAMP ACE_BUILDSTAMP "%Y-%m-%dT%H:%M:%SZ") set(ACE_VERSION_MAJOR 3) -set(ACE_VERSION_MINOR 12) -set(ACE_VERSION_REVISION 3) +set(ACE_VERSION_MINOR 13) +set(ACE_VERSION_REVISION 0) EXECUTE_PROCESS(COMMAND git rev-parse --verify HEAD OUTPUT_VARIABLE T_ACE_VERSION_BUILD OUTPUT_STRIP_TRAILING_WHITESPACE @@ -127,6 +137,7 @@ add_subdirectory(clipboard) add_subdirectory(advanced_ballistics) add_subdirectory(medical) add_subdirectory(parse_imagepath) +add_subdirectory(artillerytables) # Test Extension for dynamically loading/unloading built extensions; does not build in release if (DEVEL) diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index b77c412b35f..bc6b374da64 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -254,7 +254,7 @@ double calculateAdvancedZero(double zeroRange, double muzzleVelocity, double bor double v = 0.0f; while (tof < 8.0f && px < zeroRange) { - lx = px; + lx = px; ly = py; v = std::sqrt(vx*vx + vy*vy); @@ -295,7 +295,7 @@ extern "C" void __stdcall RVExtensionVersion(char *output, int outputSize) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); } void __stdcall RVExtension(char *output, int outputSize, const char *function) @@ -303,7 +303,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) ZERO_OUTPUT(); std::stringstream outputStr; if (!strcmp(function, "version")) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); EXTENSION_RETURN(); } @@ -328,7 +328,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) // int n = sprintf(output, "%f", retard); outputStr << retard; - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "atmosphericCorrection")) { @@ -347,7 +347,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, humidity, atmosphereModel); //int n = sprintf(output, "%f", ballisticCoefficient); outputStr << ballisticCoefficient; - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "new")) { unsigned int index = 0; @@ -453,7 +453,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].randGenerator.seed(bulletDatabase[index].randSeed); } - strncpy_s(output, outputSize, "", _TRUNCATE); + strncpy(output, "", outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "simulate")) { // simulate:0:[-0.109985,542.529,-3.98301]:[3751.57,5332.23,214.252]:[0.598153,2.38829,0]:28.6:0:0.481542:0:215.16 @@ -567,7 +567,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) ace::vector3 offset(distribution(bulletDatabase[index].randGenerator), distribution(bulletDatabase[index].randGenerator), distribution(bulletDatabase[index].randGenerator)); double coef = 1.0f - bulletDatabase[index].transonicStabilityCoef; - double trueSpeed = trueVelocity.magnitude(); + double trueSpeed = trueVelocity.magnitude(); trueVelocity += offset * coef; trueVelocity = trueVelocity.normalize() * trueSpeed; }; @@ -622,7 +622,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].bulletVelocityPreviousFrame = bulletVelocityCurrentFrame + velocityOffset; outputStr << "[" << velocityOffset.x() << "," << velocityOffset.y() << "," << velocityOffset.z() << "]"; - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "set")) { int height = 0; @@ -637,7 +637,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridBuildingNums.push_back(numObjects); map->gridSurfaceIsWater.push_back(surfaceIsWater); - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "init")) { int mapSize = 0; @@ -653,7 +653,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map = &mapDatabase[worldName]; if (map->gridHeights.size() == gridCells) { outputStr << "Terrain already initialized"; - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } @@ -666,7 +666,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridBuildingNums.reserve(gridCells); map->gridSurfaceIsWater.reserve(gridCells); - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "replicateVanillaZero")) { float zeroRange = strtof(strtok_s(NULL, ":", &next_token), NULL); @@ -676,7 +676,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) float zeroAngle = replicateVanillaZero(zeroRange, initSpeed, airFriction); outputStr << DEGREES(zeroAngle); - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "calcZero")) { double zeroRange = strtod(strtok_s(NULL, ":", &next_token), NULL); @@ -687,7 +687,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) double zeroAngle = calculateVanillaZero(zeroRange, initSpeed, airFriction, boreHeight); outputStr << DEGREES(zeroAngle); - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } else if (!strcmp(mode, "calcZeroAB")) { double zeroRange = strtod(strtok_s(NULL, ":", &next_token), NULL); @@ -703,9 +703,9 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) double zeroAngle = calculateAdvancedZero(zeroRange, muzzleVelocity, boreHeight, temperature, pressure, humidity, ballisticCoefficient, dragModel, atmosphereModel); outputStr << DEGREES(zeroAngle); - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } - strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + strncpy(output, outputStr.str().c_str(), outputSize - 1); EXTENSION_RETURN(); } diff --git a/extensions/artillerytables/CMakeLists.txt b/extensions/artillerytables/CMakeLists.txt new file mode 100644 index 00000000000..5b6d3863c9d --- /dev/null +++ b/extensions/artillerytables/CMakeLists.txt @@ -0,0 +1,24 @@ +set(ACE_EXTENSION_NAME "ace_artillerytables") + +file(GLOB SOURCES *.h *.hpp *.c *.cpp) +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES} ${GLOBAL_SOURCES}) +target_link_libraries(${ACE_EXTENSION_NAME} ace_common) +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES FOLDER Extensions) + +if(CMAKE_COMPILER_IS_GNUCXX) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_END_STATIC 1) +endif() + + + +# enable_testing() +# set(ACE_TEST_NAME Test_${ACE_EXTENSION_NAME}) + +# add_executable(${ACE_TEST_NAME} tests/tester.cpp ${SOURCES}) +# target_link_libraries(${ACE_TEST_NAME} ace_common) +# target_link_libraries(${ACE_TEST_NAME} ${ACE_EXTENSION_NAME}) +# target_link_libraries(${ACE_TEST_NAME} gtest_main) +# add_test(${ACE_TEST_NAME} ${ACE_TEST_NAME}) +# set_target_properties(${ACE_TEST_NAME} PROPERTIES FOLDER Tests) diff --git a/extensions/artillerytables/artillerytables.cpp b/extensions/artillerytables/artillerytables.cpp new file mode 100644 index 00000000000..9479e39f44c --- /dev/null +++ b/extensions/artillerytables/artillerytables.cpp @@ -0,0 +1,283 @@ +/* + * artillerytables.hpp + * Author: PabstMirror + */ + +#include +#include +#include + +#include "artillerytables.hpp" + + +// Constants +static const double timeStep = 1.0 / 60; +static const double rangeSearchErrorMax = 0.001; // ratio * distance +static const double rangeSearchAngleConvergance = 0.000025; +static const double gravityABS = 9.8066; +static const ace::vector3 gravityAccl(0, 0, -1 * gravityABS); + +// Globals: +std::vector> fWorkers; +unsigned int getLineIndex = 0; + +std::tuple simulateShot(const double _fireAngleRad, const double _muzzleVelocity, const double _heightOfTarget, const double _crossWind, const double _tailWind, const double _temperature, const double _airDensity, double _airFriction) { + // returns: dist traveled to the side (crosswind), dist traveled foward (headwind), time of flight + // note: if shot never reaches height of target, then results are undefined (use negative) + const double kCoefficient = -1.0 * _airDensity * _airFriction; + const double powderEffects = (_airFriction) ? ((_temperature + 273.13) / 288.13 - 1) / 40 + 1 : 1.0; + + double currentTime = 0; + ace::vector3 currentPosition(0, 0, 0); + ace::vector3 lastPosition(currentPosition); + ace::vector3 currentVelocity(0, powderEffects * _muzzleVelocity * cos(_fireAngleRad), powderEffects * _muzzleVelocity * sin(_fireAngleRad)); + const ace::vector3 wind(_crossWind, _tailWind, 0); + + while ((currentVelocity.z() > 0) || (currentPosition.z() >= _heightOfTarget)) { + lastPosition = currentPosition; + ace::vector3 apparentWind = wind - currentVelocity; + ace::vector3 changeInVelocity = gravityAccl + apparentWind * (kCoefficient * apparentWind.magnitude()); + currentVelocity += changeInVelocity * timeStep; + currentPosition += currentVelocity * timeStep; + currentTime += timeStep; + } + + const double lastCurrentRatio((_heightOfTarget - currentPosition.z()) / (lastPosition.z() - currentPosition.z())); + ace::vector3 finalPos = lastPosition.lerp(currentPosition, lastCurrentRatio); + + return { finalPos.x(), finalPos.y(), currentTime }; +} + +std::tuple findMaxAngle(const double _muzzleVelocity, const double _airFriction) { + // retrns: angle that goes the furthest, max distance traveled + if (_airFriction == 0) { + return { M_PI_4, _muzzleVelocity * _muzzleVelocity / gravityABS }; + } + // With air resitsnce, max distance angle won't be 45 degrees + double bestAngle = M_PI_4; + double bestDistance = -1; + double testResultDist; + for (double testAngle = M_PI_4; testAngle > 0; testAngle -= (M_PI_4 / 100.0)) { + std::tie(std::ignore, testResultDist, std::ignore) = simulateShot(testAngle, _muzzleVelocity, 0, 0, 0, 15, 1, _airFriction); + if (testResultDist > bestDistance) { + bestAngle = testAngle; + bestDistance = testResultDist; + } + } + return { bestAngle, bestDistance }; +} + +std::tuple simulateFindSolution(const double _rangeToHit, const double _heightToHit, const double _muzzleVelocity, const double _airFriction, const double _minElev, const double _maxElev, const bool _highArc) { + // returns: actual distance traveled, elevation, time of flight + double searchMin = _minElev; + double searchMax = _maxElev; + + if (!_airFriction) { + // can do trivial ballistics physics to get angle, could compute tof as well, but run through sim once to ensure consistancy (uses positive value of g) + double radicand = pow(_muzzleVelocity, 4) - gravityABS * (gravityABS * pow(_rangeToHit, 2) + 2 * _heightToHit * pow(_muzzleVelocity, 2)); + if ((!_rangeToHit) || (radicand < 0)) { // radican't + return { -1, -1, -1 }; + } + radicand = sqrt(radicand); + double angleRoot = atan((pow(_muzzleVelocity, 2) + radicand) / (gravityABS * _rangeToHit)); + if ((angleRoot > _maxElev) || (angleRoot < _minElev)) { + angleRoot = atan((pow(_muzzleVelocity, 2) - radicand) / (gravityABS * _rangeToHit)); + } + if ((angleRoot > _maxElev) || (angleRoot < _minElev)) { + return { -1, -1, -1 }; + }; + const double tof = _rangeToHit / (_muzzleVelocity * cos(angleRoot)); + return { _rangeToHit, angleRoot, tof }; + } + + + int numberOfAttempts = 0; + double resultDistance = -1; + double resultTime = -1; + double currentError = 9999; + double currentElevation = -1; + do { + if (numberOfAttempts++ > 50) break; // for safetey, min/max should converge long before + currentElevation = (searchMin + searchMax) / 2.0; + std::tie(std::ignore, resultDistance, resultTime) = simulateShot(currentElevation, _muzzleVelocity, _heightToHit, 0, 0, 15, 1, _airFriction); + currentError = _rangeToHit - resultDistance; + // printf("elev %f [%f, %f]range%f\n goes %f [%f]\n", currentElevation, searchMin, searchMax, (searchMax - searchMin), resultDistance, currentError); + if ((currentError > 0) ^ (!_highArc)) { + searchMax = currentElevation; + } else { + searchMin = currentElevation; + } + } while ((searchMax - searchMin) > rangeSearchAngleConvergance); + + // printf("[%f, %f] Actuall [%f] err [%f of %f]\n", _rangeToHit, _heightToHit, resultDistance, currentError, (_rangeToHit * rangeSearchErrorMax * (_highArc ? 1.0 : 2.0))); + // On some low angle shots, it will really struggle to converge because of precision issues + if ((abs(currentError) > (_rangeToHit * rangeSearchErrorMax * (_highArc ? 1.0 : 2.0)))) { + return { -1, -1, -1 }; + } + return { resultDistance, currentElevation, resultTime }; +} + +void writeNumber(std::stringstream & ss, double _num, const int _widthInt, const int _widthDec) { + if ((_num < 0) && (_num > -0.05)) { // hard coded fix -0.0 rounding errors + _num = 0; + } + if (_widthInt > 1) { + ss << std::setfill('0'); + } + ss << std::fixed << std::setw(_widthInt) << std::setprecision(_widthDec) << _num; +} + +std::string simulateCalcRangeTableLine(const double _rangeToHit, const double _muzzleVelocity, const double _airFriction, const double _minElev, const double _maxElev, const bool _highArc) { + double actualDistance, lineElevation, lineTimeOfFlight; + std::tie(actualDistance, lineElevation, lineTimeOfFlight) = simulateFindSolution(_rangeToHit, 0, _muzzleVelocity, _airFriction, _minElev, _maxElev, _highArc); + if (lineTimeOfFlight < 0) { + return ""; + } + double actualDistanceHeight, lineHeightElevation, lineHeightTimeOfFlight; + std::tie(actualDistanceHeight, lineHeightElevation, lineHeightTimeOfFlight) = simulateFindSolution(_rangeToHit, -100, _muzzleVelocity, _airFriction, _minElev, _maxElev, _highArc); + + + std::stringstream returnSS; + + returnSS << "[\""; + writeNumber(returnSS, _rangeToHit, 0, 0); + returnSS << "\",\""; + writeNumber(returnSS, lineElevation * 3200.0 / M_PI, 0, 0); + returnSS << "\",\""; + + if (lineHeightElevation > 0) { + const double drElevAdjust = lineHeightElevation - lineElevation; + const double drTofAdjust = lineHeightTimeOfFlight - lineTimeOfFlight; + writeNumber(returnSS, drElevAdjust * 3200.0 / M_PI, 0, 0); + returnSS << "\",\""; + writeNumber(returnSS, drTofAdjust, 0, 1); + } else { + // low angle shots won't be able to adjust down further + returnSS << "-\",\"-"; + } + returnSS << "\",\""; + writeNumber(returnSS, lineTimeOfFlight, 0, ((lineTimeOfFlight < 99.945) ? 1 : 0)); // round TOF when high + returnSS << "\",\""; + + if (_airFriction) { + // Calc corrections: + double xOffset, yOffset; + // Crosswind + std::tie(xOffset, std::ignore, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 10, 0, 15, 1, _airFriction); + const double crosswindOffsetRad = atan2(xOffset, actualDistance) / 10; + // Headwind + std::tie(std::ignore, yOffset, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 0, -10, 15, 1, _airFriction); + const double headwindOffset = (actualDistance - yOffset) / 10; + // Tailwind + std::tie(std::ignore, yOffset, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 0, 10, 15, 1, _airFriction); + const double tailwindOffset = (actualDistance - yOffset) / 10; + // Air Temp Dec + std::tie(std::ignore, yOffset, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 0, 0, 5, 1, _airFriction); + const double tempDecOffset = (actualDistance - yOffset) / 10; + // Air Temp Inc + std::tie(std::ignore, yOffset, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 0, 0, 25, 1, _airFriction); + const double tempIncOffset = (actualDistance - yOffset) / 10; + // Air Density Dec + std::tie(std::ignore, yOffset, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 0, 0, 15, 0.9, _airFriction); + const double airDensityDecOffset = (actualDistance - yOffset) / 10; + // Air Density Inc + std::tie(std::ignore, yOffset, std::ignore) = simulateShot(lineElevation, _muzzleVelocity, 0, 0, 0, 15, 1.1, _airFriction); + const double airDensityIncOffset = (actualDistance - yOffset) / 10; + + writeNumber(returnSS, crosswindOffsetRad * 3200.0 / M_PI, 1, 1); + returnSS << "\",\""; + writeNumber(returnSS, headwindOffset, 1, (abs(headwindOffset) > 9.949) ? 0 : 1); + returnSS << "\",\""; + writeNumber(returnSS, tailwindOffset, 1, (abs(tailwindOffset) > 9.949) ? 0 : 1); + returnSS << "\",\""; + writeNumber(returnSS, tempDecOffset, 1, (abs(tempDecOffset) > 9.949) ? 0 : 1); + returnSS << "\",\""; + writeNumber(returnSS, tempIncOffset, 1, (abs(tempIncOffset) > 9.949) ? 0 : 1); + returnSS << "\",\""; + writeNumber(returnSS, airDensityDecOffset, 1, (abs(airDensityDecOffset) > 9.949) ? 0 : 1); + returnSS << "\",\""; + writeNumber(returnSS, airDensityIncOffset, 1, (abs(airDensityIncOffset) > 9.949) ? 0 : 1); + returnSS << "\"]"; + } else { + returnSS << "-\",\"-\",\"-\",\"-\",\"-\",\"-\",\"-\"]"; // 7 dashes + } + return (returnSS.str()); +} + +void __stdcall RVExtensionVersion(char* output, int outputSize) { + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); +} +void __stdcall RVExtension(char* output, int outputSize, const char* function) { + if (!strcmp(function, "version")) { + RVExtensionVersion(output, outputSize); + return; + } + strncpy(output, "error - use args version of callExtension", outputSize - 1); +} +int __stdcall RVExtensionArgs(char* output, int outputSize, const char* function, const char** args, int argsCnt) { + if (!strcmp(function, "version")) { + RVExtensionVersion(output, outputSize); + return 0; + } + + if (!strcmp(function, "start")) { + if (argsCnt != 5) { return -2; } // Error: not enough args + const double muzzleVelocity = strtod(args[0], NULL); + const double airFriction = strtod(args[1], NULL); + double minElev = (M_PI / 180.0) * strtod(args[2], NULL); + double maxElev = (M_PI / 180.0) * strtod(args[3], NULL); + const bool highArc = !strcmp(args[4], "true"); + + // Reset workers: + fWorkers.clear(); + getLineIndex = 0; + + double bestAngle, bestDistance; + std::tie(bestAngle, bestDistance) = findMaxAngle(muzzleVelocity, airFriction); + + minElev = std::max(minElev, 2 * (M_PI / 180.0)); // cap min to 2 degrees (negative elev might get messy) + maxElev = std::min(maxElev, 88 * (M_PI / 180.0)); // cap max to 88 degrees (mk6) + if (highArc) { + minElev = std::max(minElev, bestAngle); + } else { + maxElev = std::min(maxElev, bestAngle); + } + const double loopStart = (bestDistance < 4000) ? 50 : 100; + const double loopInc = (bestDistance < 5000) ? 50 : 100; // simplify when range gets high + const double loopMaxRange = std::min(bestDistance, 30000.0); // with no air resistance, max range could go higher than 60km + + if (maxElev > minElev) { // don't bother if we can't hit anything (e.g. mortar in low mode) + for (double range = loopStart; range < loopMaxRange; range += loopInc) { + fWorkers.emplace_back(std::async(&simulateCalcRangeTableLine, range, muzzleVelocity, airFriction, minElev, maxElev, highArc)); + } + } + + std::stringstream outputStr; // debug max distance and thead count + outputStr << "[" << bestDistance << "," << fWorkers.size() << "]"; + strncpy(output, outputStr.str().c_str(), outputSize - 1); + return 0; + } + + if (!strcmp(function, "getline")) { + // 1 = data on line, 2 - data not ready, 3 - done + std::string result = ""; + std::future_status workerStatus; + + while (result.empty()) { + if (getLineIndex >= fWorkers.size()) { + return 3; + } + workerStatus = fWorkers[getLineIndex].wait_for(std::chrono::seconds(0)); + if (workerStatus != std::future_status::ready) { + return 2; + } + result = fWorkers[getLineIndex].get(); + getLineIndex++; + } + strncpy(output, result.c_str(), outputSize - 1); + return 1; + } + + strncpy(output, "error - invalid function", outputSize - 1); + return RETURN_INVALID_FUNCTION; // Error: function not valid +} diff --git a/extensions/artillerytables/artillerytables.hpp b/extensions/artillerytables/artillerytables.hpp new file mode 100644 index 00000000000..bd7c7d35a2a --- /dev/null +++ b/extensions/artillerytables/artillerytables.hpp @@ -0,0 +1,22 @@ +/* + * artillerytables.hpp + * Author: PabstMirror + */ + +// ace libs: +#include "vector.hpp" +#include "shared.hpp" +#define RETURN_INVALID_FUNCTION -1001 +#define RETURN_WRONG_ARG_COUNT -1002 + +extern "C" { + EXPORT void __stdcall RVExtension(char* output, int outputSize, const char* function); + EXPORT int __stdcall RVExtensionArgs(char* output, int outputSize, const char* function, const char** argv, int argc); + EXPORT void __stdcall RVExtensionVersion(char* output, int outputSize); +} + +std::tuple simulateShot(const double _fireAngleRad, const double _muzzleVelocity, const double _heightOfTarget, const double _crossWind, const double _tailWind, const double _temperature, const double _airDensity, double _airFriction); +std::tuple findMaxAngle(const double _muzzleVelocity, const double _airFriction); +std::tuple simulateFindSolution(const double _rangeToHit, const double _heightToHit, const double _muzzleVelocity, const double _airFriction, const double _minElev, const double _maxElev, const bool _highArc); +void writeNumber(std::stringstream & ss, double _num, const int _widthInt, const int _widthDec); +std::string simulateCalcRangeTableLine(const double _rangeToHit, const double _muzzleVelocity, const double _airFriction, const double _minElev, const double _maxElev, const bool _highArc); diff --git a/extensions/artillerytables/tests/tester.cpp b/extensions/artillerytables/tests/tester.cpp new file mode 100644 index 00000000000..2dfabe4566e --- /dev/null +++ b/extensions/artillerytables/tests/tester.cpp @@ -0,0 +1,100 @@ +#include +#include +#include "gtest/gtest.h" +#include "../artillerytables.hpp" + + +extern "C" { + __declspec(dllexport) void __stdcall RVExtension(char* output, int outputSize, const char* function); + __declspec(dllexport) int __stdcall RVExtensionArgs(char* output, int outputSize, const char* function, const char** argv, int argc); + __declspec(dllexport) void __stdcall RVExtensionVersion(char* output, int outputSize); +} + +namespace test_ace_artillerytables { + TEST(Extension, VersionOld) { + char output[256]; + char function[] = "version"; + RVExtension(output, 256, function); + std::cout << "VersionOld: " << output << "\n"; + ASSERT_STREQ(output, ACE_FULL_VERSION_STR); + } + TEST(Extension, VersionRVExtensionVersion) { + char output[256]; + RVExtensionVersion(output, 256); + std::cout << "VersionExtension: " << output << "\n"; + ASSERT_STREQ(output, ACE_FULL_VERSION_STR); + } + TEST(Extension, VersionArray) { + char output[256]; + char function[] = "version"; + int extReturn = RVExtensionArgs(output, 256, function, NULL, 0); + std::cout << "VersionNew: " << output << "\n"; + ASSERT_EQ(extReturn, 0); + ASSERT_STREQ(output, ACE_FULL_VERSION_STR); + } + TEST(Extension, InvalidFuncOld) { + char output[256]; + char function[] = "blah"; + RVExtension(output, 256, function); + ASSERT_STREQ(output, "error - use args version of callExtension"); + } + TEST(Extension, InvalidFuncArray) { + char output[256]; + char function[] = "blah"; + int extReturn = RVExtensionArgs(output, 256, function, nullptr, 0); + std::cout << "InvalidFunc: " << output << "\n"; + ASSERT_EQ(extReturn, RETURN_INVALID_FUNCTION); + ASSERT_STREQ(output, "error - invalid function"); + } + + + TEST(Extension, TestRun) { + // very basic test that it runs the correct number of lines + char output[256]; + + // Start: + char function1[] = "start"; + const char* args1[] = { "400", "-0.00005", "-5", "80", "true" }; + auto t1 = std::chrono::high_resolution_clock::now(); + int ret1 = RVExtensionArgs(output, 256, function1, args1, 5); + auto t2 = std::chrono::high_resolution_clock::now(); + std::printf("ret: %d - %s\n", ret1, output); + std::printf("func %s: %1.1f ms\n", function1, std::chrono::duration(t2 - t1).count()); + ASSERT_STREQ(output, "[10391.8,103]"); + ASSERT_EQ(ret1, 0); + + int lines = 0; + auto t3 = std::chrono::high_resolution_clock::now(); + char function2[] = "getline"; + int ret2 = 0; + while (ret2 != 3) { // dumb spin + ret2 = RVExtensionArgs(output, 256, function2, NULL, 0); + if (ret2 == 1) { + lines++; + // std::printf("ret: %d - %s\n", ret2, output); + } + } + auto t4 = std::chrono::high_resolution_clock::now(); + std::printf("func %s: %1.1f ms with %d lines\n", function2, std::chrono::duration(t3 - t2).count(), lines); + + std::printf("callExtensions finished in %1.1f ms\n", std::chrono::duration(t4 - t1).count()); + + ASSERT_EQ(lines, 69); + } +} + + +int main(int argc, char** argv) { + // Misc Testing code + // Determine realistic air firiction values + //double mv = 241; + //std::printf(" %f m/s\n", mv); + //double range; + //for (double ar = 0; ar > -0.00015; ar -= 0.00001) { + // std::tie(std::ignore, range) = findMaxAngle(mv, ar); + // printf("[%f] = %f\n", ar, range); + //} + ::testing::InitGoogleTest(&argc, argv); + std::cout << "Starting tests!\n"; + return RUN_ALL_TESTS(); +} diff --git a/extensions/break_line/ace_break_line.cpp b/extensions/break_line/ace_break_line.cpp index c408ceab5cb..909c2a1ebbf 100644 --- a/extensions/break_line/ace_break_line.cpp +++ b/extensions/break_line/ace_break_line.cpp @@ -64,9 +64,9 @@ std::string addLineBreaks(const std::vector &words) { void __stdcall RVExtension(char *output, int outputSize, const char *function) { ZERO_OUTPUT(); if (!strcmp(function, "version")) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); } else { - strncpy_s(output, outputSize, addLineBreaks(splitString(function)).c_str(), _TRUNCATE); + strncpy(output, addLineBreaks(splitString(function)).c_str(), outputSize - 1); } EXTENSION_RETURN(); } diff --git a/extensions/clipboard/ace_clipboard.cpp b/extensions/clipboard/ace_clipboard.cpp index 0b3d965ad5d..2ca85711df2 100644 --- a/extensions/clipboard/ace_clipboard.cpp +++ b/extensions/clipboard/ace_clipboard.cpp @@ -33,7 +33,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { } if (!strcmp(function, "version")) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + std::strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); EXTENSION_RETURN(); } @@ -53,7 +53,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { result = "GlobalAlloc() failed, GetLastError=" + GetLastError(); EXTENSION_RETURN(); } - strncpy_s(pClipboardData, gClipboardData.length(), gClipboardData.c_str(), _TRUNCATE); + strncpy(pClipboardData, gClipboardData.c_str(), gClipboardData.length()); // if success, system owns the memory, if fail, free it from the heap if (SetClipboardData(CF_TEXT, pClipboardData) == NULL) { @@ -72,7 +72,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { } if (result.length() > 1) { - strncpy_s(output, outputSize, result.c_str(), _TRUNCATE); + strncpy(output, result.c_str(), outputSize - 1); } #endif diff --git a/extensions/common/shared.hpp b/extensions/common/shared.hpp index a3cf1d154f9..c7c8c614030 100644 --- a/extensions/common/shared.hpp +++ b/extensions/common/shared.hpp @@ -20,6 +20,8 @@ #include "ace_version.hpp" #include #include //std::isspace +#include +#include #ifdef _DEBUG #define ZERO_OUTPUT() { memset(output, 0x00, outputSize); } @@ -73,7 +75,7 @@ namespace ace { struct exception { exception(const uint32_t code_, const std::string & text_) : code(code_), text(text_) {} - + exception & operator= (const exception& other) { code = other.code; text = other.text; return *this; } bool operator == (const exception &r) const { return ( code == r.code ); } @@ -83,11 +85,11 @@ namespace ace { } #ifndef _WIN32 -#define __stdcall +#define __stdcall #endif #if defined(_MSC_VER) - // Microsoft + // Microsoft #define EXPORT __declspec(dllexport) #define IMPORT __declspec(dllimport) #elif defined(_GCC) diff --git a/extensions/common/vector.hpp b/extensions/common/vector.hpp index 4830e18ba5c..101ee0746dc 100644 --- a/extensions/common/vector.hpp +++ b/extensions/common/vector.hpp @@ -25,12 +25,12 @@ namespace ace { template class vector3 { public: - constexpr vector3() : + vector3() : _x(0), _y(0), _z(0) { } - constexpr vector3(const T x_, const T y_, const T z_) noexcept : + vector3(const T x_, const T y_, const T z_) : _x(x_), _y(y_), _z(z_) { @@ -47,7 +47,7 @@ namespace ace { _z = buffer[2]; } - constexpr vector3& operator= (const vector3& other) noexcept { _x = other.x(); _y = other.y(); _z = other.z(); return *this; } + vector3& operator= (const vector3& other) { _x = other.x(); _y = other.y(); _z = other.z(); return *this; } /*#ifdef _WIN32 && _DIRECTX vector3 & operator= (const XMFLOAT3& Float3) { _x = Float3.x; _y = Float3.y; _z = Float3.z; return *this; } #endif @@ -56,38 +56,38 @@ namespace ace { vector3 & operator= (const btVector3& bt_vec) { _x = bt_vec.x(); _y = bt_vec.y(); _z = bt_vec.z(); return *this; } #endif */ - constexpr vector3 operator * (const T& val) const { return vector3(_x * val, _y * val, _z * val); } - constexpr vector3 operator / (const T& val) const { T invVal = T(1) / val; return vector3(_x * invVal, _y * invVal, _z * invVal); } - constexpr vector3 operator + (const vector3& v) const { return vector3(_x + v.x(), _y + v.y(), _z + v.z()); } - constexpr vector3 operator / (const vector3& v) const { return vector3(_x / v.x(), _y / v.y(), _z / v.z()); } - constexpr vector3 operator * (const vector3& v) const { return vector3(_x * v.x(), _y * v.y(), _z * v.z()); } - constexpr vector3 operator - (const vector3& v) const { return vector3(_x - v.x(), _y - v.y(), _z - v.z()); } - constexpr vector3 operator - () const { return vector3(-_x, -_y, -_z); } - - constexpr vector3& operator *=(const vector3& v) noexcept { _x *= v._x; _y *= v._y; _z *= v._z; return *this; } - constexpr vector3& operator *=(T mag) noexcept { _x *= mag; _y *= mag; _z *= mag; return *this; } - constexpr vector3& operator /=(const vector3& v) noexcept { _x /= v._x; _y /= v._y; _z /= v._z; return *this; } - constexpr vector3& operator /=(T mag) noexcept { _x /= mag; _y /= mag; _y /= mag; return *this; } - constexpr vector3& operator +=(const vector3& v) noexcept { _x += v._x; _y += v._y; _z += v._z; return *this; } - constexpr vector3& operator -=(const vector3& v) noexcept { _x -= v._x; _y -= v._y; _z -= v._z; return *this; } - - - bool operator == (const vector3 &r) const noexcept { return (_x == r.x() && _y == r.y() && _z == r.z()); } - - constexpr T magnitude() const noexcept { return sqrt(_x * _x + _y * _y + _z * _z); } - constexpr T magnitude_squared() const noexcept { return _x * _x + _y * _y + _z * _z; } - constexpr T dot(const vector3& v) const noexcept { return (_x * v.x() + _y * v.y() + _z * v.z()); } - constexpr T distance(const vector3& v) const noexcept { vector3 dist = (*this - v); dist = dist * dist; return sqrt(dist.x() + dist.y() + dist.z()); } - constexpr vector3 cross(const vector3& v) const noexcept { return vector3(_y * v.z() - _z * v.y(), _z * v.x() - _x * v.z(), _x * v.y() - _y * v.x()); } - constexpr vector3 normalize() const noexcept { return (*this / abs(magnitude())); }; - constexpr bool zero_distance() const noexcept { return ((_x == 0.0f && _y == 0.0f && _z == 0.0f) ? true : false ); } + vector3 operator * (const T& val) const { return vector3(_x * val, _y * val, _z * val); } + vector3 operator / (const T& val) const { T invVal = T(1) / val; return vector3(_x * invVal, _y * invVal, _z * invVal); } + vector3 operator + (const vector3& v) const { return vector3(_x + v.x(), _y + v.y(), _z + v.z()); } + vector3 operator / (const vector3& v) const { return vector3(_x / v.x(), _y / v.y(), _z / v.z()); } + vector3 operator * (const vector3& v) const { return vector3(_x * v.x(), _y * v.y(), _z * v.z()); } + vector3 operator - (const vector3& v) const { return vector3(_x - v.x(), _y - v.y(), _z - v.z()); } + vector3 operator - () const { return vector3(-_x, -_y, -_z); } + + vector3& operator *=(const vector3& v) { _x *= v._x; _y *= v._y; _z *= v._z; return *this; } + vector3& operator *=(T mag) { _x *= mag; _y *= mag; _z *= mag; return *this; } + vector3& operator /=(const vector3& v) { _x /= v._x; _y /= v._y; _z /= v._z; return *this; } + vector3& operator /=(T mag) { _x /= mag; _y /= mag; _y /= mag; return *this; } + vector3& operator +=(const vector3& v) { _x += v._x; _y += v._y; _z += v._z; return *this; } + vector3& operator -=(const vector3& v) { _x -= v._x; _y -= v._y; _z -= v._z; return *this; } + + + bool operator == (const vector3 &r) const { return (_x == r.x() && _y == r.y() && _z == r.z()); } + + T magnitude() const { return sqrt(_x * _x + _y * _y + _z * _z); } + T magnitude_squared() const { return _x * _x + _y * _y + _z * _z; } + T dot(const vector3& v) const { return (_x * v.x() + _y * v.y() + _z * v.z()); } + T distance(const vector3& v) const { vector3 dist = (*this - v); dist = dist * dist; return sqrt(dist.x() + dist.y() + dist.z()); } + vector3 cross(const vector3& v) const { return vector3(_y * v.z() - _z * v.y(), _z * v.x() - _x * v.z(), _x * v.y() - _y * v.x()); } + vector3 normalize() const { return (*this / abs(magnitude())); }; + bool zero_distance() const { return ((_x == 0.0f && _y == 0.0f && _z == 0.0f) ? true : false ); } static float clamp(T x, T a, T b) { return x < a ? a : (x > b ? b : x); } - static vector3 lerp(const vector3& A, const vector3& B, const T t) noexcept { return A*t + B*(1.f - t); } - constexpr vector3 lerp(const vector3& B, const T t) const noexcept { return vector3::lerp(*this, B, t); } + static vector3 lerp(const vector3& A, const vector3& B, const T t) { return A*t + B*(1.f - t); } + vector3 lerp(const vector3& B, const T t) const { return vector3::lerp(*this, B, t); } - static vector3 slerp(vector3 start, vector3 end, T percent) noexcept { + static vector3 slerp(vector3 start, vector3 end, T percent) { T dot = start.dot(end); dot = vector3::clamp(dot, -1.0f, 1.0f); @@ -96,13 +96,13 @@ namespace ace { relative.normalize(); return ((start * cos(theta)) + (relative*sin(theta))); } - constexpr vector3 slerp(const vector3& B, const T p) const noexcept { + vector3 slerp(const vector3& B, const T p) const { return vector3::slerp(*this, B, p); } - const T& x() const noexcept { return _x; } - const T& y() const noexcept { return _y; } - const T& z() const noexcept { return _z; } + const T& x() const { return _x; } + const T& y() const { return _y; } + const T& z() const { return _z; } void x(const T val) { _x = val; } void y(const T val) { _y = val; } diff --git a/extensions/dynload/ace_dynload.cpp b/extensions/dynload/ace_dynload.cpp index 3573ed3877f..5cf2c52919a 100644 --- a/extensions/dynload/ace_dynload.cpp +++ b/extensions/dynload/ace_dynload.cpp @@ -60,7 +60,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { // Real functionality goes here ace::dispatch::get().call(command, _args, result); - - sprintf_s(output, outputSize, "%s", result.c_str()); + sprintf_s(output, outputSize - 1, "%s", result.c_str()); EXTENSION_RETURN(); } diff --git a/extensions/fcs/ace_fcs.cpp b/extensions/fcs/ace_fcs.cpp index 8ab57a1c778..3ca32f439f6 100644 --- a/extensions/fcs/ace_fcs.cpp +++ b/extensions/fcs/ace_fcs.cpp @@ -96,7 +96,7 @@ double getSolution(double initSpeed, double airFriction, double angleTarget, dou void __stdcall RVExtension(char *output, int outputSize, const char *function) { ZERO_OUTPUT(); if (!strcmp(function, "version")) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); } else { std::vector argStrings = splitString(function); double initSpeed = std::stod(argStrings[0]); @@ -109,7 +109,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { std::stringstream sstream; sstream << result; - strncpy_s(output, outputSize, sstream.str().c_str(), _TRUNCATE); + strncpy(output, sstream.str().c_str(), outputSize - 1); } EXTENSION_RETURN(); } diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 2a50ba4ee65..9b0e5e78ef1 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -34,7 +34,7 @@ namespace ace { double painToAdd = 0; wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN, woundID); - stream << "_woundsCreated = ["; + stream << "[["; for (int i = 0; i < wounds.size(); ++i) { stream << wounds.at(i).AsString(); @@ -45,9 +45,9 @@ namespace ace { painToAdd += wounds.at(i).pain; } - stream << "];"; + stream << "],"; - stream << "_painToAdd = " << painToAdd << ";"; + stream << painToAdd << "]"; return stream.str(); } @@ -78,7 +78,7 @@ namespace ace { } } if (highestSpot == NULL) { - break; + break; } int c = 0; @@ -94,10 +94,10 @@ namespace ace { { injuryToAdd = highestSpot; } - else - { + else + { int indexNewInjuryToAdd = rand() % information.size(); - injuryToAdd = information.at(indexNewInjuryToAdd); + injuryToAdd = information.at(indexNewInjuryToAdd); } int bodyPartID = selection; @@ -105,7 +105,7 @@ namespace ace { { bodyPartID = rand() % 6; } - + injuries::OpenWound newWound(woundID++, injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); injuriesToAdd.push_back(newWound); } @@ -202,14 +202,14 @@ namespace ace { } } - int handleDamage::SelectionToNumber(const std::string& selectionName) + int handleDamage::SelectionToNumber(const std::string& hitpointName) { // TODO use dynamic selections instead - std::vector selections = { "head", "body", "hand_l", "hand_r", "leg_l", "leg_r" }; - std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); - if (it != selections.end()) + std::vector hitpoints = { "Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg" }; + std::vector::iterator it = find(hitpoints.begin(), hitpoints.end(), hitpointName); + if (it != hitpoints.end()) { - return it - selections.begin(); + return it - hitpoints.begin(); } else { diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp index aca062e2050..8d13216f913 100644 --- a/extensions/medical/medical.cpp +++ b/extensions/medical/medical.cpp @@ -33,7 +33,7 @@ std::vector parseExtensionInput(const std::string& input) void __stdcall RVExtension(char *output, int outputSize, const char *function) { if (!strcmp(function, "version")) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); } else { @@ -85,6 +85,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { } } - strncpy_s(output, outputSize, returnValue.c_str(), _TRUNCATE); + strncpy(output, returnValue.c_str(), outputSize - 1); } } diff --git a/extensions/parse_imagepath/ace_parse_imagepath.cpp b/extensions/parse_imagepath/ace_parse_imagepath.cpp index 110cb904cc3..eda1af0d6e1 100644 --- a/extensions/parse_imagepath/ace_parse_imagepath.cpp +++ b/extensions/parse_imagepath/ace_parse_imagepath.cpp @@ -40,9 +40,9 @@ std::string getImagePathFromStructuredText(const std::string & input) { void __stdcall RVExtension(char *output, int outputSize, const char *function) { ZERO_OUTPUT(); if (!strcmp(function, "version")) { - strncpy_s(output, outputSize, ACE_FULL_VERSION_STR, _TRUNCATE); + strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1); } else { - strncpy_s(output, outputSize, getImagePathFromStructuredText(function).c_str(), _TRUNCATE); + strncpy(output, getImagePathFromStructuredText(function).c_str(), outputSize - 1); } EXTENSION_RETURN(); } diff --git a/extras/airFrictionAnalysis.txt b/extras/airFrictionAnalysis.txt index ad06f309d22..1a7ce68c768 100644 --- a/extras/airFrictionAnalysis.txt +++ b/extras/airFrictionAnalysis.txt @@ -152,12 +152,12 @@ Max. Tof diff (ms): 11.5 Optimal airFriction: 0.00063027 ########################################## Ammo Class: ACE_762x67_Ball_Berger_Hybrid_OTM -MaxRanges (m): [900, 1000, 1000] +MaxRanges (m): [1100, 1200, 1300] MuzzleVelocities (m/s): [800, 853, 884] -Max. Velocity diff (m/s): 19.94 -Max. Drop diff (cm): 8.04 -Max. Tof diff (ms): 16.0 -Optimal airFriction: 0.00055262 +Max. Velocity diff (m/s): 25.76 +Max. Drop diff (cm): 16.2 +Max. Tof diff (ms): 28.5 +Optimal airFriction: 0.00054587 ########################################## Ammo Class: B_762x54_Ball MaxRanges (m): [500, 800, 800] diff --git a/extras/assets/maglite/maglite_animation.blend b/extras/assets/maglite/maglite_animation.blend new file mode 100644 index 00000000000..1e1733b44d8 Binary files /dev/null and b/extras/assets/maglite/maglite_animation.blend differ diff --git a/hemtt.toml b/hemtt.toml new file mode 100644 index 00000000000..d706162df86 --- /dev/null +++ b/hemtt.toml @@ -0,0 +1,26 @@ +name = "ACE3" +prefix = "ace" +author = "ACE-Team" +files = [ + "*.dll", + "*.so", + "mod.cpp", + "README.md", + "docs/README_DE.md", + "docs/README_PL.md", + "docs/README.zh-TW.md", + "AUTHORS.txt", + "LICENSE", + "logo_ace3_ca.paa", + "meta.cpp" +] + +keyname = "{{prefix}}_{{version}}" +signame = "{{prefix}}_{{version}}-{{git \"id 8\"}}" + +releasebuild = [ + "@zip ace3_{{semver.major}}.{{semver.minor}}.{{semver.patch}}" +] + +[header_exts] +version= "{{git \"id 8\"}}" diff --git a/include/a3/data_f/$PBOPREFIX$ b/include/a3/data_f/$PBOPREFIX$ new file mode 100644 index 00000000000..74761492ac7 --- /dev/null +++ b/include/a3/data_f/$PBOPREFIX$ @@ -0,0 +1 @@ +a3\data_f \ No newline at end of file diff --git a/include/a3/ui_f/$PBOPREFIX$ b/include/a3/ui_f/$PBOPREFIX$ new file mode 100644 index 00000000000..bcaad3e8cc0 --- /dev/null +++ b/include/a3/ui_f/$PBOPREFIX$ @@ -0,0 +1 @@ +a3\ui_f \ No newline at end of file diff --git a/include/a3/ui_f/hpp/defineCommonColors.inc b/include/a3/ui_f/hpp/defineCommonColors.inc old mode 100755 new mode 100644 diff --git a/include/a3/ui_f/hpp/defineDIKCodes.inc b/include/a3/ui_f/hpp/defineDIKCodes.inc new file mode 100644 index 00000000000..eb914f94829 --- /dev/null +++ b/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -0,0 +1,189 @@ +#ifndef DIK_ESCAPE + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ diff --git a/include/a3/ui_f/hpp/defineResincl.inc b/include/a3/ui_f/hpp/defineResincl.inc new file mode 100644 index 00000000000..7a94b6b5929 --- /dev/null +++ b/include/a3/ui_f/hpp/defineResincl.inc @@ -0,0 +1,3170 @@ +/*******************/ +/* Tactical menu */ +/*******************/ + +// Menu commands + // main menu +#define CMD_SEPARATOR -1 +#define CMD_NOTHING -2 +#define CMD_HIDE_MENU -3 +#define CMD_BACK -4 +// Custom menu command +#define CMD_EXECUTE -5 + +#ifdef _CONFIG +enum +{ +// note: this CMD should be if possible organized as is menu +// (items from the same menu together) +// this makes searching much easier + +//main menu level +CMD_GETIN, +CMD_GETOUT, +CMD_ACTION, + +// move submenu + +// other commands +CMD_ADVANCE, +CMD_STAY_BACK, +CMD_FLANK_LEFT, +CMD_FLANK_RIGHT, +CMD_NEXT_WAYPOINT, +CMD_HIDE, +CMD_JOIN, +CMD_STOP, +CMD_EXPECT, +CMD_MOVE, + + // formations +CMD_FORM_COLUMN, +CMD_FORM_STAGCOL, +CMD_FORM_WEDGE, +CMD_FORM_ECHLEFT, +CMD_FORM_ECHRIGHT, +CMD_FORM_VEE, +CMD_FORM_LINE, +CMD_FORM_DIAMOND, +CMD_FORM_FILE, + +// engage +CMD_ENGAGE, +CMD_LOOSE_FORM, +CMD_KEEP_FORM, + +CMD_HOLD_FIRE, +CMD_OPEN_FIRE, +CMD_FIRE, + +// status +CMD_WATCH, +CMD_WATCH_AROUND, +CMD_WATCH_AUTO, +CMD_WATCH_DIR, + +// combat modes +CMD_STEALTH, +CMD_COMBAT, +CMD_AWARE, +CMD_SAFE, + +// heal +CMD_HEALBLEEDING, +CMD_HEAL, +CMD_HEAL_SELF, +CMD_REPAIR_VEHICLE, +CMD_CARRY, +CMD_DROP_CARRIED, +CMD_PUTIN, +CMD_UNLOADFROM, + +// swiming and diving +CMD_KEEP_DEPTH_RELATIVE_UP, +CMD_KEEP_DEPTH_RELATIVE_DOWN, +CMD_KEEP_DEPTH_LEADER, +CMD_KEEP_DEPTH_UNDERSURFACE, +CMD_KEEP_DEPTH_ABOVESURFACE, +CMD_KEEP_DEPTH_BOTTOM, + +//suppress fire +CMD_SUPPRESS, + +CMD_POS_UP, +CMD_POS_MIDDLE, +CMD_POS_DOWN, +CMD_POS_AUTO, + // teams +CMD_TEAM_MAIN, +CMD_TEAM_RED, +CMD_TEAM_GREEN, +CMD_TEAM_BLUE, +CMD_TEAM_YELLOW, +CMD_ASSIGN_MAIN, +CMD_ASSIGN_RED, +CMD_ASSIGN_GREEN, +CMD_ASSIGN_BLUE, +CMD_ASSIGN_YELLOW, +CMD_TEAM_DISSOLVE, + +// radio +CMD_RADIO_ALPHA, +CMD_RADIO_BRAVO, +CMD_RADIO_CHARLIE, +CMD_RADIO_DELTA, +CMD_RADIO_ECHO, +CMD_RADIO_FOXTROT, +CMD_RADIO_GOLF, +CMD_RADIO_HOTEL, +CMD_RADIO_INDIA, +CMD_RADIO_JULIET, + +// reply commands + +CMD_REPLY_DONE, +CMD_REPLY_FAIL, +CMD_REPLY_COPY, +CMD_REPLY_REPEAT, +CMD_REPLY_WHERE_ARE_YOU, +CMD_REPORT, +CMD_REPLY_ENGAGING, +CMD_REPLY_UNDER_FIRE, +CMD_REPLY_HIT, +CMD_REPLY_ONE_LESS, +CMD_REPLY_FIREREADY, +CMD_REPLY_FIRENOTREADY, +CMD_REPLY_KILLED, +CMD_REPLY_AMMO_LOW, +CMD_REPLY_FUEL_LOW, +CMD_REPLY_INJURED, +CMD_REPLY_OUT_OF_FAKs, + +CMD_SUPPORT_MEDIC, +CMD_SUPPORT_AMBULANCE, +CMD_SUPPORT_REPAIR, +CMD_SUPPORT_REARM, +CMD_SUPPORT_REFUEL, +CMD_SUPPORT_DONE, + +CMD_RADIO_CUSTOM, +CMD_RADIO_CUSTOM_1, +CMD_RADIO_CUSTOM_2, +CMD_RADIO_CUSTOM_3, +CMD_RADIO_CUSTOM_4, +CMD_RADIO_CUSTOM_5, +CMD_RADIO_CUSTOM_6, +CMD_RADIO_CUSTOM_7, +CMD_RADIO_CUSTOM_8, +CMD_RADIO_CUSTOM_9, +CMD_RADIO_CUSTOM_0, + +CMD_UNIT_1, +CMD_UNIT_2, +CMD_UNIT_3, +CMD_UNIT_4, +CMD_UNIT_5, +CMD_UNIT_6, +CMD_UNIT_7, +CMD_UNIT_8, +CMD_UNIT_9, +CMD_UNIT_10, +CMD_UNIT_11, +CMD_UNIT_12, +CMD_UNITS_ALL, + +CMD_MY_VEHICLE, + +CMD_SELECT_MAIN, +CMD_SELECT_RED, +CMD_SELECT_GREEN, +CMD_SELECT_BLUE, +CMD_SELECT_YELLOW, + +CMD_VEHICLE_1, +CMD_VEHICLE_2, +CMD_VEHICLE_3, +CMD_VEHICLE_4, +CMD_VEHICLE_5, +CMD_VEHICLE_6, +CMD_VEHICLE_7, +CMD_VEHICLE_8, +CMD_VEHICLE_9, +CMD_VEHICLE_10, +CMD_VEHICLE_11, +CMD_VEHICLE_12, + +CMD_SINGLE_UNITS, + +CMD_MP_CHANNEL_GLOBAL, +CMD_MP_CHANNEL_SIDE, +CMD_MP_CHANNEL_COMMAND, +CMD_MP_CHANNEL_GROUP, +CMD_MP_CHANNEL_VEHICLE, + +CMD_CONVERSATION, + +// Context sensitive commands +CMD_MOVE_AUTO, +CMD_STOP_AUTO, +CMD_WATCH_CTX, +CMD_GETIN_AUTO, +CMD_REARM_AUTO, +CMD_ATTACK_AUTO, +CMD_FIRE_AT_POSITION_AUTO, +CMD_SELECT_AUTO, +CMD_SELECT_AUTO_ADD, +CMD_DESELECT_AUTO, +CMD_JOIN_AUTO, +CMD_OPEN_FIRE_AUTO, +CMD_HOLD_FIRE_AUTO, +CMD_COMPLEX_COMMAND, +CMD_DISABLE_MINE, + +CMD_SELECT_UNIT_FROM_BAR, +CMD_DESELECT_UNIT_FROM_BAR, +CMD_SELECT_VEHICLE_FROM_BAR, +CMD_DESELECT_VEHICLE_FROM_BAR, +CMD_SELECT_TEAM_FROM_BAR, +CMD_DESELECT_TEAM_FROM_BAR, + +CMD_JOIN_ALL, + +CMD_SWITCH_TO_LEADER, +CMD_SWITCH_TO_SELECTED, + +CMD_NOTARGET, + +CMD_HC_SELECT_AUTO, +CMD_HC_SELECT_AUTO_ADD, +CMD_HC_DESELECT_AUTO, +CMD_HC_SELECT_UNIT_FROM_BAR, +CMD_HC_DESELECT_UNIT_FROM_BAR, +CMD_HC_SELECT_TEAM_FROM_BAR, +CMD_HC_DESELECT_TEAM_FROM_BAR, +CMD_OPENPARACHUTE, +CMD_TAKE_BACKPACK, +CMD_ASSEMBLE_WEAPON, +CMD_DISASSEMBLE_WEAPON, +CMD_ENGAGE_AUTO, +CMD_FIRE_AUTO, +CMD_FIRE_AT_POSITION_AMMO // same as CMD_FIRE_AT_POSITION_AUTO but with custom magazine +}; + +/// In-game UI hiding animation type +enum HideType +{ + HTNone, // no animation + HTFade, // fade in / fade out + HTMoveLeft, // move from / to the left + HTMoveRight // move from / to the right +}; + +enum +{ + SPTPlain, + SPTPercents +}; + +#endif + + +/*******************/ +/* Controls */ +/*******************/ + +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_CONTROLS_TABLE 19 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 +#define CT_VEHICLE_DIRECTION 105 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// MessageBox styles +#define MB_BUTTON_OK 1 +#define MB_BUTTON_CANCEL 2 +#define MB_BUTTON_USER 4 +#define MB_ERROR_DIALOG 8 + +// Xbox buttons +#define KEY_XINPUT 0x00050000 + +#define KEY_XBOX_A KEY_XINPUT + 0 +#define KEY_XBOX_B KEY_XINPUT + 1 +#define KEY_XBOX_X KEY_XINPUT + 2 +#define KEY_XBOX_Y KEY_XINPUT + 3 +#define KEY_XBOX_Up KEY_XINPUT + 4 +#define KEY_XBOX_Down KEY_XINPUT + 5 +#define KEY_XBOX_Left KEY_XINPUT + 6 +#define KEY_XBOX_Right KEY_XINPUT + 7 +#define KEY_XBOX_Start KEY_XINPUT + 8 +#define KEY_XBOX_Back KEY_XINPUT + 9 +#define KEY_XBOX_LeftBumper KEY_XINPUT + 10 +#define KEY_XBOX_RightBumper KEY_XINPUT + 11 +#define KEY_XBOX_LeftTrigger KEY_XINPUT + 12 +#define KEY_XBOX_RightTrigger KEY_XINPUT + 13 +#define KEY_XBOX_LeftThumb KEY_XINPUT + 14 +#define KEY_XBOX_RightThumb KEY_XINPUT + 15 +#define KEY_XBOX_LeftThumbXRight KEY_XINPUT + 16 +#define KEY_XBOX_LeftThumbYUp KEY_XINPUT + 17 +#define KEY_XBOX_RightThumbXRight KEY_XINPUT + 18 +#define KEY_XBOX_RightThumbYUp KEY_XINPUT + 19 +#define KEY_XBOX_LeftThumbXLeft KEY_XINPUT + 20 +#define KEY_XBOX_LeftThumbYDown KEY_XINPUT + 21 +#define KEY_XBOX_RightThumbXLeft KEY_XINPUT + 22 +#define KEY_XBOX_RightThumbYDown KEY_XINPUT + 23 + +// Predefined controls +#define IDC_OK 1 +#define IDC_CANCEL 2 +#define IDC_AUTOCANCEL 3 +#define IDC_ABORT 4 +#define IDC_RESTART 5 +#define IDC_USER_BUTTON 6 +#define IDC_EXIT_TO_MAIN 7 + +// my own control window for tests +#define IDC_MY_FIRST_LISTBOX 110 +#define IDC_MY_FIRST_BUTTON 111 +#define IDC_MY_FIRST_SLIDER 112 + +#define IDC_MAP 51 +#define IDC_WEATHER 52 +#define IDC_POSITION 53 +#define IDC_TIME 54 +#define IDC_DATE 55 +#define IDC_BRIEFING 56 +#define IDC_MAP_NOTES 57 +#define IDC_MAP_PLAN 58 +#define IDC_MAP_TEAM_SWITCH 59 +#define IDC_MAP_GROUP 60 +//#define IDC_MAP_BRIEFING 61 +//#define IDC_MAP_DEBRIEFING 62 +#define IDC_RADIO_ALPHA 63 +#define IDC_RADIO_BRAVO 64 +#define IDC_RADIO_CHARLIE 65 +#define IDC_RADIO_DELTA 66 +#define IDC_RADIO_ECHO 67 +#define IDC_RADIO_FOXTROT 68 +#define IDC_RADIO_GOLF 69 +#define IDC_RADIO_HOTEL 70 +#define IDC_RADIO_INDIA 71 +#define IDC_RADIO_JULIET 72 +#define IDC_MAP_NAME 73 +#define IDC_WARRANT 74 +#define IDC_GPS 75 + +#define IDC_NOTEPAD_PICTURE 76 + +#define IDC_GPS_ALT 77 +#define IDC_GPS_HEADING 78 + +// - diary topics (used in multiple displays - diary, map, briefing, debriefing) +#define IDC_DIARY_TOPIC_MAP 80 +#define IDC_DIARY_TOPIC_1 81 +#define IDC_DIARY_TOPIC_2 82 +#define IDC_DIARY_TOPIC_3 83 +#define IDC_DIARY_TOPIC_4 84 +#define IDC_DIARY_TOPIC_5 85 +#define IDC_DIARY_TOPIC_6 86 +#define IDC_DIARY_TOPIC_7 87 +#define IDC_DIARY_TOPIC_8 88 +#define IDC_DIARY_TOPIC_9 89 + +#define IDC_HSLIDER 98 +#define IDC_VSLIDER 99 + +#define IDC_ARTILLERY_MAP 500 +#define IDC_ARTILLERY_MAP_FIRE 501 + +#define IDC_ARTILLERY_MAP_NAME 502 +#define IDC_ARTILLERY_MAP_ID 503 +#define IDC_ARTILLERY_MAP_GRID 504 +#define IDC_ARTILLERY_MAP_DIST 505 +#define IDC_ARTILLERY_MAP_MIN 506 +#define IDC_ARTILLERY_MAP_MAX 507 +#define IDC_ARTILLERY_MAP_DIR 508 +#define IDC_ARTILLERY_MAP_ALT 509 +#define IDC_ARTILLERY_MAP_MODE 510 +#define IDC_ARTILLERY_MAP_AMMO 511 +#define IDC_ARTILLERY_MAP_SHELLS 512 +#define IDC_ARTILLERY_MAP_SPREAD 513 +#define IDC_ARTILLERY_MAP_ETA 514 +#define IDC_ARTILLERY_MAP_AMMOCOUNT 515 +#define IDC_ARTILLERY_MAP_WARNING 516 +#define IDC_ARTILLERY_MAP_AIMABOVE 517 + +#define IDC_DIARY_TOPIC_LIST 1001 +#define IDC_DIARY_TOPIC_LISTINDEX 1002 +#define IDC_DIARY_TOPIC_HTML 1003 +#define IDC_DIARY_TOPIC_ADD_RECORD 1004 +#define IDC_DIARY_TOPIC_HTML_GROUP 1013 + +#define IDC_DIARY_PLAYER_NAME 111 +#define IDC_DIARY_MISSION_NAME 112 +#define IDC_DIARY_CURRENT_TASK 113 +#define IDC_DIARY_PLAYER_RANK 116 +//VON/chat muting in Diary +#define IDC_DIARY_PLAYERS_BUTTON 117 +#define IDC_DIARY_PLAYERS_SORT 118 +#define IDC_DIARY_MUTE_ALL 119 + +#define IDC_DIARY_TOPIC_BACKGROUND 1021 +#define IDC_DIARY_SUBTOPIC_BACKGROUND 1022 +#define IDC_DIARY_CONTENT_BACKGROUND 1023 + +//IDCs for marker color and icon. +//Are directly connected to RscMapControl, namely its idcMarkerColor and idcMarkerIcon parameters. +//Engine searches for the parameters in any display where RscMapControl is used, that's why they got more uncommon IDCs. +#define IDC_DIARY_MARKER_COLOR 1090 +#define IDC_DIARY_MARKER_ICON 1091 + + +// Instances of display +#define IDD_MAIN 0 +#define IDD_GAME 1 +#define IDD_SINGLE_MISSION 2 +#define IDD_OPTIONS 3 +#define IDD_CONFIGURE 4 +#define IDD_OPTIONS_VIDEO 5 +#define IDD_OPTIONS_AUDIO 6 +#define IDD_MULTIPLAYER 8 +#define IDD_LOAD_AAR 9 +#define IDD_MAIN_MAP 12 +#define IDD_SAVE 13 +#define IDD_END 14 +#define IDD_SERVER 17 +#define IDD_CLIENT 18 +#define IDD_IP_ADDRESS 19 +#define IDD_SERVER_SETUP 20 +#define IDD_CLIENT_SETUP 21 +#define IDD_CLIENT_WAIT 22 +#define IDD_CHAT 24 +#define IDD_CUSTOM_ARCADE 25 +#define IDD_ARCADE_MAP 26 +#define IDD_ARCADE_UNIT 27 +#define IDD_ARCADE_WAYPOINT 28 +#define IDD_TEMPLATE_SAVE 29 +#define IDD_TEMPLATE_LOAD 30 +#define IDD_LOGIN 31 +#define IDD_INTEL 32 +#define IDD_CAMPAIGN 33 +#define IDD_CREDITS 34 +#define IDD_INTEL_GETREADY 37 +#define IDD_ARCADE_GROUP 40 +#define IDD_ARCADE_SENSOR 41 +#define IDD_NEW_USER 42 +#define IDD_CAMPAIGN_LOAD 43 +#define IDD_ARCADE_EFFECTS 44 +#define IDD_ARCADE_MARKER 45 +#define IDD_MISSION 46 +#define IDD_INTRO 47 +#define IDD_OUTRO 48 +#define IDD_INTERRUPT 49 +#define IDD_DEBRIEFING 50 +#define IDD_SELECT_ISLAND 51 +#define IDD_SERVER_GET_READY 52 +#define IDD_CLIENT_GET_READY 53 +#define IDD_INSERT_MARKER 54 +#define IDD_VOICE_CHAT 55 +#define IDD_DEBUG 56 +#define IDD_HINTC 57 +#define IDD_MISSION_END 58 +#define IDD_SERVER_SIDE 59 +#define IDD_CLIENT_SIDE 60 +#define IDD_MULTIPLAYER_ROLE 61 +#define IDD_AWARD 62 +#define IDD_CHANNEL 63 +#define IDD_PASSWORD 64 +#define IDD_MP_PLAYERS 65 +#define IDD_REVERT 66 +#define IDD_PORT 69 +#define IDD_MP_SETUP 70 +#define IDD_FILTER 71 +#define IDD_HINTC_EX 72 +#define IDD_SELECT_PROFILE 73 +#define IDD_CAMPAIGN_SELECT 74 +#define IDD_PROFILE 75 +#define IDD_PROFILE_NAME 76 +#define IDD_PROFILE_FACE 77 +#define IDD_PROFILE_VOICE 78 +#define IDD_PROFILE_CONTROLLER 79 +#define IDD_PROFILE_AUDIO 80 +#define IDD_PROFILE_VIDEO 81 +#define IDD_PROFILE_LIVE 82 +#define IDD_MP_TYPE 83 +#define IDD_MP_PASSCODE 84 +#define IDD_OPTIMATCH_FILTER 86 +#define IDD_QUICKMATCH 87 +#define IDD_FRIENDS 88 +#define IDD_FRIENDS_OPTIONS 89 +#define IDD_XWIZARD_TEMPLATE 90 +#define IDD_XWIZARD_INTEL 91 +#define IDD_XWIZARD_NAME 92 +#define IDD_XWIZARD_ISLAND 93 +#define IDD_XWIZARD_WEATHER 94 +#define IDD_XWIZARD_TIME 95 +#define IDD_XWIZARD_UNIT 96 +#define IDD_XWIZARD_MAP 97 +#define IDD_XWIZARD_UNIT_SELECT 98 +#define IDD_XWIZARD_UNIT_SELECT_CUSTOM 99 +#define IDD_XWIZARD_WAYPOINT 100 +#define IDD_DOWNLOAD_CONTENT 101 +#define IDD_DOWNLOAD_CONTENT_DETAILS 102 +#define IDD_XPLAYERS 103 +#define IDD_XPLAYERS_ACTIONS 104 +#define IDD_XPLAYERS_FEEDBACK 105 +#define IDD_GEAR 106 +#define IDD_EQUIP 555 +#define IDD_DOWNLOAD_CONTENT_INSTALL 108 +#define IDD_SERVER_SETTINGS 109 +#define IDD_SERVER_ADVANCED 110 +#define IDD_SERVER_SELECT_PLAYER 112 +#define IDD_DEDICATED_SERVER 114 +#define IDD_FRIEND_MISSIONS 115 +#define IDD_LIVE_STATS 116 +#define IDD_LIVE_STATS_BOARD 117 +#define IDD_NETWORK_CONDITIONS 118 +#define IDD_SEND_VOICE_MAIL 119 +#define IDD_RECEIVE_VOICE_MAIL 120 +#define IDD_SELECT_ISLAND_NEW 351 + +#define IDD_EDIT_OBJECT 121 +#define IDD_MISSION_LOAD 122 +#define IDD_MISSION_SAVE 123 + +#define IDD_EDIT_DIARY_RECORD 125 + +#define IDD_SERVER_VOTED 126 +#define IDD_DEDICATED_SERVER_SETTINGS 127 + +#define IDD_MISSION_EDITOR 128 + +#define IDD_DIARY 129 + +#define IDD_TEAM_SWITCH 130 + +#define IDD_CONFIGURE_ACTION 131 + +#define IDD_HOST_SETTINGS 132 + +#define IDD_MINIMAP 133 +#define IDD_OVERLAY_CREATE 134 +#define IDD_OVERLAY_LOAD 135 + +#define IDD_ESRB 136 + +#define IDD_MISSION_EDITOR_REALTIME 137 + +//TODO: Has to be checked by Pete! +#define IDD_EDIT_BRIEFING 138 +#define IDD_LIVE 139 + +#define IDD_LASE 141 + +#define IDD_LAYER_LOAD 142 + +#define IDD_CONTROLS 143 +#define IDD_INTERRUPT_REVERT 144 + +#define IDD_PERFORMANCE 145 +#define IDD_XWIZARD_PARAMS 146 +#define IDD_XWIZARD_PARAMETER 147 + +#define IDD_CONFIGURE_JOYSTICKS 148 +#define IDD_CAPTURE 149 +#define IDD_CUSTOMIZE_CONTROLLER 150 +#define IDD_GAMEOPTIONS 151 + +//new editor dialog +#define IDD_ARCADE_MODULES 153 +#define IDD_SELECT_SAVE 154 +#define IDD_DSINTERFACE 155 +#define IDD_ADDON_ACTIONS 156 + +// PhysX debug window +#define IDD_PHYSX_DEBUG 157 + +// mod launcher dialog +#define IDD_MOD_LAUNCHER 157 +#define IDD_NEW_MOD 158 + +// joystick schemes mapping dialog +#define IDD_JOYSTICK_SCHEMES 159 + +//AV Terminal dialog - MUF +#define IDD_AV_TERMINAL 160 +//Field Manual +#define IDD_FIELD_MANUAL 162 +//Dialogue for controls scheme selection +#define IDD_CONTROLS_SCHEME 163 +//Dialogue for choosing layout of mission editor. NOTE: 161-163 are already in use, see A3\Ui_f\hpp\defineResincl.inc +#define IDD_EDITOR_LAYOUT 164 +//Dialogue for publishing mission on Steam. +#define IDD_PUBLISH_MISSION 165 +//Dialogue for selecting tags for mission on Steam. +#define IDD_PUBLISH_MISSION_TAGS 166 +//Dialogue for selecting file from the hard drive +#define IDD_FILE_SELECT_DIALOG 167 +//Idd reserved for debriefing 168 +#define IDD_DLC_VEHICLEMSGBOX 169 +#define IDD_DLC_PURCHASENOTIFICATION 170 +#define IDD_BOOTCAMPMSGBOX 171 +#define IDD_COMMUNITY_GUIDE 172 +#define IDD_SLING_LOAD_ASSISTANT 173 +#define IDD_DLC_CONTENTBROWSER 174 +#define IDD_MP_SCORE_TABLE 175 +#define IDD_CAMPAIGN_MP 176 +#define IDD_MP_QUICK_PLAY 177 +#define IDD_MP_SERVER_SEARCH 178 +#define IDD_MP_SERVER_FOUND 179 +#define IDD_KEYMAPMSGBOX 180 + +// MessageBoxes +#define IDD_MSG_DELETEPLAYER 200 +#define IDD_MSG_DELETEGAME 201 +#define IDD_MSG_CLEARTEMPLATE 202 +#define IDD_MSG_EXITTEMPLATE 203 +#define IDD_MSG_LAUNCHGAME 204 // ADDED IN PATCH 1.04 + +#define IDD_MSG_NEWACCOUNT 205 + +#define IDD_MSG_FRIENDS_REMOVE 206 +#define IDD_MSG_FRIENDS_BLOCK 207 +#define IDD_MSG_FRIENDS_INVITE 208 + +#define IDD_MSG_DELETEMISSION 209 + +#define IDD_MSG_XONLINE_CONNECTION_FAILED 210 +#define IDD_MSG_XONLINE_UPDATE_REQUIRED 211 +#define IDD_MSG_XONLINE_SERVER_BUSY 212 +#define IDD_MSG_XONLINE_REQUIRED_MSG 213 +#define IDD_MSG_XONLINE_RECOMMENDED_MSG 214 +#define IDD_MSG_XONLINE_INVALID_USER 215 +#define IDD_MSG_XONLINE_WRONG_PASSCODE 216 + +#define IDD_MSG_CANCEL_SUBSCRIPTION 217 +#define IDD_MSG_SUBSCRIBE 218 +#define IDD_MSG_PURCHASE 219 +#define IDD_MSG_INSTALL_ABORT 220 +#define IDD_MSG_INSTALL_RESULT 221 + +#define IDD_MSG_DECLINE_INVITATION 222 +#define IDD_MSG_REVOKE_INVITATION 223 +#define IDD_MSG_BLOCK_REQUEST 224 +#define IDD_MSG_DECLINE_REQUEST 225 +#define IDD_MSG_CANCEL_REQUEST 226 +#define IDD_MSG_KICK_OFF 227 +#define IDD_MSG_TERMINATE_SESSION 228 +#define IDD_MSG_NETWORK_CONDITIONS 229 + +#define IDD_MSG_STATS_NOT_UPLOADED 230 + +#define IDD_MSG_LOAD_FAILED 231 +#define IDD_MSG_DELETESAVE 232 + +#define IDD_MSG_DISK_FULL 233 + +#define IDD_MSG_RESTART_MISSION 234 +#define IDD_MSG_SAVE_MISSION 235 +#define IDD_MSG_SIGN_OUT 236 +#define IDD_MSG_LOAD_MISSION 237 +#define IDD_MSG_NEGATIVE_FEEDBACK 238 +#define IDD_MSG_PENDING_INVITATION 239 +#define IDD_MSG_HOST_SESSION 240 +#define IDD_MSG_ROLES_LOST 241 +#define IDD_MSG_ACCEPT_INVITATION 242 +#define IDD_MSG_MP_PLAYER_COUNT 243 +#define IDD_MSG_GAME_JOIN 244 +#define IDD_MSG_EDITOR_WIZARD_NONAME_MISSION 245 + +#define IDD_MSG_RESTART_NEEDED 246 + +// new editor +#define IDD_MSG_COMMIT_OVERLAY 247 +#define IDD_MSG_CLEAR_OVERLAY 248 +#define IDD_MSG_LOAD_OVERLAY 249 +#define IDD_MSG_EXIT_OVERLAY 250 +#define IDD_MSG_CREATE_OVERLAY 251 +#define IDD_MSG_CLOSE_OVERLAY 252 +#define IDD_MSG_LOAD_AAR 253 +#define IDD_MSG_CLEAR_MISSION 254 +#define IDD_MSG_RETRY_MISSION 255 +#define IDD_MSG_DELETE_DIARY_RECORD 256 + +// XBOX 360 profile and save messages +#define IDD_MSG_XBOX_NO_SIGN_IN 257 +#define IDD_MSG_XBOX_NO_STORAGE 258 +#define IDD_MSG_XBOX_STORAGE_CHANGED 259 +#define IDD_MSG_XBOX_SAVE_FAILED 260 +#define IDD_MSG_XBOX_NO_STORAGE_ON_INVITE 261 + +#define IDD_OPTIONS_AUDIO_ADJUST_MIC 262 + +//MUF-MessageBox for restarting mission editor during layout change +#define IDD_MSG_RESTART_EDITOR 263 + +#define IDD_PROGRESS_MESSAGE 264 + +//Message box for confirming deleting published mission +#define IDD_MSG_DELETE_STEAM_MISSION 265 +//Message box for confirming updating published mission +#define IDD_MSG_UPDATE_STEAM_MISSION 266 +//Message box for confirming saving current mission before the publish dialog is opened +#define IDD_MSG_SAVE_MISSION_BEFORE_PUBLISH 267 +//Message box for asking user to agree with Battleye licence. +#define IDD_MSG_BATTLEYE_LICENCE 268 +#define IDD_MSG_UPNP_ACTIVATION 269 +//#define IDD_MSG_ACCOUNT_LOGIN_GUIDE 270 - Reserved + +// InGameUI +#define IDD_UNITINFO 300 +#define IDD_HINT 301 +#define IDD_TASKHINT 302 +#define IDD_STANCEINFO 303 +#define IDD_AVCAMERA 304 +#define IDD_STAMINA_BAR 305 + +//Custom Info +#define IDD_CUSTOMINFO 310 +#define IDD_CUSTOMINFO_MINIMAP 311 +#define IDD_CUSTOMINFO_SLA 312 +#define IDD_CUSTOMINFO_CREW 313 +#define IDD_CUSTOMINFO_SENS 314 +#define IDD_CUSTOMINFO_FEEDUAV 315 +#define IDD_CUSTOMINFO_FEEDDRIVER 316 +#define IDD_CUSTOMINFO_FEEDPRIMARYGUNNER 317 +#define IDD_CUSTOMINFO_FEEDCOMMANDER 318 +#define IDD_CUSTOMINFO_FEEDMISSILE 319 +#define IDD_CUSTOMINFO_MINEDETECT 320 + + +// Futura ui +#define IDD_FUTURAGEAR 602 +// FUTURA GEAR controls +#define IDC_FG_PRIMARY 610 +#define IDC_FG_SECONDARY 611 +#define IDC_FG_HANDGUN 612 + +// prefix 620 means slot items +//--- +#define IDC_FG_MAP 6211 +#define IDC_FG_COMPASS 6212 +#define IDC_FG_WATCH 6213 +#define IDC_FG_RADIO 6214 +#define IDC_FG_GPS 6215 + +#define IDC_FG_GOGGLES 6216 +#define IDC_FG_HMD 6217 +#define IDC_FG_BINOC 6238 + +#define IDC_FG_BACKPACK2 6239 +#define IDC_FG_HEADGEAR 6240 + +// prefix 630 means slot container items(uniform, vest, backpack) +#define IDC_FG_UNIFORM_SLOT 6301 +#define IDC_FG_VEST_SLOT 6302 +#define IDC_FG_BACKPACK_SLOT 6303 +/// containers load +#define IDC_FG_UNIFORM_LOAD 6304 +#define IDC_FG_VEST_LOAD 6305 +#define IDC_FG_BACKPACK_LOAD 6306 +#define IDC_FG_GROUND_LOAD 6307 +#define IDC_FG_TOTAL_LOAD 6308 +//--- +#define IDC_FG_MAGAZINES 618 +// primary +#define IDC_FG_PW_MUZZLE 620 +#define IDC_FG_PW_OPTICS 621 +#define IDC_FG_PW_FLASHLIGHT 622 +#define IDC_FG_PW_MAGAZINE 623 +// secondary +#define IDC_FG_SW_MUZZLE 624 +#define IDC_FG_SW_OPTICS 625 +#define IDC_FG_SW_FLASHLIGHT 626 +#define IDC_FG_SW_MAGAZINE 627 +// handgun +#define IDC_FG_HG_MUZZLE 628 +#define IDC_FG_HG_OPTICS 629 +#define IDC_FG_HG_FLASHLIGHT 630 +#define IDC_FG_HG_MAGAZINE 631 + +#define IDC_FG_GROUND_ITEMS 632 +#define IDC_FG_CHOSEN_CONTAINER 640 +#define IDC_FG_PW_UNDERBARREL 641 +#define IDC_FG_SW_UNDERBARREL 642 +#define IDC_FG_HG_UNDERBARREL 643 +#define IDC_FG_PW_MAGAZINE_GL 644 +// #define IDC_FG_BACKPACK_ITEMS 633 +// #define IDC_FG_ITEMS 619 + +// new inventory + +// filter +#define IDC_FG_GROUND_FILTER 6554 + +// images which will painted over containers during DnD state +#define IDC_FG_GROUND_MARKER 6385 +#define IDC_FG_CONTAINER_MARKER 6325 +#define IDC_FG_CHOSEN_MARKER 6405 + +#define IDC_FG_VEST_CONTAINER 638 +#define IDC_FG_UNIFORM_CONTAINER 633 +#define IDC_FG_BACKPACK_CONTAINER 619 + +#define IDC_FG_VEST_TAB 6381 +#define IDC_FG_VEST_TEXT 6382 +#define IDC_FG_UNIFORM_TAB 6331 +#define IDC_FG_UNIFORM_TEXT 6332 +#define IDC_FG_BACKPACK_TAB 6191 +#define IDC_FG_BACKPACK_TEXT 6192 + +#define IDC_FG_CHOSEN_TAB 6401 +#define IDC_FG_CHOSEN_TEXT 6402 +#define IDC_FG_GROUND_TAB 6321 +#define IDC_FG_GROUND_TEXT 6322 +#define IDC_DLC_TEMPLATE_LOGO 100 +#define IDC_DLC_TEMPLATE_BACKGROUND 101 +/////////////// + +/// weight info +#define IDC_FG_GROUND_WEIGHT 634 +#define IDC_FG_BACKPACK_WEIGHT 635 +#define IDC_FG_ITEMS_WEIGHT 636 + +/// player info +#define IDC_FG_TOTAL_WEIGHT 637 +////// + +// Arcade Sites +#define IDD_ARCADE_SITE 700 + +#define IDC_AS_AZIMUT 701 +#define IDC_AS_AZIMUT_PICTURE 702 + +// ---- combos +#define IDC_AS_SIDE 703 +#define IDC_AS_FACTION 704 +#define IDC_AS_CLASS 705 +#define IDC_AS_SITETYPE 706 +#define IDC_AS_REPAIRABLE 707 +#define IDC_AS_FASTTRAVEL 708 +#define IDC_AS_STORAGE 709 +// ---- flags +#define IDC_AS_FLGEQUIP 710 +#define IDC_AS_FLGFOOD 711 +#define IDC_AS_FLGARMORED 712 +#define IDC_AS_FLGFUEL 713 +#define IDC_AS_FLGWEAPON 714 +// ---- strings +#define IDC_AS_NAME 715 +#define IDC_AS_DESC 716 +#define IDC_AS_INIT 717 +#define IDC_AS_CONDITION 718 +#define IDC_AS_RADIUS 719 +// ---- sliders +#define IDC_AS_HEALTH 720 +#define IDC_AS_MOOD 721 +#define IDC_AS_PRESENCE 722 + +#define IDC_AS_ARGUMENTS 733 +//////////////////////////////////////// + +// Virtual keyboard +#define IDC_VK_SHIFT 1001 +#define IDC_VK_CAPSLOCK 1002 +#define IDC_VK_SYMBOLS 1003 +#define IDC_VK_ACCENTS 1004 +#define IDC_VK_BACKSPACE 1005 +#define IDC_VK_LEFT 1006 +#define IDC_VK_RIGHT 1007 +#define IDC_VK_BASE 1010 + +// Main display controls +#define IDC_MAIN_GAME 101 +#define IDC_MAIN_OPTIONS 102 +#define IDC_MAIN_TRAINING 103 +#define IDC_MAIN_CUSTOM 104 +#define IDC_MAIN_MULTIPLAYER 105 +#define IDC_MAIN_QUIT 106 +#define IDC_MAIN_CREDITS 107 +#define IDC_MAIN_ARCADE 108 +#define IDC_MAIN_PLAYER 109 +#define IDC_MAIN_RANK 110 +#define IDC_MAIN_ISLAND 111 +#define IDC_MAIN_DATE 112 +#define IDC_MAIN_MISSION 113 +#define IDC_MAIN_CONTINUE 114 +#define IDC_MAIN_EDITOR 115 +#define IDC_MAIN_BOOK 116 +#define IDC_MAIN_SINGLE 117 +#define IDC_MAIN_VERSION 118 +#define IDC_MAIN_SINGLE_PROFILES 119 +#define IDC_MAIN_CAMPAIGN_PROFILES 120 +#define IDC_MAIN_MP_PROFILES 121 +#define IDC_MAIN_SETTINGS_PROFILES 122 +#define IDC_MAIN_SYSTEM_LINK 123 +#define IDC_MAIN_CUSTOM_PROFILES 124 +#define IDC_MAIN_SIGN_IN_STATUS 125 +#define IDC_MAIN_PLAYER_LABEL 126 +#define IDC_MAIN_PLAYER_NAME 127 +#define IDC_MAIN_CONTROLS 128 +#define IDC_MAIN_PLAYER_ID 129 +#define IDC_MAIN_PLAYER_COLOR 130 +#define IDC_MAIN_SERVICE_ID_LABEL 131 +#define IDC_MAIN_NICKNAME_LABEL 132 +#define IDC_MAIN_NICKNAME_BG 133 +#define IDC_MAIN_LOAD 134 +#define IDC_MAIN_SAVE 135 +#define IDC_MAIN_AAR 136 +#define IDC_MAIN_ACHIEVEMENTS 137 +#define IDC_MAIN_SINGLEPLAYER 138 +#define IDC_MAIN_MOD_LIST 139 +#define IDC_MAIN_MOD_LAUNCHER 140 +#define IDC_MAIN_MOD_ICONS 141 +#define IDC_SP_EDITOR 142 +#define IDC_MAIN_FIELD_MANUAL 143 +#define IDC_MAIN_DLC_ICONS 144 +#define IDC_MAIN_DLC_OWNED_ICONS 145 +#define IDC_MAIN_DLC_ICONS_BACK 146 +#define IDC_MAIN_MOD_ICONS_BACK 147 +#define IDC_MAIN_DLC_OWNED_ICONS_BACK 148 +#define IDC_MAIN_BOOTCAMP_CAMPAIGN 149 +#define IDC_MAIN_BOOTCAMP_SHOWCASES 150 +#define IDC_MAIN_BOOTCAMP_CHALLENGES 151 +#define IDC_MAIN_BOOTCAMP_VRTRAINING 152 +#define IDC_MAIN_QUICKPLAY 154 +#define IDC_MAIN_UNIT 155 + +#define IDC_MAIN_CARDAS_CUDL 199 // muj vlastni cudl + +#define IDC_MAIN_VIDEOCONTROL 3335 + +#define IDC_MAIN_TAB_LOGIN 9001 +#define IDC_MAIN_TAB_LIBRARY 9002 +#define IDC_MAIN_TAB_SINGLE 9003 +#define IDC_MAIN_TAB_MULTIPLAYER 9004 +#define IDC_MAIN_TAB_OPTIONS 9005 +#define IDC_MAIN_TAB_CONTROLS 9006 +#define IDC_MAIN_TAB_EDITOR 9007 +#define IDC_MAIN_TAB_QUIT 9008 +#define IDC_MAIN_TAB_AAR 9011 + +#define IDC_BUILD_VERSION 9009 +#define IDC_BUILD_DATE 9010 + +// Single player display controls +#define IDC_SP_TRAINING 101 +//#define IDC_SP_EDITOR 102 +#define IDC_SP_MISSION 103 +#define IDC_SP_CAMPAIGN 104 + +// Select profile display controls +#define IDC_PROFILES_LIST 101 +#define IDC_PROFILES_HEAD 102 +#define IDC_PROFILES_TITLE 103 +#define IDC_PROFILES_CONTROLLER 104 +#define IDC_PROFILES_DIFFICULTY 105 +#define IDC_PROFILES_MISSION 106 +#define IDC_PROFILES_LIVE 107 +#define IDC_PROFILES_MISSION_TEXT 108 +#define IDC_PROFILES_SIGN_IN_STATUS 109 +#define IDC_PROFILES_EDIT 110 +#define IDC_PROFILES_DELETE 111 + +// Edit profile display controls +#define IDC_PROFILE_NAME 101 +#define IDC_PROFILE_FACE 102 +#define IDC_PROFILE_VOICE 103 +#define IDC_PROFILE_CONTROLLER 104 +#define IDC_PROFILE_AUDIO 105 +#define IDC_PROFILE_VIDEO 106 +#define IDC_PROFILE_HEAD 108 +#define IDC_PROFILE_SUM_NAME 109 +#define IDC_PROFILE_SUM_CONTROLLER 110 +#define IDC_PROFILE_SUM_LIVE 111 +#define IDC_PROFILE_VOICE_MASK 112 +#define IDC_PROFILE_SIGN_IN_STATUS 113 +#define IDC_PROFILE_CREDITS 114 +#define IDC_PROFILE_STORAGE_DEVICE 115 + +// Edit profile name display controls +#define IDC_PROFILE_NAME_PREVIEW 101 + +// Edit profile face +#define IDC_PROF_FACE_FACE 101 +#define IDC_PROF_FACE_GLASSES 102 +#define IDC_PROF_FACE_HEAD 103 + +// Edit profile voice +#define IDC_PROF_VOICE_SPEAKER 101 +#define IDC_PROF_VOICE_PITCH_TITLE 102 +#define IDC_PROF_VOICE_PITCH_VALUE 103 +#define IDC_PROF_VOICE_PITCH 104 +#define IDC_PROF_VOICE_MASK 105 +#define IDC_PROF_VOICE_THROUGH_SPEAKERS 106 +#define IDC_PROF_VOICE_HEAD 107 +#define IDC_PROF_VOICE_DEFAULT 108 + +// Edit profile controller +#define IDC_PROF_CONTR_VEHICLE 101 +#define IDC_PROF_CONTR_TYPE 102 +#define IDC_PROF_CONTR_IMAGE 103 +#define IDC_PROF_CONTR_SCHEME 104 +#define IDC_PROF_CONTR_SENSITIVITY 105 +#define IDC_PROF_CONTR_A 200 +#define IDC_PROF_CONTR_B 201 +#define IDC_PROF_CONTR_Y 202 +#define IDC_PROF_CONTR_X 203 +#define IDC_PROF_CONTR_WHITE 204 +#define IDC_PROF_CONTR_BLACK 205 +#define IDC_PROF_CONTR_LEFT 206 +#define IDC_PROF_CONTR_RIGHT 207 +#define IDC_PROF_CONTR_UP 208 +#define IDC_PROF_CONTR_DOWN 209 +#define IDC_PROF_CONTR_BACK 210 +#define IDC_PROF_CONTR_START 211 +#define IDC_PROF_CONTR_LEFT_THUMB 212 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_X 213 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_Y 214 +#define IDC_PROF_CONTR_RIGHT_THUMB 215 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_X 216 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_Y 217 +#define IDC_PROF_CONTR_LEFT_TRIGGER 218 +#define IDC_PROF_CONTR_RIGHT_TRIGGER 219 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE 220 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE 221 +#define IDC_PROF_CONTR_DPAD 222 +#define IDC_PROF_CONTR_NEXT_SCHEME 223 +#define IDC_PROF_CONTR_PREV_SCHEME 224 +#define IDC_PROF_CONTR_Y_AXIS 225 +#define IDC_PROF_CONTR_VIBRATIONS 226 + +// Controller buttons +// #define IDC_CONTROLLER_BUTTONS 101 + +// Edit profile audio options +#define IDC_PROF_AUDIO_MUSIC_TITLE 101 +#define IDC_PROF_AUDIO_MUSIC_VALUE 102 +#define IDC_PROF_AUDIO_MUSIC 103 +#define IDC_PROF_AUDIO_RADIO_TITLE 104 +#define IDC_PROF_AUDIO_RADIO_VALUE 105 +#define IDC_PROF_AUDIO_RADIO 106 +#define IDC_PROF_AUDIO_EFFECT_TITLE 107 +#define IDC_PROF_AUDIO_EFFECT_VALUE 108 +#define IDC_PROF_AUDIO_EFFECT 109 +#define IDC_PROF_AUDIO_DEFAULT 110 + +// Edit profile video options +#define IDC_PROF_VIDEO_BRIGHT 101 +#define IDC_PROF_VIDEO_BRIGHT_TITLE 102 +#define IDC_PROF_VIDEO_BRIGHT_VALUE 103 +#define IDC_PROF_VIDEO_GAMMA 104 +#define IDC_PROF_VIDEO_GAMMA_TITLE 105 +#define IDC_PROF_VIDEO_GAMMA_VALUE 106 +#define IDC_PROF_VIDEO_SUBTITLES 107 +#define IDC_PROF_VIDEO_RADIO 108 +#define IDC_PROF_VIDEO_DEFAULT 109 + +// Select profile an Xbox live account display controls +#define IDC_PROFILE_LIVE_ACCOUNTS 101 +#define IDC_PROFILE_LIVE_CREATE 102 + +// Select difficulty dialog +#define IDC_DIFF_LIST 108 +#define IDC_DIFF_DESC 102 + +// Single mission display controls +#define IDC_SINGLE_MISSION 101 +#define IDC_SINGLE_OVERVIEW 102 +#define IDC_SINGLE_MISSION_PAD 103 +#define IDC_SINGLE_DIFF 104 +#define IDC_SINGLE_LOAD 105 +#define IDC_SINGLE_TITLE 106 +#define IDC_SINGLE_DELETE 107 +#define IDC_SINGLE_COPY 108 +#define IDC_SINGLE_EDIT 109 +#define IDC_SINGLE_NAME 110 +#define IDC_SINGLE_AUTHOR 111 +#define IDC_SINGLE_PICTURE 112 +#define IDC_SINGLE_DESCRIPTION 113 +#define IDC_SINGLE_LOADING_PICTURE 114 +#define IDC_SINGLE_SHOW_MISSION_WORKSHOP 115 +#define IDC_SINGLE_SHOW_GAME_WORKSHOP 116 +#define IDC_SINGLE_SHOW_GAME_OR_MISSION_WORKSHOP 117 +#define IDC_SINGLE_MISSION_SORT_COMBO 118 +#define IDC_SINGLE_MISSION_SORT_ORDER 119 +#define IDC_SINGLE_MISSION_BUY_DLC 120 +#define IDC_SINGLE_MISSION_DLCSTRIPE 121 +#define IDC_SINGLE_MISSION_DLCICON 122 + +// Xbox style mission wizard +#define IDC_XWIZ_TEMPLATE 101 +#define IDC_XWIZ_TEMPLATE_OVERVIEW 102 + +#define IDC_XWIZ_NAME 101 +#define IDC_XWIZ_ISLAND 102 +#define IDC_XWIZ_WEATHER 103 +#define IDC_XWIZ_TIME 104 +#define IDC_XWIZ_SUM_NAME 105 +#define IDC_XWIZ_SUM_TIME 106 +#define IDC_XWIZ_SUM_TEMPLATE 107 +#define IDC_XWIZ_SUM_ISLAND 108 +#define IDC_XWIZ_SUM_WEATHER 109 +#define IDC_XWIZ_SUM_WEATHER_FORECAST 110 +#define IDC_XWIZ_UNIT 111 +#define IDC_XWIZ_MAP 112 +#define IDC_XWIZ_SUM_DATE 113 +#define IDC_XWIZ_PARAM 114 +#define IDC_XWIZ_SAVE 115 + +#define IDC_XWIZ_UNITS 101 +#define IDC_XWIZ_UNITS_OVERVIEW 102 + +#define IDC_XWIZ_PARAMS 101 +#define IDC_XWIZ_PARAMS_TITLES 102 +#define IDC_XWIZ_PARAMS_VALUES 103 +#define IDC_EDIT 104 +#define IDD_XWIZARD_PARAMETER_TITLE 105 + +#define IDC_XWIZ_UNIT_SELECT 101 +#define IDC_XWIZ_UNIT_SELECT_TITLE 102 + +#define IDC_XWIZ_UNIT_CLASS 101 +#define IDC_XWIZ_UNIT_TYPE 102 +#define IDC_XWIZ_UNIT_COUNT 103 +#define IDC_XWIZ_UNIT_SIDE 104 +#define IDC_XWIZ_UNIT_SELECT_CUSTOM_TITLE 105 + +#define IDC_XWIZ_WP_TYPE 101 +#define IDC_XWIZ_WP_BEHAVIOUR 102 +#define IDC_XWIZ_WP_FORMATION 103 +#define IDC_XWIZ_WP_COMBAT_MODE 104 + +#define IDC_XWIZ_ISLAND_LIST 101 +#define IDC_XWIZ_ISLAND_MAP 102 +#define IDC_XWIZ_ISLAND_SHOTS 103 + +#define IDC_XWIZ_WEATHER_TITLE 101 +#define IDC_XWIZ_WEATHER_VALUE 102 +#define IDC_XWIZ_WEATHER_FORECAST_TITLE 103 +#define IDC_XWIZ_WEATHER_FORECAST_VALUE 104 +#define IDC_XWIZ_FOG_TITLE 105 +#define IDC_XWIZ_FOG_VALUE 106 +#define IDC_XWIZ_FOG_FORECAST_TITLE 107 +#define IDC_XWIZ_FOG_FORECAST_VALUE 108 +#define IDC_XWIZ_VIEW_DISTANCE_TITLE 109 +#define IDC_XWIZ_VIEW_DISTANCE_VALUE 110 + +#define IDC_XWIZ_TIME_HOUR 101 +#define IDC_XWIZ_TIME_MINUTE 102 +#define IDC_XWIZ_TIME_DAY 103 +#define IDC_XWIZ_TIME_MONTH 104 +#define IDC_XWIZ_TIME_YEAR 105 + +#define IDC_XWIZ_MAP_POINTS 101 +#define IDC_XWIZ_MAP_DELETE 102 +#define IDC_XWIZ_MAP_EDIT 103 +#define IDC_XWIZ_MAP_INSERT_WP 104 +#define IDC_XWIZ_MAP_NOTEPAD 105 +#define IDC_XWIZ_MAP_MOVE 106 + +// Select campaign display +#define IDC_CAMPAIGNS_LIST 101 +#define IDC_CAMPAIGNS_CAMPAIGN 102 +#define IDC_CAMPAIGNS_DESCRIPTION 103 + +// Campaign display +#define IDC_CAMPAIGN_HISTORY 101 +#define IDC_CAMPAIGN_REPLAY 102 +#define IDC_CAMPAIGN_DIFF 103 +#define IDC_CAMPAIGN_NAME 104 +#define IDC_CAMPAIGN_AUTHOR 105 +#define IDC_CAMPAIGN_PICTURE 106 +#define IDC_CAMPAIGN_DESCRIPTION 107 +#define IDC_CAMPAIGN_TEXT_ESTDEPLOY 108 +#define IDC_CAMPAIGN_RELEASEDATE 109 +#define IDC_CAMPAIGN_BUY_DLC 110 +#define IDC_CAMPAIGN_DLCSTRIPE 111 +#define IDC_CAMPAIGN_DLCICON 112 + +// MP campaign display +#define IDC_CAMPAIGN_MP_LIST 101 +#define IDC_CAMPAIGN_MP_TITLE 102 +#define IDC_CAMPAIGN_MP_NAME 103 +#define IDC_CAMPAIGN_MP_AUTHOR 104 +#define IDC_CAMPAIGN_MP_PICTURE 105 +#define IDC_CAMPAIGN_MP_DESCRIPTION 106 +#define IDC_CAMPAIGN_MP_PLAY 107 +#define IDC_CAMPAIGN_MP_HOST 108 +#define IDC_CAMPAIGN_MP_JOIN 109 +#define IDC_CAMPAIGN_MP_BUY_DLC 110 + +// Revert display +#define IDC_REVERT_BOOK 101 +#define IDC_REVERT_TITLE 102 +#define IDC_REVERT_QUESTION 103 + +// Game display controls +#define IDC_GAME_SELECT 301 +#define IDC_SIDE_NAME 101 + +// Options display controls +#define IDC_OPTIONS_VIDEO 301 +#define IDC_OPTIONS_AUDIO 302 +#define IDC_OPTIONS_CONFIGURE 303 +#define IDC_OPTIONS_DIFFICULTY 304 +#define IDC_OPTIONS_NOTEBOOK 305 +#define IDC_OPTIONS_CREDITS 306 +#define IDC_OPTIONS_GAMEOPTIONS 307 + +#define IDC_OPTIONS_OBJECT_VISIBILITY_VALUE 308 +#define IDC_OPTIONS_OBJECT_VISIBILITY_SLIDER 309 +#define IDC_OPTIONS_VISIBILITY_TEXT 310 +#define IDC_OPTIONS_SHADOW_VISIBILITY_VALUE 311 +#define IDC_OPTIONS_SHADOW_VISIBILITY_SLIDER 312 +#define IDC_OPTIONS_SHADOW_VISIBILIT_TEXT 313 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_VALUE 314 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_SLIDER 315 + +#define IDC_OPTIONS_PIP_VALUE 334 +#define IDC_OPTIONS_SW_VALUE 335 +#define IDC_OPTIONS_FXAA_VALUE 336 +#define IDC_OPTIONS_WATER_SS_REFLECTIONS_VALUE 337 + +#define IDC_OPTIONS_QUALITY_VALUE 101 +#define IDC_OPTIONS_QUALITY_SLIDER 102 +#define IDC_OPTIONS_VISIBILITY_VALUE 103 +#define IDC_OPTIONS_VISIBILITY_SLIDER 104 + +#define IDC_OPTIONS_DRAWDISTANCE_VALUE 1336 +#define IDC_OPTIONS_DRAWDISTANCE_SLIDER 1337 + +#define IDC_OPTIONS_RATE_VALUE 105 +#define IDC_OPTIONS_RATE_SLIDER 106 +#define IDC_OPTIONS_TEXTURES_VALUE 107 +#define IDC_OPTIONS_TEXTURES_SLIDER 108 +#define IDC_OPTIONS_GAMMA_VALUE 109 +#define IDC_OPTIONS_GAMMA_SLIDER 110 +#define IDC_OPTIONS_BRIGHT_VALUE 111 +#define IDC_OPTIONS_BRIGHT_SLIDER 112 +#define IDC_OPTIONS_RESOLUTION 113 +#define IDC_OPTIONS_DISPLAY_MODE 1131 +#define IDC_OPTIONS_REFRESH 114 +#define IDC_OPTIONS_OBJSHADOWS 115 +//#define IDC_OPTIONS_VEHSHADOWS 116 +//#define IDC_OPTIONS_CLOUDLETS 117 +//#define IDC_OPTIONS_HWTL 118 +#define IDC_OPTIONS_BLOOD 119 +//#define IDC_OPTIONS_MULTITEXTURING 120 +#define IDC_OPTIONS_WBUFFER 121 +#define IDC_OPTIONS_BLOOD_TEXT 122 +#define IDC_OPTIONS_TERRAIN 123 +#define IDC_OPTIONS_LIFESTATE 199 +#define IDC_OPTIONS_TUTORIAL_HINTS 140 + +#define IDC_OBJECTS_DETAIL 124 +#define IDC_TEXTURE_DETAIL 125 +#define IDC_QUALITY_PREFERENCE 126 +#define IDC_SHADING_DETAIL 127 +#define IDC_SHADOW_DETAIL 128 + +#define IDC_OPTIONS_VIDEO_DEFAULT 129 +#define IDC_OPTIONS_VIDEO_AUTODETECT 1291 + +#define IDC_ANISO_DETAIL 130 +#define IDC_HDR_DETAIL 131 +#define IDC_POSTPROCESS_EFFECTS 132 +#define IDC_FSAA_DETAIL 133 +#define IDC_ASPECT_RATIO 134 +#define IDC_ATOC_DETAIL 1300 +#define IDC_PPAA_DETAIL 1301 + +#define IDC_OPTIONS_PP_SSAO 1310 +#define IDC_OPTIONS_PP_BLOOM_SLIDER 1311 +#define IDC_OPTIONS_PP_BLOOM_VALUE 1312 +#define IDC_OPTIONS_PP_ROTBLUR_SLIDER 1313 +#define IDC_OPTIONS_PP_ROTBLUR_VALUE 1314 +#define IDC_OPTIONS_PP_RADIALBLUR_SLIDER 1315 +#define IDC_OPTIONS_PP_RADIALBLUR_VALUE 1316 +#define IDC_OPTIONS_PP_DOF_SLIDER 1317 +#define IDC_OPTIONS_PP_DOF_VALUE 1318 +#define IDC_OPTIONS_PP_CAUSTICS 1319 +#define IDC_OPTIONS_PP_SHARPEN_SLIDER 1320 +#define IDC_OPTIONS_PP_SHARPEN_VALUE 1321 +#define IDC_OPTIONS_PP_COLOR_CORRECTIONS 1322 +#define IDC_OPTIONS_PP_BRIGHTNESS_SLIDER 1323 +#define IDC_OPTIONS_PP_BRIGHTNESS_VALUE 1324 +#define IDC_OPTIONS_PP_CONTRAST_SLIDER 1325 +#define IDC_OPTIONS_PP_CONTRAST_VALUE 1326 +#define IDC_OPTIONS_PP_SATURATION_SLIDER 1327 +#define IDC_OPTIONS_PP_SATURATION_VALUE 1328 + +#define IDC_OPTIONS_VIDEO_FPS_TEXT 1400 +#define IDC_OPTIONS_VIDEO_PERF_WARNING 1401 + + +#define IDC_OPTIONS_LANGUAGE 135 + +#define IDC_OPTIONS_IGUISIZE 136 +#define IDC_OPTIONS_IGUISIZE_LABEL 1014 +#define IDC_OPTIONS_IGUISIZE_TEXT 137 +#define IDC_OPTIONS_HEADBOB 138 + +#define IDC_VRAM_VALUE 139 + +#define IDC_VSYNC_VALUE 140 +#define IDC_OPTIONS_IMPERIALUNITS 141 +#define IDC_OPTIONS_VEHICLEFREELOOK 142 +#define IDC_OPTIONS_STREAM_FRIENDLY 143 +#define IDC_OPTIONS_ADAPTIVE_CROSSHAIR 144 +#define IDC_OPTIONS_INSTRUCTOR_FIGURE 145 +#define IDC_OPTIONS_ENABLE_RTD 146 +#define IDC_OPTIONS_ALLOW_FULL_RTD_HUD 147 +#define IDC_OPTIONS_ALLOW_ROUGH_LANDING_RTD 148 +#define IDC_OPTIONS_WIND_INFLUENCE_DYN_RTD 149 +#define IDC_OPTIONS_AUTO_TRIM_RTD 150 +#define IDC_OPTIONS_STRESS_DAMAGE_RTD 151 + +#define IDC_PARTICLES_EFFECTS 143 +#define IDC_OPTIONS_DYNAMIC_LIGHTS 144 + +#define IDC_OPTIONS_SLIDER_FILLRATE 1234 +#define IDC_OPTIONS_VALUE_FILLRATE 1236 + + +#define IDC_OPTIONS_MUSIC_VALUE 101 +#define IDC_OPTIONS_MUSIC_SLIDER 102 +#define IDC_OPTIONS_EFFECTS_VALUE 103 +#define IDC_OPTIONS_EFFECTS_SLIDER 104 +#define IDC_OPTIONS_VOICES_VALUE 105 +#define IDC_OPTIONS_VOICES_SLIDER 106 +#define IDC_OPTIONS_SAMPLING 107 +#define IDC_OPTIONS_HWACC 108 +#define IDC_OPTIONS_EAX 109 +#define IDC_OPTIONS_SINGLE_VOICE 110 +#define IDC_OPTIONS_AUDIO_DEFAULT 111 +#define IDC_OPTIONS_PLAYER_VOICE 112 +#define IDC_OPTIONS_VON_VALUE 113 +#define IDC_OPTIONS_VON_SLIDER 114 +#define IDC_OPTIONS_SAMPLES_VALUE 115 +#define IDC_OPTIONS_SAMPLES_SLIDER 116 +#define IDC_OPTIONS_MIC_SENS_SLIDER 117 +#define IDC_OPTIONS_MIC_ADJUST 118 + +// microphone adjustment +#define IDC_OPTIONS_MIC_PROGRESS_BAR 1001 +#define IDC_OPTIONS_MIC_PROGRESS 1002 + +#define IDC_OPTIONS_SUBTITLES 102 +#define IDC_OPTIONS_RADIO 103 + +#define IDC_DIFF_AI_LEVEL_TEXT 1510 +#define IDC_DIFF_AI_LEVEL 1511 +#define IDC_DIFF_AI_SKILL_LABEL 1512 +#define IDC_DIFF_AI_SKILL_SLIDER 1513 +#define IDC_DIFF_AI_SKILL_VALUE 1514 +#define IDC_DIFF_AI_PRECISION_LABEL 1515 +#define IDC_DIFF_AI_PRECISION_SLIDER 1516 +#define IDC_DIFF_AI_PRECISION_VALUE 1517 +#define IDC_DIFF_PICTURE 1518 +#define IDC_DIFF_DESCRIPTION 1519 +#define IDC_DIFF_OPTIONS_GROUP 1520 +#define IDC_DIFF_REDUCED_DAMAGE 1521 +#define IDC_DIFF_GROUP_INDICATORS 1522 +#define IDC_DIFF_FRIENDLY_TAG 1523 +#define IDC_DIFF_ENEMY_TAG 1524 +#define IDC_DIFF_MINES 1525 +#define IDC_DIFF_COMMANDS 1526 +#define IDC_DIFF_WAYPOINTS 1527 +#define IDC_DIFF_WEAPON_INFO 1528 +#define IDC_DIFF_STANCE_INDICATOR 1529 +#define IDC_DIFF_STAMINA_BAR 1530 +#define IDC_DIFF_CROSSHAIR 1531 +#define IDC_DIFF_VISION_AID 1532 +#define IDC_DIFF_THIRD_PERSON 1533 +#define IDC_DIFF_CAMERA_SHAKE 1534 +#define IDC_DIFF_SCORE_TABLE 1535 +#define IDC_DIFF_KILLED_BY 1536 +#define IDC_DIFF_VON_ID 1537 +#define IDC_DIFF_EXTENDED_MAP_FRIENDLY 1538 +#define IDC_DIFF_AUTO_REPORT 1539 +#define IDC_DIFF_MULTIPLE_SAVES 1540 +// #define IDC_DIFF_SQUAD_RADAR 1541 +#define IDC_DIFF_TACTICAL_PING 1542 +#define IDC_DIFF_EXTENDED_MAP_ENEMY 1543 +#define IDC_DIFF_EXTENDED_MAP_MINES 1544 +#define IDC_DIFF_MINIMAP_ALLOWED 1545 +#define IDC_DIFF_EXTENDED_MAP_PING 1546 + +// Configure display controls +#define IDC_CONFIG_DEFAULT 101 +#define IDC_CONFIG_KEYS 102 +#define IDC_CONFIG_XAXIS 103 +#define IDC_CONFIG_YAXIS 104 +#define IDC_CONFIG_YREVERSED 105 +#define IDC_CONFIG_JOYSTICK 106 +#define IDC_CONFIG_BUTTONS 107 +#define IDC_CONFIG_CONTROLS_PAGE 108 +#define IDC_CONFIG_FLOATING_ZONE 109 +#define IDC_CONFIG_MOUSE_FILTERING 110 +#define IDC_CONFIG_GEARBOX_MODE 112 +#define IDC_CONFIG_MOUSE_ACCELERATION 113 +#define IDC_CONFIG_KEY_PRESETS 114 + +// dialog for selecting default controls preset +#define IDC_CONFIG_DEFAULTCONTROLS_LIST 101 + +// Multiplayer type display controls +#define IDC_MP_TYPE_RANKED_MATCH 101 +#define IDC_MP_TYPE_PLAYER_MATCH 102 +#define IDC_MP_TYPE_SYSTEM_LINK 103 +#define IDC_MP_TYPE_FRIENDS 104 +#define IDC_MP_TYPE_DOWNLOAD 105 +#define IDC_MP_TYPE_INFO 106 +#define IDC_MP_TYPE_STATS 107 +#define IDC_MP_TYPE_SIGN_OUT 108 +#define IDC_MP_TYPE_DEDICATED_SERVER 109 +#define IDC_MP_TYPE_SERVER 110 +#define IDC_MP_TYPE_APPEAR_OFFLINE 111 + +// Xbox Live display controls +#define IDC_LIVE_QUICK_MATCH 101 +#define IDC_LIVE_CUSTOM_MATCH 102 +#define IDC_LIVE_CREATE_MATCH 103 + +// Friends dialog +#define IDC_FRIENDS_LIST 101 +#define IDC_FRIENDS_STATUS 102 + +// Friends options dialog +#define IDC_FRIENDS_PLAYER 101 +#define IDC_FRIENDS_GAME_INVITE 102 +#define IDC_FRIENDS_GAME_CANCEL 103 +#define IDC_FRIENDS_GAME_ACCEPT 104 +#define IDC_FRIENDS_GAME_DECLINE 105 +#define IDC_FRIENDS_GAME_JOIN 106 +#define IDC_FRIENDS_ACCEPT 107 +#define IDC_FRIENDS_DECLINE 108 +#define IDC_FRIENDS_STOP 109 +#define IDC_FRIENDS_CANCEL 110 +#define IDC_FRIENDS_REMOVE 111 +#define IDC_FRIENDS_VOICE 112 +#define IDC_FRIENDS_FEEDBACK 113 +#define IDC_FRIENDS_GAME_INVITE_VOICE 114 +#define IDC_FRIENDS_PLAY_MESSAGE 115 +#define IDC_FRIENDS_MISSIONS 152 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 + +// Send voice mail dialog +#define IDC_SVM_TITLE 101 +#define IDC_SVM_PLAYER 102 +#define IDC_SVM_RECORD 103 +#define IDC_SVM_PLAY 104 +#define IDC_SVM_SEND 105 +#define IDC_SVM_PROGRESS 106 +#define IDC_SVM_TIME 107 + +// Receive voice mail dialog +#define IDC_RVM_TITLE 101 +#define IDC_RVM_PLAYER 102 +#define IDC_RVM_PLAY 103 +#define IDC_RVM_FEEDBACK 104 +#define IDC_RVM_PROGRESS 105 +#define IDC_RVM_TIME 106 + +// Xbox players dialog +#define IDC_XPLAYERS_LIST 101 +#define IDC_XPLAYERS_STATUS 102 +#define IDC_XPLAYERS_DISABLE_VOICE 103 +#define IDC_XPLAYERS_ENABLE_VOICE 104 +#define IDC_XPLAYERS_KICKOFF 105 + +// Xbox players options dialog +#define IDC_XPLAYERS_PLAYER 101 +#define IDC_XPLAYERS_ASK 102 +#define IDC_XPLAYERS_MUTE 103 +#define IDC_XPLAYERS_FEEDBACK 104 +#define IDC_XPLAYERS_CANCEL 105 +#define IDC_XPLAYERS_ASK_VOICE 107 + +// Feedback dialog +#define IDC_FEEDBACK_PLAYER 101 +#define IDC_FEEDBACK_DATE 102 +#define IDC_FEEDBACK_GREAT_SESSION 103 +#define IDC_FEEDBACK_GOOD_ATTITUDE 104 +#define IDC_FEEDBACK_BAD_NAME 105 +#define IDC_FEEDBACK_CURSING 106 +#define IDC_FEEDBACK_SCREAM 107 +#define IDC_FEEDBACK_CHEAT 108 +#define IDC_FEEDBACK_THREAT 109 +#define IDC_FEEDBACK_MSG_HARASSING 110 +#define IDC_FEEDBACK_MSG_OFFENSIVE 111 +#define IDC_FEEDBACK_MSG_SPAM 112 + +// Download content display controls +#define IDC_DOWNLOAD_CONTENT_LIST 101 + +#define IDC_DOWNLOAD_CONTENT_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_TERMS 102 +#define IDC_DOWNLOAD_CONTENT_PICTURE 103 +#define IDC_DOWNLOAD_CONTENT_SHOW_PRICE 104 + +#define IDC_DOWNLOAD_CONTENT_PRICE_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_PRICE 102 +#define IDC_DOWNLOAD_CONTENT_PRICE_QUESTION 103 + +#define IDC_INSTALL_CONTENT_PROGRESS 101 +#define IDC_INSTALL_CONTENT_NAME 102 +#define IDC_INSTALL_CONTENT_TIME 103 + +// Multiplayer passcode display controls +#define IDC_MP_PASSCODE_FIRST 101 + +// Multiplayer display controls +#define IDC_MULTI_TITLE 101 +#define IDC_MULTI_SESSIONS 102 +//#define IDC_MULTI_REMOTE 103 //Renamed to IDC_MULTI_TAB_DIRECT_CONNECT +//#define IDC_MULTI_NEW 104 //Renamed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_JOIN 105 +#define IDC_MULTI_NOTEBOOK 106 +#define IDC_MULTI_PASSWORD 107 +#define IDC_MULTI_PORT 108 +#define IDC_MULTI_SERVER_ICON 111 +#define IDC_MULTI_SERVER_COLUMN 112 +#define IDC_MULTI_MISSION_ICON 113 +#define IDC_MULTI_MISSION_COLUMN 114 +#define IDC_MULTI_STATE_ICON 115 +#define IDC_MULTI_STATE_COLUMN 116 +#define IDC_MULTI_PLAYERS_ICON 117 +#define IDC_MULTI_PLAYERS_COLUMN 118 +#define IDC_MULTI_PING_ICON 119 +#define IDC_MULTI_PING_COLUMN 120 +#define IDC_MULTI_PROGRESS 121 +#define IDC_MULTI_INTERNET 122 +#define IDC_MULTI_REFRESH 123 +#define IDC_MULTI_FILTER 124 +#define IDC_MULTI_SERVER_FILTER 125 +#define IDC_MULTI_MISSION_FILTER 126 +#define IDC_MULTI_PLAYERS_FILTER 127 +#define IDC_MULTI_PING_FILTER 128 +#define IDC_MP_HOST 129 +#define IDC_MP_TYPE 130 +#define IDC_MP_MISSION 131 +#define IDC_MP_ISLAND 132 +#define IDC_MP_STATE 133 +#define IDC_MP_TIMELEFT 134 +#define IDC_MP_SLOTS_PUBLIC 135 +#define IDC_MP_SLOTS_PRIVATE 136 +#define IDC_MP_NO_SESSION 137 +#define IDC_MP_DIFFICULTY 138 +#define IDC_MP_LANGUAGE 139 +#define IDC_MULTI_GAMETYPE_ICON 140 +#define IDC_MULTI_GAMETYPE_COLUMN 141 +#define IDC_MP_PING 142 +#define IDC_MP_PASSWORD 143 +#define IDC_MP_PLATFORM 144 +#define IDC_MP_COUNTRY 145 +#define IDC_MP_VERSION 146 +#define IDC_MP_VERSION_REQUIRED 147 +#define IDC_MP_MODS 148 +#define IDC_MP_PLAYERS_ROW 149 +#define IDC_MULTI_PASSWORDED_FILTER 150 +#define IDC_MULTI_FULL_FILTER 151 +#define IDC_MULTI_TYPE_FILTER 152 +#define IDC_MP_NEXT_SESSION 153 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 +#define IDC_MULTI_FAVORITE_COLUMN 156 +#define IDC_MULTI_FAVORITE_ICON 157 +#define IDC_MULTI_SERVER_COUNT 158 +#define IDC_MULTI_TAB_INTERNET 159 +#define IDC_MULTI_TAB_RECENT 160 +#define IDC_MULTI_TAB_LAN 161 +#define IDC_MULTI_TAB_FRIENDS 162 +#define IDC_MULTI_TAB_OFFICIAL 163 //Changed 164 to 163 +#define IDC_MULTI_TAB_QUICK_PLAY 164 //IDC_MULTI_QUICK_PLAY renamed to IDC_MULTI_TAB_OFFICIAL, changed to 164 +#define IDC_MULTI_TAB_SERVERS 165 //IDC_MULTI_SERVERS renamed to IDC_MULTI_TAB_SERVERS, changed to 165 +#define IDC_MULTI_TAB_DIRECT_CONNECT 166 //IDC_MULTI_REMOTE 103 renamed and changed to IDC_MULTI_TAB_DIRECT_CONNECT +#define IDC_MULTI_TAB_HOST_SERVER 167 //IDC_MULTI_NEW 104 renamed and changed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_LAUNCHER 168 //Launcher button +#define IDC_MP_FILEPATCHING 169 + +//MP Quick Play dialogue +#define IDC_MP_QUICK_GAME_TYPE 110 +#define IDC_MP_QUICK_MAX_PING 111 +#define IDC_MP_QUICK_BEST_SERVER 112 +#define IDC_MP_QUICK_FIND_SERVER 113 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_MODE_TITLE 115 +#define IDC_MP_QUICK_MODE_PICTURE 116 +#define IDC_MP_QUICK_MODE_DESCRIPTION 117 +#define IDC_MP_QUICK_MODE_BACKGROUND 118 + +//Server Search dialogue +#define IDC_MP_SERVER_SEARCH_STATUS 101 +#define IDC_MP_SERVER_SEARCH_PROGRESS 102 + +//Server Found dialogue +#define IDC_MP_SERVER_FOUND_COUNTDOWN 101 +#define IDC_MP_SERVER_FOUND_MISSION 102 +#define IDC_MP_SERVER_FOUND_GAME_TYPE 103 +#define IDC_MP_SERVER_FOUND_PLAYERS 104 +#define IDC_MP_SERVER_FOUND_BUTTON_NEXT 105 +#define IDC_MP_SERVER_FOUND_BUTTON_JOIN 106 + +#define IDC_OPTIMATCH_FILTER_SPEED 101 +#define IDC_OPTIMATCH_FILTER_TYPE 102 +#define IDC_OPTIMATCH_FILTER_MIN_PLAYERS 103 +#define IDC_OPTIMATCH_FILTER_MAX_PLAYERS 104 +#define IDC_OPTIMATCH_FILTER_LANGUAGE 105 +#define IDC_OPTIMATCH_FILTER_DIFFICULTY 106 + +#define IDC_PASSWORD 101 + +#define IDC_IP_ADDRESS 101 +#define IDC_IP_PORT 102 + +#define IDC_PORT_PORT 101 + +#define IDC_FILTER_SERVER 101 +#define IDC_FILTER_MISSION 102 +#define IDC_FILTER_MAXPING 103 +#define IDC_FILTER_MINPLAYERS 104 +#define IDC_FILTER_MAXPLAYERS 105 +#define IDC_FILTER_FULL 106 +#define IDC_FILTER_PASSWORDED 107 +#define IDC_FILTER_DEFAULT 108 +#define IDC_FILTER_TYPE 109 +#define IDC_FILTER_BATTLEYE 110 +#define IDC_FILTER_EXPANSIONS 111 +#define IDC_FILTER_MONETIZED 112 + +#define IDC_CLIENT_TEXT 101 +#define IDC_CLIENT_PLAYERS 102 +#define IDC_CLIENT_PROGRESS 103 + +#define IDC_SERVER_ISLAND 101 +#define IDC_SERVER_MISSION 102 +#define IDC_SERVER_EDITOR 103 +#define IDC_SERVER_DIFF 104 +#define IDC_SERVER_PLAYERS 105 +#define IDC_SERVER_GAMETYPE 106 +#define IDC_SERVER_SLOTS 107 +#define IDC_SERVER_SLOTS_PRIVATE 108 +#define IDC_SERVER_SLOTS_PUBLIC 109 +#define IDC_SERVER_MIN_PLAYERS 110 +#define IDC_SERVER_MAX_PLAYERS 111 +#define IDC_SERVER_SLOTS_PRIVATE_TITLE 112 +#define IDC_SERVER_SLOTS_PRIVATE_TEXT 112 +#define IDC_SERVER_SLOTS_PUBLIC_TITLE 113 +#define IDC_SERVER_SLOTS_PUBLIC_TEXT 113 +#define IDC_SERVER_SLOTS_PUBLIC_VALUE 114 +#define IDC_SERVER_SLOTS_PRIVATE_VALUE 115 +#define IDC_SERVER_VOTED_MISSIONS 116 +#define IDC_SERVER_PLAYERS_TITLE 117 +#define IDC_SERVER_TIMEOUT 118 +#define IDC_SERVER_VOTED_DIFFICULTY 119 +#define IDC_SERVER_DELETE 120 +#define IDC_SERVER_COPY 121 +#define IDC_SERVER_EDIT 122 +#define IDC_SERVER_LOAD 123 +#define IDC_SERVER_PRIVATE_SLOTS_TITLE 124 +#define IDC_SERVER_PRIVATE_SLOTS_VALUE 125 +#define IDC_SERVER_PRIVATE_SLOTS 126 +#define IDC_SERVER_MAXIMUM_SLOTS_TITLE 127 +#define IDC_SERVER_MAXIMUM_SLOTS 128 +#define IDC_SERVER_MAXIMUM_SLOTS_VALUE 129 +#define IDC_SERVER_MI_OVERVIEW 130 +#define IDC_SERVER_MI_GAMETYPE 131 +#define IDC_SERVER_MI_MAX_PLAYERS 132 +#define IDC_SERVER_MI_RESPAWN 133 +#define IDC_SERVER_MI_MIN_PLAYERS 134 +#define IDC_SERVER_SHOW_MISSION_WORKSHOP 135 +#define IDC_SERVER_SHOW_GAME_WORKSHOP 136 +#define IDC_SERVER_MI_NAME 137 +#define IDC_SERVER_MI_AUTHOR 138 +#define IDC_SERVER_MI_PICTURE 139 +#define IDC_SERVER_MI_DESCRIPTION 140 +#define IDC_SERVER_LOADING_PICTURE 141 +#define IDC_SERVER_GAME_OR_MISSION_WORKSHOP 142 +#define IDC_SERVER_ISLAND_TITLE 143 +#define IDC_SERVER_MISSION_TITLE 144 +#define IDC_SERVER_DIFF_INDICATOR 145 +#define IDC_SERVER_PURCHASE_BUTTON 146 + + +#define IDC_REQUIRED_BATTLEYE 201 + +// _VBS3 +#define IDC_AAR_SERVER 121 +#define IDC_AAR_SERVER_FILES 122 +#define IDC_AAR_DOWNLOADPROGRESS 123 +#define IDC_AAR_DOWNLOADSTART 124 +#define IDC_AAR_DOWNLOADSTOP 125 + +// Host settings dialog +#define IDC_HOST_NAME 101 +#define IDC_HOST_PASSWORD 102 +#define IDC_HOST_MAX_PLAYERS 103 +#define IDC_HOST_PRIVATE 104 +#define IDC_HOST_PORT 105 +#define IDC_HOST_PORT_WARNING 106 +#define IDC_HOST_UPNP 107 + +#define IDC_DED_SERVER_SLOTS_PUBLIC 101 +#define IDC_DED_SERVER_SLOTS_PUBLIC_TITLE 102 +#define IDC_DED_SERVER_SLOTS_PUBLIC_VALUE 103 +#define IDC_DED_SERVER_SLOTS_PRIVATE 104 +#define IDC_DED_SERVER_SLOTS_PRIVATE_TITLE 105 +#define IDC_DED_SERVER_SLOTS_PRIVATE_VALUE 106 + +#define IDC_WIZT_TEMPLATES 101 +#define IDC_WIZT_OVERVIEW 102 +#define IDC_WIZT_NAME 103 + +#define IDC_WIZM_EDIT 101 + +#define IDC_SRVSETUP_PLAYERS 101 +#define IDC_SRVSETUP_UNITS 102 +#define IDC_SRVSETUP_ISLAND 103 +#define IDC_SRVSETUP_NAME 104 +#define IDC_SRVSETUP_DESC 105 +#define IDC_SRVSETUP_ASSIGN 106 +#define IDC_SRVSETUP_UNASSIGN 107 +#define IDC_SRVSETUP_RANDOM 108 +#define IDC_SRVSETUP_PARAM1 109 +#define IDC_SRVSETUP_PARAM1_TEXT 110 +#define IDC_SRVSETUP_PARAM2 111 +#define IDC_SRVSETUP_PARAM2_TEXT 112 + +#define IDC_SRVSIDE_NAME 101 +#define IDC_SRVSIDE_ISLAND 102 +#define IDC_SRVSIDE_POOL 103 +#define IDC_SRVSIDE_WEST 104 +#define IDC_SRVSIDE_EAST 105 +#define IDC_SRVSIDE_RESIST 106 +#define IDC_SRVSIDE_CIVIL 107 +#define IDC_SRVSIDE_WEST_TEXT 108 +#define IDC_SRVSIDE_EAST_TEXT 109 +#define IDC_SRVSIDE_RESIST_TEXT 110 +#define IDC_SRVSIDE_CIVIL_TEXT 111 +#define IDC_SRVSIDE_DEFAULT 112 +#define IDC_SRVSIDE_PARAM1 113 +#define IDC_SRVSIDE_PARAM1_TEXT 114 +#define IDC_SRVSIDE_PARAM2 115 +#define IDC_SRVSIDE_PARAM2_TEXT 116 +#define IDC_SRVSIDE_PLAYERS 117 + +#define IDC_MPROLE_TITLE 101 +#define IDC_MPROLE_NAME 102 +#define IDC_MPROLE_ISLAND 103 +#define IDC_MPROLE_DESC 104 +#define IDC_MPROLE_POOL 105 +#define IDC_MPROLE_POOL_TEXT 106 +#define IDC_MPROLE_ROLES 107 +#define IDC_MPROLE_DEFAULT 108 +#define IDC_MPROLE_ENABLE 109 +#define IDC_MPROLE_SIDES 110 +#define IDC_MPROLE_ENABLE_ALL 111 + +#define IDC_CLIENT_GAME 101 + +#define IDC_CLIENTMAP_START1 101 +#define IDC_CLIENTMAP_START2 102 + +#define IDC_CLIENT_READY_PLAYERS 120 +#define IDC_CLIENT_READY_PLAYERS_TITLE 121 +#define IDC_CLIENT_READY_TIMEOUT 122 + +#define IDC_SERVER_READY_PLAYERS 120 +#define IDC_SERVER_READY_PLAYERS_TITLE 121 + +#define IDC_MP_PLAYERS 101 +#define IDC_MP_PL 102 +#define IDC_MP_PL_NAME 103 +#define IDC_MP_PL_MAIL 104 +#define IDC_MP_PL_ICQ 105 +#define IDC_MP_PL_REMARK 106 +#define IDC_MP_SQ 107 +#define IDC_MP_SQ_NAME 108 +#define IDC_MP_SQ_ID 109 +#define IDC_MP_SQ_MAIL 110 +#define IDC_MP_SQ_WEB 111 +#define IDC_MP_SQ_PICTURE 112 +#define IDC_MP_SQ_TITLE 113 +#define IDC_MP_KICKOFF 114 +#define IDC_MP_BAN 115 +#define IDC_MP_PL_MISSION 116 +#define IDC_MP_PL_ISLAND 117 +#define IDC_MP_PL_TIME 118 +#define IDC_MP_PL_MINPING 119 +#define IDC_MP_PL_AVGPING 120 +#define IDC_MP_PL_MAXPING 121 +#define IDC_MP_PL_MINBAND 122 +#define IDC_MP_PL_AVGBAND 123 +#define IDC_MP_PL_MAXBAND 124 +#define IDC_MP_PL_DESYNC 125 +#define IDC_MP_PL_REST 126 +#define IDC_MP_MUTE 127 + +#define IDC_CLIENT_WAIT_TITLE 130 // is used together with MP_PL + +#define IDC_MPSETUP_NAME 101 +#define IDC_MPSETUP_ISLAND 102 +#define IDC_MPSETUP_DESC 103 +#define IDC_MPSETUP_WEST 104 +#define IDC_MPSETUP_EAST 105 +#define IDC_MPSETUP_GUERRILA 106 +#define IDC_MPSETUP_CIVILIAN 107 +#define IDC_MPSETUP_ROLES_TITLE 108 +#define IDC_MPSETUP_ROLES 109 +#define IDC_MPSETUP_PARAM1_TITLE 110 +#define IDC_MPSETUP_PARAM1 111 +#define IDC_MPSETUP_PARAM2_TITLE 112 +#define IDC_MPSETUP_PARAM2 113 +#define IDC_MPSETUP_POOL 114 +#define IDC_MPSETUP_MESSAGE 115 +#define IDC_MPSETUP_KICK 116 +#define IDC_MPSETUP_ENABLE_ALL 117 +#define IDC_MPSETUP_LOCK 118 +#define IDC_MPSETUP_SIDE 119 +#define IDC_MPSETUP_POOL_TITLE 120 +#define IDC_MPSETUP_TIMEOUT 121 +#define IDC_MPSETUP_PLAYERS 122 +#define IDC_MPSETUP_FRIENDS 123 +#define IDC_MPSETUP_ADVANCED 124 +#define IDC_MPSETUP_GAMERCARD 125 +#define IDC_MPSETUP_PARTYGUI 126 +#define IDC_MPSETUP_ASSIGNROLE 127 +#define IDC_MPSETUP_PARAMS 128 +#define IDC_MPSETUP_DSINTERFACE 129 +#define IDC_MPSETUP_MISSION_WORKSHOP 130 +#define IDC_MPSETUP_LOGIC 131 +#define IDC_MPSETUP_VIRTUAL 132 +#define IDC_MPSETUP_PLAYERS_BUTTON 133 +#define IDC_MPSETUP_PLAYERS_SORT 134 +#define IDC_MPSETUP_PING_BUTTON 135 +#define IDC_MPSETUP_PING_SORT 136 +#define IDC_MPSETUP_MUTE_ALL 137 + +#define IDC_MPSETUP_MSG_MESSAGE 101 +#define IDC_MPSETUP_MSG_PROGRESS 102 +#define IDC_MPSETUP_MSG_TIME 103 + +#define IDC_PROGRESS_MSG_MESSAGE 101 +#define IDC_PROGRESS_MSG_PROGRESS 102 +#define IDC_PROGRESS_MSG_TIME 103 + +#define IDC_SERVER_SETTINGS_PARAM1_TEXT 101 +#define IDC_SERVER_SETTINGS_PARAM1 102 +#define IDC_SERVER_SETTINGS_PARAM2_TEXT 103 +#define IDC_SERVER_SETTINGS_PARAM2 104 +#define IDC_SERVER_SETTINGS_AI 105 +#define IDC_SERVER_SETTINGS_ASSIGN 106 + +#define IDC_SERVER_ADVANCED_ROLES 101 +#define IDC_SERVER_ADVANCED_DISABLE_ALL 102 +#define IDC_SERVER_ADVANCED_AUTOASSIGN 103 + +#define IDC_SERVER_SELECT_PLAYERS 101 + +// Main map display controls +#define IDC_MAP_WATCH 101 +#define IDC_MAP_COMPASS 102 +#define IDC_MAP_WALKIE_TALKIE 103 +#define IDC_MAP_NOTEPAD 104 +#define IDC_MAP_WARRANT 105 +#define IDC_MAP_GPS 106 +#define IDC_MAP_TEXTURES 107 +#define IDC_MAP_BRIEFING_SHOW 108 +#define IDC_MAP_BRIEFING_PAGE 109 +#define IDC_MAP_PREV_MARKER 110 +#define IDC_MAP_NEXT_MARKER 111 +#define IDC_MAP_GEAR 112 + +// Diary display controls +#define IDC_DIARY 101 +#define IDC_DIARY_INDEX 102 +#define IDC_DIARY_PAGE 103 +#define IDC_DIARY_ADD 104 + +// Select island display controls +#define IDC_SELECT_ISLAND 101 +#define IDC_SELECT_ISLAND_NOTEBOOK 102 +#define IDC_SELECT_ISLAND_WIZARD 103 +#define IDC_SELECT_ISLAND_EDITOR 104 +#define IDC_SELECT_ISLAND_EDITOR_OLD 105 +//Redefined in Eden +//IDC_SELECT_ISLAND_EDITOR_OLD 105 +//IDC_SELECT_ISLAND_3DEN 106 +#define IDC_SELECT_ISLAND_BUTTON_PURCHASE 107 + +// Custom arcade display controls +#define IDC_CUST_GAME 101 +#define IDC_CUST_PLAY 102 +#define IDC_CUST_EDIT 103 +#define IDC_CUST_DELETE 104 +#define IDC_CUST_EDIT_2 105 + +#define IDC_MISSION_PARAMS_LABEL 101 +#define IDC_MISSION_PARAMS_COMBO 102 + +#define IDC_ARCMAP_LOAD 101 +#define IDC_ARCMAP_SAVE 102 +#define IDC_ARCMAP_CLEAR 103 +#define IDC_ARCMAP_MODE 104 +#define IDC_ARCMAP_INTEL 105 +#define IDC_ARCMAP_MERGE 106 +#define IDC_ARCMAP_PREVIEW 107 +#define IDC_ARCMAP_CONTINUE 108 +#define IDC_ARCMAP_SECTION 109 +#define IDC_ARCMAP_IDS 111 +#define IDC_ARCMAP_TEXTURES 112 +#define IDC_ARCMAP_MISSION_NAME 113 +#define IDC_ARCMAP_MAP 114 +#define IDC_ARCMAP_BACKGROUND 115 +#define IDC_ARCMAP_LAYOUT 116 +#define IDC_ARCMAP_PUBLISH_MISSION 117 + +#define IDC_ARCUNIT_TITLE 101 +#define IDC_ARCUNIT_SIDE 102 +#define IDC_ARCUNIT_VEHICLE 103 +#define IDC_ARCUNIT_RANK 104 +#define IDC_ARCUNIT_CTRL 105 +#define IDC_ARCUNIT_CLASS 107 +#define IDC_ARCUNIT_HEALTH 108 +#define IDC_ARCUNIT_FUEL 109 +#define IDC_ARCUNIT_AMMO 110 +#define IDC_ARCUNIT_AZIMUT 111 +#define IDC_ARCUNIT_SPECIAL 112 +#define IDC_ARCUNIT_AGE 113 +#define IDC_ARCUNIT_AZIMUT_PICTURE 114 +#define IDC_ARCUNIT_PLACE 115 +#define IDC_ARCUNIT_PRESENCE 116 +#define IDC_ARCUNIT_PRESENCE_COND 117 +#define IDC_ARCUNIT_TEXT 118 +#define IDC_ARCUNIT_LOCK 119 +#define IDC_ARCUNIT_INIT 120 +#define IDC_ARCUNIT_SKILL 121 +#define IDC_ARCUNIT_DESC 122 +#define IDC_ARCUNIT_FACTION 123 +#define IDC_ARCUNIT_ELEVATION 124 +#define IDC_ARCUNIT_EQUIP 125 +#define IDC_ARCUNIT_RADIUS 126 +#define IDC_ARCUNIT_ARGUMENTS 127 +#define IDC_ARCUNIT_CATEGORY 128 +#define IDC_ARCUNIT_SETTINGS 2301 + +#define IDC_ARCGRP_SIDE 101 +#define IDC_ARCGRP_TYPE 102 +#define IDC_ARCGRP_NAME 103 +#define IDC_ARCGRP_AZIMUT 104 +#define IDC_ARCGRP_AZIMUT_PICTURE 105 +#define IDC_ARCGRP_FACTION 106 +#define IDC_ARCGRP_UNITS_LIST 107 + +#define IDC_ARCWP_TITLE 101 +#define IDC_ARCWP_TYPE 102 +#define IDC_ARCWP_SEQ 103 +#define IDC_ARCWP_DESC 104 +#define IDC_ARCWP_SEMAPHORE 105 +#define IDC_ARCWP_FORM 106 +#define IDC_ARCWP_SPEED 107 +#define IDC_ARCWP_COMBAT 108 +#define IDC_ARCWP_PLACE 109 +#define IDC_ARCWP_EFFECTS 110 +#define IDC_ARCWP_TIMEOUT_MIN 111 +#define IDC_ARCWP_TIMEOUT_MAX 112 +#define IDC_ARCWP_TIMEOUT_MID 113 +#define IDC_ARCWP_HOUSEPOS 114 +#define IDC_ARCWP_HOUSEPOSTEXT 115 +#define IDC_ARCWP_EXPACTIV 116 +#define IDC_ARCWP_SHOW 117 +#define IDC_ARCWP_EXPCOND 118 +#define IDC_ARCWP_SCRIPT 119 +#define IDC_ARCWP_PREC 120 +#define IDC_ARCWP_HEIGHT 121 +#define IDC_ARCWP_HEIGHTTEXT 122 +#define IDC_ARCWP_SCRIPTTEXT 123 +#define IDC_ARCWP_CATEGORY 124 + +#define IDC_ARCWP_ARGUMENTS 125 +#define IDC_ARCWP_ARGUMENTSTEXT 126 +#define IDC_ARCWP_NAME 127 + +#define IDC_ARCEFF_SOUND 103 +#define IDC_ARCEFF_VOICE 104 +#define IDC_ARCEFF_SOUND_ENV 105 +#define IDC_ARCEFF_SOUND_DET 106 +#define IDC_ARCEFF_MUSIC 107 +#define IDC_ARCEFF_TITTYPE 108 +#define IDC_ARCEFF_TITEFF 109 +#define IDC_ARCEFF_TITTEXT 110 +#define IDC_ARCEFF_TITRES 111 +#define IDC_ARCEFF_TITOBJ 112 +//#define IDC_ARCEFF_PLAYERONLY 113 +#define IDC_ARCEFF_CONDITION 113 +#define IDC_ARCEFF_TEXT_TITTEXT 114 + +#define IDC_ARCSENS_TITLE 101 +#define IDC_ARCSENS_A 102 +#define IDC_ARCSENS_B 103 +#define IDC_ARCSENS_ANGLE 104 +#define IDC_ARCSENS_ACTIV 105 +#define IDC_ARCSENS_PRESENCE 106 +#define IDC_ARCSENS_REPEATING 107 +#define IDC_ARCSENS_INTERRUPT 108 +#define IDC_ARCSENS_TIMEOUT_MIN 109 +#define IDC_ARCSENS_TIMEOUT_MAX 110 +#define IDC_ARCSENS_TIMEOUT_MID 111 +#define IDC_ARCSENS_TYPE 112 +#define IDC_ARCSENS_OBJECT 113 +#define IDC_ARCSENS_TEXT 114 +#define IDC_ARCSENS_AGE 115 +#define IDC_ARCSENS_EFFECTS 116 +#define IDC_ARCSENS_EXPCOND 117 +#define IDC_ARCSENS_EXPACTIV 118 +#define IDC_ARCSENS_EXPDESACTIV 119 +#define IDC_ARCSENS_RECT 120 +#define IDC_ARCSENS_NAME 121 + +#define IDC_ARCMARK_TITLE 101 +#define IDC_ARCMARK_NAME 102 +#define IDC_ARCMARK_MARKER 103 +#define IDC_ARCMARK_TYPE 104 +#define IDC_ARCMARK_COLOR 105 +#define IDC_ARCMARK_A 106 +#define IDC_ARCMARK_B 107 +#define IDC_ARCMARK_ANGLE 108 +#define IDC_ARCMARK_TYPE_TEXT 109 +#define IDC_ARCMARK_FILL 110 +#define IDC_ARCMARK_TEXT 111 + +#define IDC_INTEL_RESISTANCE 101 +#define IDC_INTEL_MONTH 102 +#define IDC_INTEL_DAY 103 +#define IDC_INTEL_HOUR 104 +#define IDC_INTEL_MINUTE 105 +#define IDC_INTEL_BRIEFING_NAME 106 +#define IDC_INTEL_BRIEFING_DESC 107 +#define IDC_INTEL_WEATHER 108 +#define IDC_INTEL_FOG 109 +#define IDC_INTEL_WEATHER_FORECAST 110 +#define IDC_INTEL_FOG_FORECAST 111 +#define IDC_INTEL_YEAR 112 +//added by MUF - new intel dialog-------------------------- +#define IDC_INTEL_WEATHER_TB 113 +#define IDC_INTEL_WEATHER_FORECAST_TB 114 + +#define IDC_INTEL_FOG_CB 115 +#define IDC_INTEL_FOG_TB 116 +#define IDC_INTEL_FOG_FORECAST_TB 117 + +#define IDC_INTEL_RAIN_CB 118 +#define IDC_INTEL_RAIN 119 +#define IDC_INTEL_RAIN_TB 120 +#define IDC_INTEL_RAIN_FORECAST 121 +#define IDC_INTEL_RAIN_FORECAST_TB 122 + +#define IDC_INTEL_LIGHTN_CB 123 +#define IDC_INTEL_LIGHTN 124 +#define IDC_INTEL_LIGHTN_TB 125 +#define IDC_INTEL_LIGHTN_FORECAST 126 +#define IDC_INTEL_LIGHTN_FORECAST_TB 127 + +#define IDC_INTEL_WAVES_CB 128 +#define IDC_INTEL_WAVES 129 +#define IDC_INTEL_WAVES_TB 130 +#define IDC_INTEL_WAVES_FORECAST 131 +#define IDC_INTEL_WAVES_FORECAST_TB 132 + +#define IDC_INTEL_WIND_CB 133 +#define IDC_INTEL_STRENGTH 134 +#define IDC_INTEL_STRENGTH_TB 135 +#define IDC_INTEL_STRENGTH_FORECAST 136 +#define IDC_INTEL_STRENGTH_FORECAST_TB 137 + +#define IDC_INTEL_GUSTS 138 +#define IDC_INTEL_GUSTS_TB 139 +#define IDC_INTEL_GUSTS_FORECAST 140 +#define IDC_INTEL_GUSTS_FORECAST_TB 141 + +#define IDC_INTEL_WINDDIR 142 +#define IDC_INTEL_WINDDIR_TB 143 +#define IDC_INTEL_WINDDIR_FORECAST 144 +#define IDC_INTEL_WINDDIR_FORECAST_TB 145 + +#define IDC_INTEL_CHNGTIME 146 +#define IDC_INTEL_CHNGTIME_HOUR_TB 147 +#define IDC_INTEL_CHNGTIME_MIN_TB 148 + +#define IDC_INTEL_CHNGTIME_HLEFT 149 +#define IDC_INTEL_CHNGTIME_HMIDDLE 150 +#define IDC_INTEL_CHNGTIME_HRIGHT 151 + +//added by MUF - new intel dialog-------------------------- + +// Dialog for choosing Editor's layout +#define IDC_LAYOUT_LIST 101 +#define IDC_LAYOUT_PICTURE 102 + +// Chat +#define IDC_CHANNEL 101 +#define IDC_CHANNEL_VOICE 102 +#define IDC_CHANNEL_MUTE_VON 103 +#define IDC_CHANNEL_MUTE_CHAT 104 + +#define IDC_CHAT 101 + +#define IDC_VOICE_CHAT 101 + +// Save / load template +#define IDC_TEMPL_NAME 101 +#define IDC_TEMPL_TITLE 102 +#define IDC_TEMPL_MODE 103 +#define IDC_TEMPL_ISLAND 104 + +// publish / update to Steam workshop +#define IDC_PUBLISH_STEAM_TITLE 101 +#define IDC_PUBLISH_STEAM_TAGS 102 +#define IDC_PUBLISH_STEAM_PICTURE 103 +#define IDC_PUBLISH_STEAM_DESCRIPTION 104 +#define IDC_PUBLISH_STEAM_MISSION_LIST 105 +#define IDC_PUBLISH_STEAM_VISIBILITY 106 +#define IDC_PUBLISH_STEAM_CHANGE_NOTES 107 +#define IDC_PUBLISH_STEAM_PREVIEW_FILE 108 +#define IDC_PUBLISH_CHECKBOX_LICENCE 109 +#define IDC_PUBLISH_TEXT_MISSION_SIZE 110 +#define IDC_PUBLISH_TEXT_QUOTA 111 +#define IDC_PUBLISH_BUTTON_PUBLISH 112 +#define IDC_PUBLISH_BUTTON_UPDATE 113 +#define IDC_PUBLISH_BUTTON_DELETE 114 +#define IDC_PUBLISH_BUTTON_EDIT_TAGS 115 +#define IDC_PUBLISH_BUTTON_WORKSHOP 116 +#define IDC_PUBLISH_BUTTON_WORKSHOP_LICENCE 117 +#define IDC_PUBLISH_BUTTON_SELECT_PREVIEW 118 +#define IDC_PUBLISH_BUTTON_DEFAULT_PREVIEW 119 +#define IDC_PUBLISH_STORAGE_SLIDER 120 +// group that is hidden when new mission is selected and shown when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_HIDE_NEW_MISSION 121 +// group that is shown when new mission is selected and hidden when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_SHOW_NEW_MISSION 122 + +// publish / update to Steam workshop - tags dialog +#define IDC_PUBLISH_STEAM_TAGS_AVAILABLE 101 +#define IDC_PUBLISH_STEAM_TAGS_SELECTED 102 +#define IDC_PUBLISH_STEAM_TAGS_ADD 103 +#define IDC_PUBLISH_STEAM_TAGS_REMOVE 104 +#define IDC_PUBLISH_STEAM_TAGS_NEXT 105 +#define IDC_PUBLISH_STEAM_TAGS_BACK 106 +#define IDC_PUBLISH_STEAM_TAGS_TITLE 107 + +// select file dialog +#define IDC_FILE_SELECT_PATH 101 +#define IDC_FILE_SELECT_DIR_TREE 102 +#define IDC_FILE_SELECT_FILE_LIST 103 +#define IDC_FILE_SELECT_PREVIEW 104 + + +//Login display +#define IDC_LOGIN_USER_LIST 101 +#define IDC_LOGIN_EDIT 102 +#define IDC_LOGIN_NEW_USER 103 +#define IDC_LOGIN_DELETE 104 +#define IDC_LOGIN_NAME 105 +#define IDC_LOGIN_FACE 106 +#define IDC_LOGIN_SPEAKER 107 +#define IDC_LOGIN_PITCH 108 +#define IDC_LOGIN_HEAD 109 +#define IDC_LOGIN_GLASSES 110 +#define IDC_LOGIN_ID 111 +#define IDC_LOGIN_SQUAD 112 +#define IDC_LOGIN_SQUAD_TEXT 113 +#define IDC_LOGIN_DISCARD 114 +#define IDC_LOGIN_TAB_AVATAR 115 +#define IDC_LOGIN_TAB_UNIT 116 +#define IDC_LOGIN_UNIT_SELECT 117 +#define IDC_LOGIN_UNIT_LOGO 118 +#define IDC_LOGIN_UNIT_NAME 119 +#define IDC_LOGIN_UNIT_MOTTO 120 +#define IDC_LOGIN_UNIT_DESCRIPTION 121 +#define IDC_LOGIN_ID_TEXT 122 +#define IDC_LOGIN_REFRESH 123 + +// Interrupt display +#define IDC_INT_OPTIONS 101 +#define IDC_INT_LOAD 102 +#define IDC_INT_SAVE 103 +#define IDC_INT_ABORT 104 +#define IDC_INT_RETRY 105 +#define IDC_INT_TITLE 106 +#define IDC_INT_SETTINGS 107 +#define IDC_INT_FRIENDS 108 +#define IDC_INT_PLAYERS 109 +#define IDC_INT_APPEAR_OFFLINE 110 +#define IDC_INT_MISSION 111 +#define IDC_INT_SIGN_IN_STATUS 112 +#define IDC_INT_EDIT_MAP 113 +#define IDC_INT_EDIT_3D 114 +#define IDC_INT_EDIT_PREVIEW 115 +#define IDC_INT_EDIT_REALTIME 116 +#define IDC_INT_RESTART 117 +#define IDC_INT_DIARY 118 +#define IDC_INT_REVERT 119 +#define IDC_INT_MISSIONNAME 120 +#define IDC_INT_TRAFFIC_LIGHT 121 +#define IDC_INT_FIELD_MANUAL 122 + +// Interrupt revert display +#define IDC_INT_REVERT_TYPE 101 + +// Select save display +#define IDC_SELECT_SAVE_SLOTS 101 + +// Mission end display +#define IDC_ME_SUBTITLE 101 +#define IDC_ME_QUOTATION 102 +#define IDC_ME_AUTHOR 103 +#define IDC_ME_RETRY 104 +#define IDC_ME_LOAD 105 +#define IDC_ME_RESTART 106 +#define IDC_ME_TEAM_SWITCH 107 + +// Get ready display +#define IDC_GETREADY_NAME 101 +#define IDC_GETREADY_DESC 102 +#define IDC_GETREADY_PRIMARY 105 +#define IDC_GETREADY_SECONDARY 106 +#define IDC_GETREADY_PLAYER 107 +#define IDC_GETREADY_DATE 108 +#define IDC_GETREADY_MODE 110 +#define IDC_GETREADY_PRIMARY_TEXT 111 +#define IDC_GETREADY_SECONDARY_TEXT 112 +#define IDC_GETREADY_EDITMODE 113 +#define IDC_GETREADY_TITLE 114 + +#define IDC_GEAR_UNIT 101 +#define IDC_GEAR_SKILL 102 +#define IDC_GEAR_VEHICLE 103 +#define IDC_GEAR_POOL 105 +#define IDC_GEAR_OVERVIEW 106 +#define IDC_GEAR_SLOT_PRIMARY 107 +#define IDC_GEAR_SLOT_SECONDARY 108 +#define IDC_GEAR_SLOT_ITEM1 109 +#define IDC_GEAR_SLOT_ITEM2 110 +#define IDC_GEAR_SLOT_ITEM3 111 +#define IDC_GEAR_SLOT_ITEM4 112 +#define IDC_GEAR_SLOT_ITEM5 113 +#define IDC_GEAR_SLOT_ITEM6 114 +#define IDC_GEAR_SLOT_ITEM7 115 +#define IDC_GEAR_SLOT_ITEM8 116 +#define IDC_GEAR_SLOT_ITEM9 117 +#define IDC_GEAR_SLOT_ITEM10 118 +#define IDC_GEAR_SLOT_ITEM11 119 +#define IDC_GEAR_SLOT_ITEM12 120 +#define IDC_GEAR_SLOT_HANDGUN 121 +#define IDC_GEAR_SLOT_HANGUN_ITEM1 122 +#define IDC_GEAR_SLOT_HANGUN_ITEM2 123 +#define IDC_GEAR_SLOT_HANGUN_ITEM3 124 +#define IDC_GEAR_SLOT_HANGUN_ITEM4 125 +#define IDC_GEAR_SLOT_HANGUN_ITEM5 126 +#define IDC_GEAR_SLOT_HANGUN_ITEM6 127 +#define IDC_GEAR_SLOT_HANGUN_ITEM7 128 +#define IDC_GEAR_SLOT_HANGUN_ITEM8 129 +#define IDC_GEAR_SLOT_SPECIAL1 130 +#define IDC_GEAR_SLOT_SPECIAL2 131 +#define IDC_GEAR_REARM 132 +#define IDC_GEAR_CONTINUE 133 +#define IDC_GEAR_SLOT_INVENTORY1 134 +#define IDC_GEAR_SLOT_INVENTORY2 135 +#define IDC_GEAR_SLOT_INVENTORY3 136 +#define IDC_GEAR_SLOT_INVENTORY4 137 +#define IDC_GEAR_SLOT_INVENTORY5 138 +#define IDC_GEAR_SLOT_INVENTORY6 139 +#define IDC_GEAR_SLOT_INVENTORY7 140 +#define IDC_GEAR_SLOT_INVENTORY8 141 +#define IDC_GEAR_SLOT_INVENTORY9 142 +#define IDC_GEAR_SLOT_INVENTORY10 143 +#define IDC_GEAR_SLOT_INVENTORY11 144 +#define IDC_GEAR_SLOT_INVENTORY12 145 + +#define IDC_GEAR_ADD_ITEM 146 +#define IDC_GEAR_REMOVE_ITEM 147 + +#define IDC_GEAR_FILTER 148 +#define IDC_GEAR_FILTER_ICON1 149 +#define IDC_GEAR_FILTER_ICON2 150 +#define IDC_GEAR_FILTER_ICON3 151 +#define IDC_GEAR_FILTER_ICON4 152 +#define IDC_GEAR_FILTER_ICON5 153 +#define IDC_GEAR_FILTER_ICON6 154 + +#define IDC_GEAR_POOL_GROUP 155 +#define IDC_GEAR_SOURCE_NAME 156 +#define IDC_GEAR_OPEN_BAG 157 +#define IDC_GEAR_CLOSE_BAG 158 +#define IDC_GEAR_ADD_DEFAULT 255 +#define IDC_GEAR_CLEAR_ALL 256 +#define IDC_BAG_ITEMS_GROUP 159 +#define IDC_UNIT_ITEMS_GROUP 160 + +#define IDC_GEAR_BAG_EMPTY 5000 +/* +#define IDC_GEAR_BAG_EMPTY_SLOT1 5000 +#define IDC_GEAR_BAG_EMPTY_SLOT2 5001 +#define IDC_GEAR_BAG_EMPTY_SLOT3 5002 +. +. +. +#define IDC_GEAR_BAG_EMPTY_SLOT499 5498 +#define IDC_GEAR_BAG_EMPTY_SLOT500 5499 +*/ +#define IDC_GEAR_BAG_FULL 5500 + +// Debriefing +/* +#define IDC_DEBRIEFING_LEFT 101 +#define IDC_DEBRIEFING_RIGHT 102 +*/ +#define IDC_DEBRIEFING_STAT 103 +#define IDC_DEBRIEFING_RESTART 104 +#define IDC_DEBRIEFING_PAD2 105 +#define IDC_DEBRIEFING_PLAYERS_TITLE_BG 106 +#define IDC_DEBRIEFING_PLAYERS_TITLE 107 +#define IDC_DEBRIEFING_PLAYERS_BG 108 +#define IDC_DEBRIEFING_PLAYERS 109 +#define IDC_DEBRIEFING_TIMEOUT 110 +#define IDC_DEBRIEFING_RESULT 111 +#define IDC_DEBRIEFING_TITLE 112 +#define IDC_DEBRIEFING_DEBRIEFING 113 +#define IDC_DEBRIEFING_OBJECTIVES 114 +#define IDC_DEBRIEFING_INFO 115 +#define IDC_DEBRIEFING_SHOW_PLAYERS 116 +#define IDC_DEBRIEFING_SHOW_PAGE2 117 +#define IDC_DEBRIEFING_LIVE_STATS 118 +#define IDC_DEBRIEFING_PREV_PAGE 119 +#define IDC_DEBRIEFING_NEXT_PAGE 120 +#define IDC_DEBRIEFING_LOAD 121 +#define IDC_DEBRIEFING_TEXT_GROUP 122 +#define IDC_DEBRIEFING_OBJECTIVES_GROUP 123 +#define IDC_DEBRIEFING_STATS_GROUP 124 +#define IDC_DEBRIEFING_MISSION_WORKSHOP 125 +#define IDC_DEBRIEFING_READY 126 +#define IDC_DEBRIEFING_DISCONNECT 127 + +// Debug display +#define IDC_DEBUG_EXP 101 +#define IDC_DEBUG_APPLY 102 +#define IDC_DEBUG_LOG 103 +#define IDC_DEBUG_SEARCH 161 +#define IDC_DEBUG_SEARCH_BUTTON 162 +#define IDC_DEBUG_HISTORY 163 + +#define IDC_DEBUG_EXP1 121 +#define IDC_DEBUG_EXP2 122 +#define IDC_DEBUG_EXP3 123 +#define IDC_DEBUG_EXP4 124 + +#define IDC_DEBUG_RES1 141 +#define IDC_DEBUG_RES2 142 +#define IDC_DEBUG_RES3 143 +#define IDC_DEBUG_RES4 144 + +#define IDC_DEBUG_CLEAR_LOG 151 +#define IDC_DEBUG_FILTER_EDIT 152 + +// Debug PhysX Display +#define IDC_PHYSX_DEBUG_DIAGMODE 101 +#define IDC_PHYSX_DEBUG_DIAGMODEDRAW 102 + +#define IDC_PHYSX_DEBUG_TERRAIN 103 +#define IDC_PHYSX_DEBUG_STATIC 104 +#define IDC_PHYSX_DEBUG_KINEMATIC 105 +#define IDC_PHYSX_DEBUG_DYNAMIC 106 + +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_START 109 +#define IDC_PHYSX_DEBUG_WORLD_AXES 110 +#define IDC_PHYSX_DEBUG_BODY_AXES 111 +#define IDC_PHYSX_DEBUG_BODY_MASS_AXES 112 +#define IDC_PHYSX_DEBUG_BODY_LIN_VELOCITY 113 +#define IDC_PHYSX_DEBUG_BODY_ANG_VELOCITY 114 +#define IDC_PHYSX_DEBUG_BODY_JOINT_GROUPS 115 +#define IDC_PHYSX_DEBUG_JOINT_LOCAL_AXES 116 +#define IDC_PHYSX_DEBUG_JOINT_WORLD_AXES 117 +#define IDC_PHYSX_DEBUG_JOINT_LIMITS 118 +#define IDC_PHYSX_DEBUG_CONTACT_POINT 119 +#define IDC_PHYSX_DEBUG_CONTACT_NORMAL 120 +#define IDC_PHYSX_DEBUG_CONTACT_ERROR 121 +#define IDC_PHYSX_DEBUG_CONTACT_FORCE 122 +#define IDC_PHYSX_DEBUG_ACTOR_AXES 123 +#define IDC_PHYSX_DEBUG_COLLISION_AABBS 124 +#define IDC_PHYSX_DEBUG_COLLISION_SHAPES 125 +#define IDC_PHYSX_DEBUG_COLLISION_AXES 126 +#define IDC_PHYSX_DEBUG_COLLISION_COMPOUNDS 127 +#define IDC_PHYSX_DEBUG_COLLISION_VNORMALS 128 +#define IDC_PHYSX_DEBUG_COLLISION_FNORMALS 129 +#define IDC_PHYSX_DEBUG_COLLISION_EDGES 130 +#define IDC_PHYSX_DEBUG_COLLISION_SPHERES 131 +#define IDC_PHYSX_DEBUG_COLLISION_STATIC 132 +#define IDC_PHYSX_DEBUG_COLLISION_DYNAMIC 133 +#define IDC_PHYSX_DEBUG_COLLISION_FREE 134 +#define IDC_PHYSX_DEBUG_COLLISION_CCD 135 +#define IDC_PHYSX_DEBUG_COLLISION_SKELETONS 136 +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_END 148 + +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_START 149 +#define IDC_PHYSX3_DEBUG_WORLD_AXES 150 +#define IDC_PHYSX3_DEBUG_BODY_AXES 151 +#define IDC_PHYSX3_DEBUG_BODY_MASS_AXES 152 +#define IDC_PHYSX3_DEBUG_BODY_LIN_VELOCITY 153 +#define IDC_PHYSX3_DEBUG_BODY_ANG_VELOCITY 154 +#define IDC_PHYSX3_DEBUG_BODY_JOINT_GROUPS 155 +#define IDC_PHYSX3_DEBUG_CONTACT_POINT 156 +#define IDC_PHYSX3_DEBUG_CONTACT_NORMAL 157 +#define IDC_PHYSX3_DEBUG_CONTACT_ERROR 158 +#define IDC_PHYSX3_DEBUG_CONTACT_FORCE 159 +#define IDC_PHYSX3_DEBUG_ACTOR_AXES 160 +#define IDC_PHYSX3_DEBUG_COLLISION_AABBS 161 +#define IDC_PHYSX3_DEBUG_COLLISION_SHAPES 162 +#define IDC_PHYSX3_DEBUG_COLLISION_AXES 163 +#define IDC_PHYSX3_DEBUG_COLLISION_COMPOUNDS 164 +#define IDC_PHYSX3_DEBUG_COLLISION_FNORMALS 165 +#define IDC_PHYSX3_DEBUG_COLLISION_EDGES 166 +#define IDC_PHYSX3_DEBUG_COLLISION_STATIC 167 +#define IDC_PHYSX3_DEBUG_COLLISION_DYNAMIC 168 +#define IDC_PHYSX3_DEBUG_COLLISION_PAIRS 169 +#define IDC_PHYSX3_DEBUG_JOINT_LOCAL_AXES 170 +#define IDC_PHYSX3_DEBUG_JOINT_LIMITS 171 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_POSITION 172 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_VELOCITY 173 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_COLLISION_NORMAL 174 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BOUNDS 175 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_GRID 176 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BROADPHASE_BOUNDS 177 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_MAX_MOTION_DISTANCE 178 +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_END 188 + +#define IDC_PHYSX_DEBUG_ALL 190 +#define IDC_PHYSX_DEBUG_NONE 191 +#define IDC_PHYSX_DEBUG_DIAGMODEPERF 192 +#define IDC_PHYSX_DEBUG_DIAGMODESTATS 193 + +#define IDC_PHYSX_DEBUG_USECONVEXSHAPES 194 +#define IDC_PHYSX_DEBUG_USEROADWAYS 195 +#define IDC_PHYSX_DEBUG_USEONECAPSULE 196 +#define IDC_PHYSX_DEBUG_IMMEDIATEFETCH 197 + +#define IDC_PHYSX_DEBUG_BASIC 198 + +// DS interface display +#define IDC_DSI_PLAYERLIST 101 +#define IDC_DSI_MISSONLIST 102 + +// HintC display +#define IDC_HINTC_BG 101 +#define IDC_HINTC_HINT 102 +#define IDC_HINTC_TITLE 103 +#define IDC_HINTC_CONTINUE 104 +#define IDC_HINTC_LINE1 105 +#define IDC_HINTC_LINE2 106 + +// Insert marker display +#define IDC_INSERT_MARKER 101 +#define IDC_INSERT_MARKER_PICTURE 102 +#define IDC_INSERT_MARKER_CHANNELS 103 + +// InGameUI +// - unit info +#define IDC_IGUI_TIME 101 +#define IDC_IGUI_DATE 102 +#define IDC_IGUI_NAME 103 +#define IDC_IGUI_UNIT 104 +#define IDC_IGUI_VALUE_EXP 106 +#define IDC_IGUI_COMBAT_MODE 107 +#define IDC_IGUI_VALUE_HEALTH 109 +#define IDC_IGUI_HITZONES 111 +#define IDC_IGUI_VALUE_FUEL 113 +#define IDC_IGUI_CARGO_MAN 114 +#define IDC_IGUI_CARGO_FUEL 115 +#define IDC_IGUI_CARGO_REPAIR 116 +#define IDC_IGUI_CARGO_AMMO 117 +#define IDC_IGUI_WEAPON 118 +#define IDC_IGUI_AMMO 119 +#define IDC_IGUI_VEHICLE 120 +#define IDC_IGUI_SPEED 121 +#define IDC_IGUI_ALT 122 +#define IDC_IGUI_FORMATION 123 +#define IDC_IGUI_BG 124 +#define IDC_IGUI_COMMANDER 125 +#define IDC_IGUI_DRIVER 126 +#define IDC_IGUI_GUNNER 127 + +#define IDC_IGUI_SPEED_FREEFALL 380 +#define IDC_IGUI_SPEED_VERTICAL_FREEFALL 381 +#define IDC_IGUI_ALT_FREEFALL 382 + +#define IDC_IGUI_ANALOGUE_HORIZON 383 +#define IDC_IGUI_ANALOGUE_SPEED_LADDER 384 +#define IDC_IGUI_ANALOGUE_ALT_LADDER 385 + +#define IDC_IGUI_OPTICS_GROUP 390 +#define IDC_IGUI_DRIVER_GROUP 391 +#define IDC_IGUI_DRIVER_OPTICS_GROUP 392 +#define IDC_IGUI_VEHICLE_PITCH 393 + + +//AV_Terminal +#define IDC_IGUI_AVT_NAME 100 +#define IDC_IGUI_AVT_TAKE_CONTROL 101 +#define IDC_IGUI_AVT_STATUS 102 +#define IDC_IGUI_AVT_TARGET 103 +#define IDC_IGUI_AVT_POSITION 104 +#define IDC_IGUI_AVT_PIP1 105 +#define IDC_IGUI_AVT_PIP2 106 +#define IDC_IGUI_AVT_COUNT 107 +#define IDC_IGUI_AVT_EDITOR_MENU 108 +#define IDC_IGUI_AVT_FUEL 109 +#define IDC_IGUI_AVT_WEAPON 110 +#define IDC_IGUI_AVT_AMMO 111 +#define IDC_IGUI_AVT_WEAPON_SEC 112 +#define IDC_IGUI_AVT_AMMO_SEC 113 +#define IDC_IGUI_AVT_TAKE_CONTROL_DRIVER 114 +#define IDC_IGUI_AVT_TAKE_CONTROL_GUNNER 115 +#define IDC_IGUI_AVT_AUTONOMOUS 116 +#define IDC_IGUI_AVT_COMBO 117 +#define IDC_IGUI_AVT_ALLOW_LIGHTS 118 + +//AV Camera +#define IDC_IGUI_AVC_PIP_DRIVER 100 +#define IDC_IGUI_AVC_PIP_GUNNER 101 +#define IDC_IGUI_AVC_PIP_SINGLE_VIEW 102 +#define IDC_IGUI_AVC_PIP_SOURCE 103 +#define IDC_IGUI_AVC_PIP_HEADING 104 +#define IDC_IGUI_AVC_PIP_MODE 105 + +//Sling Load Assistant +#define IDC_SLA_MAP 100 +#define IDC_SLA_HDIST 101 +#define IDC_SLA_VDIST 102 +#define IDC_SLA_STATUS 103 +#define IDC_SLA_LIFT_PROGRESS 104 +#define IDC_SLA_HEIGHT_BAR 105 +#define IDC_SLA_MAX_ALT 106 +#define IDC_SLA_VIEWPORT 107 + +//Sensors Display +#define IDC_SENS_VIEWPORT 101 +#define IDC_SENS_CIRCLES 102 +#define IDC_SENS_VEHICLE 103 +#define IDC_SENS_RANGE 104 +#define IDC_SENS_RADARON 105 +#define IDC_SENS_RADAROFF 106 +#define IDC_SENS_TARGET 107 +#define IDC_SENS_TARGETRANGE 108 +#define IDC_SENS_TARGETSPEED 109 +#define IDC_SENS_TARGETALT 110 +#define IDC_SENS_HEADING 111 + +//Mine detector Display +#define IDC_MINEDETECT_VIEWPORT 101 +#define IDC_MINEDETECT_CIRCLES 102 +#define IDC_MINEDETECT_VEHICLE 103 +#define IDC_MINEDETECT_RANGE 104 + +//Crew list +#define IDC_CREW_VEHICLE 101 +#define IDC_CREW_LIST 102 + +//MP Score Table +#define IDC_MP_SCORE_TABLE_TITLE 101 +#define IDC_MP_SCORE_TABLE_PLAYERS_LIST 102 +#define IDC_MP_SCORE_TABLE_SIDES_LIST 103 +#define IDC_MP_SCORE_TABLE_LINE_TEMPLATE 104 +#define IDC_MP_SCORE_TABLE_LINE_BACK 105 +#define IDC_MP_SCORE_TABLE_ORDER 106 +#define IDC_MP_SCORE_TABLE_PLAYERSNAME 107 +#define IDC_MP_SCORE_TABLE_KILLS_INF 108 +#define IDC_MP_SCORE_TABLE_KILLS_SOFT 109 +#define IDC_MP_SCORE_TABLE_KILLS_ARMOR 110 +#define IDC_MP_SCORE_TABLE_KILLS_AIR 111 +#define IDC_MP_SCORE_TABLE_KILLED 112 +#define IDC_MP_SCORE_TABLE_KILLSTOTAL 113 + +//Vehicle MessageBox +#define IDC_VEHICLEMSGBOX_BACKGROUND 100 +#define IDC_VEHICLEMSGBOX_LOGO 101 +#define IDC_VEHICLEMSGBOX_TEXT 102 +#define IDC_VEHICLEMSGBOX_PURCHASE 103 + +//Action Notification +#define IDC_DLC_ACTION_NOTIFICATION_GROUP 11406 +#define IDC_DLC_ACTION_NOTIFICATION_LOGO 100 +#define IDC_DLC_ACTION_NOTIFICATION_TEXT 101 +#define IDC_DLC_ACTION_NOTIFICATION_TITLE 102 + +//first aid icons +#define IDC_IGUI_BLEEDING0 401 +#define IDC_IGUI_BLEEDING1 402 +#define IDC_IGUI_INJURED_HEAD0 403 +#define IDC_IGUI_INJURED_HEAD1 404 +#define IDC_IGUI_INJURED_HANDS0 405 +#define IDC_IGUI_INJURED_HANDS1 406 +#define IDC_IGUI_INJURED_HANDS2 407 +#define IDC_IGUI_INJURED_LEGS0 408 +#define IDC_IGUI_INJURED_LEGS1 409 +#define IDC_IGUI_INJURED_LEGS2 410 +#define IDC_IGUI_BODY 411 +#define IDC_IGUI_VALUE_OXYGEN 412 +#define IDC_IGUI_BURNING 413 + +#define IDC_IGUI_ALT_WANTED 128 +#define IDC_IGUI_SPEED_WANTED 129 +#define IDC_IGUI_POSITION 130 +#define IDC_IGUI_OPTIC 131 + +// _VBS3 + #define IDC_IGUI_MAGAZINE 132 + #define IDC_IGUI_OVR_STATUS 133 + //TI + #define IDC_IGUI_TI_BACK 134 + #define IDC_IGUI_TI_MODE 135 + #define IDC_IGUI_TI_BRIGHTNESS_TXT 136 + #define IDC_IGUI_TI_BRIGHTNESS 137 + #define IDC_IGUI_TI_CONTRAST_TXT 138 + #define IDC_IGUI_TI_CONTRAST 139 + #define IDC_IGUI_TI_AUTO_CONTRAST 140 + + //LASE + #define IDC_IGLR_RANGE 141 + #define IDC_IGLR_BG 142 + #define IDC_IGLR_RANGE_NUM 143 + + //AVRS + #define IDC_IGUI_NICK 144 + #define IDC_IGUI_NICK_VAL 145 + #define IDC_IGUI_BANK 146 + #define IDC_IGUI_BANK_VAL 147 +// !_VBS3 +#define IDC_IGUI_HEADING 148 + +// !new arrowhead +#define IDC_IGUI_WEAPON_MODE 149 +#define IDC_IGUI_WEAPON_GUNNER 150 +#define IDC_IGUI_COUNTER_MEASURES_AMMO 151 +#define IDC_IGUI_COUNTER_MEASURES_MODE 152 + +#define IDC_IGUI_RADARRANGE 153 +#define IDC_IGUI_VALUE_RELOAD 154 +#define IDC_IGUI_WEAPON_AMMO 155 + +// New Arma 3 +#define IDC_IGUI_STANCE_INDICATOR 188 +#define IDC_IGUI_GPS_PLAYER 189 +#define IDC_IGUI_SPEED2 190 +#define IDC_IGUI_ALT2 191 +#define IDC_IGUI_PILOT_OPTIC_ZOOM 192 +#define IDC_IGUI_STAMINA_BAR 193 + +// weapon/turret info controls +#define IDC_IGUI_WEAPON_DISTANCE 151 +#define IDC_IGUI_WEAPON_VISION_MODE 152 +#define IDC_IGUI_WEAPON_FLIR_MODE 153 +#define IDC_IGUI_WEAPON_FOV_MODE 154 +#define IDC_IGUI_WEAPON_COMPASS 155 +#define IDC_IGUI_WEAPON_HEADING 156 +#define IDC_IGUI_WEAPON_AUTOHOVER 157 +#define IDC_IGUI_WEAPON_LASER_MARKER_ON 158 +#define IDC_IGUI_WEAPON_BALL_ENABLED 159 +#define IDC_IGUI_WEAPON_JAVELIN_DAY 160 +#define IDC_IGUI_WEAPON_JAVELIN_FLTR 161 +#define IDC_IGUI_WEAPON_JAVELIN_NFOV 162 +#define IDC_IGUI_WEAPON_JAVELIN_WFOV 163 +#define IDC_IGUI_WEAPON_BALL_RANGE 164 +#define IDC_IGUI_WEAPON_BALISTIC_COMP 165 +#define IDC_IGUI_WEAPON_JAVELIN_SEEK 166 +#define IDC_IGUI_WEAPON_JAVELIN_MISSLE 167 +#define IDC_IGUI_WEAPON_ELEVATION 168 +#define IDC_IGUI_WEAPON_ELEVATION_TEXT 169 +#define IDC_IGUI_WEAPON_STATIC_ITEMS 170 +#define IDC_IGUI_WEAPON_GPS_PLAYER 171 +#define IDC_IGUI_WEAPON_GPS_TARGET 172 +#define IDC_IGUI_WEAPON_ARTI_DIST 173 +#define IDC_IGUI_WEAPON_ARTI_TIME 174 +#define IDC_IGUI_WEAPON_ARTI_ELEV 175 +#define IDC_IGUI_WEAPON_ARTI_ELEV_NEED 176 +#define IDC_IGUI_WEAPON_ARTI_OUT_RANGE 177 +#define IDC_IGUI_WEAPON_ARTI_AUTO_ELEV 178 +#define IDC_IGUI_WEAPON_VISION_MODE2 179 +#define IDC_IGUI_WEAPON_OPTICS_ZOOM 180 +#define IDC_IGUI_WEAPON_TARGET_UNIT 181 +#define IDC_IGUI_WEAPON_OPTICS_PITCH 182 +#define IDC_IGUI_WEAPON_DISTANCE2 183 + +// unit info (to preserve order) - new A3 +#define IDC_IGUI_AMMOCOUNT 184 +#define IDC_IGUI_MAGCOUNT 185 + +#define IDC_IGUI_DEPTH 186 +#define IDC_IGUI_WEAPON_MODE_TEXTURE 187 +#define IDC_IGUI_WEAPON_SPEED 188 +#define IDC_IGUI_WEAPON_ALT 189 +#define IDC_IGUI_WEAPON_TIME 190 + +#define IDC_IGUI_WEAPON_CAM_TRACK_AREA 194 +#define IDC_IGUI_WEAPON_CAM_TRACK_TARGET 195 + +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_FROM_TOP 196 +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_DIRECT 197 + +#define IDC_IGUI_WEAPON_LASED_DISTANCE 198 +#define IDC_IGUI_WEAPON_LASED_SPEED 199 +#define IDC_IGUI_WEAPON_LASED_VALID 200 +#define IDC_IGUI_WEAPON_LASED_ERR_LEAD 201 +#define IDC_IGUI_WEAPON_LASED_ERR_ELEV 202 +#define IDC_IGUI_WEAPON_LASED_ERR_OBJECT 203 +#define IDC_IGUI_WEAPON_LASER_ZEROING_DELAY 204 + +#define IDC_IGUI_THROTTLE 205 +#define IDC_IGUI_VEHICLE_DIRECTION 206 +#define IDC_IGUI_VEHICLE_DIRECTION2 207 + + + + + +// helicopter unit info +#define IDC_IGUI_GMETER 501 +#define IDC_IGUI_RADARALTIMETER 505 +#define IDC_IGUI_RADARALTIMETER_BAR 506 +#define IDC_IGUI_RADARALTIMETER_VALUE 507 +#define IDC_IGUI_TORQUE 510 +#define IDC_IGUI_WINDINDICATOR 515 +#define IDC_IGUI_WINDINDICATOR_TEXT 516 +#define IDC_IGUI_WINDINDICATOR_IMAGE 517 +#define IDC_IGUI_STABILITYINDICATOR 520 +#define IDC_IGUI_STABILITYINDICATOR_AXIS 521 +#define IDC_IGUI_STABILITYINDICATOR_OFFSET 522 +#define IDC_IGUI_COLLECTIVE 525 +#define IDC_IGUI_AIRSPEEDINDICATOR 530 +#define IDC_IGUI_AIRSPEEDINDICATOR_AXIS 531 +#define IDC_IGUI_AIRSPEEDINDICATOR_VALUE 532 +#define IDC_IGUI_ALTIMETER 535 +#define IDC_IGUI_ALTIMETER_AXIS 536 +#define IDC_IGUI_ALTIMETER_VALUE 537 +#define IDC_IGUI_ATTITUDEINDICATOR 540 +#define IDC_IGUI_ATTITUDEINDICATOR_LITE 541 +#define IDC_IGUI_TRIMINDICATOR 545 +#define IDC_IGUI_AUTOHOVERNDICATOR 546 +#define IDC_IGUI_HELIHUD_MISCELLANEOUS 550 + +// helicopter Analogue unit info +#define IDC_IGUI_ANALOGUE_SPEED 601 +#define IDC_IGUI_ANALOGUE_SPEED_NEEDLE 602 +#define IDC_IGUI_ANALOGUE_SPEED_MIN 603 +#define IDC_IGUI_ANALOGUE_SPEED_MAX 604 +#define IDC_IGUI_ANALOGUE_SPEED_TEXT 605 +#define IDC_IGUI_ANALOGUE_SPEED_IMPERIAL 606 +#define IDC_IGUI_ANALOGUE_SPEED_METRIC 607 + +#define IDC_IGUI_ANALOGUE_ALTITUDE 611 +#define IDC_IGUI_ANALOGUE_ALTITUDE_NEEDLE 612 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MIN 613 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MAX 614 +#define IDC_IGUI_ANALOGUE_ALTITUDE_TEXT 615 +#define IDC_IGUI_ANALOGUE_ALTITUDE_IMPERIAL 616 +#define IDC_IGUI_ANALOGUE_ALTITUDE_METRIC 617 + +#define IDC_IGUI_ANALOGUE_ATTITUDE 621 +#define IDC_IGUI_ANALOGUE_ATTITUDE_HORIZON 622 +#define IDC_IGUI_ANALOGUE_ATTITUDE_VALUE 623 + +#define IDC_IGUI_ANALOGUE_COMPASS 631 +#define IDC_IGUI_ANALOGUE_COMPASS_DIR 632 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND 633 +#define IDC_IGUI_ANALOGUE_COMPASS_WAYPOINT 634 +#define IDC_IGUI_ANALOGUE_COMPASS_MIN 635 +#define IDC_IGUI_ANALOGUE_COMPASS_MAX 636 +#define IDC_IGUI_ANALOGUE_COMPASS_TEXT 637 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND_TEXT 638 + +#define IDC_IGUI_ANALOGUE_STABILITY 641 +#define IDC_IGUI_ANALOGUE_STABILITY_SPEED 642 +#define IDC_IGUI_ANALOGUE_STABILITY_TEXT 643 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED_NEEDLE 644 +#define IDC_IGUI_ANALOGUE_STABILITY_COLLECTIVE 645 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED 646 +#define IDC_IGUI_ANALOGUE_STABILITY_IMPERIAL 647 +#define IDC_IGUI_ANALOGUE_STABILITY_METRIC 648 + +//damage +#define IDC_IGUI_DAMAGE_GROUP 660 +#define IDC_IGUI_DAMAGE_ENGINESRPM 662 +#define IDC_IGUI_DAMAGE_ENGINESDAMAGE 663 +#define IDC_IGUI_DAMAGE_TORQUE 664 +#define IDC_IGUI_DAMAGE_ELECTRICITY 665 +#define IDC_IGUI_DAMAGE_FUEL 666 +#define IDC_IGUI_DAMAGE_HYDRAULICS 667 +#define IDC_IGUI_DAMAGE_MAINROTOR 668 +#define IDC_IGUI_DAMAGE_TAILROTOR 669 +#define IDC_IGUI_DAMAGE_AUTOHOVER 670 +#define IDC_IGUI_DAMAGE_INSTALLATIONS 671 +#define IDC_IGUI_DAMAGE_HULL 672 +#define IDC_IGUI_DAMAGE_WHEELBRAKE 673 +#define IDC_IGUI_DAMAGE_ROTORBRAKE 674 +#define IDC_IGUI_DAMAGE_WINCH 675 +#define IDC_IGUI_DAMAGE_GEAR 676 + +// - hint +#define IDC_IGHINT_BG 101 +#define IDC_IGHINT_HINT 102 + +// - task hint +#define IDC_IGTASKHINT_BG 103 +#define IDC_IGTASKHINT_HINT 104 + +// - load mission progress bar +#define IDC_LOAD_MISSION_NAME 101 +#define IDC_LOAD_MISSION_DATE 102 +#define IDC_PROGRESS_TIME 103 +#define IDC_PROGRESS_PROGRESS 104 +#define IDC_LOAD_MISSION_PICTURE 105 +#define IDC_LOAD_MISSION_TEXT 106 + +// - dedicated server dialog +#define IDC_DS_REPORT 101 +#define IDC_DS_PLAYERS 102 +#define IDC_DS_FRIENDS 103 + +// - friend's missions dialog +#define IDC_FRIEND_MISSIONS_LIST 101 + +// - live statistics dialogs +#define IDC_LIVE_STATS_BOARDS 101 + +#define IDC_LIVE_STATS_LIST 101 +#define IDC_LIVE_STATS_COUNT 102 +#define IDC_LIVE_STATS_TITLE 103 +#define IDC_LIVE_STATS_PLAYER 104 +#define IDC_LIVE_STATS_BEGIN 105 +#define IDC_LIVE_STATS_END 106 +#define IDC_LIVE_STATS_PREV 107 +#define IDC_LIVE_STATS_NEXT 108 +#define IDC_LIVE_STATS_FRIENDS 109 +#define IDC_LIVE_STATS_GAMER_CARD 110 + +#define IDC_RECEIVING_TEXT 101 +#define IDC_RECEIVING_TIME 102 + +#define IDC_MSG_BOX_MESSAGE 101 + +#define IDC_EDITOR_OBJECTS 201 +#define IDC_EDITOR_ATTRIBUTES 202 +#define IDC_EDITOR_BACKGROUND 203 +#define IDC_EDITOR_MENU 204 +#define IDC_EDITOR_SAVE 205 +#define IDC_EDITOR_LOAD 206 +#define IDC_EDITOR_RESTART 207 +#define IDC_EDITOR_PREVIEW 208 +#define IDC_EDITOR_MAP 209 +#define IDC_EDITOR_CLEAR 210 +#define IDC_EDITOR_TYPE_LIST 211 + +// editor menu system +#define IDC_EDITOR_FILE 212 +#define IDC_EDITOR_VIEW 213 +#define IDC_EDITOR_USER 214 +#define IDC_EDITOR_MENU_FILE 216 +#define IDC_EDITOR_MENU_VIEW 217 +#define IDC_EDITOR_MENU_USER 218 + +#define IDC_EDITOR_CONTROLS_HELP 220 +#define IDC_EDITOR_LOAD_AAR 221 + +#define IDC_EDITOR_ADDOBJ_TYPES 222 +#define IDC_EDITOR_ADDOBJ_CATEGORIES 223 +#define IDC_EDITOR_ADDOBJ_LISTING 224 + +#define IDC_MINI_MAP 225 + +// editor tree filtering +#define IDC_EDITOR_OBJECTS_FILTER 236 +#define IDC_EDITOR_TREE_EXPAND_ALL 237 +#define IDC_EDITOR_TREE_EXPAND_ALL_BACK 238 +#define IDC_EDITOR_TREE_COLLAPSE_ALL 239 +#define IDC_EDITOR_TREE_COLLAPSE_ALL_BACK 240 + +#define IDC_EDIT_OBJECT_CONTROLS 101 +#define IDC_EDIT_OBJECT_TOGGLE_BUTTON 102 + +#define IDC_NEW_OBJECT_TYPE 101 +#define IDC_NEW_OBJECT_PARENT 102 + +#define IDC_MISSION_LOAD_ISLAND 101 +#define IDC_MISSION_LOAD_MISSION 102 + +#define IDC_MISSION_SAVE_MISSION 101 +#define IDC_MISSION_SAVE_TITLE 102 +#define IDC_MISSION_SAVE_DESCRIPTION 103 +#define IDC_MISSION_SAVE_PLACEMENT 104 + +#define IDC_OVERLAY_CREATE_NAME 101 +#define IDC_OVERLAY_LOAD_NAME 101 +#define IDC_OVERLAY_LOAD_MISSION 102 + +#define IDC_EDIT_DIARY_RECORD 101 +#define IDC_EDIT_DIARY_TITLE 102 + +#define IDC_LOAD_AAR_NAME 101 + +#define IDC_EDITOR_EB_PLAN 101 +#define IDC_EDITOR_EB_NOTES 102 +#define IDC_EDITOR_EB_SIDE 103 +#define IDC_EDITOR_EB_OBJECTIVES 104 +#define IDC_EDITOR_EB_NEW_OBJECTIVE 105 +#define IDC_EDITOR_EB_ADD_OBJECTIVE 106 +#define IDC_EDITOR_EB_DEL_OBJECTIVE 107 + +// - team switch display + +#define IDC_TEAM_SWITCH_ROLES 101 + +// - configure action display + +#define IDC_CONFIGURE_ACTION_TITLE 101 +#define IDC_CONFIGURE_ACTION_KEYS 102 +#define IDC_CONFIGURE_ACTION_SPECIAL 103 +#define IDC_CONFIGURE_ACTION_DELETE 104 +#define IDC_CONFIGURE_ACTION_DEFAULT 105 +#define IDC_CONFIGURE_ACTION_CLEAR 106 +#define IDC_CONFIGURE_ACTION_CANCEL 107 +#define IDC_CONFIGURE_ACTION_PREV 108 +#define IDC_CONFIGURE_ACTION_NEXT 109 + +// - controls display +#define IDC_CONTROLS_TYPE 101 +#define IDC_CONTROLS_CONFIGURE 102 + +// - miniMap display + +#define IDC_MINIMAP 101 +#define IDC_MINIMAP_VIEWPORT 102 +#define IDC_MINIMAP_GRID 197 +#define IDC_MINIMAP_HEADING 198 +#define IDC_MINIMAP_TIME 199 + + +// - scripting help display +#define IDC_SCRITING_HELP 101 +#define IDC_SCRITING_HELP_BACK 102 +#define IDC_SCRITING_HELP_FORWARD 103 +#define IDC_SCRITING_HELP_EXAMPLE 104 + +// - performance display +#define IDC_PERF_INDEX 101 +#define IDC_PERF_ENABLE 102 +#define IDC_PERF_GRAPH 103 +#define IDC_PERF_GRAPH_TITLE 104 +#define IDC_PERF_MAXTIME 105 + +// - capture display +#define IDC_CAPTURE_INDEX 101 +#define IDC_CAPTURE_TIMELINES 102 +#define IDC_CAPTURE_ZOOMIN 103 +#define IDC_CAPTURE_ZOOMOUT 104 +#define IDC_CAPTURE_EXPORT 105 +#define IDC_CAPTURE_INFO 106 +#define IDC_CAPTURE_EXPORT_ALL 107 +#define IDC_CAPTURE_IMPORT_ALL 108 +#define IDC_CAPTURE_PREVIOUS_DATA 109 +#define IDC_CAPTURE_AVERAGES 110 +#define IDC_CAPTURE_SAVE_ARCHIVE 111 +#define IDC_CAPTURE_SEARCH 112 + + +// - joysticks configuration display +#define IDC_CONTROLLER_CUSTOMIZE 101 +#define IDC_CONTROLLER_ENABLE 102 +#define IDC_CONTROLLER_XINPUT_LIST 103 +#define IDC_CONTROLLER_LIST 104 +#define IDC_CONTROLLER_REFRESH 105 + +// - customize controllers +#define IDC_CUSTOMIZE_CTRL_SENSITIVITIES 101 +#define IDC_CUSTOMIZE_CTRL_UNMAP 102 +#define IDC_CUSTOMIZE_CTRL_DEFAULT 103 +#define IDC_CUSTOMIZE_CTRL_TITLE 104 +#define IDC_CUSTOMIZE_CTRL_DEFAULT_BINDING 105 +#define IDC_CUSTOMIZE_CTRL_ADVANCED 106 +#define IDC_SENSITIVITY_SLIDER 120 +#define IDC_DEADZONE_SLIDER 220 +#define IDC_CUSTOMIZE_CTRL_ACTIVE_AXIS_ICON 320 +#define IDC_CUSTOMIZE_CTRL_STEEPNESS 420 +#define IDC_CUSTOMIZE_CTRL_VALUE 520 + +// - joystick schemes +#define IDC_JOY_SCHEMES_TITLE 101 +#define IDC_JOY_SCHEMES_LIST 102 +#define IDC_JOY_SCHEMES_MAP 103 + +// - helper IDC for DisplayCampaignLoadLight +#define IDC_MP_CAMPAIGN_RESTART 150 +#define IDC_MP_CAMPAIGN_REPLAY 151 +#define IDC_MP_CAMPAIGN_LOAD 152 + +// - addon actions display +#define IDC_ADDON_ACTIONS 101 +#define IDC_ADDON_ACTIONS_NEW_MOD 102 + +// - mod launcher +#define IDC_MOD_LAUNCHER_MODS 101 +#define IDC_MOD_LAUNCHER_PICTURE 102 +#define IDC_MOD_LAUNCHER_UP 103 +#define IDC_MOD_LAUNCHER_DOWN 104 +#define IDC_MOD_LAUNCHER_DISABLE 105 +#define IDC_MOD_LAUNCHER_ACTION 106 +#define IDC_MOD_LAUNCHER_PURCHASE 107 +#define IDC_MOD_LAUNCHER_DESCRIPTION 108 + +// - create new mod +#define IDC_MOD_NAME 101 +#define IDC_MOD_DIR 102 + + +//A3 credits +#define ONBUTTONCLICK_START_CREDITS "0 = _this spawn (uinamespace getvariable 'bis_fnc_credits');" + + +// Hitzone types +#define HZ_AIRPLANE_HULL 0 +#define HZ_AIRPLANE_ENG 22 +#define HZ_AIRPLANE_FUEL 23 +#define HZ_AIRPLANE_GEAR 24 +#define HZ_AIRPLANE_WINGS 25 +#define HZ_AIRPLANE_INST 26 + +#define HZ_HELICOPTER_HULL 1 +#define HZ_HELICOPTER_ENG 2 +#define HZ_HELICOPTER_INST 3 +#define HZ_HELICOPTER_ATRQ 4 +#define HZ_HELICOPTER_MROT 5 +#define HZ_HELICOPTER_WINCH 6 + +#define HZ_CAR_HULL 7 +#define HZ_CAR_ENG 8 +#define HZ_CAR_FUEL 9 +#define HZ_CAR_WHL 10 + +#define HZ_MOTORCYCLE_HULL 11 +#define HZ_MOTORCYCLE_ENG 12 +#define HZ_MOTORCYCLE_FUEL 13 +#define HZ_MOTORCYCLE_WHL 14 + +#define HZ_TANK_HULL 15 +#define HZ_TANK_ENG 16 +#define HZ_TANK_GUN 17 +#define HZ_TANK_LTR 18 +#define HZ_TANK_RTR 19 +#define HZ_TANK_TRRT 20 + +#define HZ_VEH_GUN HZ_TANK_GUN +#define HZ_VEH_TRRT HZ_TANK_TRRT + +#define HZ_SHIP_ENG 21 + +#define HZ_VEH_TOTAL 27 + +#define HZ_TANK_CMDGUN 28 +#define HZ_TANK_CMDTRRT 29 +#define HZ_VEH_CMDGUN HZ_TANK_CMDGUN +#define HZ_VEH_CMDTRRT HZ_TANK_CMDTRRT + +#define HZ_VEH_TRRT_TOTAL 30 +#define HZ_VEH_CMDTRRT_TOTAL 31 + +#define HZ_TANK_BOTH_TRACKS 32 diff --git a/include/a3/ui_f/hpp/defineResinclDesign.inc b/include/a3/ui_f/hpp/defineResinclDesign.inc new file mode 100644 index 00000000000..0c669371e93 --- /dev/null +++ b/include/a3/ui_f/hpp/defineResinclDesign.inc @@ -0,0 +1,1063 @@ +#define IDC_SEARCH 645 +#define IDC_SEARCH_BUTTON 646 + +//--- RscDisplayMain +#define IDC_MAIN_GAMEMODES 201 +#define IDC_MAIN_MP_SCENARIOS 202 +#define IDC_MAIN_ARSENAL 203 +#define IDC_MAIN_COMMUNITYGUIDES 204 +#define IDC_MAIN_PROFILE 205 +#define IDC_MAIN_CAMPAIGN_MP 206 + +#define IDC_MAIN_MOUSEAREA 999 +#define IDC_MAIN_BACKGROUND_PICTURE 998 +#define IDC_MAIN_BACKGROUND_BLACK 997 + +#define IDC_MAIN_GROUP_SINGLEPLAYER 1001 +#define IDC_MAIN_GROUP_MULTIPLAYER 1002 +#define IDC_MAIN_GROUP_TUTORIALS 1003 +#define IDC_MAIN_GROUP_OPTIONS 1004 +#define IDC_MAIN_GROUP_SESSION 1005 + +#define IDC_MAIN_TITLE_SINGLEPLAYER 1011 +#define IDC_MAIN_TITLE_MULTIPLAYER 1012 +#define IDC_MAIN_TITLE_TUTORIALS 1013 +#define IDC_MAIN_TITLE_OPTIONS 1014 +#define IDC_MAIN_TITLE_SESSION 1015 + +#define IDC_MAIN_TITLEICON_SINGLEPLAYER 1111 +#define IDC_MAIN_TITLEICON_MULTIPLAYER 1112 +#define IDC_MAIN_TITLEICON_TUTORIALS 1113 +#define IDC_MAIN_TITLEICON_OPTIONS 1114 +#define IDC_MAIN_TITLEICON_SESSION 1115 + +#define IDC_MAIN_SPOTLIGHT_GROUP_1 1020 +#define IDC_MAIN_SPOTLIGHT_GROUP_2 1021 +#define IDC_MAIN_SPOTLIGHT_GROUP_3 1022 +#define IDC_MAIN_SPOTLIGHT_PICTURE 1023 +#define IDC_MAIN_SPOTLIGHT_VIDEO 1024 +#define IDC_MAIN_SPOTLIGHT_HOVER 1025 +#define IDC_MAIN_SPOTLIGHT_BUTTON 1026 +#define IDC_MAIN_SPOTLIGHT_ACTION 1027 +#define IDC_MAIN_SPOTLIGHT_TEXT 1028 +#define IDC_MAIN_SPOTLIGHT_TEXTBCG 1029 + +#define IDC_MAIN_SPOTLIGHT_PREV 1060 +#define IDC_MAIN_SPOTLIGHT_NEXT 1061 + +#define IDC_MAIN_INFO_MODS 1030 +#define IDC_MAIN_INFO_DLCS 1031 +#define IDC_MAIN_INFO_DLCSOWNED 10311 +#define IDC_MAIN_INFO_NEWS 1032 +#define IDC_MAIN_INFO_VERSION 1033 + +#define IDC_MAIN_INFO_BACKGROUND 1034 +#define IDC_MAIN_INFO_BACKGROUND_ICON 1035 +#define IDC_MAIN_INFO_ICON 1036 +#define IDC_MAIN_INFO_BUTTON 1037 +#define IDC_MAIN_INFO_BUTTON_DEV 1038 +#define IDC_MAIN_INFO_NOTIFICATION 1039 + +#define IDC_MAIN_VERSION_DEV 1050 + +#define BARCOLOR 0, 0, 0, 0.75 +#define INFO_BACKGROUND_COLOR BARCOLOR +#define INFO_ICON_COLOR 1, 1, 1, 0.5 + +//--- RscDisplayDebug +#define IDC_RSCDISPLAYDEBUG_DESIGNHTML 11735 +#define IDC_RSCDISPLAYDEBUG_TEXTEXPRESSION 11736 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR1 11737 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR2 11738 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR3 11739 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR4 11740 +#define IDC_RSCDISPLAYDEBUG_TEXTWATCH 11741 +#define IDC_RSCDISPLAYDEBUG_DIAGTEXT 11747 +#define IDC_RSCDISPLAYDEBUG_DRAWTEXT 11748 +#define IDC_RSCDISPLAYDEBUG_CA_TITLE 11838 +#define IDC_RSCDISPLAYDEBUG_CA_PLAYER 12145 +#define IDC_RSCDISPLAYDEBUG_CA_VERSION 12146 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST 12236 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST_SEARCH 12238 +#define IDC_RSCDISPLAYDEBUG_DRAWLIST 12237 +#define IDC_RSCDISPLAYDEBUG_DIAGFRAME 12535 +#define IDC_RSCDISPLAYDEBUG_DRAWFRAME 12536 +#define IDC_RSCDISPLAYDEBUG_FRAMELOG 12537 +#define IDC_RSCDISPLAYDEBUG_G_EXPRESSION 13035 +#define IDC_RSCDISPLAYDEBUG_G_DIAG 13036 +#define IDC_RSCDISPLAYDEBUG_G_DESIGN 13037 +#define IDC_RSCDISPLAYDEBUG_G_WATCH 13038 +#define IDC_RSCDISPLAYDEBUG_G_DRAW 13039 +#define IDC_RSCDISPLAYDEBUG_DIAGBUTTON 13138 +#define IDC_RSCDISPLAYDEBUG_DRAWBUTTON 13139 +#define IDC_RSCDISPLAYDEBUG_DEBUGFLOW 13140 +#define IDC_RSCDISPLAYDEBUG_DEBUGANIM 13141 +#define IDC_RSCDISPLAYDEBUG_B_CAMERANEW 13142 +#define IDC_RSCDISPLAYDEBUG_CREATEJIRAISSUE 13143 +#define IDC_RSCDISPLAYDEBUG_DEBUGGUI 13144 +#define IDC_RSCDISPLAYDEBUG_DEBUGFUNCTIONS 13145 +#define IDC_RSCDISPLAYDEBUG_DEBUGCONFIG 13154 +#define IDC_RSCDISPLAYDEBUG_B_CAMERA 13155 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT1 13157 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT2 13158 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT3 13159 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT4 13160 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT5 13161 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT6 13163 +#define IDC_RSCDISPLAYDEBUG_DEBUGCAPTURE 13164 + +//--- RscDisplayAnimViewer +#define IDC_RSCDISPLAYANIMVIEWER_TITLE 1000 +#define IDC_RSCDISPLAYANIMVIEWER_BACKGROUND 1001 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTACTION 1002 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTPOSE 1003 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTMOVEMENT 1004 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTSTANCE 1005 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTITEM 1006 +#define IDC_RSCDISPLAYANIMVIEWER_DESCRIPTION 1100 +#define IDC_RSCDISPLAYANIMVIEWER_MISC 1500 +#define IDC_RSCDISPLAYANIMVIEWER_ACTION 2100 +#define IDC_RSCDISPLAYANIMVIEWER_POSE 2101 +#define IDC_RSCDISPLAYANIMVIEWER_MOVEMENT 2102 +#define IDC_RSCDISPLAYANIMVIEWER_STANCE 2103 +#define IDC_RSCDISPLAYANIMVIEWER_ITEM 2104 +#define IDC_RSCDISPLAYANIMVIEWER_SOLDIER 2106 +#define IDC_RSCDISPLAYANIMVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYANIMVIEWER_MOUSEAREA 999 +#define IDC_RSCDISPLAYANIMVIEWER 1320 + +//--- RscDisplayFunctionsViewer +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEBACKGROUND 1000 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDLEFT 1001 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDRIGHT 1002 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDMETA 1003 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLETEXT 1004 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_AUTHOR 1005 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODESTRUCTURED 1100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEICON 1200 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODE 1400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_NAME 1401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_FUNCTIONS 1500 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_SOURCES 2100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TAGS 2101 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CATEGORIES 2102 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_PREVIEW 2300 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_ALL 2400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_SELECTED 2401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYFUNCTIONSVIEWER 1321 + +//--- Loading +#define IDC_LOADING_MAPBACKTOP 1000 +#define IDC_LOADING_MAPNAME 1001 +#define IDC_LOADING_MAPAUTHOR 1002 +#define IDC_LOADING_MAPBACKBOTTOM 1003 +#define IDC_LOADING_MISSIONBACKGROUNDTOP 1005 +#define IDC_LOADING_MISSIONNAME 1006 +#define IDC_LOADING_MISSIONAUTHOR 1007 +#define IDC_LOADING_PROGRESSMAP 1008 +#define IDC_LOADING_DISCLAIMERNAME 1009 +#define IDC_LOADING_MISSIONPICTUREBACK 1010 +#define IDC_LOADING_MISSIONGAMETYPE 1012 +#define IDC_LOADING_PROGRESSMISSION 1013 +#define IDC_LOADING_MISSIONDESCRIPTION 1100 +#define IDC_LOADING_DISCLAIMERDESCRIPTION 1101 +#define IDC_LOADING_MAPDESCRIPTION 1102 +#define IDC_LOADING_MISSION 2300 +#define IDC_LOADING_DISCLAIMER 2301 +//--- Loading - DLC part +#define IDC_LOADING_DLCNAME 3207 +#define IDC_LOADING_DLCAUTHOR 3208 +#define IDC_LOADING_DLCPICTUREBACK 3209 +#define IDC_LOADING_DLCDESCRIPTION 3296 +#define IDC_LOADING_DLCPICTURE 3393 +#define IDC_LOADING_DLCSTRIPE 3395 +#define IDC_LOADING_DLCICON 3396 + +#define IDC_LOADING_MAP 999 + +//--- LoadingStart +#define IDC_LOADINGSTART_BLACK 1000 +#define IDC_LOADINGSTART_LOGO 1200 +#define IDC_LOADINGSTART_NOISE 1201 +#define IDC_LOADINGSTART_LOADINGSTART 2310 + +//--- RscDisplayDebriefing +#define IDC_RSCDISPLAYDEBRIEFING_LISTGROUP 21903 //Defined manually +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE 21904 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBACKGROUND 20594 +#define IDC_RSCDISPLAYDEBRIEFING_MAINBACKGROUND 20595 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBACKGROUND 20596 +#define IDC_RSCDISPLAYDEBRIEFING_PLAYERNAME 20599 +#define IDC_RSCDISPLAYDEBRIEFING_TITLE 20600 +#define IDC_RSCDISPLAYDEBRIEFING_SUBTITLE 20601 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVESBACKGROUND 20602 +#define IDC_RSCDISPLAYDEBRIEFING_STATBACKGROUND 20603 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONBACKGROUND 20604 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBACKGROUND 20605 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGTEXT 20606 +#define IDC_RSCDISPLAYDEBRIEFING_RATING 20607 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBEST 20608 +#define IDC_RSCDISPLAYDEBRIEFING_TIMETEXT 20609 +#define IDC_RSCDISPLAYDEBRIEFING_TIME 20610 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBEST 20611 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSTEXT 20612 +#define IDC_RSCDISPLAYDEBRIEFING_LOADS 20613 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBEST 20614 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWBACKGROUND 20615 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWTEXT 20616 +#define IDC_RSCDISPLAYDEBRIEFING_DLCCOUNTDOWN 20617 +#define IDC_RSCDISPLAYDEBRIEFING_TABSBACKGROUND 20618 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBAR 20619 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONTEXT 20693 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOMTEXT 20694 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE1 20696 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE2 20697 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE3 20698 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE4 20699 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE5 20700 +#define IDC_RSCDISPLAYDEBRIEFING_PICTURE 20793 +#define IDC_RSCDISPLAYDEBRIEFING_MISSIONPICTURE 20794 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWPICTURE 20795 +#define IDC_RSCDISPLAYDEBRIEFING_DLCLOCKICON 20798 +#define IDC_RSCDISPLAYDEBRIEFING_SECTION 21093 +#define IDC_RSCDISPLAYDEBRIEFING_SUMMARY 21893 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTION 21894 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVES 21895 +#define IDC_RSCDISPLAYDEBRIEFING_STAT 21896 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOM 21897 +#define IDC_RSCDISPLAYDEBRIEFING_DATA 21898 +#define IDC_RSCDISPLAYDEBRIEFING_SIDES 21899 +#define IDC_RSCDISPLAYDEBRIEFING_DLCGENERALGROUP 21900 +#define IDC_RSCDISPLAYDEBRIEFING_LOAC 21901 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONALLASSETS 21995 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONKARTS 21996 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONHELI 21997 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONMARKSMEN 21998 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONAPEX 22000 + +//--- RscDisplayDebriefing - DLC item template +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUND 20623 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUNDBLACK 20624 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMNAME 20625 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTSESSIONTIME 20626 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMSESSIONTIME 20627 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTTOTALTIME 20628 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTOTALTIME 20629 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDESCRIPTION 20630 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMPICTURE 20796 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDLCLOGO 20797 +#define IDC_RSCDISPLAYDEBRIEFING_RSCDISPLAYDEBRIEFING_ITEMTEMPLATE 21902 +#define IDC_RSCDISPLAYDEBRIEFING_BUTTONPURCHASE 21999 + +//--- RscDisplayDebriefing_LOACTemplate +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_BACKGROUND 52605 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TITLE 52705 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXT 52706 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_PICTURE 52805 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXTGROUP 53905 + + +//--- RscDebugConsole +#define IDC_RSCDEBUGCONSOLE_TITLE 11884 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONBACKGROUND 11885 +#define IDC_RSCDEBUGCONSOLE_WATCHBACKGROUND 11886 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND1 11887 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND2 11888 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND3 11889 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND4 11890 +#define IDC_RSCDEBUGCONSOLE_LINK 11891 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONTEXT 11892 +#define IDC_RSCDEBUGCONSOLE_WATCHTEXT 11893 +#define IDC_RSCDEBUGCONSOLE_EXPRESSION 12284 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT1 12285 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT1 12286 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT2 12287 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT2 12288 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT3 12289 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT3 12290 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT4 12291 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT4 12293 +#define IDC_RSCDEBUGCONSOLE_RSCDEBUGCONSOLE 13184 +#define IDC_RSCDEBUGCONSOLE_BUTTONCODEPERFORMANCE 13284 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTEALL 13285 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTESERVER 13286 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPECTATORCAMERA 13287 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPLENDIDCAMERA 13288 +#define IDC_RSCDEBUGCONSOLE_BUTTONFUNCTIONS 13289 +#define IDC_RSCDEBUGCONSOLE_BUTTONCONFIG 13290 +#define IDC_RSCDEBUGCONSOLE_BUTTONANIMATIONS 13291 +#define IDC_RSCDEBUGCONSOLE_BUTTONGUI 13292 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTELOCAL 13484 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUT 13190 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUTBACKGROUND 13191 + + + +//--- RscDisplayOptionsLayout +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TITLE 1000 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BACKGROUND 1001 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGSTEXT 1002 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETSLABEL 1003 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_MOUSEAREA 1004 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERW 1005 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERH 1006 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TOOLTIP 1100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGS 2100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETS 2101 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONSAVE 2400 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONOK 2600 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONCANCEL 2700 + +//--- RscDisplayRespawn +#define IDC_RSCDISPLAYRESPAWN_TITLE 1000 +#define IDC_RSCDISPLAYRESPAWN_LISTBACKGROUND 1001 +#define IDC_RSCDISPLAYRESPAWN_SECTION 1002 +#define IDC_RSCDISPLAYRESPAWN_BLACK 1003 +#define IDC_RSCDISPLAYRESPAWN_CONTENTBACKGROUND 1004 +#define IDC_RSCDISPLAYRESPAWN_BLACKCONTENT 1005 +#define IDC_RSCDISPLAYRESPAWN_PLAYERSNAME 1006 +#define IDC_RSCDISPLAYRESPAWN_CONTENT 1100 +#define IDC_RSCDISPLAYRESPAWN_LIST 1500 +#define IDC_RSCDISPLAYRESPAWN_CONTENTGROUP 2300 +#define IDC_RSCDISPLAYRESPAWN_BUTTONOK 2600 +#define IDC_RSCDISPLAYRESPAWN_BUTTONCANCEL 2700 + +#define IDC_RSCDISPLAYRESPAWN_MAP 1050 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 1000 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 1002 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 1003 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 1004 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 1200 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 1201 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 1202 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 1203 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 1204 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 1205 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 2300 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 2600 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 2700 + +//--- RscSpectator +#define IDC_RSCSPECTATOR_PLAYERNAMEBACKGROUND 1000 +#define IDC_RSCSPECTATOR_PLAYERGROUP 1001 +#define IDC_RSCSPECTATOR_PLAYERNAME 1002 +#define IDC_RSCSPECTATOR_PLAYERDESCRIPTION 1100 +#define IDC_RSCSPECTATOR_PLAYERICON 1200 +#define IDC_RSCSPECTATOR_PLAYER 2300 + +//--- RscMissionEnd +#define IDC_RSCMISSIONEND_TITLE 8942 +#define IDC_RSCMISSIONEND_SUBTITLE 8943 +#define IDC_RSCMISSIONEND_SIDE1 9045 +#define IDC_RSCMISSIONEND_SIDE2 9046 +#define IDC_RSCMISSIONEND_SIDE3 9047 +#define IDC_RSCMISSIONEND_SIDE4 9048 +#define IDC_RSCMISSIONEND_SIDE5 9049 +#define IDC_RSCMISSIONEND_PICTURE 9142 +#define IDC_RSCMISSIONEND_SIDES 10248 + +//--- RscNotification +#define IDC_RSCNOTIFICATION_TITLE 12135 +#define IDC_RSCNOTIFICATION_PICTUREBACKGROUND 12136 +#define IDC_RSCNOTIFICATION_SCORE 12137 +#define IDC_RSCNOTIFICATION_DESCRIPTIONBACKGROUND 12138 +#define IDC_RSCNOTIFICATION_DESCRIPTION 12235 +#define IDC_RSCNOTIFICATION_PICTURE 12335 +#define IDC_RSCNOTIFICATION_NOTIFICATION 13435 + +#define IDC_RSCNOTIFICATION_NOTIFICATIONAREA 312 + +//--- RscCommMenuItems +#define IDC_RSCCOMMMENUITEMS_SLOT1BACKGROUND 1000 +#define IDC_RSCCOMMMENUITEMS_SLOT2BACKGROUND 1001 +#define IDC_RSCCOMMMENUITEMS_SLOT3BACKGROUND 1002 +#define IDC_RSCCOMMMENUITEMS_SLOT4BACKGROUND 1003 +#define IDC_RSCCOMMMENUITEMS_SLOT5BACKGROUND 1004 +#define IDC_RSCCOMMMENUITEMS_SLOT6BACKGROUND 1005 +#define IDC_RSCCOMMMENUITEMS_SLOT7BACKGROUND 1006 +#define IDC_RSCCOMMMENUITEMS_SLOT8BACKGROUND 1007 +#define IDC_RSCCOMMMENUITEMS_SLOT9BACKGROUND 1008 +#define IDC_RSCCOMMMENUITEMS_SLOT0BACKGROUND 1009 +#define IDC_RSCCOMMMENUITEMS_SLOT1TEXT 1010 +#define IDC_RSCCOMMMENUITEMS_SLOT1 1200 +#define IDC_RSCCOMMMENUITEMS_SLOT2 1201 +#define IDC_RSCCOMMMENUITEMS_SLOT3 1202 +#define IDC_RSCCOMMMENUITEMS_SLOT4 1203 +#define IDC_RSCCOMMMENUITEMS_SLOT5 1204 +#define IDC_RSCCOMMMENUITEMS_SLOT6 1205 +#define IDC_RSCCOMMMENUITEMS_SLOT7 1206 +#define IDC_RSCCOMMMENUITEMS_SLOT8 1207 +#define IDC_RSCCOMMMENUITEMS_SLOT9 1208 +#define IDC_RSCCOMMMENUITEMS_SLOT0 1209 +#define IDC_RSCCOMMMENUITEMS_SLOT2TEXT 1210 +#define IDC_RSCCOMMMENUITEMS_SLOT3TEXT 1211 +#define IDC_RSCCOMMMENUITEMS_SLOT4TEXT 1212 +#define IDC_RSCCOMMMENUITEMS_SLOT5TEXT 1213 +#define IDC_RSCCOMMMENUITEMS_SLOT6TEXT 1214 +#define IDC_RSCCOMMMENUITEMS_SLOT7TEXT 1215 +#define IDC_RSCCOMMMENUITEMS_SLOT8TEXT 1216 +#define IDC_RSCCOMMMENUITEMS_SLOT9TEXT 1217 +#define IDC_RSCCOMMMENUITEMS_SLOT0TEXT 1218 +#define IDC_RSCCOMMMENUITEMS_RSCCOMMMENUITEMS 2300 + +//--- RscRespawnCounter +#define IDC_RSCRESPAWNCOUNTER_MPTABLE 1000 +#define IDC_RSCRESPAWNCOUNTER_TITLE 1001 +#define IDC_RSCRESPAWNCOUNTER_TITLEBACKGROUND 1002 +#define IDC_RSCRESPAWNCOUNTER_PLAYERRESPAWNTIME 1003 +#define IDC_RSCRESPAWNCOUNTER_DESCRIPTION 1100 + +//--- RscFiringDrillTime +#define IDC_RSCFIRINGDRILLTIME_CURRENTBACKGROUND 1100 +#define IDC_RSCFIRINGDRILLTIME_BEST 1101 +#define IDC_RSCFIRINGDRILLTIME_PREVIOUS 1102 +#define IDC_RSCFIRINGDRILLTIME_BONUS 1103 +#define IDC_RSCFIRINGDRILLTIME_CURRENT 1104 +#define IDC_RSCFIRINGDRILLTIME_PENALTY 1105 +#define IDC_RSCFIRINGDRILLTIME_TIME 2300 + +//--- RscFiringDrillCheckpoint +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTBACKGROUND 1000 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETBACKGROUND 1001 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEBACKGROUND 1002 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONBACKGROUND 1003 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTTEXT 1004 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTTOTAL 1005 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTCURRENT 1006 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTPICTURE 1200 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEPICTURE 1201 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONPICTURE 1202 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETPICTURE 1203 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINT 2300 + +//--- RscAdvancedHint +#define IDC_RSCADVANCEDHINT_TITLE 11657 +#define IDC_RSCADVANCEDHINT_HINT 11757 +#define IDC_RSCADVANCEDHINT_HINTGROUP 12957 + +//--- RscSectorCapture +#define IDC_RSCSECTORCAPTURE_WEST 1001 +#define IDC_RSCSECTORCAPTURE_EAST 1002 +#define IDC_RSCSECTORCAPTURE_GUER 1003 +#define IDC_RSCSECTORCAPTURE_CIV 1004 +#define IDC_RSCSECTORCAPTURE_NAME 1005 +#define IDC_RSCSECTORCAPTURE_BACKGROUND 1200 +#define IDC_RSCSECTORCAPTURE_SECTORCAPTURE 2300 + +//--- RscMissionStatus +#define IDC_RSCMISSIONSTATUS_BARBRIDGE 13983 +#define IDC_RSCMISSIONSTATUS_BARWEST 13984 +#define IDC_RSCMISSIONSTATUS_BAREAST 13985 +#define IDC_RSCMISSIONSTATUS_BARGUER 13986 +#define IDC_RSCMISSIONSTATUS_BARCIV 13987 +#define IDC_RSCMISSIONSTATUS_BARUNKNOWN 13988 +#define IDC_RSCMISSIONSTATUS_SLOT1BACKGROUND 13989 +#define IDC_RSCMISSIONSTATUS_SLOT1PROGRESS 13990 +#define IDC_RSCMISSIONSTATUS_SLOT2BACKGROUND 13991 +#define IDC_RSCMISSIONSTATUS_SLOT2PROGRESS 13992 +#define IDC_RSCMISSIONSTATUS_SLOT3BACKGROUND 13993 +#define IDC_RSCMISSIONSTATUS_SLOT3PROGRESS 13994 +#define IDC_RSCMISSIONSTATUS_SLOT4BACKGROUND 13995 +#define IDC_RSCMISSIONSTATUS_SLOT4PROGRESS 13996 +#define IDC_RSCMISSIONSTATUS_SLOT5BACKGROUND 13997 +#define IDC_RSCMISSIONSTATUS_SLOT5PROGRESS 13998 +#define IDC_RSCMISSIONSTATUS_SLOT6BACKGROUND 13999 +#define IDC_RSCMISSIONSTATUS_SLOT6PROGRESS 14000 +#define IDC_RSCMISSIONSTATUS_SLOT7BACKGROUND 14001 +#define IDC_RSCMISSIONSTATUS_SLOT7PROGRESS 14002 +#define IDC_RSCMISSIONSTATUS_SLOT8BACKGROUND 14003 +#define IDC_RSCMISSIONSTATUS_SLOT8PROGRESS 14004 +#define IDC_RSCMISSIONSTATUS_SLOT9BACKGROUND 14005 +#define IDC_RSCMISSIONSTATUS_SLOT9PROGRESS 14006 +#define IDC_RSCMISSIONSTATUS_SLOT0BACKGROUND 14007 +#define IDC_RSCMISSIONSTATUS_SLOT0PROGRESS 14008 +#define IDC_RSCMISSIONSTATUS_SLOT1TEXT 14093 +#define IDC_RSCMISSIONSTATUS_SLOT2TEXT 14094 +#define IDC_RSCMISSIONSTATUS_SLOT3TEXT 14095 +#define IDC_RSCMISSIONSTATUS_SLOT4TEXT 14096 +#define IDC_RSCMISSIONSTATUS_SLOT5TEXT 14097 +#define IDC_RSCMISSIONSTATUS_SLOT6TEXT 14098 +#define IDC_RSCMISSIONSTATUS_SLOT7TEXT 14099 +#define IDC_RSCMISSIONSTATUS_SLOT8TEXT 14100 +#define IDC_RSCMISSIONSTATUS_SLOT9TEXT 14101 +#define IDC_RSCMISSIONSTATUS_SLOT0TEXT 14102 +#define IDC_RSCMISSIONSTATUS_SLOT1 14183 +#define IDC_RSCMISSIONSTATUS_SLOT2 14184 +#define IDC_RSCMISSIONSTATUS_SLOT3 14185 +#define IDC_RSCMISSIONSTATUS_SLOT4 14186 +#define IDC_RSCMISSIONSTATUS_SLOT5 14187 +#define IDC_RSCMISSIONSTATUS_SLOT6 14188 +#define IDC_RSCMISSIONSTATUS_SLOT7 14189 +#define IDC_RSCMISSIONSTATUS_SLOT8 14190 +#define IDC_RSCMISSIONSTATUS_SLOT9 14191 +#define IDC_RSCMISSIONSTATUS_SLOT0 14192 +#define IDC_RSCMISSIONSTATUS_RSCMISSIONSTATUS 15283 + +//--- RscFeedback +#define IDC_RSCFEEDBACK_RSCFEEDBACK 6455 + +//--- RscDisplayCommunityGuide +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_TITLE 29956 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_PLAYERSNAME 29957 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BRIEFINGNAME 29958 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_AUTHOR 29959 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWTEXT 30056 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWPICTURE 30156 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_GUIDELIST 30456 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWCONTROLSGROUP 31256 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONPLAY 31556 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONCANCEL 31656 + +//--- RscDisplayArsenal +#define IDC_RSCDISPLAYARSENAL_MOUSEAREA 899 +#define IDC_RSCDISPLAYARSENAL_MOUSEBLOCK 898 +#define IDC_RSCDISPLAYARSENAL_TABS 1800 +#define IDC_RSCDISPLAYARSENAL_FRAMELEFT 1801 +#define IDC_RSCDISPLAYARSENAL_FRAMERIGHT 1802 +#define IDC_RSCDISPLAYARSENAL_LINEICON 1803 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFT 1804 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFTSELECTED 1805 +#define IDC_RSCDISPLAYARSENAL_LINETABRIGHT 1806 +#define IDC_RSCDISPLAYARSENAL_ICON 900 +#define IDC_RSCDISPLAYARSENAL_ICONBACKGROUND 830 +#define IDC_RSCDISPLAYARSENAL_TAB 930 +#define IDC_RSCDISPLAYARSENAL_LIST 960 +#define IDC_RSCDISPLAYARSENAL_SORT 800 +#define IDC_RSCDISPLAYARSENAL_LISTDISABLED 860 +#define IDC_RSCDISPLAYARSENAL_LOAD 990 +#define IDC_RSCDISPLAYARSENAL_LOADCARGO 991 +#define IDC_RSCDISPLAYARSENAL_ARROWLEFT 992 +#define IDC_RSCDISPLAYARSENAL_ARROWRIGHT 993 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDLEFT 994 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDRIGHT 995 +#define IDC_RSCDISPLAYARSENAL_MESSAGE 996 + +#define IDC_RSCDISPLAYARSENAL_TAB_PRIMARYWEAPON 0 +#define IDC_RSCDISPLAYARSENAL_TAB_SECONDARYWEAPON 1 +#define IDC_RSCDISPLAYARSENAL_TAB_HANDGUN 2 +#define IDC_RSCDISPLAYARSENAL_TAB_UNIFORM 3 +#define IDC_RSCDISPLAYARSENAL_TAB_VEST 4 +#define IDC_RSCDISPLAYARSENAL_TAB_BACKPACK 5 +#define IDC_RSCDISPLAYARSENAL_TAB_HEADGEAR 6 +#define IDC_RSCDISPLAYARSENAL_TAB_GOGGLES 7 +#define IDC_RSCDISPLAYARSENAL_TAB_NVGS 8 +#define IDC_RSCDISPLAYARSENAL_TAB_BINOCULARS 9 +#define IDC_RSCDISPLAYARSENAL_TAB_MAP 10 +#define IDC_RSCDISPLAYARSENAL_TAB_GPS 11 +#define IDC_RSCDISPLAYARSENAL_TAB_RADIO 12 +#define IDC_RSCDISPLAYARSENAL_TAB_COMPASS 13 +#define IDC_RSCDISPLAYARSENAL_TAB_WATCH 14 +#define IDC_RSCDISPLAYARSENAL_TAB_FACE 15 +#define IDC_RSCDISPLAYARSENAL_TAB_VOICE 16 +#define IDC_RSCDISPLAYARSENAL_TAB_INSIGNIA 17 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMOPTIC 18 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMACC 19 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMMUZZLE 20 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMBIPOD 25 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAG 21 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOTHROW 22 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOPUT 23 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMISC 24 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAGALL 26 + +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONBACKGROUND 29489 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONTEXT 29589 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPON 30789 + +#define IDC_RSCDISPLAYARSENAL_INFO_INFOBACKGROUND 24515 +#define IDC_RSCDISPLAYARSENAL_INFO_INFONAME 24516 +#define IDC_RSCDISPLAYARSENAL_INFO_INFOAUTHOR 24517 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCBACKGROUND 24518 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCICON 24715 +#define IDC_RSCDISPLAYARSENAL_INFO_INFO 25815 + +#define IDC_RSCDISPLAYARSENAL_STATS_STATSBACKGROUND 27347 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT1 27348 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT2 27349 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT3 27350 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT4 27351 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT5 27352 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT1 27353 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT2 27354 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT3 27355 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT4 27356 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT5 27357 +#define IDC_RSCDISPLAYARSENAL_STATS_STATS 28644 + +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_CONTROLBAR 44046 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONSAVE 44146 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONLOAD 44147 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONEXPORT 44148 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONIMPORT 44149 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONRANDOM 44150 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONINTERFACE 44151 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONOK 44346 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONTRY 44347 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONCLOSE 44448 + +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TITLE 34619 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN1 34620 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEXTNAME 34621 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_MAINBACKGROUND 34622 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN2 34623 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN3 34624 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN4 34625 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN5 34626 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_EDITNAME 35020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_VALUENAME 35119 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEMPLATE 35919 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONOK 36019 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONCANCEL 36020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONDELETE 36021 + +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENALBACKGROUND 26603 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGEBACKGROUND 26604 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENAL 26803 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGE 26804 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACE 27903 + +//--- RscDisplayGarage +#define IDC_RSCDISPLAYGARAGE_TAB_CAR 0 +#define IDC_RSCDISPLAYGARAGE_TAB_ARMOR 1 +#define IDC_RSCDISPLAYGARAGE_TAB_HELI 2 +#define IDC_RSCDISPLAYGARAGE_TAB_PLANE 3 +#define IDC_RSCDISPLAYGARAGE_TAB_NAVAL 4 +#define IDC_RSCDISPLAYGARAGE_TAB_STATIC 5 + +#define IDC_RSCDISPLAYGARAGE_TAB_SUBCREW 18 //--- Match he numbers with Arsenal right panel IDCs +#define IDC_RSCDISPLAYGARAGE_TAB_SUBANIMATION 19 +#define IDC_RSCDISPLAYGARAGE_TAB_SUBTEXTURE 20 + +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBANIMATION 0 +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBTEXTURE 1 + +//--- RscDisplayCreateJIRAIssue +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BACKGROUND 29997 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATHTITLE 29998 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_TITLE 30097 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMISSION 30098 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMAP 30099 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONOBJECT 30100 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONEMPTY 30101 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATH 30397 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONCANCEL 31697 + +//--- RscDisplayDLCContentBrowser - main display +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLEBACKGROUND 37179 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MAINBACKGROUND 37180 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLE 37099 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_PLAYERSNAME 37100 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONCANCEL 38799 //MUF - todo - was exported, but not added to config +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_LISTGROUP 38400 +//--- RscDisplayDLCContentBrowser - General +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWBACKGROUND 37101 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWTEXT 37102 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TABSBACKGROUND 37106 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWDLCNAME 37137 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWPICTURE 37299 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_GENERALGROUP 38399 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONASSETS 38499 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONSINGLEPLAYER 38500 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONMULTIPLAYER 38501 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONFEATURES 38502 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONPURCHASE 38503 +//--- RscDisplayDLCContentBrowser - item template +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUND 37129 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUNDBLACK 37130 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMNAME 37131 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTSESSIONTIME 37132 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMSESSIONTIME 37133 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTTOTALTIME 37134 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTOTALTIME 37135 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMDESCRIPTION 37136 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPICTURE 37300 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPREMIUMICON 37311 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEMPLATE 38401 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONTRY 38504 +//--- RscDisplayDLCContentBrowser - dlc selection group +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSPURCHASED 37103 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIPURCHASED 37104 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENPURCHASED 37105 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSBACKGROUND 37108 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSNAME 37109 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIBACKGROUND 37110 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELINAME 37111 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENBACKGROUND 37112 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENNAME 37113 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEBACKGROUND 37114 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLENAME 37115 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSLOGO 37301 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELILOGO 37302 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENLOGO 37303 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLELOGO 37304 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSOVERLAY 37305 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIOVERLAY 37306 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENOVERLAY 37307 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEOVERLAY 37308 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCSELECTIONGROUP 38402 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXBACKGROUND 37116 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXNAME 37117 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXPURCHASED 37118 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXLOGO 37309 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXOVERLAY 37310 + + +//--- GroundSupport_ProcedureVisualization +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_PROGRESS 68374 +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_TEXT 68375 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 24691 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 24693 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 24694 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 24695 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 24891 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 24892 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 24893 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 24894 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 24895 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 24896 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 25991 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE3D 26091 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 26291 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 26391 + +//--- RscDisplayPurchaseNotification +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TITLE 46662 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TEXT 46663 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_DLCLIST 46762 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNPICTURE 46862 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNCONTROLSGROUP 47962 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_BUTTONOK 48262 + +//--- RscDiary +#define IDC_TASKTOOLTIP 47060 +#define IDC_TASKTOOLTIP_BACKGROUND 47061 +#define IDC_TASKTOOLTIP_TITLE 47062 +#define IDC_TASKTOOLTIP_SUBTITLE 47063 +#define IDC_TASKTOOLTIP_BUTTON 47064 +#define IDC_TASKTOOLTIP_ASSIGNEDICON 47065 +#define IDC_TASKTOOLTIP_ASSIGNEDCOUNTER 47066 + +//--- RscRespawnControlsGroup +#define IDC_RSCRESPAWNCONTROLS_RESPAWNCONTROLSGROUP 88800 +#define IDC_RSCRESPAWNCONTROLS_LOCBACKGROUND 88802 +#define IDC_RSCRESPAWNCONTROLS_ROLEBACKGROUND 88803 +#define IDC_RSCRESPAWNCONTROLS_GEARBACKGROUND 88804 +#define IDC_RSCRESPAWNCONTROLS_HEADERBACKGROUND 88801 +#define IDC_RSCRESPAWNCONTROLS_BUTTONSPECTATE 88811 +#define IDC_RSCRESPAWNCONTROLS_LOCLIST 88808 +#define IDC_RSCRESPAWNCONTROLS_ROLELIST 88809 +#define IDC_RSCRESPAWNCONTROLS_COUNTERTEXT 88826 +#define IDC_RSCRESPAWNCONTROLS_COUNTER 88806 +#define IDC_RSCRESPAWNCONTROLS_AUTORESPAWN 88830 +#define IDC_RSCRESPAWNCONTROLS_TEAMTEXT 88827 +#define IDC_RSCRESPAWNCONTROLS_TEAM 88805 +#define IDC_RSCRESPAWNCONTROLS_TICKETSTEXT 88828 +#define IDC_RSCRESPAWNCONTROLS_TICKETS 88807 +#define IDC_RSCRESPAWNCONTROLS_HEADERRESPAWNBUTTON 88829 +#define IDC_RSCRESPAWNCONTROLS_WARNING 88831 +#define IDC_RSCRESPAWNCONTROLS_COMBOLOADOUT 88813 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILS 88814 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDPRIMARYWEAPON 88822 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDSECONDARYWEAPON 88823 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDOPTICS 88824 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDITEM 88825 +#define IDC_RSCRESPAWNCONTROLS_PICTUREPRIMARYWEAPON 88815 +#define IDC_RSCRESPAWNCONTROLS_PICTURESECONDARYWEAPON 88816 +#define IDC_RSCRESPAWNCONTROLS_PICTUREOPTICS 88817 +#define IDC_RSCRESPAWNCONTROLS_PICTUREITEM 88818 +#define IDC_RSCRESPAWNCONTROLS_LOCTITLE 88819 +#define IDC_RSCRESPAWNCONTROLS_ROLETITLE 88820 +#define IDC_RSCRESPAWNCONTROLS_GEARTITLE 88821 +#define IDC_RSCRESPAWNCONTROLS_LOCDISABLED 88832 +#define IDC_RSCRESPAWNCONTROLS_ROLEDISABLED 88833 +#define IDC_RSCRESPAWNCONTROLS_LOADOUTDISABLED 88834 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSCONTROLSGROUP 88850 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDDETAILS 88851 +#define IDC_RSCRESPAWNCONTROLS_DETAILSTITLE 88852 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILSCLOSE 88853 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSLISTCONTROLSGROUP 88860 +#define IDC_RSCRESPAWNCONTROLS_DETAILSLIST 88861 + +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERBACKGROUND 88870 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERLEFT 88871 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERRIGHT 88872 + +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO 88874 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_TITLE 88875 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_OPTION 88876 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO 88877 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_TITLE 88878 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_OPTION 88879 + +//--- RscRevive +#define IDC_RSCREVIVE_REVIVEPROGRESSBACKGROUND 4817 +#define IDC_RSCREVIVE_REVIVEPROGRESS 4818 +#define IDC_RSCREVIVE_REVIVEKEYPROGRESS 4819 +#define IDC_RSCREVIVE_REVIVEBAR 4820 +#define IDC_RSCREVIVE_REVIVETEXT 4917 +#define IDC_RSCREVIVE_REVIVECOUNTDOWN 4918 +#define IDC_RSCREVIVE_REVIVEINFO 4919 +#define IDC_RSCREVIVE_REVIVEKEYBACKGROUND 4920 +#define IDC_RSCREVIVE_REVIVEKEY 4921 +#define IDC_RSCREVIVE_REVIVEMEDIKIT 5017 +#define IDC_RSCREVIVE_REVIVEMEDIKITPROGRESS 5018 +#define IDC_RSCREVIVE_REVIVEDEATH 5019 +#define IDC_RSCREVIVE_REVIVERESPAWN 6117 +#define IDC_RSCREVIVE_REVIVETEXT2 6118 + +//--- DynamicGroups +#define IDC_DYNAMICGROUPS_HEADER 9377 +#define IDC_DYNAMICGROUPS_BACKGROUNDMANAGE 9379 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAME 9380 +#define IDC_DYNAMICGROUPS_BACKGROUNDGROUPNAME 9381 +#define IDC_DYNAMICGROUPS_BACKGROUNDPLAYERS 9382 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDE 9383 +#define IDC_DYNAMICGROUPS_TEXTPLAYERCOUNT 9384 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCORE 9386 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAMEFILL 9387 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDEFILL 9388 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCOREFILL 9389 +#define IDC_DYNAMICGROUPS_TEXTPRIVATE 9390 +#define IDC_DYNAMICGROUPS_GROUPICON 9577 +#define IDC_DYNAMICGROUPS_PICTURESIDE 9578 +#define IDC_DYNAMICGROUPS_EDITGROUPNAME 9777 +#define IDC_DYNAMICGROUPS_LISTBOXGROUPS 9877 +#define IDC_DYNAMICGROUPS_LISTBOXMANAGE 9878 +#define IDC_DYNAMICGROUPS_LISTBOXPLAYERS 9880 +#define IDC_DYNAMICGROUPS_BUTTONJOIN 9977 +#define IDC_DYNAMICGROUPS_BUTTONCREATELEAVEKICK 9978 +#define IDC_DYNAMICGROUPS_BUTTONPROMOTEDISBAND 9979 +#define IDC_DYNAMICGROUPS_BUTTONINVITE 9980 +#define IDC_DYNAMICGROUPS_TABBUTTONGROUPS 9981 +#define IDC_DYNAMICGROUPS_TABBUTTONPLAYERS 9983 +#define IDC_DYNAMICGROUPS_SECTIONMANAGE 10677 +#define IDC_DYNAMICGROUPS_SECTIONGROUPS 10679 +#define IDC_DYNAMICGROUPS_CHECKBOXPRIVATE 11177 + +//--- RscHvtPhase +#define IDC_RSCHVTPHASE_PERSISTENT 6610 +#define IDC_RSCHVTPHASE_DYNAMIC 6611 +#define IDC_RSCHVTPHASE_DOWNLOADTITLE 6612 +#define IDC_RSCHVTPHASE_DOWNLOADCONTENT 6613 +#define IDC_RSCHVTPHASE_MULTIPLIER 6614 +#define IDC_RSCHVTPHASE_RANGEBACKGROUND 6615 +#define IDC_RSCHVTPHASE_TIMER 6616 +#define IDC_RSCHVTPHASE_PROGRESSBAR 6620 +#define IDC_RSCHVTPHASE_DOWNLOADSPEED 6621 +#define IDC_RSCHVTPHASE_RANGE 6810 +#define IDC_RSCHVTPHASE_CARRIERPICTURE 6811 +#define IDC_RSCHVTPHASE_DOWNLOAD 7910 + +//--- RscPhaseRules +#define IDC_RSCPHASERULES_PHASE1NUMBER 9131 +#define IDC_RSCPHASERULES_PHASE1TEXT 9132 +#define IDC_RSCPHASERULES_PHASE2TEXT 9133 +#define IDC_RSCPHASERULES_PHASE2NUMBER 9134 +#define IDC_RSCPHASERULES_PHASE3TEXT 9135 +#define IDC_RSCPHASERULES_PHASE3NUMBER 9136 +#define IDC_RSCPHASERULES_PHASE1INFO 9137 +#define IDC_RSCPHASERULES_PHASE2INFO 9138 +#define IDC_RSCPHASERULES_PHASE3INFO 9139 +#define IDC_RSCPHASERULES_PHASERULES 10431 + +//--- RscDisplayEGSpectator +#define IDD_RSCDISPLAYEGSPECTATOR 60492 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMETIMETEXT 42609 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMEPHASETEXT 48610 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBBACKGROUND 42611 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEATASK 42612 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEABACKGROUND 42613 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBTASK 42614 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLORBACKGROUND 42615 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLORBACKGROUND 42616 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLOR 42617 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLOR 42618 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEAPROGRESSGROUP 48909 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBPROGRESSGROUP 43910 +#define IDC_RSCDISPLAYEGSPECTATOR_MOUSEHANDLER 42989 +#define IDC_RSCDISPLAYEGSPECTATOR_TABS 43609 +#define IDC_RSCDISPLAYEGSPECTATOR_LIST 43109 +#define IDC_RSCDISPLAYEGSPECTATOR_LISTGROUP 43909 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESBACKGROUND 52610 +#define IDC_RSCDISPLAYEGSPECTATOR_FREE 52809 +#define IDC_RSCDISPLAYEGSPECTATOR_FOLLOW 52810 +#define IDC_RSCDISPLAYEGSPECTATOR_FPS 52811 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESGROUP 52909 +#define IDC_RSCDISPLAYEGSPECTATOR_MAP 62609 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPHEADER 62610 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPFOOTER 62611 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPTITLE 62612 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSCOUNT 62613 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSICON 62809 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPGROUP 63909 +#define IDC_RSCDISPLAYEGSPECTATOR_HELPBACKGROUND 72812 +#define IDC_RSCDISPLAYEGSPECTATOR_HELP 73189 +#define IDC_RSCDISPLAYEGSPECTATOR_UPPERBACKGROUND 82609 +#define IDC_RSCDISPLAYEGSPECTATOR_NAME 82610 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERLEFTBACKGROUND 82611 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERRIGHTBACKGROUND 82612 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATARBACKGROUND 82613 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS_COUNT 82614 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS_COUNT 82615 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS_COUNT 82616 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS_COUNT 82617 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS_COUNT 82618 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL_COUNT 82619 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATAR 82809 +#define IDC_RSCDISPLAYEGSPECTATOR_UNITTYPE 82810 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS 82811 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS 82812 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS 82813 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS 82814 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS 82815 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL 82816 +#define IDC_RSCDISPLAYEGSPECTATOR_WEAPONPICTURE 82817 +#define IDC_RSCDISPLAYEGSPECTATOR_VEHICLETYPE 82818 +#define IDC_RSCDISPLAYEGSPECTATOR_FOCUSINFO 83909 + +//--- RscEGProgress +#define IDC_RSCEGPROGRESS_DOWNLOADICONBACKGROUND 9170 +#define IDC_RSCEGPROGRESS_OBJECTIVELETTER 9171 +#define IDC_RSCEGPROGRESS_ACTIVITYBACKGROUND 9172 +#define IDC_RSCEGPROGRESS_PROGRESSBARBACKGROUND 9173 +#define IDC_RSCEGPROGRESS_TITLE 9174 +#define IDC_RSCEGPROGRESS_PROGRESSBAR 9180 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUND 9370 +#define IDC_RSCEGPROGRESS_ACTIVITY 9372 +#define IDC_RSCEGPROGRESS_DOWNLOADICON 9374 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUNDCOLOURED 9375 +#define IDC_RSCEGPROGRESS_DOWNLOAD 9376 + +//--- RscDisplayQuickPlay +#define IDC_RSCDISPLAYQUICKPLAY_TITLE 18702 +#define IDC_RSCDISPLAYQUICKPLAY_PLAYERSNAME 18703 +#define IDC_RSCDISPLAYQUICKPLAY_MODTEXT 18704 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENTBACKGROUND 18705 +#define IDC_RSCDISPLAYQUICKPLAY_MAXPINGTEXT 18706 +#define IDC_RSCDISPLAYQUICKPLAY_BESTMATCHTEXT 18707 +#define IDC_RSCDISPLAYQUICKPLAY_MODBACKGROUND 18708 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTION 18713 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLEBACKGROUND 18714 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLE 18715 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEOVERVIEW 18903 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTIONBACKGROUND 18904 +#define IDC_RSCDISPLAYQUICKPLAY_MODICON 18905 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENT 20002 +#define IDC_RSCDISPLAYQUICKPLAY_BUTTONBACK 20402 + +//--- RscDisplayCampaignLobby (Scripted campaign lobby) +#define IDD_CAMPAIGN_LOBBY 50000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_FULL_GROUP 51000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_GROUP 51100 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_LOADING_GROUP 51200 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_BORDER_GROUP 51300 +#define IDC_CAMPAIGN_LOBBY_TABLET_GROUP 52000 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_GROUP 52100 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SEARCH_GROUP 52200 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SETTINGS_GROUP 52300 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_RESPAWN_GROUP 52400 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_REVIVE_GROUP 52500 +#define IDC_CAMPAIGN_LOBBY_TABLET_MILITARY_GROUP 52600 +#define IDC_CAMPAIGN_LOBBY_MAIN_GROUP 53000 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_GROUP 53100 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_HEADER_GROUP 53200 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_STRUCTURE_GROUP 53300 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_CORE_GROUP 53400 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_GROUP 53500 +#define IDC_CAMPAIGN_LOBBY_LOGIN_GROUP 54100 +#define IDC_CAMPAIGN_LOBBY_ACCESS_KEY_GROUP 54200 +#define IDC_CAMPAIGN_LOBBY_MISSION_GROUP 54300 +#define IDC_CAMPAIGN_LOBBY_MISSION_VIDEO_GROUP 54400 +#define IDC_CAMPAIGN_LOBBY_MISSION_INTEL_GROUP 54500 +#define IDC_CAMPAIGN_LOBBY_MISSION_OVERLAY_GROUP 54600 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_CORE_GROUP 55000 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_GROUP 55100 +#define IDC_CAMPAIGN_LOBBY_PROGRESS_GROUP 56000 +#define IDC_CAMPAIGN_LOBBY_OVERLAY_GROUP 57000 + +// RscDisplayDLCContentBrowser +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTUREBACKGROUND 2000 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTURE 2001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEOGROUP 2002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEO 2003 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_ICON 2004 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEL 2005 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINER 2006 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINET 2007 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEB 2008 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_BUTTON 2009 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_TITLE 2010 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_HOVER 2011 + +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MOUSEAREA 999 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCGROUP 1001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCBACKGROUND 1002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONBACKGROUND 1003 + +//--- RscDisplayDLCPreview_List +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUND 31263 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOTITLE 31264 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUNDBOTTOM 31266 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFO 31363 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOSTATS 31364 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIM 31463 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURE 31464 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSEPREV 31465 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSENEXT 31466 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAY 31467 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAY 31468 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAYICON 31469 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAYICON 31470 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREBACKGROUND 31471 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMBACKGROUND 31472 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREGROUP 32563 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURELISTGROUP 32564 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOGROUP 32565 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONTRY 32663 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONPURCHASE 32664 + +//--- RscDisplayDLCPreview_ListItem +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SELECT 41883 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_HOVER 41884 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_PICTURE 42083 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SESSIONNOTIFICATION 42084 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BACKGROUND 42085 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BUTTON 42483 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_RSCDISPLAYDLCPREVIEW_LISTITEM 43183 + +//--- RscDisplayDLCPreview +#define IDC_RSCDISPLAYDLCPREVIEW_BACKGROUND 1001 +#define IDC_RSCDISPLAYDLCPREVIEW_LOGO 1002 +#define IDC_RSCDISPLAYDLCPREVIEW_OVERVIEW 1003 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWGROUP 1004 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWBACKGROUND 1005 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONBACKGROUND 1006 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONPURCHASE 1007 +#define IDC_RSCDISPLAYDLCPREVIEW_AUTHOR 1008 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTGROUP 1009 +#define IDC_RSCDISPLAYDLCPREVIEW_BOHEMIA 1010 + +//--- RscDisplayTimeline +#define IDD_RSCDISPLAYTIMELINE 15000 + +//--- RscDisplayTimeline +#define IDC_RSCDISPLAYTIMELINE_BACKGROUND 16985 +#define IDC_RSCDISPLAYTIMELINE_TEXTTIME 17085 +#define IDC_RSCDISPLAYTIMELINE_TEXTPLAYRATE 17086 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYFORWARD 17585 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYBACKWARD 17586 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPAUSE 17587 +#define IDC_RSCDISPLAYTIMELINE_BUTTONDECREASEPLAYRATE 17588 +#define IDC_RSCDISPLAYTIMELINE_BUTTONINCREASEPLAYRATE 17589 +#define IDC_RSCDISPLAYTIMELINE_LIST 18085 +#define IDC_RSCDISPLAYTIMELINE_TIMELINECONTROLS 18285 diff --git a/include/x/cba/addons/main/$PBOPREFIX$ b/include/x/cba/addons/main/$PBOPREFIX$ new file mode 100644 index 00000000000..835b0c9a07e --- /dev/null +++ b/include/x/cba/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +x\cba\addons\main \ No newline at end of file diff --git a/include/x/cba/addons/main/script_macros_common.hpp b/include/x/cba/addons/main/script_macros_common.hpp index 77feb5171e0..41a4faea756 100644 --- a/include/x/cba/addons/main/script_macros_common.hpp +++ b/include/x/cba/addons/main/script_macros_common.hpp @@ -51,21 +51,55 @@ #define MAINLOGIC main #endif +#define ADDON DOUBLES(PREFIX,COMPONENT) +#define MAIN_ADDON DOUBLES(PREFIX,main) + +/* ------------------------------------------- +Macro: VERSION_CONFIG + Define CBA Versioning System config entries. + + VERSION should be a floating-point number (1 separator). + VERSION_STR is a string representation of the version. + VERSION_AR is an array representation of the version. + + VERSION must always be defined, otherwise it is 0. + VERSION_STR and VERSION_AR default to VERSION if undefined. + +Parameters: + None + +Example: + (begin example) + #define VERSION 1.0 + #define VERSION_STR 1.0.1 + #define VERSION_AR 1,0,1 + + class CfgPatches { + class MyMod_main { + VERSION_CONFIG; + }; + }; + (end) + +Author: + ?, Jonpas +------------------------------------------- */ #ifndef VERSION #define VERSION 0 #endif +#ifndef VERSION_STR + #define VERSION_STR VERSION +#endif + #ifndef VERSION_AR #define VERSION_AR VERSION #endif #ifndef VERSION_CONFIG - #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION); versionAr[] = {VERSION_AR} + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION_STR); versionAr[] = {VERSION_AR} #endif -#define ADDON DOUBLES(PREFIX,COMPONENT) -#define MAIN_ADDON DOUBLES(PREFIX,main) - /* ------------------------------------------- Group: Debugging ------------------------------------------- */ @@ -775,7 +809,7 @@ Macro: ISNILS() // This only works for binarized configs after recompiling the pbos // TODO: Reduce amount of calls / code.. -#define COMPILE_FILE2_CFG_SYS(var1) compile preProcessFileLineNumbers var1 +#define COMPILE_FILE2_CFG_SYS(var1) compile preprocessFileLineNumbers var1 #define COMPILE_FILE2_SYS(var1) COMPILE_FILE2_CFG_SYS(var1) #define COMPILE_FILE_SYS(var1,var2,var3) COMPILE_FILE2_SYS('PATHTO_SYS(var1,var2,var3)') @@ -785,13 +819,13 @@ Macro: ISNILS() #define SETVARMAINS(var1) SETVARS(var1,MAINLOGIC) #define GVARMAINS(var1,var2) var1##_##var2 #define CFGSETTINGSS(var1,var2) configFile >> "CfgSettings" >> #var1 >> #var2 -//#define SETGVARS(var1,var2,var3) ##var1##_##var2##_##var3 = -//#define SETGVARMAINS(var1,var2) ##var1##_##var2 = +//#define SETGVARS(var1,var2,var3) var1##_##var2##_##var3 = +//#define SETGVARMAINS(var1,var2) var1##_##var2 = // Compile-Once, JIT: On first use. -// #define PREPMAIN_SYS(var1,var2,var3) ##var1##_fnc_##var3 = { ##var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call ##var1##_fnc_##var3 } else { _this call ##var1##_fnc_##var3 } } -// #define PREP_SYS(var1,var2,var3) ##var1##_##var2##_fnc_##var3 = { ##var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call ##var1##_##var2##_fnc_##var3 } else { _this call ##var1##_##var2##_fnc_##var3 } } -// #define PREP_SYS2(var1,var2,var3,var4) ##var1##_##var2##_fnc_##var4 = { ##var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call ##var1##_##var2##_fnc_##var4 } else { _this call ##var1##_##var2##_fnc_##var4 } } +// #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = { var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_fnc_##var3 } else { _this call var1##_fnc_##var3 } } +// #define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = { var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_##var2##_fnc_##var3 } else { _this call var1##_##var2##_fnc_##var3 } } +// #define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = { var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call var1##_##var2##_fnc_##var4 } else { _this call var1##_##var2##_fnc_##var4 } } // Compile-Once, at Macro. As opposed to Compile-Once, on first use. #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) @@ -890,6 +924,39 @@ Macro: GVARMAIN() #define SETVARMAIN SETVARMAINS(PREFIX) #define IFCOUNT(var1,var2,var3) if (count var1 > var2) then { var3 = var1 select var2 }; +/* ------------------------------------------- +Macro: PREP() + +Description: + Defines a function. + + Full file path: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + + Resulting function name: + 'PREFIX_COMPONENT_' + + The PREP macro should be placed in a script run by a XEH preStart and XEH preInit event. + + The PREP macro allows for CBA function caching, which drastically speeds up load times. + Beware though that function caching is enabled by default and as such to disable it, you need to + #define DISABLE_COMPILE_CACHE above your #include "script_components.hpp" include! + + The function will be defined in ui and mission namespace. It can not be overwritten without + a mission restart. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + PREP(banana); + call FUNC(banana); + (end) + +Author: + dixon13 + ------------------------------------------- */ //#define PREP(var1) PREP_SYS(PREFIX,COMPONENT_F,var1) #ifdef DISABLE_COMPILE_CACHE @@ -900,13 +967,6 @@ Macro: GVARMAIN() #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW #endif -#ifdef RECOMPILE - #undef RECOMPILE - #define RECOMPILE recompile = 1 -#else - #define RECOMPILE recompile = 0 -#endif - /* ------------------------------------------- Macro: PATHTO_FNC() @@ -916,6 +976,7 @@ Macro: PATHTO_FNC() Full file path in addons: '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' Define 'RECOMPILE' to enable recompiling. + Define 'SKIP_FUNCTION_HEADER' to skip adding function header. Parameters: FUNCTION NAME - Name of the function, unquoted @@ -936,8 +997,22 @@ Macro: PATHTO_FNC() Author: dixon13, commy2 ------------------------------------------- */ +#ifdef RECOMPILE + #undef RECOMPILE + #define RECOMPILE recompile = 1 +#else + #define RECOMPILE recompile = 0 +#endif +// Set function header type: -1 - no header; 0 - default header; 1 - system header. +#ifdef SKIP_FUNCTION_HEADER + #define CFGFUNCTION_HEADER headerType = -1 +#else + #define CFGFUNCTION_HEADER headerType = 0 +#endif + #define PATHTO_FNC(func) class func {\ file = QPATHTOF(DOUBLES(fnc,func).sqf);\ + CFGFUNCTION_HEADER;\ RECOMPILE;\ } @@ -1086,6 +1161,7 @@ Macros: IS_x() /* ------------------------------------------- Macro: SCRIPT() Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Define 'SKIP_SCRIPT_NAME' to skip adding scriptName. Parameters: NAME - Name of script [Indentifier] @@ -1098,8 +1174,11 @@ Macro: SCRIPT() Author: Spooner ------------------------------------------- */ -#define SCRIPT(NAME) \ - scriptName 'PREFIX\COMPONENT\NAME' +#ifndef SKIP_SCRIPT_NAME + #define SCRIPT(NAME) scriptName 'PREFIX\COMPONENT\NAME' +#else + #define SCRIPT(NAME) /* nope */ +#endif /* ------------------------------------------- Macros: EXPLODE_n() @@ -1707,7 +1786,8 @@ Macro: IS_ADMIN Author: commy2 ------------------------------------------- */ -#define IS_ADMIN serverCommandAvailable "#kick" +#define IS_ADMIN_SYS(x) x##kick +#define IS_ADMIN serverCommandAvailable 'IS_ADMIN_SYS(#)' /* ------------------------------------------- Macro: IS_ADMIN_LOGGED @@ -1727,7 +1807,8 @@ Macro: IS_ADMIN_LOGGED Author: commy2 ------------------------------------------- */ -#define IS_ADMIN_LOGGED serverCommandAvailable "#shutdown" +#define IS_ADMIN_LOGGED_SYS(x) x##shutdown +#define IS_ADMIN_LOGGED serverCommandAvailable 'IS_ADMIN_LOGGED_SYS(#)' /* ------------------------------------------- Macro: FILE_EXISTS diff --git a/include/x/cba/addons/xeh/$PBOPREFIX$ b/include/x/cba/addons/xeh/$PBOPREFIX$ new file mode 100644 index 00000000000..45339387f44 --- /dev/null +++ b/include/x/cba/addons/xeh/$PBOPREFIX$ @@ -0,0 +1 @@ +x\cba\addons\xeh \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/CfgAmmo.hpp b/optionals/compat_rhs_afrf3/CfgAmmo.hpp index deebfe92efa..e4645f3765e 100644 --- a/optionals/compat_rhs_afrf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_afrf3/CfgAmmo.hpp @@ -1,4 +1,3 @@ - class CfgAmmo { class BulletBase; class B_556x45_Ball; @@ -153,25 +152,11 @@ class CfgAmmo { ace_frag_skip = 0; ace_frag_force = 1; }; - class rhs_ammo_rgn_base: rhs_ammo_rgd5 { - ace_frag_enabled = 1; - ace_frag_metal = 193; - ace_frag_charge = 97; - ace_frag_gurney_c = 2800; - ace_frag_gurney_k = "3/5"; - ace_frag_classes[] = {"ACE_frag_tiny_HD"}; - ace_frag_skip = 0; - ace_frag_force = 1; - }; - class rhs_ammo_rgn: rhs_ammo_rgn_base { - // RGN is scripted grenade that deletes itself, which will break advanced throwing, replace with it's base - ace_advanced_throwing_replaceWith = "rhs_ammo_rgn_base"; + class rhs_ammo_rgn: rhs_ammo_rgd5 { ace_frag_enabled = 0; ace_frag_skip = 1; ace_frag_force = 0; }; - class rhs_ammo_rgn_sub: rhs_ammo_rgn_base {}; - class rhs_ammo_rgn_exp: rhs_ammo_rgn_base {}; class rhs_ammo_fakel: GrenadeHand { ace_frag_enabled = 0; ace_frag_skip = 1; @@ -205,7 +190,7 @@ class CfgAmmo { ace_frag_skip = 1; ace_frag_force = 0; }; - + class G_40mm_HE; class rhs_g_vog25: G_40mm_HE {}; class rhs_g_vg40tb: rhs_g_vog25 { //Thermobaric @@ -220,5 +205,53 @@ class CfgAmmo { class rhs_g_vg40md_white: rhs_g_vog25 { //Smoke ace_frag_force = 0; }; - + + // ACE Explosives + class MineBase; + class rhs_mine_tm62m_ammo: MineBase { + ace_explosives_defuseObjectPosition[] = {-0.005, 0.025, 0.06}; + }; + + class rhs_mine_pmn2_ammo: MineBase { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.012}; + }; + + class ATMine_Range_Ammo; + class rhs_ammo_ptm1: ATMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0.17, 0.02}; + }; + + class APERSMine_Range_Ammo; + class rhs_ammo_pfm1: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0.015, -0.018, 0}; + }; + + class PipeBombBase; + class rhs_ec75_ammo: PipeBombBase { + ace_explosives_defuseObjectPosition[] = {0, 0.04, 0.02}; + }; + + class rhs_ec200_ammo: rhs_ec75_ammo { + ace_explosives_defuseObjectPosition[] = {0, 0.05, 0.008}; + }; + + class rhs_ec400_ammo: rhs_ec75_ammo { + ace_explosives_defuseObjectPosition[] = {0, 0.03, 0.02}; + }; + + class rhs_mine_msk40p_white_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0.025, 0, 0.4}; + }; + + class rhs_mine_sm320_white_ammo: rhs_mine_msk40p_white_ammo { + ace_explosives_defuseObjectPosition[] = {0.01, 0, 0.25}; + }; + + class rhs_mine_ozm72_a_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, -0.125, 0.11}; + }; + + class rhs_mine_ozm72_c_ammo: rhs_mine_ozm72_a_ammo { + ace_explosives_defuseObjectPosition[] = {0, -0.015, 0.12}; + }; }; diff --git a/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp b/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp new file mode 100644 index 00000000000..4eb8f847795 --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp @@ -0,0 +1,18 @@ +#define CREATE_MAGAZINE_GROUP(ammo) class GVAR(ammo) { rhs_##ammo = 1; } +class ace_csw_groups { + CREATE_MAGAZINE_GROUP(mag_9M131M); + CREATE_MAGAZINE_GROUP(mag_9M131F); + CREATE_MAGAZINE_GROUP(mag_9m133); + CREATE_MAGAZINE_GROUP(mag_9m133f); + CREATE_MAGAZINE_GROUP(mag_9m1331); + CREATE_MAGAZINE_GROUP(mag_9m133m2); + CREATE_MAGAZINE_GROUP(mag_PG9V); + CREATE_MAGAZINE_GROUP(mag_PG9N); + CREATE_MAGAZINE_GROUP(mag_PG9VNT); + CREATE_MAGAZINE_GROUP(mag_OG9VM); + CREATE_MAGAZINE_GROUP(mag_OG9V); + CREATE_MAGAZINE_GROUP(mag_VOG30_30); + CREATE_MAGAZINE_GROUP(mag_GPD30_30); + CREATE_MAGAZINE_GROUP(mag_VOG17m_30); +}; + diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp index 1ce1a43b041..5a14b037fa5 100644 --- a/optionals/compat_rhs_afrf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_afrf3/CfgMagazines.hpp @@ -14,4 +14,281 @@ class cfgMagazines { class rhs_mag_127x108mm_1470 : rhs_mag_127x108mm_50 { ace_isbelt = 0; }; + class RHS_mag_VOG30_30: VehicleMagazine { + ace_isbelt = 1; + }; + class RHS_mag_GPD30_30: RHS_mag_VOG30_30 {}; + + // RHS magazines for crew handled ammo + class rhs_mag_9M131M; + class GVAR(mag_9M131M): rhs_mag_9M131M { + scope = 2; + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9M131F; + class GVAR(mag_9M131F): rhs_mag_9M131F { + scope = 2; + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m133; + class GVAR(mag_9m133): rhs_mag_9m133 { + scope = 2; + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m133f; + class GVAR(mag_9m133f): rhs_mag_9m133f { + scope = 2; + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m1331; + class GVAR(mag_9m1331): rhs_mag_9m1331 { + scope = 2; + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m133m2; + class GVAR(mag_9m133m2): rhs_mag_9m133m2 { + scope = 2; + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_PG9V; + class GVAR(mag_PG9V): rhs_mag_PG9V { + scope = 2; + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_PG9N; + class GVAR(mag_PG9N): rhs_mag_PG9N { + scope = 2; + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_PG9VNT; + class GVAR(mag_PG9VNT): rhs_mag_PG9VNT { + scope = 2; + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_OG9VM; + class GVAR(mag_OG9VM): rhs_mag_OG9VM { + scope = 2; + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_OG9V; + class GVAR(mag_OG9V): rhs_mag_OG9V { + scope = 2; + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + + class GVAR(mag_VOG30_30): RHS_mag_VOG30_30 { + scope = 2; + type = 256; + count = 30; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class GVAR(mag_GPD30_30): RHS_mag_GPD30_30 { + scope = 2; + type = 256; + count = 30; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class RHS_mag_VOG17m_30; + class GVAR(mag_VOG17m_30): RHS_mag_VOG17m_30 { + scope = 2; + type = 256; + count = 30; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + + // ACE Explosives + class ATMine_Range_Mag; + class rhs_mine_tm62m_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_tm62m"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.09; + }; + }; + }; + + class rhs_mine_pmn2_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_pmn2"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; + }; + + class rhs_mag_mine_ptm1: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ptm1"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.04; + }; + }; + }; + + class rhs_mag_mine_pfm1: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_pfm1"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; + }; + + class rhs_ec75_mag: ATMine_Range_Mag { + ace_explosives_DelayTime = 1; + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec75"; + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; + class Timer { + FuseTime = 0.5; + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; + }; + + class rhs_ec75_sand_mag: rhs_ec75_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec75_sand"; + }; + + class rhs_ec200_mag: rhs_ec75_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec200"; + }; + + class rhs_ec200_sand_mag: rhs_ec200_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec200_sand"; + }; + + class rhs_ec400_mag: rhs_ec75_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec400"; + }; + + class rhs_ec400_sand_mag: rhs_ec400_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec400_sand"; + }; + + class rhs_mine_msk40p_white_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_white"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.07; + }; + }; + }; + + class rhs_mine_msk40p_red_mag: rhs_mine_msk40p_white_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_red"; + }; + + class rhs_mine_msk40p_green_mag: rhs_mine_msk40p_white_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_green"; + }; + + class rhs_mine_msk40p_blue_mag: rhs_mine_msk40p_white_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_blue"; + }; + + class rhs_mine_sm320_white_mag: rhs_mine_msk40p_white_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_sm320_white"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.05; + }; + }; + }; + + class rhs_mine_sm320_red_mag: rhs_mine_sm320_white_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_sm320_red"; + }; + + class rhs_mine_sm320_green_mag: rhs_mine_sm320_white_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_sm320_green"; + }; + + class rhs_mine_ozm72_a_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ozm72_a"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.04; + }; + }; + }; + + class rhs_mine_ozm72_b_mag: rhs_mine_ozm72_a_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ozm72_b"; + }; + + class rhs_mine_ozm72_c_mag: rhs_mine_ozm72_a_mag { + ace_explosives_DelayTime = 1; + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ozm72_c"; + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + }; + }; }; diff --git a/optionals/compat_rhs_afrf3/CfgVehicles.hpp b/optionals/compat_rhs_afrf3/CfgVehicles.hpp index 068f22280c1..37b025ecc5f 100644 --- a/optionals/compat_rhs_afrf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_afrf3/CfgVehicles.hpp @@ -233,6 +233,17 @@ class CfgVehicles { position = ""; }; }; + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_SPG9); + magazineLocation = "_target selectionPosition 'breach'"; + disassembleWeapon = QGVAR(spg9_carry); + disassembleTurret = QEGVAR(csw,spg9Tripod); + desiredAmmo = 1; + ammoLoadTime = 5; + ammoUnloadTime = 3; + }; }; class rhs_Kornet_Base: AT_01_base_F { class ACE_Actions: ACE_Actions { @@ -241,10 +252,272 @@ class CfgVehicles { selection = "tripod"; }; }; + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_9K133_launcher); + magazineLocation = "_target selectionPosition 'gun'"; + disassembleWeapon = QGVAR(kornet_carry); + disassembleTurret = ""; + desiredAmmo = 1; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; }; class rhs_assault_umbts; class rhs_assault_umbts_engineer: rhs_assault_umbts { EGVAR(logistics_wirecutter,hasWirecutter) = 1; }; + + class StaticMortar: StaticWeapon {}; + class rhs_2b14_82mm_Base: StaticMortar { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = ""; // no good selections for this mortar + }; + }; + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + magazineLocation = ""; + proxyWeapon = QGVAR(rhs_weap_2b14); + disassembleWeapon = QGVAR(2b14_carry); // carry weapon [CfgWeapons] + disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles] + desiredAmmo = 1; + ammoLoadTime = 3; + ammoUnloadTime = 3; + }; + }; + + class rhs_nsv_tripod_base: StaticMGWeapon { + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_nsvt_effects); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(nsv_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + desiredAmmo = 50; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class RHS_KORD_Base: rhs_nsv_tripod_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_KORD); + disassembleWeapon = QGVAR(kord_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; + }; + + class RHS_KORD_high_base: RHS_KORD_Base { + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_KORD); + disassembleWeapon = QGVAR(kord_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + }; + }; + + class StaticGrenadeLauncher: StaticWeapon {}; + class RHS_AGS30_TriPod_base: StaticGrenadeLauncher { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_AGS30); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(ags30_carry); + disassembleTurret = QEGVAR(csw,sag30Tripod); + desiredAmmo = 30; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class rhs_SPG9M_base: rhs_SPG9_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleWeapon = QGVAR(spg9m_carry); + }; + }; + + class rhs_Metis_Base: AT_01_base_F { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_9K115_2_launcher); + magazineLocation = "_target selectionPosition 'gun'"; + disassembleWeapon = QGVAR(metis_carry); + disassembleTurret = ""; + desiredAmmo = 1; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + // ACE Explosives + class Items_base_F; + class ACE_Explosives_Place: Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + class ACE_Explosives_Place_rhs_mine_tm62m: ACE_Explosives_Place { + displayName = "$STR_RHS_CFGMAGAZINES_TM62M0"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_tm62m"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.005, -0.025, 0.06]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_pmn2: ACE_Explosives_Place { + displayName = "$STR_RHS_CFGMAGAZINES_PMN20"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_pmn2"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.012]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_ptm1: ACE_Explosives_Place { + displayName = "$STR_RHS_PTM1_NAME"; + model = "\rhsafrf\addons\rhs_airweapons\rhs_m_ptm1_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.17, 0.02]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_pfm1: ACE_Explosives_Place { + displayName = "$STR_RHS_PFM1_NAME"; + model = "\rhsafrf\addons\rhs_airweapons\rhs_m_pfm1_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.015, 0.018, 0]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_ec75: ACE_Explosives_Place { + displayName = "$STR_RHS_CFGMAGAZINES_EC75"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.04, 0.02]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_ec75_sand: ACE_Explosives_Place_rhs_ec75 { + displayName = "$STR_RHS_CFGMAGAZINES_EC75_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_sand_e"; + }; + + class ACE_Explosives_Place_rhs_ec200: ACE_Explosives_Place { + displayName = "$STR_RHS_CFGMAGAZINES_EC200"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.05, 0.008]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_ec200_sand: ACE_Explosives_Place_rhs_ec200 { + displayName = "$STR_RHS_CFGMAGAZINES_EC200_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_sand_e"; + }; + + class ACE_Explosives_Place_rhs_ec400: ACE_Explosives_Place { + displayName = "$STR_RHS_CFGMAGAZINES_EC400"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.03, 0.02]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_ec400_sand: ACE_Explosives_Place_rhs_ec400 { + displayName = "$STR_RHS_CFGMAGAZINES_EC400_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_sand_e"; + }; + + class ACE_Explosives_Place_rhs_mine_msk40p_white: ACE_Explosives_Place { + displayName = "$STR_RHS_MINE_MSK40P_W_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_white_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.025, 0, 0.4]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_msk40p_red: ACE_Explosives_Place_rhs_mine_msk40p_white { + displayName = "$STR_RHS_MINE_MSK40P_R_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_red_e"; + }; + + class ACE_Explosives_Place_rhs_mine_msk40p_green: ACE_Explosives_Place_rhs_mine_msk40p_white { + displayName = "$STR_RHS_MINE_MSK40P_G_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_green_e"; + }; + + class ACE_Explosives_Place_rhs_mine_msk40p_blue: ACE_Explosives_Place_rhs_mine_msk40p_white { + displayName = "$STR_RHS_MINE_MSK40P_B_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_blue_e"; + }; + + class ACE_Explosives_Place_rhs_mine_sm320_white: ACE_Explosives_Place { + displayName = "$STR_RHS_MINE_SM320_W_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_white_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.01, 0, 0.25]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_sm320_red: ACE_Explosives_Place_rhs_mine_sm320_white { + displayName = "$STR_RHS_MINE_SM320_R_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_red_e"; + }; + + class ACE_Explosives_Place_rhs_mine_sm320_green: ACE_Explosives_Place_rhs_mine_sm320_white { + displayName = "$STR_RHS_MINE_SM320_G_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_green_e"; + }; + + class ACE_Explosives_Place_rhs_mine_ozm72_a: ACE_Explosives_Place { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72A"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_a_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.125, 0.11]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_ozm72_b: ACE_Explosives_Place_rhs_mine_ozm72_a { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72B"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_b_e"; + }; + + class ACE_Explosives_Place_rhs_mine_ozm72_c: ACE_Explosives_Place_rhs_mine_ozm72_a { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72C"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_c_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.015, 0.12]"; + }; + }; + }; }; diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp index f09d1cc787c..fdfe7164e96 100644 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -1,13 +1,12 @@ - class CfgWeapons { - + class NVGoggles; class rhs_1PN138: NVGoggles { // Monocular modelOptics = ""; EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); EGVAR(nightvision,bluRadius) = 0.13; }; - + class hgun_Rook40_F; class rhs_weap_pya: hgun_Rook40_F { ACE_barrelTwist = 254.0; @@ -86,7 +85,7 @@ class CfgWeapons { ACE_ScopeAdjust_VerticalIncrement = 0.5; ACE_ScopeAdjust_HorizontalIncrement = 0.5; }; - class rhs_acc_pso1m21: rhs_acc_sniper_base { + class rhs_acc_pso1m21: rhs_acc_pso1m2 { ACE_ScopeHeightAboveRail = 7.75566; ACE_ScopeAdjust_Vertical[] = {0, 0}; ACE_ScopeAdjust_Horizontal[] = {-10, 10}; @@ -110,7 +109,10 @@ class CfgWeapons { }; }; }; - class Launcher_Base_F; + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; class rhs_weap_rpg7: Launcher_Base_F { ace_reloadlaunchers_enabled = 1; }; @@ -126,6 +128,17 @@ class CfgWeapons { class rhs_zsh7a: H_HelmetB { HEARING_PROTECTION_VICCREW }; + class rhs_zsh7a_alt: rhs_zsh7a { + ACE_Protection = 1; + }; + class rhs_zsh7a_mike; + class rhs_zsh7a_mike_alt: rhs_zsh7a_mike { + ACE_Protection = 1; + }; + class rhs_zsh7a_mike_green; + class rhs_zsh7a_mike_green_alt: rhs_zsh7a_mike_green { + ACE_Protection = 1; + }; class rhs_gssh18: H_HelmetB { HEARING_PROTECTION_EARMUFF @@ -141,4 +154,182 @@ class CfgWeapons { ace_overpressure_range = 15; ace_overpressure_damage = 0.5; }; + + CREATE_CSW_PROXY(rhs_weap_2b14); + CREATE_CSW_PROXY(rhs_weap_nsvt_effects); + CREATE_CSW_PROXY(rhs_weap_KORD); + CREATE_CSW_PROXY(RHS_weap_AGS30); + CREATE_CSW_PROXY(rhs_weap_SPG9); + CREATE_CSW_PROXY(rhs_weap_9K133_launcher); + CREATE_CSW_PROXY(rhs_weap_9K115_2_launcher); + + class GVAR(2b14_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + class assembleTo { + EGVAR(csw,mortarBaseplate) = "rhs_2b14_82mm_msv"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. + // Required, because the inventory icon has no accessory variants. + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 670; // 2B14 Mortar Weight + }; + displayName = ECSTRING(CSW,2b14_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_2b14_82mm_msv_ca.paa"; + }; + + class GVAR(nsv_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,kordTripodLow) = "RHS_NSV_TriPod_MSV"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 550; + }; + displayName = ECSTRING(CSW,nsv_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\RHS_NSV_TriPod_MSV_ca.paa"; + }; + + class GVAR(kord_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,kordTripod) = "rhs_KORD_high_MSV"; + EGVAR(csw,kordTripodLow) = "rhs_KORD_MSV"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 550; + }; + displayName = ECSTRING(CSW,kord_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_KORD_MSV_ca.paa"; + }; + + class GVAR(ags30_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,sag30Tripod) = "RHS_AGS30_TriPod_MSV"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 400; // https://odin.tradoc.army.mil/mediawiki/index.php/AGS-17_Russian_30mm_Automatic_Grenade_Launcher + }; + displayName = ECSTRING(CSW,ags30_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\RHS_AGS30_TriPod_MSV_ca.paa"; + }; + + class GVAR(spg9_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,spg9Tripod) = "rhs_SPG9_INS"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 1000; + }; + displayName = ECSTRING(csw,spg9_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_SPG9_INS_ca.paa"; + }; + + class GVAR(spg9m_carry): GVAR(spg9_carry) { + class ACE_CSW: ACE_CSW { + class assembleTo { + EGVAR(csw,spg9Tripod) = "rhs_SPG9M_MSV"; + }; + }; + displayName = ECSTRING(csw,spg9m_tube); + author = ECSTRING(common,ACETeam); + }; + + class GVAR(metis_carry): Launcher_Base_F { + class ACE_CSW { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = "rhs_Metis_9k115_2_msv"; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 300; + }; + displayName = ECSTRING(csw,metis_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Metis_9k115_2_msv_ca.paa"; + }; + + class GVAR(kornet_carry): Launcher_Base_F { + class ACE_CSW { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = "rhs_Kornet_9M133_2_msv"; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 600; + }; + displayName = ECSTRING(csw,kornet_launcher); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Kornet_9M133_2_msv_ca.paa"; + }; }; diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp index b7cfe3f233f..d6c08267d59 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" class CfgPatches { class ADDON { @@ -6,7 +7,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_rearm", "ace_refuel", "ace_repair", "rhs_c_weapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_trucks", "rhs_c_2s3", "rhs_c_rva", "rhs_c_heavyweapons"}; + requiredAddons[] = {"ace_explosives", "ace_csw", "ace_rearm", "ace_refuel", "ace_repair", "rhs_c_weapons", "rhs_c_airweapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_trucks", "rhs_c_2s3", "rhs_c_rva", "rhs_c_heavyweapons"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; url = ECSTRING(main,URL); @@ -19,3 +20,4 @@ class CfgPatches { #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" +#include "CfgMagazineGroups.hpp" diff --git a/optionals/compat_rhs_gref3/CfgAmmo.hpp b/optionals/compat_rhs_gref3/CfgAmmo.hpp index e43ab2c6928..fcc09a5ba9d 100644 --- a/optionals/compat_rhs_gref3/CfgAmmo.hpp +++ b/optionals/compat_rhs_gref3/CfgAmmo.hpp @@ -28,4 +28,87 @@ class CfgAmmo { ACE_muzzleVelocities[]={785, 800, 815}; ACE_barrelLengths[]={508.0, 599.948, 660.4}; }; + + // ACE Explosives + class APERSMine_Range_Ammo; + class rhs_mine_a200_bz_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.035}; + }; + + class rhs_mine_a200_dz35_ammo: rhs_mine_a200_bz_ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.02}; + }; + + class rhs_mine_glasmine43_hz_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.015}; + }; + + class rhs_mine_glasmine43_bz_ammo: rhs_mine_glasmine43_hz_ammo { + ace_minedetector_detectable = 0; + }; + + class rhs_mine_bounding_trigger_base; + class rhs_mine_m2a3b_press_ammo: rhs_mine_bounding_trigger_base { + ace_explosives_defuseObjectPosition[] = {0, 0.046, 0.02}; + }; + + class rhs_mine_m2a3b_trip_ammo: rhs_mine_m2a3b_press_ammo { + ace_explosives_defuseObjectPosition[] = {0, 0.046, 0.055}; + }; + + class rhs_mine_M3_pressure_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.015}; + }; + + class rhs_mine_M3_tripwire_ammo: rhs_mine_M3_pressure_ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.055}; + }; + + class ATMine_Range_Ammo; + class rhs_mine_TM43_ammo: ATMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.072}; + }; + + class rhs_mine_M7A2_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.067}; + }; + + class rhs_mine_Mk2_pressure_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.02}; + }; + + class rhs_mine_Mk2_tripwire_ammo: rhs_mine_Mk2_pressure_ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.055}; + }; + + class APERSBoundingMine_Range_Ammo; + class rhs_mine_smine35_press_ammo: APERSBoundingMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.03}; + }; + + class rhs_mine_smine35_trip_ammo: rhs_mine_bounding_trigger_base { + ace_explosives_defuseObjectPosition[] = {0, 0, 0.04}; + }; + + class rhs_mine_smine44_trip_ammo: rhs_mine_smine35_trip_ammo { + ace_explosives_defuseObjectPosition[] = {-0.03, 0, 0.015}; + }; + + class rhs_mine_smine44_press_ammo: APERSBoundingMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {-0.02, 0, 0.02}; + }; + + class APERSTripMine_Wire_Ammo; + class rhs_mine_stockmine43_2m_ammo: APERSTripMine_Wire_Ammo { + ace_explosives_defuseObjectPosition[] = {-1, 0, 0.25}; + }; + + class rhs_mine_stockmine43_4m_ammo: rhs_mine_stockmine43_2m_ammo { + ace_explosives_defuseObjectPosition[] = {-2, 0, 0.25}; + }; + + class DemoCharge_Remote_Ammo; + class rhs_charge_M2tet_x2_ammo: DemoCharge_Remote_Ammo { + ace_explosives_defuseObjectPosition[] = {0.095, 0, 0.055}; + }; }; diff --git a/optionals/compat_rhs_gref3/CfgMagazines.hpp b/optionals/compat_rhs_gref3/CfgMagazines.hpp index f5e84fca6ca..1f166ed1b2f 100644 --- a/optionals/compat_rhs_gref3/CfgMagazines.hpp +++ b/optionals/compat_rhs_gref3/CfgMagazines.hpp @@ -6,4 +6,199 @@ class CfgMagazines { class rhsgref_296Rnd_792x57_SmE_belt: CA_Magazine { ACE_isBelt = 1; }; + + // ACE Explosives + class APERSMine_Range_Mag; + class rhs_mine_a200_bz_mag: APERSMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_a200_bz"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.05; + }; + }; + }; + + class rhs_mine_a200_dz35_mag: rhs_mine_a200_bz_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_a200_dz35"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.04; + }; + }; + }; + + class rhs_mine_glasmine43_hz_mag: APERSMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_glasmine43_hz"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.01; + }; + }; + }; + + class rhs_mine_glasmine43_bz_mag: rhs_mine_glasmine43_hz_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_glasmine43_bz"; + }; + + class APERSBoundingMine_Range_Mag; + class rhs_mine_m2a3b_press_mag: APERSBoundingMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m2a3b_press"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.185; + }; + }; + }; + + class rhs_mine_m2a3b_trip_mag: rhs_mine_m2a3b_press_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m2a3b_trip"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.13; + }; + }; + }; + + class rhs_mine_m3_pressure_mag: APERSMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m3_pressure"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = -0.015; + }; + }; + }; + + class APERSTripMine_Wire_Mag; + class rhs_mine_M3_tripwire_mag: APERSTripMine_Wire_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_M3_tripwire"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0; + }; + }; + }; + + class ATMine_Range_Mag; + class rhs_mine_TM43_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_TM43"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.057; + }; + }; + }; + + class rhs_mine_M7A2_mag: APERSMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_M7A2"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.062; + }; + }; + }; + + class rhs_mine_mk2_pressure_mag: APERSMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_mk2_pressure"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; + }; + + class rhs_mine_Mk2_tripwire_mag: APERSTripMine_Wire_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_Mk2_tripwire"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0; + }; + }; + }; + + class rhs_mine_smine35_press_mag: APERSBoundingMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine35_press"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.18; + }; + }; + }; + + class rhs_mine_smine35_trip_mag: rhs_mine_smine35_press_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine35_trip"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0; + }; + }; + }; + + class rhs_mine_smine44_trip_mag: APERSBoundingMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine44_trip"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0; + }; + }; + }; + + class rhs_mine_smine44_press_mag: rhs_mine_smine44_trip_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine44_press"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.175; + }; + }; + }; + + class rhs_mine_stockmine43_2m_mag: APERSTripMine_Wire_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_stockmine43_2m"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.25; + }; + }; + }; + + class rhs_mine_stockmine43_4m_mag: rhs_mine_stockmine43_2m_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_stockmine43_4m"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.25; + }; + }; + }; + + class DemoCharge_Remote_Mag; + class rhs_charge_M2tet_x2_mag: DemoCharge_Remote_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_charge_M2tet_x2"; + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; + class Timer { + FuseTime = 0.5; + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; + }; }; diff --git a/optionals/compat_rhs_gref3/CfgVehicles.hpp b/optionals/compat_rhs_gref3/CfgVehicles.hpp index 3ac81df2fe3..34758110ae4 100644 --- a/optionals/compat_rhs_gref3/CfgVehicles.hpp +++ b/optionals/compat_rhs_gref3/CfgVehicles.hpp @@ -4,4 +4,218 @@ class CfgVehicles { // Canoes are propelled by paddlers EGVAR(refuel,canReceive) = 0; }; + + class StaticMGWeapon; + class rhs_DSHKM_base: StaticMGWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_DSHKM); + magazineLocation = "_target selectionPosition 'otocvez'"; + disassembleWeapon = QGVAR(dshkm_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + desiredAmmo = 50; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + class rhs_DSHkM_Mini_TriPod_base: rhs_DSHKM_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; + }; + + // ACE Explosives + class Items_base_F; + class ACE_Explosives_Place: Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + class ACE_Explosives_Place_rhs_mine_a200_bz: ACE_Explosives_Place { + displayName = "Beh.Schu.Mi.A200 (B.Z.) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\A200\A200_BZ_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.095]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_a200_dz35: ACE_Explosives_Place_rhs_mine_a200_bz { + displayName = "Beh.Schu.Mi.A200 (D.Z.35) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\A200\A200_DZ35_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.125]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_glasmine43_hz: ACE_Explosives_Place { + displayName = "Gl.Mi.43 (H.Z.44) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Glasmine43\GLMI43_HZ_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.105]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_glasmine43_bz: ACE_Explosives_Place_rhs_mine_glasmine43_hz { + displayName = "Gl.Mi.43 (B.Z.) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Glasmine43\GLMI43_BZ_ITEM"; + }; + + class ACE_Explosives_Place_rhs_mine_m2a3b_press: ACE_Explosives_Place { + displayName = "M2A3B APB Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M2A3B\M2A3_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.052, 0, 0.225]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_m2a3b_trip: ACE_Explosives_Place_rhs_mine_m2a3b_press { + displayName = "M2A3B (Tripwire) APB Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M2A3B\M2A3_HELPER_TRIPWIRE"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.046, 0.06]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_m3_pressure: ACE_Explosives_Place { + displayName = "M3 AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M3\M3_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.23]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_M3_tripwire: ACE_Explosives_Place_rhs_mine_m3_pressure { + displayName = "M3 (Tripwire) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M3\M6M7FUZE_HELPER_TRIPWIRE"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.055]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_TM43: ACE_Explosives_Place { + displayName = "Tellermine 43"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\TM43\TM43"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.072]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_M7A2: ACE_Explosives_Place { + displayName = "M7A2 AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M7A2\M7A2_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.066]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_mk2_pressure: ACE_Explosives_Place { + displayName = "Mk 2 AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\MKII_BOOBYTRAP\MKII_TRAP_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.09, 0, 0.011]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_Mk2_tripwire: ACE_Explosives_Place { + displayName = "Mk 2 (Tripwire) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M3\M6M7FUZE_HELPER_TRIPWIRE"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.055]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_smine35_press: ACE_Explosives_Place { + displayName = "S.Mi.35 (S.Mi.Z.35) APB Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Smine35\SMI35_ITEM_PRESS"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.217]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_smine35_trip: ACE_Explosives_Place { + displayName = "S.Mi.35 (W) APB Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Smine35\SMI35_HELPER_TRIP"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.02]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_smine44_trip: ACE_Explosives_Place { + displayName = "S.Mi.44 (W) APB Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Smine44\SMI44_HELPER_TRIP"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.03, 0, 0.015]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_smine44_press: ACE_Explosives_Place { + displayName = "S.Mi.44 (S.Mi.Z.44) APB Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Smine44\SMI44_ITEM_PRESS"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.02, 0, 0.21]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_stockmine43_2m: ACE_Explosives_Place { + displayName = "St.Mi.43/I (2m) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Stockmine43\STMI43_HELPER_2M"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[1, 0, 0.25]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_mine_stockmine43_4m: ACE_Explosives_Place { + displayName = "St.Mi.43/II (4m) AP Mine"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\Stockmine43\STMI43_HELPER_4M"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[2, 0, 0.25]"; + }; + }; + }; + + class ACE_Explosives_Place_rhs_charge_M2tet_x2: ACE_Explosives_Place { + displayName = "Tetrytol Charge (2.5lb Placed)"; + model = "\rhsgref\addons\rhsgref_weapons2\mines\M2_TETRYTOL_x2\M2TET_x2_ITEM"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.125, 0, 0.055]"; + }; + }; + }; }; diff --git a/optionals/compat_rhs_gref3/CfgWeapons.hpp b/optionals/compat_rhs_gref3/CfgWeapons.hpp index d851d598e06..868fffc69b4 100644 --- a/optionals/compat_rhs_gref3/CfgWeapons.hpp +++ b/optionals/compat_rhs_gref3/CfgWeapons.hpp @@ -1,84 +1,151 @@ - class CfgWeapons { class rhs_weap_kar98k_Base_F; class rhs_weap_kar98k: rhs_weap_kar98k_Base_F { - ACE_barrelTwist=240; - ACE_barrelLength=600; + ACE_barrelTwist = 240; + ACE_barrelLength = 600; }; class rhs_weap_m38_Base_F; class rhs_weap_m38: rhs_weap_m38_Base_F { - ACE_barrelTwist=250; - ACE_barrelLength=315; + ACE_barrelTwist = 250; + ACE_barrelLength = 315; }; class rhs_weap_m38_rail; class rhs_weap_mosin_sbr: rhs_weap_m38_rail { - ACE_barrelTwist=240; - ACE_barrelLength=254; + ACE_barrelTwist = 240; + ACE_barrelLength = 254; }; class rhs_weap_m70_base; class rhs_weap_m70ab2: rhs_weap_m70_base { - ACE_barrelTwist=240; - ACE_barrelLength=415; + ACE_barrelTwist = 240; + ACE_barrelLength = 415; }; class rhs_weap_m92: rhs_weap_m70_base { - ACE_barrelTwist=240; - ACE_barrelLength=254; + ACE_barrelTwist = 240; + ACE_barrelLength = 254; }; class rhs_weap_m76: rhs_weap_m70_base { - ACE_barrelTwist=250; - ACE_barrelLength=200; + ACE_barrelTwist = 250; + ACE_barrelLength = 200; }; class rhs_weap_m21_base; class rhs_weap_m21: rhs_weap_m21_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=460; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 460; }; class rhs_weap_m21a: rhs_weap_m21_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=290; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 290; }; class rhs_weap_m21a_pr: rhs_weap_m21_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=290; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 290; }; class rhs_weap_m21a_pr_pbg40: rhs_weap_m21_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=290; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 290; }; class rhs_weap_m21s: rhs_weap_m21_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=375; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 375; }; class rhs_weap_m21s_pr: rhs_weap_m21a_pr { - ACE_barrelTwist=177.8; - ACE_barrelLength=375; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 375; }; class Rifle_Base_F; - class rhs_weap_savz58_base : Rifle_Base_F { - ACE_barrelTwist=240; - ACE_barrelLength=390; + class rhs_weap_savz58_base: Rifle_Base_F { + ACE_barrelTwist = 240; + ACE_barrelLength = 390; }; class rhs_weap_stgw57_base; class rhs_weap_stgw57: rhs_weap_stgw57_base { - ACE_barrelTwist=270; - ACE_barrelLength=583; + ACE_barrelTwist = 270; + ACE_barrelLength = 583; }; class rhs_weap_g36_base; class rhs_weap_g36c: rhs_weap_g36_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=228.6; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 228.6; }; class rhs_weap_g36kv: rhs_weap_g36_base { - ACE_barrelTwist=177.8; - ACE_barrelLength=317.5; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 317.5; }; class Rifle_Long_Base_F; class rhs_weap_m84: Rifle_Long_Base_F { ACE_Overheating_allowSwapBarrel = 1; - ACE_barrelTwist=240; - ACE_barrelLength=658; + ACE_barrelTwist = 240; + ACE_barrelLength = 658; + }; + class rhs_weap_vhs2_base; + class rhs_weap_vhsd2: rhs_weap_vhs2_base { + ACE_barrelTwist = 177.8; + ACE_barrelLength = 500.0; + }; + class rhs_weap_vhsk2: rhs_weap_vhsd2 { + ACE_barrelTwist = 177.8; + ACE_barrelLength = 410.0; + }; + class rhs_weap_vhsd2_ct15x: rhs_weap_vhsk2 { + ACE_barrelTwist = 177.8; + ACE_barrelLength = 500.0; + }; + class rhs_weap_vhsd2_bg: rhs_weap_vhsd2_ct15x { + ACE_barrelTwist = 177.8; + ACE_barrelLength = 500.0; + }; + class rhs_weap_fnfal_base; + class rhs_weap_l1a1_base: rhs_weap_fnfal_base { + ACE_barrelTwist = 302.26; + ACE_barrelLength = 554.4; }; class rhs_weap_mg42_base: Rifle_Base_F { ACE_Overheating_allowSwapBarrel = 1; + ACE_barrelTwist = 305.0; + ACE_barrelLength = 530.0; + }; + class rhs_weap_MP44_base: Rifle_Base_F { + ACE_barrelTwist = 240.0; + ACE_barrelLength = 420.0; + }; + class rhs_weap_m3a1_base: Rifle_Base_F { + ACE_barrelTwist = 406.0; + ACE_barrelLength = 203.2; + }; + class rhs_weap_M1garand_Base_F: Rifle_Base_F { + ACE_barrelTwist = 254.0; + ACE_barrelLength = 610.0; + }; + + CREATE_CSW_PROXY(rhs_weap_DSHKM); + + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + class GVAR(dshkm_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,kordTripod) = "rhsgref_ins_DSHKM"; + EGVAR(csw,kordTripodLow) = "rhsgref_ins_DSHKM_Mini_TriPod"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. + // Required, because the inventory icon has no accessory variants. + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 740; + }; + displayName = ECSTRING(csw,dshk_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\mapico\icomap_DShKM_CA.paa"; }; }; diff --git a/optionals/compat_rhs_gref3/config.cpp b/optionals/compat_rhs_gref3/config.cpp index a8f8e147735..bc001ceb4c2 100644 --- a/optionals/compat_rhs_gref3/config.cpp +++ b/optionals/compat_rhs_gref3/config.cpp @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" class CfgPatches { class ADDON { @@ -6,7 +7,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"rhsgref_main", "rhsgref_c_weapons"}; + requiredAddons[] = {"ace_explosives", "ace_csw", "rhsgref_main", "rhsgref_c_weapons"}; author = ECSTRING(common,ACETeam); authors[] = {"PabstMirror", "Ruthberg", "Anton"}; url = ECSTRING(main,URL); diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/optionals/compat_rhs_usf3/CfgAmmo.hpp index cb1ba9ded14..f2541bc8f41 100644 --- a/optionals/compat_rhs_usf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_usf3/CfgAmmo.hpp @@ -1,4 +1,3 @@ - class CfgAmmo { class BulletBase; class B_127x99_Ball; @@ -136,17 +135,18 @@ class CfgAmmo { ACE_muzzleVelocities[] = {875, 910, 930, 945}; ACE_barrelLengths[] = {330.2, 406.4, 508.0, 609.6}; }; - class rhs_ammo_46x30_FMJ: rhs_ammo_556x45_M855A1_Ball { // RUAG Ammotec - ACE_caliber = 4.65; + class rhs_ammo_46x30_FMJ: rhs_ammo_556x45_M855A1_Ball { // RUAG Ammotec: https://www.heckler-koch.com/en/products/military/submachine-guns/mp7a1/mp7a2/ammunition.html + ACE_caliber = 4.65; // https://bobp.cip-bobp.org/uploads/tdcc/tab-i/4-6-x-30-en.pdf ACE_bulletLength = 21; ACE_bulletMass = 2.6; ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[] = {0.171}; + ACE_ballisticCoefficients[] = {0.089}; ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ICAO"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {620}; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {621}; // at 21°C, 620 m/s at 15°C according with the 4.6x30 FMJ magazine initSpeed ACE_barrelLengths[] = {180}; + airFriction = -0.002635; // default RHS value -0.0027667 }; class rhs_ammo_46x30_JHP: rhs_ammo_46x30_FMJ { // RUAG Ammotec ACE_caliber = 4.65; @@ -157,8 +157,9 @@ class CfgAmmo { ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 1; - ACE_muzzleVelocities[] = {690}; + ACE_muzzleVelocities[] = {691}; // at 21°C, 690 m/s at 15°C according with the 4.6x30 JHP magazine initSpeed ACE_barrelLengths[] = {180}; + airFriction = -0.003723; // default RHS value -0.00348301 }; class rhs_ammo_46x30_AP: rhs_ammo_46x30_FMJ { // RUAG Ammotec ACE_caliber = 4.65; @@ -169,8 +170,9 @@ class CfgAmmo { ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 1; - ACE_muzzleVelocities[] = {680}; + ACE_muzzleVelocities[] = {681}; // at 21°C, 680 m/s at 15°C according with the 4.6x30 AP magazine initSpeed ACE_barrelLengths[] = {180}; + airFriction = -0.003045; // default RHS value -0.00266241 }; class rhs_ammo_45ACP_MHP: BulletBase { // B_45ACP_Ball (ballistics/CfgAmmo.hpp) ACE_caliber = 11.481; @@ -243,6 +245,7 @@ class CfgAmmo { // Attack profile type selection defaultAttackProfile = "JAV_TOP"; attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; + useModeForAttackProfile = 1; }; }; @@ -293,4 +296,28 @@ class CfgAmmo { class rhs_ammo_smaw_SR: RocketBase { ACE_caliber = 9; }; + + // ACE Explosives + class PipeBombBase; + class rhsusf_m112_ammo: PipeBombBase { + ace_explosives_defuseObjectPosition[] = {0.055, 0, 0.038}; + }; + + class rhsusf_m112x4_ammo: PipeBombBase { + ace_explosives_defuseObjectPosition[] = {0.055, -0.025, 0.102}; + }; + + class MineBase; + class rhsusf_mine_m19_ammo: MineBase { + ace_explosives_defuseObjectPosition[] = {0, 0.02, 0.046}; + }; + + class rhsusf_mine_m14_ammo: MineBase { + ace_explosives_defuseObjectPosition[] = {-0.02, -0.015, 0.02}; + }; + + class APERSMine_Range_Ammo; + class rhsusf_mine_m49a1_3m_ammo: APERSMine_Range_Ammo { + ace_explosives_defuseObjectPosition[] = {0, 0.016, 0.296}; + }; }; diff --git a/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp b/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp new file mode 100644 index 00000000000..333aacbcfea --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp @@ -0,0 +1,28 @@ +#define CREATE_MAGAZINE_GROUP(ammo) class GVAR(ammo) { rhs_##ammo = 1; } +class ace_csw_groups { + CREATE_MAGAZINE_GROUP(mag_TOW); + CREATE_MAGAZINE_GROUP(mag_TOWB); + CREATE_MAGAZINE_GROUP(mag_ITOW); + CREATE_MAGAZINE_GROUP(mag_TOW2); + CREATE_MAGAZINE_GROUP(mag_TOW2A); + CREATE_MAGAZINE_GROUP(mag_TOW2b); + CREATE_MAGAZINE_GROUP(mag_TOW2b_aero); + CREATE_MAGAZINE_GROUP(mag_TOW2bb); + class GVAR(48Rnd_40mm_MK19) { + RHS_48Rnd_40mm_MK19 = 1; + RHS_96Rnd_40mm_MK19 = 1; + }; + class GVAR(48Rnd_40mm_MK19_M430I) { + RHS_48Rnd_40mm_MK19_M430I = 1; + RHS_96Rnd_40mm_MK19_M430I = 1; + }; + class GVAR(48Rnd_40mm_MK19_M430A1) { + RHS_48Rnd_40mm_MK19_M430A1 = 1; + RHS_96Rnd_40mm_MK19_M430A1 = 1; + }; + class GVAR(48Rnd_40mm_MK19_M1001) { + RHS_48Rnd_40mm_MK19_M1001 = 1; + RHS_96Rnd_40mm_MK19_M1001 = 1; + }; +}; + diff --git a/optionals/compat_rhs_usf3/CfgMagazineWells.hpp b/optionals/compat_rhs_usf3/CfgMagazineWells.hpp index 6be0ec603fd..a5d8f8c58dd 100644 --- a/optionals/compat_rhs_usf3/CfgMagazineWells.hpp +++ b/optionals/compat_rhs_usf3/CfgMagazineWells.hpp @@ -1,5 +1,11 @@ class CfgMagazineWells { - class UGL_40x36 { // rhsusf\addons\rhsusf_c_weapons\cfgMagazineWells.hpp - ADDON[] = {"ACE_HuntIR_M203"}; + class ace_hellfire_K { + ADDON[] = {QGVAR(pylon_mag_2rnd_hellfire_k)}; + }; + class ace_hellfire_N { + ADDON[] = {QGVAR(pylon_mag_2rnd_hellfire_n)}; + }; + class ace_hellfire_L { + ADDON[] = {QGVAR(pylon_mag_2rnd_hellfire_L)}; }; }; diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp index 9e595fddfba..d80b07d457f 100644 --- a/optionals/compat_rhs_usf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -1,6 +1,21 @@ class cfgMagazines { class CA_Magazine; class VehicleMagazine; + class rhsusf_mag_40Rnd_46x30_AP: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 680; // according with the ACE_muzzleVelocities at 15°C, default RHS value 680.1 + }; + class rhsusf_mag_40Rnd_46x30_FMJ: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 620; // default RHS value according with the ACE_muzzleVelocities at 15°C + lastRoundsTracer = 0; + picture = "\rhsusf\addons\rhsusf_weapons2\glock17g4\data\rhs_mag1_glock17g4_ca.paa"; + tracersEvery = 0; + }; + class rhsusf_mag_40Rnd_46x30_JHP: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 690; // according with the ACE_muzzleVelocities at 15°C, default RHS value 620 + }; class rhs_mag_30Rnd_556x45_M855A1_Stanag; class rhsusf_100Rnd_556x45_soft_pouch: rhs_mag_30Rnd_556x45_M855A1_Stanag { @@ -23,4 +38,193 @@ class cfgMagazines { EGVAR(overpressure,range) = 0; EGVAR(overpressure,damage) = 0; }; + + class rhs_mag_AGM114K_2; + class GVAR(pylon_mag_2rnd_hellfire_k): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114K [ACE]"; + pylonWeapon = "ace_hellfire_launcher"; + ammo = "ACE_Hellfire_AGM114K"; + }; + class GVAR(pylon_mag_2rnd_hellfire_n): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114N [ACE]"; + pylonWeapon = "ace_hellfire_launcher_N"; + ammo = "ACE_Hellfire_AGM114N"; + }; + class GVAR(pylon_mag_2rnd_hellfire_l): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114L [ACE]"; + pylonWeapon = "ace_hellfire_launcher_L"; + ammo = "ACE_Hellfire_AGM114L"; + }; + + // ACE Explosives + class rhsusf_m112_mag: CA_Magazine { + ace_explosives_DelayTime = 1; + ace_explosives_Placeable = 1; + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_explosive_m112"; + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; + class Timer { + FuseTime = 0.5; + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; + }; + + class rhsusf_m112x4_mag: rhsusf_m112_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_explosive_m112x4"; + }; + + class ATMine_Range_Mag; + class rhs_mine_M19_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_M19"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.075; + }; + }; + }; + + class rhsusf_mine_m14_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m14"; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; + }; + + class rhsusf_mine_m49a1_3m_mag: ATMine_Range_Mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m49a1_3m"; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.125; + }; + }; + }; + + class rhsusf_mine_m49a1_6m_mag: rhsusf_mine_m49a1_3m_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m49a1_6m"; + }; + + class rhsusf_mine_m49a1_10m_mag: rhsusf_mine_m49a1_3m_mag { + ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m49a1_10m"; + }; + + // RHS magazines for crew handled ammo + class rhs_mag_TOW; + class GVAR(mag_TOW): rhs_mag_TOW { + scope = 2; + type = 256; + count = 1; + mass = 200; // Actually should be 440 but ARMA uses weight and volume in the same number + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_TOWB; + class GVAR(mag_TOWB): rhs_mag_TOWB { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_ITOW; + class GVAR(mag_ITOW): rhs_mag_ITOW { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_TOW2; + class GVAR(mag_TOW2): rhs_mag_TOW2 { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_TOW2A; + class GVAR(mag_TOW2A): rhs_mag_TOW2A { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_TOW2b; + class GVAR(mag_TOW2b): rhs_mag_TOW2b { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_TOW2b_aero; + class GVAR(mag_TOW2b_aero): rhs_mag_TOW2b_aero { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + class rhs_mag_TOW2bb; + class GVAR(mag_TOW2bb): rhs_mag_TOW2bb { + scope = 2; + type = 256; + count = 1; + mass = 200; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; + }; + + class GVAR(48Rnd_40mm_MK19): RHS_48Rnd_40mm_MK19 { + scope = 2; + type = 256; + count = 48; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class RHS_48Rnd_40mm_MK19_M430I; + class GVAR(48Rnd_40mm_MK19_M430I): RHS_48Rnd_40mm_MK19_M430I { + scope = 2; + type = 256; + count = 48; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class RHS_48Rnd_40mm_MK19_M430A1; + class GVAR(48Rnd_40mm_MK19_M430A1): RHS_48Rnd_40mm_MK19_M430A1 { + scope = 2; + type = 256; + count = 48; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class RHS_48Rnd_40mm_MK19_M1001; + class GVAR(48Rnd_40mm_MK19_M1001): RHS_48Rnd_40mm_MK19_M1001 { + scope = 2; + type = 256; + count = 48; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; }; diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index 02c4fff4082..759ea0d4c90 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -139,6 +139,7 @@ class CfgVehicles { class Heli_Transport_02_base_F; class RHS_CH_47F_base: Heli_Transport_02_base_F { EGVAR(refuel,fuelCapacity) = 3914; + class UserActions; }; class RHS_CH_47F: RHS_CH_47F_base { @@ -147,7 +148,7 @@ class CfgVehicles { EGVAR(fastroping,onCut) = QFUNC(onCut); EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - class UserActions { + class UserActions: UserActions { class OpenCargoDoor; class CloseCargoDoor: OpenCargoDoor { condition = QUOTE([ARR_2(this,'ramp_anim')] call FUNC(canCloseDoor)); @@ -300,6 +301,70 @@ class CfgVehicles { selection = "main_gun"; }; }; + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + magazineLocation = ""; + proxyWeapon = QGVAR(rhs_mortar_81mm); + disassembleWeapon = QGVAR(m252_carry); // carry weapon [CfgWeapons] + disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles] + desiredAmmo = 1; + ammoLoadTime = 3; + ammoUnloadTime = 3; + }; + }; + + class StaticMGWeapon: StaticWeapon {}; + + class rhs_m2staticmg_base: StaticMGWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_M2); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(m2_carry); + disassembleTurret = QEGVAR(csw,m3Tripod); + desiredAmmo = 100; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class RHS_M2StaticMG_MiniTripod_base: rhs_m2staticmg_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleTurret = QEGVAR(csw,m3TripodLow); + }; + }; + + class StaticGrenadeLauncher: StaticWeapon {}; + class RHS_MK19_TriPod_base: StaticGrenadeLauncher { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_MK19); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(mk19_carry); + disassembleTurret = QEGVAR(csw,m3TripodLow); + desiredAmmo = 48; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class StaticATWeapon: StaticWeapon {}; + class RHS_TOW_TriPod_base: StaticATWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_TOW_Launcher_static); + magazineLocation = "_target selectionPosition 'tube'"; + disassembleWeapon = QGVAR(tow_carry); + disassembleTurret = QEGVAR(csw,m220Tripod); + desiredAmmo = 1; + ammoLoadTime = 8; + ammoUnloadTime = 5; + }; }; class rhsusf_infantry_usmc_base; @@ -316,4 +381,72 @@ class CfgVehicles { class rhsusf_airforce_jetpilot: rhsusf_usmc_marpat_wd_rifleman_m4 { ace_gforcecoef = 0.55; }; + + class Items_base_F; + class ACE_Explosives_Place: Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + // ACE Explosives + class ACE_Explosives_Place_rhsusf_explosive_m112: ACE_Explosives_Place { + displayName = "$STR_RHSUSF_M112_EXPLOSIVE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\explosives\rhsusf_m112x1_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.055, 0, 0.038]"; + }; + }; + }; + + class ACE_Explosives_Place_rhsusf_explosive_m112x4: ACE_Explosives_Place { + displayName = "$STR_RHSUSF_M112X4_EXPLOSIVE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\explosives\rhsusf_m112x4_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.055, 0.025, 0.102]"; + }; + }; + }; + + class ACE_Explosives_Place_rhsusf_mine_M19: ACE_Explosives_Place { + displayName = "$STR_RHSUSF_M19_ATMINE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m19_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.014, -0.002, 0.046]"; + }; + }; + }; + + class ACE_Explosives_Place_rhsusf_mine_m14: ACE_Explosives_Place { + displayName = "$STR_RHSUSF_M14_APMINE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m14_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + + class ACE_Explosives_Place_rhsusf_mine_m49a1_3m: ACE_Explosives_Place { + displayName = "M49A1 (3m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_a_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.016, 0.296]"; + }; + }; + }; + + class ACE_Explosives_Place_rhsusf_mine_m49a1_6m: ACE_Explosives_Place_rhsusf_mine_m49a1_3m { + displayName = "M49A1 (6m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_b_e"; + }; + + class ACE_Explosives_Place_rhsusf_mine_m49a1_10m: ACE_Explosives_Place_rhsusf_mine_m49a1_3m { + displayName = "M49A1 (10m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_c_e"; + }; }; diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp index 4f270de4b9d..9ee79eee4ce 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class NVGoggles; class rhsusf_ANPVS_14: NVGoggles { // Monocular @@ -7,14 +6,14 @@ class CfgWeapons { EGVAR(nightvision,bluRadius) = 0.13; }; class rhsusf_ANPVS_15: rhsusf_ANPVS_14 { // Binocular (same as base) - modelOptics = ""; + modelOptics = ""; EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa); EGVAR(nightvision,bluRadius) = 0.15; }; class Pistol_Base_F; class Rifle_Base_F; - class srifle_EBR_F; + class rhs_weap_m14ebrri_base; class launch_O_Titan_F; class GM6_base_F; class rhs_weap_M107_Base_F: GM6_base_F { @@ -84,19 +83,38 @@ class CfgWeapons { ACE_barrelLength = 464.8; ACE_barrelTwist = 177.8; }; - class rhs_weap_m240_base; // Rifle_Long_Base_F - class rhs_weap_m240B: rhs_weap_m240_base { + class rhs_weap_m249: rhs_weap_lmg_minimi_railed { + ACE_barrelLength = 464.8; + ACE_barrelTwist = 177.8; + }; + class rhs_weap_m249_pip: rhs_weap_lmg_minimi_railed { + ACE_barrelLength = 464.8; + ACE_barrelTwist = 177.8; + }; + class rhs_weap_M249_base; + class rhs_weap_m240_base: rhs_weap_M249_base { ACE_RailHeightAboveBore = 4.3987; ACE_barrelTwist = 304.8; ACE_barrelLength = 629.92; ACE_Overheating_allowSwapBarrel = 1; }; - class rhs_weap_m14ebrri: srifle_EBR_F { + class rhs_weap_m14_base; + class rhs_weap_m14: rhs_weap_m14_base { + ACE_barrelTwist = 304.8; + ACE_barrelLength = 558.8; + ACE_Overheating_dispersion = 0.75; + }; + class rhs_weap_m14ebrri: rhs_weap_m14ebrri_base { ACE_barrelTwist = 304.8; ACE_barrelLength = 558.8; ACE_Overheating_dispersion = 0.75; ACE_RailHeightAboveBore = 3.08341; }; + class rhs_weap_m14_socom_base: rhs_weap_m14 { + ACE_barrelTwist = 304.8; + ACE_barrelLength = 413; //16.25 in (413 mm) + ACE_Overheating_dispersion = 0.75; + }; class rhs_weap_sr25: rhs_weap_m14ebrri { ACE_barrelTwist = 285.75; ACE_barrelLength = 609.6; @@ -107,6 +125,19 @@ class CfgWeapons { ACE_barrelLength = 508.0; ACE_RailHeightAboveBore = 3.13689; }; + class rhs_weap_SCAR_H_Base; + class rhs_weap_SCAR_H_CQC_Base: rhs_weap_SCAR_H_Base { + ACE_barrelTwist = 304.8; // 1:12" + ACE_barrelLength = 330.0; + }; + class rhs_weap_SCAR_H_LB_Base: rhs_weap_SCAR_H_CQC_Base { + ACE_barrelTwist = 304.8; // 1:12" + ACE_barrelLength = 508.0; + }; + class rhs_weap_SCAR_H_STD_Base: rhs_weap_SCAR_H_LB_Base { + ACE_barrelTwist = 304.8; // 1:12" + ACE_barrelLength = 406.0; + }; class rhs_weap_M590_5RD: Rifle_Base_F { ACE_barrelTwist = 0.0; ACE_twistDirection = 0; @@ -119,9 +150,11 @@ class CfgWeapons { }; class SMG_02_base_F; class rhsusf_weap_MP7A1_base_f: SMG_02_base_F { + ACE_barrelLength = 180; + ACE_barrelTwist = 160; + ACE_IronSightBaseAngle = -0.286479; // 5 mRad POA = POI at the default discreteDistance 100 m, SMG_02_base_F default value 0.434847 + ACE_RailBaseAngle = 0; // SMG_02_base_F default value 0.0217724 ACE_RailHeightAboveBore = 5; - ACE_barrelTwist = 160.0; - ACE_barrelLength = 180.0; }; // RHS pistols class hgun_ACPC2_F; @@ -155,6 +188,13 @@ class CfgWeapons { }; }; }; + // ACOG is a sniper scope for some reason, but we don't want scope adjust + class rhsusf_acc_ACOG: rhsusf_acc_sniper_base { + ACE_ScopeAdjust_Vertical[] = { 0, 0 }; + ACE_ScopeAdjust_Horizontal[] = { 0, 0 }; + ACE_ScopeAdjust_VerticalIncrement = 0; + ACE_ScopeAdjust_HorizontalIncrement = 0; + }; class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base { ACE_ScopeHeightAboveRail = 2.62567; }; @@ -220,9 +260,19 @@ class CfgWeapons { canLock = 0; lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; + class Single; + class Cruise: Single { + EGVAR(missileGuidance,attackProfile) = "JAV_DIR"; + }; + class TopDown: Single { + EGVAR(missileGuidance,attackProfile) = "JAV_TOP"; + }; }; - class Launcher_Base_F; + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; class rhs_weap_smaw: Launcher_Base_F { ace_reloadlaunchers_enabled = 1; ace_overpressure_angle = 45; @@ -234,11 +284,15 @@ class CfgWeapons { ace_overpressure_damage = 0.75; }; + #define HEARING_PROTECTION_OPEN EGVAR(hearing,protection) = 0; EGVAR(hearing,lowerVolume) = 0; #define HEARING_PROTECTION_VICCREW EGVAR(hearing,protection) = 0.85; EGVAR(hearing,lowerVolume) = 0.6; #define HEARING_PROTECTION_EARMUFF EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0.5; #define HEARING_PROTECTION_PELTOR EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0; // Fast Helmets class rhsusf_opscore_01; + class rhsusf_opscore_ut_pelt_nsw: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; class rhsusf_opscore_aor1_pelt: rhsusf_opscore_01 { HEARING_PROTECTION_PELTOR }; @@ -288,6 +342,9 @@ class CfgWeapons { HEARING_PROTECTION_PELTOR }; class rhsusf_opscore_cover; + class rhsusf_opscore_mc_cover_pelt_nsw: rhsusf_opscore_cover { + HEARING_PROTECTION_PELTOR + }; class rhsusf_opscore_mc_cover_pelt: rhsusf_opscore_cover { HEARING_PROTECTION_PELTOR }; @@ -373,7 +430,9 @@ class CfgWeapons { class rhsusf_mich_bare_norotos_alt_semi: rhsusf_mich_bare_norotos_semi { HEARING_PROTECTION_PELTOR }; - class rhsusf_mich_bare_norotos_arc_semi; + class rhsusf_mich_bare_norotos_arc_semi: rhsusf_mich_bare_norotos_alt_semi { + HEARING_PROTECTION_OPEN + }; class rhsusf_mich_bare_norotos_arc_alt_semi: rhsusf_mich_bare_norotos_arc_semi { HEARING_PROTECTION_PELTOR }; @@ -390,13 +449,166 @@ class CfgWeapons { HEARING_PROTECTION_PELTOR }; - class rhsusf_hgu56p: rhsusf_opscore_01 { HEARING_PROTECTION_VICCREW }; + class rhsusf_hgu56p_visor: rhsusf_hgu56p { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_black; + class rhsusf_hgu56p_visor_black: rhsusf_hgu56p_black { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_green; + class rhsusf_hgu56p_visor_green: rhsusf_hgu56p_green { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_visor_mask: rhsusf_hgu56p { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_visor_mask_black: rhsusf_hgu56p_black { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_visor_mask_Empire_black: rhsusf_hgu56p_black { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_visor_mask_green: rhsusf_hgu56p_green { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_mask_smiley; + class rhsusf_hgu56p_visor_mask_smiley: rhsusf_hgu56p_mask_smiley { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_pink; + class rhsusf_hgu56p_visor_mask_pink: rhsusf_hgu56p_pink { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_visor_pink: rhsusf_hgu56p_pink { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_saf; + class rhsusf_hgu56p_visor_saf: rhsusf_hgu56p_saf { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_usa; + class rhsusf_hgu56p_visor_usa: rhsusf_hgu56p_usa { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_white; + class rhsusf_hgu56p_visor_white: rhsusf_hgu56p_white { + ACE_Protection = 1; + }; + class rhsusf_hgu56p_visor_mask_black_skull; + class rhsusf_hgu56p_mask_black_skull: rhsusf_hgu56p_visor_mask_black_skull { + ACE_Protection = 0; + }; + class rhsusf_ihadss: rhsusf_opscore_01 { + HEARING_PROTECTION_VICCREW + }; class H_HelmetB; class RHS_jetpilot_usaf: H_HelmetB { + ACE_Protection = 1; HEARING_PROTECTION_VICCREW }; + + CREATE_CSW_PROXY(rhs_mortar_81mm); + CREATE_CSW_PROXY(RHS_M2); + CREATE_CSW_PROXY(RHS_MK19); + CREATE_CSW_PROXY(Rhs_weap_TOW_Launcher_static); + + class GVAR(m252_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + class assembleTo { + EGVAR(csw,mortarBaseplate) = "RHS_M252_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. + // Required, because the inventory icon has no accessory variants. + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 620; // M252 Mortar Weight + }; + displayName = ECSTRING(CSW,m252_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_M252_D_ca.paa"; + }; + + class GVAR(m2_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,m3Tripod) = "RHS_M2StaticMG_WD"; + EGVAR(csw,m3TripodLow) = "RHS_M2StaticMG_MiniTripod_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 840; + }; + displayName = ECSTRING(CSW,m2_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_M2StaticMG_D_ca.paa"; + }; + + class GVAR(mk19_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,m3TripodLow) = "RHS_MK19_TriPod_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 770; + }; + displayName = ECSTRING(CSW,mk19_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_MK19_TriPod_D_ca.paa"; + }; + + class GVAR(tow_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,m220Tripod) = "RHS_TOW_TriPod_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 500; + }; + displayName = ECSTRING(CSW,tow_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\Ico\RHS_TOW_TriPod_D_ca.paa"; + }; }; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index 59aaa625bda..cf347dea996 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" class CfgPatches { class ADDON { @@ -6,9 +7,9 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor", "rhsusf_c_melb"}; + requiredAddons[] = {"ace_explosives", "ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "ace_csw", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor", "rhsusf_c_melb"}; author = ECSTRING(common,ACETeam); - authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut"}; + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "Fyuran"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -21,3 +22,5 @@ class CfgPatches { #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" #include "CfgGlasses.hpp" +#include "CfgMagazineGroups.hpp" + diff --git a/optionals/compat_rksl_pm_ii/CfgWeapons.hpp b/optionals/compat_rksl_pm_ii/CfgWeapons.hpp index 705d6b10e28..d787565419a 100644 --- a/optionals/compat_rksl_pm_ii/CfgWeapons.hpp +++ b/optionals/compat_rksl_pm_ii/CfgWeapons.hpp @@ -3,33 +3,37 @@ class CfgWeapons { class ItemCore; class InventoryOpticsItem_Base_F; - class RKSL_optic_PMII_312 : ItemCore { + class RKSL_optic_PMII_312: ItemCore { // https://www.schmidtundbender.de/en/products/police-military-forces/3-12x50-pm-ii.html ACE_ScopeHeightAboveRail = 4.2235; - ACE_ScopeAdjust_Vertical[] = { -4, 30 }; - ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Vertical[] = {0, 13}; // Single Turn + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { + class ItemInfo: InventoryOpticsItem_Base_F { class OpticsModes { class Snip { - discreteDistance[] = { 100 }; + discreteDistance[] = {100}; // default RKSL {100,...,1500} discreteDistanceInitIndex = 0; + distanceZoomMax = 1500; // default RKSL 100 + distanceZoomMin = 100; // default RKSL }; }; }; }; - class RKSL_optic_PMII_312_sunshade : ItemCore { + class RKSL_optic_PMII_525: ItemCore { // https://www.schmidtundbender.de/en/products/police-military-forces/5-25x56-pm-iilp.html ACE_ScopeHeightAboveRail = 4.2235; - ACE_ScopeAdjust_Vertical[] = { -4, 30 }; - ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Vertical[] = {0, 26}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { + class ItemInfo: InventoryOpticsItem_Base_F { class OpticsModes { class Snip { - discreteDistance[] = { 100 }; + discreteDistance[] = {100}; // default RKSL {300,...,2500} discreteDistanceInitIndex = 0; + distanceZoomMax = 2500; // default RKSL 300 + distanceZoomMin = 300; // default RKSL }; }; }; diff --git a/optionals/compat_rksl_pm_ii/config.cpp b/optionals/compat_rksl_pm_ii/config.cpp index 8cb36802b12..1242f7d0a69 100644 --- a/optionals/compat_rksl_pm_ii/config.cpp +++ b/optionals/compat_rksl_pm_ii/config.cpp @@ -6,9 +6,9 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"RKSL_PMII"}; + requiredAddons[] = {"RKSL_PMII", "RKSL_PMII_525"}; author = ECSTRING(common,ACETeam); - authors[] = {"Ruthberg"}; + authors[] = {"Ruthberg", "Dedmen"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/optionals/nocrosshair/CfgInGameUI.hpp b/optionals/nocrosshair/CfgInGameUI.hpp deleted file mode 100644 index cdaf4eba78a..00000000000 --- a/optionals/nocrosshair/CfgInGameUI.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class CfgInGameUI { - class Cursor { - weapon = ""; // "\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"; - }; -}; diff --git a/optionals/nocrosshair/CfgWeaponCursors.hpp b/optionals/nocrosshair/CfgWeaponCursors.hpp new file mode 100644 index 00000000000..57cef92ae4f --- /dev/null +++ b/optionals/nocrosshair/CfgWeaponCursors.hpp @@ -0,0 +1,27 @@ +#define EMPTY_TEXTURE(weapon) \ + class weapon: default { \ + texture = ""; \ + } + +class CfgWeaponCursors { + class default; + EMPTY_TEXTURE(arifle); + EMPTY_TEXTURE(mg); + EMPTY_TEXTURE(srifle); + EMPTY_TEXTURE(smg); + EMPTY_TEXTURE(hgun); + EMPTY_TEXTURE(sgun); + EMPTY_TEXTURE(gl); + EMPTY_TEXTURE(throw); + EMPTY_TEXTURE(put); + EMPTY_TEXTURE(missile); + EMPTY_TEXTURE(rocket); + EMPTY_TEXTURE(bomb); + EMPTY_TEXTURE(cannon); + EMPTY_TEXTURE(mortar); + EMPTY_TEXTURE(coil); + EMPTY_TEXTURE(laserdesignator); + // if these classes have empty texture the crosshair appears + // EMPTY_TEXTURE(cursorAim); + // EMPTY_TEXTURE(cursorAimOn); +}; diff --git a/optionals/nocrosshair/config.cpp b/optionals/nocrosshair/config.cpp index b7528917ef2..1e5f0f3bc5b 100644 --- a/optionals/nocrosshair/config.cpp +++ b/optionals/nocrosshair/config.cpp @@ -15,4 +15,4 @@ class CfgPatches { }; }; -#include "CfgInGameUI.hpp" +#include "CfgWeaponCursors.hpp" diff --git a/optionals/nouniformrestrictions/CfgVehicles.hpp b/optionals/nouniformrestrictions/CfgVehicles.hpp index 8d10f3f65fe..bb4c5a9bdf8 100644 --- a/optionals/nouniformrestrictions/CfgVehicles.hpp +++ b/optionals/nouniformrestrictions/CfgVehicles.hpp @@ -20,8 +20,11 @@ class CfgVehicles { class O_Soldier_diver_base_F; class I_G_Sharpshooter_F; class B_Soldier_F; + class I_C_Soldier_Para_2_F; class I_G_Soldier_LAT2_F; class I_crew_F; + class O_R_Gorka_F; + class I_L_Soldier_Base_F; class Civilian_F: Civilian { modelSides[] = {6}; @@ -245,9 +248,21 @@ class CfgVehicles { class O_G_Sharpshooter_F: I_G_Sharpshooter_F { modelSides[] = {6}; }; + class B_Captain_Pettka_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class B_Captain_Jay_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class I_Captain_Hladas_F: I_officer_F { + modelSides[] = {6}; + }; class Underwear_F: B_Soldier_F { modelSides[] = {6}; }; + class B_G_Captain_Ivan_F: I_C_Soldier_Para_2_F { + modelSides[] = {6}; + }; class C_man_sport_1_F: C_man_1 { modelSides[] = {6}; }; @@ -263,6 +278,9 @@ class CfgVehicles { class C_IDAP_Man_Base_F: Civilian_F { modelSides[] = {6}; }; + class C_Story_Mechanic_01_F: Civilian_F { + modelSides[] = {6}; + }; class O_A_soldier_base_F: O_officer_F { modelSides[] = {6}; }; @@ -275,4 +293,35 @@ class CfgVehicles { class I_Story_Crew_F: I_crew_F { modelSides[] = {6}; }; + class C_E_Man_Base_F: Civilian_F { + modelSides[] = {6}; + }; + class C_E_LooterJacket_01_F: C_E_Man_Base_F { + modelSides[] = {6}; + }; + class O_R_Gorka_black_F: O_R_Gorka_F { + modelSides[] = {6}; + }; + class B_CBRN_Man_Base_F: B_Soldier_F { + modelSides[] = {6}; + }; + class I_L_Uniform_01_camo_F: I_G_Soldier_LAT_F { + modelSides[] = {6}; + }; + class I_L_Uniform_01_deserter_F: I_G_Soldier_F { + modelSides[] = {6}; + }; + class I_L_Uniform_01_tshirt_skull_F: I_L_Soldier_Base_F { + modelSides[] = {6}; + }; + class I_L_Uniform_01_tshirt_black_F: I_L_Uniform_01_tshirt_skull_F { + modelSides[] = {6}; + }; + class I_L_Uniform_01_tshirt_sport_F: I_L_Uniform_01_tshirt_skull_F { + modelSides[] = {6}; + }; + class I_L_Uniform_01_tshirt_olive_F: I_L_Uniform_01_tshirt_skull_F { + modelSides[] = {6}; + }; }; + diff --git a/optionals/realisticdispersion/$PBOPREFIX$ b/optionals/realisticdispersion/$PBOPREFIX$ new file mode 100644 index 00000000000..f81f4701ae2 --- /dev/null +++ b/optionals/realisticdispersion/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\realisticdispersion \ No newline at end of file diff --git a/optionals/realisticdispersion/CfgWeapons.hpp b/optionals/realisticdispersion/CfgWeapons.hpp new file mode 100644 index 00000000000..fc13ab0952d --- /dev/null +++ b/optionals/realisticdispersion/CfgWeapons.hpp @@ -0,0 +1,295 @@ +class Mode_SemiAuto; +class Mode_Burst; +class Mode_FullAuto; + +class CfgWeapons { + class Rifle_Base_F; + class Rifle_Long_Base_F: Rifle_Base_F {}; + + // GM6 Lynx + class GM6_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.45); + }; + }; + + // M200 Intervention + class LRR_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.50); + }; + }; + + // MX + class arifle_MX_Base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // KH2002 Sama + class arifle_katiba_Base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // CTAR-21 + class Tavor_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // F2000 + class mk20_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // Noreen "Bad News" ULR + class DMR_02_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.61); + }; + }; + + // VS-121 + class DMR_01_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.81); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.81); + }; + }; + + // Mk14 Mod 1 EBR + class EBR_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.81); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.81); + }; + }; + + // SIG 556 + class DMR_03_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.81); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.81); + }; + }; + + // ASP-1 Kir + class DMR_04_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.0); + }; + }; + + // Cyrus + class DMR_05_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.67); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.67); + }; + }; + + // M14 + class DMR_06_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.81); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.81); + }; + }; + + class DMR_06_hunter_base_F: DMR_06_base_F { + class Single: Single { + dispersion = MOA_TO_RAD(0.81); + }; + }; + + // MX LSW + class arifle_MX_SW_F: arifle_MX_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // MXM + class arifle_MXM_F: arifle_MX_Base_F { + class Single: Single { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // HK416A5 11" + class arifle_SPAR_01_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // HK416A5 14.5" + class arifle_SPAR_02_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // HK417A2 20" + class arifle_SPAR_03_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.81); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.81); + }; + }; + + // RFB SDAR + class SDAR_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(3.0); + }; + + class Burst: Mode_Burst { + dispersion = MOA_TO_RAD(3.0); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(3.0); + }; + }; + + // QBZ-95-1 + class arifle_CTAR_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // QBU-88 + class DMR_07_base_F: Rifle_Long_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.01); + }; + }; + + // QBZ-95-1 LSW + class arifle_CTARS_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // Type 115 + class arifle_ARX_base_F: Rifle_Base_F { + class Single: Mode_SemiAuto { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: Mode_FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // KH2002C Sama + class arifle_Katiba_C_F: arifle_katiba_Base_F { + class Single: Single { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // MXC + class arifle_MXC_F: arifle_MX_Base_F { + class Single: Single { + dispersion = MOA_TO_RAD(0.90); + }; + + class FullAuto: FullAuto { + dispersion = MOA_TO_RAD(0.90); + }; + }; + + // TAR-21 + class arifle_TRG21_F: Tavor_base_F { + class Single: Single { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; + + // F2000 Tactical + class arifle_Mk20C_F: mk20_base_F { + class Single: Single { + dispersion = MOA_TO_RAD(1.12); + }; + + class FullAuto: FullAuto { + dispersion = MOA_TO_RAD(1.12); + }; + }; +}; diff --git a/optionals/realisticdispersion/config.cpp b/optionals/realisticdispersion/config.cpp new file mode 100644 index 00000000000..f8274ceba33 --- /dev/null +++ b/optionals/realisticdispersion/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_ballistics"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/realisticdispersion/script_component.hpp b/optionals/realisticdispersion/script_component.hpp new file mode 100644 index 00000000000..87cadb192b2 --- /dev/null +++ b/optionals/realisticdispersion/script_component.hpp @@ -0,0 +1,6 @@ +#define COMPONENT realisticdispersion +#define COMPONENT_BEAUTIFIED Realistic Dispersion + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/tracers/CfgAmmo.hpp b/optionals/tracers/CfgAmmo.hpp index c1d83fcbdf1..9da774a4fb6 100644 --- a/optionals/tracers/CfgAmmo.hpp +++ b/optionals/tracers/CfgAmmo.hpp @@ -33,6 +33,8 @@ class CfgAmmo { // class B_556x45_Ball_Tracer_White: B_556x45_Ball {model = PATHTOF(ace_TracerWhite2.p3d);}; //New class for testing class B_580x42_Ball_F: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; + class ACE_580x42_Ball_Tracer_Red: B_580x42_Ball_F {model = PATHTOF(ace_TracerRed2.p3d);}; + class ACE_580x42_Ball_Tracer_Yellow: B_580x42_Ball_F {model = PATHTOF(ace_TracerYellow2.p3d);}; class B_65x39_Caseless: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red class B_65x39_Caseless_green: B_65x39_Caseless {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green @@ -86,10 +88,14 @@ class CfgAmmo { class B_338_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red class B_338_NM_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class ACE_338_NM_Ball_green : B_338_NM_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; + class ACE_338_NM_Ball_yellow : B_338_NM_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; class B_127x54_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green class B_93x64_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class ACE_93x64_Ball_tracer_red : B_93x64_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; + class ACE_93x64_Ball_tracer_yellow : B_93x64_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; //Autocannon class B_19mm_HE: BulletBase {model = PATHTOF(ace_TracerWhite2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white diff --git a/optionals/tracers/CfgMagazineWells.hpp b/optionals/tracers/CfgMagazineWells.hpp new file mode 100644 index 00000000000..4d0b0d5788e --- /dev/null +++ b/optionals/tracers/CfgMagazineWells.hpp @@ -0,0 +1,156 @@ +class CfgMagazineWells { + class STANAG_556x45_Large { + ADDON[] = { + "ACE_150Rnd_556x45_Drum_green", + "ACE_150Rnd_556x45_Drum_yellow", + "ACE_150Rnd_556x45_Drum_tracer_green", + "ACE_150Rnd_556x45_Drum_tracer_yellow" + }; + }; + class CBA_556x45_STANAG_2D_XL { + ADDON[] = { + "ACE_150Rnd_556x45_Drum_green", + "ACE_150Rnd_556x45_Drum_yellow", + "ACE_150Rnd_556x45_Drum_tracer_green", + "ACE_150Rnd_556x45_Drum_tracer_yellow" + }; + }; + class M249_556x45 { + ADDON[] = { + "ACE_200Rnd_556x45_Box_green", + "ACE_200Rnd_556x45_Box_tracer_green" + }; + }; + class CBA_556x45_MINIMI { + ADDON[] = { + "ACE_200Rnd_556x45_Box_green", + "ACE_200Rnd_556x45_Box_tracer_green" + }; + }; + class CTAR_580x42 { + ADDON[] = { + "ACE_30Rnd_580x42_Mag_red", + "ACE_30Rnd_580x42_Mag_yellow", + "ACE_30Rnd_580x42_Mag_tracer_red", + "ACE_30Rnd_580x42_Mag_tracer_yellow" + }; + }; + class CBA_580x42_TYPE95 { + ADDON[] = { + "ACE_30Rnd_580x42_Mag_red", + "ACE_30Rnd_580x42_Mag_yellow", + "ACE_30Rnd_580x42_Mag_tracer_red", + "ACE_30Rnd_580x42_Mag_tracer_yellow" + }; + }; + class CTAR_580x42_Large { + ADDON[] = { + "ACE_100Rnd_580x42_Drum_red", + "ACE_100Rnd_580x42_Drum_yellow", + "ACE_100Rnd_580x42_Drum_tracer_red", + "ACE_100Rnd_580x42_Drum_tracer_yellow" + }; + }; + class CBA_580x42_TYPE95_XL { + ADDON[] = { + "ACE_100Rnd_580x42_Drum_red", + "ACE_100Rnd_580x42_Drum_yellow", + "ACE_100Rnd_580x42_Drum_tracer_red", + "ACE_100Rnd_580x42_Drum_tracer_yellow" + }; + }; + class MX_65x39 { + ADDON[] = { + "ACE_30Rnd_65x39_mx_green", + "ACE_30Rnd_65x39_mx_yellow", + "ACE_30Rnd_65x39_mx_tracer_green", + "ACE_30Rnd_65x39_mx_tracer_yellow" + }; + }; + class CBA_65x39_MX { + ADDON[] = { + "ACE_30Rnd_65x39_mx_green", + "ACE_30Rnd_65x39_mx_yellow", + "ACE_30Rnd_65x39_mx_tracer_green", + "ACE_30Rnd_65x39_mx_tracer_yellow" + }; + }; + class CBA_65x39_MX_XL { + ADDON[] = { + "ACE_100Rnd_65x39_mx_green", + "ACE_100Rnd_65x39_mx_yellow", + "ACE_100Rnd_65x39_mx_tracer_green", + "ACE_100Rnd_65x39_mx_tracer_yellow" + }; + }; + class Katiba_65x39 { + ADDON[] = { + "ACE_30Rnd_65x39_katiba_red", + "ACE_30Rnd_65x39_katiba_yellow", + "ACE_30Rnd_65x39_katiba_tracer_red", + "ACE_30Rnd_65x39_katiba_tracer_yellow" + }; + }; + class CBA_65x39_Katiba { + ADDON[] = { + "ACE_30Rnd_65x39_katiba_red", + "ACE_30Rnd_65x39_katiba_yellow", + "ACE_30Rnd_65x39_katiba_tracer_red", + "ACE_30Rnd_65x39_katiba_tracer_yellow" + }; + }; + class Mk200_65x39 { + ADDON[] = { + "ACE_200Rnd_65x39_cased_Box_green", + "ACE_200Rnd_65x39_cased_Box_red", + "ACE_200Rnd_65x39_cased_Box_tracer_green", + "ACE_200Rnd_65x39_cased_Box_tracer_red" + }; + }; + class CBA_65x39_Mk200 { + ADDON[] = { + "ACE_200Rnd_65x39_cased_Box_green", + "ACE_200Rnd_65x39_cased_Box_red", + "ACE_200Rnd_65x39_cased_Box_tracer_green", + "ACE_200Rnd_65x39_cased_Box_tracer_red" + }; + }; + class CBA_762x51_HK417 { + ADDON[] = { + "ACE_20Rnd_762x51_Mag_tracer_green", + "ACE_20Rnd_762x51_Mag_tracer_yellow" + }; + }; + class CBA_762x51_M14 { + ADDON[] = { + "ACE_20Rnd_762x51_Mag_Tracer_green", + "ACE_20Rnd_762x51_Mag_Tracer_yellow" + }; + }; + class CBA_762x51_G3 { + ADDON[] = { + "ACE_20Rnd_762x51_Mag_Tracer_green", + "ACE_20Rnd_762x51_Mag_Tracer_yellow" + }; + }; + class CBA_762x54R_LINKS { + ADDON[] = { + "ACE_150Rnd_762x54_Box_red", + "ACE_150Rnd_762x54_Box_yellow", + "ACE_150Rnd_762x54_Box_tracer_red", + "ACE_150Rnd_762x54_Box_tracer_yellow" + }; + }; + class CBA_93x64_LINKS { + ADDON[] = { + "ACE_150Rnd_93x64_Mag_red", + "ACE_150Rnd_93x64_Mag_yellow" + }; + }; + class CBA_338NM_LINKS { + ADDON[] = { + "ACE_130Rnd_338_Mag_green", + "ACE_130Rnd_338_Mag_yellow" + }; + }; +}; diff --git a/optionals/tracers/CfgMagazines.hpp b/optionals/tracers/CfgMagazines.hpp new file mode 100644 index 00000000000..bd2919631aa --- /dev/null +++ b/optionals/tracers/CfgMagazines.hpp @@ -0,0 +1,245 @@ +#define STRINGS(magazine) author = ECSTRING(common,ACETeam); displayName = CSTRING(magazine) + +class CfgMagazines { + + // 5.56mm + class 150Rnd_556x45_Drum_Mag_F; + class ACE_150Rnd_556x45_Drum_green : 150Rnd_556x45_Drum_Mag_F { + ammo = "B_556x45_Ball_tracer_green"; + STRINGS(150Rnd_556x45_Drum_green); + }; + class ACE_150Rnd_556x45_Drum_yellow : 150Rnd_556x45_Drum_Mag_F { + ammo = "B_556x45_Ball_tracer_yellow"; + STRINGS(150Rnd_556x45_Drum_yellow); + }; + + class 150Rnd_556x45_Drum_Mag_tracer_F; + class ACE_150Rnd_556x45_Drum_tracer_green : 150Rnd_556x45_Drum_Mag_tracer_F { + ammo = "B_556x45_Ball_tracer_green"; + STRINGS(150Rnd_556x45_Drum_tracer_green); + descriptionShort = CSTRING(150Rnd_556x45_Drum_tracer_green_description); + }; + class ACE_150Rnd_556x45_Drum_tracer_yellow : 150Rnd_556x45_Drum_Mag_tracer_F { + ammo = "B_556x45_Ball_tracer_yellow"; + STRINGS(150Rnd_556x45_Drum_tracer_yellow); + descriptionShort = CSTRING(150Rnd_556x45_Drum_tracer_green_description); + }; + + class 200Rnd_556x45_Box_F; + class ACE_200Rnd_556x45_Box_green : 200Rnd_556x45_Box_F { + ammo = "B_556x45_Ball_tracer_green"; + STRINGS(200Rnd_556x45_Box_green); + }; + class 200Rnd_556x45_Box_tracer_F; + class ACE_200Rnd_556x45_Box_tracer_green : 200Rnd_556x45_Box_tracer_F { + ammo = "B_556x45_Ball_tracer_green"; + STRINGS(200Rnd_556x45_Box_tracer_green); + descriptionShort = CSTRING(200Rnd_556x45_Box_tracer_green_description); + }; + + // 5.8mm + class 30Rnd_580x42_Mag_F; + class ACE_30Rnd_580x42_Mag_red : 30Rnd_580x42_Mag_F { + ammo = "ACE_580x42_Ball_tracer_red"; + STRINGS(30Rnd_580x42_Mag_red); + }; + class ACE_30Rnd_580x42_Mag_yellow : 30Rnd_580x42_Mag_F { + ammo = "ACE_580x42_Ball_tracer_yellow"; + STRINGS(30Rnd_580x42_Mag_yellow); + }; + + class 30Rnd_580x42_Mag_tracer_F; + class ACE_30Rnd_580x42_Mag_tracer_red : 30Rnd_580x42_Mag_tracer_F { + ammo = "ACE_580x42_Ball_tracer_red"; + STRINGS(30Rnd_580x42_Mag_tracer_red); + descriptionShort = CSTRING(30Rnd_580x42_Mag_tracer_red_description); + }; + class ACE_30Rnd_580x42_Mag_tracer_yellow : 30Rnd_580x42_Mag_tracer_F { + ammo = "ACE_580x42_Ball_tracer_yellow"; + STRINGS(30Rnd_580x42_Mag_tracer_yellow); + descriptionShort = CSTRING(30Rnd_580x42_Mag_tracer_yellow_description); + }; + + class 100Rnd_580x42_Mag_F; + class ACE_100Rnd_580x42_Drum_red : 100Rnd_580x42_Mag_F { + ammo = "ACE_580x42_Ball_tracer_red"; + STRINGS(100Rnd_580x42_Drum_red); + }; + class ACE_100Rnd_580x42_Drum_yellow : 100Rnd_580x42_Mag_F { + ammo = "ACE_580x42_Ball_tracer_yellow"; + STRINGS(100Rnd_580x42_Drum_yellow); + }; + + class 100Rnd_580x42_Mag_tracer_F; + class ACE_100Rnd_580x42_Drum_tracer_red : 100Rnd_580x42_Mag_tracer_F { + ammo = "ACE_580x42_Ball_tracer_red"; + STRINGS(100Rnd_580x42_Drum_tracer_red); + descriptionShort = CSTRING(100Rnd_580x42_Drum_tracer_red_description); + }; + class ACE_100Rnd_580x42_Drum_tracer_yellow : 100Rnd_580x42_Mag_tracer_F { + ammo = "ACE_580x42_Ball_tracer_yellow"; + STRINGS(100Rnd_580x42_Drum_tracer_yellow); + descriptionShort = CSTRING(100Rnd_580x42_Drum_tracer_yellow_description); + }; + + // 6.5mm Caseless MX + class 30Rnd_65x39_caseless_mag; + class ACE_30Rnd_65x39_mx_green : 30Rnd_65x39_caseless_mag { + ammo = "B_65x39_Caseless_green"; + STRINGS(30Rnd_65x39_mx_green); + descriptionShort = CSTRING(30Rnd_65x39_mx_green_description); + }; + class ACE_30Rnd_65x39_mx_yellow : 30Rnd_65x39_caseless_mag { + ammo = "B_65x39_Caseless_yellow"; + STRINGS(30Rnd_65x39_mx_yellow); + descriptionShort = CSTRING(30Rnd_65x39_mx_yellow_description); + }; + + class 30Rnd_65x39_caseless_mag_tracer; + class ACE_30Rnd_65x39_mx_tracer_green : 30Rnd_65x39_caseless_mag_tracer { + ammo = "B_65x39_Caseless_green"; + picture = "a3\weapons_f\Data\UI\m_30stanag_caseless_green_CA.paa"; + STRINGS(30Rnd_65x39_mx_tracer_green); + descriptionShort = CSTRING(30Rnd_65x39_mx_tracer_green_description); + }; + class ACE_30Rnd_65x39_mx_tracer_yellow : 30Rnd_65x39_caseless_mag_tracer { + ammo = "B_65x39_Caseless_yellow"; + picture = "a3\weapons_f\Data\UI\m_30stanag_caseless_yellow_CA.paa"; + STRINGS(30Rnd_65x39_mx_tracer_yellow); + descriptionShort = CSTRING(30Rnd_65x39_mx_tracer_yellow_description); + }; + + class 100Rnd_65x39_caseless_mag; + class ACE_100Rnd_65x39_mx_green : 100Rnd_65x39_caseless_mag { + ammo = "B_65x39_Caseless_green"; + STRINGS(100Rnd_65x39_mx_green); + }; + class ACE_100Rnd_65x39_mx_yellow : 100Rnd_65x39_caseless_mag { + ammo = "B_65x39_Caseless_yellow"; + STRINGS(100Rnd_65x39_mx_yellow); + }; + + class 100Rnd_65x39_caseless_mag_tracer; + class ACE_100Rnd_65x39_mx_tracer_green : 100Rnd_65x39_caseless_mag_tracer { + ammo = "B_65x39_Caseless_green"; + picture = "a3\weapons_f\Data\UI\M_100Rnd_65x39_green_CA.paa"; + STRINGS(100Rnd_65x39_mx_tracer_green); + descriptionShort = CSTRING(100Rnd_65x39_mx_tracer_green_description); + }; + class ACE_100Rnd_65x39_mx_tracer_yellow : 100Rnd_65x39_caseless_mag_tracer { + ammo = "B_65x39_Caseless_yellow"; + picture = "a3\weapons_f\Data\UI\M_100Rnd_65x39_yellow_CA.paa"; + STRINGS(100Rnd_65x39_mx_tracer_yellow); + descriptionShort = CSTRING(100Rnd_65x39_mx_tracer_yellow_description); + }; + + // 6.5mm Caseless Katiba + class 30Rnd_65x39_caseless_green; + class ACE_30Rnd_65x39_katiba_red : 30Rnd_65x39_caseless_green { + ammo = "B_65x39_Caseless"; + STRINGS(30Rnd_65x39_katiba_red); + }; + class ACE_30Rnd_65x39_katiba_yellow : 30Rnd_65x39_caseless_green { + ammo = "B_65x39_Caseless_yellow"; + STRINGS(30Rnd_65x39_katiba_yellow); + }; + + class 30Rnd_65x39_caseless_green_mag_Tracer; + class ACE_30Rnd_65x39_katiba_tracer_red : 30Rnd_65x39_caseless_green_mag_Tracer { + ammo = "B_65x39_Caseless"; + picture = "a3\weapons_f\Data\UI\m_20stanag_red_CA.paa"; + STRINGS(30Rnd_65x39_katiba_tracer_red); + descriptionShort = CSTRING(30Rnd_65x39_katiba_tracer_red_description); + }; + class ACE_30Rnd_65x39_katiba_tracer_yellow : 30Rnd_65x39_caseless_green_mag_Tracer { + ammo = "B_65x39_Caseless_yellow"; + picture = "a3\weapons_f\Data\UI\m_20stanag_yellow_CA.paa"; + STRINGS(30Rnd_65x39_katiba_tracer_yellow); + descriptionShort = CSTRING(30Rnd_65x39_katiba_tracer_yellow_description); + }; + + // 6.5mm Cased + class 200Rnd_65x39_cased_Box; + class ACE_200Rnd_65x39_cased_Box_green : 200Rnd_65x39_cased_Box { + ammo = "B_65x39_Case_green"; + STRINGS(200Rnd_65x39_cased_Box_green); + descriptionShort = CSTRING(200Rnd_65x39_cased_Box_green_description); + }; + class ACE_200Rnd_65x39_cased_Box_red : 200Rnd_65x39_cased_Box { + ammo = "B_65x39_Case"; + STRINGS(200Rnd_65x39_cased_Box_red); + descriptionShort = CSTRING(200Rnd_65x39_cased_Box_red_description); + }; + + class 200Rnd_65x39_cased_Box_tracer; + class ACE_200Rnd_65x39_cased_Box_tracer_green : 200Rnd_65x39_cased_Box_tracer { + ammo = "B_65x39_Case_green"; + picture = "a3\weapons_f\Data\UI\M_200Rnd_65x39_green_CA.paa"; + STRINGS(200Rnd_65x39_cased_Box_tracer_green); + descriptionShort = CSTRING(200Rnd_65x39_cased_Box_tracer_green_description); + }; + class ACE_200Rnd_65x39_cased_Box_tracer_red : 200Rnd_65x39_cased_Box_tracer { + ammo = "B_65x39_Case"; + picture = "a3\weapons_f\Data\UI\M_200Rnd_65x39_red_CA.paa"; + STRINGS(200Rnd_65x39_cased_Box_tracer_red); + descriptionShort = CSTRING(200Rnd_65x39_cased_Box_tracer_red_description); + }; + + // 7.62x51 (NATO) + class ACE_20Rnd_762x51_Mag_tracer; + class ACE_20Rnd_762x51_Mag_tracer_green : ACE_20Rnd_762x51_Mag_tracer { + ammo = "B_762x51_tracer_green"; + STRINGS(20Rnd_762x51_Mag_tracer_green); + descriptionShort = CSTRING(20Rnd_762x51_Mag_tracer_green_description); + }; + class ACE_20Rnd_762x51_Mag_tracer_yellow : ACE_20Rnd_762x51_Mag_tracer { + ammo = "B_762x51_tracer_yellow"; + STRINGS(20Rnd_762x51_Mag_tracer_yellow); + descriptionShort = CSTRING(20Rnd_762x51_Mag_tracer_green_description); + }; + + // 7.62x54 (Russian) + class 150Rnd_762x54_Box; + class ACE_150Rnd_762x54_Box_red : 150Rnd_762x54_Box { + ammo = "B_762x54_tracer_red"; + STRINGS(150Rnd_762x54_Box_red); + }; + class ACE_150Rnd_762x54_Box_yellow : 150Rnd_762x54_Box { + ammo = "B_762x54_tracer_yellow"; + STRINGS(150Rnd_762x54_Box_yellow); + }; + + class 150Rnd_762x54_Box_tracer; + class ACE_150Rnd_762x54_Box_tracer_red : 150Rnd_762x54_Box_tracer { + ammo = "B_762x54_tracer_red"; + STRINGS(150Rnd_762x54_Box_tracer_red); + descriptionShort = CSTRING(150Rnd_762x54_Box_tracer_red_description); + }; + class ACE_150Rnd_762x54_Box_tracer_yellow : 150Rnd_762x54_Box_tracer { + ammo = "B_762x54_tracer_yellow"; + STRINGS(150Rnd_762x54_Box_tracer_yellow); + descriptionShort = CSTRING(150Rnd_762x54_Box_tracer_yellow_description); + }; + + // 9.3x64 + class 150Rnd_93x64_Mag; + class ACE_150Rnd_93x64_Mag_red : 150Rnd_93x64_Mag { + ammo = "ACE_93x64_Ball_tracer_red"; + STRINGS(150Rnd_93x64_Mag_red); + }; + class ACE_150Rnd_93x64_Mag_yellow : 150Rnd_93x64_Mag { + ammo = "ACE_93x64_Ball_tracer_yellow"; + STRINGS(150Rnd_93x64_Mag_yellow); + }; + + // .338 NM + class 130Rnd_338_Mag; + class ACE_130Rnd_338_Mag_green : 130Rnd_338_Mag { + ammo = "ACE_338_NM_Ball_green"; + STRINGS(130Rnd_338_Mag_green); + }; + class ACE_130Rnd_338_Mag_yellow : 130Rnd_338_Mag { + ammo = "ACE_338_NM_Ball_yellow"; + STRINGS(130Rnd_338_Mag_yellow); + }; +}; diff --git a/optionals/tracers/config.cpp b/optionals/tracers/config.cpp index 200b24cf571..79e7f3364d1 100644 --- a/optionals/tracers/config.cpp +++ b/optionals/tracers/config.cpp @@ -15,27 +15,5 @@ class CfgPatches { }; #include "CfgAmmo.hpp" - -// CfgMagazines and CfgWeapons are included for testing only and may be removed for release version. -// There is also an ammo class B_556x45_Ball_Tracer_White commented out in CfgAmmo -// this should also be uncommented when testing white tracers. -/* -class CfgMagazines { - class 200Rnd_556x45_Box_Tracer_F; - class 200Rnd_556x45_Box_Green_F : 200Rnd_556x45_Box_Tracer_F { - ammo = "B_556x45_Ball_Tracer_Green"; - displayName = "5.56 mm 200Rnd Tracer (Green) Box"; - }; - class 200Rnd_556x45_Box_White_F : 200Rnd_556x45_Box_Tracer_F { - ammo = "B_556x45_Ball_Tracer_White"; - displayName = "5.56 mm 200Rnd Tracer (White) Box"; - }; -}; - -class CfgWeapons { - class LMG_03_base_F; - class LMG_03_F : LMG_03_base_F { - magazines[] = {"200Rnd_556x45_Box_F","200Rnd_556x45_Box_Red_F","200Rnd_556x45_Box_Tracer_F","200Rnd_556x45_Box_Tracer_Red_F","200Rnd_556x45_Box_Green_F","200Rnd_556x45_Box_White_F"}; - }; -}; -*/ +#include "CfgMagazines.hpp" +#include "CfgMagazineWells.hpp" diff --git a/optionals/tracers/stringtable.xml b/optionals/tracers/stringtable.xml new file mode 100644 index 00000000000..e89ed4522bc --- /dev/null +++ b/optionals/tracers/stringtable.xml @@ -0,0 +1,591 @@ + + + + + + 5.56 mm 150Rnd Reload Tracer (Green) Mag + 150 Schuss 5,56 mm Nachlade-Leuchtspur (Grün) Magazin + Магазин 150 патр. 5.56 мм с послед. трас. (Зеленый) + 5.56 mm 150 colpi ricarica traccianti (verdi) caricatore + 5.56 mm 150 ranný zásobník, stopovka pro přebití (Zelená) + Recarregar magazine de 150 balas tracejantes (verde) + 5.56 mm 150発入り 残通知 曳光弾 (緑) マガジン + + + 5.56 mm 150Rnd Reload Tracer (Yellow) Mag + 150 Schuss 5,56 mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 150 патр. 5.56 мм с послед. трас. (Желтый) + 5.56 mm 150 colpi Ricarica traccianti (gialli) caricatore + 5.56 mm 150 ranný zásobník, stopovka pro přebití (Žlutá) + Recarregar magazine 150 balas tracejantes (Amarelo) + 5.56 mm 150発入り 残通知 曳光弾 (黄) マガジン + + + 5.56 mm 150Rnd Tracer (Green) Mag + 150 Schuss 5,56 mm Leuchtspur (Grün) Magazin + Магазин 150 патр. 5.56 мм трассирующих (Зеленый) + 5.56 mm 150 colpi traccianti (verdi) caricatore + 5.56 mm 150 ranný zásobník, stopovka (Zelená) + Magazine 5.56mm Tracejante (verde) + 5.56 mm 150発入り 曳光弾 (緑) マガジン + + + Caliber: 5.56x45 mm Tracer - Green<br />Rounds: 150<br />Used in: SPAR-16S + Kaliber: 5,56x45 mm Leuchtspur - grün<br />Schuss: 150<br />Verwendet in: SPAR-16S + Калибр: 5.56x45 мм, трассер Зеленый<br />Патронов: 150<br />Используется в: SPAR-16S + calibro: 5.56x46 mm traccianti - verdi<br/> Colpi: 150<br/> Usati in: SPAR-16S + Kalibr: 5.56×45 mm Stopovka - Zelená<br />Nábojů: 150<br />Použito v: SPAR-16S + Calibre 5.56x45mm Tracejante - Verde<br/>Balas:150<br/>Usado em: Spar-16S + 口径: 5.56x45 mm 曳光弾 - 緑<br />弾数: 150<br />使用武器: SPAR-16S + + + 5.56 mm 150Rnd Tracer (Yellow) Mag + 150 Schuss 5,56 mm Leuchtspur (Gelb) Magazin + Магазин 150 патр. 5.56 мм трассирующих (Желтый) + 5.56 mm 150Colpi Traccianti (gialli) caricatore + 5.56 mm 150 ranný zásobník, stopovka (Žlutá) + Magazine 5.56mm 150 balas tracejante (amarelo) + 5.56 mm 150発入り 曳光弾 (黄) マガジン + + + Caliber: 5.56x45 mm Tracer - Yellow<br />Rounds: 150<br />Used in: SPAR-16S + Kaliber: 5,56x45 mm Leuchtspur - gelb<br />Schuss: 150<br />Verwendet in: SPAR-16S + Калибр: 5.56x45 мм, трассер Желтый<br />Патронов: 150<br />Используется в: SPAR-16S + calibro:5.56x45 traccianti - gialli <br/>Colpi:150<br/>Usati in: SPAR-16S + Kalibr: 5.56×45 mm Stopovka - Žlutá<br />Nábojů: 150<br />Použito v: SPAR-16S + Calibre: 5.56x45mm Tracejante - Amarelo <br/>Balas:150<br/>Usado em:Spar-16S + 口径: 5.56x45 mm 曳光弾 - 黄<br />弾数: 150<br />使用武器: SPAR-16S + + + 5.56 mm 200Rnd Reload Tracer (Green) Box + 200 Schuss 5,56 mm Nachlade-Leuchtspur (Grün) Kasten + Короб 200 патр. 5.56 мм с послед. трас. (Зеленый) + 5.56 mm 200colpi Ricarica traccianti (verdi) scatola + 5.56 mm 200 ranný box, stopovka pro přebití (Zelená) + Recarregar Caixa 5.56mm 200 Balas tracejantes (verdes) + 5.56 mm 200発入り 残通知 曳光弾 (緑) ボックス + + + 5.56 mm 200Rnd Tracer (Green) Box + 200 Schuss 5,56 mm Nachlade-Leuchtspur (Grün) Kasten + Короб 200 патр. 5.56 мм трассирующих (Зеленый) + 5.56 mm 200colpi Traccianti (verdi) Scatola + 5.56 mm 200 ranný box, stopovka (Zelená) + Caixa 5.56mm 200 balas tracejantes (verdes) + 5.56 mm 200発入り 曳光弾 (緑) ボックス + + + Caliber: 5.56x45 mm Tracer - Green<br />Rounds: 200<br />Used in: LIM-85 + Kaliber: 5,56x45 mm Leuchtspur - grün<br />Schuss: 200<br />Verwendet in: LIM-85 + Калибр: 5.56x45 мм, трассер Зеленый<br />Патронов: 200<br />Используется в: LIM-85 + Calibro: 5.56x45 mm Traccianti - Verdi<br />Colpi: 200<br />Usati in: LIM-85 + Kalibr: 5.56×45 mm Stopovka - Zelená<br />Nábojů: 200<br />Použito v: LIM-85 + Calibre:5.56x45 mm Tracejante - Verde <br/>Balas: 200<br/>Usado em:LIM-85 + 口径: 5.56x45 mm 曳光弾 - 緑<br />弾数: 200<br />使用武器: LIM-85 + + + 5.8 mm 30Rnd Reload Tracer (Red) Mag + 30 Schuss 5,8 mm Nachlade-Leuchtspur (Rot) Magazin + Магазин 30 патр. 5.8 мм с послед. трас. (Красный) + 5.8 mm 30Colpi Ricarica Tracciante (Rosso) Caricatore + 5.8 mm 30 ranný zásobník, stopovka pro přebití (Červená) + Recarregar magazine 5.8mm 30 Balas tracejantes (vermelho) + 5.8 mm 30発入り 残通知 曳光弾 (赤) マガジン + + + 5.8 mm 30Rnd Reload Tracer (Yellow) Mag + 30 Schuss 5,8 mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 30 патр. 5.8 мм с послед. трас. (Желтый) + 5.8 mm 30Colpi ricarica Traccianti (Giallo) Caricatore + 5.8 mm 30 ranný zásobník, stopovka pro přebití (Žlutá) + Recarregar magazine 5.8mm 30 Balas tracejantes (amarelo) + 5.8 mm 30発入り 残通知 曳光弾 (黄) マガジン + + + 5.8 mm 30Rnd Tracer (Red) Mag + 30 Schuss 5,8 mm Leuchtspur (Rot) Magazin + Магазин 30 патр. 5.8 мм трассирующих (Красный) + 5.8 mm 30Colpi Traccianti (rossi) Caricatore + 5.8 mm 30 ranný zásobník, stopovka (Červená) + Magazine 5.8 mm 30 balas tracejantes (vermelho) + 5.8 mm 30発入り 曳光弾 (赤) マガジン + + + Caliber: 5.8x42 mm Tracer - Red<br />Rounds: 30<br />Used in: CAR-95, CAR-95 GL + Kaliber: 5,8x42 mm Leuchtspur - rot<br />Schuss: 30<br />Verwendet in: CAR-95, CAR-95 GL + Калибр: 5.8x42 мм, трассер Красный<br />Патронов: 150<br />Используется в: CAR-95, CAR-95 GL + Calibro: 5.8x42 mm Traccianti - Rossi<br />Colpi: 30<br />Usati in: CAR-95, CAR-95 GL + Kalibr: 5.8×42 mm Stopovka - Červená<br />Nábojů: 30<br />Použito v: CAR-95, CAR-95 GL + Calibre: 5.8x42 mm Tracejante - Vermelho<br/>Balas:30<br/>Usado em CAR-95, CAR-95 GL + 口径: 5.8x42 mm 曳光弾 - 赤<br />弾数: 30<br />使用武器: CAR-95, CAR-95 GL + + + 5.8 mm 30Rnd Tracer (Yellow) Mag + 30 Schuss 5,8 mm Leuchtspur (Gelb) Magazin + Магазин 30 патр. 5.8 мм трассирующих (Желтый) + 5.8 mm 30Colpi Traccianti (Giallo) Caricatore + 5.8 mm 30 ranný zásobník, stopovka (Žlutá) + Magazine 5.8 mm 30 balas tracejante (amarelo) + 5.8 mm 30発入り 曳光弾 (黄) マガジン + + + Caliber: 5.8x42 mm Tracer - Yellow<br />Rounds: 30<br />Used in: CAR-95, CAR-95 GL + Kaliber: 5,8x42 mm Leuchtspur - gelb<br />Schuss: 30<br />Verwendet in: CAR-95, CAR-95 GL + Калибр: 5.8x42 мм, трассер Желтый<br />Патронов: 30<br />Используется в: CAR-95, CAR-95 GL + Caliber: 5.8x42 mm Tracer - Yellow<br />Rounds: 30<br />Used in: CAR-95, CAR-95 GL + Kalibr: 5.8×42 mm Stopovka - Žlutá<br />Nábojů: 30<br />Použito v: CAR-95, CAR-95 GL + Calibre: 5.8x42 mm Tracejante - Amarelo <br/>Balas: 30<br/>Usado em: CAR-95, CAR-95 GL + 口径: 5.8x42 mm 曳光弾 - 黄<br />弾数: 30<br />使用武器: CAR-95, CAR-95 GL + + + 5.8 mm 100Rnd Reload Tracer (Red) Mag + 100 Schuss 5,8 mm Nachlade-Leuchtspur (Rot) Magazin + Магазин 100 патр. 5.8 мм с послед. трас. (Красный) + 5,8 mm 100Colpi Ricarica Tracciante (rosso) Caricatore + 5.8 mm 100 ranný zásobník, stopovka pro přebití (Červená) + Recarregar magazine 5.8 mm 100 balas tracejante (vermelho) + 5.8 mm 100発入り 残通知 曳光弾 (赤) マガジン + + + 5.8 mm 100Rnd Reload Tracer (Yellow) Mag + 100 Schuss 5,8 mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 100 патр. 5.8 мм с послед. трас. (Желтый) + 5.8 mm 100Colpi Ricarica Traccianti (gialli) Caricatore + 5.8 mm 100 ranný zásobník, stopovka pro přebití (Žlutá) + Recarregar magazine 5.8 mm 100 balas tracejantes (amarelo) + 5.8 mm 100発入り 残通知 曳光弾 (黄) マガジン + + + 5.8 mm 100Rnd Tracer (Red) Mag + 100 Schuss 5,8 mm Leuchtspur (Rot) Magazin + Магазин 100 патр. 5.8 мм трассирующих (Красный) + 5.8 mm 100Colpi Ricarica Traccianti (rossi) Caricatore + 5.8 mm 100 ranný zásobník, stopovka (Červená) + Magazine 5.8 mm 100 balas tracejantes (vermelho) + 5.8 mm 100発入り 曳光弾 (赤) マガジン + + + Caliber: 5.8x42 mm Tracer - Red<br />Rounds: 100<br />Used in: CAR-95-1 + Kaliber: 5,8x42 mm Leuchtspur - rot<br />Schuss: 100<br />Verwendet in: CAR-95-1 + Калибр: 5.8x42 мм, трассер Красный<br />Патронов: 100<br />Используется в: CAR-95, CAR-95 GL + Calibro: 5.8x42 mm Tracciante - Rosso<br />Colpi: 100<br />Usati in: CAR-95-1 + Kalibr: 5.8×42 mm Stopovka - Červená<br />Nábojů: 100<br />Použito v: CAR-95-1 + Calibre: 5.8x42 mm Tracejante - Vermelho<br/>Balas:100<br/>Usado em CAR-95-1 + 口径: 5.8x42 mm 曳光弾 - 赤<br />弾数: 100<br />使用武器: CAR-95-1 + + + 5.8 mm 100Rnd Tracer (Yellow) Mag + 100 Schuss 5,8 mm Leuchtspur (Gelb) Magazin + Магазин 100 патр. 5.8 мм трассирующих (Желтый) + 5.8mm 100Colpi Traccianti (gialli) Caricatore + 5.8 mm 100 ranný zásobník, stopovka (Žlutá) + Magazine 5.8 mm 100 balas tracejantes (amarelo) + 5.8 mm 100発入り 曳光弾 (黄) マガジン + + + Caliber: 5.8x42 mm Tracer - Yellow<br />Rounds: 100<br />Used in: CAR-95-1 + Kaliber: 5,8x42 mm Leuchtspur - gelb<br />Schuss: 100<br />Verwendet in: CAR-95-1 + Калибр: 5.8x42 мм, трассер Желтый<br />Патронов: 100<br />Используется в: CAR-95, CAR-95 GL + Calibro: 5.8x42 mm Traccianti - Gialli<br />Colpi: 100<br />Usati in: CAR-95-1 + Kalibr: 5.8×42 mm Stopovka - Žlutá<br />Nábojů: 100<br />Použito v: CAR-95-1 + Calibre: 5.8x42 mm Tracejante - Amarelo<br/>Balas:100<br/>Usado em CAR-95-1 + 口径: 5.8x42 mm 曳光弾 - 黄<br />弾数: 100<br />使用武器: CAR-95-1 + + + 6.5mm 30Rnd Reload Tracer (Green) Mag + 30 Schuss 6.5mm Nachlade-Leuchtspur (Grün) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Зеленый) + 6.5mm 30Colpi Ricarica Traccianti(verdi) Caricatore + 6.5 mm 30 ranný zásobník, stopovka pro přebití (Zelená) + Recarregar magazine 6.5mm 30 balas tracejantes (verde) + 6.5 mm 30発入り 残通知 曳光弾 (緑) マガジン + + + Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6.5x39 mm Nachlade-Leuchtspur - Grün<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL + Calibro: 6.5x39 mm Traccianti - Verdi<br />Colpi: 30<br />Usati in: MX/C/M/SW/3GL + Kalibr: 6.5×39 mm Stopovka - Zelená<br />Nábojů: 30<br />Použito v: MX/C/M/SW/3GL + Calibre: 6.5x39 mm Tracejante - Verde<br/>Balas:30<br/>Usado em: MX/C/M/SW/3GL + 口径: 6.5x39 mm 曳光弾 - 緑<br />弾数: 30<br />使用武器: MX/C/M/SW/3GL + + + 6.5mm 30Rnd Reload Tracer (Yellow) Mag + 30 Schuss 6.5mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Желтый) + 6.5mm 30Colpi Ricarica Traccianti (Gialli) Caricatore + 6.5 mm 30 ranný zásobník, stopovka pro přebití (Žlutá) + Recarregar magazine 6.5mm 30 balas tracejantes (amarelo) + 6.5 mm 30発入り 残通知 曳光弾 (黄) マガジン + + + Caliber: 6.5x39 mm Tracer - Yellow<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6.5x39 mm Nachlade-Leuchtspur - Gelb<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Желтый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL + Calibro: 6.5x39 mm Tracciante - Giallo<br />Colpi: 30<br />Usati in: MX/C/M/SW/3GL + Kalibr: 6.5×39 mm Stopovka - Žlutá<br />Nábojů: 30<br />Použito v: MX/C/M/SW/3GL + Calibre: 6.5x39 mm Tracejante - Amarelo<br/>Balas:30<br/>Usado em: MX/C/M/SW/3GL + 口径: 6.5x39 mm 曳光弾 - 黄<br />弾数: 30<br />使用武器: MX/C/M/SW/3GL + + + 6.5mm 30Rnd Tracer (Green) Mag + 30 Schuss 6.5mm Leuchtspur (Grün) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Зеленый) + 6.5mm 30Colpi Traccianti (Verdi) Caricatore + 6.5 mm 30 ranný zásobník, stopovka (Zelená) + Magazine 6.5mm 30 balas tracejantes (verde) + 6.5 mm 30発入り 曳光弾 (緑) マガジン + + + Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6.5x39 mm Leuchtspur - Grün<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL + Calibro: 6.5x39 mm traccianti - Verdi<br />Colpi: 30<br />Usati in: MX/C/M/SW/3GL + Kalibr: 6.5×39 mm Stopovka - Zelená<br />Nábojů: 30<br />Použito v: MX/C/M/SW/3GL + Calibre: 6.5x39 mm Tracejante - Verde<br/>Balas:30<br/>Usado em: MX/C/M/SW/3GL + 口径: 6.5x39 mm 曳光弾 - 緑<br />弾数: 30<br />使用武器: MX/C/M/SW/3GL + + + 6.5mm 30Rnd Tracer (Yellow) Mag + 30 Schuss 6.5mm Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Желтый) + 6.5mm 30 Colpi Traccianti (Gialli) Caricatore + 6.5 mm 30 ranný zásobník, stopovka (Žlutá) + Magazine 6.5mm 30 balas tracejantes (amarelo) + 6.5 mm 30発入り 曳光弾 (黄) マガジン + + + Caliber: 6.5x39 mm Tracer - Yellow<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6.5x39 mm Leuchtspur - Gelb<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Желтый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL + Caliber: 6.5x39 mm Tracciante - Giallo<br />Colpi: 30<br />Usati in: MX/C/M/SW/3GL + Kalibr: 6.5×39 mm Stopovka - Žlutá<br />Nábojů: 30<br />Použito v: MX/C/M/SW/3GL + Calibre: 6.5x39 mm Tracejante - Amarelo<br/>Balas:30<br/>Usado em: MX/C/M/SW/3GL + 口径: 6.5x39 mm 曳光弾 - 黄<br />弾数: 30<br />使用武器: MX/C/M/SW/3GL + + + 6.5mm 100Rnd Mixed Mag (Green) + 100 Schuss 6.5mm Magazin gemischt (grün) + Магазин 100 патр. 6.5 мм TE4 (Зеленый) + 6.5mm 100Colpi Misti Caricatore (verdi) + 6.5 mm 100 ranný zásobník, částečná stopovka (Zelená) + Magazine 6.5mm 100 balas misturadas (verde) + 6.5 mm 100発入り 混合 (緑) マガジン + + + 6.5mm 100Rnd Mixed Mag (Yellow) + 100 Schuss 6.5mm Magazin gemischt (gelb) + Магазин 100 патр. 6.5 мм TE4 (Желтый) + 6.5mm 100Colpi Misti Caricatore (gialli) + 6.5 mm 100 ranný zásobník, částečná stopovka (Žlutá) + Magazine 6.5mm 100 balas misturadas (amarelo) + 6.5 mm 100発入り 混合 (黄) マガジン + + + 6.5mm 100Rnd Mag Tracer (Green) + 100 Schuss 6.5mm Magazin Leuchtspur (Grün) + Магазин 100 патр. 6.5 мм трассирующих (Зеленый) + 6.5mm 100Colpi Caricatore Tracciante (verde) + 6.5 mm 100 ranný zásobník, stopovka (Zelená) + Magazine 6.5mm 100 balas tracejantes + 6.5 mm 100発入り (緑) マガジン + + + Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 100<br />Used in: MX SW + Kaliber: 6.5x39 mm Leuchtspur - Grün<br />Patronen: 100<br />Verwendet in: MX SW + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 100<br />Используется в: MX SW + Calibro: 6.5x39 mm Traccianti - Verdi<br />Colpi: 100<br />Usati in: MX SW + Kalibr: 6.5×39 mm Stopovka - Zelená<br />Nábojů: 100<br />Použito v: MX SW + Calibre: 6.5x39 mm Tracejante - Verde<br/>Balas: 100<br/>Usado em: MX SW + 口径: 6.5x39 mm 曳光弾 - 緑<br />弾数: 100<br />使用武器: MX SW + + + 6.5mm 100Rnd Mag Tracer (Yellow) + 100 Schuss 6.5mm Magazin Leuchtspur (Gelb) + Магазин 100 патр. 6.5 мм трассирующих (Желтый) + 6.5mm 100Colpi Caricatore Traccianti (giallo) + 6.5 mm 100 ranný zásobník, stopovka (Žlutá) + Magazine 6.5mm 100 balas tracejantes (amarelo) + 6.5 mm 100発入り 曳光弾 (黄) マガジン + + + Caliber: 6.5x39 mm Tracer - Yellow<br />Rounds: 100<br />Used in: MX SW + Kaliber: 6.5x39 mm Leuchtspur - Gelb<br />Patronen: 100<br />Verwendet in: MX SW + Калибр: 6.5x39 мм, трассер Желтый<br />Патронов: 100<br />Используется в: MX SW + Calibro: 6.5x39 mm Traccianti - Gialli<br />Colpi: 100<br />Usati in: MX SW + Kalibr: 6.5×39 mm Stopovka - Žlutá<br />Nábojů: 100<br />Použito v: MX SW + Calibre: 6.5x39 mm Tracejante - Amarelo<br/>Balas: 100<br/>Usado em: MX SW + 口径: 6.5x39 mm 曳光弾 - 黄<br />弾数: 100<br />使用武器: MX SW + + + 6.5mm 30Rnd Reload Tracer (Red) Mag + 30 Schuss 6.5mm Nachlade-Leuchtspur (Rot) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Красный) + 6.5mm 30Colpi Ricarica Traccianti (Rossi) Caricatore + 6.5 mm 30 ranný zásobník, stopovka pro přebití (Červená) + Recarregar magazine 6.5mm 30 balas tracejantes (vermelho) + 6.5 mm 30発入り 残通知 曳光弾 (赤) マガジン + + + 6.5mm 30Rnd Reload Tracer (Yellow) Mag + 30 Schuss 6.5mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Желтый) + 6.5mm 30Colpi Ricarica Traccianti (gialli) Caricatore + 6.5 mm 30 ranný zásobník, stopovka pro přebití (Žlutá) + Recarregar magazine 6.5mm 30 balas tracejantes (amarelo) + 6.5 mm 30発入り 残通知 曳光弾 (黄) マガジン + + + 6.5mm 30Rnd Tracer (Red) Mag + 30 Schuss 6.5mm Leuchtspur (Rot) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Красный) + 6.5mm 30Colpi Traccianti (rossi) Caricatori + 6.5 mm 30 ranný zásobník, stopovka (Červená) + Magazine 6.5mm 30 balas tracejantes (vermelho) + 6.5 mm 30発入り 曳光弾 (赤) マガジン + + + Caliber: 6.5x39 mm Tracer (Red) - Caseless<br />Rounds: 30<br />Used in: Katiba, Type 115 + Kaliber: 6,5x39mm Leuchtspur (Rot) ‒ hülsenlos<br />Patronen: 30<br />Eingesetzt von: Katiba, Typ 115 + Калибр: 6.5x39 мм, трассер Красный безгильзовый<br />Патронов: 30<br />Используется в: Katiba, Type 115 + Calibro: 6.5x39 mm Traccianti (Rossi) - Senza Bossolo<br />Colpi: 30<br />Usati in: Katiba, Type 115 + Kalibr: 6.5×39 mm Stopovka - Červená - Beznábojnicová<br />Nábojů: 30<br />Použito v: Katiba, Type 115 + Calibre: 6.5x39 mm Tracejante (Vermelho) - Sem Cartucho<br/>Balas: 30<br/>Usado em: Katiba, Type 115 + 口径: 6.5x39 mm 曳光弾 - 赤 (ケースレス)<br />弾数: 30<br />使用武器: Katiba, Type 115 + + + 6.5mm 30Rnd Tracer (Yellow) Mag + 30 Schuss 6.5mm Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Желтый) + 6.5mm 30 Colpi Traccianti (gialli) Caricatore + 6.5 mm 30 ranný zásobník, stopovka (Žlutá) + Magazine 6.5mm 30 balas tracejantes (amarelo) + 6.5 mm 30発入り 曳光弾 (黄) マガジン + + + Caliber: 6.5x39 mm Tracer (Yellow) - Caseless<br />Rounds: 30<br />Used in: Katiba, Type 115 + Kaliber: 6,5x39mm Leuchtspur (Rot) ‒ hülsenlos<br />Patronen: 30<br />Eingesetzt von: Katiba, Typ 115 + Калибр: 6.5x39 мм, трассер Желтый безгильзовый<br />Патронов: 30<br />Используется в: Katiba, Type 115 + Calibro: 6.5x39 mm Traccianti (Gialli) - Senza Bossolo<br />Colpi: 30<br />Usati in: Katiba, Type 115 + Kalibr: 6.5×39 mm Stopovka - Žlutá - Beznábojnicová<br />Nábojů: 30<br />Použito v: Katiba, Type 115 + Caliber: 6.5x39 mm Tracejante (Vermelho) - Sem Cartucho<br/>Balas: 30<br/>Usado em: Katiba, Type 115 + 口径: 6.5x39 mm 曳光弾 - 黄 (ケースレス)<br />弾数: 30<br />使用武器: Katiba, Type 115 + + + 6.5 mm 200Rnd Belt Case Mixed (Green) + 6,5 mm 200-Schuss-Gurtkiste Gemischt (grün) + Короб 200 патр. 6.5 мм TE4 (Зеленый) + 6.5mm 200Colpi Caricatore esteso Misti (Verdi) + 6.5 mm 200 ranný pás, částečná stopovka (Zelená) + Caixa de Cinto 6.5 mm 200 Balas Misturados (Verde) + 6.5 mm 200発入り 混合 (緑) ベルト ケース + + + Caliber: 6.5x39 mm Mixed - Green<br />Rounds: 200<br />Used in: Mk200 + Kaliber: 6.5x39 mm Gemischt - Grün<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер каждый 4 Зеленый<br />Патронов: 200<br />Используется в: Mk200 + Calibro: 6.5x39 mm Misti - Verdi<br />Colpi: 200<br />Usati in: Mk200 + Kalibr: 6.5×39 mm Stopovka - Zelená<br />Nábojů: 200<br />Použito v: Mk200 + Calibre: 6.5x39 mm Misturado - Verde<br/>Balas: 200<br/>Usado em: Mk200 + 口径: 6.5x39 mm 混合 - 緑<br />弾数: 200<br />使用武器: Mk200 + + + 6.5 mm 200Rnd Belt Case Mixed (Red) + 6,5 mm 200-Schuss-Gurtkiste Gemischt (grün) + Короб 200 патр. 6.5 мм TE4 (Красный) + 6.5 mm 200Colpi Caritore maggiorato Misti (rossi) + 6.5 mm 200 ranný pás, částečná stopovka (Červená) + Caixa de Cinto 6.5 mm 200 balas misturadas (Vermelho) + 6.5 mm 200発入り 混合 (赤) ベルト ケース + + + Caliber: 6.5x39 mm Mixed - Red<br />Rounds: 200<br />Used in: Mk200 + Kaliber: 6.5x39 mm Mixed - Rot<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер каждый 4 Красный<br />Патронов: 200<br />Используется в: Mk200 + Calibro: 6.5x39 mm Misti - Rossi<br />Colpi: 200<br />Usati in: Mk200 + Kalibr: 6.5×39 mm Stopovka - Červená<br />Nábojů: 200<br />Použito v: Mk200 + Caliber: 6.5x39 mm Misturado - Vermelho<br/>Balas: 200<br/>Usado em: Mk200 + 口径: 6.5x39 mm 混合 - 赤<br />弾数: 200<br />使用武器: Mk200 + + + 6.5 mm 200Rnd Belt Case Tracer (Green) + 6,5 mm 200-Schuss-Gurtkiste Leuchtspur (grün) + Короб 200 патр. 6.5 мм трассирующих (Зеленый) + 6.5 mm 200Colpi Caricatore maggiorato Traccianti (verdi) + 6.5 mm 200 ranný pás, částečná stopovka (Zelená) + Caixa de Cinto 6;5 mm 200 balas tracejantes (Verde) + 6.5 mm 200発入り 混合 (緑) ベルト ケース + + + Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 200<br />Used in: Mk200 + Kaliber: 6.5x39 mm Leuchtspur - Grün<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 200<br />Используется в: Mk200 + Calibri: 6.5x39 mm Traccianti - Verdi<br />Colpi: 200<br />Usati In: Mk200 + Kalibr: 6.5×39 mm Stopovka - Zelená<br />Nábojů: 200<br />Použito v: Mk200 + Kaliber: 6.5x39 mm Smugowa - Zielona<br />Sztuk: 200<br />Używana w: Mk200 + Caliber: 6.5x39 mm Tracejante - Verde<br/>Balas: 200<br/>Usado em: Mk200 + 口径: 6.5x39 mm 曳光弾 - 緑<br />弾数: 200<br />使用武器: Mk200 + + + 6.5 mm 200Rnd Belt Case Tracer (Red) + 6,5 mm 200-Schuss-Gurtkiste Leuchtspur (rot) + Короб 200 патр. 6.5 мм трассирующих (Красный) + 6.5 mm 200Colpi Caricatore Maggiorato Tracciante (rossi) + 6.5 mm 200 ranný pás, stopovka (Červená) + 6.5 mm Magazynek pudełkowy 200szt. Smugowa (Czerwona) + Caixa de Cinto 6.5 mm 200 Balas Tracejantes (Vermelho) + 6.5 mm 200発入り 曳光弾 (赤) ベルト ケース + + + Caliber: 6.5x39 mm Tracer - Red<br />Rounds: 200<br />Used in: Mk200 + Kaliber: 6.5x39 mm Leuchtspur - Rot<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер Красный<br />Патронов: 200<br />Используется в: Mk200 + Calibro: 6.5x39 mm Traccianti - Rossi<br />Colpi: 200<br />Usati in: Mk200 + Kalibr: 6.5×39 mm Stopovka - Červená<br />Nábojů: 200<br />Použito v: Mk200 + Kaliber: 6.5x39 mm Smugowa - Czerwona<br />Sztuk: 200<br />Używana w: Mk200 + Caliber: 6.5x39 mm Tracejante - Vermelho<br/>Balas: 200<br/>Usado em: Mk200 + 口径: 6.5x39 mm 曳光弾 - 赤<br />弾数: 200<br />使用武器: Mk200 + + + 7.62 mm 20Rnd Tracer (Green) Mag + 7,62 mm 20-Schuss-Magazin Leuchtspur (Grün) + Магазин 20 патр. 7.62 мм трассирующих (Зеленый) + 7.62 mm 20Colpi Traccianti (verdi) Caricatore + 7.62 mm 20 ranný zásobník, stopovka (Zelená) + 7.62 mm Magazynek 20szt. Smugowa (Zielona) + Magazine 7.62 mm 20 Balas Tracejantes (verdes) + 7.62 mm 20発入り 曳光弾 (緑) マガジン + + + Caliber: 7.62x51 mm NATO Tracer - Green<br />Rounds: 20<br />Used in: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Kaliber: 7,62x51 mm NATO Leuchtspur - grün<br />Patronen: 20<br />Eingesetzt von: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Калибр: 7.62x51 mm NATO, трассер Зеленый<br />Патронов: 20<br />Используется в: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Calibro: 7.62x51 mm NATO Traccianti - Verdi<br />Colpi: 20<br />Usati in: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Kalibr: 7.62×51 mm NATO Stopovka - Zelená<br />Nábojů: 20<br />Použito v: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Kaliber: 7.62x51 mm NATO Smugowa - Zielona<br />Sztuk: 20<br />Używana w: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Calibre: 7.62x51 mm NATO Tracejante - Verde<br/>Balas: 20<br/>Usado em: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + 口径: 7.62x51 mm NATO 曳光弾 - 緑<br />弾数: 20<br />使用武器: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + + + 7.62 mm 20Rnd Tracer (Yellow) Mag + 7,62 mm 20-Schuss-Magazin Leuchtspur (Gelb) + Магазин 20 патр. 7.62 мм трассирующих (Желтый) + 7.62 mm 20Colpi Traccianti (Gialli) Caricatori + 7.62 mm 20 ranný zásobník, stopovka (Žlutá) + 7.62 mm Magazynek 20szt. Smugowa (Żółta) + Magazine 7.62 mm 20 Balas Tracejantes (Amarelo) + 7.62 mm 20発入り 曳光弾 (黄) マガジン + + + Caliber: 7.62x51 mm NATO Tracer - Yellow<br />Rounds: 20<br />Used in: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Kaliber: 7,62x51 mm NATO Leuchtspur - gelb<br />Patronen: 20<br />Eingesetzt von: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Калибр: 7.62x51 mm NATO, трассер Желтый<br />Патронов: 20<br />Используется в: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Calibro: 7.62x51 mm NATO Traccianti - Gialli<br />Colpi: 20<br />Usati in: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Kalibr: 7.62×51 mm NATO Stopovka - Žlutá<br />Nábojů: 20<br />Použito v: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Kaliber: 7.62x51 mm NATO Smugowa - Żółta<br />Sztuk: 20<br />Używana w: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Calibre: 7.62x51 mm NATO Tracejante - Amarelo<br/>Balas: 20<br/>Usado em: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + 口径: 7.62x51 mm NATO 曳光弾 - 黄<br />弾数: 20<br />使用武器: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + + + 7.62mm 150Rnd Box Mixed (Red) + 7.62mm 150 Schuss Kiste Gemischt (rot) + Короб 150 патр. 7.62 мм TE4 (Красный) + 7.62mm 150Colpi Caricatore Maggiorato Misti (rossi) + 7.62 mm 150 ranný pás, částečná stopovka (Červená) + 7.62 mm Magazynek pudełkowy 150szt. Mieszana (Czerwona) + Caixa 7.62mm 150 Balas Misturadas (Vermelho) + 7.62 mm 150発入り 混合 (緑) ボックス + + + 7.62mm 150Rnd Box Mixed (Yellow) + 7.62mm 150 Schuss Kiste Gemischt (gelb) + Короб 150 патр. 7.62 мм TE4 (Желтый) + 7.62mm 150Colpi Caricatore Maggiorato Misti (Gialli) + 7.62 mm 150 ranný pás, částečná stopovka (Žlutá) + 7.62 mm Magazynek pudełkowy 150szt. Mieszana (Żółta) + Caixa 7.62mm 150 Balas Misturadas (Amarelo) + 7.62 mm 150発入り 混合 (黄) ボックス + + + 7.62mm 150Rnd Box Tracer (Red) + 7.62mm 150 Schuss Kiste Leuchtspur (rot) + Короб 150 патр. 7.62 мм трассирующих (Красный) + 7.62mm 150Colpi Caricatore Maggiorato (Rossi) + 7.62 mm 150 ranný pás, stopovka (Červená) + 7.62mm Magazynek pudełkowy 150szt. Smugowa (Czerwona) + Caixa 7.62mm 150 Balas Misturadas (Vermelho) + 7.62 mm 150発入り 曳光弾 (赤) ボックス + + + Caliber: 7.62x54 mm Tracer - Red<br />Rounds: 150<br />Used in: Zafir + Kaliber: 7.62x54 mm Leuchtspur - Rot<br />Patronen: 150<br />Verwendet in: Zafir + Калибр: 7.62x51 mm NATO, трассер Красный<br />Патронов: 150<br />Используется в: Zafir + Calibro: 7.62x54 mm Traccianti - Rossi<br />Colpi: 150<br />Usati in: Zafir + Kalibr: 7.62×54 mm Stopovka - Červená<br />Nábojů: 150<br />Použito v: Zafir + Kaliber: 7.62x54 mm Smugowa - Czerwona<br />Sztuk: 150<br />Używana w: Zafir + Calibre: 7.62x54 mm Tracejante - Vermelho<br/>Balas: 150<br/>Usado em:Zafir + 口径: 7.62x54 mm 曳光弾 - 赤<br />弾数: 150<br />使用武器: ザフィル + + + 7.62mm 150Rnd Box Tracer (Yellow) + 7.62mm 150 Schuss Kiste Leuchtspur (Rot) + Короб 150 патр. 7.62 мм трассирующих (Желтый) + 7.62mm 150Colpi Caricatore Maggiorato Traccianti (gialli) + 7.62 mm 150 ranný pás, stopovka (Žlutá) + 7.62 mm Magazynek pudełkowy 150szt. Smugowa (Żółta) + Caixa 7.62mm 150 Balas Tracejantes (Amarelo) + 7.62 mm 150発入り 曳光弾 (緑) ボックス + + + Caliber: 7.62x54 mm Tracer - Yellow<br />Rounds: 150<br />Used in: Zafir + Kaliber: 7.62x54 mm Leuchtspur - Gelb<br />Patronen: 150<br />Verwendet in: Zafir + Калибр: 7.62x51 mm NATO, трассер Желтый<br />Патронов: 150<br />Используется в: Zafir + Calibro: 7.62x54 mm Traccianti - Gialli<br />Colpi: 150<br />Usati in: Zafir + Kalibr: 7.62×54 mm Stopovka - Žlutá<br />Nábojů: 150<br />Použito v: Zafir + Kaliber: 7.62x54 mm Smugowa - Żółta<br />Sztuk: 150<br />Używana w: Zafir + Calibre: 7.62x54 mm Tracejante - Amarelo<br/>Balas: 150<br/>Usado em:Zafir + 口径: 7.62x54 mm 曳光弾 - 黄<br />弾数: 150<br />使用武器: ザフィル + + + 9.3mm 150Rnd Belt Mixed (Yellow) + 9.3mm 150 Schuss Gurt gemischt (Gelb) + Лента 150 патр. 9.3 мм TE4 (Желтый) + 9.3mm 150Colpi Caricatore Maggiorato (Giallo) + 9.3 mm 150 ranný pás, částečná stopovka (Žlutá) + 9.3 mm Taśma 150szt. Mieszana (Żółta) + Cinto 9.3mm 150 Balas Misturadas (Amarelo) + 9.3 mm 150発入り 混合 (黄) ベルト + + + 9.3mm 150Rnd Belt Mixed (Red) + 9.3mm 150 Schuss Gurt gemischt (Rot) + Лента 150 патр. 9.3 мм TE4 (Красный) + 9.3mm 150Colpi Caricatore Maggiorato (Rosso) + 9.3 mm 150 ranný pás, částečná stopovka (Červená) + 9.3 mm Taśma 150szt. Mieszana (Czerwona) + Cinto 9.3mm 150 Balas Misturadas (Vermelho) + 9.3 mm 150発入り 混合 (赤) ベルト + + + .338 NM 130Rnd Belt Mixed (Yellow) + .338 NM 130 Schuss Gurt gemischt (gelb) + Лента 130 патр. .338 NM TE4 (Желтый) + .338 NM 130Colpi Caricatore a nastro Misto (giallo) + .338 NM 130 ranný pás, částečná stopovka (Žlutá) + .338 NM Taśma 130szt. Mieszana (Żółta) + Cinto .338 NM Misturado (Amarelo) + .338 NM 130発入り 混合 (黄) ベルト + + + .338 NM 130Rnd Belt Mixed (Green) + .338 NM 130 Schuss Gurt gemischt (grün) + Лента 130 патр. .338 NM TE4 (Зеленый) + .338 NM 130Colpi Caricatore a nastro Misto (Verde) + .338 NM 130 ranný pás, částečná stopovka (Zelená) + .338 NM Taśma 130szt. Mieszana (Zielona) + Cinto .338 NM 130 Balas Misturados (Verde) + .338 NM 130発入り 混合 (緑) ベルト + + + + diff --git a/tools/check_strings.py b/tools/check_strings.py new file mode 100644 index 00000000000..78ad52b04e3 --- /dev/null +++ b/tools/check_strings.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# PabstMirror +# Checks all strings are defined, run with -u to return all unused strings + +import fnmatch +import os +import re +import sys + +def getDefinedStrings(filepath): + # print("getDefinedStrings {0}".format(filepath)) + with open(filepath, 'r', encoding="latin-1") as file: + content = file.read() + srch = re.compile('Key ID\=\"(STR_ACE_[_a-zA-Z0-9]*)"', re.IGNORECASE) + modStrings = srch.findall(content) + modStrings = [s.lower() for s in modStrings] + return modStrings + +def getStringUsage(filepath): + selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + # print("Checking {0} from {1}".format(filepath,selfmodule)) + fileStrings = [] + + with open(filepath, 'r') as file: + content = file.read() + + srch = re.compile('(STR_ACE_[_a-zA-Z0-9]*)', re.IGNORECASE) + fileStrings = srch.findall(content) + + srch = re.compile('[^E][CL]STRING\(([_a-zA-Z0-9]*)\)', re.IGNORECASE) + modStrings = srch.findall(content) + for localString in modStrings: + fileStrings.append("STR_ACE_{0}_{1}".format(selfmodule, localString)) + + srch = re.compile('E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + exStrings = srch.findall(content) + for (exModule, exString) in exStrings: + fileStrings.append("STR_ACE_{0}_{1}".format(exModule, exString)) + + srch = re.compile('IGNORE_STRING_WARNING\([\'"]*([_a-zA-Z0-9]*)[\'"]*\)') + ignoreWarnings = srch.findall(content) + + fileStrings = [s.lower() for s in fileStrings] + return [s for s in fileStrings if s not in (i.lower() for i in ignoreWarnings)] + +def main(argv): + print("### check_strings.py {} ###".format(argv)) + sqf_list = [] + xml_list = [] + + allDefinedStrings = [] + allUsedStrings = [] + + # Allow running from root directory as well as from inside the tools directory + rootDir = "../addons" + if (os.path.exists("addons")): + rootDir = "addons" + + for root, dirnames, filenames in os.walk(rootDir): + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.h'): + sqf_list.append(os.path.join(root, filename)) + + for filename in fnmatch.filter(filenames, '*.xml'): + xml_list.append(os.path.join(root, filename)) + + for filename in xml_list: + allDefinedStrings = allDefinedStrings + getDefinedStrings(filename) + for filename in sqf_list: + allUsedStrings = allUsedStrings + getStringUsage(filename) + + allDefinedStrings = list(sorted(set(allDefinedStrings))) + allUsedStrings = list(sorted(set(allUsedStrings))) + + print("-----------") + countUnusedStrings = 0 + countUndefinedStrings = 0 + for s in allDefinedStrings: + if (not (s in allUsedStrings)): + countUnusedStrings = countUnusedStrings + 1; + if ("-u" in argv): + print("String {} defined but not used".format(s)) + print("-----------") + for s in allUsedStrings: + if (not (s in allDefinedStrings)): + print("String {} not defined".format(s)) + countUndefinedStrings = countUndefinedStrings + 1; + print("-----------") + + print("Defined Strings:{0} Used Strings:{1}".format(len(allDefinedStrings),len(allUsedStrings))) + print("Unused Strings:{0} Undefined Strings:{1}".format(countUnusedStrings,countUndefinedStrings)) + + return countUndefinedStrings + +if __name__ == "__main__": + main(sys.argv) diff --git a/tools/deploy.py b/tools/deploy.py index 42b5a825a34..06697da05f3 100644 --- a/tools/deploy.py +++ b/tools/deploy.py @@ -4,7 +4,7 @@ # ACE3 automatic deployment script # # ================================ # # This is not meant to be run # -# directly! # +# directly!! # #################################### import os @@ -27,6 +27,8 @@ REPONAME = "ACE3" REPOPATH = "{}/{}".format(REPOUSER,REPONAME) +BRANCH = "master" + def update_translations(repo): diag = sp.check_output(["python3", "tools/stringtablediag.py", "--markdown"]) @@ -41,14 +43,11 @@ def update_dependencies(repo): diff = str(diff, "utf-8") if diff != "": - sha = repo.get_contents(DEPENDENCIESPATH - #, ref="travisForDocs" # Debug - ).sha + sha = repo.get_contents(DEPENDENCIESPATH, ref=BRANCH).sha repo.update_file( - path="/{}".format(DEPENDENCIESPATH), - message="[Docs] Update component dependencies\nAutomatically committed through Travis CI.\n\n[ci skip]", - content=dependencies, sha=sha, committer=InputGitAuthor("ace3mod", "ace3mod@gmail.com") - #, branch="travisForDocs" # Debug + path="{}".format(DEPENDENCIESPATH), + message="[Docs] Update component dependencies\nAutomatically committed through CI.\n\n[ci skip]", + content=dependencies, sha=sha, committer=InputGitAuthor("ace3mod", "ace3mod@gmail.com"), branch=BRANCH ) print("Dependencies successfully updated.") else: diff --git a/tools/event_rename.py b/tools/event_rename.py deleted file mode 100644 index 99dd261a02c..00000000000 --- a/tools/event_rename.py +++ /dev/null @@ -1,115 +0,0 @@ -import os -import sys -import re - -un_capitalize = lambda s: s[:1].lower() + s[1:] if s else '' - -def add_to_config(old, new): - with open(add_to_config.file, "r+") as file: - contents = file.read() - - events_class = re.search(r"class\s+ACE_newEvents\s+{\n",contents,re.I) - - if events_class: - newline_index = events_class.end() - insert = " {0} = \"{1}\";\n".format(old,new) - else: - newline_index = len(contents) - insert = "\nclass ACE_newEvents {{\n {0} = \"{1}\";\n}};".format(old,new) - - contents = contents[:newline_index] + insert + contents[newline_index:] - - file.seek(0) - file.write(contents) - file.truncate() - -def event_replace(match): - event = un_capitalize(match.group(1)) - add_to_config(match.group(1), "ace_" + event) - - return "[\"ace_{0}\", {1}] call CBA_fnc_{2}".format(event,match.group(2),match.group(3)) - -def process_directory(dir, config=""): - if not config: - config = os.path.join(dir,"config.cpp") - if os.path.isfile(config): - add_to_config.file = config - - for p in os.listdir(dir): - path = os.path.join(dir, p) - if os.path.isdir(path): - process_directory(path, config) - continue - - ext = os.path.splitext(path)[1] - if ext not in [".sqf",".hpp",".cpp"]: - continue - - with open(path, "r+") as file: - contents = file.read() - - # Simple single-line substitutions - find = r"\[\s*\"(?!ace_)(\w+)\"\s*,\s*(.+?)\s*\]\s+call\s+CBA_fnc_((add|remove|local|global|target|server)Event(Handler)?)" - contents, subbed = re.subn(find,event_replace,contents,0,re.I) - - # Handle multi-line code blocks - for match in re.finditer(r"\[\s*\"(?!ace_)(\w+)\"\s*,\s*({.+?})\s*\]\s+call\s*CBA_fnc_(add|remove)EventHandler",contents,re.I|re.S): - pair = 0 - for i, c in enumerate(contents[match.start(2):]): - if c == "{": - pair += 1 - elif c == "}": - pair -= 1 - if pair == 0: - pair = i - break - if re.match(r"\s*\]\s+call\s+CBA_fnc_(add|remove)EventHandler",contents[pair+match.start(2)+1:],re.I): - event = un_capitalize(match.group(1)) - add_to_config(match.group(1), "ace_" + event) - - contents = contents[:match.start(1)] + "ace_" + event + contents[match.end(1):] - subbed += 1 - - # Handle multi-line argument arrays - for match in re.finditer(r"\[\s*\"(?!ace_)(\w+)\"\s*,\s*(\[.+?\])\s*\]\s+call\s*CBA_fnc_(local|global|server)Event",contents,re.I|re.S): - pair = 0 - for i, c in enumerate(contents[match.start(2):]): - if c == "[": - pair += 1 - elif c == "]": - pair -= 1 - if pair == 0: - pair = i - break - if re.match(r"\s*\]\s+call\s+CBA_fnc_(local|global|server)Event",contents[pair+match.start(2)+1:],re.I): - event = un_capitalize(match.group(1)) - add_to_config(match.group(1), "ace_" + event) - - contents = contents[:match.start(1)] + "ace_" + event + contents[match.end(1):] - subbed += 1 - - if subbed > 0: - print("Making {0} substitutions: {1}".format(subbed,path)) - - file.seek(0) - file.write(contents) - file.truncate() - -def main(): - scriptpath = os.path.realpath(sys.argv[0]) - projectpath = os.path.dirname(os.path.dirname(scriptpath)) - addonspath = os.path.join(projectpath, "addons") - - os.chdir(addonspath) - - for p in os.listdir(addonspath): - path = os.path.join(addonspath, p) - if not os.path.isdir(path): - continue - if p[0] == ".": - continue - - process_directory(path) - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tools/generate_airfriction_config.py b/tools/generate_airfriction_config.py index ac312c08bae..9f18c407bbb 100644 --- a/tools/generate_airfriction_config.py +++ b/tools/generate_airfriction_config.py @@ -480,7 +480,7 @@ def calculateAirFriction(v, dragModel, bc): ["ACE_243_Winchester_Ball", [700, 900, 900], [830, 900, 920], 7, 0.278], ["ACE_762x67_Ball_Mk248_Mod_0", [800, 900, 900], [865, 900, 924], 7, 0.268], ["ACE_762x67_Ball_Mk248_Mod_1", [800, 900, 900], [847, 867, 877], 7, 0.310], - ["ACE_762x67_Ball_Berger_Hybrid_OTM", [900, 1000, 1000], [800, 853, 884], 7, 0.358], + ["ACE_762x67_Ball_Berger_Hybrid_OTM", [1100, 1200, 1300], [800, 853, 884], 7, 0.368], ["B_762x54_Ball", [500, 800, 800], [760, 835, 865], 1, 0.4], ["ACE_762x35_Ball", [400, 500], [620, 675], 1, 0.330], ["ACE_762x39_Ball", [400, 600], [650, 750], 1, 0.275], diff --git a/tools/make.ps1 b/tools/make.ps1 deleted file mode 100644 index 2aac0f2c9fd..00000000000 --- a/tools/make.ps1 +++ /dev/null @@ -1,130 +0,0 @@ -$projectRoot = Split-Path -Parent $PSScriptRoot -$releasePage = "https://github.com/KoffeinFlummi/armake/releases" -$downloadPage = "https://github.com/KoffeinFlummi/armake/releases/download/v{0}/armake_v{0}.zip" -$armake = "$projectRoot\tools\armake.exe" -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - - -function Compare-VersionNewerThan { - param( - [Parameter(Mandatory=$True)] - $version1, - - [Parameter(Mandatory=$True)] - $version2 - ) - - $version1 = $version1.Split(".") | % {[int] $_} - $version2 = $version2.Split(".") | % {[int] $_} - - $newer = $False - for ($i = 0; $i -lt $version1.Length; $i++) { - if ($version1[$i] -gt $version2[$i]) { - $newer = $True - break - } - } - - $newer -} - - -function Get-InstalledArmakeVersion { - if (Test-Path $armake) { - $version = & $armake --version - $version = $version.Substring(1) - } else { - $version = "0.0.0" - } - - $version -} - - -function Get-LatestArmakeVersion { - $client = New-Object Net.WebClient - $content = $client.DownloadString($releasePage) - $client.dispose() - - $match = $content -match "" - if (!$match) { - Write-Error "Failed to find valid armake download link." - $version = "0.0.0" - } else { - $version = $matches[1] - } - - $version -} - - -function Update-Armake { - param( - [Parameter(Mandatory=$True)] - $url - ) - - New-Item "$PSScriptRoot\temp" -ItemType "directory" -Force | Out-Null - - Write-Output "Downloading armake..." - $client = New-Object Net.WebClient - $client.DownloadFile($url, "$PSScriptRoot\temp\armake.zip") - $client.dispose() - - Write-Output "Download complete, unpacking..." - Expand-Archive "$PSScriptRoot\temp\armake.zip" "$PSScriptRoot\temp\armake" - Remove-Item "$PSScriptRoot\temp\armake.zip" - - if ([Environment]::Is64BitProcess) { - $binary = Get-ChildItem -Path "$PSScriptRoot\temp\armake" -Include "*.exe" -Recurse | Where-Object {$_.Name -match ".*w64.exe"} - } else { - $binary = Get-ChildItem -Path "$PSScriptRoot\temp\armake" -Include "*.exe" -Recurse | Where-Object {$_.Name -match ".*w64.exe"} - } - Move-Item $binary.FullName $armake -Force - - Remove-Item "$PSScriptRoot\temp" -Recurse -Force -} - - -function Build-Directory { - param( - [Parameter(Mandatory=$True)] - $directory - ) - - $component = $directory.Name - $fullPath = $directory.FullName - $parent = $directory.Parent - $binPath = "$projectRoot\@ace\$parent\ace_$component.pbo" - - Write-Output " PBO $component" - & $armake build -i "$projectRoot\include" -w unquoted-string -w redefinition-wo-undef -f $fullPath $binPath - - if ($LastExitCode -ne 0) { - Write-Error "Failed to build $component." - } -} - - -function Main { - $installed = Get-InstalledArmakeVersion - $latest = Get-LatestArmakeVersion - - if (Compare-VersionNewerThan $latest $installed) { - Write-Output "Found newer version of armake:" " Installed: $installed" " Latest: $latest" - Update-Armake ($downloadPage -f $latest) - Write-Output "Update complete, armake up-to-date." - } - - $orgLocation = Get-Location - Set-Location -Path $projectRoot - foreach ($folder in "addons", "optionals") { - New-Item "$projectRoot\@ace\$folder" -ItemType "directory" -Force | Out-Null - foreach ($component in Get-ChildItem -Directory "$PSScriptRoot\..\$folder") { - Build-Directory $component - } - } - Set-Location $orgLocation -} - -Main diff --git a/tools/make.py b/tools/make.py index 8e4509e1620..7452223f712 100644 --- a/tools/make.py +++ b/tools/make.py @@ -51,7 +51,7 @@ import time import timeit import re -import fileinput +from tempfile import mkstemp if sys.platform == "win32": import winreg @@ -72,8 +72,8 @@ prefix = "ace" pbo_name_prefix = "ace_" signature_blacklist = [] -importantFiles = ["mod.cpp", "README.md", "docs\\README_DE.md", "docs\\README_PL.md", "AUTHORS.txt", "LICENSE", "logo_ace3_ca.paa", "meta.cpp"] -versionFiles = ["README.md", "docs\\README_DE.md", "docs\\README_PL.md", "mod.cpp"] +importantFiles = ["mod.cpp", "README.md", "docs\\README_DE.md", "docs\\README_PL.md", "docs\\README.zh-TW.md", "AUTHORS.txt", "LICENSE", "logo_ace3_ca.paa", "meta.cpp"] +versionFiles = ["mod.cpp", "README.md", "docs\\README_DE.md", "docs\\README_PL.md", "docs\\README.zh-TW.md"] ciBuild = False # Used for CI builds @@ -334,11 +334,11 @@ def copy_important_files(source_dir,destination_dir): print_error("COPYING IMPORTANT FILES.") raise - # Copy all extension DLL's + # Copy all extensions try: os.chdir(os.path.join(source_dir)) print_blue("\nSearching for DLLs in {}".format(os.getcwd())) - filenames = glob.glob("*.dll") + filenames = glob.glob("*.dll") + glob.glob("*.so") if not filenames: print ("Empty SET") @@ -582,9 +582,15 @@ def get_project_version(version_increments=[]): def replace_file(filePath, oldSubstring, newSubstring): - for line in fileinput.input(filePath, inplace=True): - # Use stdout directly, print() adds newlines automatically - sys.stdout.write(line.replace(oldSubstring,newSubstring)) + fh, absPath = mkstemp() + with open(absPath, "w", encoding="utf-8") as newFile: + with open(filePath, encoding="utf-8") as oldFile: + for line in oldFile: + newFile.write(line.replace(oldSubstring, newSubstring)) + + newFile.close() + os.remove(filePath) + shutil.move(absPath, filePath) def set_version_in_files(): @@ -603,7 +609,7 @@ def set_version_in_files(): try: # Save the file contents to a variable if the file exists if os.path.isfile(filePath): - f = open(filePath, "r+") + f = open(filePath, "r+", encoding="utf-8") fileText = f.read() f.close() @@ -836,7 +842,6 @@ def main(argv): test -- Copy result to Arma 3. release -- Make archive with . force -- Ignore cache and build all. -checkexternal -- Check External Files target -- Use rules in make.cfg under heading [] rather than default [Make] key -- Use key in working directory with to sign. If it does not @@ -894,12 +899,6 @@ def main(argv): quiet = True argv.remove("quiet") - if "checkexternal" in argv: - argv.remove("checkexternal") - check_external = True - else: - check_external = False - if "version" in argv: argv.remove("version") version_update = True @@ -924,8 +923,6 @@ def main(argv): argv.remove("ci") ciBuild = True - print_yellow("\nCheck external references is set to {}".format(str(check_external))) - # Get the directory the make script is in. make_root = os.path.dirname(os.path.realpath(__file__)) make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) @@ -1268,13 +1265,10 @@ def main(argv): if os.path.isfile(nobinFilePath): print_green("$NOBIN$ Found. Proceeding with non-binarizing!") - cmd = [makepboTool, "-P","-A","-G","-N","-X=*.backup", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] + cmd = [makepboTool, "-P","-A","-X=*.backup", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] else: - if check_external: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] - else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] color("grey") if quiet: diff --git a/tools/pDummies/A3/Weapons_F_Tank/Launchers/Vorona/Data/UI/icon_rocket_vorona_HEAT_F_ca.paa b/tools/pDummies/A3/Weapons_F_Tank/Launchers/Vorona/Data/UI/icon_rocket_vorona_HEAT_F_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/A3/Weapons_F_Tank/Launchers/Vorona/Vorona_missile_heat_fly b/tools/pDummies/A3/Weapons_F_Tank/Launchers/Vorona/Vorona_missile_heat_fly new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/readme.md b/tools/pDummies/readme.md new file mode 100644 index 00000000000..c0e6378e775 --- /dev/null +++ b/tools/pDummies/readme.md @@ -0,0 +1 @@ +These are dummy files for p drive to allow building with pboProject (check externals now always enabled) - Normally extracted a3 is still required diff --git a/tools/pDummies/rhsafrf/addons/rhs_airweapons/rhs_m_pfm1_d b/tools/pDummies/rhsafrf/addons/rhs_airweapons/rhs_m_pfm1_d new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_airweapons/rhs_m_ptm1_d b/tools/pDummies/rhsafrf/addons/rhs_airweapons/rhs_m_ptm1_d new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/atgm/rhs_kornet_emptytube.p3d b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/atgm/rhs_kornet_emptytube.p3d new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/atgm/rhs_metis_emptytube.p3d b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/atgm/rhs_metis_emptytube.p3d new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/RHS_AGS30_TriPod_MSV_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/RHS_AGS30_TriPod_MSV_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/RHS_NSV_TriPod_MSV_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/RHS_NSV_TriPod_MSV_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_2b14_82mm_msv_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_2b14_82mm_msv_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_KORD_MSV_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_KORD_MSV_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_Kornet_9M133_2_msv_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_Kornet_9M133_2_msv_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_Metis_9k115_2_msv_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_Metis_9k115_2_msv_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_SPG9_INS_ca.paa b/tools/pDummies/rhsafrf/addons/rhs_heavyweapons/data/ico/rhs_SPG9_INS_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_blue_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_blue_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_green_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_green_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_red_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_red_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_white_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_msk40p_white_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_ozm72_a_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_ozm72_a_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_ozm72_b_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_ozm72_b_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_ozm72_c_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_ozm72_c_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_pmn2 b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_pmn2 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_sm320_green_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_sm320_green_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_sm320_red_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_sm320_red_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_sm320_white_e b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_sm320_white_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_tm62m b/tools/pDummies/rhsafrf/addons/rhs_weapons/mines/rhs_tm62m new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec200_e b/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec200_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec200_sand_e b/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec200_sand_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec400_e b/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec400_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec400_sand_e b/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec400_sand_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec75_e b/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec75_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec75_sand_e b/tools/pDummies/rhsafrf/addons/rhs_weapons2/explosives/rhs_ec75_sand_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/A200/A200_BZ_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/A200/A200_BZ_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/A200/A200_DZ35_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/A200/A200_DZ35_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Glasmine43/GLMI43_BZ_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Glasmine43/GLMI43_BZ_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Glasmine43/GLMI43_HZ_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Glasmine43/GLMI43_HZ_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M2A3B/M2A3_HELPER_TRIPWIRE b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M2A3B/M2A3_HELPER_TRIPWIRE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M2A3B/M2A3_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M2A3B/M2A3_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M2_TETRYTOL_x2/M2TET_x2_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M2_TETRYTOL_x2/M2TET_x2_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M3/M3_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M3/M3_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M3/M6M7FUZE_HELPER_TRIPWIRE b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M3/M6M7FUZE_HELPER_TRIPWIRE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M7A2/M7A2_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/M7A2/M7A2_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/MKII_BOOBYTRAP/MKII_TRAP_ITEM b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/MKII_BOOBYTRAP/MKII_TRAP_ITEM new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine35/SMI35_HELPER_TRIP b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine35/SMI35_HELPER_TRIP new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine35/SMI35_ITEM_PRESS b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine35/SMI35_ITEM_PRESS new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine44/SMI44_HELPER_TRIP b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine44/SMI44_HELPER_TRIP new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine44/SMI44_ITEM_PRESS b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Smine44/SMI44_ITEM_PRESS new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Stockmine43/STMI43_HELPER_2M b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Stockmine43/STMI43_HELPER_2M new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Stockmine43/STMI43_HELPER_4M b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/Stockmine43/STMI43_HELPER_4M new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/TM43/TM43 b/tools/pDummies/rhsgref/addons/rhsgref_weapons2/mines/TM43/TM43 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_M252_D_ca.paa b/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_M252_D_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_M2StaticMG_D_ca.paa b/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_M2StaticMG_D_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_MK19_TriPod_D_ca.paa b/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_MK19_TriPod_D_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_TOW_TriPod_D_ca.paa b/tools/pDummies/rhsusf/addons/rhsusf_heavyweapons/data/ico/RHS_TOW_TriPod_D_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/explosives/rhsusf_m112x1_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/explosives/rhsusf_m112x1_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/explosives/rhsusf_m112x4_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/explosives/rhsusf_m112x4_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m14_d b/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m14_d new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m14_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m14_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m19_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m19_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m49a1_a_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m49a1_a_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m49a1_b_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m49a1_b_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m49a1_c_e b/tools/pDummies/rhsusf/addons/rhsusf_weapons/mines/rhsusf_m49a1_c_e new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/pDummies/rhsusf/addons/rhsusf_weapons2/glock17g4/data/rhs_mag1_glock17g4_ca.paa b/tools/pDummies/rhsusf/addons/rhsusf_weapons2/glock17g4/data/rhs_mag1_glock17g4_ca.paa new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/search_privates.py b/tools/search_privates.py index 1cd0b7c180c..1fe5c14887b 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python3 import fnmatch import os @@ -9,105 +9,105 @@ def get_private_declare(content): priv_declared = [] - + srch = re.compile('private.*') priv_srch_declared = srch.findall(content) priv_srch_declared = sorted(set(priv_srch_declared)) - + priv_dec_str = ''.join(priv_srch_declared) - + srch = re.compile('(? 0: print (filepath) - + private_output = 'private['; first = True for bad_priv in missing: if first: first = False private_output = private_output + '"' + bad_priv - else: + else: private_output = private_output + '", "' + bad_priv - + private_output = private_output + '"];'; print (private_output) - + for bad_priv in missing: print ('\t' + bad_priv) bad_count_file = bad_count_file + 1 - - - + + + return bad_count_file - + def main(): print("#########################") @@ -116,20 +116,20 @@ def main(): sqf_list = [] bad_count = 0 - + parser = argparse.ArgumentParser() parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") args = parser.parse_args() - + for root, dirnames, filenames in os.walk('../addons' + '/' + args.module): for filename in fnmatch.filter(filenames, '*.sqf'): sqf_list.append(os.path.join(root, filename)) - + for filename in sqf_list: bad_count = bad_count + check_privates(filename) - - + + print ("Bad Count {0}".format(bad_count)) - + if __name__ == "__main__": main() diff --git a/tools/search_undefinedFunctions.py b/tools/search_undefinedFunctions.py index 1c281fa7176..fcbf690996b 100644 --- a/tools/search_undefinedFunctions.py +++ b/tools/search_undefinedFunctions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python3 import fnmatch import os @@ -7,52 +7,68 @@ import sys import argparse +# handle x64 python clipboard, ref https://forums.autodesk.com/t5/maya-programming/ctypes-bug-cannot-copy-data-to-clipboard-via-python/m-p/9197068/highlight/true#M10992 import ctypes - -#from http://stackoverflow.com/a/3429034 -#Get required functions, strcpy.. -strcpy = ctypes.cdll.msvcrt.strcpy -ocb = ctypes.windll.user32.OpenClipboard #Basic Clipboard functions -ecb = ctypes.windll.user32.EmptyClipboard -gcd = ctypes.windll.user32.GetClipboardData -scd = ctypes.windll.user32.SetClipboardData -ccb = ctypes.windll.user32.CloseClipboard -ga = ctypes.windll.kernel32.GlobalAlloc # Global Memory allocation -gl = ctypes.windll.kernel32.GlobalLock # Global Memory Locking -gul = ctypes.windll.kernel32.GlobalUnlock -GMEM_DDESHARE = 0x2000 - -def Get( ): - ocb(None) # Open Clip, Default task - pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy ... - data = ctypes.c_char_p(pcontents).value - #gul(pcontents) ? - ccb() - return data +from ctypes import wintypes +CF_UNICODETEXT = 13 + + +user32 = ctypes.WinDLL('user32') +kernel32 = ctypes.WinDLL('kernel32') + +OpenClipboard = user32.OpenClipboard +OpenClipboard.argtypes = wintypes.HWND, +OpenClipboard.restype = wintypes.BOOL +CloseClipboard = user32.CloseClipboard +CloseClipboard.restype = wintypes.BOOL +EmptyClipboard = user32.EmptyClipboard +EmptyClipboard.restype = wintypes.BOOL +GetClipboardData = user32.GetClipboardData +GetClipboardData.argtypes = wintypes.UINT, +GetClipboardData.restype = wintypes.HANDLE +SetClipboardData = user32.SetClipboardData +SetClipboardData.argtypes = (wintypes.UINT, wintypes.HANDLE) +SetClipboardData.restype = wintypes.HANDLE +GlobalLock = kernel32.GlobalLock +GlobalLock.argtypes = wintypes.HGLOBAL, +GlobalLock.restype = wintypes.LPVOID +GlobalUnlock = kernel32.GlobalUnlock +GlobalUnlock.argtypes = wintypes.HGLOBAL, +GlobalUnlock.restype = wintypes.BOOL +GlobalAlloc = kernel32.GlobalAlloc +GlobalAlloc.argtypes = (wintypes.UINT, ctypes.c_size_t) +GlobalAlloc.restype = wintypes.HGLOBAL +GlobalSize = kernel32.GlobalSize +GlobalSize.argtypes = wintypes.HGLOBAL, +GlobalSize.restype = ctypes.c_size_t + +GMEM_MOVEABLE = 0x0002 +GMEM_ZEROINIT = 0x0040 def Paste( data ): - ocb(None) # Open Clip, Default task - ecb() - hCd = ga( GMEM_DDESHARE, len( bytes(data,"ascii") )+1 ) - pchData = gl(hCd) - strcpy(ctypes.c_char_p(pchData),bytes(data,"ascii")) - gul(hCd) - scd(1,hCd) - ccb() + data = data.encode('utf-16le') + OpenClipboard(None) + EmptyClipboard() + handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, len(data) + 2) + pcontents = GlobalLock(handle) + ctypes.memmove(pcontents, data, len(data)) + GlobalUnlock(handle) + SetClipboardData(CF_UNICODETEXT, handle) + CloseClipboard() def getFunctions(filepath): - selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + selfmodule = (re.search(r'addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) # print("Checking {0} from {1}".format(filepath,selfmodule)) with open(filepath, 'r') as file: content = file.read() - srch = re.compile('[^E]FUNC\(([_a-zA-Z0-9]*)\)') + srch = re.compile(r'[^E]FUNC\(([_a-zA-Z0-9]*)\)') modfuncs = srch.findall(content) modfuncs = sorted(set(modfuncs)) - srch = re.compile('EFUNC\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + srch = re.compile(r'EFUNC\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') exfuncs = srch.findall(content) exfuncs = sorted(set(exfuncs)) @@ -67,17 +83,17 @@ def getFunctions(filepath): def getStrings(filepath): - selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + selfmodule = (re.search(r'addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) # print("Checking {0} from {1}".format(filepath,selfmodule)) with open(filepath, 'r') as file: content = file.read() - srch = re.compile('[^E][CL]STRING\(([_a-zA-Z0-9]*)\)') + srch = re.compile(r'[^E][CL]STRING\(([_a-zA-Z0-9]*)\)') modStrings = srch.findall(content) modStrings = sorted(set(modStrings)) - srch = re.compile('E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + srch = re.compile(r'E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') exStrings = srch.findall(content) exStrings = sorted(set(exStrings)) @@ -126,7 +142,7 @@ def main(): outputCode = "{0} allFunctions = {1}; allStrings = {2}; {3} {4}".format(codeHeader, list(set(allFunctions)), list(set(allStrings)), codeFuncCheck, codeStringCheck) print(outputCode) - Paste(outputCode); + Paste(outputCode) print ("") print ("Copied to clipboard, [funcs {0} / strings {1}]'".format(len(set(allFunctions)), len(set(allStrings)))) diff --git a/tools/search_unused_privates.py b/tools/search_unused_privates.py index 72a0dadcea5..04a1fc977d7 100644 --- a/tools/search_unused_privates.py +++ b/tools/search_unused_privates.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python3 import fnmatch import os @@ -9,98 +9,98 @@ def get_private_declare(content): priv_declared = [] - + srch = re.compile('private.*') priv_srch_declared = srch.findall(content) priv_srch_declared = sorted(set(priv_srch_declared)) - + priv_dec_str = ''.join(priv_srch_declared) - + srch = re.compile('(? 0: print (filepath) - + private_output = 'private['; first = True for bad_priv in unused: if first: first = False private_output = private_output + '"' + bad_priv - else: + else: private_output = private_output + '", "' + bad_priv - + private_output = private_output + '"];'; print (private_output) - + for bad_priv in unused: print ('\t' + bad_priv) bad_count_file = bad_count_file + 1 - - - + + + return bad_count_file - + def main(): print("#########################") @@ -109,20 +109,20 @@ def main(): sqf_list = [] bad_count = 0 - + parser = argparse.ArgumentParser() parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") args = parser.parse_args() - + for root, dirnames, filenames in os.walk('../addons' + '/' + args.module): for filename in fnmatch.filter(filenames, '*.sqf'): sqf_list.append(os.path.join(root, filename)) - + for filename in sqf_list: bad_count = bad_count + check_privates(filename) - - + + print ("Bad Count {0}".format(bad_count)) - + if __name__ == "__main__": main() diff --git a/tools/sqf_linter.py b/tools/sqf_linter.py index 46461eb3578..79df39195c0 100644 --- a/tools/sqf_linter.py +++ b/tools/sqf_linter.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python3 # Requires: https://github.com/LordGolias/sqf @@ -24,7 +24,7 @@ def analyze(filename, writer=sys.stdout): return 0, 1 exceptions = sqf.analyzer.analyze(result).exceptions - if (exceptions): + if (exceptions): print("{}:".format(filename)) for e in exceptions: if (e.message.startswith("error")): @@ -32,9 +32,9 @@ def analyze(filename, writer=sys.stdout): else: warnings += 1 writer.write(' [%d,%d]:%s\n' % (e.position[0], e.position[1] - 1, e.message)) - + return warnings, errors - + def main(): print("#########################") print("# Lint Check #") @@ -43,24 +43,24 @@ def main(): sqf_list = [] all_warnings = 0 all_errors = 0 - + parser = argparse.ArgumentParser() parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") args = parser.parse_args() - + for root, dirnames, filenames in os.walk('../addons' + '/' + args.module): for filename in fnmatch.filter(filenames, '*.sqf'): sqf_list.append(os.path.join(root, filename)) - + for filename in sqf_list: warnings, errors = analyze(filename) all_warnings += warnings all_errors += errors - + print ("Parse Errors {0} - Warnings {1}".format(all_errors,all_warnings)) # return (all_errors + all_warnings) return all_errors - + if __name__ == "__main__": main() diff --git a/tools/sqf_validator.py b/tools/sqf_validator.py index c45f0f94f2c..6686004ac44 100644 --- a/tools/sqf_validator.py +++ b/tools/sqf_validator.py @@ -48,6 +48,7 @@ def popClosing(): lastIsCurlyBrace = False checkForSemicolon = False + onlyWhitespace = True # Extra information so we know what line we find errors at lineNumber = 1 @@ -61,6 +62,7 @@ def popClosing(): checkForSemicolon = not re.search('findIf', content, re.IGNORECASE) if c == '\n': # Keeping track of our line numbers + onlyWhitespace = True # reset so we can see if # is for a preprocessor command lineNumber += 1 # so we can print accurate line number information when we detect a possible error if (isInString): # while we are in a string, we can ignore everything else, except the end of the string if (c == inStringType): @@ -84,7 +86,7 @@ def popClosing(): if (c == '"' or c == "'"): isInString = True inStringType = c - elif (c == '#'): + elif (c == '#' and onlyWhitespace): ignoreTillEndOfLine = True elif (c == '/'): checkIfInComment = True @@ -114,6 +116,9 @@ def popClosing(): print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) bad_count_file += 1 + if (c not in [' ', '\t', '\n']): + onlyWhitespace = False + if (checkForSemicolon): if (c not in [' ', '\t', '\n', '/']): # keep reading until no white space or comments checkForSemicolon = False diff --git a/tools/stringtable_validator.py b/tools/stringtable_validator.py new file mode 100644 index 00000000000..e367c48c468 --- /dev/null +++ b/tools/stringtable_validator.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import sys +import xml.etree.ElementTree as ET + +# STRINGTABLE VALIDATOR +# Author: mharis001 +# --------------------- +# Verifies all stringtable.xml files in the project. Checks for: +# - proper XML tree structure. +# - English as first translation. +# - no Original translation. +# - duplicated entries and languages. + + +######## GLOBALS ######### +PROJECT_NAME = "ACE" +########################## + + +def check_stringtable(filepath): + try: + tree = ET.parse(filepath) + except Exception as e: + print(" ERROR: Failed to parse file. {}".format(e)) + return 1 + + errors = 0 + + # Verify that the root tag is Project and its name attribute is the project name + root = tree.getroot() + + if root.tag != "Project": + print(" ERROR: Invalid root tag '{}' found, must be 'Project'.".format(root.tag)) + errors += 1 + + if root.get("name") != PROJECT_NAME: + print(" ERROR: Invalid name attribute '{}' for Project tag, must be '{}'.".format(root.get("name"), PROJECT_NAME)) + errors += 1 + + # Verify that the root has a Package tag and its name attribute matches the component's folder name + package = root.find("Package") + + if package is None: + print(" ERROR: Failed to find 'Package' tag under 'Project' tag.") + errors += 1 + else: + package_name = package.get("name") + + if package_name.islower(): + print(" ERROR: Package name attribute '{}' is all lowercase, should be in titlecase.".format(package_name)) + errors += 1 + + if package_name.lower() != os.path.basename(os.path.dirname(filepath)): + print(" ERROR: Package name attribute '{}' does not match the component folder name.".format(package_name)) + errors += 1 + + # Get all keys contained in the stringtable + keys = package.findall("Key") + + for container in package.findall("Container"): + keys.extend(container.findall("Key")) + + key_ids = [] + key_prefix = "STR_{}_{}_".format(PROJECT_NAME, package_name) + + for key in keys: + key_id = key.get("ID") + + # Verify that the key has a valid ID attribute + if key_id is None: + print(" ERROR: Key '{}' had no ID attribute.".format(key_id)) + errors += 1 + elif key_id.find(key_prefix) != 0: + print(" ERROR: Key '{}' does not have a valid ID attribute, should be in format {}{{name}}.".format(key_id, key_prefix)) + errors += 1 + + key_ids.append(key_id) + + # Verify language entries for the key, check that the key: + # - contains at least one translation + # - does not contain an Original translation + # - has English as the first listed translation + # - has only one entry for each language + entries = list(key) + + if len(entries) == 0: + print(" ERROR: Key '{}' has no translation entries.".format(key_id)) + errors += 1 + else: + if not key.find("Original") is None: + print(" ERROR: Key '{}' has an Original translation, unnecessary with English as first.".format(key_id)) + errors += 1 + + if entries[0].tag != "English": + print(" ERROR: Key '{}' does not have its English translation listed first.".format(key_id)) + errors += 1 + + languages = list(map(lambda l: l.tag, entries)) + + for language in set(languages): + count = languages.count(language) + + if count > 1: + print(" ERROR: Key '{}' has {} {} translations.".format(key_id, count, language)) + errors += 1 + + # Verify that key IDs are unique + for id in set(key_ids): + count = key_ids.count(id) + + if count > 1: + print(" ERROR: Key '{}' is defined {} times.".format(id, count)) + errors += 1 + + # Check whitespace for tabs and correct number of indenting spaces + with open(filepath, "r", encoding = "utf-8") as file: + spacing_depth = 0 + + for line_number, line in enumerate(file, 1): + if "\t" in line: + print(" ERROR: Found a tab on line {}.".format(line_number)) + errors += 1 + + line_clean = line.lstrip().lower() + + if line_clean.startswith("