diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 08c731127a..af6ab70854 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -34,11 +34,11 @@ We welcome anyone to contribute to this repository. Issues that we are actively ## Pull Request process -When contributing to this repository, please first discuss the change you wish to make via issue or [Slack](https://slackin.ace3mod.com/) with the [ACE3 project maintainers](https://ace3mod.com/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already. +When contributing to this repository, please first discuss the change you wish to make via issue or [Discord](https://acemod.org/discord) with the [ACE3 project maintainers](https://ace3.acemod.org/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already. 1. Please make a pull request (PR) as early as possible. This lets use help you in the proces of developing it. When opening a work in progress pull request, mark your PR with a `WIP:` prefix. 2. Describe what this pull request will do and how it solves this in the description of your PR. A clear intent and description of the way the issue is resolved will help us to review the PR more efficiently. -3. Please follow our [Development Guidelines](https://ace3mod.com/wiki/development/). +3. Please follow our [Development Guidelines](https://ace3.acemod.org/wiki/development/). ### Notes @@ -47,4 +47,4 @@ Please note that all contributors to this project are volunteers and do this in ## Assistance with contributing -If you require assistance with contributing, check out the #dev channel on our [Slack](https://slackin.ace3mod.com/). Additional documentation can be found on our [Development wiki](https://ace3mod.com/wiki/development/). +If you require assistance with contributing, check out the #dev channel on our [Discord](https://acemod.org/discord). Additional documentation can be found on our [Development wiki](https://ace3.acemod.org/wiki/development/). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2dd93748a3..c71190ce39 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,7 +30,7 @@ All good? Then proceed and fill out the items below. 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)!_ +_Follow [https://ace3.acemod.org/img/wiki/user/issue_flowchart.webp](this flowchart)!_ 1. _Go to ..._ 2. _Click ..._ diff --git a/.github/ISSUE_TEMPLATE/enhancement-request.md b/.github/ISSUE_TEMPLATE/enhancement-request.md deleted file mode 100644 index e4f5abcb54..0000000000 --- a/.github/ISSUE_TEMPLATE/enhancement-request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -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 index 45e10cf0cb..2bba1a5dd1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -9,4 +9,4 @@ 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). +Learn how to make a feature request [here](https://ace3.acemod.org/wiki/user/how-to-make-a-feature-request.html). diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ea83a609e3..5f42f937fe 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,9 @@ **When merged this pull request will:** -- Describe what this pull request will do -- 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` +- _Describe what this pull request will do_ +- _Each change in a separate line_ + +### IMPORTANT + +- [ ] If the contribution affects [the documentation](https://github.com/acemod/ACE3/tree/master/docs), please include your changes in this pull request so the documentation will appear on the [website](https://ace3.acemod.org/). +- [ ] [Development Guidelines](https://ace3.acemod.org/wiki/development/) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml index bc294377f3..669873d504 100644 --- a/.github/workflows/arma.yml +++ b/.github/workflows/arma.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the source code - uses: actions/checkout@master + uses: actions/checkout@v3 - name: Validate SQF run: python3 tools/sqf_validator.py - name: Validate Config @@ -22,12 +22,14 @@ jobs: run: python3 tools/check_strings.py - name: Check for BOM uses: arma-actions/bom-check@master + - name: Validate function headers + run: python3 docs/tools/document_functions.py --debug lint: runs-on: ubuntu-latest steps: - name: Checkout the source code - uses: actions/checkout@master + uses: actions/checkout@v3 - name: Lint (sqflint) uses: arma-actions/sqflint@master continue-on-error: true # No failure due to many false-positives @@ -36,13 +38,15 @@ jobs: 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 + uses: actions/checkout@v3 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT build + run: hemtt build + - name: Rename build folder + run: mv .hemttout/build .hemttout/@ace - name: Upload Artifact - uses: actions/upload-artifact@v2-preview + uses: actions/upload-artifact@v3 with: name: ace3-${{ github.sha }}-nobin - path: releases/ace3_*.zip + path: .hemttout/@* diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b0263abf8c..770921c96c 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -4,13 +4,18 @@ on: push: branches: - master + workflow_dispatch: + +concurrency: + group: "pages" + cancel-in-progress: false jobs: update: runs-on: ubuntu-latest steps: - name: Checkout the source code - uses: actions/checkout@master + uses: actions/checkout@v3 - name: Install Python packages run: | pip3 install wheel @@ -22,3 +27,59 @@ jobs: env: GH_TOKEN: ${{ secrets.DOCS_TOKEN }} run: python3 tools/deploy.py + + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Extract Dependencies + run: python3 tools/extract_dependencies.py --markdown + - name: Document Functions + run: python3 docs/tools/document_functions.py + + - name: Build with Jekyll + uses: actions/jekyll-build-pages@v1 + with: + source: docs/ + destination: docs/_site/ + + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: jekyll-site + path: docs/_site/ + retention-days: 1 + + deploy: + runs-on: ubuntu-latest + needs: [build] + + environment: + name: netlify + url: ${{ steps.deployment.outputs.deploy-url }} + + steps: + - name: Download Artifacts + uses: actions/download-artifact@v3 + with: + name: jekyll-site + path: _site/ + + - name: Deploy to Netlify + id: deployment + uses: nwtgck/actions-netlify@v2 + with: + publish-dir: _site/ + production-branch: master + production-deploy: true + deploy-message: ${{ github.event.head_commit.message }} + enable-pull-request-comment: false + enable-commit-comment: false + enable-commit-status: true + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + timeout-minutes: 1 diff --git a/.github/workflows/extensions.yml b/.github/workflows/extensions.yml index 06e4737e80..2fd0c9a4a4 100644 --- a/.github/workflows/extensions.yml +++ b/.github/workflows/extensions.yml @@ -7,14 +7,14 @@ on: jobs: build: - runs-on: ${{ matrix. os }} + runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-latest] steps: - name: Checkout the source code - uses: actions/checkout@master + uses: actions/checkout@v3 - name: Build shell: cmd run: | @@ -23,7 +23,7 @@ jobs: cd build cmake .. && cmake --build . - name: Upload Artifact - uses: actions/upload-artifact@master + uses: actions/upload-artifact@v3 with: name: ace3_extensions-${{ matrix.os }}-debug path: extensions/build diff --git a/.github/workflows/pboproject.yml b/.github/workflows/pboproject.yml index 4aea0e7c18..5701966e44 100644 --- a/.github/workflows/pboproject.yml +++ b/.github/workflows/pboproject.yml @@ -8,14 +8,14 @@ on: jobs: pboproject: - runs-on: windows-2019 + runs-on: windows-2022 steps: - name: Install Arma 3 Tools uses: arma-actions/arma3-tools@master with: toolsUrl: ${{ secrets.ARMA3_TOOLS_URL }} - name: Install Mikero Tools - uses: arma-actions/mikero-tools@2021-04-10 + uses: arma-actions/mikero-tools@2023-01-04 - name: Download game data run: | Invoke-WebRequest "$env:ARMA3_DATA_URL" -OutFile arma3.zip @@ -35,18 +35,18 @@ jobs: RHSSAF_URL: ${{ secrets.RHSSAF_URL }} RHSUSF_URL: ${{ secrets.RHSUSF_URL }} - name: Checkout CBA A3 - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: x\cba ref: master repository: CBATeam/CBA_A3.git - name: Checkout ACE3 - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: z\ace persist-credentials: false - name: Checkout pull request - uses: actions/checkout@v2 + uses: actions/checkout@v3 if: ${{ github.event_name == 'pull_request_target' }} with: path: pullrequest @@ -56,13 +56,14 @@ jobs: run: | rm -r z\ace\addons\ rm -r z\ace\optionals\ + rm -r z\ace\tools\pDummies\ xcopy /e /h /q pullrequest\addons z\ace\addons\ xcopy /e /h /q pullrequest\optionals z\ace\optionals\ + xcopy /e /h /q pullrequest\tools\pDummies z\ace\tools\pDummies\ - name: Setup build environment run: | subst P: . pboproject -P - xcopy /e /h /q z\ace\tools\pDummies\A3\ui_f_enoch a3\ui_f_enoch\ xcopy /e /h /q z\ace\tools\pDummies\gm gm\ xcopy /e /h /q z\ace\tools\pDummies\vn vn\ - name: Build @@ -70,13 +71,13 @@ jobs: env: PYTHONUNBUFFERED: 1 - name: Archive logs - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 if: ${{ always() }} with: name: logs path: temp/*.log - name: Archive @ace - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: '@ace3-${{ github.sha }}' path: z\ace\release\@ace diff --git a/.gitignore b/.gitignore index 93f758c4cd..8a7e6945a6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ extensions/vcproj64/* .vscode/* hemtt hemtt.exe +.hemttout tools/temp *.cache *.pbo diff --git a/.hemtt/hooks/post_build/01_move_readmes.rhai b/.hemtt/hooks/post_build/01_move_readmes.rhai new file mode 100644 index 0000000000..8f359ade51 --- /dev/null +++ b/.hemtt/hooks/post_build/01_move_readmes.rhai @@ -0,0 +1,4 @@ +let docs_readmes = ["README.zh-TW.md", "README_DE.md", "README_PL.md"]; +for readme in docs_readmes { + HEMTT_VFS.join("docs").join(readme).move(HEMTT_VFS.join(readme)); +} diff --git a/.hemtt/hooks/post_release/01_rename_zip.rhai b/.hemtt/hooks/post_release/01_rename_zip.rhai new file mode 100644 index 0000000000..c8200358f8 --- /dev/null +++ b/.hemtt/hooks/post_release/01_rename_zip.rhai @@ -0,0 +1,9 @@ +let releases = HEMTT_RFS.join("releases"); + +let src = releases.join(HEMTT.project().prefix() + "-" + HEMTT.project().version().to_string() + ".zip"); +let dst = releases.join(HEMTT.project().name().to_lower() + "_" + HEMTT.project().version().to_string_short() + ".zip"); + +print("Moving zip to " + dst); +if !src.move(dst) { + fatal("Failed to move " + src + " to " + dst); +} diff --git a/.hemtt/hooks/pre_build/01_set_version.rhai b/.hemtt/hooks/pre_build/01_set_version.rhai new file mode 100644 index 0000000000..e34fe201be --- /dev/null +++ b/.hemtt/hooks/pre_build/01_set_version.rhai @@ -0,0 +1,12 @@ +let modcpp = HEMTT_VFS.join("mod.cpp").open_file().read(); +modcpp.replace("0.0.0", HEMTT.project().version().to_string_short()); +HEMTT_VFS.join("mod.cpp").create_file().write(modcpp); +print("mod.cpp version set"); + +let docs_readmes = ["README.zh-TW.md", "README_DE.md", "README_PL.md"]; +for readme in docs_readmes { + let readmemd = HEMTT_VFS.join("docs").join(readme).open_file().read(); + readmemd.replace("0.0.0", HEMTT.project().version().to_string_short()); + HEMTT_VFS.join("docs").join(readme).create_file().write(readmemd); + print(readme + " version set"); +} diff --git a/.hemtt/project.toml b/.hemtt/project.toml new file mode 100644 index 0000000000..a8e50e494d --- /dev/null +++ b/.hemtt/project.toml @@ -0,0 +1,46 @@ +name = "ACE3" +prefix = "ace" +author = "ACE-Team" +mainprefix = "z" + +[files] +include = [ + "*.dll", + "*.so", + "mod.cpp", + "README*.md", # Translated READMEs get moved to root in a hook (virtual file system) + "AUTHORS.txt", + "LICENSE", + "logo_ace3_ca.paa", + "meta.cpp", +] + +[version] +git_hash = 0 + +[asc] +enabled = true +exclude = [ + "/initsettings.sqf", + "/initkeybinds.sqf", + "/xeh_prep.sqf", + "dev", + "medical_ai/statemachine.sqf", + "common/functions/fnc_dummy.sqf", +] + +[hemtt.config] +preset = "Hemtt" + +[hemtt.launch] +workshop = [ + "450814997", # CBA_A3's Workshop ID +] + +[hemtt.launch.vn] +workshop = [ + "450814997", # CBA_A3's Workshop ID +] +dlc = [ + "S.O.G. Prairie Fire", +] diff --git a/AUTHORS.txt b/AUTHORS.txt index 3b3c7a669c..c51fbe52fc 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -6,24 +6,26 @@ # request, preferably including an email address. # CORE TEAM -Brandon (TCVM) +Brett Mayson bux578 commy2 Dahlgren +tcvm esteldunedain Felix Wiegand Garth "L-H" de Wet Giallustio Glowbal +Grim Janus jokoho482 Jonpas Kieran +kymckay mharis001 NouberNou PabstMirror Ruthberg -SilentSpike tpM veteran29 ViperMaul @@ -35,13 +37,14 @@ Walter Pearce 11RDP-LoupVert 654wak654 [BIG]Bull -ACCtomeek +ACCtomeek adam3adam Adanteh aeroson Aggr094 alef Aleksey EpMAK Yermakov +AleM Alganthe Andrea "AtixNeon" Verano Anthariel @@ -57,7 +60,6 @@ Bla1337 BlackPixxel BlackQwar Brakoviejo -Brett Mayson Brisse Brostrom.A | Evul BullHorn @@ -68,6 +70,7 @@ Clon1998 Codingboy Coren Crusty +Cyruz143 dabako dgibso29 Dharma Bellamkonda @@ -111,6 +114,7 @@ Hawkins Head Hybrid V JasperRab +JDT john681611 JoramD Karneck @@ -118,6 +122,7 @@ Kavinsky Keithen Kllrt KokaKolaA3 +Krzyciu legman Legolasindar "Viper" licht-im-Norden87 @@ -129,7 +134,9 @@ MarcBook meat Michail Nikolaev MikeMatrix +MikeMF mjc4wilton +Mysteryjuju nic547 nikolauska nomisum @@ -143,15 +150,19 @@ PiZZADOX <509thParachuteInfantry@gmail.com> pokertour Professor Pterolatypus +QuantX QuickDagger rakowozz ramius86 Raspu86 +RcINS Riccardo Petricca Robert Boklahánics ruPaladin Rutger "RedBery" Meijering +sancron Schwaggot +Seb shukari simon84 Skengman2 @@ -160,19 +171,20 @@ Sniperwolf572 System98 SzwedzikPL Tachi +tbeswick96 Tessa Elieff Timi007 Toaster Tonic Tourorist Tuupertunut -TyroneMF Valentin Torikian voiper VyMajoris(W-Cephei) Walthzer Winter wizpig64 +YetheSamartaka xrufix Zakant zGuba diff --git a/Arma3_workshop_addon.jpg b/Arma3_workshop_addon.jpg deleted file mode 100644 index ffc430d688..0000000000 Binary files a/Arma3_workshop_addon.jpg and /dev/null differ diff --git a/README.md b/README.md index 6d8d5aebae..c92c33abe8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@

- + +

- ACE3 Version + ACE3 Version ACE3 Issues @@ -18,8 +19,8 @@ ACE3 License - - ACE3 Slack + + ACE3 Discord ACE3 Build Status @@ -78,8 +79,8 @@ The mod is **built modularly**, so almost any included PBO can be easily removed ACE3 requires Arma 3 and the latest version of CBA A3. See the following pages for help and information on how to get started with ACE3: -- [Installation guide](https://ace3mod.com/wiki/user/installation-guide.html) -- [Information center](https://ace3mod.com/wiki/user/information-center.html) +- [Installation guide](https://ace3.acemod.org/wiki/user/installation-guide.html) +- [Information center](https://ace3.acemod.org/wiki/user/information-center.html) ## Contributing @@ -87,26 +88,24 @@ You can help out with the ongoing development by looking for potential bugs in o ### Contribution guidelines -To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. See [the pull request guidelines](https://ace3mod.com/wiki/development/merging-pull-requests.html) for further information on this process. +To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. See [the pull request guidelines](https://ace3.acemod.org/wiki/development/merging-pull-requests.html) for further information on this process. ### Submitting issues and requesting features Please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues) to report a bug, propose a feature, or suggest changes to the existing ones. See also: -- [How to report an issue](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [How to make a feature request](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [How to report an issue](https://ace3.acemod.org/wiki/user/how-to-report-an-issue.html) +- [How to make a feature request](https://ace3.acemod.org/wiki/user/how-to-make-a-feature-request.html) ### Testing & building -To help us test the latest development changes, download our master branch ([directly](https://github.com/acemod/ACE3/archive/master.zip), or [with git](https://help.github.com/articles/fetching-a-remote/)), then assemble a test build: - -- [Setting up the development environment](https://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE3 for testing purposes. +To help us test the latest development changes, download the [artifact](https://github.com/acemod/ACE3/actions/workflows/arma.yml) of the branch you'd like to test or subscribe to [nightly build](https://steamcommunity.com/sharedfiles/filedetails/?id=1882627645) to test `master` branch. Alternatively [build your own version](https://ace3.acemod.org/wiki/development/setting-up-the-development-environment.html). ### Get in touch - - + + diff --git a/addons/advanced_ballistics/ACE_Settings.hpp b/addons/advanced_ballistics/ACE_Settings.hpp index d90a4e748f..a34547249c 100644 --- a/addons/advanced_ballistics/ACE_Settings.hpp +++ b/addons/advanced_ballistics/ACE_Settings.hpp @@ -4,7 +4,7 @@ class ACE_Settings { }; class GVAR(muzzleVelocityVariationEnabled) { movedToSQF = 1; - }; + }; class GVAR(ammoTemperatureEnabled) { movedToSQF = 1; }; diff --git a/addons/advanced_ballistics/RscTitles.hpp b/addons/advanced_ballistics/RscTitles.hpp index 1e29db268b..759f341a0c 100644 --- a/addons/advanced_ballistics/RscTitles.hpp +++ b/addons/advanced_ballistics/RscTitles.hpp @@ -42,7 +42,7 @@ class RscTitles { x="SafeZoneX + 0.001"; y="SafeZoneY + 0.001"; w=0.2; - h=0.2*4/3; + h="0.2*4/3"; size=0.034; sizeEx=0.027; text=""; @@ -52,4 +52,4 @@ class RscTitles { }; }; }; -}; \ No newline at end of file +}; diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index 43299a0e38..9ff22efe95 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -28,7 +28,7 @@ if (!hasInterface) exitWith {}; //Add warnings for missing compat PBOs (only if AB is on) { _x params ["_modPBO", "_compatPBO"]; - if ((isClass (configFile >> "CfgPatches" >> _modPBO)) && {!isClass (configFile >> "CfgPatches" >> _compatPBO)}) then { + if ([_modPBO] call EFUNC(common,isModLoaded) && {!([_compatPBO] call EFUNC(common,isModLoaded))}) then { WARNING_2("Weapon Mod [%1] missing ace compat pbo [%2] (from @ace\optionals)",_modPBO,_compatPBO); }; } forEach [ diff --git a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf index 2ead82fa12..6bc5a82fa2 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf index b574698931..c8486d7040 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf index e28ccd2523..5cf4a3af72 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg, MikeMatrix, joko // Jonas * diff --git a/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf b/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf index 184ee6970d..ccd7363f9b 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf b/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf index cf6dbb03b1..2ee8ce3e3a 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf b/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf index d2f5cba98f..a2156349f6 100644 --- a/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf +++ b/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf @@ -1,5 +1,5 @@ #define DEBUG_MODE_FULL -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * @@ -68,7 +68,7 @@ for "_i" from 0 to (count _cfgWeapons)-1 do { private _barrelVelocityShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, _vanillaInitialSpeed] call FUNC(calculateBarrelLengthVelocityShift); private _abInitialSpeed = _vanillaInitialSpeed + _barrelVelocityShift; // -------------------------------------------------- - + if (_weapon find "_base" == -1 && _weapon find "_Base" == -1) then { #ifdef DEBUG_INIT_SPEEDS _data pushBack [-_forEachIndex, _abInitialSpeed, _magazine, _weapon]; diff --git a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf index 714aaa31ef..ceaef17bad 100644 --- a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf +++ b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf index 12199db154..e9180cb1c4 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg, joko // Jonas * Handle the PFH for Bullets diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index ec1d37c42a..a167d027f3 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * @@ -31,12 +31,14 @@ if (_abort) then { private _maxRange = uiNamespace getVariable format[QGVAR(maxRange_%1), _ammo]; if (isNil "_maxRange") then { private _airFriction = getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction"); - private _maxRange = if (_airFriction < 0) then { + private _vanillaInitialSpeed = getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); + _maxRange = if (_airFriction < 0) then { private _maxTime = ((_vanillaInitialSpeed - BULLET_TRACE_MIN_VELOCITY) / (BULLET_TRACE_MIN_VELOCITY * -_airFriction * _vanillaInitialSpeed)) max getNumber(configFile >> "CfgAmmo" >> _ammo >> "tracerEndTime"); -ln(1 - _airFriction * _vanillaInitialSpeed * _maxTime) / _airFriction } else { _vanillaInitialSpeed * getNumber(configFile >> "CfgAmmo" >> _ammo >> "tracerEndTime") }; + _maxRange = _maxRange * 1.3; // Adding 30% more to range just to be safe 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 {}; diff --git a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf index 83e11175d3..4bb5d080cd 100644 --- a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf +++ b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * Module for adjusting the advanced ballistics settings diff --git a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf index 8ff8052745..6af9efca24 100644 --- a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf +++ b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Initializes the advanced ballistics extension with terrain data @@ -19,7 +19,7 @@ if (!hasInterface) exitWith {}; if (!GVAR(enabled)) exitWith {}; private _initStartTime = diag_tickTime; -private _mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); +private _mapSize = worldSize; if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith { INFO_1("Terrain already initialized [world: %1]", worldName); diff --git a/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf b/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf index 845045e1cb..103ce3d1cd 100644 --- a/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf +++ b/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf b/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf index dbc9999824..bf0e23f97c 100644 --- a/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf +++ b/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/advanced_ballistics/functions/script_component.hpp b/addons/advanced_ballistics/functions/script_component.hpp deleted file mode 100644 index 2c718bf9db..0000000000 --- a/addons/advanced_ballistics/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\advanced_ballistics\script_component.hpp" \ No newline at end of file diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 843f508ea1..eb9d865c79 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -49,7 +49,7 @@ アドバンスド バリスティックス고급 탄도학先進彈道系統 - 先进弹道系统 + 进阶弹道系统Gelişmiş Balistik @@ -66,7 +66,7 @@ アドバンスド バリスティックスを有効化 고급 탄도학 先進彈道系統 - 先进弹道系统 + 进阶弹道系统 Gelişmiş Balistik @@ -83,7 +83,7 @@ アドバンスド バリスティックスを有効化します。 고급 탄도학을 적용합니다 啟用先進彈道系統 - 启用先进弹道系统 + 启用进阶弹道系统 Gelişmiş balistiği etkinleştir @@ -200,7 +200,7 @@ 弾丸の軌跡エフェクトを有効化 예광탄 효과 적용 啟用曳光彈效果 - 启用曳光弹效果 + 启用子弹尾迹效果 İzli Mermi Etkisini Etkinleştir @@ -217,7 +217,7 @@ 大口径弾の軌跡エフェクトを有効化します。 (高性能光学機器を介してのみ見ることができます) 대구경 탄환에 예광탄 효과를 적용합니다(오직 고성능 조준경 사용시에만 보입니다) 啟用曳光彈效果給大口徑子彈 (只有透過高倍率光學瞄鏡才能看到) - 启用曳光弹效果给大口径子弹 (只有透过高倍率光学瞄镜才能看到) + 给大口径子弹启用子弹尾迹效果(只有透过高倍率光学瞄镜才能看到) Yüksek kalibreli mermilere mermi izleme efekti sağlar (yalnızca yüksek güçlü optiklerden bakıldığında görülebilir) @@ -250,7 +250,7 @@ 各シミュレーション毎の間隔を定義します。 각 계산 단위의 간격을 정의합니다 定義每個模擬計算之間的時間間隔 - 定义每个模拟计算之间的时间间隔 + 定义每个计算步骤之间的间隔 Simulation Radius @@ -283,7 +283,7 @@ アドバンスド バリスティックスの適用半径範囲 (プレイヤー中心、メートル単位) を定義します。 플레이어 주위의 발사체를 고급 탄도학으로 정의하는 범위를 정합니다(미터) 以玩家的半徑距離(公尺)定義先進彈道系統啟用範圍 - 以玩家的半径距离(公尺)定义先进弹道系统启用范围 + 定义玩家周围的半径(米),在这个半径内,进阶弹道系统会被启用 Mermilere gelişmiş balistik uygulandığı oyuncunun etrafındaki yarıçapı (metre cinsinden) tanımlar @@ -300,7 +300,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_PREP.hpp b/addons/advanced_fatigue/XEH_PREP.hpp index c6250516f5..4ee00e3ce4 100644 --- a/addons/advanced_fatigue/XEH_PREP.hpp +++ b/addons/advanced_fatigue/XEH_PREP.hpp @@ -2,6 +2,7 @@ PREP(addDutyFactor); PREP(createStaminaBar); PREP(getAnimDuty); PREP(getMetabolicCosts); +PREP(getWeaponInertia); PREP(handleEffects); PREP(handlePlayerChanged); PREP(handleStaminaBar); diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index 5a8b2d4efe..56dcb71372 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -2,22 +2,27 @@ if (!hasInterface) exitWith {}; -[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { - private _unit = ACE_player; - private _fatigue = _unit getVariable [QGVAR(aimFatigue), 0]; - - switch (stance _unit) do { +["baseline", { + private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0]; + switch (stance ACE_player) do { case ("CROUCH"): { - (1.0 + _fatigue ^ 2 * 0.1) * GVAR(swayFactor) + (1.0 + _fatigue ^ 2 * 0.1) }; case ("PRONE"): { - (1.0 + _fatigue ^ 2 * 2.0) * GVAR(swayFactor) + (1.0 + _fatigue ^ 2 * 2.0) }; default { - (1.5 + _fatigue ^ 2 * 3.0) * GVAR(swayFactor) + (1.5 + _fatigue ^ 2 * 3.0) }; }; -}] call EFUNC(common,arithmeticSetSource); +}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); + +["multiplier", {GVAR(swayFactor)}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); + +// recheck weapon inertia after weapon swap, change of attachments or switching unit +["weapon", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler; +["loadout", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler; +["unit", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler; ["CBA_settingsInitialized", { if (!GVAR(enabled)) exitWith {}; @@ -30,7 +35,7 @@ if (!hasInterface) exitWith {}; GVAR(ppeBlackout) ppEffectCommit 0.4; // - GVAR updating and initialization ----------------------------------------- - ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; + ["unit", LINKFUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; ["visibleMap", { params ["", "_visibleMap"]; // command visibleMap is updated one frame later @@ -56,7 +61,8 @@ if (!hasInterface) exitWith {}; [1, 3] select (_this getVariable [QEGVAR(dragging,isCarrying), false]); }] call FUNC(addDutyFactor); }; - if (["ACE_Weather"] call EFUNC(common,isModLoaded)) then { + // Weather has an off switch, Dragging & Medical don't. + if (missionNamespace getVariable [QEGVAR(weather,enabled), false]) then { [QEGVAR(weather,temperature), { // 35->1, 45->2 linearConversion [35, 45, (missionNamespace getVariable [QEGVAR(weather,currentTemperature), 25]), 1, 2, true]; }] call FUNC(addDutyFactor); diff --git a/addons/advanced_fatigue/XEH_preInit.sqf b/addons/advanced_fatigue/XEH_preInit.sqf index 12f007ccf6..edbd421f8d 100644 --- a/addons/advanced_fatigue/XEH_preInit.sqf +++ b/addons/advanced_fatigue/XEH_preInit.sqf @@ -9,7 +9,9 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40); -GVAR(dutyList) = [[], []]; +GVAR(dutyList) = createHashMap; GVAR(setAnimExclusions) = []; +GVAR(inertia) = 0; +GVAR(inertiaCache) = createHashMap; ADDON = true; diff --git a/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf b/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf index e2f87f3080..061dcf102d 100644 --- a/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf +++ b/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Adds a duty factor. @@ -18,6 +18,4 @@ params [["_id", "", [""]], ["_factor", 1, [0, {}]]]; if (_id == "" || {_factor isEqualTo 1}) exitWith {}; -GVAR(dutyList) params ["_idList", "_factorList"]; -_idList pushBack _id; -_factorList pushBack _factor, +GVAR(dutyList) set [_id, _factor]; diff --git a/addons/advanced_fatigue/functions/fnc_createStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_createStaminaBar.sqf index 157f683018..2648cfd164 100644 --- a/addons/advanced_fatigue/functions/fnc_createStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_createStaminaBar.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Creates the stamina bar. diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index 717161b890..e992816e9b 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Calculates the duty of the current animation. @@ -37,13 +37,14 @@ if (_animType in ["idl", "mov", "adj"]) then { }; }; - if (currentWeapon _unit != handgunWeapon _unit) then { + if (currentWeapon _unit != "") then { if (_animName select [13, 3] == "ras") then { - // low ready jog - _duty = _duty * 1.2; if (_animName select [9, 3] == "tac") then { // high ready jog/walk - _duty = _duty * 1.5; + _duty = _duty * (1 + 0.8*GVAR(inertia)); + } else { + // low ready jog + _duty = _duty * (1 + 0.2*GVAR(inertia)); }; }; }; diff --git a/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf b/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf index 0e0ce7de04..cc07d9e004 100644 --- a/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf +++ b/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Calculates the current metabolic costs for a unit. @@ -30,22 +30,25 @@ private _duty = GVAR(animDuty); } else { _duty = _duty * (_unit call _x); }; -} forEach (GVAR(dutyList) select 1); +} forEach (values GVAR(dutyList)); if (GVAR(isSwimming)) then { _terrainGradient = 0; }; +// Metabolic cost for walking and running is different if (_velocity > 2) then { + // Running ( 2.10 * SIM_BODYMASS + 4 * (SIM_BODYMASS + _gearMass) * ((_gearMass / SIM_BODYMASS) ^ 2) - + (SIM_BODYMASS + _gearMass) * (0.90 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient) + + (SIM_BODYMASS + _gearMass) * (0.9 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient) ) * 0.23 * _duty } else { + // Walking ( 1.05 * SIM_BODYMASS - + 4 * (SIM_BODYMASS + _gearMass) * ((_gearMass / SIM_BODYMASS) ^ 2) + + 2 * (SIM_BODYMASS + _gearMass) * ((_gearMass / SIM_BODYMASS) ^ 2) + (SIM_BODYMASS + _gearMass) * (1.15 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient) ) * 0.23 * _duty }; diff --git a/addons/advanced_fatigue/functions/fnc_getWeaponInertia.sqf b/addons/advanced_fatigue/functions/fnc_getWeaponInertia.sqf new file mode 100644 index 0000000000..973121c13d --- /dev/null +++ b/addons/advanced_fatigue/functions/fnc_getWeaponInertia.sqf @@ -0,0 +1,38 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Calculates total weapon inertia, accounting for attachments. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Total inertia + * + * Example: + * [ACE_player] call ace_advanced_fatigue_fnc_getWeaponInertia + * + * Public: No + */ +params [["_unit", ACE_player, [objNull]]]; + +private _cache = GVAR(inertiaCache); +private _weapon = currentWeapon _unit; +private _weaponAndItems = [_weapon] + (_unit weaponAccessories _weapon); + +private _inertia = _cache get _weaponAndItems; +if (isNil "_inertia") then { + _inertia = 0; + private _cfgWeapons = configFile >> "CfgWeapons"; + { + // if item is "" or inertia property is undefined, just ignore it + private _itemInertia = getNumber (_cfgWeapons >> _x >> "inertia"); + if (isNil "_itemInertia") then { continue }; + + _inertia = _inertia + _itemInertia; + } forEach _weaponAndItems; + _cache set [_weaponAndItems, _inertia]; +}; + +GVAR(inertia) = _inertia; +_inertia diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index e9452c8c2c..13c1fefc62 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles any audible, visual and physical effects of fatigue. @@ -94,6 +94,3 @@ if (_overexhausted) then { }; _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_handlePlayerChanged.sqf b/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf index 0cea426eef..a119b35862 100644 --- a/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf +++ b/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles switching units (once on init and afterwards via Zeus). diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index d73a6deb0d..8def1439b7 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles visual changes of the stamina bar. @@ -25,12 +25,14 @@ _posAndSize set [2, _stamina * GVAR(staminaBarWidth)]; _staminaBarContainer ctrlSetPosition _posAndSize; // - Opacity ------------------------------------------------------------------ -if (GVAR(fadeStaminaBar)) then { +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); }; +} else { + _staminaBarContainer ctrlSetFade 0; }; // - Color -------------------------------------------------------------------- diff --git a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf index 1d3b215b54..8903bab495 100644 --- a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf +++ b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Main looping function that updates fatigue values. @@ -14,7 +14,9 @@ * * Public: No */ -if (!alive ACE_player) exitWith { // Dead people don't breath, Will also handle null (Map intros) + +// Dead people don't breathe, will also handle null (map intros) +if (!alive ACE_player) exitWith { [FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute; private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; _staminaBarContainer ctrlSetFade 1; @@ -36,7 +38,7 @@ if ((vehicle ACE_player == ACE_player) && {_currentSpeed > 0.1} && {isTouchingGr // Calculate muscle damage increase // Note: Muscle damage recovery is ignored as it takes multiple days -GVAR(muscleDamage) = GVAR(muscleDamage) + (_currentWork / GVAR(peakPower)) ^ 3.2 * 0.00004; +GVAR(muscleDamage) = (GVAR(muscleDamage) + (_currentWork / GVAR(peakPower)) ^ 3.2 * 0.00004) min 1; private _muscleIntegritySqrt = sqrt (1 - GVAR(muscleDamage)); // Calculate available power diff --git a/addons/advanced_fatigue/functions/fnc_moduleSettings.sqf b/addons/advanced_fatigue/functions/fnc_moduleSettings.sqf index ab2742fb75..dfe5b19666 100644 --- a/addons/advanced_fatigue/functions/fnc_moduleSettings.sqf +++ b/addons/advanced_fatigue/functions/fnc_moduleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Initializes the module settings. diff --git a/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf b/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf index aacba72dd8..a47f6e69c1 100644 --- a/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf +++ b/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Removes a duty factor. @@ -16,10 +16,4 @@ */ params [["_id", "", [""]]]; -GVAR(dutyList) params ["_idList", "_factorList"]; -private _index = _idList find _id; - -if (_index != -1) then { - _idList deleteAt _index; - _factorList deleteAt _index; -}; +GVAR(dutyList) deleteAt _id; diff --git a/addons/advanced_fatigue/functions/script_component.hpp b/addons/advanced_fatigue/functions/script_component.hpp deleted file mode 100644 index 6f79ffc902..0000000000 --- a/addons/advanced_fatigue/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\advanced_fatigue\script_component.hpp" diff --git a/addons/advanced_fatigue/stringtable.xml b/addons/advanced_fatigue/stringtable.xml index d93490ae85..5737e1fca2 100644 --- a/addons/advanced_fatigue/stringtable.xml +++ b/addons/advanced_fatigue/stringtable.xml @@ -6,7 +6,7 @@ ACE Fatiga Avanzada ACE Erweiterte Ausdauer ACE 進階疲勞 - ACE 进阶疲劳 + ACE 进阶体力 ACE アドバンスド ファティーグ ACE Fatica Avanzata ACE 고급 피로도 @@ -73,7 +73,7 @@ Facteur de récupération Fattore Recupero 回復值 - 回复值 + 恢复系数 Фактор восстановления Fator de Recuperação Faktor zotavení @@ -89,7 +89,7 @@ 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ší. @@ -104,7 +104,7 @@ Facteur de charge Fattore Caricamento 負重量 - 负重量 + 重量系数 Фактор нагрузки Fator de Carga Faktor zatížení @@ -119,7 +119,7 @@ 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, 代表装备的重量将不会影响到玩家的体力表现 + 增加或降低玩家所能承受的负重量。如设定值为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. @@ -134,7 +134,7 @@ Facteur d'inclinaison du terrain Fattore Pendenza Terreno 地形陡峭影響值 - 地形陡峭影响值 + 地形陡峭系数 Фактор местности Fator de Inclinação do Terreno Faktor stoupání terénu @@ -149,7 +149,7 @@ 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. @@ -159,7 +159,7 @@ Factor de balanceo de mira Verwacklungsfaktor 手ぶれ因数 - 抖动因数 + 抖动系数 抖動因素 Facteur de tremblement Fattore di oscillazione @@ -167,13 +167,14 @@ Фактор колебания прицела 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 武器を持つ手のぶれ度合いを設定します。 値が高ければ高いほど、手ぶれが強くなります。 - 影响手持武器的晃动程度,数值越高,抖动的越厉害. + 影响手持武器的晃动程度,数值越高,抖动的越厉害。 影響手持武器晃動程度,數值越高抖動越厲害 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. @@ -181,6 +182,7 @@ Влияет на колебания прицела оружия. Чем выше - тем больше. 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 @@ -207,7 +209,7 @@ Active/Désactive la fatigue avancée. Abilita/disabilita la Fatica Avanzata. 啟用/關閉進階體力. - 启用/关闭进阶体力. + 启用/关闭进阶体力。 Включает / Отключает Продвинутую усталость Ativa/Desativa Fadiga Avançada. Aktivuje / deaktivuje Pokročilou únavu. @@ -248,6 +250,7 @@ Скрыть шкалу усталости автоматически Blende Ausdauerleiste automatisch aus 體力條自動淡去 + 自动淡化体力条 Dissolvenza automatica della barra della stamina Automaticky schovat lištu výdrže Fondu automatique de la barre d'endurance @@ -255,6 +258,7 @@ 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. @@ -262,12 +266,14 @@ Регулирует прозрачность шкалы в зависимости от статуса выносливости. 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_canPrepare.sqf b/addons/advanced_throwing/functions/fnc_canPrepare.sqf index 87c6a7843c..827fac4b58 100644 --- a/addons/advanced_throwing/functions/fnc_canPrepare.sqf +++ b/addons/advanced_throwing/functions/fnc_canPrepare.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Checks if a throwable can be prepared. diff --git a/addons/advanced_throwing/functions/fnc_canThrow.sqf b/addons/advanced_throwing/functions/fnc_canThrow.sqf index e5211dd33c..06cf166f88 100644 --- a/addons/advanced_throwing/functions/fnc_canThrow.sqf +++ b/addons/advanced_throwing/functions/fnc_canThrow.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Checks if a throwable can be thrown. diff --git a/addons/advanced_throwing/functions/fnc_drawArc.sqf b/addons/advanced_throwing/functions/fnc_drawArc.sqf index 0782c4b46c..47b893290e 100644 --- a/addons/advanced_throwing/functions/fnc_drawArc.sqf +++ b/addons/advanced_throwing/functions/fnc_drawArc.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Zapat, Dslyecxi, Jonpas * Draws throw arc. diff --git a/addons/advanced_throwing/functions/fnc_drawThrowable.sqf b/addons/advanced_throwing/functions/fnc_drawThrowable.sqf index 9d3879e59b..5bc3f22b57 100644 --- a/addons/advanced_throwing/functions/fnc_drawThrowable.sqf +++ b/addons/advanced_throwing/functions/fnc_drawThrowable.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Dslyecxi, Jonpas, SilentSpike + * Author: Dslyecxi, Jonpas, kymckay * Handles drawing the currently selected or cooked throwable. * * Arguments: diff --git a/addons/advanced_throwing/functions/fnc_exitThrowMode.sqf b/addons/advanced_throwing/functions/fnc_exitThrowMode.sqf index ffe1110dc2..744a6d7aae 100644 --- a/addons/advanced_throwing/functions/fnc_exitThrowMode.sqf +++ b/addons/advanced_throwing/functions/fnc_exitThrowMode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Exits throw mode. diff --git a/addons/advanced_throwing/functions/fnc_getMuzzle.sqf b/addons/advanced_throwing/functions/fnc_getMuzzle.sqf index 03ac62f6d2..e0c55daba6 100644 --- a/addons/advanced_throwing/functions/fnc_getMuzzle.sqf +++ b/addons/advanced_throwing/functions/fnc_getMuzzle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Retrieve muzzle name from config. diff --git a/addons/advanced_throwing/functions/fnc_moduleInit.sqf b/addons/advanced_throwing/functions/fnc_moduleInit.sqf index 3f5d3bbd3f..ba67a500ee 100644 --- a/addons/advanced_throwing/functions/fnc_moduleInit.sqf +++ b/addons/advanced_throwing/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the Advanced Throwing module. diff --git a/addons/advanced_throwing/functions/fnc_onKeyDown.sqf b/addons/advanced_throwing/functions/fnc_onKeyDown.sqf index d0f8404203..c97a6343aa 100644 --- a/addons/advanced_throwing/functions/fnc_onKeyDown.sqf +++ b/addons/advanced_throwing/functions/fnc_onKeyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Key down event. diff --git a/addons/advanced_throwing/functions/fnc_onMouseButtonDown.sqf b/addons/advanced_throwing/functions/fnc_onMouseButtonDown.sqf index 69abb9641b..9e6f57d9e8 100644 --- a/addons/advanced_throwing/functions/fnc_onMouseButtonDown.sqf +++ b/addons/advanced_throwing/functions/fnc_onMouseButtonDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Mouse button down event. diff --git a/addons/advanced_throwing/functions/fnc_onMouseScroll.sqf b/addons/advanced_throwing/functions/fnc_onMouseScroll.sqf index f56b153557..290f6ca28e 100644 --- a/addons/advanced_throwing/functions/fnc_onMouseScroll.sqf +++ b/addons/advanced_throwing/functions/fnc_onMouseScroll.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Mouse scroll wheel changed event. diff --git a/addons/advanced_throwing/functions/fnc_pickUp.sqf b/addons/advanced_throwing/functions/fnc_pickUp.sqf index 9fd49486d1..2484cb1baa 100644 --- a/addons/advanced_throwing/functions/fnc_pickUp.sqf +++ b/addons/advanced_throwing/functions/fnc_pickUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Picks up a throwable from the ground. diff --git a/addons/advanced_throwing/functions/fnc_prepare.sqf b/addons/advanced_throwing/functions/fnc_prepare.sqf index 393f8301d3..070870879b 100644 --- a/addons/advanced_throwing/functions/fnc_prepare.sqf +++ b/addons/advanced_throwing/functions/fnc_prepare.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Prepares throwable or selects the next. diff --git a/addons/advanced_throwing/functions/fnc_prime.sqf b/addons/advanced_throwing/functions/fnc_prime.sqf index 22681d3ebc..26189fe20d 100644 --- a/addons/advanced_throwing/functions/fnc_prime.sqf +++ b/addons/advanced_throwing/functions/fnc_prime.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Primes the throwable, creates global throwable vehicle and throws Fired XEH. diff --git a/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf b/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf index 920f4d1781..15cae41585 100644 --- a/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf +++ b/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, Jonpas * When interact_menu starts rendering (from "interact_keyDown" event). diff --git a/addons/advanced_throwing/functions/fnc_throw.sqf b/addons/advanced_throwing/functions/fnc_throw.sqf index a5ff3d62e2..0380d3d896 100644 --- a/addons/advanced_throwing/functions/fnc_throw.sqf +++ b/addons/advanced_throwing/functions/fnc_throw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, Jonpas * Throw selected throwable. diff --git a/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf b/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf index 5461d5d010..9d2e9e24b2 100644 --- a/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf +++ b/addons/advanced_throwing/functions/fnc_throwFiredXEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: CBA Team * Throws Fired XEH. diff --git a/addons/advanced_throwing/functions/fnc_updateControlsHint.sqf b/addons/advanced_throwing/functions/fnc_updateControlsHint.sqf index 3dcb516c32..52f1a3b9e2 100644 --- a/addons/advanced_throwing/functions/fnc_updateControlsHint.sqf +++ b/addons/advanced_throwing/functions/fnc_updateControlsHint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Updates controls hints based on current state. diff --git a/addons/advanced_throwing/functions/script_component.hpp b/addons/advanced_throwing/functions/script_component.hpp deleted file mode 100644 index 1927269f9e..0000000000 --- a/addons/advanced_throwing/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\advanced_throwing\script_component.hpp" diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index b10fae3f52..a469256161 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -35,7 +35,7 @@ Enable Advanced Throwing Activar Lanzamiento Avanzado - Включить улучшенный бросок + Вкл. улучшенный бросок アドバンスド スローイングを有効化 Aktywuj zaawansowane rzucanie Aktiviere erweitertes Wurfsystem @@ -75,7 +75,7 @@ Afficher l'arc de lancé Mostra Arco di Tiro 顯示投擲軌道 - 显示投掷轨道 + 显示投掷弧线 Mostrar o Arco de Arremesso Zobrazit oblouk vrhu Atış Yayını Göster @@ -91,7 +91,7 @@ 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). @@ -106,7 +106,7 @@ Afficher les contrôles à la souris du lancé Mostra Comandi Mouse Lancio 顯示滑鼠投擲控制提示 - 显示滑鼠投掷控制提示 + 显示鼠标投掷控制提示 Mostrar os controles de mouse para Arremesso Zobrazit ovládání házení myší @@ -121,14 +121,14 @@ 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 @@ -136,7 +136,7 @@ Permettre le ramassage d'objets lançables Abilita Raccogli Oggetti 啟用可撿取地面投擲物 - 启用可捡取地面投掷物 + 启用捡取地面投掷物 Permitir pegar arremessáveis Zapnout zdvihání házených předmětů @@ -151,14 +151,14 @@ 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 @@ -166,7 +166,7 @@ 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ů. @@ -181,7 +181,7 @@ 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é. @@ -211,7 +211,7 @@ Mode de lancé de l'objet (Tenir) Modalità Oggetto Gettabile (Mantenere) 投擲模式 (按住) - 投掷模式 (按住) + 投掷模式(按住) Modo de Arremesso (Segurar) Mód puštění (Držet) @@ -226,7 +226,7 @@ Mode de lancé de l'objet (Basculer) Modalità Oggetto lanciabile Gettabile (Interruttore) 投擲模式 (切換) - 投掷模式 (切换) + 投掷模式(切换) Modo de Arremesso (Alternar) Mód puštění (Přepnout) @@ -241,7 +241,7 @@ amorcée Armato 引信開始燃燒 - 引信开始燃烧 + 已开引信 Preparado Odjištěný @@ -272,7 +272,7 @@ (Défilement) Changer de mode (Scorrere) Cambio Modalità (滾輪) 變更模式 - (滚轮) 变更模式 + (滚轮)变更模式 (Roda do Mouse) Alternar modo (Scrollovat) Změnit mód (Tekerlek) Modu Değiştir @@ -288,7 +288,7 @@ (Défilement) Étendre (Scorrere) Estendere (滾輪) 延長 - (滚轮) 延长 + (滚轮)延长 (Roda do Mouse) Extender (Scrollovat) Oddálit (Tekerlek) Uzat @@ -304,7 +304,7 @@ (Clique) Dégoupiller (Click) Arma (點擊) 提早拉開引信 - (点击) 提早拉开引信 + (点击)提早拉开引信 (Clique) Cozinhar (Klik) Odjistit (Tıkla) Cook diff --git a/addons/ai/XEH_PREP.hpp b/addons/ai/XEH_PREP.hpp index 97f2b64e9d..80c1e45239 100644 --- a/addons/ai/XEH_PREP.hpp +++ b/addons/ai/XEH_PREP.hpp @@ -1,3 +1,5 @@ +PREP(assignNVG); +PREP(assignNVGpfh); PREP(drawCuratorGarrisonPathing); PREP(garrison); PREP(garrisonMove); diff --git a/addons/ai/XEH_postInit.sqf b/addons/ai/XEH_postInit.sqf index 44f3c57472..fce5152e3d 100644 --- a/addons/ai/XEH_postInit.sqf +++ b/addons/ai/XEH_postInit.sqf @@ -68,3 +68,11 @@ params ["_unit", "_mode"]; _unit enableGunLights _mode; }] call CBA_fnc_addEventHandler; + + +if (isServer) then { + ["CAManBase", "init", { + // wait for HMD to be assigned so `hmd _unit` works + [FUNC(assignNVG), _this, 1] call CBA_fnc_waitAndExecute; + }] call CBA_fnc_addClassEventHandler; +}; diff --git a/addons/ai/XEH_preInit.sqf b/addons/ai/XEH_preInit.sqf index b47cf6628d..5ec0849ff9 100644 --- a/addons/ai/XEH_preInit.sqf +++ b/addons/ai/XEH_preInit.sqf @@ -6,4 +6,11 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +if (isServer) then { + GVAR(assignNVGthread) = false; + GVAR(assignNVGstate) = false; +}; + +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/ai/functions/fnc_assignNVG.sqf b/addons/ai/functions/fnc_assignNVG.sqf new file mode 100644 index 0000000000..0c930145a4 --- /dev/null +++ b/addons/ai/functions/fnc_assignNVG.sqf @@ -0,0 +1,39 @@ +#include "..\script_component.hpp" +/* + * Author: Jonpas + * Assigns AI first found NVG in their inventory during night time and unassigns it during day time. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [cursorObject] call ace_ai_fnc_assignNVG + * + * Public: No + */ + +if (!GVAR(assignNVG)) exitWith {}; + +params ["_unit"]; + +if (alive _unit && {!isPlayer _unit}) then { + private _nvg = hmd _unit; + + if (GVAR(assignNVGstate)) then { + if (_nvg == "") then { + private _items = [_unit, false, true, true, true, false, false] call CBA_fnc_uniqueUnitItems; // backpack, vest, uniform + { + if (getText (configFile >> "CfgWeapons" >> _x >> "simulation") == "NVGoggles") exitWith { + _unit assignItem _x; + }; + } forEach _items; + }; + } else { + if (_nvg != "" && {currentVisionMode _unit == 0} && {_unit canAdd _nvg}) then { + _unit unassignItem _nvg; + }; + }; +}; diff --git a/addons/ai/functions/fnc_assignNVGpfh.sqf b/addons/ai/functions/fnc_assignNVGpfh.sqf new file mode 100644 index 0000000000..95e5495b3a --- /dev/null +++ b/addons/ai/functions/fnc_assignNVGpfh.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Jonpas + * waitAndExecute Handler for periodic NVG assignment. + * + * Arguments: + * None + + * Return Value: + * None + * + * Example: + * [] call ace_ai_fnc_assignNVGpfh + * + * Public: No + */ +TRACE_1("assignNVGpfh",count allUnits); + +if (!GVAR(assignNVG)) exitWith { TRACE_1("shutdown loop",_this); GVAR(assignNVGthread) = false; }; + +GVAR(assignNVGstate) = sunOrMoon < 1 || {moonIntensity > 0.8}; + +{ + _x call FUNC(assignNVG); +} forEach allUnits; + +[FUNC(assignNVGpfh), [], 300] call CBA_fnc_waitAndExecute; diff --git a/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf b/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf index ca0d8ccfa7..561c8748a6 100644 --- a/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf +++ b/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Draws AI garrison pathing while the Zeus display is open. diff --git a/addons/ai/functions/fnc_garrison.sqf b/addons/ai/functions/fnc_garrison.sqf index 30238e42a7..ead982d951 100644 --- a/addons/ai/functions/fnc_garrison.sqf +++ b/addons/ai/functions/fnc_garrison.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Garrison function used to garrison AI inside buildings. diff --git a/addons/ai/functions/fnc_garrisonMove.sqf b/addons/ai/functions/fnc_garrisonMove.sqf index 6bba35fbc3..588ebb2016 100644 --- a/addons/ai/functions/fnc_garrisonMove.sqf +++ b/addons/ai/functions/fnc_garrisonMove.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Internal function used by ace_ai_fnc_garrison to make the units move to the positions it picked. @@ -33,7 +33,7 @@ private _unitMoveListUnits = (_unitMoveList apply {_x select 0}); _x setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true]; } foreach _unitMoveListUnits; -// Avoid duplicate PFHs +// Avoid duplicate PFHs if (isNil QGVAR(garrison_moveUnitPFH)) then { missionNameSpace setVariable [QGVAR(garrison_moveUnitPFH), true, true]; @@ -114,7 +114,7 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then { (_unit getVariable [QGVAR(garrisonMove_unitPosMemory), [CBA_missionTime, [0,0,0]]]) params ["_unitPosTimer", "_unitOldPos"]; // AI may sometimes not be able to report unitReady, this is to avoid the PFH running forever - switch true do { + switch true do { case ((_unitPos distance _pos) < 1.5) : { call _fnc_attemptSuccessful; }; @@ -127,7 +127,7 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then { default { _unit setVariable [QGVAR(garrisonMove_unitPosMemory), [CBA_missionTime, _unitPos]]; - }; + }; }; }; }; diff --git a/addons/ai/functions/fnc_initDisplayCurator.sqf b/addons/ai/functions/fnc_initDisplayCurator.sqf index 1ab54086b4..d3883ab8f3 100644 --- a/addons/ai/functions/fnc_initDisplayCurator.sqf +++ b/addons/ai/functions/fnc_initDisplayCurator.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Initializes the Zeus display. diff --git a/addons/ai/functions/fnc_unGarrison.sqf b/addons/ai/functions/fnc_unGarrison.sqf index e098f4b130..ab0c525a24 100644 --- a/addons/ai/functions/fnc_unGarrison.sqf +++ b/addons/ai/functions/fnc_unGarrison.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Used to un-garrison units. diff --git a/addons/ai/functions/script_component.hpp b/addons/ai/functions/script_component.hpp deleted file mode 100644 index 91e8ec0809..0000000000 --- a/addons/ai/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\ai\script_component.hpp" diff --git a/addons/ai/initSettings.sqf b/addons/ai/initSettings.sqf new file mode 100644 index 0000000000..0b2642c7ae --- /dev/null +++ b/addons/ai/initSettings.sqf @@ -0,0 +1,19 @@ +private _category = format ["ACE %1", LLSTRING(DisplayName)]; + +[ + QGVAR(assignNVG), "CHECKBOX", + [LSTRING(AssignNVG_DisplayName), LSTRING(AssignNVG_Description)], + _category, + false, + 1, + { + if (isServer) then { + params ["_enabled"]; + if (_enabled && {!GVAR(assignNVGthread)}) then { + TRACE_1("start loop",_this); + GVAR(assignNVGthread) = true; + [FUNC(assignNVGpfh), [], 1] call CBA_fnc_waitAndExecute; + }; + }; + } +] call CBA_fnc_addSetting; diff --git a/addons/ai/stringtable.xml b/addons/ai/stringtable.xml index b8c7887ace..27097eee7a 100644 --- a/addons/ai/stringtable.xml +++ b/addons/ai/stringtable.xml @@ -1,6 +1,22 @@ + + AI + AI + IA + IA + AI + SI + ИИ + KI + UI + IA + AI + AI + AI + AI + Invalid position provided. Ungültige Position @@ -65,5 +81,15 @@ Nenalezena žádná budova. Bir yapı bulunamadı + + Auto-Equip NVGs + Automatyczne zakładanie NVG + Automatisch NVGs ausrüsten + + + Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory! + Zakłada NVG w nocy i zdejmuje je w ciągu dnia.\nNie dodaje NVG do ekwipunku! + Rüstet NVG nachts aus dem Inventar aus und entfernt es tagsüber.\nFügt keine NVGs zum Inventar hinzu! + diff --git a/addons/aircraft/CfgEventHandlers.hpp b/addons/aircraft/CfgEventHandlers.hpp index 865276cfba..f6503c2479 100644 --- a/addons/aircraft/CfgEventHandlers.hpp +++ b/addons/aircraft/CfgEventHandlers.hpp @@ -9,3 +9,9 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); }; }; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/aircraft/CfgMagazines.hpp b/addons/aircraft/CfgMagazines.hpp index d08a460bb8..e8ae200cd9 100644 --- a/addons/aircraft/CfgMagazines.hpp +++ b/addons/aircraft/CfgMagazines.hpp @@ -19,13 +19,13 @@ class CfgMagazines { 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); diff --git a/addons/aircraft/XEH_PREP.hpp b/addons/aircraft/XEH_PREP.hpp index 65407a32f0..a0338e8e4a 100644 --- a/addons/aircraft/XEH_PREP.hpp +++ b/addons/aircraft/XEH_PREP.hpp @@ -1,2 +1,6 @@ -PREP(initEjectAction); PREP(canShowEject); +PREP(droneAddActions); +PREP(droneGetTurretTargetPos); +PREP(droneModifyWaypoint); +PREP(droneSetWaypoint); +PREP(initEjectAction); diff --git a/addons/aircraft/XEH_postInit.sqf b/addons/aircraft/XEH_postInit.sqf new file mode 100644 index 0000000000..169a4d2d94 --- /dev/null +++ b/addons/aircraft/XEH_postInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +[QGVAR(droneModifyWaypoint), LINKFUNC(droneModifyWaypoint)] call CBA_fnc_addEventHandler; +[QGVAR(droneSetWaypoint), LINKFUNC(droneSetWaypoint)] call CBA_fnc_addEventHandler; + +if (hasInterface) then { + ["ACE_controlledUAV", LINKFUNC(droneAddActions)] call CBA_fnc_addEventHandler; +}; diff --git a/addons/aircraft/functions/fnc_canShowEject.sqf b/addons/aircraft/functions/fnc_canShowEject.sqf index 6ec13d2bb9..08c55eb781 100644 --- a/addons/aircraft/functions/fnc_canShowEject.sqf +++ b/addons/aircraft/functions/fnc_canShowEject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Check if Eject action can be shown. diff --git a/addons/aircraft/functions/fnc_droneAddActions.sqf b/addons/aircraft/functions/fnc_droneAddActions.sqf new file mode 100644 index 0000000000..38ca53e4c6 --- /dev/null +++ b/addons/aircraft/functions/fnc_droneAddActions.sqf @@ -0,0 +1,121 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Adds actions to a drone + * + * Arguments: + * 0: vehicle + * + * Return Value: + * None + * + * Example: + * [v] call ace_aircraft_fnc_droneAddActions + * + * Public: No + */ + +params ["_vehicle"]; +TRACE_1("droneAddActions",_vehicle); + +if (!alive _vehicle) exitWith {}; +if (_vehicle getVariable [QGVAR(droneActionsAdded), false]) exitWith {}; +_vehicle setVariable [QGVAR(droneActionsAdded), true]; + +// move to location +private _condition = { + params ["_vehicle"]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} +}; +private _statement = { + params ["_vehicle"]; + private _group = group driver _vehicle; + private _pos = ([_vehicle, [0]] call FUNC(droneGetTurretTargetPos)) select 0; + [QGVAR(droneSetWaypoint), [_vehicle, _group, _pos, "MOVE"], _group] call CBA_fnc_targetEvent; +}; +private _action = [QGVAR(droneSetWaypointMove), localize "$STR_AC_MOVE", + "\a3\3DEN\Data\CfgWaypoints\Move_ca.paa", _statement, _condition] call EFUNC(interact_menu,createAction); +[_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + + +if (_vehicle isKindOf "Air") then { + // loiter at location + _condition = { + params ["_vehicle"]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + }; + _statement = { + params ["_vehicle"]; + private _group = group driver _vehicle; + private _pos = ([_vehicle, [0]] call FUNC(droneGetTurretTargetPos)) select 0; + [QGVAR(droneSetWaypoint), [_vehicle, _group, _pos, "LOITER"], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(droneSetWaypointLoiter), localize "$STR_AC_LOITER", + "\a3\3DEN\Data\CfgWaypoints\Loiter_ca.paa", _statement, _condition] call EFUNC(interact_menu,createAction); + [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + + + // set height + _condition = { + params ["_vehicle"]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + }; + _statement = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + [QGVAR(droneModifyWaypoint), [_vehicle, _group, "height", _args], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(setAltitude), localize "$STR_3den_waypoint_attribute_loiteraltitude_displayname", + "", {}, _condition] call EFUNC(interact_menu,createAction); + private _base = [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + { + _action = [str _x, str _x, "", _statement, { true }, {}, _x] call EFUNC(interact_menu,createAction); + [_vehicle, 1, _base, _action] call EFUNC(interact_menu,addActionToObject); + } forEach [20, 50, 200, 500, 2000]; + + + // set loiter radius + _condition = { + params ["_vehicle"]; + private _group = group driver _vehicle; + private _index = (currentWaypoint _group) min count waypoints _group; + private _waypoint = [_group, _index]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + && {(waypointType _waypoint) == "LOITER"} + }; + _statement = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + [QGVAR(droneModifyWaypoint), [_vehicle, _group, "radius", _args], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(lotierRadius), localize "$STR_3den_waypoint_attribute_loiterradius_displayname", + "", {}, _condition] call EFUNC(interact_menu,createAction); + _base = [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + { + _action = [str _x, str _x, "", _statement, { true }, {}, _x] call EFUNC(interact_menu,createAction); + [_vehicle, 1, _base, _action] call EFUNC(interact_menu,addActionToObject); + } forEach [500, 750, 1000, 1250, 1500]; + + + // set loiter direction + _condition = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + private _index = (currentWaypoint _group) min count waypoints _group; + private _waypoint = [_group, _index]; + + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + && {(waypointType _waypoint) == "LOITER"} && {(waypointLoiterType _waypoint) != _args} + }; + _statement = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + [QGVAR(droneModifyWaypoint), [_vehicle, _group, "dir", _args], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(lotierTypeR), localize "$STR_3den_waypoint_attribute_loiterdirection_displayname", + "\a3\3DEN\Data\Attributes\LoiterDirection\cw_ca.paa", _statement, _condition, {}, "CIRCLE"] call EFUNC(interact_menu,createAction); + [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + _action = [QGVAR(lotierTypeR), localize "$STR_3den_waypoint_attribute_loiterdirection_displayname", + "\a3\3DEN\Data\Attributes\LoiterDirection\ccw_ca.paa", _statement, _condition, {}, "CIRCLE_L"] call EFUNC(interact_menu,createAction); + [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); +}; diff --git a/addons/aircraft/functions/fnc_droneGetTurretTargetPos.sqf b/addons/aircraft/functions/fnc_droneGetTurretTargetPos.sqf new file mode 100644 index 0000000000..f3914f4af6 --- /dev/null +++ b/addons/aircraft/functions/fnc_droneGetTurretTargetPos.sqf @@ -0,0 +1,46 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Get drone's target location, if aimed at infinity it will return a virtual point + * + * Arguments: + * 0: vehicle + * + * Return Value: + * [PosASL , Real ] + * + * Example: + * [v] call ace_aircraft_fnc_droneGetTurretTargetPos + * + * Public: No + */ + +params ["_vehicle"]; +private _turret = [0]; +TRACE_2("droneGetTurretTargetPos",_vehicle,_turret); + +private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret; + +private _gunBeg = _vehicle selectionPosition getText (_turretConfig >> "gunBeg"); +private _gunEnd = _vehicle selectionPosition getText (_turretConfig >> "gunEnd"); + +if (_gunEnd isEqualTo _gunBeg) then { + // e.g. Darter doesn't have valid gunBeg/gunEnd + private _vehicleConfig = configOf _vehicle; + _gunBeg = _vehicle selectionPosition getText (_vehicleConfig >> "uavCameraGunnerDir"); + _gunEnd = _vehicle selectionPosition getText (_vehicleConfig >> "uavCameraGunnerPos"); +}; + +_gunBeg = AGLToASL (_vehicle modelToWorld _gunBeg); +_gunEnd = AGLToASL (_vehicle modelToWorld _gunEnd); +private _turretDir = _gunEnd vectorFromTo _gunBeg; +private _farPoint = _gunEnd vectorAdd (_turretDir vectorMultiply 4999); + +private _intersections = lineIntersectsSurfaces [_gunEnd, _farPoint, _vehicle, objNull, true, 1]; +if (_intersections isNotEqualTo []) then { + [_intersections select 0 select 0, true] +} else { + // Not looking at anything, just get a virtual point where the camera is pointing + _farPoint set [2, 0 max getTerrainHeightASL _farPoint]; + [_farPoint, false] +}; diff --git a/addons/aircraft/functions/fnc_droneModifyWaypoint.sqf b/addons/aircraft/functions/fnc_droneModifyWaypoint.sqf new file mode 100644 index 0000000000..868a0d0f8b --- /dev/null +++ b/addons/aircraft/functions/fnc_droneModifyWaypoint.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Modify the current waypoint of a drone + * + * Arguments: + * 0: Vehicle + * 1: Group + * 2: Type + * 3: Value + * + * Return Value: + * None + * + * Example: + * [v, group v, "height", 2000] call ace_aircraft_fnc_droneModifyWaypoint + * + * Public: No + */ + +params ["_vehicle", "_group", "_type", "_value"]; +TRACE_4("droneModifyWaypoint",_vehicle,_group,_type,_value); + +private _index = (currentWaypoint _group) min count waypoints _group; +private _waypoint = [_group, _index]; +switch (toLower _type) do { + case ("height"): { + private _pos = waypointPosition _waypoint; + _pos set [2, _value]; + _waypoint setWaypointPosition [_pos, 0]; + _vehicle flyInHeight _value; + }; + case ("radius"): { _waypoint setWaypointLoiterRadius _value; }; + case ("dir"): { _waypoint setWaypointLoiterType _value; }; +}; +_group setCurrentWaypoint _waypoint; diff --git a/addons/aircraft/functions/fnc_droneSetWaypoint.sqf b/addons/aircraft/functions/fnc_droneSetWaypoint.sqf new file mode 100644 index 0000000000..5c919564ce --- /dev/null +++ b/addons/aircraft/functions/fnc_droneSetWaypoint.sqf @@ -0,0 +1,43 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Set new waypoint of a drone + * + * Arguments: + * 0: Vehicle + * 1: Group + * 2: Pos 2D + * 3: Type + * + * Return Value: + * None + * + * Example: + * [v, group v, [2000,5000], "LOITER"] call ace_aircraft_fnc_droneSetWaypoint + * + * Public: No + */ + +params ["_vehicle", "_group", "_pos", "_type"]; +TRACE_4("droneSetWaypoint",_vehicle,_group,_pos,_type); + +private _index = (currentWaypoint _group) min count waypoints _group; +private _waypoint = [_group, _index]; +// Try to save attributes from existing waypoint +private _currentHeight = round ((waypointPosition _waypoint) select 2); +private _currentLoiterRadius = waypointLoiterRadius _waypoint; +private _currentLoiterType = waypointLoiterType _waypoint; + +// Set pos to ATL +_pos set [2, if (_currentHeight >= 50) then { _currentHeight } else { 0 }]; + +// [_group] call CBA_fnc_clearWaypoints; +_waypoint = _group addWaypoint [_pos, 0]; +_waypoint setWaypointType _type; + +TRACE_3("",_currentHeight,_currentLoiterRadius,_currentLoiterType); +if (_currentHeight > 1) then { _vehicle flyInHeight _currentHeight; }; +if (_currentLoiterRadius > 1) then { _waypoint setWaypointLoiterRadius _currentLoiterRadius; }; +if (_currentLoiterType != "") then { _waypoint setWaypointLoiterType _currentLoiterType; }; + +_group setCurrentWaypoint _waypoint; diff --git a/addons/aircraft/functions/fnc_initEjectAction.sqf b/addons/aircraft/functions/fnc_initEjectAction.sqf index b453ce7704..8fdf662c7c 100644 --- a/addons/aircraft/functions/fnc_initEjectAction.sqf +++ b/addons/aircraft/functions/fnc_initEjectAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Add Eject action to vehicle if needed. diff --git a/addons/aircraft/functions/script_component.hpp b/addons/aircraft/functions/script_component.hpp deleted file mode 100644 index 8614d199c3..0000000000 --- a/addons/aircraft/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\aircraft\script_component.hpp" diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index 668d71963f..6cd3700c73 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -56,6 +56,7 @@ 30mm High-Explosive Incendiary 30mm Alto Explosivo Incendiaria 30毫米高爆燃燒彈 + 30 mm 高爆燃烧 30 mm High-Explosive Incendiary 30mm Odłamkowo-Burzące - Zapalające 30mm Yüksek Patlayıcı @@ -63,11 +64,13 @@ 30mm 焼夷りゅう弾 30mm Tříštivo-trhavá zápalná střela 30мм Осколочно-Фугасный Зажигательный + 30mm 고폭소이탄 30mm HEI 30mm AEI 30毫米高爆燃燒 + 30mm 高爆燃烧 30 mm HEI 30mm OB-Z 30mm HEI @@ -75,11 +78,13 @@ 30mm HEI 30mm HEI 30мм ОФЗ + 30mm HEI 30mm DU Armor Piercing 30mm UE Perforante de Blindaje 30毫米貧化鈾穿甲彈 + 30 mm 贫铀穿甲 30 mm UA Armor Piercing 30mm Zubożony Uran - Przebijające 30mm DU Zırh Delici @@ -87,11 +92,13 @@ 30mm DU 徹甲弾 30mm Protipancéřová střela z ochuzeného Uranu 30мм ОУ Бронебойный Снаряд + 30mm 열화우라늄 철갑탄 30mm DU AP 30mm UE AP 30毫米貧鈾穿甲 + 30mm 贫铀穿甲 30 mm UA AP 30mm ZU-P 30mm DU AP @@ -99,11 +106,13 @@ 30mm DU AP 30 mm DU AP 30мм ОУ БС + 30mm DU AP 30mm Combat Mix 4:1 DU:HEI 30mm Mezcla de Combate 4:1 UE:AEI 30毫米戰鬥混合彈4:1 穿甲:高爆 + 30mm 战斗混合 穿甲/高爆 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 @@ -111,11 +120,13 @@ 30mm コンバット ミックス 4:1 DU:HEI 30mm Bojový Mix 4:1 DU:HEI 30мм Смешанное боепитание 4:1 ОУ:ОФЗ + 30mm 4:1 열화:고폭소이 30mm CM 4:1 30mm MC 4:1 30毫米 穿高混合 4:1 + 30mm 穿爆混合 4:1 30 mm MdC 4:1 30mm MB 4:1 30mm CM 4:1 @@ -123,11 +134,13 @@ 30mm CM 4:1 30mm BM 4:1 30мм СБ 4:1 + 30mm CM 4:1 30mm Combat Mix 5:1 DU:HEI 30mm Mezcla de Combate 5:1 UE:AEI 30毫米戰鬥混合彈5:1 穿甲:高爆 + 30 mm 战斗混合 穿甲/高爆 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 @@ -135,11 +148,13 @@ 30mm コンバット ミックス 5:1 DU:HEI 30mm Bojový Mix 5:1 DU:HEI 30мм Смешанное боепитание 5:1 ОУ:ОФЗ + 30mm 5:1 열화:고폭소이 30mm CM 5:1 30mm MC 5:1 30毫米 穿高混合 5:1 + 30mm 穿爆混合 5:1 30 mm MdC 5:1 30mm MB 5:1 30mm CM 5:1 @@ -147,6 +162,7 @@ 30mm CM 5:1 30mm BM 5:1 30мм СБ 5:1 + 30mm CM 5:1 diff --git a/addons/apl/ace_envelope_small.p3d b/addons/apl/ace_envelope_small.p3d index 9bc35d7b4a..8b4c0e5f5e 100644 Binary files a/addons/apl/ace_envelope_small.p3d and b/addons/apl/ace_envelope_small.p3d differ diff --git a/addons/apl/ace_envelope_small4.p3d b/addons/apl/ace_envelope_small4.p3d index d139f6bbca..8cd6bc3325 100644 Binary files a/addons/apl/ace_envelope_small4.p3d and b/addons/apl/ace_envelope_small4.p3d differ diff --git a/addons/apl/ace_envelope_small4_nogeo.p3d b/addons/apl/ace_envelope_small4_nogeo.p3d index a39195505c..b3a261918f 100644 Binary files a/addons/apl/ace_envelope_small4_nogeo.p3d and b/addons/apl/ace_envelope_small4_nogeo.p3d differ diff --git a/addons/apl/model.cfg b/addons/apl/model.cfg index 7ed0ad7378..9d9a99a7d4 100644 --- a/addons/apl/model.cfg +++ b/addons/apl/model.cfg @@ -18,11 +18,14 @@ class CfgModels { skeletonName = ""; }; class ace_entrchtool: Default {}; - class ace_envelope_big: Default {}; - class ace_envelope_big4: Default {}; - class ace_envelope_big4_nogeo: Default {}; - class ace_envelope_small: Default {}; - class ace_envelope_small4: Default {}; - class ace_envelope_small4_nogeo: Default {}; + class ace_envelope: Default { + sections[] = {"velka"}; + }; + class ace_envelope_big: ace_envelope {}; + class ace_envelope_big4: ace_envelope {}; + class ace_envelope_big4_nogeo: ace_envelope {}; + class ace_envelope_small: ace_envelope {}; + class ace_envelope_small4: ace_envelope {}; + class ace_envelope_small4_nogeo: ace_envelope {}; class LWTS_optic: Default {}; -}; \ No newline at end of file +}; diff --git a/addons/arsenal/ACE_Arsenal_Actions.hpp b/addons/arsenal/ACE_Arsenal_Actions.hpp new file mode 100644 index 0000000000..a5b95241e2 --- /dev/null +++ b/addons/arsenal/ACE_Arsenal_Actions.hpp @@ -0,0 +1 @@ +class GVAR(actions) {}; diff --git a/addons/arsenal/ACE_Arsenal_Sorts.hpp b/addons/arsenal/ACE_Arsenal_Sorts.hpp index 22e618c1e4..a3b5f80d28 100644 --- a/addons/arsenal/ACE_Arsenal_Sorts.hpp +++ b/addons/arsenal/ACE_Arsenal_Sorts.hpp @@ -4,7 +4,7 @@ class GVAR(sorts) { displayName = ""; tabs[] = {{}, {}}; statement = ""; - condition = "true"; + condition = QUOTE(true); }; class ACE_alphabetically: sortBase { diff --git a/addons/arsenal/ACE_Arsenal_Stats.hpp b/addons/arsenal/ACE_Arsenal_Stats.hpp index a69b0545fb..f7493b4840 100644 --- a/addons/arsenal/ACE_Arsenal_Stats.hpp +++ b/addons/arsenal/ACE_Arsenal_Stats.hpp @@ -8,12 +8,12 @@ class GVAR(stats) { showText = 0; barStatement = ""; textStatement = ""; - condition = "true"; + condition = QUOTE(true); tabs[] = {{}, {}}; }; class ACE_bananaPotassium: statBase { scope = 2; - displayName= CSTRING(statPotassium); + displayName = CSTRING(statPotassium); showBar = 1; barStatement = "1"; condition = QUOTE((configName (_this select 1)) == 'ACE_Banana'); @@ -21,7 +21,8 @@ class GVAR(stats) { }; class ACE_mass: statBase { scope = 2; - displayName= "$STR_a3_rscdisplayarsenal_stat_weight"; + priority = 1.5; + displayName = "$STR_a3_rscdisplayarsenal_stat_weight"; showText = 1; textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_mass)); tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, {0,1,2,3,4,5,6,7}}; @@ -30,7 +31,7 @@ class GVAR(stats) { scope = 2; priority = 5; stats[] = {"reloadTime"}; - displayName= "$STR_a3_rscdisplayarsenal_stat_rof"; + displayName = "$STR_a3_rscdisplayarsenal_stat_rof"; showBar = 1; showText = 1; barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_2([ARR_2(-1.4, 0.31)], [ARR_2(1, 0.01)])])] call FUNC(statBarStatement_rateOfFIre)); @@ -50,7 +51,7 @@ class GVAR(stats) { }; class ACE_maxZeroing: statBase { scope = 2; - priority = 3; + priority = 3.2; stats[] = {"maxZeroing"}; displayName = "$STR_a3_rscdisplayarsenal_stat_range"; showBar = 1; @@ -59,11 +60,11 @@ class GVAR(stats) { }; class ACE_impact: statBase { scope = 2; - priority = 2; + priority = 3.1; stats[] = {"hit", "initSpeed"}; displayName = "$STR_a3_rscdisplayarsenal_stat_impact"; showBar = 1; - barStatement = QUOTE([ARR_3(_this select 0, _this select 1, [ARR_3([ARR_2(0, 3.2)], [ARR_2(-1, 1100)], 2006)])] call FUNC(statBarStatement_impact)); + barStatement = QUOTE([ARR_3(_this select 0, _this select 1, [ARR_2([ARR_2(0, 3.2)], [ARR_2(-1, 1100)])])] call FUNC(statBarStatement_impact)); tabs[] = {{0,1,2}, {}}; }; class ACE_scopeMagnification: statBase { @@ -74,14 +75,30 @@ class GVAR(stats) { textStatement = QUOTE(call FUNC(statTextStatement_scopeMag)); tabs[] = {{}, {0}}; }; + class ACE_binoMagnification: statBase { + scope = 2; + priority = 2; + displayName = CSTRING(statMagnification); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_binoMag)); + tabs[] = {{9}, {}}; + }; class ACE_scopeVisionMode: statBase { scope = 2; - priority = 1; + priority = 1.6; displayName = CSTRING(statVisionMode); showText = 1; textStatement = QUOTE(call FUNC(statTextStatement_scopeVisionMode)); tabs[] = {{}, {0}}; }; + class ACE_binoVisionMode: statBase { + scope = 2; + priority = 1.6; + displayName = CSTRING(statVisionModeGeneric); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_binoVisionMode)); + tabs[] = {{8,9}, {}}; + }; class ACE_ballisticProtection: statBase { scope = 2; priority = 5; @@ -125,7 +142,14 @@ class GVAR(stats) { displayName = CSTRING(StatExplosionTime); showText = 1; textStatement = QUOTE(call FUNC(statTextStatement_explosionTime)); - condition = QUOTE(true); tabs[] = {{}, {5}}; }; + class ACE_magCount: statBase { + scope = 2; + priority = 1; + displayName = CSTRING(statMagCount); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_magCount)); + tabs[] = {{}, {4}}; + }; }; diff --git a/addons/arsenal/CfgWeapons.hpp b/addons/arsenal/CfgWeapons.hpp new file mode 100644 index 0000000000..c45bb7d5ec --- /dev/null +++ b/addons/arsenal/CfgWeapons.hpp @@ -0,0 +1,10 @@ +class CfgWeapons { + class ItemCore; + class ToolKit: ItemCore { + ACE_isTool = 1; // sort in Tools Tab + }; + class DetectorCore; + class MineDetector: DetectorCore { + ACE_isTool = 1; // sort in Tools Tab + }; +}; diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index 18128f8cc9..3b063d8ebe 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -1,7 +1,8 @@ +PREP(addAction); PREP(addDefaultLoadout); PREP(addListBoxItem); -PREP(addSort); PREP(addRightPanelButton); +PREP(addSort); PREP(addStat); PREP(addVirtualItems); PREP(attributeAddCompatible); @@ -15,9 +16,12 @@ PREP(attributeKeyDown); PREP(attributeLoad); PREP(attributeMode); PREP(attributeSelect); +PREP(baseWeapon); +PREP(buttonActionsPage); PREP(buttonCargo); PREP(buttonClearAll); PREP(buttonExport); +PREP(buttonFavorites); PREP(buttonHide); PREP(buttonImport); PREP(buttonLoadoutsDelete); @@ -25,15 +29,17 @@ PREP(buttonLoadoutsLoad); PREP(buttonLoadoutsRename); PREP(buttonLoadoutsSave); PREP(buttonLoadoutsShare); -PREP(buttonStats); PREP(buttonStatsPage); +PREP(canEditDefaultLoadout); PREP(clearSearchbar); +PREP(compileActions); PREP(compileSorts); PREP(compileStats); PREP(fillLeftPanel); PREP(fillLoadoutsList); PREP(fillRightPanel); PREP(fillSort); +PREP(handleActions); PREP(handleLoadoutsSearchbar); PREP(handleMouse); PREP(handleScrollWheel); @@ -50,6 +56,7 @@ PREP(onLoadoutsClose); PREP(onLoadoutsOpen); PREP(onMouseButtonDown); PREP(onMouseButtonUp); +PREP(onPanelDblClick); PREP(onSelChangedLeft); PREP(onSelChangedLoadouts); PREP(onSelChangedRight); @@ -57,13 +64,21 @@ PREP(onSelChangedRightListnBox); PREP(open3DEN); PREP(openBox); PREP(portVALoadouts); +PREP(refresh); +PREP(removeAction); PREP(removeBox); +PREP(removeDefaultLoadout); +PREP(removeSort); PREP(removeStat); PREP(removeVirtualItems); +PREP(renameDefaultLoadout); +PREP(replaceUniqueItemsLoadout); PREP(scanConfig); PREP(showItem); PREP(sortPanel); PREP(sortStatement_accuracy); +PREP(statTextStatement_binoMag); +PREP(statTextStatement_binoVisionMode); PREP(sortStatement_amount); PREP(sortStatement_magCount); PREP(sortStatement_mass); @@ -77,6 +92,7 @@ PREP(statBarStatement_impact); PREP(statBarStatement_rateOfFIre); PREP(statTextStatement_accuracy); PREP(statTextStatement_explosionTime); +PREP(statTextStatement_magCount); PREP(statTextStatement_mass); PREP(statTextStatement_rateOfFire); PREP(statTextStatement_scopeMag); @@ -84,5 +100,6 @@ PREP(statTextStatement_scopeVisionMode); PREP(statTextStatement_smokeChemTTL); PREP(updateCamPos); PREP(updateRightPanel); +PREP(updateCurrentItemsList); PREP(updateUniqueItemsList); PREP(verifyLoadout); diff --git a/addons/arsenal/XEH_postInit.sqf b/addons/arsenal/XEH_postInit.sqf index 65b8045562..1aaa0203b1 100644 --- a/addons/arsenal/XEH_postInit.sqf +++ b/addons/arsenal/XEH_postInit.sqf @@ -9,43 +9,43 @@ GVAR(lastSearchTextRight) = ""; GVAR(lastSearchTextLoadouts) = ""; GVAR(lastSortLeft) = ""; GVAR(lastSortRight) = ""; +GVAR(lastSortDirectionLeft) = DESCENDING; +GVAR(lastSortDirectionRight) = DESCENDING; -[QGVAR(initBox), {_this call FUNC(initBox)}] call CBA_fnc_addEventHandler; -[QGVAR(removeBox), {_this call FUNC(removeBox)}] call CBA_fnc_addEventHandler; +[QGVAR(initBox), LINKFUNC(initBox)] call CBA_fnc_addEventHandler; +[QGVAR(removeBox), LINKFUNC(removeBox)] call CBA_fnc_addEventHandler; +[QGVAR(addDefaultLoadout), LINKFUNC(addDefaultLoadout)] call CBA_fnc_addEventHandler; +[QGVAR(removeDefaultLoadout), LINKFUNC(removeDefaultLoadout)] call CBA_fnc_addEventHandler; +[QGVAR(renameDefaultLoadout), LINKFUNC(renameDefaultLoadout)] call CBA_fnc_addEventHandler; [QGVAR(broadcastFace), { params ["_unit", "_face"]; - _unit setFace _face; }] call CBA_fnc_addEventHandler; [QGVAR(broadcastVoice), { params ["_unit", "_voice"]; - _unit setSpeaker _voice; }] call CBA_fnc_addEventHandler; [QGVAR(loadoutUnshared), { params ["_contentPanelCtrl" , "_playerName", "_loadoutName"]; + // If player is in arsenal in the shared tab and a loadout is unshared at the same time if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { - private _dataToCheck = _playerName + _loadoutName; - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbData [_i, 1]) == _dataToCheck) exitwith {_contentPanelCtrl lnbDeleteRow _i}; + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbData [_lbIndex, 1]) == _dataToCheck) exitWith { + _contentPanelCtrl lnbDeleteRow _lbIndex; + }; }; } else { - - if ( - profileName == _playerName && - {!(isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonMyLoadouts})} - ) then { - - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _loadoutName) exitwith { - _contentPanelCtrl lnbSetPicture [[_i, 0], QPATHTOF(data\iconPublicBlank.paa)]; - _contentPanelCtrl lnbSetValue [[_i, 0], 0]; + if (profileName == _playerName && {!(isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonMyLoadouts})}) then { + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _loadoutName) exitWith { + _contentPanelCtrl lnbSetPicture [[_lbIndex, 0], QPATHTOF(data\iconPublicBlank.paa)]; + _contentPanelCtrl lnbSetValue [[_lbIndex, 0], 0]; }; }; }; @@ -53,35 +53,99 @@ GVAR(lastSortRight) = ""; }] call CBA_fnc_addEventHandler; [QGVAR(loadoutShared), { - params ["_contentPanelCtrl" ,"_loadoutArgs"]; + params ["_contentPanelCtrl", "_loadoutArgs"]; _loadoutArgs params ["_playerName", "_loadoutName", "_loadoutData"]; + // If player is in arsenal in the shared tab and a loadout is shared at the same time if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { + private _curSelData = _contentPanelCtrl lnbData [lnbCurSelRow _contentPanelCtrl, 1]; - private _curSelData =_contentPanelCtrl lnbData [(lnbCurSelRow _contentPanelCtrl), 1]; - ([_loadoutData] call FUNC(verifyLoadout)) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + ([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + _extendedLoadout params ["_loadout"]; private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName]; + private _cfgWeapons = configFile >> "CfgWeapons"; ADD_LOADOUTS_LIST_PICTURES _contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName]; + // Set color of row, depending if items are unavailable/missing if (_nullItemsAmount > 0) then { - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; } else { - if (_unavailableItemsAmount > 0) then { _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; }; }; + // Sort loadouts alphabetically _contentPanelCtrl lnbSort [1, false]; // Select previously selected loadout - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _curSelData) exitwith {_contentPanelCtrl lnbSetCurSelRow _i}; + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _curSelData) exitWith { + _contentPanelCtrl lnbSetCurSelRow _lbIndex + }; + }; + }; +}] call CBA_fnc_addEventHandler; + +["CBA_loadoutSet", { + params ["_unit", "_loadout", "_extendedInfo"]; + + // Set face + private _face = _extendedInfo getOrDefault [QGVAR(face), ""]; + + if (_face != "") then { + if (isMultiplayer) then { + private _id = [QGVAR(broadcastFace), [_unit, _face], QGVAR(centerFace_) + netId _unit] call CBA_fnc_globalEventJIP; + [_id, _unit] call CBA_fnc_removeGlobalEventJIP; + } else { + _unit setFace _face; + }; + }; + + // Set voice + private _voice = _extendedInfo getOrDefault [QGVAR(voice), ""]; + + if (_voice != "") then { + if (isMultiplayer) then { + private _id = [QGVAR(broadcastVoice), [_unit, _voice], QGVAR(centerVoice_) + netId _unit] call CBA_fnc_globalEventJIP; + [_id, _unit] call CBA_fnc_removeGlobalEventJIP; + } else { + _unit setSpeaker _voice; + }; + }; + + // Set insignia + private _insignia = _extendedInfo getOrDefault [QGVAR(insignia), ""]; + + if (_insignia != "") then { + _unit setVariable ["BIS_fnc_setUnitInsignia_class", nil]; + [_unit, _insignia] call BIS_fnc_setUnitInsignia; + }; +}] call CBA_fnc_addEventHandler; + +["CBA_loadoutGet", { + params ["_unit", "_loadout", "_extendedInfo"]; + + // Set face if enabled + if (GVAR(loadoutsSaveFace)) then { + _extendedInfo set [QGVAR(face), face _unit]; + }; + + // Set voice if enabled + if (GVAR(loadoutsSaveVoice)) then { + _extendedInfo set [QGVAR(voice), speaker _unit]; + }; + + // Set insignia if enabled + if (GVAR(loadoutsSaveInsignia)) then { + private _insignia = _unit call BIS_fnc_getUnitInsignia; + + if (_insignia != "") then { + _extendedInfo set [QGVAR(insignia), _insignia]; }; }; }] call CBA_fnc_addEventHandler; diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 3fb6a7817c..34299c1871 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -1,23 +1,17 @@ #include "script_component.hpp" #include "defines.hpp" +#define TOOLS_TAB_ICON "\A3\ui_f\data\igui\cfg\actions\repair_ca.paa" + ADDON = false; PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -// Arsenal -[QGVAR(camInverted), "CHECKBOX", localize LSTRING(invertCameraSetting), localize LSTRING(settingCategory), false] call CBA_fnc_addSetting; -[QGVAR(enableModIcons), "CHECKBOX", [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], localize LSTRING(settingCategory), true] call CBA_fnc_addSetting; -[QGVAR(fontHeight), "SLIDER", [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], localize LSTRING(settingCategory), [1, 10, 4.5, 1]] call CBA_fnc_addSetting; -[QGVAR(enableIdentityTabs), "CHECKBOX", localize LSTRING(enableIdentityTabsSettings), localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; - -// Arsenal loadouts -[QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; -[QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; -[QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], localize LSTRING(settingCategory), false, false] call CBA_fnc_addSetting; +#include "initSettings.sqf" +// Arsenal events [QGVAR(statsToggle), { params ["_display", "_showStats"]; @@ -26,49 +20,71 @@ PREP_RECOMPILE_END; private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage; private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage; - private _statsButtonCtrl = _display displayCtrl IDC_statsButton; - private _statsButtonCloseCtrl = _display displayCtrl IDC_statsButtonClose; - { _x ctrlShow (GVAR(showStats) && {_showStats}); } forEach [ _statsCtrlGroupCtrl, _statsPreviousPageCtrl, _statsNextPageCtrl, - _statsCurrentPageCtrl, - _statsButtonCloseCtrl + _statsCurrentPageCtrl ]; - - _statsButtonCtrl ctrlShow (!GVAR(showStats) && {_showStats}) -}] call CBA_fnc_addEventHandler; - -[QGVAR(statsButton), { - _this call FUNC(buttonStats); }] call CBA_fnc_addEventHandler; [QGVAR(statsChangePage), { _this call FUNC(buttonStatsPage); }] call CBA_fnc_addEventHandler; - [QGVAR(displayStats), { _this call FUNC(handleStats); }] call CBA_fnc_addEventHandler; -call FUNC(compileStats); +[QGVAR(actionsChangePage), { + _this call FUNC(buttonActionsPage); +}] call CBA_fnc_addEventHandler; + +[QGVAR(displayActions), { + _this call FUNC(handleActions); +}] call CBA_fnc_addEventHandler; + +[QGVAR(actionsToggle), { + params ["_display", "_showActions"]; + + private _actionsCtrlGroupCtrl = _display displayCtrl IDC_actionsBox; + private _actionsPreviousPageCtrl = _display displayCtrl IDC_actionsPreviousPage; + private _actionsNextPageCtrl = _display displayCtrl IDC_actionsNextPage; + private _actionsCurrentPageCtrl = _display displayCtrl IDC_actionsCurrentPage; + + { + _x ctrlShow (GVAR(showActions) && {_showActions}); + } forEach [ + _actionsCtrlGroupCtrl, + _actionsPreviousPageCtrl, + _actionsNextPageCtrl, + _actionsCurrentPageCtrl + ]; +}] call CBA_fnc_addEventHandler; + +call FUNC(compileActions); call FUNC(compileSorts); +call FUNC(compileStats); [QUOTE(ADDON), {!isNil QGVAR(camera)}] call CBA_fnc_registerFeatureCamera; -// Compatibility with CBA scripted optics and dispoable framework +// Compatibility with CBA scripted optics and disposable framework [QGVAR(displayOpened), { - "cba_optics_arsenalOpened" call CBA_fnc_localEvent; - "cba_disposable_arsenalOpened" call CBA_fnc_localEvent; + "CBA_optics_arsenalOpened" call CBA_fnc_localEvent; + "CBA_disposable_arsenalOpened" call CBA_fnc_localEvent; + EGVAR(common,blockItemReplacement) = true; }] call CBA_fnc_addEventHandler; [QGVAR(displayClosed), { - "cba_optics_arsenalClosed" call CBA_fnc_localEvent; - "cba_disposable_arsenalClosed" call CBA_fnc_localEvent; + "CBA_optics_arsenalClosed" call CBA_fnc_localEvent; + "CBA_disposable_arsenalClosed" call CBA_fnc_localEvent; + EGVAR(common,blockItemReplacement) = false; }] call CBA_fnc_addEventHandler; +// Setup Tools tab +[keys (uiNamespace getVariable [QGVAR(configItemsTools), createHashMap]), LLSTRING(toolsTab), TOOLS_TAB_ICON, -1, true] call FUNC(addRightPanelButton); + + ADDON = true; diff --git a/addons/arsenal/XEH_preStart.sqf b/addons/arsenal/XEH_preStart.sqf index ed7f4f0345..7e56134010 100644 --- a/addons/arsenal/XEH_preStart.sqf +++ b/addons/arsenal/XEH_preStart.sqf @@ -2,4 +2,12 @@ #include "XEH_PREP.hpp" +// Cache for FUNC(baseWeapon) +uiNamespace setVariable [QGVAR(baseWeaponNameCache), createHashMap]; + +// Caches for names, pictures, mod icons +uiNamespace setVariable [QGVAR(addListBoxItemCache), createHashMap]; +uiNamespace setVariable [QGVAR(rightPanelCache), createHashMap]; +uiNamespace setVariable [QGVAR(sortCache), createHashMap]; + call FUNC(scanConfig); diff --git a/addons/arsenal/config.cpp b/addons/arsenal/config.cpp index e491065480..78a07dcfed 100644 --- a/addons/arsenal/config.cpp +++ b/addons/arsenal/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); - authors[] = {"alganthe", "mharis001", "Brett Mayson"}; + authors[] = {"alganthe", "mharis001", "Brett Mayson", "johnb43"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -19,6 +19,7 @@ class CfgPatches { #include "Display3DEN.hpp" #include "Cfg3DEN.hpp" #include "CfgEventHandlers.hpp" +#include "CfgWeapons.hpp" #include "RscDisplayMain.hpp" #include "ACE_Arsenal_Sorts.hpp" #include "ACE_Arsenal_Stats.hpp" diff --git a/addons/arsenal/defines.hpp b/addons/arsenal/defines.hpp index 70292c3e7c..cfc12df3d3 100644 --- a/addons/arsenal/defines.hpp +++ b/addons/arsenal/defines.hpp @@ -5,7 +5,22 @@ #define WIDTH_TOTAL (safezoneW - 2 * (93 * GRID_W)) #define WIDTH_GAP (WIDTH_TOTAL / 100) -#define WIDTH_SINGLE ((WIDTH_TOTAL - 6 * WIDTH_GAP) / 5) +#define WIDTH_SINGLE ((WIDTH_TOTAL - 7 * WIDTH_GAP) / 6) + +// IDDs +#define IDD_MISSION 46 +#define IDD_RSCDISPLAYCURATOR 312 +#define IDD_DISPLAY3DEN 313 + +#define IDC_OK 1 // emulate "OK" button +#define IDC_CANCEL 2 // emulate "Cancel" button + +// Sorting +#define ASCENDING 0 +#define DESCENDING 1 + +// Favorites +#define FAVORITES_COLOR (GVAR(favoritesColor) + [1]) // IDCs #define IDD_ace_arsenal 1127001 @@ -27,6 +42,7 @@ #define IDC_buttonLoadouts 1003 #define IDC_buttonExport 1004 #define IDC_buttonImport 1005 +#define IDC_buttonFavorites 1006 #define IDC_infoBox 11 #define IDC_infoBackground 1101 #define IDC_infoName 1102 @@ -38,7 +54,9 @@ #define IDC_rightTabContent 14 #define IDC_rightTabContentListnBox 15 #define IDC_sortLeftTab 16 +#define IDC_sortLeftTabDirection 161 #define IDC_sortRightTab 17 +#define IDC_sortRightTabDirection 171 #define IDC_leftSearchbar 18 #define IDC_leftSearchbarButton 41 #define IDC_rightSearchbar 19 @@ -128,8 +146,20 @@ #define IDC_statsPreviousPage 52 #define IDC_statsNextPage 53 #define IDC_statsCurrentPage 54 -#define IDC_statsButton 55 -#define IDC_statsButtonClose 56 +#define IDC_actionsBox 90 +#define IDC_actionsText1 9001 +#define IDC_actionsButton1 9002 +#define IDC_actionsText2 9003 +#define IDC_actionsButton2 9004 +#define IDC_actionsText3 9005 +#define IDC_actionsButton3 9006 +#define IDC_actionsText4 9007 +#define IDC_actionsButton4 9008 +#define IDC_actionsText5 9009 +#define IDC_actionsButton5 9010 +#define IDC_actionsPreviousPage 91 +#define IDC_actionsNextPage 92 +#define IDC_actionsCurrentPage 93 #define IDD_loadouts_display 1127002 #define IDC_centerBox 3 @@ -165,12 +195,45 @@ #define IDC_ATTRIBUTE_IMPORT_BUTTON 8109 #define IDC_ATTRIBUTE_ADD_COMPATIBLE 8110 +// Indexes of categories +#define IDX_CAT_ALL 0 +#define IDX_CAT_PRIMARY_WEAPON 1 +#define IDX_CAT_SECONDARY_WEAPON 2 +#define IDX_CAT_HANDGUN_WEAPON 3 +#define IDX_CAT_OPTICS_ATTACHMENTS 4 +#define IDX_CAT_FLASHLIGHT_ATTACHMENTS 5 +#define IDX_CAT_MUZZLE_ATTACHMENTS 6 +#define IDX_CAT_BIPOD_ATTACHMENTS 7 +#define IDX_CAT_ITEMS_ALL 8 +#define IDX_CAT_HEADGEAR 9 +#define IDX_CAT_UNIFORM 10 +#define IDX_CAT_VEST 11 +#define IDX_CAT_BACKPACK 12 +#define IDX_CAT_GOGGLES 13 +#define IDX_CAT_NVG 14 +#define IDX_CAT_BINO 15 +#define IDX_CAT_MAP 16 +#define IDX_CAT_COMPASS 17 +#define IDX_CAT_RADIO 18 +#define IDX_CAT_WATCH 19 +#define IDX_CAT_COMMS 20 +#define IDX_CAT_GRENADES 21 +#define IDX_CAT_EXPLOSIVES 22 +#define IDX_CAT_MISC_ITEMS 23 + // Indexes of virtual items array #define IDX_VIRT_WEAPONS 0 -#define IDX_VIRT_ATTACHEMENTS 1 +#define IDX_VIRT_PRIMARY_WEAPONS 0 +#define IDX_VIRT_SECONDARY_WEAPONS 1 +#define IDX_VIRT_HANDGUN_WEAPONS 2 + +#define IDX_VIRT_ATTACHMENTS 1 +#define IDX_VIRT_OPTICS_ATTACHMENTS 0 +#define IDX_VIRT_FLASHLIGHT_ATTACHMENTS 1 +#define IDX_VIRT_MUZZLE_ATTACHMENTS 2 +#define IDX_VIRT_BIPOD_ATTACHMENTS 3 #define IDX_VIRT_ITEMS_ALL 2 - #define IDX_VIRT_HEADGEAR 3 #define IDX_VIRT_UNIFORM 4 #define IDX_VIRT_VEST 5 @@ -183,6 +246,54 @@ #define IDX_VIRT_RADIO 12 #define IDX_VIRT_WATCH 13 #define IDX_VIRT_COMMS 14 +#define IDX_VIRT_GRENADES 15 +#define IDX_VIRT_EXPLOSIVES 16 +#define IDX_VIRT_MISC_ITEMS 17 + +#define IDX_VIRT_UNIQUE_MISC_ITEMS 18 +#define IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL 19 +#define IDX_VIRT_UNIQUE_GRENADES 20 +#define IDX_VIRT_UNIQUE_EXPLOSIVES 21 +#define IDX_VIRT_UNIQUE_ATTACHMENTS 22 +#define IDX_VIRT_UNIQUE_BACKPACKS 23 +#define IDX_VIRT_UNIQUE_GOGGLES 24 +#define IDX_VIRT_UNIQUE_UNKNOWN_ITEMS 25 + +// Indexes of current items array +#define IDX_CURR_PRIMARY_WEAPON 0 +#define IDX_CURR_SECONDARY_WEAPON 1 +#define IDX_CURR_HANDGUN_WEAPON 2 +#define IDX_CURR_HEADGEAR 3 +#define IDX_CURR_UNIFORM 4 +#define IDX_CURR_VEST 5 +#define IDX_CURR_BACKPACK 6 +#define IDX_CURR_GOGGLES 7 +#define IDX_CURR_NVG 8 +#define IDX_CURR_BINO 9 +#define IDX_CURR_MAP 10 +#define IDX_CURR_COMPASS 11 +#define IDX_CURR_RADIO 12 +#define IDX_CURR_WATCH 13 +#define IDX_CURR_COMMS 14 +#define IDX_CURR_UNIFORM_ITEMS 15 +#define IDX_CURR_VEST_ITEMS 16 +#define IDX_CURR_BACKPACK_ITEMS 17 +#define IDX_CURR_PRIMARY_WEAPON_ITEMS 18 +#define IDX_CURR_SECONDARY_WEAPON_ITEMS 19 +#define IDX_CURR_HANDGUN_WEAPON_ITEMS 20 +#define IDX_CURR_BINO_ITEMS 21 + +// Indexes of loadout items array +#define IDX_LOADOUT_PRIMARY_WEAPON 0 +#define IDX_LOADOUT_SECONDARY_WEAPON 1 +#define IDX_LOADOUT_HANDGUN_WEAPON 2 +#define IDX_LOADOUT_UNIFORM 3 +#define IDX_LOADOUT_VEST 4 +#define IDX_LOADOUT_BACKPACK 5 +#define IDX_LOADOUT_HEADGEAR 6 +#define IDX_LOADOUT_GOGGLES 7 +#define IDX_LOADOUT_BINO 8 +#define IDX_LOADOUT_ASSIGNEDITEMS 9 #define SYMBOL_ITEM_NONE "−" #define SYMBOL_ITEM_REMOVE "×" @@ -199,31 +310,6 @@ #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\ - {\ - private _dlc = "";\ - private _addons = configsourceaddonlist _this;\ - if (count _addons > 0) then {\ - private _mods = configsourcemodlist (configfile >> "CfgPatches" >> _addons select 0);\ - if (count _mods > 0) then {\ - _dlc = _mods select 0;\ - };\ - };\ - _dlc\ - } - -#define ADDMODICON\ - {\ - private _dlcName = _this call GETDLC;\ - if (_dlcName != "") then {\ - _ctrlPanel lbsetpictureright [_lbAdd,(modParams [_dlcName,["logo"]]) param [0,""]];\ - };\ - }; - -#define ADDBINOCULARSMAG\ - private _magazines = getarray (configfile >> "cfgweapons" >> _item >> "magazines");\ - if (count _magazines > 0) then {GVAR(center) addmagazine (_magazines select 0)}; - #define TOGGLE_RIGHT_PANEL_WEAPON\ {\ _x = _display displayCtrl _x;\ @@ -231,26 +317,21 @@ _x ctrlShow true;\ _x ctrlEnable true;\ _x ctrlCommit FADE_DELAY;\ -} foreach [\ +} forEach [\ IDC_blockRightFrame,\ IDC_blockRighttBackground,\ IDC_rightTabContent,\ IDC_sortRightTab,\ + IDC_sortRightTabDirection,\ RIGHT_PANEL_ACC_IDCS,\ IDC_rightSearchbar,\ IDC_rightSearchbarButton,\ IDC_buttonCurrentMag\ ];\ private _buttonCurrentMag2Ctrl = _display displayCtrl IDC_buttonCurrentMag2;\ -if (GVAR(currentLeftPanel) == IDC_buttonPrimaryWeapon) then {\ - _buttonCurrentMag2Ctrl ctrlSetFade 0;\ - _buttonCurrentMag2Ctrl ctrlShow true;\ - _buttonCurrentMag2Ctrl ctrlEnable true;\ -} else {\ - _buttonCurrentMag2Ctrl ctrlSetFade 1;\ - _buttonCurrentMag2Ctrl ctrlShow false;\ - _buttonCurrentMag2Ctrl ctrlEnable false;\ -};\ +_buttonCurrentMag2Ctrl ctrlSetFade 0;\ +_buttonCurrentMag2Ctrl ctrlShow true;\ +_buttonCurrentMag2Ctrl ctrlEnable true;\ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ {\ _x = _display displayCtrl _x;\ @@ -258,7 +339,7 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ _x ctrlShow false;\ _x ctrlEnable false;\ _x ctrlCommit FADE_DELAY;\ -} foreach [\ +} forEach [\ IDC_loadIndicator,\ RIGHT_PANEL_ITEMS_IDCS,\ IDC_rightTabContentListnBox,\ @@ -274,7 +355,7 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ safezoneH - 28 * GRID_H\ ];\ _x ctrlCommit 0;\ -} foreach [\ +} forEach [\ IDC_blockRightFrame,\ IDC_blockRighttBackground\ ]; @@ -286,12 +367,13 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ _x ctrlShow true;\ _x ctrlEnable true;\ _x ctrlCommit FADE_DELAY;\ -} foreach [\ +} forEach [\ IDC_blockRightFrame, \ IDC_blockRighttBackground,\ IDC_loadIndicator,\ IDC_rightTabContentListnBox,\ IDC_sortRightTab,\ + IDC_sortRightTabDirection,\ IDC_tabRight,\ RIGHT_PANEL_ACC_IDCS,\ RIGHT_PANEL_ITEMS_IDCS,\ @@ -304,7 +386,7 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ _x ctrlShow false;\ _x ctrlEnable false;\ _x ctrlCommit FADE_DELAY;\ -} foreach [\ +} forEach [\ IDC_buttonCurrentMag,\ IDC_buttonCurrentMag2,\ IDC_iconBackgroundCurrentMag,\ @@ -319,7 +401,7 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\ safezoneH - 34 * GRID_H\ ];\ _x ctrlCommit 0;\ -} foreach [\ +} forEach [\ IDC_blockRightFrame,\ IDC_blockRighttBackground\ ];\ @@ -367,13 +449,14 @@ if (!isNil QGVAR(customRightPanelButtons)) then {\ _x ctrlShow false;\ _x ctrlEnable false;\ _x ctrlCommit FADE_DELAY;\ -} foreach [\ +} forEach [\ IDC_blockRightFrame,\ IDC_blockRighttBackground,\ IDC_loadIndicator,\ IDC_rightTabContent,\ IDC_rightTabContentListnBox,\ IDC_sortRightTab,\ + IDC_sortRightTabDirection,\ RIGHT_PANEL_ACC_BACKGROUND_IDCS,\ RIGHT_PANEL_ACC_IDCS,\ RIGHT_PANEL_ITEMS_BACKGROUND_IDCS,\ @@ -387,83 +470,12 @@ if (!isNil QGVAR(customRightPanelButtons)) then {\ IDC_iconBackgroundCurrentMag2\ ]; -#define LIST_DEFAULTS\ - [\ - [\ - (primaryweapon GVAR(center) call bis_fnc_baseWeapon),\ - (secondaryweapon GVAR(center) call bis_fnc_baseWeapon),\ - (handgunweapon GVAR(center) call bis_fnc_baseWeapon)\ - ],\ - [\ - [primaryWeaponItems GVAR(center), secondaryWeaponItems GVAR(center), handgunItems GVAR(center)],\ - [primaryWeaponMagazine GVAR(center), secondaryWeaponMagazine GVAR(center), handgunMagazine GVAR(center)]\ - ],\ - uniformItems GVAR(center) + vestItems GVAR(center) + backpackItems GVAR(center),\ - [headgear GVAR(center)],\ - [uniform GVAR(center)],\ - [vest GVAR(center)],\ - [backpack GVAR(center)],\ - [goggles GVAR(center)],\ - [hmd GVAR(center)],\ - [binocular GVAR(center)]\ -] - -#define CHECK_WEAPON_OR_ACC\ - (_weaponsArray select 0) findIf {_x == _item} > -1 ||\ - {(_weaponsArray select 1) findIf {_x == _item} > -1} ||\ - {(_weaponsArray select 2) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 9) findIf {_x == _item} > -1} ||\ - {(_accsArray select 0) findIf {_x == _item} > -1} ||\ - {(_accsArray select 1 findIf {_x == _item} > -1)} ||\ - {(_accsArray select 2) findIf {_x == _item} > -1} ||\ - {(_accsArray select 3) findIf {_x == _item} > -1} - -// 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} ||\ - {(GVAR(virtualItems) select 13) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 14) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 8) findIf {_x == _item} > -1} - -#define CHECK_CONTAINER \ - (GVAR(virtualItems) select 4) findIf {_x == _item} > -1 ||\ - {(GVAR(virtualItems) select 5) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 6) findIf {_x == _item} > -1} - -#define CLASS_CHECK_ITEM\ - isClass (_weaponCfg >> _item) ||\ - {isClass (_vehcCfg >> _item)} ||\ - {isClass (_glassesCfg >> _item)} ||\ - {isClass (_magCfg >> _item)} - -#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} ||\ - {(_accsArray select 2) findIf {_x == _item} > -1} ||\ - {(_accsArray select 3) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 4) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 5) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 6) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 7) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 8) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 10) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 11) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 12) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 13) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 14) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 15) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 16) findIf {_x == _item} > -1} ||\ - {(GVAR(virtualItems) select 17) findIf {_x == _item} > -1} - #define ADD_LOADOUTS_LIST_PICTURES\ - _contentPanelCtrl lnbSetPicture [[_newRow, 2], getText (configFile >> "cfgWeapons" >> ((_loadout select 0) select 0) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 3], getText (configFile >> "cfgWeapons" >> ((_loadout select 1) select 0) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 4], getText (configFile >> "cfgWeapons" >> ((_loadout select 2) select 0) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 5], getText (configFile >> "cfgWeapons" >> ((_loadout select 3) select 0) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 6], getText (configFile >> "cfgWeapons" >> ((_loadout select 4) select 0) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 7], getText (configFile >> "cfgVehicles" >> ((_loadout select 5) select 0) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 8], getText (configFile >> "cfgWeapons" >> (_loadout select 6) >> "picture")];\ - _contentPanelCtrl lnbSetPicture [[_newRow, 9], getText (configFile >> "cfgGlasses" >> (_loadout select 7) >> "picture")]; + _contentPanelCtrl lnbSetPicture [[_newRow, 2], getText (_cfgWeapons >> (_loadout select IDX_LOADOUT_PRIMARY_WEAPON) select 0 >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 3], getText (_cfgWeapons >> (_loadout select IDX_LOADOUT_SECONDARY_WEAPON) select 0 >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 4], getText (_cfgWeapons >> (_loadout select IDX_LOADOUT_HANDGUN_WEAPON) select 0 >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 5], getText (_cfgWeapons >> (_loadout select IDX_LOADOUT_UNIFORM) select 0 >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 6], getText (_cfgWeapons >> (_loadout select IDX_LOADOUT_VEST) select 0 >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 7], getText (configFile >> "CfgVehicles" >> (_loadout select IDX_LOADOUT_BACKPACK) select 0 >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 8], getText (_cfgWeapons >> _loadout select IDX_LOADOUT_HEADGEAR >> "picture")];\ + _contentPanelCtrl lnbSetPicture [[_newRow, 9], getText (configFile >> "CfgGlasses" >> _loadout select IDX_LOADOUT_GOGGLES >> "picture")]; diff --git a/addons/arsenal/functions/fnc_addAction.sqf b/addons/arsenal/functions/fnc_addAction.sqf new file mode 100644 index 0000000000..4606be5abe --- /dev/null +++ b/addons/arsenal/functions/fnc_addAction.sqf @@ -0,0 +1,122 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Adds custom action buttons. + * + * Arguments: + * 0: Tabs to add action to + * 1: Action class (unique string for each action) + * 2: Title + * 3: Actions + * 4: Condition (default: {true}) + * 5: Scope editor (default: 2) + * + * Return Value: + * 0: Array of IDs + * + * Example: + * [[0, 5], "TAG_myActions", "My Actions", [ + * ["text", "Text", {true}, "Text"], + * ["statement", "Statement", {true}, "", {[_this select 0] call tag_fnc_myTextStatement}], + * ["button", "Button", {true}, "", {}, {_this call tag_fnc_myAction}] + * ]] call ace_arsenal_fnc_addAction + * + * Public: Yes + */ + +params [ + ["_tabs", [], [[]]], + ["_rootClass", "", [""]], + ["_title", "", [""]], + ["_actions", [], [[]]], + ["_rootCondition", {true}, [{}]], + ["_scopeEditor", 2, [0]] +]; + +// Compile actions from config (in case this is called before preInit) +call FUNC(compileActions); + +// Skip if not allowed in editor and in editor +if (is3DEN && {_scopeEditor != 2}) exitWith { + TRACE_1("Skipping action because in editor", _rootClass); + [] +}; + +// Class can't contain ~, because it's used for formatting result +if ("~" in _rootClass) exitWith { + TRACE_1("Classname can't contain '~'", _rootClass); + [] +}; + +private _return = []; + +private _fnc_addToGroup = { + params ["_group", "_tab"]; + + private _type = -1; + + { + _x params [["_class", "", [""]], ["_label", "", [""]], ["_condition", {true}, [{}]], ["_text", "", [""]], ["_textStatement", {}, [{}]], ["_statement", {}, [{}]]]; + + // Class can't contain ~, because it's used for formatting result + if (_class == "" || {"~" in _class}) then { + continue; + }; + + // Don't allow two of the same class + if (_group findIf {(_x select 0) == _class} != -1) then { + TRACE_1("An action with this ID already exists", _class); + continue; + }; + + _type = switch (false) do { + case (_text == ""): { + _statement = format ["{""%1""}", _text]; + ACTION_TYPE_TEXT + }; + case (_textStatement isEqualTo {}): { + _statement = _textStatement; + ACTION_TYPE_TEXT + }; + case (_statement isEqualTo {}): { + _statement = _statement; + ACTION_TYPE_BUTTON + }; + default { + -1 + }; + }; + + if (_type == -1) then { + continue; + }; + + _statement = compile format [QUOTE([GVAR(center)] call %1), _statement]; + + _group pushBack [_class, _type, _label, _statement, _condition]; + _return pushBack ([_rootClass, _class, _tab] joinString "~"); + } forEach _actions; +}; + +private _tab = []; +private _index = -1; +private _group = []; + +{ + _tab = GVAR(actionList) select _x; + _index = _tab findIf {(_x select 0) == _rootClass}; + + // Add to existing group + if (_index != -1) then { + [_tab select _index select 3, _x] call _fnc_addToGroup; + } else { + // Add to new group + _group = []; + + [_group, _x] call _fnc_addToGroup; + + _tab pushBack [_rootClass, _title, _rootCondition, _group]; + }; +} forEach _tabs; + +_return diff --git a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf index 2ec3b9c80d..b9b8853f15 100644 --- a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf +++ b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: 654wak654 + * Author: 654wak654, johnb43 * Adds a loadout to the "Default Loadouts" list. - * If a loadout with the same name exists, it is overwritten. + * If a loadout with a similar name exists (case insensitve), it is overwritten. * * Arguments: * 0: Name of loadout - * 1: getUnitLoadout array + * 1: CBA extended loadout or getUnitLoadout array + * 2: Add globally (default: false) * * Return Value: * None @@ -17,90 +18,39 @@ * Public: Yes */ -params [["_name", "", [""]], ["_loadout", [], [[]], 10]]; +params [["_name", "", [""]], ["_loadout", [], [[]]], ["_global", false, [false]]]; + +if (_global) then { + [QGVAR(addDefaultLoadout), [_name, _loadout]] call CBA_fnc_remoteEvent; +}; + +private _extendedInfo = createHashMap; + +// Check if CBA extended loadout array +if (count _loadout == 2) then { + _extendedInfo = _loadout select 1; + _loadout = _loadout select 0; +}; + +if (count _loadout != 10) exitWith {}; if (isNil QGVAR(defaultLoadoutsList)) then { GVAR(defaultLoadoutsList) = []; }; -for "_dataIndex" from 0 to 10 do { - switch (_dataIndex) do { +// Replace unique items with their bases and replace weapons with their base weapons +_loadout = [_loadout] call FUNC(replaceUniqueItemsLoadout); - case 0; - case 1; - case 2; - case 8: { - if (count (_loadout select _dataIndex) > 0) then { +private _index = GVAR(defaultLoadoutsList) findIf {(_x select 0) == _name}; - 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]; +// If there is an already existing loadout with similar name, overwrite it +if (_index != -1) then { + GVAR(defaultLoadoutsList) set [_index, [_name, [_loadout, _extendedInfo]]]; } else { - GVAR(defaultLoadoutsList) set [_loadoutIndex, [_name, _loadout]]; + // Otherwise just add + GVAR(defaultLoadoutsList) pushBack [_name, [_loadout, _extendedInfo]]; +}; + +if (is3DEN) then { + set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; }; diff --git a/addons/arsenal/functions/fnc_addListBoxItem.sqf b/addons/arsenal/functions/fnc_addListBoxItem.sqf index 53bf321baf..2852aa7232 100644 --- a/addons/arsenal/functions/fnc_addListBoxItem.sqf +++ b/addons/arsenal/functions/fnc_addListBoxItem.sqf @@ -1,58 +1,63 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +#include "..\defines.hpp" /* - * Author: Dedmen + * Author: Dedmen, johnb43 * Add a listbox row. * * Arguments: - * 0: Config category (must be "CfgWeapons", "CfgVehicles", "CfgMagazines", "CfgVoice") + * 0: Config category, must be "CfgWeapons", "CfgVehicles", "CfgMagazines", "CfgVoice" or "CfgUnitInsignia" * 1: Classname * 2: Panel control - * 3: Name of the picture entry in that Cfg class + * 3: Name of the picture entry in that Cfg class (default: "picture") * * Return Value: * None * + * Example: + * ["CfgWeapons", "launch_NLAW_F", _ctrl, "icon"] call ace_arsenal_fnc_addListBoxItem + * * Public: Yes -*/ + */ + params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]]]; -private _cacheNamespace = _ctrlPanel; //For better readability. - -private _cachedItemInfo = _cacheNamespace getVariable [_configCategory+_className, []]; - -//_cachedItemInfo == [_displayName, _itemPicture, _modPicture] -if (_cachedItemInfo isEqualTo []) then {//Not in cache. So get info and put into cache. - - private _configPath = configFile >> _configCategory >> _className; - - _cachedItemInfo set [0, getText (_configPath >> "displayName")]; - //if _pictureEntryName is empty then this item has no Icons. (Faces) - _cachedItemInfo set [1, if (_pictureEntryName isEqualTo "") then {""} else {getText (_configPath >> _pictureEntryName)}]; - - //get name of DLC - private _dlcName = ""; - private _addons = configsourceaddonlist _configPath; - if (_addons isNotEqualTo []) then { - private _mods = configsourcemodlist (configfile >> "CfgPatches" >> _addons select 0); - if (_mods isNotEqualTo []) then { - _dlcName = _mods select 0; +private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLower _className) in GVAR(favorites))}; +if (_skip) then { + switch (GVAR(currentLeftPanel)) do { + case IDC_buttonPrimaryWeapon: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS)); + }; + case IDC_buttonHandgun: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS)); + }; + case IDC_buttonSecondaryWeapon: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS)); + }; + case IDC_buttonBinoculars: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_BINO_ITEMS)); }; }; - - if (_dlcName != "") then { - _cachedItemInfo set [2, (modParams [_dlcName,["logo"]]) param [0,""]];//mod picture - } else { - _cachedItemInfo set [2, ""];//mod picture - _cachedItemInfo set [3, 0];//mod ID - }; - _cacheNamespace setVariable [_configCategory+_className, _cachedItemInfo]; }; -_cachedItemInfo params ["_displayName", "_itemPicture", "_modPicture"]; +if (_skip) exitWith {}; -private _lbAdd = _ctrlPanel lbAdd _displayName; +// Sanitise key, as it's public; If not in cache, find info and cache it for later use +((uiNamespace getVariable QGVAR(addListBoxItemCache)) getOrDefaultCall [_configCategory + _className, { + // Get classname (config case), display name, picture and DLC + private _configPath = configFile >> _configCategory >> _className; + private _dlcName = _configPath call EFUNC(common,getAddon); + // If _pictureEntryName is empty, then this item has no picture (e.g. faces) + [configName _configPath, getText (_configPath >> "displayName"), if (_pictureEntryName == "") then {""} else {getText (_configPath >> _pictureEntryName)}, if (_dlcName != "") then {(modParams [_dlcName, ["logo"]]) param [0, ""]} else {""}] +}, true]) params ["_className", "_displayName", "_itemPicture", "_modPicture"]; + +private _lbAdd = _ctrlPanel lbAdd _displayName; _ctrlPanel lbSetData [_lbAdd, _className]; _ctrlPanel lbSetPicture [_lbAdd, _itemPicture]; -_ctrlPanel lbSetPictureRight [_lbAdd,["",_modPicture] select (GVAR(enableModIcons))]; +_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)]; _ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]]; + +if ((toLower _className) in GVAR(favorites)) then { + _ctrlPanel lbSetColor [_lbAdd, FAVORITES_COLOR]; + _ctrlPanel lbSetSelectColor [_lbAdd, FAVORITES_COLOR]; +}; diff --git a/addons/arsenal/functions/fnc_addRightPanelButton.sqf b/addons/arsenal/functions/fnc_addRightPanelButton.sqf index b906c13c4f..6e1035a86a 100644 --- a/addons/arsenal/functions/fnc_addRightPanelButton.sqf +++ b/addons/arsenal/functions/fnc_addRightPanelButton.sqf @@ -1,55 +1,74 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: shukari, Schwaggot - * Adds a right panel button for uniforms, vests and backpacks with - * defined misc items. + * Author: shukari, Schwaggot, johnb43 + * 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) + * 0: Items, must be misc items + * 1: Tooltip (default: "") + * 2: Picture path (default: QPATHTOF(data\iconCustom.paa)) + * 3: Override a specific button (0-9) (default: -1) + * 4: Move button if its position is overridden (default: false) * * Return Value: - * successful: number of the slot; error: -1 + * Successful: Number of the slot (0-9) + * Error: -1 * * Example: - * [["ACE_bloodIV_500", "ACE_Banana"], "MedicalStuff", "\z\ace\addons\arsenal\data\iconCustom.paa", 5] call ace_arsenal_fnc_addRightPanelButton + * [["ACE_bloodIV_500", "ACE_Banana"], "MedicalStuff", "\z\ace\addons\arsenal\data\iconCustom.paa", 5, false] call ace_arsenal_fnc_addRightPanelButton * * Public: Yes */ -params [["_items", [], [[]]], ["_tooltip", "", [""]], ["_picture", QPATHTOF(data\iconCustom.paa), [""]], ["_override", -1, [0]]]; +params [["_items", [], [[]]], ["_tooltip", "", [""]], ["_picture", QPATHTOF(data\iconCustom.paa), [""]], ["_override", -1, [0]], ["_moveOnOverwrite", false, [false]]]; if (isNil QGVAR(customRightPanelButtons)) then { - GVAR(customRightPanelButtons) = []; + GVAR(customRightPanelButtons) = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]; }; -private _position = count GVAR(customRightPanelButtons); +private _position = -1; -if (_override != -1 && {_override >= 0} && {_override <= 9}) then { +// See if override is valid +if (_override >= 0 && {_override <= 9}) then { _position = _override; } else { + // Try to find an empty spot 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]]; +// If spot not found, return error +if (_position < 0 || {_position > 9}) exitWith { + -1 }; -_return +// Check if we're overwriting a button that's being force-kept +private _currentButtonInPosition = GVAR(customRightPanelButtons) select _position; +if (!isNil "_currentButtonInPosition") then { + _currentButtonInPosition params ["_cbItems", "_cbPicture", "_cbTooltip", "_cbMove"]; + if (_cbMove) then { + [{_this call FUNC(addRightPanelButton)}, [_cbItems, _cbTooltip, _cbPicture, -1, _cbMove]] call CBA_fnc_execNextFrame; + }; +}; + +// If spot found, add items and return position +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _configItemInfo = ""; + +_items = _items select { + _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"} || + {getNumber (_cfgMagazines >> _x >> "ACE_isUnique") == 1} +}; + +GVAR(customRightPanelButtons) set [_position, [_items apply {_x call EFUNC(common,getConfigName)}, _picture, _tooltip, _moveOnOverwrite]]; + +_position diff --git a/addons/arsenal/functions/fnc_addSort.sqf b/addons/arsenal/functions/fnc_addSort.sqf index 9ecdcc03d2..053f2ff52f 100644 --- a/addons/arsenal/functions/fnc_addSort.sqf +++ b/addons/arsenal/functions/fnc_addSort.sqf @@ -1,19 +1,19 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brett Mayson - * Add a custom sorting method. + * Author: Brett Mayson, johnb43 + * Adds a custom sorting method. * * Arguments: - * 0: Tabs to add stat to - * 0: Left Tab Indexes - * 1: Right Tab Indexes - * 1: Sort Class (a unique string for each algorithm) - * 2: Display Name + * 0: Tabs to add sort to + * - 0: Left Tab Indexes + * - 1: Right Tab Indexes + * 1: Sort class (a unique string for each algorithm) + * 2: Title * 3: Algorithm - * 4: Condition (Optional) + * 4: Condition (default: {true}) * * Return Value: - * 0: Array of IDs (ARRAY of STRINGS) + * 0: Array of IDs * * Example: * [[[0, 1], []], "fireRateSort", "Sort by fire rate", { @@ -23,11 +23,11 @@ * * { * _fireRate pushBackUnique (getNumber (_itemCfg >> _x >> "reloadTime")); - * } foreach _fireModes; + * } forEach _fireModes; * * _fireRate sort true; * _fireRate param [0, 0] - * }] call ACE_arsenal_fnc_addSort; + * }] call ace_arsenal_fnc_addSort * * Public: Yes */ @@ -35,7 +35,7 @@ params [ ["_tabs", [[], []], [[]], 2], ["_class", "", [""]], - ["_displayName", "", [""]], + ["_title", "", [""]], ["_statement", {}, [{}]], ["_condition", {true}, [{}]] ]; @@ -45,28 +45,46 @@ _tabs params [ ["_rightTabs", [], [[]]] ]; +// Compile sorts from config (in case this is called before preInit) call FUNC(compileSorts); -private _returnArray = []; +private _return = []; private _fnc_addToTabs = { - params ["_tabsList", "_tabsToAddTo", "_sideString"]; + params ["_tabsList", "_tabsToAddTo", "_tabSide"]; + + private _sort = []; + private _sortName = ""; + private _currentTab = []; + { - private _arrayToSave = +_finalArray; - _arrayToSave set [0, [_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""]; - _returnArray pushBack (_arrayToSave select 0); - (_tabsList select _x) pushBack _arrayToSave; + // Copy title, statement and condition + _sort = +_finalArray; + + // Make sort name + _sortName = [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""; + _sort set [0, _sortName]; + + _currentTab = _tabsList select _x; + + // Find if there is an entry with same ID + if ((_currentTab findIf {(_x select 0) == _sortName}) == -1) then { + _currentTab pushBack _sort; + _return pushBack _sortName; + } else { + TRACE_1("A sort with this ID already exists", _sortName); + }; } forEach _tabsToAddTo; }; -_finalArray = ["", _displayName, _statement, _condition]; +private _finalArray = ["", _title, _statement, _condition]; if (_leftTabs isNotEqualTo []) then { - [GVAR(sortListLeftPanel), _leftTabs, "L", 0] call _fnc_addToTabs; + [GVAR(sortListLeftPanel), _leftTabs, "L"] call _fnc_addToTabs; }; if (_rightTabs isNotEqualTo []) then { - [GVAR(sortListRightPanel), _rightTabs, "R", 1] call _fnc_addToTabs; + [GVAR(sortListRightPanel), _rightTabs, "R"] call _fnc_addToTabs; }; -_returnArray +_return diff --git a/addons/arsenal/functions/fnc_addStat.sqf b/addons/arsenal/functions/fnc_addStat.sqf index ac13e97699..98dfe45213 100644 --- a/addons/arsenal/functions/fnc_addStat.sqf +++ b/addons/arsenal/functions/fnc_addStat.sqf @@ -1,35 +1,36 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Alganthe - * Add a stat to ACE Arsenal. + * Author: Alganthe, johnb43, LinkIsGrim + * Adds a stat to ACE Arsenal. * * Arguments: - * 0: Tabs to add the stat to (ARRAY of ARRAYS) - * 0.1 Left tab indexes (ARRAY of NUMBERS) - * 0.2 Right tab indexes (ARRAY of NUMBERS) - * 1: Stat class (STRING) (A unique string for each stat) - * 2: Config entries to pass (ARRAY of STRINGS) - * 3: Title (STRING) - * 4: Show bar / show text bools (ARRAY of BOOLS) - * 4.1 Show bar (BOOL) - * 4.2 Show text (BOOL) - * 5: Array of statements (ARRAY of ARRAYS) - * 5.1 Bar code (CODE) - * 5.2 Text code (CODE) - * 5.3 Condition code (CODE) - * 6: Priority (NUMBER) (Optional) + * 0: Tabs to add the stat to + * - 0: Left tab indexes + * - 1: Right tab indexes + * 1: Stat class (unique string for each stat) + * 2: Config entries to pass + * 3: Title + * 4: Show bar / show text bools + * - 0: Show bar (default: false) + * - 1: Show text (default: false) + * 5: Array of statements + * - 0: Bar code (default: {}) + * - 1: Text code (default: {}) + * - 2: Condition code (default: {true}) + * 6: Priority (default: 0) * * Return Value: - * 0: Array of IDs (ARRAY of STRINGS) + * 0: Array of IDs * * Example: - * [[[0,1,2], [7]], "scopeStat", ["scope"], "Scope", [false, true], [{}, { - params ["_statsArray", "_itemCfg"]; - getNumber (_itemCfg >> _statsArray select 0) - }, {true}]] call ACE_arsenal_fnc_addStat + * [[[0, 1, 2], [7]], "scopeStat", ["scope"], "Scope", [false, true], [{}, { + * params ["_statsArray", "_itemCfg"]; + * getNumber (_itemCfg >> _statsArray select 0) + * }, {true}]] call ace_arsenal_fnc_addStat * * Public: Yes -*/ + */ + params [ ["_tabs", [[], []], [[]], 2], ["_class", "", [""]], @@ -45,7 +46,10 @@ _tabs params [ ["_rightTabs", [], [[]]] ]; -_bools params [["_showBar", false, [false]], ["_showText", false, [false]]]; +_bools params [ + ["_showBar", false, [false]], + ["_showText", false, [false]] +]; _statements params [ ["_barStatement", {}, [{}]], @@ -53,47 +57,68 @@ _statements params [ ["_condition", {true}, [{}]] ]; +// Compile stats from config (in case this is called before preInit) call FUNC(compileStats); -private _returnArray = []; +private _return = []; +private _changes = []; private _fnc_addToTabs = { - params ["_tabsList", "_tabsToAddTo", "_sideString", "_returnIndex"]; + params ["_tabsList", "_tabsToAddTo", "_tabSide"]; + + private _statName = ""; + private _currentTab = []; + private _stat = []; + { - private _currentTab = _tabsList select _x; + // Make stat name + _statName = [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""; + _currentTab = _tabsList select _x; - private _finalID = [_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""; - - if ({{_x select 0 == _finalID} count _x > 0} count _currentTab > 0) then { - TRACE_1("A stat with this ID already exists", _finalID); + // Find if there is an entry with same ID + if (_currentTab findIf {_x select 5 == _statName} != -1) then { + TRACE_1("A stat with this ID already exists", _statName); } else { + _stat = +_finalArray; + _stat set [5, _statName]; - private _arrayToSave = +_finalArray; - _arrayToSave set [0, _finalID]; - _returnArray pushBack _finalID; + _currentTab pushBack _stat; - // Add to existing page if there's enough space, otherwise create a new page - if ({count _x < 5} count _currentTab > 0) then { - { - if (count _x < 5) exitWith { - (_currentTab select _forEachIndex) append [_arrayToSave]; - }; - } foreach _currentTab; - } else { - _currentTab pushBack [_arrayToSave]; - }; + _return pushBack _statName; + + // Store information, so that only tabs that were changed can be sorted again + _changes pushBackUnique [_x, _tabSide]; }; - } foreach _tabsToAddTo; + } forEach _tabsToAddTo; }; -private _finalArray = ["", _stats, _title, [_showBar, _showText], [_barStatement, _textStatement, _condition], _priority]; +private _finalArray = [_priority, _stats, _title, [_showBar, _showText], [_barStatement, _textStatement, _condition], ""]; -if (count _leftTabs > 0) then { - [GVAR(statsListLeftPanel), _leftTabs, "L", 0] call _fnc_addToTabs; +if (_leftTabs isNotEqualTo []) then { + [GVAR(statsListLeftPanel), _leftTabs, "L"] call _fnc_addToTabs; }; -if (count _rightTabs > 0) then { - [GVAR(statsListRightPanel), _rightTabs, "R", 1] call _fnc_addToTabs; +if (_rightTabs isNotEqualTo []) then { + [GVAR(statsListRightPanel), _rightTabs, "R"] call _fnc_addToTabs; }; -_returnArray +private _stats = []; +private _tabToChange = []; + +// Ensure priority is kept +{ + _x params ["_tab", "_tabSide"]; + + _tabToChange = if (_tabSide == "R") then { + GVAR(statsListRightPanel) + } else { + GVAR(statsListLeftPanel) + }; + + _stats = _tabToChange select _tab; + + // Sort by priority + _stats sort false; +} forEach _changes; + +_return diff --git a/addons/arsenal/functions/fnc_addVirtualItems.sqf b/addons/arsenal/functions/fnc_addVirtualItems.sqf index 1d9a782603..0e16af3771 100644 --- a/addons/arsenal/functions/fnc_addVirtualItems.sqf +++ b/addons/arsenal/functions/fnc_addVirtualItems.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe, Dedmen + * Author: Alganthe, Dedmen, johnb43 * Add virtual items to the provided target. * * Arguments: * 0: Target - * 1: Items - * 2: Add globally + * 1: Items + * 2: Add globally (default: false) * * Return Value: * None @@ -21,206 +21,105 @@ params [["_object", objNull, [objNull]], ["_items", [], [true, []]], ["_global", false, [false]]]; -if (_object == objNull) exitWith {}; -if (_items isEqualType [] && {count _items == 0}) exitWith {}; +if (isNull _object || {_items isEqualTo []}) exitWith {}; -private _cargo = _object getVariable [QGVAR(virtualItems), [ - [[], [], []], // Weapons 0, primary, secondary, handgun - [[], [], [], []], // WeaponAccessories 1, optic,side,muzzle,bipod - [ ], // Magazines 2 - [ ], // Headgear 3 - [ ], // Uniform 4 - [ ], // Vest 5 - [ ], // Backpacks 6 - [ ], // Goggles 7 - [ ], // NVGs 8 - [ ], // Binoculars 9 - [ ], // Map 10 - [ ], // Compass 11 - [ ], // Radio slot 12 - [ ], // Watch slot 13 - [ ], // Comms slot 14 - [ ], // WeaponThrow 15 - [ ], // WeaponPut 16 - [ ] // InventoryItems 17 -]]; +private _cargo = _object getVariable QGVAR(virtualItems); -private _configCfgWeapons = configFile >> "CfgWeapons"; //Save this lookup in variable for perf improvement +if (isNil "_cargo") then { + _cargo = [ + [IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]], + [IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]] + ]; + _cargo = createHashMapFromArray _cargo; + + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _cargo set [_index, createHashMap]; + }; +}; + +// If passed arguement is "true", add all items if (_items isEqualType true) then { if (_items) then { + private _weapons = _cargo get IDX_VIRT_WEAPONS; + private _weaponAttachments = _cargo get IDX_VIRT_ATTACHMENTS; private _configItems = uiNamespace getVariable QGVAR(configItems); + // Add onto existing items, in case some items that were already added aren't available by default in the arsenal { - (_x select 0) append (_x select 1); - (_x select 2) set [(_x select 3), (_x select 0) arrayIntersect (_x select 0)]; + (_x select 0) merge [_x select 1, true]; + (_x select 2) set [_x select 3, _x select 0]; } forEach [ - [(_cargo select 0 select 0),(_configItems select 0 select 0), _cargo select 0, 0], - [(_cargo select 0 select 1),(_configItems select 0 select 1), _cargo select 0, 1], - [(_cargo select 0 select 2),(_configItems select 0 select 2), _cargo select 0, 2], - [(_cargo select 1 select 0),(_configItems select 1 select 0), _cargo select 1, 0], - [(_cargo select 1 select 1),(_configItems select 1 select 1), _cargo select 1, 1], - [(_cargo select 1 select 2),(_configItems select 1 select 2), _cargo select 1, 2], - [(_cargo select 1 select 3),(_configItems select 1 select 3), _cargo select 1, 3] + [_weapons get IDX_VIRT_PRIMARY_WEAPONS, _configItems get IDX_VIRT_WEAPONS get IDX_VIRT_PRIMARY_WEAPONS, _weapons, IDX_VIRT_PRIMARY_WEAPONS], + [_weapons get IDX_VIRT_SECONDARY_WEAPONS, _configItems get IDX_VIRT_WEAPONS get IDX_VIRT_SECONDARY_WEAPONS, _weapons, IDX_VIRT_SECONDARY_WEAPONS], + [_weapons get IDX_VIRT_HANDGUN_WEAPONS, _configItems get IDX_VIRT_WEAPONS get IDX_VIRT_HANDGUN_WEAPONS, _weapons, IDX_VIRT_HANDGUN_WEAPONS], + [_weaponAttachments get IDX_VIRT_OPTICS_ATTACHMENTS, _configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_OPTICS_ATTACHMENTS, _weaponAttachments, IDX_VIRT_OPTICS_ATTACHMENTS], + [_weaponAttachments get IDX_VIRT_FLASHLIGHT_ATTACHMENTS, _configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_FLASHLIGHT_ATTACHMENTS, _weaponAttachments, IDX_VIRT_FLASHLIGHT_ATTACHMENTS], + [_weaponAttachments get IDX_VIRT_MUZZLE_ATTACHMENTS, _configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_MUZZLE_ATTACHMENTS, _weaponAttachments, IDX_VIRT_MUZZLE_ATTACHMENTS], + [_weaponAttachments get IDX_VIRT_BIPOD_ATTACHMENTS, _configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_BIPOD_ATTACHMENTS, _weaponAttachments, IDX_VIRT_BIPOD_ATTACHMENTS] ]; - for "_index" from 2 to 17 do { - (_cargo select _index) append (_configItems select _index); - _cargo set [_index, (_cargo select _index) arrayIntersect (_cargo select _index)]; + // Add onto existing items, in case some items that were already added aren't available by default in the arsenal + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + (_cargo get _index) merge [_configItems get _index, true]; + _cargo set [_index, _cargo get _index]; }; }; - } else { + // Make sure all items are in string form, then convert to config case (non-existent items return "") + _items = (_items select {_x isEqualType ""}) apply {_x call EFUNC(common,getConfigName)}; + + // Remove any invalid/non-existing items + _items = _items - [""]; + + private _configItems = uiNamespace getVariable QGVAR(configItems); + private _configItemsFlat = uiNamespace getVariable QGVAR(configItemsFlat); + + // Convert all items to their baseWeapon + _items = _items apply {if (_x in _configItemsFlat) then {_x} else {_x call FUNC(baseWeapon)}}; + + // Remove any items not found by the arsenal + _items = _items select {_x in _configItemsFlat}; + + // https://community.bistudio.com/wiki/Arma_3:_Characters_And_Gear_Encoding_Guide#Character_configuration + // https://github.com/acemod/ACE3/pull/9040#issuecomment-1597748331 { - if (_x isEqualType "") then { - private _configItemInfo = _configCfgWeapons >> _x >> "ItemInfo"; - private _simulationType = getText (_configCfgWeapons >> _x >> "simulation"); - switch true do { - case (isClass (_configCfgWeapons >> _x)): { - switch true do { - /* Weapon acc */ - case ( - isClass (_configItemInfo) && - {(getNumber (_configItemInfo >> "type")) in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD]} && - {!(_x isKindOf ["CBA_MiscItem", (_configCfgWeapons)])} - ): { - switch (getNumber (_configItemInfo >> "type")) do { - case TYPE_OPTICS: { - (_cargo select 1) select 0 pushBackUnique _x; - }; - case TYPE_FLASHLIGHT: { - (_cargo select 1) select 1 pushBackUnique _x; - }; - case TYPE_MUZZLE: { - (_cargo select 1) select 2 pushBackUnique _x; - }; - case TYPE_BIPOD: { - (_cargo select 1) select 3 pushBackUnique _x; - }; - }; - }; - /* Headgear */ - case (isClass (_configItemInfo) && - {getNumber (_configItemInfo >> "type") == TYPE_HEADGEAR}): { - (_cargo select 3) pushBackUnique _x; - }; - /* Uniform */ - case (isClass (_configItemInfo) && - {getNumber (_configItemInfo >> "type") == TYPE_UNIFORM}): { - (_cargo select 4) pushBackUnique _x; - }; - /* Vest */ - case (isClass (_configItemInfo) && - {getNumber (_configItemInfo >> "type") == TYPE_VEST}): { - (_cargo select 5) pushBackUnique _x; - }; - /* NVgs */ - case (_simulationType == "NVGoggles"): { - (_cargo select 8) pushBackUnique _x; - }; - /* Binos */ - case (_simulationType == "Binocular" || - {(_simulationType == 'Weapon') && {(getNumber (_configCfgWeapons >> _x >> 'type') == TYPE_BINOCULAR_AND_NVG)}}): { - (_cargo select 9) pushBackUnique _x; - }; - /* Map */ - case (_simulationType == "ItemMap"): { - (_cargo select 10) pushBackUnique _x; - }; - /* Compass */ - case (_simulationType == "ItemCompass"): { - (_cargo select 11) pushBackUnique _x; - }; - /* Radio */ - case (_simulationType == "ItemRadio"): { - (_cargo select 12) pushBackUnique _x; - }; - /* Watch */ - case (_simulationType == "ItemWatch"): { - (_cargo select 13) pushBackUnique _x; - }; - /* GPS */ - case (_simulationType == "ItemGPS"): { - (_cargo select 14) pushBackUnique _x; - }; - /* UAV terminals */ - case (isClass (_configItemInfo) && - {getNumber (_configItemInfo >> "type") == TYPE_UAV_TERMINAL}): { - (_cargo select 14) pushBackUnique _x; - }; - /* Weapon, at the bottom to avoid adding binos */ - case (isClass (_configCfgWeapons >> _x >> "WeaponSlotsInfo") && - {getNumber (_configCfgWeapons >> _x >> 'type') != TYPE_BINOCULAR_AND_NVG}): { - switch (getNumber (_configCfgWeapons >> _x >> "type")) do { - case TYPE_WEAPON_PRIMARY: { - (_cargo select 0) select 0 pushBackUnique ([_x] call bis_fnc_baseWeapon); - }; - case TYPE_WEAPON_HANDGUN: { - (_cargo select 0) select 2 pushBackUnique ([_x] call bis_fnc_baseWeapon); - }; - case TYPE_WEAPON_SECONDARY: { - (_cargo select 0) select 1 pushBackUnique ([_x] call bis_fnc_baseWeapon); - }; - }; - }; - /* Misc items */ - case ( - isClass (_configItemInfo) && - ((getNumber (_configItemInfo >> "type")) in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD] && - {(_x isKindOf ["CBA_MiscItem", (_configCfgWeapons)])}) || - {(getNumber (_configItemInfo >> "type")) in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} || - {(getText (_configCfgWeapons >> _x >> "simulation")) == "ItemMineDetector"} - ): { - (_cargo select 17) pushBackUnique _x; - }; - }; - }; - case (isClass (configFile >> "CfgMagazines" >> _x)): { - // Lists to check against - private _grenadeList = []; - { - _grenadeList append getArray (_configCfgWeapons >> "Throw" >> _x >> "magazines"); - false - } count getArray (_configCfgWeapons >> "Throw" >> "muzzles"); + switch (true) do { + // Weapons + case (_x in ((_configItems get IDX_VIRT_WEAPONS) get IDX_VIRT_PRIMARY_WEAPONS)): { + ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_PRIMARY_WEAPONS) set [_x, nil]; + }; + case (_x in ((_configItems get IDX_VIRT_WEAPONS) get IDX_VIRT_HANDGUN_WEAPONS)): { + ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_HANDGUN_WEAPONS) set [_x, nil]; + }; + case (_x in ((_configItems get IDX_VIRT_WEAPONS) get IDX_VIRT_SECONDARY_WEAPONS)): { + ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_SECONDARY_WEAPONS) set [_x, nil]; + }; - private _putList = []; - { - _putList append getArray (_configCfgWeapons >> "Put" >> _x >> "magazines"); - false - } count getArray (_configCfgWeapons >> "Put" >> "muzzles"); + // Weapon attachments + case (_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS) set [_x, nil]; + }; + case (_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS) set [_x, nil]; + }; + case (_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS) set [_x, nil]; + }; + case (_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS) set [_x, nil]; + }; - // Check what the magazine actually is - switch true do { - // Rifle, handgun, secondary weapons mags - case ( - ((getNumber (configFile >> "CfgMagazines" >> _x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW,TYPE_MAGAZINE_SECONDARY_AND_PUT,1536,TYPE_MAGAZINE_HANDGUN_AND_GL]) || - {(getNumber (configFile >> "CfgMagazines" >> _x >> QGVAR(hide))) == -1}) && - {!(_x in _grenadeList)} && - {!(_x in _putList)} - ): { - (_cargo select 2) pushBackUnique _x; - }; - // Grenades - case (_x in _grenadeList): { - (_cargo select 15) pushBackUnique _x; - }; - // Put - case (_x in _putList): { - (_cargo select 16) pushBackUnique _x; - }; + // Other + default { + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + if (_x in (_configItems get _index)) exitWith { + (_cargo get _index) set [_x, nil]; }; }; - case (isClass (configFile >> "CfgVehicles" >> _x)): { - if (getNumber (configFile >> "CfgVehicles" >> _x >> "isBackpack") == 1) then { - (_cargo select 6) pushBackUnique _x; - }; - }; - case (isClass (configFile >> "CfgGlasses" >> _x)): { - (_cargo select 7) pushBackUnique _x; - }; }; }; - } foreach _items; + } forEach _items; }; _object setVariable [QGVAR(virtualItems), _cargo, _global]; diff --git a/addons/arsenal/functions/fnc_attributeAddCompatible.sqf b/addons/arsenal/functions/fnc_attributeAddCompatible.sqf index 0b8e3f2557..023ebf16cf 100644 --- a/addons/arsenal/functions/fnc_attributeAddCompatible.sqf +++ b/addons/arsenal/functions/fnc_attributeAddCompatible.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: mharis001 + * Author: mharis001, johnb43 * Adds compatible attachments or magazines for all weapons in 3DEN attribute. * * Arguments: @@ -21,55 +21,63 @@ 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 {}; +if !(_category in [IDX_CAT_OPTICS_ATTACHMENTS, IDX_CAT_FLASHLIGHT_ATTACHMENTS, IDX_CAT_MUZZLE_ATTACHMENTS, IDX_CAT_BIPOD_ATTACHMENTS, IDX_CAT_ITEMS_ALL]) exitWith {}; -private _configItems = +(uiNamespace getVariable [QGVAR(configItems), []]); +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}}; +private _attributeWeapons = []; + +{ + _attributeWeapons append (_attributeItems arrayIntersect (keys _y)); +} forEach (_configItems get IDX_VIRT_WEAPONS); + +private _itemsToAdd = createHashMap; // 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"; +if (_category == IDX_CAT_ITEMS_ALL) then { + // Add compatible attachments or magazines to attribute + private _compatibleMagazines = createHashMap; + // Get all compatible magazines for weapons { - 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 get (toLower _x)); - } forEach getArray (_muzzleConfig >> "magazineWell"); - } forEach getArray (_weaponConfig >> "muzzles"); + _compatibleMagazines insert [true, compatibleMagazines _x, []]; } forEach _attributeWeapons; + + // Check if magazines are in configItems + { + if (_x in (_configItems get IDX_VIRT_ITEMS_ALL)) then { + _itemsToAdd set [_x, nil]; + }; + } forEach (keys _compatibleMagazines); } else { private _attachmentCategory = _category - 4; private _filter = ["optic", "pointer", "muzzle", "bipod"] select _attachmentCategory; + private _compatibleItems = createHashMap; + // CBA_fnc_compatibleItems returns config case sensitive names { - _itemsToAdd append ([_x, _filter] call CBA_fnc_compatibleItems); + _compatibleItems insert [true, [_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)}; + // Check if attachments are in configItems + { + if ( + _x in (_configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_OPTICS_ATTACHMENTS) || + {_x in (_configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)} || + {_x in (_configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_MUZZLE_ATTACHMENTS)} || + {_x in (_configItems get IDX_VIRT_ATTACHMENTS get IDX_VIRT_BIPOD_ATTACHMENTS)} + ) then { + _itemsToAdd set [_x, nil]; + }; + } forEach (keys _compatibleItems); }; -_attributeItems append _itemsToAdd; -_attributeValue set [0, _attributeItems arrayIntersect _attributeItems]; +// Only take items that can be found by default in the arsenal +_attributeItems insert [-1, keys _itemsToAdd, true]; +_attributeValue set [0, _attributeItems]; // Refresh the list for new items [_controlsGroup] call FUNC(attributeAddItems); diff --git a/addons/arsenal/functions/fnc_attributeAddItems.sqf b/addons/arsenal/functions/fnc_attributeAddItems.sqf index 12611bbdeb..385ffccc86 100644 --- a/addons/arsenal/functions/fnc_attributeAddItems.sqf +++ b/addons/arsenal/functions/fnc_attributeAddItems.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: mharis001 - * Populates 3DEN attribute listbox with items of given category. + * Author: mharis001, johnb43 + * Populates 3DEN's ace arsenal attribute listbox with items of given category. * * Arguments: * 0: Attribute controls group @@ -18,105 +18,124 @@ params ["_controlsGroup"]; -private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY) - 1; -private _filter = toLower ctrlText (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR); -private _configItems = +(uiNamespace getVariable [QGVAR(configItems), []]); +private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY); +private _filter = ctrlText (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR); +private _configItems = uiNamespace getVariable QGVAR(configItems); +private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems); private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]]; -TRACE_3("Populating list",_category,_filter,_attributeValue); - _attributeValue params ["_attributeItems", "_attributeMode"]; + +TRACE_3("Populating list",_category,_filter,_attributeValue); +if (_filter != "") then { + _filter = _filter call EFUNC(common,escapeRegex); + _filter = ".*?" + (_filter splitString " " joinString ".*?" + ".*?/io"); +} else { + _filter = ".*?/io"; +}; + + private _modeSymbol = [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode; // Clear listbox private _listbox = _controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_LIST; lnbClear _listbox; +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgVehicles = configFile >> "CfgVehicles"; +private _cfgGlasses = configFile >> "CfgGlasses"; + // Exit with current items (no specific category) -if (_category == -1) exitWith { +if (_category == IDX_CAT_ALL) exitWith { + private _config = configNull; + private _displayName = ""; + private _index = -1; + { // Get appropriate config for each item (different since items can be from any category) - private _config = switch (true) do { - case (_x in (_configItems select 2)); - case (_x in (_configItems select 15)); - case (_x in (_configItems select 16)): { - configFile >> "CfgMagazines" >> _x; - }; - case (_x in (_configItems select 6)): { - configFile >> "CfgVehicles" >> _x; - }; - case (_x in (_configItems select 7)): { - configFile >> "CfgGlasses" >> _x; - }; - default { - configFile >> "CfgWeapons" >> _x; - }; + _config = switch (true) do { + case (_x in _magazineMiscItems); + case (_x in (_configItems get IDX_VIRT_ITEMS_ALL)); + case (_x in (_configItems get IDX_VIRT_GRENADES)); + case (_x in (_configItems get IDX_VIRT_EXPLOSIVES)): {_cfgMagazines >> _x}; + case (_x in (_configItems get IDX_VIRT_BACKPACK)): {_cfgVehicles >> _x}; + case (_x in (_configItems get IDX_VIRT_GOGGLES)): {_cfgGlasses >> _x}; + default {_cfgWeapons >> _x}; }; + _displayName = getText (_config >> "displayName"); + // Add item if not filtered - private _displayName = getText (_config >> "displayName"); - if (toLower _displayName find _filter > -1) then { - private _picture = getText (_config >> "picture"); - private _index = _listbox lnbAddRow ["", _displayName, _modeSymbol]; + if (_displayName regexMatch _filter || {_x regexMatch _filter}) then { + _index = _listbox lnbAddRow ["", _displayName, _modeSymbol]; _listbox lnbSetData [[_index, 1], _x]; - _listbox lnbSetPicture [[_index, 0], _picture]; - _listbox lbSetTooltip [_index * (count lnbGetColumnsPosition _listbox), _x]; + _listbox lnbSetPicture [[_index, 0], getText (_config >> "picture")]; + _listbox lnbSetTooltip [[_index, 0], _x]; }; } forEach _attributeItems; - _listbox lnbSort [1]; + // Sort alphabetically + _listbox lnbSort [1, false]; }; // Get list of category items private _categoryItems = switch (true) do { - case (_category < 3): { - _configItems select 0 select _category; + // Weapons + case (_category < IDX_CAT_OPTICS_ATTACHMENTS): { + (_configItems get IDX_VIRT_WEAPONS) get (_category - 1) }; - case (_category < 7): { - _configItems select 1 select (_category - 3); + // Weapon attachments + case (_category < IDX_CAT_ITEMS_ALL): { + (_configItems get IDX_VIRT_ATTACHMENTS) get (_category - 4) }; + // Other default { - _configItems select (_category - 5); + _configItems get (_category - 6) }; }; // Get config for current category -private _config = switch (true) do { - case (_category in [7, 20, 21]): { - configFile >> "CfgMagazines"; - }; - case (_category == 11): { - configFile >> "CfgVehicles"; - }; - case (_category == 12): { - configFile >> "CfgGlasses"; - }; - default { - configFile >> "CfgWeapons"; - }; +private _cfgClass = switch (true) do { + case (_category in [IDX_CAT_ITEMS_ALL, IDX_CAT_GRENADES, IDX_CAT_EXPLOSIVES]): {_cfgMagazines}; + case (_category == IDX_CAT_BACKPACK): {_cfgVehicles}; + case (_category == IDX_CAT_GOGGLES): {_cfgGlasses}; + default {_cfgWeapons}; }; +private _displayName = ""; +private _symbol = SYMBOL_ITEM_NONE; +private _alpha = 0; +private _index = -1; +private _config = _cfgClass; + // Populate listbox with category items { - // Add item if not filtered - private _displayName = getText (_config >> _x >> "displayName"); - if (toLower _displayName find _filter > -1) then { - private _picture = getText (_config >> _x >> "picture"); - private _symbol = SYMBOL_ITEM_NONE; - private _alpha = 0.5; + // "Misc. items" magazines (e.g. spare barrels, intel, photos) + if (_category == IDX_CAT_MISC_ITEMS) then { + _config = [_cfgClass, _cfgMagazines] select (_x in _magazineMiscItems); + }; + _displayName = getText (_config >> _x >> "displayName"); + + // Add item if not filtered + if (_displayName regexMatch _filter || {_x regexMatch _filter}) then { // Change symbol and alpha if item already selected if (_x in _attributeItems) then { _symbol = _modeSymbol; _alpha = 1; + } else { + _symbol = SYMBOL_ITEM_NONE; + _alpha = 0.5; }; - private _index = _listbox lnbAddRow ["", _displayName, _symbol]; + _index = _listbox lnbAddRow ["", _displayName, _symbol]; _listbox lnbSetData [[_index, 1], _x]; - _listbox lnbSetPicture [[_index, 0], _picture]; - _listbox lbSetTooltip [_index * (count lnbGetColumnsPosition _listbox), _x]; + _listbox lnbSetPicture [[_index, 0], getText (_config >> _x >> "picture")]; + _listbox lnbSetTooltip [[_index, 0], _x]; _listbox lnbSetColor [[_index, 1], [1, 1, 1, _alpha]]; _listbox lnbSetColor [[_index, 2], [1, 1, 1, _alpha]]; }; -} forEach _categoryItems; +} forEach (keys _categoryItems); -_listbox lnbSort [1]; +// Sort alphabetically +_listbox lnbSort [1, false]; diff --git a/addons/arsenal/functions/fnc_attributeCategory.sqf b/addons/arsenal/functions/fnc_attributeCategory.sqf index e0c0468f8a..09b25724a9 100644 --- a/addons/arsenal/functions/fnc_attributeCategory.sqf +++ b/addons/arsenal/functions/fnc_attributeCategory.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: mharis001 - * Handles changing the category in 3DEN attribute. + * Handles changing the category in 3DEN's ace arsenal attribute. * * Arguments: * 0: Attribute controls group @@ -24,7 +24,7 @@ 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]; +private _enable = _category in [IDX_CAT_OPTICS_ATTACHMENTS, IDX_CAT_FLASHLIGHT_ATTACHMENTS, IDX_CAT_MUZZLE_ATTACHMENTS, IDX_CAT_BIPOD_ATTACHMENTS, IDX_CAT_ITEMS_ALL]; _compatibleButton ctrlEnable _enable; _compatibleButton ctrlShow _enable; diff --git a/addons/arsenal/functions/fnc_attributeClear.sqf b/addons/arsenal/functions/fnc_attributeClear.sqf index a0a8cb070d..8e40e07703 100644 --- a/addons/arsenal/functions/fnc_attributeClear.sqf +++ b/addons/arsenal/functions/fnc_attributeClear.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: mharis001 - * Clears all items from current category in 3DEN attribute. + * Clears all items from current category in 3DEN's ace arsenal attribute. * * Arguments: * 0: Attribute controls group @@ -18,28 +18,32 @@ params ["_controlsGroup"]; -private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY) - 1; +private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY); private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]]; TRACE_1("Handling clear button",_category); // Remove all if no specific category -if (_category == -1) then { +if (_category == IDX_CAT_ALL) then { _attributeValue set [0, []]; } else { // Find category items and remove from list - private _configItems = +(uiNamespace getVariable [QGVAR(configItems), []]); + private _configItems = uiNamespace getVariable QGVAR(configItems); private _categoryItems = switch (true) do { - case (_category < 3): { - _configItems select 0 select _category; + // Weapons + case (_category < IDX_CAT_OPTICS_ATTACHMENTS): { + (_configItems get IDX_VIRT_WEAPONS) get (_category - 1) }; - case (_category < 7): { - _configItems select 1 select (_category - 3); + // Weapon attachments + case (_category < IDX_CAT_ITEMS_ALL): { + (_configItems get IDX_VIRT_ATTACHMENTS) get (_category - 4) }; + // Other default { - _configItems select (_category - 5); + _configItems get (_category - 6) }; }; - _attributeValue set [0, (_attributeValue select 0) - _categoryItems]; + + _attributeValue set [0, (_attributeValue select 0) select {!(_x in _categoryItems)}]; }; // Refresh the list after clear diff --git a/addons/arsenal/functions/fnc_attributeDblClick.sqf b/addons/arsenal/functions/fnc_attributeDblClick.sqf index 6cb9314bcf..7c0d4f5a25 100644 --- a/addons/arsenal/functions/fnc_attributeDblClick.sqf +++ b/addons/arsenal/functions/fnc_attributeDblClick.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 - * Handles double clicking a row in 3DEN attribute listbox. + * Handles double clicking a row in 3DEN's ace arsenal attribute listbox. * * Arguments: * 0: Listbox diff --git a/addons/arsenal/functions/fnc_attributeImport.sqf b/addons/arsenal/functions/fnc_attributeImport.sqf index ec56df4b56..28604583a0 100644 --- a/addons/arsenal/functions/fnc_attributeImport.sqf +++ b/addons/arsenal/functions/fnc_attributeImport.sqf @@ -1,7 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +#include "..\defines.hpp" /* * Author: mharis001 - * Handles importing items list from clipboard into 3DEN attribute. + * Handles importing items list from clipboard into 3DEN's ace arsenal attribute. * * Arguments: * 0: Attribute controls group @@ -15,8 +16,6 @@ * Public: No */ -params ["_controlsGroup"]; - private _importList = call compile copyFromClipboard; // Verify import list is in correct format @@ -24,23 +23,17 @@ if (isNil "_importList" || {!(_importList isEqualType [])} || {!(_importList isE 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); +params ["_controlsGroup"]; -private _filteredList = []; +// Convert all items to config case +_importList = _importList apply {_x call EFUNC(common,getConfigName)}; -{ - private _item = _x; - { - private _index = _x findIf {_x == _item}; - if (_index > -1) then { - _filteredList pushBackUnique (_x select _index); - }; - } forEach _configItemsFlat; -} forEach _importList; +// Remove any invalid/non-existing items +_importList = _importList - [""]; + +// Ensure imported items are in scanned config array +private _configItemsFlat = uiNamespace getVariable QGVAR(configItemsFlat); +private _filteredList = _importList select {_x in _configItemsFlat}; private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]]; _attributeValue set [0, _filteredList]; diff --git a/addons/arsenal/functions/fnc_attributeInit.sqf b/addons/arsenal/functions/fnc_attributeInit.sqf index 8c1556fcd6..1e44dc579f 100644 --- a/addons/arsenal/functions/fnc_attributeInit.sqf +++ b/addons/arsenal/functions/fnc_attributeInit.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 - * Initializes the objects 3DEN attribute at scenario start. + * Initializes the objects 3DEN's ace arsenal attribute at scenario start. * * Arguments: * 0: Attribute target @@ -28,6 +28,7 @@ if (_mode > 0) then { [{ [{ params ["_object", "_items"]; + [_object, _items, true] call FUNC(removeVirtualItems); }, _this] call CBA_fnc_execNextFrame; }, [_object, _items]] call CBA_fnc_execNextFrame; diff --git a/addons/arsenal/functions/fnc_attributeKeyDown.sqf b/addons/arsenal/functions/fnc_attributeKeyDown.sqf index 300ab9f6c5..85fe522239 100644 --- a/addons/arsenal/functions/fnc_attributeKeyDown.sqf +++ b/addons/arsenal/functions/fnc_attributeKeyDown.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: mharis001 - * Handles keyboard input for the 3DEN attribute. + * Handles keyboard input for the 3DEN's ace arsenal attribute. * * Arguments: * 0: Display @@ -21,18 +21,23 @@ params ["_display", "_keyCode"]; TRACE_2("Attribute key down",_display,_keyCode); // Exit if attribute is not in focus -private _controlsGroup = uiNamespace getVariable QGVAR(attributeFocus); -if (isNil "_controlsGroup") exitWith {false}; +private _controlsGroup = uiNamespace getVariable [QGVAR(attributeFocus), controlNull]; + +if (isNull _controlsGroup) exitWith {false}; switch (_keyCode) do { + // Unselect item case DIK_LEFT; case DIK_NUMPADMINUS: { [_controlsGroup, false] call FUNC(attributeSelect); + true }; + // Select item case DIK_RIGHT; case DIK_NUMPADPLUS: { [_controlsGroup, true] call FUNC(attributeSelect); + true }; default {false}; diff --git a/addons/arsenal/functions/fnc_attributeLoad.sqf b/addons/arsenal/functions/fnc_attributeLoad.sqf index 355d5e113a..bd1ec98ab2 100644 --- a/addons/arsenal/functions/fnc_attributeLoad.sqf +++ b/addons/arsenal/functions/fnc_attributeLoad.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: mharis001 - * Initializes the 3DEN attribute. + * Initializes the 3DEN's ace arsenal attribute. * * Arguments: * 0: Attribute controls group @@ -23,10 +23,8 @@ TRACE_1("Initializing 3DEN attribute",_value); // Store working attribute value uiNamespace setVariable [QGVAR(attributeValue), _value]; -// Add keyDown EH to display -// Does not work properly when added to controls group -private _display = ctrlParent _controlsGroup; -_display displayAddEventHandler ["KeyDown", {call FUNC(attributeKeyDown)}]; +// Add keyDown EH to display; Does not work properly when added to controls group +(ctrlParent _controlsGroup) displayAddEventHandler ["KeyDown", {call FUNC(attributeKeyDown)}]; // Handle selected mode if (_value select 1 > 0) then { diff --git a/addons/arsenal/functions/fnc_attributeMode.sqf b/addons/arsenal/functions/fnc_attributeMode.sqf index 807fea2ec4..9aab5c8869 100644 --- a/addons/arsenal/functions/fnc_attributeMode.sqf +++ b/addons/arsenal/functions/fnc_attributeMode.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: mharis001 - * Handles changing the mode in 3DEN attribute. + * Handles changing the mode in 3DEN's ace arsenal attribute. * * Arguments: * 0: Attribute controls group diff --git a/addons/arsenal/functions/fnc_attributeSelect.sqf b/addons/arsenal/functions/fnc_attributeSelect.sqf index 7af0ecc764..5aeb46c5a4 100644 --- a/addons/arsenal/functions/fnc_attributeSelect.sqf +++ b/addons/arsenal/functions/fnc_attributeSelect.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: mharis001 - * Handles adding/removing an item from 3DEN attribute list. + * Handles adding/removing an item from 3DEN's ace arsenal attribute list. * * Arguments: * 0: Attribute controls group @@ -28,11 +28,12 @@ TRACE_2("Handling item selection",_itemClassname,_addItem); private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]]; _attributeValue params ["_attributeItems", "_attributeMode"]; -private _findItem = _attributeItems find _itemClassname; +private _itemIndex = _attributeItems find _itemClassname; // Add item if not already in list -if (_addItem && {_findItem < 0}) exitWith { +if (_addItem && {_itemIndex == -1}) exitWith { _attributeItems pushBack _itemClassname; + // Change symbol and increase alpha _listbox lnbSetText [[_currentRow, 2], [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode]; _listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 1]]; @@ -40,8 +41,9 @@ if (_addItem && {_findItem < 0}) exitWith { }; // Remove item if in list -if (!_addItem && {_findItem > -1}) exitWith { - _attributeItems deleteAt _findItem; +if (!_addItem && {_itemIndex != -1}) exitWith { + _attributeItems deleteAt _itemIndex; + // Change symbol and reduce alpha _listbox lnbSetText [[_currentRow, 2], SYMBOL_ITEM_NONE]; _listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 0.5]]; diff --git a/addons/arsenal/functions/fnc_baseWeapon.sqf b/addons/arsenal/functions/fnc_baseWeapon.sqf new file mode 100644 index 0000000000..f166af94ce --- /dev/null +++ b/addons/arsenal/functions/fnc_baseWeapon.sqf @@ -0,0 +1,52 @@ +#include "..\script_component.hpp" +/* + * Author: Karel Moricky, johnb43 + * Returns base weapon (weapon without any attachments), but it returns it in config sensitive case. + * Same as BIS_fnc_baseWeapon, except config case and uses cache. + * + * Arguments: + * 0: Weapon + * + * Return Value: + * Base weapon + * + * Example: + * ["arifle_AK12_GL_lush_arco_pointer_F"] call ace_arsenal_fnc_baseWeapon + * + * Public: Yes + */ + +params [["_weapon", "", [""]]]; + +// Check if item is cached +(uiNamespace getVariable QGVAR(baseWeaponNameCache)) getOrDefaultCall [toLower _weapon, { + private _cfgWeapons = configfile >> "CfgWeapons"; + private _config = _cfgWeapons >> _weapon; + + // If class doesn't exist, exit + if (!isClass _config) then { + _weapon + } else { + // Get manual base weapon + private _configBase = _cfgWeapons >> getText (_config >> "baseWeapon"); + + if (isClass _configBase) then { + configName _configBase + } else { + private _className = _weapon; + + // Get first parent without any attachments; Only take weapons available to the arsenal + // https://community.bistudio.com/wiki/Arma_3:_Characters_And_Gear_Encoding_Guide#Character_configuration + // https://github.com/acemod/ACE3/pull/9040#issuecomment-1597748331 + while {isClass _config && {getNumber (_config >> "scope") > 0 && {if (isNumber (_config >> "scopeArsenal")) then {getNumber (_config >> "scopeArsenal") == 2} else {true}}} && {getNumber (_config >> QGVAR(hide)) != 1}} do { + if (count (_config >> "LinkedItems") == 0) exitWith { + _className = configName _config; + }; + + _config = inheritsFrom _config; + }; + + _className + }; + }; +}, true] diff --git a/addons/arsenal/functions/fnc_buttonActionsPage.sqf b/addons/arsenal/functions/fnc_buttonActionsPage.sqf new file mode 100644 index 0000000000..17da357100 --- /dev/null +++ b/addons/arsenal/functions/fnc_buttonActionsPage.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Brett Mayson + * Handles the previous / next page buttons for actions + * + * Arguments: + * 0: Arsenal display + * 1: Actions control + * 2: Previous or next (false = previous, true = next) + * + * Return Value: + * None + * + * Public: No +*/ + +params ["_display", "_control", "_nextPage"]; + +TRACE_1("control enabled", ctrlEnabled _control); +if !(ctrlEnabled _control) exitWith {}; + +GVAR(currentActionPage) = GVAR(currentActionPage) + ([-1, 1] select _nextPage); + +GVAR(actionsInfo) params ["_panelControl", "_curSel", "_itemCfg"]; +[QGVAR(displayActions), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonCargo.sqf b/addons/arsenal/functions/fnc_buttonCargo.sqf index cc8cdf45bf..48c5ee477e 100644 --- a/addons/arsenal/functions/fnc_buttonCargo.sqf +++ b/addons/arsenal/functions/fnc_buttonCargo.sqf @@ -1,12 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Add or remove item(s) when the + or - button is pressed in the right panel. * * Arguments: * 0: Arsenal display - * 1: Add or remove (-1: remove, 1: Add) + * 1: Add (1) or remove (-1) item * * Return Value: * None @@ -16,77 +16,110 @@ params ["_display", "_addOrRemove"]; -private _load = 0; -private _maxLoad = ""; -private _items = []; -private _ctrlList = (_display displayCtrl IDC_rightTabContentListnBox); +private _add = _addOrRemove > 0; + +private _ctrlList = _display displayCtrl IDC_rightTabContentListnBox; private _lnbCurSel = lnbCurSelRow _ctrlList; +private _isUnique = (_ctrlList lnbValue [_lnbCurSel, 2]) == 1; + +// If item is unique, don't allow adding more +if (_add && {_isUnique}) exitWith {}; + +private _containerItems = []; private _item = _ctrlList lnbData [_lnbCurSel, 0]; -if ((_ctrlList lnbValue [_lnbCurSel, 2]) == 1 && {_addOrRemove == 1}) exitWith {}; - -// Update item count and currentItems array -switch GVAR(currentLeftPanel) do { - - case IDC_buttonUniform : { - if (_addOrRemove > 0) then { - for "_count" from 1 to ([1, 5] select (GVAR(shiftState))) do { - GVAR(center) addItemToUniform _item; - }; +// Update item count and currentItems array & get relevant container +private _container = switch (GVAR(currentLeftPanel)) do { + // Uniform + case IDC_buttonUniform: { + if (_add) then { + for "_i" from 1 to ([1, 5] select GVAR(shiftState)) do { + GVAR(center) addItemToUniform _item; + }; + } else { + // Backpacks need special command to be removed + if (_isUnique && {_item in ((uiNamespace getVariable QGVAR(configItems)) get IDX_VIRT_BACKPACK)}) then { + [uniformContainer GVAR(center), _item, [1, 5] select GVAR(shiftState)] call CBA_fnc_removeBackpackCargo; } else { - for "_count" from 1 to ([1, 5] select (GVAR(shiftState))) do { + for "_i" from 1 to ([1, 5] select GVAR(shiftState)) do { GVAR(center) removeItemFromUniform _item; }; }; + }; - _load = loadUniform GVAR(center); - _maxLoad = gettext (configfile >> "CfgWeapons" >> uniform GVAR(center) >> "ItemInfo" >> "containerClass"); - _items = uniformItems GVAR(center); - GVAR(currentItems) set [15 ,_items]; + /// Get all items from container (excluding container itself) + _containerItems = [GVAR(center), 0, 3, 0, 0, false] call EFUNC(common,uniqueUnitItems); + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_UNIFORM_ITEMS, ((getUnitLoadout GVAR(center)) select IDX_LOADOUT_UNIFORM) param [1, []]]; + + // Update load bar + (_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadUniform GVAR(center)); + + uniformContainer GVAR(center) }; - - case IDC_buttonVest : { - if (_addOrRemove > 0) then { - for "_count" from 1 to ([1, 5] select (GVAR(shiftState))) do { - GVAR(center) addItemToVest _item; - }; + // Vest + case IDC_buttonVest: { + if (_add) then { + for "_i" from 1 to ([1, 5] select GVAR(shiftState)) do { + GVAR(center) addItemToVest _item; + }; + } else { + // Backpacks need special command to be removed + if (_isUnique && {_item in ((uiNamespace getVariable QGVAR(configItems)) get IDX_VIRT_BACKPACK)}) then { + [vestContainer GVAR(center), _item, [1, 5] select GVAR(shiftState)] call CBA_fnc_removeBackpackCargo; } else { - for "_count" from 1 to ([1, 5] select (GVAR(shiftState))) do { + for "_i" from 1 to ([1, 5] select GVAR(shiftState)) do { GVAR(center) removeItemFromVest _item; }; }; + }; - _load = loadVest GVAR(center); - _maxLoad = gettext (configfile >> "CfgWeapons" >> vest GVAR(center) >> "ItemInfo" >> "containerClass"); - _items = vestItems GVAR(center); - GVAR(currentItems) set [16,_items]; + // Get all items from container (excluding container itself) + _containerItems = [GVAR(center), 0, 0, 3, 0, false] call EFUNC(common,uniqueUnitItems); + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_VEST_ITEMS, ((getUnitLoadout GVAR(center)) select IDX_LOADOUT_VEST) param [1, []]]; + + // Update load bar + (_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadVest GVAR(center)); + + vestContainer GVAR(center) }; - - case IDC_buttonBackpack : { - if (_addOrRemove > 0) then { - for "_count" from 1 to ([1, 5] select (GVAR(shiftState))) do { - GVAR(center) addItemToBackpack _item; - }; + // Backpack + case IDC_buttonBackpack: { + if (_add) then { + for "_i" from 1 to ([1, 5] select GVAR(shiftState)) do { + GVAR(center) addItemToBackpack _item; + }; + } else { + // Backpacks need special command to be removed + if (_isUnique && {_item in ((uiNamespace getVariable QGVAR(configItems)) get IDX_VIRT_BACKPACK)}) then { + [backpackContainer GVAR(center), _item, [1, 5] select GVAR(shiftState)] call CBA_fnc_removeBackpackCargo; } else { - for "_count" from 1 to ([1, 5] select (GVAR(shiftState))) do { + for "_i" from 1 to ([1, 5] select GVAR(shiftState)) do { GVAR(center) removeItemFromBackpack _item; }; }; + }; - _load = loadBackpack GVAR(center); - _maxLoad = backpack GVAR(center); - _items = backpackItems GVAR(center); - GVAR(currentItems) set [17,_items]; + // Get all items from container (excluding container itself) + _containerItems = [GVAR(center), 0, 0, 0, 3, false] call EFUNC(common,uniqueUnitItems); + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, ((getUnitLoadout GVAR(center)) select IDX_LOADOUT_BACKPACK) param [1, []]]; + + // Update load bar + (_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadBackpack GVAR(center)); + + backpackContainer GVAR(center) }; }; -// Update progress bar status, weight info -private _loadIndicatorBarCtrl = _display displayCtrl IDC_loadIndicatorBar; -_loadIndicatorBarCtrl progressSetPosition _load; - -private _value = {_x == _item} count _items; -_ctrlList lnbSetText [[_lnbCurSel, 2],str _value]; +// Find out how many items of that type there are and update the number displayed +_ctrlList lnbSetText [[_lnbCurSel, 2], str (_containerItems getOrDefault [_item, 0])]; [QGVAR(cargoChanged), [_display, _item, _addOrRemove, GVAR(shiftState)]] call CBA_fnc_localEvent; -[_ctrlList, _maxLoad] call FUNC(updateRightPanel); +// Refresh availibility of items based on space remaining in container +[_ctrlList, _container, _containerItems isNotEqualTo []] call FUNC(updateRightPanel); diff --git a/addons/arsenal/functions/fnc_buttonClearAll.sqf b/addons/arsenal/functions/fnc_buttonClearAll.sqf index 8e1d70d6eb..dbcc00e33c 100644 --- a/addons/arsenal/functions/fnc_buttonClearAll.sqf +++ b/addons/arsenal/functions/fnc_buttonClearAll.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Clear the current container. * * Arguments: @@ -15,48 +15,56 @@ params ["_display"]; -// Clear container -switch (GVAR(currentLeftPanel)) do { +// Clear chosen container, reset currentItems for that container and get relevant container +private _container = switch (GVAR(currentLeftPanel)) do { + // Uniform case IDC_buttonUniform: { - {GVAR(center) removeItemFromUniform _x} foreach (uniformItems GVAR(center)); - GVAR(currentItems) set [15, []]; + private _container = uniformContainer GVAR(center); + + // Remove everything (backpacks need special command for this) + clearWeaponCargoGlobal _container; + clearMagazineCargoGlobal _container; + clearItemCargoGlobal _container; + clearBackpackCargoGlobal _container; + + GVAR(currentItems) set [IDX_CURR_UNIFORM_ITEMS, []]; + + _container }; + // Vest case IDC_buttonVest: { - {GVAR(center) removeItemFromVest _x} foreach (vestItems GVAR(center)); - GVAR(currentItems) set [16, []]; + private _container = vestContainer GVAR(center); + + // Remove everything (backpacks need special command for this) + clearWeaponCargoGlobal _container; + clearMagazineCargoGlobal _container; + clearItemCargoGlobal _container; + clearBackpackCargoGlobal _container; + + GVAR(currentItems) set [IDX_CURR_VEST_ITEMS, []]; + + _container }; + // Backpack case IDC_buttonBackpack: { - {GVAR(center) removeItemFromBackpack _x} foreach (backpackItems GVAR(center)); - GVAR(currentItems) set [17, []]; + // Remove everything + clearAllItemsFromBackpack GVAR(center); + + GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, []]; + + backpackContainer GVAR(center) }; }; // Clear number of owned items private _ctrlList = _display displayCtrl IDC_rightTabContentListnBox; -for "_l" from 0 to (lbSize _ctrlList - 1) do { - _ctrlList lnbSetText [[_l, 2], str 0]; +for "_lbIndex" from 0 to (lbSize _ctrlList) - 1 do { + _ctrlList lnbSetText [[_lbIndex, 2], "0"]; }; -private _removeAllCtrl = _display displayCtrl IDC_buttonRemoveAll; -_removeAllCtrl ctrlSetFade 1; -_removeAllCtrl ctrlCommit FADE_DELAY; - // Update load bar -private _loadIndicatorBarCtrl = _display displayCtrl IDC_loadIndicatorBar; -_loadIndicatorBarCtrl progressSetPosition 0; +(_display displayCtrl IDC_loadIndicatorBar) progressSetPosition 0; -private _maxLoad = switch (GVAR(currentLeftPanel)) do { - case IDC_buttonUniform: { - gettext (configfile >> "CfgWeapons" >> uniform GVAR(center) >> "ItemInfo" >> "containerClass") - }; - case IDC_buttonVest: { - gettext (configfile >> "CfgWeapons" >> vest GVAR(center) >> "ItemInfo" >> "containerClass") - }; - case IDC_buttonBackpack: { - backpack GVAR(center) - }; -}; - -private _control = _display displayCtrl IDC_rightTabContentListnBox; -[_control, _maxLoad] call FUNC(updateRightPanel); +// Refresh availibility of items based on space remaining in container +[_ctrlList, _container, false] call FUNC(updateRightPanel); diff --git a/addons/arsenal/functions/fnc_buttonExport.sqf b/addons/arsenal/functions/fnc_buttonExport.sqf index 86caf418e3..3e5039a504 100644 --- a/addons/arsenal/functions/fnc_buttonExport.sqf +++ b/addons/arsenal/functions/fnc_buttonExport.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Export current loadout / default loadouts list to clipboard. @@ -15,39 +15,41 @@ params ["_display"]; if (GVAR(shiftState)) then { - if (isNil QGVAR(defaultLoadoutsList) || {GVAR(defaultLoadoutsList) isEqualTo []}) exitWith { - [_display, localize LSTRING(exportDefaultError)] call FUNC(message); + [_display, LLSTRING(exportDefaultError)] call FUNC(message); }; + // Export default loadout list private _listLength = count GVAR(defaultLoadoutsList); - for "_index" from -1 to _listLength do { - switch true do { + for "_index" from -1 to _listLength do { + switch (true) do { + // Beginning case (_index == -1): { "ace_clipboard" callExtension (format ["[%1", endl]); }; - + // End case (_index == _listLength): { "ace_clipboard" callExtension "];"; }; - + // Rest default { - "ace_clipboard" callExtension ([" ",str (GVAR(defaultLoadoutsList) select _index), [",", ""] select (_index == _listLength - 1), endl] joinString ""); + "ace_clipboard" callExtension ([" ", str (GVAR(defaultLoadoutsList) select _index), [",", ""] select (_index == _listLength - 1), endl] joinString ""); }; }; }; "ace_clipboard" callExtension "--COMPLETE--"; - [_display, localize LSTRING(exportDefault)] call FUNC(message); + [_display, LLSTRING(exportDefault)] call FUNC(message); } else { + // Export singular loadout + private _export = str (GVAR(center) call CBA_fnc_getLoadout); - private _export = str getUnitLoadout GVAR(center); "ace_clipboard" callExtension (_export + ";"); "ace_clipboard" callExtension "--COMPLETE--"; - [_display, localize LSTRING(exportCurrent)] call FUNC(message); + [_display, LLSTRING(exportCurrent)] call FUNC(message); }; [QGVAR(loadoutExported), [_display, GVAR(shiftState)]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonFavorites.sqf b/addons/arsenal/functions/fnc_buttonFavorites.sqf new file mode 100644 index 0000000000..1c7c7cd53f --- /dev/null +++ b/addons/arsenal/functions/fnc_buttonFavorites.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: LinkIsGrim + * Switches the arsenal between displaying all items and favorites + * + * Arguments: + * 0: Arsenal display + * 1: Button control + * + * Return Value: + * None + * + * Public: No +*/ + +params ["_display", "_control"]; + +private _firstRun = false; + +if (isNil QGVAR(favoritesOnly)) then { + GVAR(favoritesOnly) = GVAR(defaultToFavorites); + _firstRun = true; +} else { + GVAR(favoritesOnly) = !GVAR(favoritesOnly); +}; + +_control ctrlSetText format ["%1: %2", localize "STR_GEAR_ITEMS", localize (["str_word_all", "STR_3DEN_Favorite_textPlural"] select GVAR(favoritesOnly))]; + +if (_firstRun) exitWith {}; + +[false] call FUNC(refresh); diff --git a/addons/arsenal/functions/fnc_buttonHide.sqf b/addons/arsenal/functions/fnc_buttonHide.sqf index 23e4f7d081..6b6c84da93 100644 --- a/addons/arsenal/functions/fnc_buttonHide.sqf +++ b/addons/arsenal/functions/fnc_buttonHide.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -16,12 +16,13 @@ params ["_display"]; private _showToggle = !ctrlShown (_display displayCtrl IDC_menuBar); +private _ctrl = controlNull; { - private _ctrl = _display displayctrl _x; - _ctrl ctrlshow _showToggle; - _ctrl ctrlcommit 0.15; -} foreach [ + _ctrl = _display displayCtrl _x; + _ctrl ctrlShow _showToggle; + _ctrl ctrlCommit FADE_DELAY; +} forEach [ IDC_blockLeftFrame, IDC_blockLeftBackground, IDC_blockRightFrame, @@ -35,6 +36,8 @@ private _showToggle = !ctrlShown (_display displayCtrl IDC_menuBar); IDC_rightTabContentListnBox, IDC_sortLeftTab, IDC_sortRightTab, + IDC_sortLeftTabDirection, + IDC_sortRightTabDirection, IDC_leftSearchbarButton, IDC_rightSearchbarButton, IDC_leftSearchbar, @@ -49,11 +52,10 @@ private _showToggle = !ctrlShown (_display displayCtrl IDC_menuBar); IDC_buttonCurrentMag2, IDC_iconBackgroundCurrentMag, IDC_iconBackgroundCurrentMag2, - IDC_statsButton, IDC_statsPreviousPage, IDC_statsNextPage, - IDC_statsCurrentPage, - IDC_statsButtonClose + IDC_statsCurrentPage ]; [QGVAR(statsToggle), [_display, _showToggle]] call CBA_fnc_localEvent; +[QGVAR(actionsToggle), [_display, _showToggle]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonImport.sqf b/addons/arsenal/functions/fnc_buttonImport.sqf index 3eefba41a4..8a83fe3ff0 100644 --- a/addons/arsenal/functions/fnc_buttonImport.sqf +++ b/addons/arsenal/functions/fnc_buttonImport.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Import loadout / default loadouts list from clipboard. * * Arguments: @@ -15,90 +15,69 @@ params ["_display"]; -private _data = call (compile copyFromClipboard); +// Can be either a singular loadout or an array of loadouts +private _extendedLoadout = call compile copyFromClipboard; -if (isNil "_data" || {!(_data isEqualType [])}) exitWith { - [_display, localize LSTRING(importFormatError)] call FUNC(message); +// If error, exit +if (isNil "_extendedLoadout" || {!(_extendedLoadout isEqualType [])}) exitWith { + [_display, LLSTRING(importFormatError)] call FUNC(message); }; if (GVAR(shiftState) && {is3DEN}) then { - + // Supports CBA extended loadout or getUnitLoadout arrays { if ( - count _x == 2 && - {_x select 0 isEqualType ""} && - {_x select 0 != ""} && - {_x select 1 isEqualType []} && - {count (_x select 1) == 10} + count _x == 2 && + {(_x select 0) isEqualType ""} && + {(_x select 0) != ""} && + {(_x select 1) isEqualType []} && + {count (_x select 1) in [2, 10]} ) then { _x call FUNC(addDefaultLoadout); }; - } foreach _data; + } forEach _extendedLoadout; + + [_display, LLSTRING(importedDefault)] call FUNC(message); - [_display, localize LSTRING(importedDefault)] call FUNC(message); set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; - } else { - if (count _data == 10) then { - GVAR(center) setUnitLoadout _data; + // If _extendedLoadout is in getUnitLoadout array, change into CBA extended loadout array + if (count _extendedLoadout == 10) then { + _extendedLoadout = [_extendedLoadout, createHashMap]; + }; - GVAR(currentItems) = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", [], [], [], [], [], []]; - for "_index" from 0 to 15 do { - switch (_index) do { - case 0; - case 1; - case 2:{ - GVAR(currentItems) set [_index, ((LIST_DEFAULTS select 0) select _index)]; - }; - case 3; - case 4; - case 5; - case 6; - case 7; - case 8; - case 9: { - GVAR(currentItems) set [_index, (LIST_DEFAULTS select _index) select 0]; + // Check if CBA extended loadout array + if ((count _extendedLoadout) == 2) then { + [GVAR(center), _extendedLoadout] call CBA_fnc_setLoadout; - }; - case 10: { - {(GVAR(currentItems) select 15) pushBack _x} forEach (uniformItems GVAR(center)); - }; - case 11: { - {(GVAR(currentItems) select 16) pushBack _x} forEach (vestItems GVAR(center)); - }; - case 12: { - {(GVAR(currentItems) select 17) pushBack _x} forEach (backpackItems GVAR(center)); - }; - case 13: { - GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + (primaryWeaponMagazine GVAR(center))]; - }; - case 14: { - GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + (secondaryWeaponMagazine GVAR(center))]; - }; - case 15: { - GVAR(currentItems) set [20, (handgunItems GVAR(center)) + (handgunMagazine GVAR(center))]; - }; - }; - }; + // Update current item list and unique items + [true] call FUNC(refresh); - - { - private _simulationType = getText (configFile >> "CfgWeapons" >> _x >> "simulation"); - private _index = 10 + (["itemmap", "itemcompass", "itemradio", "itemwatch", "itemgps"] find (tolower _simulationType)); - - GVAR(currentItems) set [_index, _x]; - } foreach (assignedItems GVAR(center)); - - call FUNC(updateUniqueItemsList); + _extendedLoadout params ["_loadout", "_extendedInfo"]; // Reapply insignia - [GVAR(center), ""] call bis_fnc_setUnitInsignia; - [GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; + if (QGVAR(insignia) in _extendedInfo) then { + GVAR(currentInsignia) = _extendedInfo getOrDefault [QGVAR(insignia), ""]; + } else { + [GVAR(center), ""] call BIS_fnc_setUnitInsignia; + [GVAR(center), GVAR(currentInsignia)] call BIS_fnc_setUnitInsignia; + }; + // Save face + if (QGVAR(face) in _extendedInfo) then { + GVAR(currentFace) = _extendedInfo getOrDefault [QGVAR(face), GVAR(currentFace)]; + }; + + // Save voice + if (QGVAR(voice) in _extendedInfo) then { + GVAR(currentVoice) = _extendedInfo getOrDefault [QGVAR(voice), GVAR(currentVoice)]; + }; + + // Fill left panel [_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); - [_display, localize LSTRING(importedCurrent)] call FUNC(message); + [_display, LLSTRING(importedCurrent)] call FUNC(message); }; }; -[QGVAR(loadoutImported), [_display, (GVAR(shiftState) && {is3DEN})]] call CBA_fnc_localEvent; +[QGVAR(loadoutImported), [_display, GVAR(shiftState) && {is3DEN}]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf index 7ca972fde2..20f0f8b3da 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Delete / unshare loadout currently selected. * * Arguments: @@ -22,35 +22,37 @@ private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; private _contentPanelCursSel = lnbCurSelRow _contentPanelCtrl; private _loadoutName = _contentPanelCtrl lnbText [_contentPanelCursSel, 1]; +// If loadout is local or default if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { - - if (is3DEN && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}) then { - GVAR(defaultLoadoutsList) deleteAt (GVAR(defaultLoadoutsList) find ((GVAR(defaultLoadoutsList) select {_x select 0 == _loadoutName}) select 0)); - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; + // Find loadout and delete from list + if (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts) then { + [_loadoutName, !is3DEN] call FUNC(removeDefaultLoadout); } else { - private _data = profileNamespace getVariable [QGVAR(saved_loadouts), []]; - _data deleteAt (_data find ((_data select {_x select 0 == _loadoutName}) select 0)); + private _data = profileNamespace getVariable [QGVAR(saved_loadouts), []]; + + _data deleteAt (_data findIf {(_x select 0) == _loadoutName}); }; _contentPanelCtrl setVariable [_loadoutName + str GVAR(currentLoadoutsTab), nil]; _contentPanelCtrl lnbDeleteRow _contentPanelCursSel; - _contentPanelCtrl lnbSetCurSelRow (_contentPanelCursSel); + _contentPanelCtrl lnbSetCurSelRow _contentPanelCursSel; + + [findDisplay IDD_ace_arsenal, [LLSTRING(loadoutDeleted), _loadoutName] joinString " "] call FUNC(message); - [(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutDeleted), _loadoutName] joinString " "] call FUNC(message); [QGVAR(onLoadoutDelete), [_loadoutName]] call CBA_fnc_localEvent; } else { - + // If loadout is shared private _profileName = profileName; // GVAR(center) could be a remote unit private _loadoutVar = _profileName + _loadoutName; - private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars); + private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable [QGVAR(sharedLoadoutsVars), []]; GVAR(sharedLoadoutsNamespace) setVariable [_loadoutVar, nil, true]; GVAR(sharedLoadoutsNamespace) setVariable [QGVAR(sharedLoadoutsVars), _sharedLoadoutsVars - [_loadoutVar], true]; _contentPanelCtrl lnbDeleteRow _contentPanelCursSel; - _contentPanelCtrl lnbSetCurSelRow (_contentPanelCursSel); + _contentPanelCtrl lnbSetCurSelRow _contentPanelCursSel; - [QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent; + [findDisplay IDD_ace_arsenal, [LLSTRING(loadoutUnshared), _loadoutName] joinString " "] call FUNC(message); - [(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutUnshared), _loadoutName] joinString " "] call FUNC(message); + [QGVAR(loadoutUnshared), [_contentPanelCtrl, _profileName, _loadoutName]] call CBA_fnc_remoteEvent; }; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf index 0a2faccc54..120a50ae9c 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Load selected loadout. * * Arguments: @@ -22,78 +22,45 @@ private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; private _curSel = lnbCurSelRow _contentPanelCtrl; private _loadoutName = _contentPanelCtrl lnbText [_curSel, 1]; -private _loadout = switch GVAR(currentLoadoutsTab) do { - +private _extendedLoadout = switch (GVAR(currentLoadoutsTab)) do { + // Local and default loadouts case IDC_buttonMyLoadouts; - case IDC_buttonDefaultLoadouts:{ + case IDC_buttonDefaultLoadouts: { (_contentPanelCtrl getVariable _loadoutName + str GVAR(currentLoadoutsTab)) select 0 }; - - case IDC_buttonSharedLoadouts:{ + // Shared loadouts + case IDC_buttonSharedLoadouts: { (GVAR(sharedLoadoutsNamespace) getVariable ((_contentPanelCtrl lnbText [_curSel, 0]) + (_contentPanelCtrl lnbText [_curSel, 1]))) select 2 }; }; -GVAR(center) setUnitLoadout [_loadout, true]; +// Apply loadout to unit +[GVAR(center), _extendedLoadout, true] call CBA_fnc_setLoadout; -GVAR(currentItems) = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", [], [], [], [], [], []]; -for "_index" from 0 to 15 do { - switch (_index) do { - case 0; - case 1; - case 2:{ - GVAR(currentItems) set [_index, ((LIST_DEFAULTS select 0) select _index)]; - }; - case 3; - case 4; - case 5; - case 6; - case 7; - case 8; - case 9: { - GVAR(currentItems) set [_index, (LIST_DEFAULTS select _index) select 0]; +// Update current item list and unique items +[true] call FUNC(refresh); - }; - case 10: { - {(GVAR(currentItems) select 15) pushBack _x} forEach (uniformItems GVAR(center)); - }; - case 11: { - {(GVAR(currentItems) select 16) pushBack _x} forEach (vestItems GVAR(center)); - }; - case 12: { - {(GVAR(currentItems) select 17) pushBack _x} forEach (backpackItems GVAR(center)); - }; - case 13: { - GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + (primaryWeaponMagazine GVAR(center))]; - }; - case 14: { - GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + (secondaryWeaponMagazine GVAR(center))]; - }; - case 15: { - GVAR(currentItems) set [20, (handgunItems GVAR(center)) + (handgunMagazine GVAR(center))]; - }; - }; -}; -{ - private _simulationType = getText (configFile >> "CfgWeapons" >> _x >> "simulation"); - - if (_simulationType != "NVGoggles") then { - if (_simulationType == "ItemGps" || _simulationType == "Weapon") then { - GVAR(currentItems) set [14, _x]; - } else { - - private _index = 10 + (["itemmap", "itemcompass", "itemradio", "itemwatch"] find (tolower _simulationType)); - GVAR(currentItems) set [_index, _x]; - }; - }; -} forEach (assignedItems GVAR(center)); - -call FUNC(updateUniqueItemsList); +_extendedLoadout params ["_loadout", "_extendedInfo"]; // Reapply insignia -[GVAR(center), ""] call bis_fnc_setUnitInsignia; -[GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; +if (QGVAR(insignia) in _extendedInfo) then { + GVAR(currentInsignia) = _extendedInfo getOrDefault [QGVAR(insignia), ""]; +} else { + [GVAR(center), ""] call BIS_fnc_setUnitInsignia; + [GVAR(center), GVAR(currentInsignia)] call BIS_fnc_setUnitInsignia; +}; -[(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutLoaded), _loadoutName] joinString " "] call FUNC(message); +// Update current face if necessary +if (QGVAR(face) in _extendedInfo) then { + GVAR(currentFace) = _extendedInfo getOrDefault [QGVAR(face), GVAR(currentFace)]; +}; + +// Update voice face if necessary +if (QGVAR(voice) in _extendedInfo) then { + GVAR(currentVoice) = _extendedInfo getOrDefault [QGVAR(voice), GVAR(currentVoice)]; +}; + +[findDisplay IDD_ace_arsenal, [LLSTRING(loadoutLoaded), _loadoutName] joinString " "] call FUNC(message); [QGVAR(onLoadoutLoad), [_loadout, _loadoutName]] call CBA_fnc_localEvent; +[QGVAR(onLoadoutLoadExtended), [_extendedLoadout, _loadoutName]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf index a1f9294669..87191a99c2 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Rename selected loadout. * * Arguments: @@ -23,48 +23,49 @@ private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; private _curSelRow = lnbCurSelRow _contentPanelCtrl; private _loadoutName = _contentPanelCtrl lnbText [_curSelRow, 1]; -private _editBoxCtrl = _display displayCtrl IDC_textEditBox; -private _editBoxContent = ctrlText _editBoxCtrl; +// Get text from text edit box +private _editBoxContent = ctrlText (_display displayCtrl IDC_textEditBox); -private _data = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts && {is3DEN}); -private _similarLoadouts = _data select {_x select 0 == _editBoxContent}; +// If it's the exact same name, don't do anything +if (_editBoxContent isEqualTo _loadoutName) exitWith {}; -if (count _similarLoadouts > 0) exitWith { - [(findDisplay IDD_ace_arsenal), localize LSTRING(renameExistError)] call FUNC(message); +private _data = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (call FUNC(canEditDefaultLoadout) && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}); + +// If there is a loadout with a similar name and it's not chosen to be renamed, don't rename and exit +if (_editBoxContent != _loadoutName && {_data findIf {(_x select 0) == _editBoxContent} != -1}) exitWith { + [findDisplay IDD_ace_arsenal, LLSTRING(renameExistError)] call FUNC(message); }; // Update loadout info in profile / 3DEN and list namespaces -private _loadoutToRename = (_data select {_x select 0 == _loadoutName}) select 0; -(_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; +private _loadoutIndex = _data findIf {(_x select 0) == _loadoutName}; -_data set [_data find _loadoutToRename, [_editBoxContent, (_loadoutToRename select 1)]]; -_contentPanelCtrl setVariable [_loadoutName + str GVAR(currentLoadoutsTab), nil]; -_contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_loadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]]; +// Set new name +(_data select _loadoutIndex) set [0, _editBoxContent]; -// Add new row -_contentPanelCtrl lnbDeleteRow _curSelRow; -private _newRow = _contentPanelCtrl lnbAddRow ["",_editBoxContent]; - -ADD_LOADOUTS_LIST_PICTURES - -if (_nullItemsAmount > 0) then { - - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; -} else { - - if (_unavailableItemsAmount > 0) then { - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; +if (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts) then { + if (is3DEN) then { + set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; + } else { + [QGVAR(renameDefaultLoadout), [_loadoutName, _editBoxContent]] call CBA_fnc_remoteEvent; }; }; -// Sort and select the current row +private _currentLoadoutsTab = str GVAR(currentLoadoutsTab); + +_contentPanelCtrl setVariable [_editBoxContent + _currentLoadoutsTab, _contentPanelCtrl getVariable [_loadoutName + _currentLoadoutsTab, []]]; +_contentPanelCtrl setVariable [_loadoutName + _currentLoadoutsTab, nil]; + +// Update the current row's loadout name +_contentPanelCtrl lnbSetText [[_curSelRow, 1], _editBoxContent]; + +// Sort loadouts alphabetically _contentPanelCtrl lnbSort [1, false]; -for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _editBoxContent) exitwith {_contentPanelCtrl lnbSetCurSelRow _i}; + +// Select the newly renamed loadout +for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _editBoxContent) exitWith { + _contentPanelCtrl lnbSetCurSelRow _lbIndex; + }; }; -if (is3DEN && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}) then { - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; -}; - -[(findDisplay IDD_ace_arsenal), [_loadoutName, localize LSTRING(loadoutRenamed) ,_editBoxContent] joinString " "] call FUNC(message); +[findDisplay IDD_ace_arsenal, [_loadoutName, LLSTRING(loadoutRenamed), _editBoxContent] joinString " "] call FUNC(message); diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf index 0827ec2c31..142a19c635 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Save selected loadout. * * Arguments: @@ -21,278 +21,161 @@ if !(ctrlEnabled _control) exitWith {}; private _editBoxCtrl = _display displayCtrl IDC_textEditBox; private _editBoxContent = ctrlText _editBoxCtrl; +// If no name given, throw error if (_editBoxContent == "") exitWith { - [(findDisplay IDD_ace_arsenal), localize LSTRING(saveEmptyNameBox)] call FUNC(message); + [findDisplay IDD_ace_arsenal, LLSTRING(saveEmptyNameBox)] call FUNC(message); }; -private _data = [+(profileNamespace getVariable [QGVAR(saved_loadouts),[]]), +(GVAR(defaultLoadoutsList))] select (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts && {is3DEN}); -private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; -private _cursSelRow = lnbCurSelRow _contentPanelCtrl; - -private _loadoutName = _contentPanelCtrl lnbText [_cursSelRow, 1]; -private _curSelLoadout = (_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) select 0; -private _loadout = getUnitLoadout GVAR(center); - -private _loadoutIndex = _data findIf {(_x select 0) == _editBoxContent}; -private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars); +// Get shared loadouts +private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable [QGVAR(sharedLoadoutsVars), []]; // Make sure the loadout isn't yours (public tab) or being shared (my loadouts tab) -private _similarSharedLoadout = (profileName + _editBoxContent) in _sharedLoadoutsVars; -if ((_contentPanelCtrl lnbText [_cursSelRow, 0]) == profileName) exitWith { - [(findDisplay IDD_ace_arsenal), localize LSTRING(saveAuthorError)] call FUNC(message); +if ((profileName + _editBoxContent) in _sharedLoadoutsVars) exitWith { + [findDisplay IDD_ace_arsenal, LLSTRING(saveSharedError)] call FUNC(message); }; -if (_similarSharedLoadout) exitWith { - [(findDisplay IDD_ace_arsenal), localize LSTRING(saveSharedError)] call FUNC(message); +private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; +private _curSelRow = lnbCurSelRow _contentPanelCtrl; + +if ((_contentPanelCtrl lnbText [_curSelRow, 0]) == profileName) exitWith { + [findDisplay IDD_ace_arsenal, LLSTRING(saveAuthorError)] call FUNC(message); }; -switch (GVAR(currentLoadoutsTab)) do { - case IDC_buttonMyLoadouts:{ +// Get currently selected loadout name & loadout +private _loadoutName = _contentPanelCtrl lnbText [_curSelRow, 1]; +private _curSelLoadout = (_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) select 0; - for "_dataIndex" from 0 to 10 do { - switch (_dataIndex) do { +// Get unit's current loadout +private _extendedLoadout = GVAR(center) call CBA_fnc_getLoadout; +_extendedLoadout params ["_loadout"]; - case 0; - case 1; - case 2; - case 8: { - if (count (_loadout select _dataIndex) > 0) then { +private _loadouts = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select ((call FUNC(canEditDefaultLoadout)) && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}); +private _loadoutIndex = _loadouts findIf {(_x select 0) == _editBoxContent}; - 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]; - }; - }; - }; - }; - }; - }; - - if (GVAR(shiftState) && {is3DEN} && {_loadoutName isNotEqualTo ""} && {_cursSelRow != -1} && {_loadoutIndex isNotEqualTo -1}) exitwith { +// Return what loadout was saved +private _savedLoadout = switch (GVAR(currentLoadoutsTab)) do { + // Local loadouts tab + case IDC_buttonMyLoadouts: { + // If saved to default loadout + if (GVAR(shiftState) && FUNC(canEditDefaultLoadout) && {_loadoutName != ""} && {_curSelRow != -1} && {_loadoutIndex != -1}) then { 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]]; + + [_loadoutName, _curSelLoadout, !is3DEN] call FUNC(addDefaultLoadout); + + if (_defaultLoadoutsSearch == -1) then { + _loadoutIndex = (count GVAR(defaultLoadoutsList)) - 1; }; - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; - }; - if (_loadoutIndex isEqualto -1) then { - _data pushBack [_editBoxContent, _loadout]; + _curSelLoadout } else { - _data set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _loadout]]; - }; + // Replace unique items with their bases and replace weapons with their base weapons + _loadout = [_loadout] call FUNC(replaceUniqueItemsLoadout); - // Delete "old" loadout row - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _editBoxContent) exitwith {_contentPanelCtrl lnbDeleteRow _i}; - }; + private _data = profileNamespace getVariable [QGVAR(saved_loadouts), []]; - private _newRow = _contentPanelCtrl lnbAddRow ["",_editBoxContent]; + // Add or overwrite loadout in loadout storage + if (_loadoutIndex == -1) then { + _loadoutIndex = _data pushBack [_editBoxContent, _extendedLoadout]; + } else { + _data set [_loadoutIndex, [_editBoxContent, _extendedLoadout]]; + }; - ADD_LOADOUTS_LIST_PICTURES - - _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_loadout] call FUNC(verifyLoadout)]; - - _contentPanelCtrl lnbSort [1, false]; - - // Select newly saved loadout - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _editBoxContent) exitwith {_contentPanelCtrl lnbSetCurSelRow _i}; - }; - - profileNamespace setVariable [QGVAR(saved_loadouts), _data]; - }; - - case IDC_buttonDefaultLoadouts:{ - - if (is3DEN) then { - - private _loadoutIndex = _data findIf {(_x select 0) == _editBoxContent}; - - 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]; - }; - }; - }; - }; + // Refresh loadout list; Delete previous loadout row + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _editBoxContent) exitWith { + _contentPanelCtrl lnbDeleteRow _lbIndex; }; }; - if (_loadoutIndex == -1) then { - GVAR(defaultLoadoutsList) pushBack [_editBoxContent, _loadout]; - } else { - GVAR(defaultLoadoutsList) set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _loadout]]; - }; - - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _editBoxContent) exitwith {_contentPanelCtrl lnbDeleteRow _i}; - }; - - private _newRow = _contentPanelCtrl lnbAddRow ["",_editBoxContent]; + private _newRow = _contentPanelCtrl lnbAddRow ["", _editBoxContent]; + private _cfgWeapons = configFile >> "CfgWeapons"; ADD_LOADOUTS_LIST_PICTURES - _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_loadout] call FUNC(verifyLoadout)]; + _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_extendedLoadout] call FUNC(verifyLoadout)]; + // Sort loadouts alphabetically _contentPanelCtrl lnbSort [1, false]; // Select newly saved loadout - for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { - if ((_contentPanelCtrl lnbText [_i, 1]) == _editBoxContent) exitwith {_contentPanelCtrl lnbSetCurSelRow _i}; + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _editBoxContent) exitWith { + _contentPanelCtrl lnbSetCurSelRow _lbIndex; + }; }; - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; - } else { + _extendedLoadout + }; + }; + // Default loadouts tab + case IDC_buttonDefaultLoadouts: { + if (call FUNC(canEditDefaultLoadout)) then { + [_editBoxContent, _extendedLoadout, !is3DEN] call FUNC(addDefaultLoadout); + + // Get loadout index if (_loadoutIndex == -1) then { - _data pushBack [_editBoxContent, _curSelLoadout]; + _loadoutIndex = (count GVAR(defaultLoadoutsList)) - 1; + }; + + // Refresh loadout list; Delete previous loadout row + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _editBoxContent) exitWith { + _contentPanelCtrl lnbDeleteRow _lbIndex; + }; + }; + + private _newRow = _contentPanelCtrl lnbAddRow ["", _editBoxContent]; + private _cfgWeapons = configFile >> "CfgWeapons"; + + ADD_LOADOUTS_LIST_PICTURES + + _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_extendedLoadout] call FUNC(verifyLoadout)]; + + // Sort loadouts alphabetically + _contentPanelCtrl lnbSort [1, false]; + + // Select newly saved loadout + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _editBoxContent) exitWith { + _contentPanelCtrl lnbSetCurSelRow _lbIndex; + }; + }; + + _extendedLoadout + } else { + private _data = profileNamespace getVariable [QGVAR(saved_loadouts), []]; + + // Add or overwrite loadout in loadout storage + if (_loadoutIndex == -1) then { + _loadoutIndex = _data pushBack [_editBoxContent, _curSelLoadout]; } else { - _data set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _curSelLoadout]]; + _data set [_loadoutIndex, [_editBoxContent, _curSelLoadout]]; _contentPanelCtrl setVariable [_editBoxContent + str IDC_buttonMyLoadouts, [_curSelLoadout] call FUNC(verifyLoadout)]; }; - profileNamespace setVariable [QGVAR(saved_loadouts), _data]; + _curSelLoadout }; }; + // Shared loadouts tab + case IDC_buttonSharedLoadouts: { + _loadout = (GVAR(sharedLoadoutsNamespace) getVariable ((_contentPanelCtrl lnbText [_curSelRow, 0]) + (_contentPanelCtrl lnbText [_curSelRow, 1]))) select 2; - case IDC_buttonSharedLoadouts :{ - - _loadout = (GVAR(sharedLoadoutsNamespace) getVariable ((_contentPanelCtrl lnbText [_cursSelRow, 0]) + (_contentPanelCtrl lnbText [_cursSelRow, 1]))) select 2; + private _data = profileNamespace getVariable [QGVAR(saved_loadouts), []]; + // Add or overwrite loadout in loadout storage if (_loadoutIndex == -1) then { - _data pushBack [_editBoxContent, _loadout]; + _loadoutIndex = _data pushBack [_editBoxContent, _loadout]; } else { - _data set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _loadout]]; + _data set [_loadoutIndex, [_editBoxContent, _loadout]]; _contentPanelCtrl setVariable [_editBoxContent + str IDC_buttonMyLoadouts, [_loadout] call FUNC(verifyLoadout)]; }; - profileNamespace setVariable [QGVAR(saved_loadouts), _data]; + _loadout }; }; -[(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutSaved), _editBoxContent] joinString " "] call FUNC(message); -private _savedLoadout = (_data select {_x select 0 == _editBoxContent}) select 0; -[QGVAR(onLoadoutSave), [_data find _savedLoadout, _savedLoadout]] call CBA_fnc_localEvent; + +[findDisplay IDD_ace_arsenal, [LLSTRING(loadoutSaved), _editBoxContent] joinString " "] call FUNC(message); + +[QGVAR(onLoadoutSave), [_loadoutIndex, _savedLoadout select 0]] call CBA_fnc_localEvent; +[QGVAR(onLoadoutSaveExtended), [_loadoutIndex, _savedLoadout]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsShare.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsShare.sqf index a9a1dd9d08..b31e2edad2 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsShare.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsShare.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Share selected loadout. * * Arguments: @@ -23,33 +23,33 @@ private _contentPanelCursSel = lnbCurSelRow _contentPanelCtrl; private _loadoutName = _contentPanelCtrl lnbText [_contentPanelCursSel, 1]; private _profileName = profileName; // GVAR(center) could be a remote unit private _loadoutVar = _profileName + _loadoutName; -private _sharedLoadoutsVars = +(GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars)); +private _sharedLoadoutsVars = +(GVAR(sharedLoadoutsNamespace) getVariable [QGVAR(sharedLoadoutsVars), []]); -private _loadoutIndex = _sharedLoadoutsVars find _loadoutVar; private _loadoutData = (_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) select 0; -// Loadout set to private -if (_loadoutIndex > -1) then { +if (_loadoutVar in _sharedLoadoutsVars) then { + // Loadout is shared, set to private GVAR(sharedLoadoutsNamespace) setVariable [_loadoutVar, nil, true]; GVAR(sharedLoadoutsNamespace) setVariable [QGVAR(sharedLoadoutsVars), _sharedLoadoutsVars - [_loadoutVar], true]; _contentPanelCtrl lnbSetPicture [[_contentPanelCursSel, 0], QPATHTOF(data\iconPublicBlank.paa)]; _contentPanelCtrl lnbSetValue [[_contentPanelCursSel, 0], 0]; - [QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent; -// Loadout set to public + [QGVAR(loadoutUnshared), [_contentPanelCtrl, _profileName, _loadoutName]] call CBA_fnc_remoteEvent; } else { - GVAR(sharedLoadoutsNamespace) setVariable [_loadoutVar, [_profileName ,_loadoutName , _loadoutData], true]; + // Loadout is private, set to shared + GVAR(sharedLoadoutsNamespace) setVariable [_loadoutVar, [_profileName, _loadoutName, _loadoutData], true]; _sharedLoadoutsVars pushBackUnique _loadoutVar; GVAR(sharedLoadoutsNamespace) setVariable [QGVAR(sharedLoadoutsVars), _sharedLoadoutsVars, true]; _contentPanelCtrl lnbSetPicture [[_contentPanelCursSel, 0], QPATHTOF(data\iconPublic.paa)]; _contentPanelCtrl lnbSetValue [[_contentPanelCursSel, 0], 1]; - [QGVAR(loadoutShared), [_contentPanelCtrl, [_profileName ,_loadoutName , _loadoutData]]] call CBA_fnc_remoteEvent; + + [QGVAR(loadoutShared), [_contentPanelCtrl, [_profileName, _loadoutName, _loadoutData]]] call CBA_fnc_remoteEvent; }; // Update share button text -_control ctrlSetText ( [ - localize LSTRING(buttonSharePrivateText), - localize LSTRING(buttonSharePublicText) +_control ctrlSetText ([ + LLSTRING(buttonSharePrivateText), + LLSTRING(buttonSharePublicText) ] select ((_contentPanelCtrl lnbValue [_contentPanelCursSel, 0]) == 1)); diff --git a/addons/arsenal/functions/fnc_buttonStats.sqf b/addons/arsenal/functions/fnc_buttonStats.sqf deleted file mode 100644 index 0eaac78a41..0000000000 --- a/addons/arsenal/functions/fnc_buttonStats.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -#include "..\defines.hpp" -/* - * Author: Alganthe - * Toggle the stats control group - * - * Arguments: - * 0: Arsenal display - * 1: Button control - * - * Return Value: - * None - * - * Public: No -*/ - -params ["_display"]; - -(_display displayCtrl IDC_statsButton) ctrlShow GVAR(showStats); -GVAR(showStats) = !GVAR(showStats); - -{ - (_display displayCtrl _x) ctrlShow GVAR(showStats); -} foreach [ - IDC_statsBox, - IDC_statsPreviousPage, - IDC_statsNextPage, - IDC_statsCurrentPage, - IDC_statsButtonClose -]; - diff --git a/addons/arsenal/functions/fnc_buttonStatsPage.sqf b/addons/arsenal/functions/fnc_buttonStatsPage.sqf index 48c9b4715e..bef2631f8c 100644 --- a/addons/arsenal/functions/fnc_buttonStatsPage.sqf +++ b/addons/arsenal/functions/fnc_buttonStatsPage.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe - * Handles the previous / next page buttons for stats + * Handles the previous / next page buttons for stats. * * Arguments: * 0: Arsenal display - * 1: Previous or next (false = previous, true = next) + * 1: Stats page + * 2: Previous (false) or next (true) page * * Return Value: * None @@ -19,11 +20,8 @@ params ["_display", "_control", "_nextPage"]; TRACE_1("control enabled", ctrlEnabled _control); if !(ctrlEnabled _control) exitWith {}; -GVAR(statsInfo) params ["_isLeftPanel", "_statsIndex", "_panelControl", "_curSel", "_itemCfg"]; +GVAR(currentStatPage) = [GVAR(currentStatPage) - 1, GVAR(currentStatPage) + 1] select _nextPage; -private _pageList = [GVAR(statsPagesRight), GVAR(statsPagesLeft)] select (_isLeftPanel); -private _newPageNumber = [(_pageList select _statsIndex) - 1, (_pageList select _statsIndex) + 1] select _nextPage; - -_pageList set [_statsIndex, _newPageNumber]; +GVAR(statsInfo) params ["_isLeftPanel", "_panelControl", "_curSel", "_itemCfg"]; [QGVAR(displayStats), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_canEditDefaultLoadout.sqf b/addons/arsenal/functions/fnc_canEditDefaultLoadout.sqf new file mode 100644 index 0000000000..c9258b9f42 --- /dev/null +++ b/addons/arsenal/functions/fnc_canEditDefaultLoadout.sqf @@ -0,0 +1,16 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: LinkIsGrim + * Whether the player can save a default loadout in the current mission state + * + * Arguments: + * None + * + * Return Value: + * Can Save + * + * Public: No +*/ + +is3DEN || EFUNC(common,hasZeusAccess) diff --git a/addons/arsenal/functions/fnc_clearSearchbar.sqf b/addons/arsenal/functions/fnc_clearSearchbar.sqf index a6b7b534dc..6595397e66 100644 --- a/addons/arsenal/functions/fnc_clearSearchbar.sqf +++ b/addons/arsenal/functions/fnc_clearSearchbar.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -7,7 +7,7 @@ * Arguments: * 0: Arsenal display * 1: Searchbar control - * 2: Right button state + * 2: Mouse button * * Return Value: * None @@ -15,11 +15,11 @@ * Public: No */ -params ["_display", "_control", "_rightButton"]; +params ["_display", "_control", "_buttonPressed"]; -if (_rightButton != 1) exitWith {}; +if (_buttonPressed != 1) exitWith {}; -_control ctrlSetText ''; +_control ctrlSetText ""; if (ctrlIDC _control == IDC_leftSearchbar) then { [_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); diff --git a/addons/arsenal/functions/fnc_compileActions.sqf b/addons/arsenal/functions/fnc_compileActions.sqf new file mode 100644 index 0000000000..6eda62ac65 --- /dev/null +++ b/addons/arsenal/functions/fnc_compileActions.sqf @@ -0,0 +1,107 @@ +#include "..\script_component.hpp" +/* + * Author: Brett Mayson + * Create the internal actions arrays when needed for the first time. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No +*/ + +if (!isNil QGVAR(actionList)) exitWith {}; + +private _actionList = [ + [], // Primary 0 + [], // Handgun 1 + [], // Launcher 2 + [], // Uniform 3 + [], // Vests 4 + [], // Backpacks 5 + [], // Headgear 6 + [], // Goggles 7 + [], // NVGs 8 + [], // Binoculars 9 + [], // Map 10 + [], // GPS 11 + [], // Radio 12 + [], // Compass 13 + [], // Watch 14 + [], // Face 15 + [], // Voice 16 + [] // Insignia 17 +]; + +private _configGroupEntries = "true" configClasses (configFile >> QGVAR(actions)); + +{ + private _scopeEditor = getNumber (_x >> "scopeEditor"); + + if (is3DEN && {_scopeEditor != 2}) then {continue}; + + private _configActions = "true" configClasses _x; + + private _rootClass = configName _x; + private _rootDisplayName = getText (_x >> "displayName"); + private _rootCondition = getText (_x >> "condition"); + private _rootTabs = getArray (_x >> "tabs"); + + if (_rootCondition != "") then { + _rootCondition = compile _rootCondition; + } else { + _rootCondition = {true}; + }; + + private _group = []; + + { + private _class = configName _x; + private _label = getText (_x >> "label"); + private _condition = getText (_x >> "condition"); + private _statement = getText (_x >> "statement"); + private _text = getText (_x >> "text"); + private _textStatement = getText (_x >> "textStatement"); + + private _type = switch (false) do { + case (_text == ""): { + _statement = format ["""%1""", _text]; + ACTION_TYPE_TEXT + }; + case (_textStatement == ""): { + _statement = _textStatement; + ACTION_TYPE_TEXT + }; + case (_statement == ""): { + _statement = _statement; + ACTION_TYPE_BUTTON + }; + default { + -1 + }; + }; + + if (_type == -1) then { + continue; + }; + + _statement = compile format [QUOTE([GVAR(center)] call {%1}), _statement]; + + if (_condition != "") then { + _condition = compile _condition; + } else { + _condition = {true}; + }; + + // No duplicates are possible here + _group pushBack [_class, _type, _label, _statement, _condition]; + } forEach _configActions; + + { + (_actionList select _x) pushBack [_rootClass, _rootDisplayName, _rootCondition, _group]; + } forEach _rootTabs; +} forEach _configGroupEntries; + +GVAR(actionList) = _actionList; diff --git a/addons/arsenal/functions/fnc_compileSorts.sqf b/addons/arsenal/functions/fnc_compileSorts.sqf index 71f9885c09..0a1f7b781f 100644 --- a/addons/arsenal/functions/fnc_compileSorts.sqf +++ b/addons/arsenal/functions/fnc_compileSorts.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brett Mayson - * Create the internal stats arrays when needed for the first time + * Author: Brett Mayson, johnb43 + * Create the internal sort arrays when needed for the first time. * * Arguments: * None @@ -15,11 +15,19 @@ if (!isNil QGVAR(sortListLeftPanel)) exitWith {}; private _fnc_addToTabs = { - params ["_tabsList", "_tabsToAddTo", "_sideString"]; + params ["_tabsList", "_tabsToAddTo", "_tabSide"]; + + private _sort = []; + { - private _arrayToSave = +_finalArray; - _arrayToSave set [0, [_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""]; - (_tabsList select _x) pushBack _arrayToSave; + // Copy title, statement and condition + _sort = +_finalArray; + + // Make sort name + _sort set [0, [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""]; + + // No duplicates are possible here + (_tabsList select _x) pushBack _sort; } forEach _tabsToAddTo; }; @@ -55,16 +63,17 @@ private _sortListRightPanel = [ [] // Misc 7 ]; -//------------------------- Config handling -private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (configFile >> QGVAR(sorts)); +private _class = ""; +private _displayName = ""; +private _statement = ""; +private _condition = ""; +private _finalArray = []; { - private _finalArray = []; - - private _class = configName _x; - private _displayName = getText (_x >> "displayName"); - private _statement = getText (_x >> "statement"); - private _condition = getText (_x >> "condition"); + _class = configName _x; + _displayName = getText (_x >> "displayName"); + _statement = getText (_x >> "statement"); + _condition = getText (_x >> "condition"); (getArray (_x >> "tabs")) params ["_leftTabsList", "_rightTabsList"]; if (_statement != "") then { @@ -84,7 +93,7 @@ private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (confi if (_rightTabsList isNotEqualTo []) then { [_sortListRightPanel, _rightTabsList, "R"] call _fnc_addToTabs; }; -} foreach _configEntries; +} forEach ("(getNumber (_x >> 'scope')) == 2" configClasses (configFile >> QGVAR(sorts))); -missionNamespace setVariable [QGVAR(sortListLeftPanel), _sortListLeftPanel]; -missionNamespace setVariable [QGVAR(sortListRightPanel), _sortListRightPanel]; +GVAR(sortListLeftPanel) = _sortListLeftPanel; +GVAR(sortListRightPanel) = _sortListRightPanel; diff --git a/addons/arsenal/functions/fnc_compileStats.sqf b/addons/arsenal/functions/fnc_compileStats.sqf index 40c9d7cfa5..ef8cba2f40 100644 --- a/addons/arsenal/functions/fnc_compileStats.sqf +++ b/addons/arsenal/functions/fnc_compileStats.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Alganthe - * Create the internal stats arrays when needed for the first time + * Author: Alganthe, johnb43 + * Create the internal stat arrays when needed for the first time. * * Arguments: * None @@ -15,121 +15,106 @@ if (!isNil QGVAR(statsListLeftPanel)) exitWith {}; private _fnc_addToTabs = { - params ["_tabsList", "_tabsToAddTo", "_sideString"]; + params ["_tabsList", "_tabsToAddTo", "_tabSide"]; + + private _stat = []; + + // First gather all stats for a tab { - private _currentTab = _tabsList select _x; - private _availablePagesCount = {count _x < 5} count _currentTab; + // Make stat name + _stat = +_finalArray; + _stat set [5, [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""]; - private _arrayToSave = +_finalArray; - _arrayToSave set [0, ([_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString "")]; - - if (_availablePagesCount > 0) then { - - { - if (count _x < 5) exitWith { - (_currentTab select _forEachIndex) append [_arrayToSave]; - }; - } foreach _currentTab; - } else { - _currentTab pushBack [_arrayToSave]; - }; - } foreach _tabsToAddTo; + (_tabsList select _x) pushBack _stat; + } forEach _tabsToAddTo; }; +// Sort by priority private _fnc_sortLists = { - params ["_tabsList"]; + params ["_tabs"]; { - private _page = _x; - { - { - reverse _x; - } foreach _x; - - _x sort false; - - { - reverse _x; - } foreach _x; - } foreach _page; - } foreach _tabsList; + // Sort numerically + _x sort false; + } forEach _tabs; }; private _statsListLeftPanel = [ - [[]], // Primary 0 - [[]], // Handgun 1 - [[]], // Launcher 2 - [[]], // Uniform 3 - [[]], // Vests 4 - [[]], // Backpacks 5 - [[]], // Headgear 6 - [[]], // Goggles 7 - [[]], // NVGs 8 - [[]], // Binoculars 9 - [[]], // Map 10 - [[]], // GPS 11 - [[]], // Radio 12 - [[]], // Compass 13 - [[]] // Watch 14 + [], // Primary 0 + [], // Handgun 1 + [], // Launcher 2 + [], // Uniform 3 + [], // Vests 4 + [], // Backpacks 5 + [], // Headgear 6 + [], // Goggles 7 + [], // NVGs 8 + [], // Binoculars 9 + [], // Map 10 + [], // GPS 11 + [], // Radio 12 + [], // Compass 13 + [] // Watch 14 ]; private _statsListRightPanel = [ - [[]], // Optics 0 - [[]], // Side accs 1 - [[]], // Muzzle 2 - [[]], // Bipod 3 - [[]], // Mag 4 - [[]], // Throw 5 - [[]], // Put 6 - [[]] // Misc 7 + [], // Optics 0 + [], // Side accs 1 + [], // Muzzle 2 + [], // Bipod 3 + [], // Mag 4 + [], // Throw 5 + [], // Put 6 + [] // Misc 7 ]; -//------------------------- Config handling -private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (configFile >> QGVAR(stats)); +private _finalArray = []; +private _class = ""; +private _stats = []; +private _displayName = ""; +private _showBar = false; +private _showText = false; +private _condition = ""; +private _priority = 0; { - private _finalArray = []; - - private _class = configName _x; - private _stats = getArray (_x >> "stats"); - private _displayName = getText (_x >> "displayName"); - private _showBar = getNumber (_x >> "showBar") == 1; - private _showText = getNumber (_x >> "showText") == 1; - private _condition = getText (_x >> "condition"); - private _priority = getNumber (_x >> "priority"); + _class = configName _x; + _stats = getArray (_x >> "stats"); + _displayName = getText (_x >> "displayName"); + _showBar = getNumber (_x >> "showBar") == 1; + _showText = getNumber (_x >> "showText") == 1; + _condition = getText (_x >> "condition"); + _priority = getNumber (_x >> "priority"); (getArray (_x >> "tabs")) params ["_leftTabsList", "_rightTabsList"]; if (_condition != "") then { _condition = compile _condition; }; - _finalArray = ["", _stats, _displayName, [_showBar, _showText], [{}, {}, _condition], _priority]; + _finalArray = [_priority, _stats, _displayName, [_showBar, _showText], [{}, {}, _condition], ""]; if (_showBar) then { - private _barStatement = compile (getText (_x >> "barStatement")); - (_finalArray select 4) set [0, _barStatement]; + (_finalArray select 4) set [0, compile (getText (_x >> "barStatement"))]; }; if (_showText) then { - private _textStatement = compile (getText (_x >> "textStatement")); - (_finalArray select 4) set [1, _textStatement]; + (_finalArray select 4) set [1, compile (getText (_x >> "textStatement"))]; }; TRACE_3("stats array", _finalArray, _leftTabsList, _rightTabsList); - if (count _leftTabsList > 0) then { + if (_leftTabsList isNotEqualTo []) then { [_statsListLeftPanel, _leftTabsList, "L"] call _fnc_addToTabs; }; - if (count _rightTabsList > 0) then { + if (_rightTabsList isNotEqualTo []) then { [_statsListRightPanel, _rightTabsList, "R"] call _fnc_addToTabs; }; -} foreach _configEntries; +} forEach ("(getNumber (_x >> 'scope')) == 2" configClasses (configFile >> "ace_arsenal_stats")); +// Sort [_statsListLeftPanel] call _fnc_sortLists; [_statsListRightPanel] call _fnc_sortLists; -//------------------------- Config Handling - -missionNamespace setVariable [QGVAR(statsListLeftPanel), _statsListLeftPanel]; -missionNamespace setVariable [QGVAR(statsListRightPanel), _statsListRightPanel]; +GVAR(statsListLeftPanel) = _statsListLeftPanel; +GVAR(statsListRightPanel) = _statsListRightPanel; diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf index b1212843a5..2889df51ae 100644 --- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf +++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe - * Fill left panel. + * Author: Alganthe, johnb43 + * Fills left panel. * * Arguments: * 0: Arsenal display @@ -16,19 +16,21 @@ params ["_display", "_control"]; -private _ctrlIDC = ctrlIDC _control; - +// Fade old control background if (!isNil QGVAR(currentLeftPanel)) then { private _previousCtrlBackground = _display displayCtrl (GVAR(currentLeftPanel) - 1); _previousCtrlBackground ctrlSetFade 1; _previousCtrlBackground ctrlCommit FADE_DELAY; }; +// Show new control background +private _ctrlIDC = ctrlIDC _control; private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1); -private _ctrlPanel = _display displayCtrl IDC_leftTabContent; _ctrlBackground ctrlSetFade 0; _ctrlBackground ctrlCommit FADE_DELAY; +private _ctrlPanel = _display displayCtrl IDC_leftTabContent; + // Force a "refresh" animation of the panel _ctrlPanel ctrlSetFade 1; _ctrlPanel ctrlCommit 0; @@ -38,168 +40,226 @@ _ctrlPanel ctrlCommit FADE_DELAY; _ctrlPanel lbSetCurSel -1; // Handle icons and filling -switch true do { - case (_ctrlIDC in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]) : { +private _selectedItem = switch (true) do { + // Primary weapons, secondary weapons, handgun weapons + case (_ctrlIDC in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]): { // Purge old data lbClear _ctrlPanel; - private _addEmpty = _ctrlPanel lbadd format [" <%1>",localize "str_empty"]; - _ctrlPanel lbsetvalue [_addEmpty, -1]; + + // Add "Empty" entry + private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"]; + _ctrlPanel lbSetValue [_addEmpty, -1]; + + // Add selected tab's weapons + private _index = [IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find _ctrlIDC; { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach ((GVAR(virtualItems) select IDX_VIRT_WEAPONS) select ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find _ctrlIDC)); + } forEach (keys ((GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _index)); + + GVAR(currentItems) select _index }; - - case (_ctrlIDC in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]) : { - + // Uniforms, vests, backpacks + case (_ctrlIDC in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]): { + // Purge old data lbClear _ctrlPanel; - private _addEmpty = _ctrlPanel lbadd format [" <%1>",localize "str_empty"]; - _ctrlPanel lbsetvalue [_addEmpty, -1]; - // Filling + // Add "Empty" entry + private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"]; + _ctrlPanel lbSetValue [_addEmpty, -1]; + switch (_ctrlIDC) do { - case IDC_buttonUniform : { + // Add uniforms + case IDC_buttonUniform: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select IDX_VIRT_UNIFORM); - }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIFORM)); - case IDC_buttonVest : { + GVAR(currentItems) select IDX_CURR_UNIFORM + }; + // Add vests + case IDC_buttonVest: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select IDX_VIRT_VEST); - }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_VEST)); - case IDC_buttonBackpack : { + GVAR(currentItems) select IDX_CURR_VEST + }; + // Add backpacks + case IDC_buttonBackpack: { { ["CfgVehicles", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select IDX_VIRT_BACKPACK); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_BACKPACK)); + + GVAR(currentItems) select IDX_CURR_BACKPACK }; }; }; - + // Other default { - GVAR(currentRightPanel) = nil; + // Don't reset right panel selection if left tab is binos + if (_ctrlIDC != IDC_buttonBinoculars) then { + GVAR(currentRightPanel) = nil; + }; lbClear _ctrlPanel; + // For every left tab except faces and voices, add "Empty" entry if !(_ctrlIDC in [IDC_buttonFace, IDC_buttonVoice]) then { - private _addEmpty = _ctrlPanel lbadd format [" <%1>",localize "str_empty"]; - _ctrlPanel lbsetvalue [_addEmpty, -1]; + private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"]; + _ctrlPanel lbSetValue [_addEmpty, -1]; }; switch (_ctrlIDC) do { + // Headgear case IDC_buttonHeadgear: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select IDX_VIRT_HEADGEAR); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_HEADGEAR)); + + GVAR(currentItems) select IDX_CURR_HEADGEAR }; - case IDC_buttonGoggles : { + // Facewear + case IDC_buttonGoggles: { { ["CfgGlasses", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select IDX_VIRT_GOGGLES); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_GOGGLES)); + + GVAR(currentItems) select IDX_CURR_GOGGLES }; - case IDC_buttonNVG : { + // NVGs + case IDC_buttonNVG: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 8); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_NVG)); + + GVAR(currentItems) select IDX_CURR_NVG }; - case IDC_buttonBinoculars : { + // Binoculars + case IDC_buttonBinoculars: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 9); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_BINO)); + + GVAR(currentItems) select IDX_CURR_BINO }; - case IDC_buttonMap : { + // Maps + case IDC_buttonMap: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 10); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_MAP)); + + GVAR(currentItems) select IDX_CURR_MAP }; - case IDC_buttonCompass : { + // Compasses + case IDC_buttonCompass: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 11); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_COMPASS)); + + GVAR(currentItems) select IDX_CURR_COMPASS }; - case IDC_buttonRadio : { + // Radios + case IDC_buttonRadio: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 12); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_RADIO)); + + GVAR(currentItems) select IDX_CURR_RADIO }; - case IDC_buttonWatch : { + // Watches + case IDC_buttonWatch: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 13); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_WATCH)); + + GVAR(currentItems) select IDX_CURR_WATCH }; - case IDC_buttonGPS : { + // GPS and UAV Terminals + case IDC_buttonGPS: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 14); + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_COMMS)); + + GVAR(currentItems) select IDX_CURR_COMMS }; - case IDC_buttonFace : { - { - { - if ( - getnumber (_x >> "disabled") == 0 && - {getText (_x >> "head") != ""} && - {configName _x != "Default"} - ) then { - private _configName = configName _x; - private _displayName = getText (_x >> "displayName"); - private _lbAdd = _ctrlPanel lbAdd _displayName; - _ctrlPanel lbSetData [_lbAdd, _configName]; - _ctrlPanel lbSetTooltip [_lbAdd,format ["%1\n%2",_displayName, _configName]]; - _x call ADDMODICON; - }; - } foreach ("true" configClasses _x); - } foreach ("true" configClasses (configfile >> "cfgfaces")); - }; - case IDC_buttonVoice : { - private _voices = (configProperties [(configFile >> "CfgVoice"), "isClass _x && {getNumber (_x >> 'scope') == 2}", true]) - [(configfile >> "CfgVoice" >> "NoVoice")]; - { - ["CfgVoice", configName _x, _ctrlPanel, "icon"] call FUNC(addListBoxItem); - } foreach _voices; - }; - case IDC_buttonInsignia : { - { - ["CfgUnitInsignia", configName _x, _ctrlPanel, "texture"] call FUNC(addListBoxItem); - } foreach ("true" configClasses (configFile >> "CfgUnitInsignia")); + // Faces + case IDC_buttonFace: { + private _lbAdd = -1; { - private _displayName = getText (_x >> "displayName"); - private _className = configName _x; - private _lbAdd = _ctrlPanel lbAdd _displayName; + _y params ["_displayName", "_modPicture"]; + + _lbAdd = _ctrlPanel lbAdd _displayName; + _ctrlPanel lbSetData [_lbAdd, _x]; + _ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _x]]; + _ctrlPanel lbSetPictureRight [_lbAdd, _modPicture]; + } forEach (uiNamespace getVariable QGVAR(faceCache)); + + GVAR(currentFace) + }; + // Voices + case IDC_buttonVoice: { + { + ["CfgVoice", _x, _ctrlPanel, "icon"] call FUNC(addListBoxItem); + } forEach (uiNamespace getVariable QGVAR(voiceCache)); + + GVAR(currentVoice) + }; + // Insignia + case IDC_buttonInsignia: { + // Insignia from config + { + ["CfgUnitInsignia", _x, _ctrlPanel, "texture"] call FUNC(addListBoxItem); + } forEach (uiNamespace getVariable QGVAR(insigniaCache)); + + private _displayName = ""; + private _className = ""; + private _lbAdd = -1; + + // Insignia from mission file + { + _className = configName _x; + _displayName = getText (_x >> "displayName"); + _lbAdd = _ctrlPanel lbAdd _displayName; _ctrlPanel lbSetData [_lbAdd, _className]; _ctrlPanel lbSetPicture [_lbAdd, getText (_x >> "texture")]; _ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]]; - } foreach ("true" configClasses (missionConfigFile >> "CfgUnitInsignia")); + } forEach ("(if (isNumber (_x >> 'scope')) then {getNumber (_x >> 'scope')} else {2}) == 2" configClasses (missionConfigFile >> "CfgUnitInsignia")); + + GVAR(currentInsignia) }; + // Unknown + default {""}; }; }; }; -// Done +// When switching tabs, clear searchbox if (GVAR(currentLeftPanel) != _ctrlIDC) then { (_display displayCtrl IDC_leftSearchbar) ctrlSetText ""; (_display displayCtrl IDC_rightSearchbar) ctrlSetText ""; }; +// Trigger event GVAR(currentLeftPanel) = _ctrlIDC; [QGVAR(leftPanelFilled), [_display, _ctrlIDC, GVAR(currentRightPanel)]] call CBA_fnc_localEvent; // Sort -private _sortLeftCtrl = _display displayCtrl IDC_sortLeftTab; -[_display, _control, _sortLeftCtrl] call FUNC(fillSort); +[_display, _control, _display displayCtrl IDC_sortLeftTab, _display displayCtrl IDC_sortLeftTabDirection] call FUNC(fillSort); -//Select current item -private _itemsToCheck = ((GVAR(currentItems) select [0,15]) + [GVAR(currentFace), GVAR(currentVoice), GVAR(currentInsignia)]) apply {tolower _x}; +// Try to select previously selected item again, otherwise select first item ("Empty") +if (_selectedItem != "") then { + private _index = 0; -for "_lbIndex" from 0 to (lbSize _ctrlPanel - 1) do { - private _currentData = _ctrlPanel lbData _lbIndex; - - if ((_currentData isNotEqualTo "") && {tolower _currentData in _itemsToCheck}) exitWith { - _ctrlPanel lbSetCurSel _lbIndex; + for "_lbIndex" from 0 to (lbSize _ctrlPanel) - 1 do { + if ((_ctrlPanel lbData _lbIndex) == _selectedItem) exitWith { + _index = _lbIndex; + }; }; -}; -if (lbCurSel _ctrlPanel < 0) then { + + _ctrlPanel lbSetCurSel _index; +} else { _ctrlPanel lbSetCurSel 0; }; diff --git a/addons/arsenal/functions/fnc_fillLoadoutsList.sqf b/addons/arsenal/functions/fnc_fillLoadoutsList.sqf index 433f0304df..7d5152dfdd 100644 --- a/addons/arsenal/functions/fnc_fillLoadoutsList.sqf +++ b/addons/arsenal/functions/fnc_fillLoadoutsList.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Fill loadouts list. * * Arguments: @@ -16,11 +16,9 @@ params ["_display", "_control"]; +(_display displayCtrl IDC_textEditBox) ctrlSetText ""; + private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; -private _textEditBoxCtrl= _display displayCtrl IDC_textEditBox; -_textEditBoxCtrl ctrlSetText ""; -private _sharingEnabled = (GVAR(allowSharedLoadouts) && {isMultiplayer}); -private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars); // Force a "refresh" animation of the panel _contentPanelCtrl ctrlSetFade 1; @@ -31,96 +29,107 @@ _contentPanelCtrl ctrlCommit FADE_DELAY; _contentPanelCtrl lnbSetCurSelRow -1; lnbClear _contentPanelCtrl; -private _data = +(profileNamespace getvariable [QGVAR(saved_loadouts),[]]); +private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars); +private _cfgWeapons = configFile >> "CfgWeapons"; +private _newRow = -1; if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { + private _loadoutNameAndTab = ""; + private _loadoutCachedInfo = ""; + private _sharingEnabled = GVAR(allowSharedLoadouts) && {isMultiplayer}; + // Add all loadouts to loadout list { _x params ["_loadoutName", "_loadoutData"]; - private _loadoutCachedInfo = _contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab)); + _loadoutNameAndTab = _loadoutName + str GVAR(currentLoadoutsTab); + _loadoutCachedInfo = _contentPanelCtrl getVariable _loadoutNameAndTab; + // If not in cache, get info and cache it if (isNil "_loadoutCachedInfo") then { - [_loadoutData] call FUNC(verifyLoadout) - } else { - _loadoutCachedInfo - } params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; + _loadoutCachedInfo = [_loadoutData] call FUNC(verifyLoadout); + _contentPanelCtrl setVariable [_loadoutNameAndTab, _loadoutCachedInfo]; - // Log missing / nil items to RPT - if (GVAR(EnableRPTLog) && {isNil "_loadoutCachedInfo"} && {(_nullItemsAmount > 0) || {_unavailableItemsAmount > 0}}) then { + _loadoutCachedInfo params ["", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; - private _printComponent = "ACE_Arsenal - Loadout:"; - private _printNullItemsList = ["Missing items:", str _nullItemsList] joinString " "; - private _printUnavailableItemsList = ["Unavailable items:", str _unavailableItemsList] joinString " "; + // Log missing / nil items to RPT (only once per arsenal session) + if (GVAR(EnableRPTLog) && {(_nullItemsAmount > 0) || {_unavailableItemsAmount > 0}}) then { + private _printComponent = "ACE_Arsenal - Loadout:"; + private _printNullItemsList = ["Missing items:", str _nullItemsList] joinString " "; + private _printUnavailableItemsList = ["Unavailable items:", str _unavailableItemsList] joinString " "; - diag_log text (format ["%1%5 %2%5 %3%5 %4", _printComponent, "Name: " + _loadoutName, _printNullItemsList, _printUnavailableItemsList, endl]); + diag_log text (format ["%1%5 %2%5 %3%5 %4", _printComponent, "Name: " + _loadoutName, _printNullItemsList, _printUnavailableItemsList, endl]); + }; }; + // Set position of loadouts different if in default loadout tab or if sharing is disabled if (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts || {!_sharingEnabled}) then { _contentPanelCtrl lnbSetColumnsPos [0, 0, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90]; } else { _contentPanelCtrl lnbSetColumnsPos [0, 0.05, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90]; }; - private _newRow = _contentPanelCtrl lnbAddRow ["",_loadoutName]; + _loadoutCachedInfo params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + _extendedLoadout params ["_loadout"]; + + _newRow = _contentPanelCtrl lnbAddRow ["", _loadoutName]; ADD_LOADOUTS_LIST_PICTURES + // Change color on loadout lines that have items that aren't available or don't exist if (_nullItemsAmount > 0) then { - - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; + _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red } else { - if (_unavailableItemsAmount > 0) then { - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; + _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray }; }; - _contentPanelCtrl setVariable [_loadoutName + str GVAR(currentLoadoutsTab), [_loadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]]; - - if ((profileName + _loadoutName) in _sharedLoadoutsVars && {GVAR(currentLoadoutsTab) == IDC_buttonMyLoadouts}) then { + // If it's a shared loadout and player is in the private loadouts tab, add icon + if (((profileName + _loadoutName) in _sharedLoadoutsVars) && {GVAR(currentLoadoutsTab) == IDC_buttonMyLoadouts}) then { _contentPanelCtrl lnbSetPicture [[_newRow, 0], QPATHTOF(data\iconPublic.paa)]; _contentPanelCtrl lnbSetValue [[_newRow, 0], 1]; }; - } foreach ([_data, +GVAR(defaultLoadoutsList)] select (ctrlIDC _control == IDC_buttonDefaultLoadouts)); + } forEach ([profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (ctrlIDC _control == IDC_buttonDefaultLoadouts)); } else { + private _allPlayerNames = allPlayers apply {name _x}; + private _loadoutVar = ""; { _x params ["_playerName", "_loadoutName", "_loadoutData"]; - if ((allPlayers apply {name _x}) find _playerName == -1) then { - - private _loadoutVar = _playerName + _loadoutName; + _loadoutVar = _playerName + _loadoutName; + // If player who shared loadout doesn't exist anymore, unshare loadout + if !(_playerName in _allPlayerNames) then { GVAR(sharedLoadoutsNamespace) setVariable [_loadoutVar, nil, true]; - _sharedLoadoutsVars = _sharedLoadoutsVars - [_loadoutVar]; - GVAR(sharedLoadoutsNamespace) setVariable [QGVAR(sharedLoadoutsNamespace), _sharedLoadoutsVars, true]; + GVAR(sharedLoadoutsNamespace) setVariable [QGVAR(sharedLoadoutsNamespace), _sharedLoadoutsVars - [_loadoutVar], true]; [QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent; } else { - - ([_loadoutData] call FUNC(verifyLoadout)) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + ([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + _extendedLoadout params ["_loadout"]; _contentPanelCtrl lnbSetColumnsPos [0, 0.15, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90]; - private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName]; + _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName]; ADD_LOADOUTS_LIST_PICTURES - _contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName]; + _contentPanelCtrl lnbSetData [[_newRow, 1], _loadoutVar]; + // Change color on loadout lines that have items that aren't available or don't exist if (_nullItemsAmount > 0) then { - - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; + _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red } else { - if (_unavailableItemsAmount > 0) then { - _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; + _contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray }; }; }; - } foreach (_sharedLoadoutsVars apply {GVAR(sharedLoadoutsNamespace) getVariable _x}); + } forEach (_sharedLoadoutsVars apply {GVAR(sharedLoadoutsNamespace) getVariable _x}); }; [QGVAR(loadoutsListFilled), [_display, _control]] call CBA_fnc_localEvent; +// Sort loadouts alphabetically _contentPanelCtrl lnbSort [1, false]; diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index 436c448300..a612268f01 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe - * Fill right panel. + * Author: Alganthe, johnb43 + * Fills right panel. * * Arguments: * 0: Arsenal display @@ -16,8 +16,6 @@ params ["_display", "_control"]; -private _ctrlIDC = ctrlIDC _control; - // Fade old control background if (!isNil QGVAR(currentRightPanel)) then { private _previousCtrlBackground = _display displayCtrl (GVAR(currentRightPanel) - 1); @@ -26,6 +24,7 @@ if (!isNil QGVAR(currentRightPanel)) then { }; // Show new control background +private _ctrlIDC = ctrlIDC _control; private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1); _ctrlBackground ctrlShow true; _ctrlBackground ctrlSetFade 0; @@ -33,110 +32,153 @@ _ctrlBackground ctrlCommit FADE_DELAY; private _searchbarCtrl = _display displayCtrl IDC_rightSearchbar; +// Show right search bar if (!(ctrlShown _searchbarCtrl) || {ctrlFade _searchbarCtrl > 0}) then { _searchbarCtrl ctrlShow true; _searchbarCtrl ctrlSetFade 0; _searchbarCtrl ctrlCommit 0; }; -private _fnc_fill_right_Container = { - params ["_configCategory", "_className", "_isMagazine", ["_isUnique", false, [false]]]; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgWeapons = configFile >> "CfgWeapons"; +private _rightPanelCache = uiNamespace getVariable QGVAR(rightPanelCache); - private _cacheNamespace = _ctrlPanel; - private _cachedItemInfo = _cacheNamespace getVariable [_configCategory+_className, []]; +private _currentCargo = itemsWithMagazines GVAR(center); - if (!(_className in GVAR(virtualItemsFlat))) then { +private _fnc_fillRightContainer = { + params ["_configCategory", "_className", "_hasItemInfo", ["_isUnique", false, [false]], ["_unknownOrigin", false, [false]]]; + + if (GVAR(favoritesOnly) && {!(_className in _currentCargo)} && {!((toLower _className) in GVAR(favorites))}) exitWith {}; + + // If item is not in the arsenal, it must be unique + if (!_isUnique && {!(_className in GVAR(virtualItemsFlat))}) then { _isUnique = true; }; - // Not in cache. So get info and put into cache - if (_cachedItemInfo isEqualTo []) then { + // If not in cache, find info and cache it for later use + (_rightPanelCache getOrDefaultCall [_configCategory + _className, { + // Get display name, picture and mass private _configPath = configFile >> _configCategory >> _className; - _cachedItemInfo set [0, getText (_configPath >> "displayName")]; - _cachedItemInfo set [1, getText (_configPath >> "picture")]; - _cachedItemInfo set [2, [getNumber (_configPath >> "itemInfo" >> "mass"), getNumber (_configPath >> "mass")] select _isMagazine]; + // "Misc. items" magazines (e.g. spare barrels, intel, photos) + if (_className in (uiNamespace getVariable QGVAR(magazineMiscItems))) then { + _configPath = _cfgMagazines >> _className; + _hasItemInfo = false; + }; - _cacheNamespace setVariable [_configCategory+_className, _cachedItemInfo]; - }; + // If an item with unknown origin is in the arsenal list, try to find it + if (_unknownOrigin && {isNull _configPath}) then { + _configPath = _className call CBA_fnc_getItemConfig; - _cachedItemInfo params ["_displayName","_picture", "_mass"]; + // Check if item is object (this should never happen) + if (isNull _configPath) then { + _configPath = _className call CBA_fnc_getObjectConfig; + }; + + // Check if item is has item info + _itemInfo = isClass (_cfgWeapons >> configName _configPath); + }; + + // Get mass + private _mass = if (!_hasItemInfo) then { + getNumber (_configPath >> "mass") + } else { + private _mass = getNumber (_configPath >> "itemInfo" >> "mass"); + + if (_mass == 0) then { + _mass = getNumber (_configPath >> "WeaponSlotsInfo" >> "mass"); + }; + + _mass + }; + + _rightPanelCache set [_className, _mass]; // Needed because this provides more accurate weight for FUNC(updateRightPanel) + + [getText (_configPath >> "displayName"), getText (_configPath >> "picture"), _mass] + }, true]) params ["_displayName", "_picture", "_mass"]; private _lbAdd = _ctrlPanel lnbAddRow ["", _displayName, "0"]; - private _columns = count lnbGetColumnsPosition _ctrlPanel; - - _ctrlPanel lnbSetData [[_lbAdd, 0], _x]; + _ctrlPanel lnbSetText [[_lbAdd, 1], _displayName]; + _ctrlPanel lnbSetData [[_lbAdd, 0], _className]; _ctrlPanel lnbSetPicture [[_lbAdd, 0], _picture]; _ctrlPanel lnbSetValue [[_lbAdd, 0], _mass]; - _ctrlPanel setVariable [_x, _mass]; - _ctrlPanel lnbSetValue [[_lbAdd, 2], [0, 1] select (_isUnique)]; - _ctrlPanel lbSetTooltip [_lbAdd * _columns,format ["%1\n%2", _displayName, _x]]; + _ctrlPanel lnbSetValue [[_lbAdd, 2], [0, 1] select _isUnique]; + _ctrlPanel lnbSetTooltip [[_lbAdd, 0], format ["%1\n%2", _displayName, _className]]; + if ((toLower _className) in GVAR(favorites)) then { + _ctrlPanel lnbSetColor [[_lbAdd, 1], FAVORITES_COLOR]; + _ctrlPanel lnbSetColorRight [[_lbAdd, 1], FAVORITES_COLOR]; + }; }; -// Retrieve compatible mags -private _compatibleItems = []; -private _compatibleMagazines = [[[], []], [[], []], [[], []]]; -{ - if (_x != "") then { - private _weaponConfig = (configFile >> "CfgWeapons" >> _x); - private _index = _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")); - - // Magazine groups - { - private _magazineGroups = uiNamespace getVariable [QGVAR(magazineGroups),["#CBA_HASH#",[],[],[]]]; - private _magArray = _magazineGroups get (toLower _x); - {((_compatibleMagazines select _index) select _subIndex) pushBackUnique _x} forEach _magArray; - } foreach ([getArray (_weaponConfig >> _x >> "magazineWell"), getArray (_weaponConfig >> "magazineWell")] select (_x == "this")); - - - } foreach getArray (_weaponConfig >> "muzzles"); - }; -} foreach [primaryWeapon GVAR(center), handgunWeapon GVAR(center), secondaryWeapon GVAR(center)]; - -private _itemsToCheck = []; -private _compatibleMagsPrimaryMuzzle = []; -private _compatibleMagsSecondaryMuzzle = []; - -private _allCompatibleMags = []; -{ - _allCompatibleMags append (_x select 0); - _allCompatibleMags append (_x select 1); -} foreach _compatibleMagazines; - private _ctrlPanel = _display displayCtrl IDC_rightTabContent; +private _listnBox = _display displayCtrl IDC_rightTabContentListnBox; + +// Reset right panel content +lbClear _ctrlPanel; +lbClear _listnBox; + +_ctrlPanel lbSetCurSel -1; +_listnBox lbSetCurSel -1; + +// Retrieve compatible items +private _itemToCheck = ""; +private _compatibleItems = []; +private _compatibleMagsMuzzle = []; +private _compatibleMagsAll = createHashMap; switch (GVAR(currentLeftPanel)) do { - case IDC_buttonPrimaryWeapon : { - _compatibleMagsPrimaryMuzzle = _compatibleMagazines select 0 select 0; - _compatibleMagsSecondaryMuzzle = _compatibleMagazines select 0 select 1; - _compatibleItems = (primaryWeapon GVAR(center)) call bis_fnc_compatibleItems; - _itemsToCheck = GVAR(currentItems) select 18; - }; + // If weapons or binoculars are chosen, get their compatible magazines & items + // Weapons and binoculars + case IDC_buttonPrimaryWeapon; + case IDC_buttonHandgun; + case IDC_buttonSecondaryWeapon; + case IDC_buttonBinoculars: { + (switch (GVAR(currentLeftPanel)) do { + case IDC_buttonPrimaryWeapon: { + [IDX_CURR_PRIMARY_WEAPON, IDX_CURR_PRIMARY_WEAPON_ITEMS] + }; + case IDC_buttonHandgun: { + [IDX_CURR_HANDGUN_WEAPON, IDX_CURR_HANDGUN_WEAPON_ITEMS] + }; + case IDC_buttonSecondaryWeapon: { + [IDX_CURR_SECONDARY_WEAPON, IDX_CURR_SECONDARY_WEAPON_ITEMS] + }; + case IDC_buttonBinoculars: { + [IDX_CURR_BINO, IDX_CURR_BINO_ITEMS] + }; + }) params ["_currentWeaponIndex", "_currentWeaponItemsIndex"]; - case IDC_buttonHandgun : { - _compatibleMagsPrimaryMuzzle = _compatibleMagazines select 1 select 0; - _compatibleMagsSecondaryMuzzle = _compatibleMagazines select 1 select 1; - _compatibleItems = (handgunWeapon GVAR(center)) call bis_fnc_compatibleItems; - _itemsToCheck = GVAR(currentItems) select 20; - }; + private _index = [IDC_buttonMuzzle, IDC_buttonItemAcc, IDC_buttonOptic, IDC_buttonBipod, IDC_buttonCurrentMag, IDC_buttonCurrentMag2] find _ctrlIDC; + private _weapon = GVAR(currentItems) select _currentWeaponIndex; - case IDC_buttonSecondaryWeapon : { - _compatibleMagsPrimaryMuzzle = _compatibleMagazines select 2 select 0; - _compatibleMagsSecondaryMuzzle = _compatibleMagazines select 2 select 1; - _compatibleItems = (secondaryWeapon GVAR(center)) call bis_fnc_compatibleItems; - _itemsToCheck = GVAR(currentItems) select 19; - }; + // Check if weapon attachement or magazine + if (_index != -1) then { + _itemToCheck = (GVAR(currentItems) select _currentWeaponItemsIndex) select _index; + // If weapon attachment, get base weapon; Get compatible items + if (_index <= 3) then { + _compatibleItems = compatibleItems _weapon; + _itemToCheck = _itemToCheck call FUNC(baseWeapon); + } else { + // Get compatible magazines for primary & secondary muzzle (secondary muzzle is not guaranteed to exist) + // Assumption: One weapon can have two muzzles maximum + _compatibleMagsMuzzle = compatibleMagazines [_weapon, (_weapon call CBA_fnc_getMuzzles) param [_index - 4, ""]]; + }; + }; + }; + // Uniform, vest or backpack case IDC_buttonUniform; case IDC_buttonVest; - case IDC_buttonBackpack : { - _ctrlPanel = _display displayCtrl IDC_rightTabContentListnBox; + case IDC_buttonBackpack: { + _ctrlPanel = _listnBox; + + // This is for the "compatible magazines" tab when a container is open + if (_ctrlIDC == IDC_buttonMag) then { + // Get all compatibles magazines with unit's weapons (including compatible magazines that aren't in configItems) + { + _compatibleMagsAll insert [true, compatibleMagazines _x, []]; + } forEach [GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON, GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON, GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON, GVAR(currentItems) select IDX_CURR_BINO]; + }; }; }; @@ -146,238 +188,241 @@ _ctrlPanel ctrlCommit 0; _ctrlPanel ctrlSetFade 0; _ctrlPanel ctrlCommit FADE_DELAY; -_itemsToCheck = _itemsToCheck apply {toLower _x}; -_compatibleItems = _compatibleItems apply {toLower _x}; +// Check if the left panel is a weapon. If so, right panel will be compatible items with weapon only +private _leftPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon, IDC_buttonBinoculars]; -lbClear (_display displayCtrl IDC_rightTabContentListnBox); -lbClear (_display displayCtrl IDC_rightTabContent); - -(_display displayCtrl IDC_rightTabContentListnBox) lbSetCurSel -1; -(_display displayCtrl IDC_rightTabContent) lbSetCurSel -1; - -private _leftPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]; - -if (_ctrlIDC in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2] && {_leftPanelState}) then { - private _addEmpty = _ctrlPanel lbadd format [" <%1>",localize "str_empty"]; - _ctrlPanel lbsetvalue [_addEmpty, -1]; +// Add an empty entry if left panel is a weapon or bino +if (_leftPanelState && {_ctrlIDC in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2]}) then { + private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"]; + _ctrlPanel lbSetValue [_addEmpty, -1]; }; +// Fill right panel according to category choice switch (_ctrlIDC) do { + // Optics, flashlights, muzzle attachments, bipods + case IDC_buttonOptic; + case IDC_buttonItemAcc; + case IDC_buttonMuzzle; + case IDC_buttonBipod: { + private _index = [IDX_VIRT_OPTICS_ATTACHMENTS, IDX_VIRT_FLASHLIGHT_ATTACHMENTS, IDX_VIRT_MUZZLE_ATTACHMENTS, IDX_VIRT_BIPOD_ATTACHMENTS] select ([RIGHT_PANEL_ACC_IDCS] find _ctrlIDC); - case IDC_buttonOptic : { if (_leftPanelState) then { { - ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (_compatibleItems arrayIntersect (((GVAR(virtualItems) select 1) select 0) apply {toLower _x})); + if (_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get _index)) then { + ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); + }; + } forEach _compatibleItems; } else { { - ["CfgWeapons", _x, false] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 1) select 0); + ["CfgWeapons", _x, true] call _fnc_fillRightContainer; + } forEach (keys ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get _index)); + { - ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 22) select 0); + ["CfgWeapons", _x, true, true] call _fnc_fillRightContainer; + } forEach (keys ((GVAR(virtualItems) get IDX_VIRT_UNIQUE_ATTACHMENTS) get _index)); }; }; - - case IDC_buttonItemAcc : { + // Current primary & secondary muzzle compatible magazines + case IDC_buttonCurrentMag; + case IDC_buttonCurrentMag2: { if (_leftPanelState) then { { - ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (_compatibleItems arrayIntersect (((GVAR(virtualItems) select 1) select 1) apply {toLower _x})); - } else { - { - ["CfgWeapons", _x, false] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 1) select 1); - { - ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 22) select 1); + if (_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) then { + ["CfgMagazines", _x, _ctrlPanel] call FUNC(addListBoxItem); + }; + } forEach _compatibleMagsMuzzle; }; }; - - case IDC_buttonMuzzle : { - if (_leftPanelState) then { - { - ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (_compatibleItems arrayIntersect (((GVAR(virtualItems) select 1) select 2) apply {toLower _x})); - } else { - { - ["CfgWeapons", _x, false] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 1) select 2); - { - ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 22) select 2); - }; - }; - - case IDC_buttonBipod : { - if (_leftPanelState) then { - { - ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (_compatibleItems arrayIntersect (((GVAR(virtualItems) select 1) select 3) apply {toLower _x})); - } else { - { - ["CfgWeapons", _x, false] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 1) select 3); - { - ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 22) select 3); - }; - }; - - case IDC_buttonCurrentMag : { - if (_leftPanelState) then { - { - ["CfgMagazines", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach ((GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) arrayIntersect _compatibleMagsPrimaryMuzzle); - }; - }; - - case IDC_buttonCurrentMag2 : { - if (_leftPanelState) then { - { - ["CfgMagazines", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach ((GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) arrayIntersect _compatibleMagsSecondaryMuzzle); - }; - }; - - case IDC_buttonMag : { + // All compatible magazines + case IDC_buttonMag: { { - ["CfgMagazines", _x, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) arrayIntersect _allCompatibleMags); - { - ["CfgMagazines", _x, true, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 19) arrayIntersect _allCompatibleMags); - }; + if (_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) then { + ["CfgMagazines", _x, false] call _fnc_fillRightContainer; - case IDC_buttonMagALL : { - { - ["CfgMagazines", _x, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL); - { - ["CfgMagazines", _x, true, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 19); - }; + continue; + }; - case IDC_buttonThrow : { - { - ["CfgMagazines", _x, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 15); - { - ["CfgMagazines", _x, true, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 20); + if (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL)) then { + ["CfgMagazines", _x, false, true] call _fnc_fillRightContainer; + }; + } forEach (keys _compatibleMagsAll); }; + // All magazines + case IDC_buttonMagALL: { + { + ["CfgMagazines", _x, false] call _fnc_fillRightContainer; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)); - case IDC_buttonPut : { { - ["CfgMagazines", _x, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 16); - { - ["CfgMagazines", _x, true, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 21); + ["CfgMagazines", _x, false, true] call _fnc_fillRightContainer; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL)); }; + // Grenades + case IDC_buttonThrow: { + { + ["CfgMagazines", _x, false] call _fnc_fillRightContainer; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_GRENADES)); + + { + ["CfgMagazines", _x, false, true] call _fnc_fillRightContainer; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GRENADES)); + }; + // Explosives + case IDC_buttonPut: { + { + ["CfgMagazines", _x, false] call _fnc_fillRightContainer; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES)); + + { + ["CfgMagazines", _x, false, true] call _fnc_fillRightContainer; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_EXPLOSIVES)); + }; + // Misc. items + case IDC_buttonMisc: { + // Don't add items that will be in a custom right panel button + private _items = createHashMap; - case IDC_buttonMisc : { - // hide custom button items - private _blockItems = []; if (!isNil QGVAR(customRightPanelButtons)) then { { if (!isNil "_x") then { - _blockItems append (_x select 0); + _items insert [true, _x select 0, []]; }; } forEach GVAR(customRightPanelButtons); }; + // "Regular" misc. items { - ["CfgWeapons", _x, false] call _fnc_fill_right_Container; - } forEach ((GVAR(virtualItems) select 17) select {!((toLower _x) in _blockItems)}); - - { - ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 18) select {!((toLower _x) in _blockItems)}); - { - ["CfgVehicles", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 23) select {!((toLower _x) in _blockItems)}); - { - ["CfgGlasses", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 24) select {!((toLower _x) in _blockItems)}); - }; - - 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, false] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 17) select {(toLower _x) in _items}); - - { - ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 18) select {(toLower _x) in _items}); - { - ["CfgVehicles", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 23) select {(toLower _x) in _items}); - { - ["CfgGlasses", _x, false, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 24) select {(toLower _x) in _items}); + if !(_x in _items) then { + ["CfgWeapons", _x, true] call _fnc_fillRightContainer; }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)); + // Unique items + { + if !(_x in _items) then { + ["CfgWeapons", _x, true, true] call _fnc_fillRightContainer; + }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS)); + // Unique backpacks + { + if !(_x in _items) then { + ["CfgVehicles", _x, false, true] call _fnc_fillRightContainer; + }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_BACKPACKS)); + // Unique goggles + { + if !(_x in _items) then { + ["CfgGlasses", _x, false, true] call _fnc_fillRightContainer; + }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES)); + // Unknown items + { + if !(_x in _items) then { + ["CfgWeapons", _x, true, true, true] call _fnc_fillRightContainer; + }; + } forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS)); + }; + // Custom buttons + default { + private _items = (GVAR(customRightPanelButtons) param [[RIGHT_PANEL_CUSTOM_BUTTONS] find _ctrlIDC, []]) param [0, []]; + + if (_items isNotEqualTo []) then { + { + + switch (true) do { + // "Regular" misc. items + case (_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)): { + ["CfgWeapons", _x, true] call _fnc_fillRightContainer; + }; + // Unique items + case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS)): { + ["CfgWeapons", _x, true, true] call _fnc_fillRightContainer; + }; + // Unique backpacks + case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_BACKPACKS)): { + ["CfgVehicles", _x, false, true] call _fnc_fillRightContainer; + }; + // Unique goggles + case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES)): { + ["CfgGlasses", _x, false, true] call _fnc_fillRightContainer; + }; + // Unknown items + case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS)): { + ["CfgWeapons", _x, true, true, true] call _fnc_fillRightContainer; + }; + }; + } forEach _items; }; }; }; -(_display displayCtrl IDC_rightSearchbar) ctrlSetText ""; +// When switching tabs, clear searchbox +if (GVAR(currentRightPanel) != _ctrlIDC) then { + (_display displayCtrl IDC_rightSearchbar) ctrlSetText ""; +}; +// Trigger event GVAR(currentRightPanel) = _ctrlIDC; - [QGVAR(rightPanelFilled), [_display, GVAR(currentLeftPanel), _ctrlIDC]] call CBA_fnc_localEvent; -// Add current items and change progress bar +// Add current items, change progress bar of container load and get relevant container if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]) then { - - private _maxLoad = 0; + private _containerItems = []; private _container = switch (GVAR(currentLeftPanel)) do { - case IDC_buttonUniform : { + // Uniform + case IDC_buttonUniform: { + // Update load bar (_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadUniform GVAR(center)); - _maxLoad = gettext (configfile >> "CfgWeapons" >> uniform GVAR(center) >> "ItemInfo" >> "containerClass"); - uniformItems GVAR(center) + + // Get all items from container (excluding container itself) + _containerItems = [GVAR(center), 0, 3, 0, 0, false] call EFUNC(common,uniqueUnitItems); + + uniformContainer GVAR(center) }; - case IDC_buttonVest : { + // Vest + case IDC_buttonVest: { + // Update load bar (_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadVest GVAR(center)); - _maxLoad = gettext (configfile >> "CfgWeapons" >> vest GVAR(center) >> "ItemInfo" >> "containerClass"); - vestItems GVAR(center) + + // Get all items from container (excluding container itself) + _containerItems = [GVAR(center), 0, 0, 3, 0, false] call EFUNC(common,uniqueUnitItems); + + vestContainer GVAR(center) }; - case IDC_buttonBackpack : { + // Backpack + case IDC_buttonBackpack: { + // Update load bar (_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadBackpack GVAR(center)); - _maxLoad = backpack GVAR(center); - backpackItems GVAR(center) + + // Get all items from container (excluding container itself) + _containerItems = [GVAR(center), 0, 0, 0, 3, false] call EFUNC(common,uniqueUnitItems); + + backpackContainer GVAR(center) }; }; - for "_l" from 0 to ((lnbsize _ctrlPanel select 0) - 1) do { - private _class = _ctrlPanel lnbData [_l, 0]; - _ctrlPanel lnbSetText [[_l, 2], ["0", str ({_x == _class} count _container)] select (_class in _container)]; + // Find out how many items of a type there are and update the number displayed + for "_lbIndex" from 0 to (lnbSize _ctrlPanel select 0) - 1 do { + _ctrlPanel lnbSetText [[_lbIndex, 2], str (_containerItems getOrDefault [_ctrlPanel lnbData [_lbIndex, 0], 0])]; }; - [_ctrlPanel, _maxLoad] call FUNC(updateRightPanel); + // Refresh availibility of items based on space remaining in container + [_ctrlPanel, _container, _containerItems isNotEqualTo []] call FUNC(updateRightPanel); }; // Sorting -private _sortRightCtrl = _display displayCtrl IDC_sortRightTab; -[_display, _control, _sortRightCtrl] call FUNC(fillSort); +[_display, _control, _display displayCtrl IDC_sortRightTab, _display displayCtrl IDC_sortRightTabDirection] call FUNC(fillSort); -// Select current data if not in a container -if (_itemsToCheck isNotEqualTo []) then { - for "_lbIndex" from 0 to (lbSize _ctrlPanel - 1) do { - private _currentData = _ctrlPanel lbData _lbIndex; +// Try to select previously selected item again, otherwise select first item ("Empty") +if (_itemToCheck != "") then { + private _index = 0; - if ((_currentData != "") && {tolower _currentData in _itemsToCheck}) exitWith { - _ctrlPanel lbSetCurSel _lbIndex; + for "_lbIndex" from 0 to (lbSize _ctrlPanel) - 1 do { + if ((_ctrlPanel lbData _lbIndex) == _itemToCheck) exitWith { + _index = _lbIndex; }; }; - if (lbCurSel _ctrlPanel < 0) then { - _ctrlPanel lbSetCurSel 0; - }; + _ctrlPanel lbSetCurSel _index; +} else { + _ctrlPanel lbSetCurSel 0; }; diff --git a/addons/arsenal/functions/fnc_fillSort.sqf b/addons/arsenal/functions/fnc_fillSort.sqf index 3516b5b6be..6b14ee38e2 100644 --- a/addons/arsenal/functions/fnc_fillSort.sqf +++ b/addons/arsenal/functions/fnc_fillSort.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe, Brett Mayson - * Fill right panel. + * Author: Alganthe, Brett Mayson, johnb43 + * Fills the sort menu. * * Arguments: * 0: Arsenal display @@ -15,51 +15,78 @@ * Public: No */ -params ["_display", "_control", "_sortCtrl"]; +params ["_display", "_control", "_sortCtrl", "_sortDirectionCtrl"]; lbClear _sortCtrl; +lbClear _sortDirectionCtrl; private _right = false; -private _rightSort = ctrlIDC _sortCtrl == 17; +private _rightSort = ctrlIDC _sortCtrl == IDC_sortRightTab; -private _sorts = if (_rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform ,IDC_buttonVest, IDC_buttonBackpack]}) then { +// Handle sorting direction +private _lastSortDirection = [GVAR(lastSortDirectionLeft), GVAR(lastSortDirectionRight)] select _rightSort; +private _sortIndex = 0; +private _index = -1; + +{ + _x params ["_sortName", "_displayName", "_direction"]; + + _index = _sortDirectionCtrl lbAdd _displayName; + _sortDirectionCtrl lbSetData [_index, _sortName]; + _sortDirectionCtrl lbSetValue [_index, _direction]; + + if (_direction == _lastSortDirection) then { + _sortIndex = _index; + }; +} forEach [[QGVAR(descending), LLSTRING(sortDescending), DESCENDING], [QGVAR(ascending), LLSTRING(sortAscending), ASCENDING]]; + +// Prevent FUNC(sortPanel) being called twice in succession +GVAR(ignoreFirstSortPanelCall) = true; +_sortDirectionCtrl lbSetCurSel _sortIndex; + +// Handle sorting +private _sorts = if (_rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]}) then { _right = true; + + // Right panel for uniforms, vest and backpacks GVAR(sortListRightPanel) select ( switch (GVAR(currentRightPanel)) do { - case IDC_buttonOptic: { 0 }; - case IDC_buttonItemAcc: { 1 }; - case IDC_buttonMuzzle: { 2 }; - case IDC_buttonBipod: { 3 }; + case IDC_buttonOptic: {0}; + case IDC_buttonItemAcc: {1}; + case IDC_buttonMuzzle: {2}; + case IDC_buttonBipod: {3}; case IDC_buttonCurrentMag; case IDC_buttonCurrentMag2; case IDC_buttonMag; - case IDC_buttonMagALL: { 4 }; - case IDC_buttonThrow: { 5 }; - case IDC_buttonPut: { 6 }; - case IDC_buttonMisc: { 7 }; + case IDC_buttonMagALL: {4}; + case IDC_buttonThrow: {5}; + case IDC_buttonPut: {6}; + case IDC_buttonMisc: {7}; } ) } else { - private _sidc = ctrlIDC _sortCtrl; private _idc = ctrlIDC _control; - switch true do { - case (_sidc == 17): { // Right panel weapon attachment + + switch (true) do { + // Right panel for weapons + case (_rightSort): { GVAR(sortListRightPanel) select ( switch (_idc) do { - case IDC_buttonOptic: { 0 }; - case IDC_buttonItemAcc: { 1 }; - case IDC_buttonMuzzle: { 2 }; - case IDC_buttonBipod: { 3 }; + case IDC_buttonOptic: {0}; + case IDC_buttonItemAcc: {1}; + case IDC_buttonMuzzle: {2}; + case IDC_buttonBipod: {3}; case IDC_buttonCurrentMag; case IDC_buttonCurrentMag2; case IDC_buttonMag; - case IDC_buttonMagALL: { 4 }; - case IDC_buttonThrow: { 5 }; - case IDC_buttonPut: { 6 }; - case IDC_buttonMisc: { 7 }; + case IDC_buttonMagALL: {4}; + case IDC_buttonThrow: {5}; + case IDC_buttonPut: {6}; + case IDC_buttonMisc: {7}; } ) }; + // Left panel default { GVAR(sortListLeftPanel) select ([ IDC_buttonPrimaryWeapon, @@ -86,15 +113,21 @@ private _sorts = if (_rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform }; private _lastSort = [GVAR(lastSortLeft), GVAR(lastSortRight)] select _rightSort; -private _sortIndex = 0; +_sortIndex = 0; { - if (_x isEqualTo []) exitWith {}; + if (_x isEqualTo []) then { + continue; + }; + _x params ["_sortName", "_displayName", "", "_condition"]; + + // Check if sort if available for this panel if ([_right] call _condition) then { - private _index = _sortCtrl lbAdd _displayName; + _index = _sortCtrl lbAdd _displayName; _sortCtrl lbSetData [_index, _sortName]; - if (_displayName isEqualTo _lastSort) then { + + if (_displayName == _lastSort) then { _sortIndex = _index; }; }; diff --git a/addons/arsenal/functions/fnc_handleActions.sqf b/addons/arsenal/functions/fnc_handleActions.sqf new file mode 100644 index 0000000000..833a615cb5 --- /dev/null +++ b/addons/arsenal/functions/fnc_handleActions.sqf @@ -0,0 +1,148 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Brett Mayson + * Handles the actions control group + * + * Arguments: + * 0: Arsenal display + * 1: Current panel control + * 2: Current panel selection + * 3: Item config entry + * + * Return Value: + * None + * + * Public: No +*/ + +params ["_display", "_control", "_curSel", "_itemCfg"]; + +GVAR(actionsInfo) = [_control, _curSel, _itemCfg]; + +private _panel = [ + IDC_buttonPrimaryWeapon, + IDC_buttonHandgun, + IDC_buttonSecondaryWeapon, + IDC_buttonUniform, + IDC_buttonVest, + IDC_buttonBackpack, + IDC_buttonHeadgear, + IDC_buttonGoggles, + IDC_buttonNVG, + IDC_buttonBinoculars, + IDC_buttonMap, + IDC_buttonGPS, + IDC_buttonRadio, + IDC_buttonCompass, + IDC_buttonWatch, + IDC_buttonFace, + IDC_buttonVoice, + IDC_buttonInsignia +] find GVAR(currentLeftPanel); + +private _groups = (GVAR(actionList) select _panel) select { + [GVAR(center)] call (_x select 2) +}; + +private _show = _groups isNotEqualTo []; +private _ctrl = _display displayCtrl IDC_actionsBox; +_ctrl ctrlShow _show; +_ctrl ctrlCommit 0.15; + +if (!_show) exitWith {}; + +private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox; +private _actionsCurrentPageCtrl = _display displayCtrl IDC_actionsCurrentPage; + +private _currentPage = GVAR(currentActionPage); +private _pages = count _groups; + +if (_currentPage < 0) then { + _currentPage = _pages - 1; +}; + +if (_currentPage >= _pages) then { + _currentPage = 0; + GVAR(currentActionPage) = _currentPage; +}; + +{ + private _ctrl = _display displayCtrl _x; + _ctrl ctrlShow (_pages > 1); + _ctrl ctrlCommit 0; +} forEach [IDC_actionsPreviousPage, IDC_actionsNextPage]; + +private _group = _groups select _currentPage; +private _items = _group select 3 select { + [GVAR(center)] call (_x select 4) +}; + +_actionsCurrentPageCtrl ctrlSetText (_group select 1); +_actionsCurrentPageCtrl ctrlSetFade 0; +_actionsCurrentPageCtrl ctrlShow true; +_actionsCurrentPageCtrl ctrlCommit 0; + +{ + _x params ["", "_type", "_label", "_statement"]; + + private _idc = 9001 + _forEachIndex * 2; + private _actionTextCtrl = _display displayCtrl _idc; + private _actionButtonCtrl = _display displayCtrl (_idc + 1); + + switch (_type) do { + case ACTION_TYPE_BUTTON: { + _actionButtonCtrl ctrlRemoveAllEventHandlers "ButtonClick"; + _actionButtonCtrl ctrlAddEventHandler ["ButtonClick", { + if (is3DEN) exitWith {[true] call FUNC(refresh)}; + [{ + [true] call FUNC(refresh); + }] call CBA_fnc_execNextFrame; + }]; + _actionButtonCtrl ctrlAddEventHandler ["ButtonClick", _statement]; + _actionButtonCtrl ctrlSetText _label; + _actionButtonCtrl ctrlSetFade 0; + _actionButtonCtrl ctrlEnable true; + _actionButtonCtrl ctrlCommit 0; + _actionTextCtrl ctrlSetFade 1; + _actionTextCtrl ctrlCommit 0; + }; + case ACTION_TYPE_TEXT: { + private _text = call _statement; + + if (isNil "_text") then { + _text = ""; + }; + + _actionTextCtrl ctrlSetText _text; + _actionTextCtrl ctrlSetFade 0; + _actionTextCtrl ctrlCommit 0; + _actionButtonCtrl ctrlSetFade 1; + _actionButtonCtrl ctrlCommit 0; + }; + default { + _actionTextCtrl ctrlSetFade 1; + _actionTextCtrl ctrlCommit 0; + _actionButtonCtrl ctrlSetFade 1; + _actionButtonCtrl ctrlCommit 0; + }; + }; +} forEach _items; + +private _actionCount = count _items; + +{ + private _idc = 9001 + _x * 2; + private _actionTextCtrl = _display displayCtrl _idc; + private _actionButtonCtrl = _display displayCtrl (_idc + 1); + + _actionTextCtrl ctrlSetFade 1; + _actionTextCtrl ctrlCommit 0; + _actionButtonCtrl ctrlSetFade 1; + _actionButtonCtrl ctrlCommit 0; +} forEach ([0, 1, 2, 3, 4] select [_actionCount, 5]); + +private _pos = ctrlPosition _actionsBoxCtrl; +_pos set [3, ([11, (5 * _actionCount) + 6] select (_actionCount > 0)) * GRID_H]; +_actionsBoxCtrl ctrlSetPosition _pos; +_actionsBoxCtrl ctrlCommit 0; diff --git a/addons/arsenal/functions/fnc_handleLoadoutsSearchbar.sqf b/addons/arsenal/functions/fnc_handleLoadoutsSearchbar.sqf index 2911e7aa19..56d6c357d5 100644 --- a/addons/arsenal/functions/fnc_handleLoadoutsSearchbar.sqf +++ b/addons/arsenal/functions/fnc_handleLoadoutsSearchbar.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -16,30 +16,56 @@ params ["_display", "_control"]; -private _textString = ctrlText _control; - private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; -if !(GVAR(lastSearchTextLoadouts) isEqualTo "" || {(_textString find GVAR(lastSearchTextLoadouts)) == 0}) then {//don't refill if there is no need +// Get the currently selected item in panel +private _selectedLoadoutIndex = lnbCurSelRow _contentPanelCtrl; +private _selectedLoadout = ""; + +// If something is selected, save it +if (_selectedLoadoutIndex != -1) then { + _selectedLoadout = _contentPanelCtrl lnbText [_selectedLoadoutIndex, 1]; +}; + +private _searchString = ctrlText _control; + +// Don't refill if there is no need +if (GVAR(lastSearchTextLoadouts) != "" && {(_searchString find GVAR(lastSearchTextLoadouts)) != 0}) then { [_display, _display displayCtrl GVAR(currentLoadoutsTab)] call FUNC(fillLoadoutsList); }; -GVAR(lastSearchTextLoadouts) = _textString; -if (count _textString == 0) exitWith {}; +GVAR(lastSearchTextLoadouts) = _searchString; -private _contentPanelCtrl = _display displayCtrl IDC_contentPanel; +// If nothing searched, quit here +if (_searchString != "") then { + _searchString = toLower _searchString; -private _itemsToGo = (lnbSize _contentPanelCtrl) select 0; -private _lbIndex = 0; -while {_itemsToGo > 0} do { - private _currentData = _contentPanelCtrl lnbText [_lbIndex, 1]; - private _currentClassname = _contentPanelCtrl lnbData [_lbIndex, 0]; + private _loadoutName = ""; + private _loadout = []; + private _currentTab = str GVAR(currentLoadoutsTab); - if ((_currentData isEqualTo "") || {(((toUpper _currentData) find (toUpper _textString)) == -1) && {((toUpper _currentClassname) find (toUpper _textString)) == -1}}) then { - _contentPanelCtrl lnbDeleteRow _lbIndex; - } else { - _lbIndex = _lbIndex + 1; + // Go through all items in panel and see if they need to be deleted or not + for "_lbIndex" from (lnbSize _contentPanelCtrl select 0) - 1 to 0 step -1 do { + _loadoutName = toLower (_contentPanelCtrl lnbText [_lbIndex, 1]); + + // Remove item in panel if it doesn't match search, skip otherwise + if ((_loadoutName == "") || {!(_searchString in _loadoutName)}) then { + _contentPanelCtrl lnbDeleteRow _lbIndex; + }; }; - _itemsToGo = _itemsToGo - 1; }; -_contentPanelCtrl lnbSetCurSelRow -1; + +// Try to select previously selected item again, otherwise select nothing +if (_selectedLoadoutIndex != -1) then { + private _index = -1; + + for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { + if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _selectedLoadout) exitWith { + _index = _lbIndex; + }; + }; + + _contentPanelCtrl lnbSetCurSelRow _index; +} else { + _contentPanelCtrl lnbSetCurSelRow -1; +}; diff --git a/addons/arsenal/functions/fnc_handleMouse.sqf b/addons/arsenal/functions/fnc_handleMouse.sqf index 7d2fa2c9e2..588999de8e 100644 --- a/addons/arsenal/functions/fnc_handleMouse.sqf +++ b/addons/arsenal/functions/fnc_handleMouse.sqf @@ -1,16 +1,16 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Karel Moricky, modified by Alganthe + * Author: Karel Moricky, modified by Alganthe, johnb43 * Update the camera position and pitch/bank. * Modernized a bit, modified to fit the rewrite. * * Arguments: * 0: Not used * 1: Arguments - * 1.1: Mouse area control - * 1.2: Mouse X position - * 1.3: Mouse Y position + * - 0: Mouse area control + * - 1: Mouse X position + * - 2: Mouse Y position * * Return Value: * None @@ -19,50 +19,53 @@ */ params ["", "_args"]; - _args params ["_control", "_mouseX", "_mouseY"]; -GVAR(cameraPosition) params ["_distance", "_dirH", "_dirV", "_helperPos"]; + +GVAR(cameraPosition) params ["", "_dirH", "_dirV", "_helperPos"]; GVAR(mouseButtonState) params ["_LMB", "_RMB"]; if (count _LMB > 0) then { _LMB params ["_LMBcursorX", "_LMBcursorY"]; - private _dX = [(_mouseX - _LMBcursorX), (_LMBcursorX - _mouseX)] select GVAR(camInverted); - private _dY = [(_mouseY -_LMBcursorY), (_LMBcursorY - _mouseY)] select GVAR(camInverted); - GVAR(mouseButtonState) set [0,[_mouseX,_mouseY]]; + private _dX = [_mouseX - _LMBcursorX, _LMBcursorX - _mouseX] select GVAR(camInverted); + private _dY = [_mouseY -_LMBcursorY, _LMBcursorY - _mouseY] select GVAR(camInverted); - private _centerBox = boundingboxreal GVAR(center); + private _centerBox = boundingBoxReal GVAR(center); private _centerSizeBottom = _centerBox select 0 select 2; private _centerSizeUp = _centerBox select 1 select 2; - private _centerSize = sqrt ([_centerBox select 0 select 0,_centerBox select 0 select 1] distance [_centerBox select 1 select 0,_centerBox select 1 select 1]); + private _centerSize = sqrt ([_centerBox select 0 select 0, _centerBox select 0 select 1] distance [_centerBox select 1 select 0, _centerBox select 1 select 1]); + + _helperPos = [_helperPos, _dX * _centerSize, _dirH - 90] call BIS_fnc_relPos; - _helperPos = [_helperPos, _dX * _centerSize, _dirH - 90] call bis_fnc_relpos; _helperPos = [ - [0,0,((_helperPos select 2) - _dY * _centerSize) max _centerSizeBottom min _centerSizeUp], - ([0,0,0] distance2D _helperPos) min _centerSize, - [0,0,0] getDir _helperPos - ] call bis_fnc_relpos; + [0, 0, ((_helperPos select 2) - _dY * _centerSize) max _centerSizeBottom min _centerSizeUp], + ([0, 0, 0] distance2D _helperPos) min _centerSize, + [0, 0, 0] getDir _helperPos + ] call BIS_fnc_relPos; - _helperPos set [2,(_helperPos select 2) max ((boundingboxreal GVAR(center) select 0 select 2) + 0.2)]; + _helperPos set [2, (_helperPos select 2) max ((_centerBox select 0 select 2) + 0.2)]; - GVAR(cameraPosition) set [3,_helperPos]; + GVAR(cameraPosition) set [3, _helperPos]; + GVAR(mouseButtonState) set [0, [_mouseX, _mouseY]]; }; if (count _RMB > 0) then { _RMB params ["_RMBcursorX", "_RMBcursorY"]; + private _dX = (_RMBcursorX - _mouseX) * 0.75; private _dY = (_RMBcursorY - _mouseY) * 0.75; + _helperPos = [ - [0,0,_helperPos select 2], - [0,0,0] distance2D _helperPos, - ([0,0,0] getDir _helperPos) - _dX * 360 - ] call bis_fnc_relpos; + [0, 0, _helperPos select 2], + [0, 0, 0] distance2D _helperPos, + ([0, 0, 0] getDir _helperPos) - _dX * 360 + ] call BIS_fnc_relPos; - GVAR(cameraPosition) set [1,(_dirH - _dX * 360)]; - GVAR(cameraPosition) set [2,(_dirV - _dY * 100) max -89 min 89]; - GVAR(cameraPosition) set [3,_helperPos]; - GVAR(mouseButtonState) set [1,[_mouseX,_mouseY]]; + GVAR(cameraPosition) set [1, _dirH - _dX * 360]; + GVAR(cameraPosition) set [2, (_dirV - _dY * 100) max -89 min 89]; + GVAR(cameraPosition) set [3, _helperPos]; + GVAR(mouseButtonState) set [1, [_mouseX, _mouseY]]; }; -if (!alive (GVAR(center)) || isnull GVAR(center)) then { - (ctrlParent _control) closeDisplay 2; +if (!alive GVAR(center)) then { + (ctrlParent _control) closeDisplay IDC_CANCEL; }; diff --git a/addons/arsenal/functions/fnc_handleScrollWheel.sqf b/addons/arsenal/functions/fnc_handleScrollWheel.sqf index 0fec3e7c5b..6ca7be588f 100644 --- a/addons/arsenal/functions/fnc_handleScrollWheel.sqf +++ b/addons/arsenal/functions/fnc_handleScrollWheel.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" -#include "..\defines.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Handle the mouse wheel. * * Arguments: * 0: Not used - * 1: Mousewheel Z position + * 1: onMouseZChanged EH return + * - 0: Not used + * - 1: Mousewheel Z position * * Return Value: * None @@ -17,7 +18,8 @@ params ["", "_args"]; _args params ["", "_zPos"]; -private _distanceMax = ((boundingboxreal GVAR(center) select 0) vectordistance (boundingboxreal GVAR(center) select 1)) * 1.5; +private _boundingBoxReal = boundingBoxReal GVAR(center); +private _distanceMax = ((_boundingBoxReal select 0) vectorDistance (_boundingBoxReal select 1)) * 1.5; private _distanceMin = _distanceMax * 0.15; private _distance = GVAR(cameraPosition) select 0; diff --git a/addons/arsenal/functions/fnc_handleSearchbar.sqf b/addons/arsenal/functions/fnc_handleSearchbar.sqf index 5632006f43..3bf7c6329c 100644 --- a/addons/arsenal/functions/fnc_handleSearchbar.sqf +++ b/addons/arsenal/functions/fnc_handleSearchbar.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Handles keyboard inputs inside the searchbars text boxes. * * Arguments: @@ -16,77 +16,162 @@ params ["_display", "_control"]; -private _textString = ctrlText _control; +private _searchString = ctrlText _control; +if (_searchString != "") then { + _searchString = _searchString call EFUNC(common,escapeRegex); + _searchString = ".*?" + (_searchString splitString " " joinString ".*?") + ".*?/io"; +}; +// Right panel search bar if ((ctrlIDC _control) == IDC_rightSearchbar) then { - if !(GVAR(lastSearchTextRight) isEqualTo "" || {(_textString find GVAR(lastSearchTextRight)) == 0}) then {//don't refill if there is no need + // Don't refill if there is no need + if (GVAR(lastSearchTextRight) != "" && {GVAR(lastSearchTextRight) isNotEqualTo _searchString}) then { [_display, _display displayCtrl GVAR(currentRightPanel)] call FUNC(fillRightPanel); }; - GVAR(lastSearchTextRight) = _textString; - if (count _textString == 0) exitWith {}; - private _rightPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]; - private _rightPanelCtrl = [_display displayCtrl IDC_rightTabContentListnBox, _display displayCtrl IDC_rightTabContent] select (_rightPanelState); + GVAR(lastSearchTextRight) = _searchString; + // If nothing searched, quit here + if (_searchString == "") exitWith {}; + + private _rightPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon, IDC_buttonBinoculars]; + private _rightPanelCtrl = [_display displayCtrl IDC_rightTabContentListnBox, _display displayCtrl IDC_rightTabContent] select _rightPanelState; + + // If right panel selection is weapons or binoculars if (_rightPanelState) then { + // Get the currently selected item in panel + private _selectedItemIndex = lbCurSel _rightPanelCtrl; + private _selectedItem = ""; - private _itemsToGo = lbSize _rightPanelCtrl; - private _lbIndex = 0; - while {_itemsToGo > 0} do { - private _currentData = _rightPanelCtrl lbText _lbIndex; - private _currentClassname = _rightPanelCtrl lbData _lbIndex; + // If something is selected, save it + if (_selectedItemIndex != -1) then { + _selectedItem = _rightPanelCtrl lbText _selectedItemIndex; + }; - if ((_currentData isEqualTo "") || {(((toUpper _currentData) find (toUpper _textString)) == -1) && {((toUpper _currentClassname) find (toUpper _textString)) == -1}}) then { + private _currentDisplayName = ""; + private _currentClassname = ""; + + // Go through all items in panel and see if they need to be deleted or not + for "_lbIndex" from (lbSize _rightPanelCtrl) - 1 to 0 step -1 do { + _currentDisplayName = _rightPanelCtrl lbText _lbIndex; + _currentClassname = _rightPanelCtrl lbData _lbIndex; + + // Remove item in panel if it doesn't match search, skip otherwise + if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then { _rightPanelCtrl lbDelete _lbIndex; - } else { - _lbIndex = _lbIndex + 1; }; - _itemsToGo = _itemsToGo - 1; }; - _rightPanelCtrl lbSetCurSel -1; + + // Try to select previously selected item again, otherwise select nothing + if (_selectedItemIndex != -1) then { + private _index = -1; + + // Try to find previously selected item in panel + for "_lbIndex" from 0 to (lbSize _rightPanelCtrl) - 1 do { + if ((_rightPanelCtrl lbText _lbIndex) == _selectedItem) exitWith { + _index = _lbIndex; + }; + }; + + // Select old item if found, otherwise don't select anything + _rightPanelCtrl lbSetCurSel _index; + } else { + _rightPanelCtrl lbSetCurSel -1; + }; } else { + // Get the currently selected item in panel + private _selectedItemIndex = lnbCurSelRow _rightPanelCtrl; + private _selectedItem = ""; - private _itemsToGo = (lnbSize _rightPanelCtrl) select 0; - private _lbIndex = 0; - while {_itemsToGo > 0} do { - private _currentData = _rightPanelCtrl lnbText [_lbIndex, 1]; - private _currentClassname = _rightPanelCtrl lnbData [_lbIndex, 0]; - - if ((_currentData isEqualTo "") || {(((toUpper _currentData) find (toUpper _textString)) == -1) && {((toUpper _currentClassname) find (toUpper _textString)) == -1}}) then { - _rightPanelCtrl lnbDeleteRow _lbIndex; - } else { - _lbIndex = _lbIndex + 1; - }; - _itemsToGo = _itemsToGo - 1; + // If something is selected, save it + if (_selectedItemIndex != -1) then { + _selectedItem = _rightPanelCtrl lnbText [_selectedItemIndex, 1]; + }; + + private _currentDisplayName = ""; + private _currentClassname = ""; + + // Go through all items in panel and see if they need to be deleted or not + for "_lbIndex" from (lnbSize _rightPanelCtrl select 0) - 1 to 0 step -1 do { + _currentDisplayName = _rightPanelCtrl lnbText [_lbIndex, 1]; + _currentClassname = _rightPanelCtrl lnbData [_lbIndex, 0]; + + // Remove item in panel if it doesn't match search, skip otherwise + if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then { + _rightPanelCtrl lnbDeleteRow _lbIndex; + }; + }; + + // Try to select previously selected item again, otherwise select nothing + if (_selectedItemIndex != -1) then { + private _index = -1; + + // Try to find previously selected item in panel + for "_lbIndex" from 0 to (lnbSize _rightPanelCtrl select 0) - 1 do { + if ((_rightPanelCtrl lnbText [_lbIndex, 1]) == _selectedItem) exitWith { + _index = _lbIndex; + }; + }; + + // Select old item if found, otherwise don't select anything + _rightPanelCtrl lnbSetCurSelRow _index; + } else { + _rightPanelCtrl lnbSetCurSelRow -1; }; - _rightPanelCtrl lnbSetCurSelRow -1; }; [_display, nil, nil, configNull] call FUNC(itemInfo); } else { - - if !(GVAR(lastSearchTextLeft) isEqualTo "" || {(_textString find GVAR(lastSearchTextLeft)) == 0}) then {//don't refill if there is no need + // Left panel search bar + // Don't refill if there is no need + if (GVAR(lastSearchTextLeft) != "" && {GVAR(lastSearchTextLeft) isNotEqualTo _searchString}) then { [_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); }; - GVAR(lastSearchTextLeft) = _textString; - if (count _textString == 0) exitWith {}; + + GVAR(lastSearchTextLeft) = _searchString; + + // If nothing searched, quit here + if (_searchString == "") exitWith {}; private _leftPanelCtrl = _display displayCtrl IDC_leftTabContent; + // Get the currently selected item in panel + private _selectedItemIndex = lbCurSel _leftPanelCtrl; + private _selectedItem = ""; - private _itemsToGo = (lbSize _leftPanelCtrl); - private _lbIndex = 0; - while {_itemsToGo > 0} do { - private _currentData = _leftPanelCtrl lbText _lbIndex; - private _currentClassname = _leftPanelCtrl lbData _lbIndex; - - if ((_currentData isEqualTo "") || {(((toUpper _currentData) find (toUpper _textString)) == -1) && {((toUpper _currentClassname) find (toUpper _textString)) == -1}}) then { - _leftPanelCtrl lbDelete _lbIndex; - } else { - _lbIndex = _lbIndex + 1; - }; - _itemsToGo = _itemsToGo - 1; + // If something is selected, save it + if (_selectedItemIndex != -1) then { + _selectedItem = _leftPanelCtrl lbText _selectedItemIndex; }; - _leftPanelCtrl lbSetCurSel -1; + + private _currentDisplayName = ""; + private _currentClassname = ""; + + // Go through all items in panel and see if they need to be deleted or not + for "_lbIndex" from (lbSize _leftPanelCtrl) - 1 to 0 step -1 do { + _currentDisplayName = _leftPanelCtrl lbText _lbIndex; + _currentClassname = _leftPanelCtrl lbData _lbIndex; + + // Remove item in panel if it doesn't match search, skip otherwise + if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then { + _leftPanelCtrl lbDelete _lbIndex; + }; + }; + + // Try to select previously selected item again, otherwise select nothing + if (_selectedItemIndex != -1) then { + private _index = -1; + + for "_lbIndex" from 0 to (lbSize _leftPanelCtrl) - 1 do { + if ((_leftPanelCtrl lbText _lbIndex) == _selectedItem) exitWith { + _index = _lbIndex; + }; + }; + + _leftPanelCtrl lbSetCurSel _index; + } else { + _leftPanelCtrl lbSetCurSel -1; + }; + [_display, nil, nil, configNull] call FUNC(itemInfo); }; diff --git a/addons/arsenal/functions/fnc_handleStats.sqf b/addons/arsenal/functions/fnc_handleStats.sqf index 16cdc1c7e1..b5d435a101 100644 --- a/addons/arsenal/functions/fnc_handleStats.sqf +++ b/addons/arsenal/functions/fnc_handleStats.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe - * Handles the stats control group + * Handles the stats control group. * * Arguments: * 0: Arsenal display * 1: Current panel control - * 2: Current panel selection + * 2: Current panel selection * 3: Item config entry * * Return Value: @@ -16,20 +16,21 @@ * Public: No */ -params ["_display", "_control", "_curSel", "_itemCfg"]; +params ["_display", "_control", "_curSel", ["_itemCfg", configNull]]; private _statsBoxCtrl = _display displayCtrl IDC_statsBox; private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage; private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage; private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage; -private _hideUnusedFnc = { - params ["_numbers"]; +private _fnc_hideUnused = { + params ["_count"]; - { - private _statsTitleCtrl = _display displayCtrl (5101 + ((_x - 1) * 4)); - private _statsTitleIDC = ctrlIDC _statsTitleCtrl; + if (_count <= 0) exitWith {}; + for "_i" from 0 to (_count - 1) do { + private _statsTitleIDC = IDC_statsTitle5 - (_i * 4); + private _statsTitleCtrl = _display displayCtrl _statsTitleIDC; private _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1); private _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2); private _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3); @@ -43,196 +44,28 @@ private _hideUnusedFnc = { _statsBarCtrl, _statsTextCtrl ]; - } forEach _numbers; + }; }; -if (!isNil "_itemCfg") then { +private _fnc_hideEverything = { + 5 call _fnc_hideUnused; - private _handleStatsFnc = { - params ["_statsIndex", "_leftPanel"]; - - // Get the proper list and page - if (_leftPanel) then { - [true, (GVAR(statsListLeftPanel)) select _statsIndex, GVAR(statsPagesLeft) select _statsIndex] - } else { - [false, (GVAR(statsListRightPanel)) select _statsIndex, GVAR(statsPagesRight) select _statsIndex] - } params ["_isLeftPanel", "_statsArray", "_currentPage"]; - - private _statsList = _statsArray select _currentPage; - - private _statsCount = 0; - - // Handle titles, bars and text - _statsList = _statsList select [0, 5]; - if (_statsList isNotEqualTo []) then { - { - _x params ["_ID", "_configEntry", "_title", "_bools", "_statements"]; - _bools params ["_showBar", "_showText"]; - _statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]]; - - private _statsTitleCtrl = _display displayCtrl (5101 + _forEachIndex * 4); - private _statsTitleIDC = ctrlIDC _statsTitleCtrl; - private _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1); - private _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2); - private _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3); - - _statsCount = _statsCount + 1; - _statsTitleCtrl ctrlSetText _title; - _statsTitleCtrl ctrlSetFade 0; - - // Handle bars - if (_showBar) then { - _statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement); - - _statsBackgroundCtrl ctrlSetFade 0; - _statsBarCtrl ctrlSetFade 0; - } else { - _statsBackgroundCtrl ctrlSetFade 1; - _statsBarCtrl ctrlSetFade 1; - }; - - // Handle text entries - if (_showText) then { - private _textStatementResult = [_configEntry, _itemCfg] call _textStatement; - - if (_textStatementResult isEqualtype "") then { - _statsTextCtrl ctrlSetText _textStatementResult; - } else { - _statsTextCtrl ctrlSetText (str _textStatementResult); - }; - _statsTextCtrl ctrlSetTextColor ([[1,1,1,1], [0,0,0,1]] select (_showBar)); - - _statsTextCtrl ctrlSetFade 0; - } else { - _statsTextCtrl ctrlSetFade 1; - }; - - { - _x ctrlCommit 0; - } forEach [ - _statsTitleCtrl, - _statsBackgroundCtrl, - _statsBarCtrl, - _statsTextCtrl - ]; - } forEach (_statsList select { - _x params ["_ID","_configEntry", "_title", "_bools", "_statements"]; - _statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]]; - - ([_configEntry, _itemCfg] call _condition) - }); - }; - - // Resize the window - [[1, 2, 3, 4, 5] select [_statsCount, 5]] call _hideUnusedFnc; - _statsBoxCtrl ctrlSetPosition [ - (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, - safezoneY + 1.8 * GRID_H, - 47 * GRID_W, - ([11, (10 * _statsCount) + 5] select (_statsCount > 0)) * GRID_H - ]; - _statsBoxCtrl ctrlCommit 0; - - GVAR(statsInfo) = [_isLeftPanel, _statsIndex, _control, _curSel, _itemCfg]; - - // Toggle page buttons - _statsPreviousPageCtrl ctrlEnable !(_currentPage == 0); - _statsNextPageCtrl ctrlEnable !(_currentPage + 1 >= count _statsArray); - _statsCurrentPageCtrl ctrlSetText ([localize LSTRING(page), str (_currentPage + 1)] joinString " "); - - { - _x ctrlSetFade 0; - _x ctrlCommit 0; - } forEach [ - _statsPreviousPageCtrl, - _statsNextPageCtrl, - _statsCurrentPageCtrl - ]; - }; - - if (ctrlIDC _control == IDC_leftTabContent) then { - - if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia] find GVAR(currentLeftPanel) > -1) then { - - [[1, 2, 3, 4, 5]] call _hideUnusedFnc; - _statsBoxCtrl ctrlSetPosition [ - (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, - safezoneY + 1.8 * GRID_H, - 47 * GRID_W, - 11 * GRID_H - ]; - _statsBoxCtrl ctrlCommit 0; - - { - _x ctrlSetFade 1; - _x ctrlCommit 0; - } forEach [ - _statsPreviousPageCtrl, - _statsNextPageCtrl, - _statsCurrentPageCtrl - ]; - } else { - [[ - IDC_buttonPrimaryWeapon, - IDC_buttonHandgun, - IDC_buttonSecondaryWeapon, - IDC_buttonUniform, - IDC_buttonVest, - IDC_buttonBackpack, - IDC_buttonHeadgear, - IDC_buttonGoggles, - IDC_buttonNVG, - IDC_buttonBinoculars, - IDC_buttonMap, - IDC_buttonGPS, - IDC_buttonRadio, - IDC_buttonCompass, - IDC_buttonWatch - ] find GVAR(currentLeftPanel), true] call _handleStatsFnc; - }; - } else { - - switch (GVAR(currentRightPanel)) do { - case IDC_buttonOptic: { - [0, false] call _handleStatsFnc; - }; - case IDC_buttonItemAcc: { - [1, false] call _handleStatsFnc; - }; - case IDC_buttonMuzzle: { - [2, false] call _handleStatsFnc; - }; - case IDC_buttonBipod: { - [3, false] call _handleStatsFnc; - }; - case IDC_buttonCurrentMag; - case IDC_buttonCurrentMag2; - case IDC_buttonMag; - case IDC_buttonMagALL: { - [4, false] call _handleStatsFnc; - }; - case IDC_buttonThrow: { - [5, false] call _handleStatsFnc; - }; - case IDC_buttonPut: { - [6, false] call _handleStatsFnc; - }; - case IDC_buttonMisc: { - [7, false] call _handleStatsFnc; - }; - }; - }; -} else { - - [[1, 2, 3, 4, 5]] call _hideUnusedFnc; + // Hide the stats box _statsBoxCtrl ctrlSetPosition [ (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, safezoneY + 1.8 * GRID_H, - 47 * GRID_W, - 11 * GRID_H + 0, + 0 ]; _statsBoxCtrl ctrlCommit 0; + // Move action display + private _ctrl = _display displayCtrl IDC_actionsBox; + private _pos = ctrlPosition _ctrl; + _pos set [1, safezoneY + 1.8 * GRID_H]; + _ctrl ctrlSetPosition _pos; + _ctrl ctrlCommit 0; + { _x ctrlSetFade 1; _x ctrlCommit 0; @@ -242,3 +75,187 @@ if (!isNil "_itemCfg") then { _statsCurrentPageCtrl ]; }; + +// If nothing is chosen, hide stats +if (isNull _itemCfg) exitWith { + call _fnc_hideEverything +}; + +private _fnc_handleStats = { + params ["_statsIndex", "_leftPanel"]; + + private _statsPanel = [GVAR(statsListRightPanel), GVAR(statsListLeftPanel)] select _leftPanel; + + // Get all viable stats for this tab + private _statsTab = _statsPanel select _statsIndex select { + _x params ["", "_configEntry", "", "", "_statements"]; + _statements params ["", "", ["_condition", {true}, [{}]]]; + + ([_configEntry, _itemCfg] call _condition) + }; + + // If there are no stats to show (unlikely), just hide everything + if (_statsTab isEqualTo []) exitWith { + call _fnc_hideEverything + }; + + GVAR(currentStatPage) = GVAR(currentStatPage) min floor ((count _statsTab) / 5); + private _statsToDisplay = _statsTab select [GVAR(currentStatPage) * 5, 5]; + + + private _statsCount = 0; + + private _statsTitleCtrl = controlNull; + private _statsTitleIDC = -1; + private _statsBackgroundCtrl = controlNull; + private _statsBarCtrl = controlNull; + private _statsTextCtrl = controlNull; + private _textStatementResult = ""; + + { + _x params ["", "_configEntry", "_title", "_bools", "_statements"]; + _bools params ["_showBar", "_showText"]; + _statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]]; + + _statsTitleCtrl = _display displayCtrl (IDC_statsTitle1 + _forEachIndex * 4); + _statsTitleIDC = ctrlIDC _statsTitleCtrl; + _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1); + _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2); + _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3); + + _statsCount = _statsCount + 1; + _statsTitleCtrl ctrlSetText _title; + _statsTitleCtrl ctrlSetFade 0; + + // Handle bars + if (_showBar) then { + _statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement); + _statsBackgroundCtrl ctrlSetFade 0; + _statsBarCtrl ctrlSetFade 0; + } else { + _statsBackgroundCtrl ctrlSetFade 1; + _statsBarCtrl ctrlSetFade 1; + }; + + // Handle text entries + if (_showText) then { + _textStatementResult = [_configEntry, _itemCfg] call _textStatement; + + if !(_textStatementResult isEqualtype "") then { + _textStatementResult = str _textStatementResult; + }; + + _statsTextCtrl ctrlSetText _textStatementResult; + _statsTextCtrl ctrlSetTextColor ([[1, 1, 1, 1], [0, 0, 0, 1]] select (_showBar)); + _statsTextCtrl ctrlSetFade 0; + } else { + _statsTextCtrl ctrlSetFade 1; + }; + + { + _x ctrlCommit 0; + } forEach [ + _statsTitleCtrl, + _statsBackgroundCtrl, + _statsBarCtrl, + _statsTextCtrl + ]; + } forEach _statsToDisplay; + + + // Resize the window + (5 - _statsCount) call _fnc_hideUnused; + private _height = 10 * _statsCount + 5; + _statsBoxCtrl ctrlSetPosition [ + (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, + safezoneY + 1.8 * GRID_H, + 47 * GRID_W, + _height * GRID_H + ]; + _statsBoxCtrl ctrlCommit 0; + + // Move the actions box + private _ctrl = _display displayCtrl IDC_actionsBox; + private _pos = ctrlPosition _ctrl; + _pos set [1, safezoneY + (_height + 3.6) * GRID_H]; + _ctrl ctrlSetPosition _pos; + _ctrl ctrlCommit 0; + + + GVAR(statsInfo) = [_leftPanel, _control, _curSel, _itemCfg]; + + // Toggle page buttons + _statsPreviousPageCtrl ctrlEnable (GVAR(currentStatPage) > 0); + _statsNextPageCtrl ctrlEnable ((GVAR(currentStatPage) + 1) * 5 < count _statsTab); + _statsCurrentPageCtrl ctrlSetText ([LLSTRING(page), str (GVAR(currentStatPage) + 1)] joinString " "); + + { + _x ctrlSetFade 0; + _x ctrlCommit 0; + } forEach [ + _statsPreviousPageCtrl, + _statsNextPageCtrl, + _statsCurrentPageCtrl + ]; +}; + +// Check if in left or right panel +if (ctrlIDC _control == IDC_leftTabContent) then { + // Faces, voices and insigna do not have stats + if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia] find GVAR(currentLeftPanel) > -1) then { + call _fnc_hideEverything; + } else { + [[ + IDC_buttonPrimaryWeapon, + IDC_buttonHandgun, + IDC_buttonSecondaryWeapon, + IDC_buttonUniform, + IDC_buttonVest, + IDC_buttonBackpack, + IDC_buttonHeadgear, + IDC_buttonGoggles, + IDC_buttonNVG, + IDC_buttonBinoculars, + IDC_buttonMap, + IDC_buttonGPS, + IDC_buttonRadio, + IDC_buttonCompass, + IDC_buttonWatch + ] find GVAR(currentLeftPanel), true] call _fnc_handleStats; + }; +} else { + switch (GVAR(currentRightPanel)) do { + case IDC_buttonOptic: { + [0, false] call _fnc_handleStats; + }; + case IDC_buttonItemAcc: { + [1, false] call _fnc_handleStats; + }; + case IDC_buttonMuzzle: { + [2, false] call _fnc_handleStats; + }; + case IDC_buttonBipod: { + [3, false] call _fnc_handleStats; + }; + case IDC_buttonCurrentMag; + case IDC_buttonCurrentMag2; + case IDC_buttonMag; + case IDC_buttonMagALL: { + [4, false] call _fnc_handleStats; + }; + case IDC_buttonThrow: { + [5, false] call _fnc_handleStats; + }; + case IDC_buttonPut: { + [6, false] call _fnc_handleStats; + }; + case IDC_buttonMisc: { + [7, false] call _fnc_handleStats; + }; + default { + if (GVAR(currentRightPanel) in [RIGHT_PANEL_CUSTOM_BUTTONS]) then { + [7, false] call _fnc_handleStats; + }; + }; + }; +}; diff --git a/addons/arsenal/functions/fnc_initBox.sqf b/addons/arsenal/functions/fnc_initBox.sqf index 1343a20f63..446438d2b5 100644 --- a/addons/arsenal/functions/fnc_initBox.sqf +++ b/addons/arsenal/functions/fnc_initBox.sqf @@ -1,12 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Initialize a box / object for arsenal. * * Arguments: * 0: Target - * 1: Items or - * 2: Initialize globally + * 1: Items + * 2: Initialize globally (default: true) * * Return Value: * None @@ -22,40 +22,36 @@ params [["_object", objNull, [objNull]], ["_items", true, [[], true]], ["_global if (isNull _object) exitWith {}; -if (isNil QGVAR(EHIDArray)) then { - GVAR(EHIDArray) = []; -}; +if (_global && {isMultiplayer} && {isNil {_object getVariable QGVAR(initBoxJIP)}}) then { + private _id = [QGVAR(initBox), [_object, _items, false]] call CBA_fnc_globalEventJIP; -if (_global && {isMultiplayer} && {{_object in _x} count GVAR(EHIDArray) == 0}) then { + // Remove JIP EH if object is deleted + [_id, _object] call CBA_fnc_removeGlobalEventJIP; - private _ID = [QGVAR(initBox), [_object, _items, false]] call CBA_fnc_globalEventJIP; - [_ID, _object] call CBA_fnc_removeGlobalEventJIP; - - GVAR(EHIDArray) pushBack [_ID, _object]; - publicVariable QGVAR(EHIDArray); + // Save JIP ID + _object setVariable [QGVAR(initBoxJIP), _id, true]; } else { + // Only add interaction if there isn't one already present + if (((_object getVariable [QEGVAR(interact_menu,actions), []]) findIf {((_x select 0) select 0) == QGVAR(interaction)}) != -1) exitWith {}; - if ({(_x select 0) select 0 isEqualTo QGVAR(interaction)} count (_object getVariable [QEGVAR(interact_menu,actions), []]) == 0) then { + private _action = [ + QGVAR(interaction), + localize "STR_A3_Arsenal", + "", + { + params ["_target", "_player"]; - private _action = [ - QGVAR(interaction), - localize "STR_A3_Arsenal", - "", - { - params ["_target", "_player"]; + [_target, _player] call FUNC(openBox); + }, + { + params ["_target", "_player"]; - [_target, _player] call FUNC(openBox); - }, - { - params ["_target", "_player"]; + [_player, _target] call EFUNC(common,canInteractWith) + } + ] call EFUNC(interact_menu,createAction); + [_object, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject); - [_player, _target] call EFUNC(common,canInteractWith) - }, - {}, - [] - ] call EFUNC(interact_menu,createAction); - [_object, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject); + [_object, _items, false] call FUNC(addVirtualItems); - [_object, _items, false] call FUNC(addVirtualItems); - }; + [QGVAR(boxInitialized), [_object, _items]] call CBA_fnc_localEvent; }; diff --git a/addons/arsenal/functions/fnc_itemInfo.sqf b/addons/arsenal/functions/fnc_itemInfo.sqf index 85a848c3bd..676783a8b5 100644 --- a/addons/arsenal/functions/fnc_itemInfo.sqf +++ b/addons/arsenal/functions/fnc_itemInfo.sqf @@ -1,13 +1,14 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Update arsenal's info box. * * Arguments: * 0: Arsenal display * 1: Current panel control - * 2: Current panel selection + * 2: Current panel selection * 3: Item config entry * * Return Value: @@ -16,63 +17,60 @@ * Public: No */ -params ["_display", "_control", "_curSel" ,"_itemCfg"]; +params ["_display", "_control", "_curSel", "_itemCfg"]; private _ctrlInfo = _display displayCtrl IDC_infoBox; if (isClass _itemCfg) then { - _ctrlInfo ctrlSetFade 0; _ctrlInfo ctrlCommit FADE_DELAY; [QGVAR(displayStats), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent; + [QGVAR(displayActions), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent; // Name + author - private _ctrlInfoName = _display displayCtrl IDC_infoName; - _ctrlInfoName ctrlSetText ([_control lbText _curSel, _control lnbText [_curSel, 1]] select (ctrlType _control == 102)); - - private _ctrlInfoAuthor = _display displayctrl IDC_infoAuthor; - _ctrlInfoAuthor ctrlSetText ""; + (_display displayCtrl IDC_infoName) ctrlSetText ([_control lbText _curSel, _control lnbText [_curSel, 1]] select (ctrlType _control == CT_LISTNBOX)); private _itemAuthor = getText (_itemCfg >> "author"); - _ctrlInfoAuthor ctrlSetText ([localize "STR_AUTHOR_UNKNOWN", format [localize "STR_FORMAT_AUTHOR_SCRIPTED",_itemAuthor]] select (_itemAuthor != "")); + (_display displayctrl IDC_infoAuthor) ctrlSetText ([localize "STR_AUTHOR_UNKNOWN", format [localize "STR_FORMAT_AUTHOR_SCRIPTED", _itemAuthor]] select (_itemAuthor != "")); // DLC / mod icon private _ctrlDLC = _display displayctrl IDC_DLCIcon; private _ctrlDLCBackground = _display displayctrl IDC_DLCBackground; - private _dlc = _itemCfg call GETDLC; + private _dlc = _itemCfg call EFUNC(common,getAddon); + if (_dlc != "") then { + (modParams [_dlc, ["name", "logo", "logoOver"]]) params ["_name", "_logo", "_logoOver"]; - private _dlcParams = modParams [_dlc, ["name", "logo", "logoOver"]]; - _dlcParams params ["_name", "_logo", "_logoOver"]; - private _appId = getnumber (configfile >> "CfgMods" >> _dlc >> "appId"); + _ctrlDLC ctrlSetTooltip _name; + _ctrlDLC ctrlSetText _logo; + _ctrlDLCBackground ctrlSetFade 0; + _ctrlDLC ctrlSetFade 0; - _ctrlDLC ctrlsettooltip _name; - _ctrlDLC ctrlsettext _logo; - _ctrlDLCBackground ctrlsetfade 0; - _ctrlDLC ctrlsetfade 0; - if (_appId > 0) then { - _ctrlDLC ctrlseteventhandler ["mouseexit",format ["(_this select 0) ctrlsettext '%1';",_logo]]; - _ctrlDLC ctrlseteventhandler ["mouseenter",format ["(_this select 0) ctrlsettext '%1';",_logoOver]]; - _ctrlDLC ctrlseteventhandler [ - "buttonclick", - format ["uiNamespace setvariable ['RscDisplayDLCPreview_dlc','%1']; ctrlparent (_this select 0) createDisplay 'RscDisplayDLCPreview';", _dlc] + // If an item is from a DLC, set it so when you press the icon on the bottom right it opens the DLC page + if ((getNumber (configfile >> "CfgMods" >> _dlc >> "appId")) > 0) then { + _ctrlDLC ctrlSetEventHandler ["MouseExit", format ["(_this select 0) ctrlSetText '%1';", _logo]]; + _ctrlDLC ctrlSetEventHandler ["MouseEnter", format ["(_this select 0) ctrlSetText '%1';", _logoOver]]; + _ctrlDLC ctrlSetEventHandler [ + "ButtonClick", + format ["uiNamespace setVariable ['RscDisplayDLCPreview_dlc','%1']; ctrlParent (_this select 0) createDisplay 'RscDisplayDLCPreview';", _dlc] ]; } else { - _ctrlDLC ctrlRemoveAllEventHandlers "buttonclick"; - _ctrlDLC ctrlRemoveAllEventHandlers "mouseexit"; - _ctrlDLC ctrlRemoveAllEventHandlers "mouseenter"; + _ctrlDLC ctrlRemoveAllEventHandlers "MouseExit"; + _ctrlDLC ctrlRemoveAllEventHandlers "MouseEnter"; + _ctrlDLC ctrlRemoveAllEventHandlers "ButtonClick"; }; } else { - _ctrlDLC ctrlsetfade 1; - _ctrlDLCBackground ctrlsetfade 1; + _ctrlDLC ctrlSetFade 1; + _ctrlDLCBackground ctrlSetFade 1; }; - _ctrlDLC ctrlcommit 0; - _ctrlDLCBackground ctrlcommit 0; + _ctrlDLC ctrlCommit 0; + _ctrlDLCBackground ctrlCommit 0; } else { [QGVAR(displayStats), [_display, _control, -1, nil]] call CBA_fnc_localEvent; + [QGVAR(displayActions), [_display, _control, -1, nil]] call CBA_fnc_localEvent; _ctrlInfo ctrlSetFade 1; _ctrlInfo ctrlCommit FADE_DELAY; diff --git a/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf b/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf index 220cb697f2..a0203ff5b9 100644 --- a/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf +++ b/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -27,7 +27,6 @@ private _renameButtonCtrl = _display displayCtrl IDC_buttonRename; // Update UI visual elements if (GVAR(currentLoadoutsTab) != -1) then { - private _previousCtrlBackground = _display displayCtrl (GVAR(currentLoadoutsTab) - 1); _previousCtrlBackground ctrlSetBackgroundColor [0, 0, 0, 0.8]; _previousCtrlBackground ctrlCommit 0; @@ -45,26 +44,36 @@ _control ctrlSetTextColor [0, 0, 0, 1]; _control ctrlCommit 0; switch (ctrlIDC _control) do { + // Local loadouts case IDC_buttonMyLoadouts: { - _centerBoxTitleCtrl ctrlSetText (localize LSTRING(tabMyLoadoutsText)); + _centerBoxTitleCtrl ctrlSetText LLSTRING(tabMyLoadoutsText); + + if (call FUNC(canEditDefaultLoadout)) then { + _saveButtonCtrl ctrlSetTooltip format ["%1\n%2", LLSTRING(buttonSaveTooltip), LLSTRING(buttonSaveTooltip_shiftClick)]; + }; - if (is3den) then { _saveButtonCtrl ctrlSetTooltip format ["%1\n%2", localize LSTRING(buttonSaveTooltip), localize LSTRING(buttonSaveTooltip_shiftClick)]; }; _saveButtonCtrl ctrlEnable true; _saveButtonCtrl ctrlCommit 0; }; - + // Default loadouts case IDC_buttonDefaultLoadouts: { - _centerBoxTitleCtrl ctrlSetText (localize LSTRING(tabDefaultLoadoutsText)); + _centerBoxTitleCtrl ctrlSetText LLSTRING(tabDefaultLoadoutsText); - if (is3den) then { _saveButtonCtrl ctrlSetTooltip localize LSTRING(buttonSaveTooltip); }; - _saveButtonCtrl ctrlEnable (is3DEN); + if (call FUNC(canEditDefaultLoadout)) then { + _saveButtonCtrl ctrlSetTooltip LLSTRING(buttonSaveTooltip); + }; + + _saveButtonCtrl ctrlEnable call FUNC(canEditDefaultLoadout); _saveButtonCtrl ctrlCommit 0; }; - + // Shared loadouts case IDC_buttonSharedLoadouts: { - _centerBoxTitleCtrl ctrlSetText (localize LSTRING(tabSharedLoadoutsText)); + _centerBoxTitleCtrl ctrlSetText LLSTRING(tabSharedLoadoutsText); + + if (call FUNC(canEditDefaultLoadout)) then { + _saveButtonCtrl ctrlSetTooltip LLSTRING(buttonSaveTooltip); + }; - if (is3den) then { _saveButtonCtrl ctrlSetTooltip localize LSTRING(buttonSaveTooltip); }; _saveButtonCtrl ctrlEnable false; _saveButtonCtrl ctrlCommit 0; }; @@ -73,8 +82,9 @@ switch (ctrlIDC _control) do { { _x ctrlEnable false; _x ctrlCommit 0; -} foreach [_shareButtonCtrl, _loadButtonCtrl, _deleteButtonCtrl, _renameButtonCtrl]; +} forEach [_shareButtonCtrl, _loadButtonCtrl, _deleteButtonCtrl, _renameButtonCtrl]; +// Save new tab as current tab GVAR(currentLoadoutsTab) = ctrlIDC _control; [QGVAR(loadoutsTabChanged), [_display, _control]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_message.sqf b/addons/arsenal/functions/fnc_message.sqf index f3e6abb3e6..b20689f6b9 100644 --- a/addons/arsenal/functions/fnc_message.sqf +++ b/addons/arsenal/functions/fnc_message.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -19,6 +19,7 @@ params ["_display", "_message"]; private _messageBoxCtrl = _display displayCtrl IDC_message; private _handle = _messageBoxCtrl getVariable QGVAR(messageBoxHandle); +// Stop previous message being displayed if (!isNil "_handle") then { terminate _handle; }; @@ -26,29 +27,30 @@ if (!isNil "_handle") then { _handle = [_display, _messageBoxCtrl, time + 5, _message, FADE_DELAY] spawn { disableSerialization; - _this params ["_display", "_control", "_timer", "_message", "_delay"]; + params ["_display", "_control", "_timer", "_message", "_delay"]; + + // Refresh message box, in case previous message box is still shown + _control ctrlSetText _message; + _control ctrlSetFade 1; + _control ctrlCommit 0; + + _control ctrlSetFade 0; + _control ctrlCommit _delay; while {_timer >= time} do { - switch true do { - case (_display isEqualTo displayNull): { - terminate _thisScript; - }; - - case (round (_timer - time) == 5): { - _control ctrlSetText _message; - _control ctrlSetFade 1; - _control ctrlCommit 0; - - _control ctrlSetFade 0; - _control ctrlCommit _delay; - }; + // If the display has been closed, quit + if (isNull _display) then { + terminate _thisScript; }; uiSleep 1; }; + // Hide message box and finish _control ctrlSetFade 1; _control ctrlCommit _delay; + terminate _thisScript; }; + _messageBoxCtrl setVariable [QGVAR(messageBoxHandle), _handle]; diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index 328c1da1f2..4eb8126e68 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -1,10 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * onUnLoad EH for arsenal. * * Arguments: - * None + * 0: Not used + * 1: Args + * - 0: Not used + * - 1: Exit code * * Return Value: * None @@ -14,13 +17,10 @@ (_this select 1) params ["", "_exitCode"]; -private _cameraData = [getposAtl GVAR(camera), (getposAtl GVAR(camera)) vectorFromTo (getposAtl GVAR(cameraHelper))]; - [QGVAR(displayClosed), []] call CBA_fnc_localEvent; removeMissionEventHandler ["draw3D", GVAR(camPosUpdateHandle)]; if (is3DEN) then { - private _centerOriginParent = objectParent GVAR(centerOrigin); if !(isNull _centerOriginParent) then { @@ -31,11 +31,14 @@ if (is3DEN) then { // Apply the loadout from the dummy to all selected units if (_exitCode == 1) then { - { - _x setUnitLoadout (getUnitLoadout GVAR(center)); - } foreach (get3DENSelected "object"); + private _extendedLoadout = GVAR(center) call CBA_fnc_getLoadout; + private _objects = get3DENSelected "object"; - save3DENInventory (get3DENSelected "object"); + { + [_x, _extendedLoadout] call CBA_fnc_setLoadout; + } forEach _objects; + + save3DENInventory _objects; }; deleteVehicle GVAR(light); @@ -44,21 +47,21 @@ if (is3DEN) then { GVAR(centerOrigin) = nil; GVAR(light) = nil; - get3DENCamera cameraEffect ["internal","back"]; - ["ShowInterface",true] call bis_fnc_3DENInterface; - GVAR(visionMode) call bis_fnc_3DENVisionMode; + get3DENCamera cameraEffect ["Internal", "BACK"]; + ["ShowInterface", true] call BIS_fnc_3DENInterface; + GVAR(visionMode) call BIS_fnc_3DENVisionMode; } else { // Select correct weapon - switch GVAR(selectedWeaponType) do { - case 0: {GVAR(center) selectWeapon primaryWeapon GVAR(center);}; - case 1: {GVAR(center) selectWeapon secondaryWeapon GVAR(center);}; - case 2: {GVAR(center) selectWeapon handgunWeapon GVAR(center);}; + switch (GVAR(selectedWeaponType)) do { + case 0: {GVAR(center) selectWeapon (primaryWeapon GVAR(center))}; + case 1: {GVAR(center) selectWeapon (secondaryWeapon GVAR(center))}; + case 2: {GVAR(center) selectWeapon (handgunWeapon GVAR(center))}; }; - if (!(isnull curatorCamera) && {ACE_player == player}) then { - curatorcamera cameraEffect ["internal","back"]; + if (!isNull curatorCamera && {ACE_player == player}) then { + curatorCamera cameraEffect ["Internal", "BACK"]; } else { - GVAR(camera) cameraEffect ["terminate","back"]; + GVAR(camera) cameraEffect ["Terminate", "BACK"]; }; }; @@ -80,12 +83,13 @@ if (!isNull curatorCamera) then { curatorCamera setVectorDirAndUp _dirAndUp; }; -if (isMultiplayer) then { - [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(center) + "_face"] call CBA_fnc_globalEventJIP; - [QGVAR(center) + "_face", GVAR(center)] call CBA_fnc_removeGlobalEventJIP; +// Make face and voice selection JIP compatible; 3DEN doesn't need this though +if (isMultiplayer && {!is3DEN}) then { + private _id = [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(centerFace_) + netId GVAR(center)] call CBA_fnc_globalEventJIP; + [_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP; - [QGVAR(broadcastVoice), [GVAR(center), GVAR(currentVoice)], QGVAR(center) + "_voice"] call CBA_fnc_globalEventJIP; - [QGVAR(center) + "_voice", GVAR(center)] call CBA_fnc_removeGlobalEventJIP; + _id = [QGVAR(broadcastVoice), [GVAR(center), GVAR(currentVoice)], QGVAR(centerVoice_) + netId GVAR(center)] call CBA_fnc_globalEventJIP; + [_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP; }; GVAR(currentBox) = objNull; @@ -104,10 +108,12 @@ GVAR(shiftState) = nil; GVAR(leftTabFocus) = nil; GVAR(rightTabFocus) = nil; GVAR(rightTabLnBFocus) = nil; +GVAR(ignoreFirstSortPanelCall) = nil; GVAR(selectedWeaponType) = nil; GVAR(virtualItems) = nil; GVAR(virtualItemsFlat) = nil; +GVAR(virtualItemsFlatAll) = nil; GVAR(currentItems) = nil; GVAR(currentFace) = nil; GVAR(currentVoice) = nil; @@ -115,10 +121,16 @@ GVAR(currentInsignia) = nil; GVAR(currentAction) = nil; GVAR(showStats) = nil; -GVAR(statsPagesLeft) = nil; -GVAR(statsPagesRight) = nil; +GVAR(currentStatPage) = nil; GVAR(statsInfo) = nil; +GVAR(showActions) = nil; +GVAR(currentActionPage) = nil; + +profileNamespace setVariable [QGVAR(favorites), GVAR(favorites)]; +GVAR(favoritesOnly) = nil; +GVAR(favorites) = nil; + GVAR(center) = nil; GVAR(centerNotPlayer) = nil; diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf index 34243a49f6..74ef584cc9 100644 --- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf +++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * onLoad EH for arsenal. * * Arguments: - * 0: Ignored + * 0: Not used * 1: Arguments - * 1.1: Arsenal display + * - 0: Arsenal display * * Return Value: * None @@ -23,7 +23,7 @@ if (isNil QGVAR(center)) then { GVAR(center) = player; }; -GVAR(mouseButtonState) = [[],[]]; +GVAR(mouseButtonState) = [[], []]; if (isNil QGVAR(sharedLoadoutsNamespace)) then { GVAR(sharedLoadoutsNamespace) = true call CBA_fnc_createNamespace; @@ -36,170 +36,71 @@ if (isNil {GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars)}) if (isNil QGVAR(defaultLoadoutsList)) then { if (is3DEN) then { - GVAR(defaultLoadoutsList) = (QGVAR(DummyCategory) get3DENMissionAttribute QGVAR(DefaultLoadoutsListAttribute)); + GVAR(defaultLoadoutsList) = QGVAR(DummyCategory) get3DENMissionAttribute QGVAR(DefaultLoadoutsListAttribute); } else { GVAR(defaultLoadoutsList) = []; }; }; if (isNil QGVAR(virtualItems)) then { - GVAR(virtualItems) = [[[], [], []], [[], [], [], []], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]; + private _virtualItems = [ + [IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]], + [IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]] + ]; + + _virtualItems = createHashMapFromArray _virtualItems; + + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _virtualItems set [_index, createHashMap]; + }; + + GVAR(virtualItems) = _virtualItems; + + // Flatten out hashmaps for easy checking later + private _virtualItemsFlat = +_virtualItems; + private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS; + private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS; + + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true]; + }; + + for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do { + _virtualItemsFlat merge [_weapons deleteAt _index, true]; + }; + + for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do { + _virtualItemsFlat merge [_attachments deleteAt _index, true]; + }; + + GVAR(virtualItemsFlat) = _virtualItemsFlat; }; -GVAR(currentItems) = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", [], [], [], [], [], []]; +GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat); GVAR(currentFace) = face GVAR(center); GVAR(currentVoice) = speaker GVAR(center); -GVAR(currentInsignia) = GVAR(center) param [0, objNull, [objNull]] getVariable ["BIS_fnc_setUnitInsignia_class", ""]; +GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia; GVAR(currentAction) = "Stand"; GVAR(shiftState) = false; GVAR(showStats) = true; -GVAR(statsPagesLeft) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; -GVAR(statsPagesRight) = [0, 0, 0, 0, 0, 0, 0, 0]; -GVAR(statsInfo) = [true, 0, controlNull, nil, nil]; +GVAR(currentStatPage) = 0; +GVAR(statsInfo) = [true, controlNull, nil, nil]; -// Cache assignedItems -private _assignedItems = (getUnitLoadout GVAR(center)) select 9; +GVAR(showActions) = true; +GVAR(currentActionPage) = 0; -// Add the items the player has to virtualItems -for "_index" from 0 to 14 do { - switch (_index) do { - // primary, secondary, handgun weapons - case IDX_VIRT_WEAPONS: { - private _array = LIST_DEFAULTS select _index; +// Update current item list +call FUNC(updateCurrentItemsList); - if ((_array select 0) isNotEqualTo "") then { - ((GVAR(virtualItems) select _index) select 0) pushBackUnique (_array select 0); - }; +// Setup favorites button text and switch to default mode defined by setting +[_display, _display displayCtrl IDC_buttonFavorites] call FUNC(buttonFavorites); +GVAR(favorites) = profileNamespace getVariable [QGVAR(favorites), createHashMap]; - if ((_array select 1) isNotEqualTo "") then { - ((GVAR(virtualItems) select _index) select 1) pushBackUnique (_array select 1); - }; - - if ((_array select 2) isNotEqualTo "") then { - ((GVAR(virtualItems) select _index) select 2) pushBackUnique (_array select 2); - }; - }; - - // Accs for the weapons above - case IDX_VIRT_ATTACHEMENTS: { - private _array = LIST_DEFAULTS select _index; - _array params ["_accsArray", "_magsArray"]; - - { - private _subIndex = _forEachIndex; - - { - if (_x != "") then { - (GVAR(virtualItems) select _index) select ([2, 1, 0, 3] select _forEachIndex) pushBackUnique _x; - }; - } forEach _x; - } forEach _accsArray; - - { - if (_x isNotEqualTo []) then { - - if (_x select 0 != "") then { - (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) pushBackUnique (_x select 0); - }; - - if (count _x > 1 && {_x select 1 != ""}) then { - (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) pushBackUnique (_x select 1); - }; - }; - } forEach _magsArray; - }; - - // Assigned items - case IDX_VIRT_MAP: { (GVAR(virtualItems) select _index) pushBackUnique (_assignedItems select 0) }; - case IDX_VIRT_COMMS: { (GVAR(virtualItems) select _index) pushBackUnique (_assignedItems select 1) }; - case IDX_VIRT_RADIO: { (GVAR(virtualItems) select _index) pushBackUnique (_assignedItems select 2) }; - case IDX_VIRT_COMPASS: { (GVAR(virtualItems) select _index) pushBackUnique (_assignedItems select 3) }; - case IDX_VIRT_WATCH: { (GVAR(virtualItems) select _index) pushBackUnique (_assignedItems select 4) }; - - - // Inventory items - case IDX_VIRT_ITEMS_ALL: { - call FUNC(updateUniqueItemsList); - }; - - // The rest - default { - private _array = (LIST_DEFAULTS select _index) select {_x isNotEqualTo ""}; - if (_array isNotEqualTo []) then { - {(GVAR(virtualItems) select _index) pushBackUnique _x} forEach _array; - }; - }; - }; -}; - -// Fill current items -for "_index" from 0 to 15 do { - switch (_index) do { - case 0; - case 1; - case 2:{ - GVAR(currentItems) set [_index, ((LIST_DEFAULTS select 0) select _index)]; - }; - case 3; - case 4; - case 5; - case 6; - case 7; - case 8; - case 9: { - GVAR(currentItems) set [_index, (LIST_DEFAULTS select _index) select 0]; - - }; - case 10: { - {(GVAR(currentItems) select 15) pushBack _x} forEach (uniformItems GVAR(center)); - }; - case 11: { - {(GVAR(currentItems) select 16) pushBack _x} forEach (vestItems GVAR(center)); - }; - case 12: { - {(GVAR(currentItems) select 17) pushBack _x} forEach (backpackItems GVAR(center)); - }; - case 13: { - GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + (primaryWeaponMagazine GVAR(center))]; - }; - case 14: { - GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + (secondaryWeaponMagazine GVAR(center))]; - }; - case 15: { - GVAR(currentItems) set [20, (handgunItems GVAR(center)) + (handgunMagazine GVAR(center))]; - }; - }; -}; - -{ - switch (_forEachIndex) do { - case 0: { // Map - GVAR(currentItems) set [10, _x]; - }; - case 1: { // GPS - GVAR(currentItems) set [14, _x]; - }; - case 2: { // Radio - GVAR(currentItems) set [12, _x]; - }; - case 3: { // Compass - GVAR(currentItems) set [11, _x]; - }; - case 4: { // Watch - GVAR(currentItems) set [13, _x]; - }; - }; -} forEach _assignedItems; - -GVAR(currentWeaponType) = switch true do { - case (currentWeapon GVAR(center) == GVAR(currentItems) select 0): {0}; - case (currentWeapon GVAR(center) == GVAR(currentItems) select 1): {1}; - case (currentWeapon GVAR(center) == GVAR(currentItems) select 2): {2}; - default {-1}; -}; +// This takes care of unique inventory items and unique equipment (arsenal doesn't have items/equipment whitelisted) +call FUNC(updateUniqueItemsList); [QGVAR(displayOpened), [_display]] call CBA_fnc_localEvent; @@ -239,7 +140,15 @@ _statsBoxCtrl ctrlSetPosition [ _statsBoxCtrl ctrlEnable false; _statsBoxCtrl ctrlCommit 0; -(_display displayCtrl IDC_statsButton) ctrlShow false; +// Handle actions +private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox; +_actionsBoxCtrl ctrlSetPosition [ + (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, + safezoneY + 58.6 * GRID_H, + 47 * GRID_W, + 11 * GRID_H +]; +_actionsBoxCtrl ctrlCommit 0; // Disable import in MP if (isMultiplayer) then { @@ -250,7 +159,7 @@ if (isMultiplayer) then { }; //--------------- Camera prep -cutText ["","plain"]; +cutText ["", "PLAIN"]; showCommandingMenu ""; GVAR(cameraView) = cameraView; @@ -260,73 +169,71 @@ GVAR(center) switchCamera "internal"; private _mouseAreaCtrl = _display displayCtrl IDC_mouseArea; ctrlSetFocus _mouseAreaCtrl; +private _centerPos = position GVAR(center); + // 3DEN support, lifted from BIS_fnc_arsenal if (is3DEN) then { - GVAR(centerOrigin) = GVAR(center); GVAR(centerOrigin) hideObject true; private _centerOriginParent = objectParent GVAR(centerOrigin); + if !(isNull _centerOriginParent) then { _centerOriginParent hideObject true; }; - private _centerPos = position GVAR(centerOrigin); - - GVAR(center) = createAgent [typeOf GVAR(centerOrigin), position GVAR(centerOrigin), [], 0, "none"]; - GVAR(center) setPosAtl getPosAtl GVAR(centerOrigin); + GVAR(center) = createAgent [typeOf GVAR(centerOrigin), _centerPos, [], 0, "none"]; + GVAR(center) setPosATL getPosATL GVAR(centerOrigin); GVAR(center) setDir (getDir GVAR(centerOrigin)); GVAR(center) switchMove animationState GVAR(centerOrigin); - GVAR(center) switchAction "playerstand"; + GVAR(center) switchAction "playerStand"; GVAR(center) enableSimulation false; - GVAR(center) setUnitLoadout (getUnitLoadout GVAR(centerOrigin)); - GVAR(center) setFace GVAR(currentFace); - GVAR(center) setSpeaker GVAR(currentVoice); + [GVAR(center), GVAR(centerOrigin) call CBA_fnc_getLoadout] call CBA_fnc_setLoadout; //--- Create light for night editing (code based on BIS_fnc_3DENFlashlight) - private _intensity = 1; GVAR(light) = "#lightpoint" createVehicle _centerPos; - GVAR(light) setLightBrightness _intensity; - GVAR(light) setLightAmbient [1,1,1]; - GVAR(light) setLightColor [0,0,0]; - GVAR(light) lightAttachObject [GVAR(centerOrigin), [0, 0, -_intensity * 7]]; + GVAR(light) setLightBrightness 1; + GVAR(light) setLightAmbient [1, 1, 1]; + GVAR(light) setLightColor [0, 0, 0]; + GVAR(light) lightAttachObject [GVAR(centerOrigin), [0, 0, -7]]; //--- Use the same vision mode as in Eden - GVAR(visionMode)= -2 call bis_fnc_3DENVisionMode; - ["ShowInterface",false] spawn bis_fnc_3DENInterface; - if (get3denactionstate "togglemap" > 0) then {do3DENAction "togglemap";}; + GVAR(visionMode) = -2 call BIS_fnc_3DENVisionMode; + ["ShowInterface", false] spawn BIS_fnc_3DENInterface; + + if (get3DENActionState "toggleMap" > 0) then { + do3DENAction "toggleMap"; + }; + + private _ctrl = controlNull; { - private _ctrl = _display displayctrl _x; + _ctrl = _display displayCtrl _x; + _ctrl ctrlEnable false; _ctrl ctrlSetFade 0.6; _ctrl ctrlCommit 0; - } forEach [ - IDC_buttonFace, - IDC_buttonVoice, - IDC_buttonInsignia - ]; + } forEach [IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia]; - _buttonCloseCtrl = _display displayCtrl IDC_menuBarClose; + private _buttonCloseCtrl = _display displayCtrl IDC_menuBarClose; _buttonCloseCtrl ctrlSetText (localize "str_ui_debug_but_apply"); } else { - GVAR(centerNotPlayer) = (GVAR(center) != player); + GVAR(centerNotPlayer) = GVAR(center) != player; if (currentVisionMode ACE_Player == 1) then { GVAR(center) action ["NVGogglesOff", GVAR(center)]; }; + private _ctrl = controlNull; + { - private _ctrl = _display displayCtrl _x; + _ctrl = _display displayCtrl _x; + _ctrl ctrlEnable GVAR(enableIdentityTabs); _ctrl ctrlSetFade ([0.6, 0] select GVAR(enableIdentityTabs)); _ctrl ctrlCommit 0; - } forEach [ - IDC_buttonFace, - IDC_buttonVoice, - IDC_buttonInsignia - ]; + } forEach [IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia]; }; //--------------- Prepare the left panel @@ -337,6 +244,7 @@ GVAR(rightSearchbarFocus) = false; GVAR(leftTabFocus) = false; GVAR(rightTabFocus) = false; GVAR(rightTabLnBFocus) = false; +GVAR(ignoreFirstSortPanelCall) = false; { private _panel = _display displayCtrl _x; @@ -348,26 +256,28 @@ GVAR(rightTabLnBFocus) = false; //--------------- Init camera if (isNil QGVAR(cameraPosition)) then { - GVAR(cameraPosition) = [5,0,0,[0,0,0.85]]; + GVAR(cameraPosition) = [5, 0, 0, [0, 0, 0.85]]; }; // Save curator camera state so camera position and direction are not modified while using arsenal -if (!isNull curatorCamera) then { - GVAR(curatorCameraData) = [getPosASL curatorCamera, [vectorDir curatorCamera, vectorUp curatorCamera]]; +private _curatorCamera = curatorCamera; + +if (!isNull _curatorCamera) then { + GVAR(curatorCameraData) = [getPosASL _curatorCamera, [vectorDir _curatorCamera, vectorUp _curatorCamera]]; }; -GVAR(cameraHelper) = createAgent ["Logic", position GVAR(center) ,[] ,0 ,"none"]; +GVAR(cameraHelper) = createAgent ["Logic", _centerPos, [], 0, "none"]; GVAR(cameraHelper) attachTo [GVAR(center), GVAR(cameraPosition) select 3, ""]; -GVAR(camera) = "camera" camCreate position GVAR(center); -GVAR(camera) cameraEffect ["internal","back"]; -GVAR(camera) camPrepareFocus [-1,-1]; +GVAR(camera) = "camera" camCreate _centerPos; +GVAR(camera) cameraEffect ["internal", "back"]; +GVAR(camera) camPrepareFocus [-1, -1]; GVAR(camera) camPrepareFov 0.35; GVAR(camera) camCommitPrepared 0; showCinemaBorder false; -["#(argb,8,8,3)color(0,0,0,1)",false,nil,0,[0,0.5]] call bis_fnc_textTiles; +["#(argb,8,8,3)color(0,0,0,1)", false, nil, 0, [0, 0.5]] call BIS_fnc_textTiles; //--------------- Reset camera pos -[nil, [controlNull,0,0]] call FUNC(handleMouse); -GVAR(camPosUpdateHandle) = addMissionEventHandler ["draw3D",{ [] call FUNC(updateCamPos) }]; +[nil, [controlNull, 0, 0]] call FUNC(handleMouse); +GVAR(camPosUpdateHandle) = addMissionEventHandler ["draw3D", {call FUNC(updateCamPos)}]; diff --git a/addons/arsenal/functions/fnc_onKeyDown.sqf b/addons/arsenal/functions/fnc_onKeyDown.sqf index 2bd8e0ac7b..24fbd624f6 100644 --- a/addons/arsenal/functions/fnc_onKeyDown.sqf +++ b/addons/arsenal/functions/fnc_onKeyDown.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Handles keyboard inputs in arsenal. * * Arguments: * 0: Arsenal display - * 1: Key being pressed + * 1: Key being pressed * 2: Shift state * 3: Ctrl state * 4: Alt state @@ -25,12 +25,14 @@ GVAR(shiftState) = _shiftState; private _return = true; private _loadoutsDisplay = findDisplay IDD_loadouts_display; -if (_loadoutsDisplay isNotEqualTo displayNull) then { - if !(GVAR(loadoutsSearchbarFocus)) then { - switch true do { +// If in loadout screen +if (!isNull _loadoutsDisplay) then { + // If loadout search bar isn't focussed + if (!GVAR(loadoutsSearchbarFocus)) then { + switch (true) do { // Close button case (_keyPressed == DIK_ESCAPE): { - _display closeDisplay 2; + _display closeDisplay IDC_CANCEL; }; // Search field case (_keyPressed == DIK_F && {_ctrlState}): { @@ -38,48 +40,37 @@ if (_loadoutsDisplay isNotEqualTo displayNull) then { }; }; } else { - switch true do { + // If loadout search bar is focussed + switch (true) do { + // Close button case (_keyPressed == DIK_ESCAPE): { - _display closeDisplay 2; - }; - case (_keyPressed == DIK_BACKSPACE): { - _return = false; + _display closeDisplay IDC_CANCEL; }; + // Search case (_keyPressed == DIK_NUMPADENTER); case (_keyPressed == DIK_RETURN): { [_loadoutsDisplay, _loadoutsDisplay displayCtrl IDC_loadoutsSearchbar] call FUNC(handleLoadoutsSearchBar); }; + case (_keyPressed == DIK_BACKSPACE); case (_keyPressed in [DIK_LEFT, DIK_RIGHT]): { _return = false; }; }; }; - switch true do { - case (_keyPressed == DIK_C && {_ctrlState}): { - _return = false; - }; - case (_keyPressed == DIK_V && {_ctrlState}): { - _return = false; - }; - case (_keyPressed == DIK_A && {_ctrlState}): { - _return = false; - }; - case (_keyPressed == DIK_X && {_ctrlState}): { - _return = false; - }; + switch (true) do { + case (_keyPressed in [DIK_C, DIK_V, DIK_A, DIK_X] && {_ctrlState}); case (GVAR(loadoutsPanelFocus) && {_keyPressed in [DIK_UP, DIK_DOWN]}): { _return = false; }; }; } else { - + // If in arsenal and no search bar is selected if (!GVAR(leftSearchbarFocus) && {!GVAR(rightSearchbarFocus)}) then { - - switch true do { + switch (true) do { // Close button case (_keyPressed == DIK_ESCAPE): { - _display closeDisplay 2; + _display closeDisplay IDC_CANCEL; }; // Hide button case (_keyPressed == DIK_BACKSPACE): { @@ -88,7 +79,7 @@ if (_loadoutsDisplay isNotEqualTo displayNull) then { // Export button / export classname case (_keyPressed == DIK_C && {_ctrlState}): { if (GVAR(leftTabFocus) || {GVAR(rightTabFocus)} || {GVAR(rightTabLnBFocus)}) then { - switch true do { + switch (true) do { case (GVAR(leftTabFocus)): { private _control = (_display displayCtrl IDC_leftTabContent); _control lbData (lbCurSel _control) @@ -99,14 +90,14 @@ if (_loadoutsDisplay isNotEqualTo displayNull) then { }; case (GVAR(rightTabLnBFocus)): { private _control = (_display displayCtrl IDC_rightTabContentListnBox); - _control lnbData [(lnbCurSelRow _control), 0] + _control lnbData [lnbCurSelRow _control, 0] }; } params ["_className"]; "ace_clipboard" callExtension (_className + ";"); "ace_clipboard" callExtension "--COMPLETE--"; - [_display, localize LSTRING(exportedClassnameText)] call FUNC(message); + [_display, LLSTRING(exportedClassnameText)] call FUNC(message); } else { [_display] call FUNC(buttonExport); }; @@ -115,36 +106,37 @@ if (_loadoutsDisplay isNotEqualTo displayNull) then { case (_keyPressed == DIK_V && {_ctrlState}): { [_display] call FUNC(buttonImport); }; - // Search fields + // Focus search case (_keyPressed == DIK_F && {_ctrlState}): { ctrlSetFocus (_display displayCtrl IDC_leftSearchbar); }; // Switch vision mode - case (_keyPressed in (actionkeys "nightvision")): { + case (_keyPressed in (actionKeys "nightvision")): { if (isNil QGVAR(visionMode)) then { GVAR(visionMode) = 0; }; + GVAR(visionMode) = (GVAR(visionMode) + 1) % 3; - switch GVAR(visionMode) do { - //--- Normal + switch (GVAR(visionMode)) do { + // Normal case 0: { - camusenvg false; - false setCamUseTi 0; + camUseNVG false; + false setCamUseTI 0; }; - //--- NVG + // NVG case 1: { - camusenvg true; - false setCamUseTi 0; + camUseNVG true; + false setCamUseTI 0; }; - //--- TI + // TI default { - camusenvg false; - true setCamUseTi 0; + camUseNVG false; + true setCamUseTI 0; }; }; - playsound ["RscDisplayCurator_visionMode",true]; + playSound ["RscDisplayCurator_visionMode", true]; }; // Panel up down case (_keyPressed in [DIK_UP, DIK_DOWN]): { @@ -160,38 +152,29 @@ if (_loadoutsDisplay isNotEqualTo displayNull) then { }; }; } else { - switch true do { + // If in arsenal and a search bar is selected + switch (true) do { + // Close button case (_keyPressed == DIK_ESCAPE): { - _display closeDisplay 2; - }; - case (_keyPressed == DIK_BACKSPACE): { - _return = false; + _display closeDisplay IDC_CANCEL; }; + // Search case (_keyPressed == DIK_NUMPADENTER); case (_keyPressed == DIK_RETURN): { if (GVAR(leftSearchbarFocus)) then { [_display, _display displayCtrl IDC_leftSearchbar] call FUNC(handleSearchBar); }; + if (GVAR(rightSearchbarFocus)) then { [_display, _display displayCtrl IDC_rightSearchbar] call FUNC(handleSearchBar); }; }; - case (_keyPressed in [DIK_LEFT, DIK_RIGHT]): { + case (_keyPressed in [DIK_LEFT, DIK_RIGHT]); + case (_keyPressed == DIK_BACKSPACE); + case (_keyPressed in [DIK_C, DIK_V, DIK_A, DIK_X] && {_ctrlState}): { _return = false; }; - case (_keyPressed == DIK_C && {_ctrlState}): { - _return = false; - }; - case (_keyPressed == DIK_V && {_ctrlState}): { - _return = false; - }; - case (_keyPressed == DIK_A && {_ctrlState}): { - _return = false; - }; - case (_keyPressed == DIK_X && {_ctrlState}): { - _return = false; - }; - // Search fields + // Focus search fields case (_keyPressed == DIK_F && {_ctrlState}): { if (GVAR(rightSearchbarFocus)) then { ctrlSetFocus (_display displayCtrl IDC_leftSearchbar); diff --git a/addons/arsenal/functions/fnc_onLoadoutsClose.sqf b/addons/arsenal/functions/fnc_onLoadoutsClose.sqf index 07af50139d..d6605c3e27 100644 --- a/addons/arsenal/functions/fnc_onLoadoutsClose.sqf +++ b/addons/arsenal/functions/fnc_onLoadoutsClose.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -14,13 +14,11 @@ */ GVAR(currentLoadoutsTab) = nil; - -private _arsenalDisplay = findDisplay IDD_ace_arsenal; -private _mouseBlockCtrl = _arsenalDisplay displayCtrl IDC_mouseBlock; - GVAR(loadoutsSearchbarFocus) = nil; GVAR(loadoutsPanelFocus) = nil; +private _arsenalDisplay = findDisplay IDD_ace_arsenal; +private _mouseBlockCtrl = _arsenalDisplay displayCtrl IDC_mouseBlock; _mouseBlockCtrl ctrlEnable false; _mouseBlockCtrl ctrlCommit 0; @@ -28,4 +26,4 @@ _mouseBlockCtrl ctrlCommit 0; [QGVAR(loadoutsDisplayClosed), []] call CBA_fnc_localEvent; -[_arsenalDisplay , _arsenalDisplay displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); +[_arsenalDisplay, _arsenalDisplay displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); diff --git a/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf b/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf index eb72087f89..dea351546b 100644 --- a/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf +++ b/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe * onLoad EH for arsenal loadouts display. * * Arguments: - * 0: Ignored + * 0: Not used * 1: Arguments - * 1.1: Loadouts display + * - 0: Loadouts display * * Return Value: * None @@ -34,6 +34,7 @@ private _panelContentCtrl = _display displayCtrl IDC_contentPanel; _panelContentCtrl ctrlSetFontHeight (4.5 * GRID_H); _panelContentCtrl ctrlCommit 0; +// If default loadouts are disabled, disable button if !(GVAR(allowDefaultLoadouts)) then { private _buttonDefaultLoadoutsCtrl = _display displayCtrl IDC_buttonDefaultLoadouts; _buttonDefaultLoadoutsCtrl ctrlEnable false; @@ -44,6 +45,7 @@ if !(GVAR(allowDefaultLoadouts)) then { _buttonDefaultLoadoutsBackgroundCtrl ctrlCommit 0; }; +// If shared loadouts are disabled or it's singleplayer, disable button if !(GVAR(allowSharedLoadouts) && {isMultiplayer}) then { private _buttonShareLoadoutsCtrl = _display displayCtrl IDC_buttonSharedLoadouts; _buttonShareLoadoutsCtrl ctrlEnable false; diff --git a/addons/arsenal/functions/fnc_onMouseButtonDown.sqf b/addons/arsenal/functions/fnc_onMouseButtonDown.sqf index 0cb2c856a4..02a90cd037 100644 --- a/addons/arsenal/functions/fnc_onMouseButtonDown.sqf +++ b/addons/arsenal/functions/fnc_onMouseButtonDown.sqf @@ -1,4 +1,21 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +/* + * Author: commy2 + * Handles mouse button press. + * + * Arguments: + * 0: Not used + * 1: Args + * - 0: Not used + * - 1: Mouse button + * - 2: Mouse X position + * - 3: Mouse Y position + * + * Return Value: + * None + * + * Public: No +*/ params ["", "_args"]; _args params ["", "_buttonPressed", "_xPos", "_yPos"]; diff --git a/addons/arsenal/functions/fnc_onMouseButtonUp.sqf b/addons/arsenal/functions/fnc_onMouseButtonUp.sqf index 53848a4f8e..7efc638b63 100644 --- a/addons/arsenal/functions/fnc_onMouseButtonUp.sqf +++ b/addons/arsenal/functions/fnc_onMouseButtonUp.sqf @@ -1,4 +1,19 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +/* + * Author: commy2 + * Handles mouse button release. + * + * Arguments: + * 0: Not used + * 1: Args + * - 0: Not used + * - 1: Mouse button + * + * Return Value: + * None + * + * Public: No +*/ params ["", "_args"]; _args params ["", "_buttonPressed"]; diff --git a/addons/arsenal/functions/fnc_onPanelDblClick.sqf b/addons/arsenal/functions/fnc_onPanelDblClick.sqf new file mode 100644 index 0000000000..032d87534b --- /dev/null +++ b/addons/arsenal/functions/fnc_onPanelDblClick.sqf @@ -0,0 +1,50 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" +/* + * Author: LinkIsGrim + * Add or remove item(s) to favorites when LShift is pressed + * + * Arguments: + * 0: Left panel control + * 1: Left panel selection + * + * Return Value: + * None + * + * Public: No +*/ +params ["_control", "_curSel"]; + +if !(GVAR(shiftState)) exitWith {}; + +if (GVAR(currentLeftPanel) in [IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsigina]) exitWith {}; + +private _isLnB = (ctrlType _control) == CT_LISTNBOX; + +private _favorited = false; + +// Favorites/blacklist will always be lowercase to handle configCase changes +private _item = ""; +if (_isLnB) then { + _item = toLower (_control lnbData [_curSel, 0]); +} else { + _item = toLower (_control lbData _curSel); +}; + +if (_item in GVAR(favorites)) then { + GVAR(favorites) deleteAt _item; +} else { + GVAR(favorites) set [_item, nil]; + _favorited = true; +}; + +private _color = ([[1, 1, 1], GVAR(favoritesColor)] select _favorited) + [1]; + +if (_isLnB) then { + _control lnbSetColor [[_curSel, 1], _color]; + _control lnbSetColorRight [[_curSel, 1], _color]; +} else { + _control lbSetColor [_curSel, _color]; + _control lbSetSelectColor [_curSel, _color]; +}; diff --git a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf index 3f1ca14b87..be934286e0 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Handles selection changes on the left panel. * * Arguments: * 0: Left panel control - * 1: Left panel selection + * 1: Left panel selection * * Return Value: * None @@ -18,421 +19,678 @@ params ["_control", "_curSel"]; if (_curSel < 0) exitwith {}; -private _ctrlIDC = ctrlIDC _control; private _display = ctrlParent _control; -private _item = [_control lnbData [_curSel, 0], _control lbData _curSel] select !(ctrlType _control == 102); +private _item = [_control lbData _curSel, _control lnbData [_curSel, 0]] select (ctrlType _control == CT_LISTNBOX); -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]}); +// When having chosen a new category, see if the current right panel can be kept open, otherwise take default +private _selectCorrectPanelWeapon = [_display displayCtrl IDC_buttonOptic, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2]}); +private _selectCorrectPanelContainer = [_display displayCtrl IDC_buttonMisc, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]}); -private _containerDefaultRightPanel = _display displayCtrl IDC_buttonMisc; -private _selectCorrectPanelContainer = [_containerDefaultRightPanel, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]}); +// Remove all magazines from the current weapon that aren't compatible with the new weapon +private _fnc_clearCurrentWeaponMags = { + private _compatibleMagsCurrentWeapon = compatibleMagazines _currentWeapon; + + // If nothing was selected, remove all magazines from the current weapon + if (_item != "") then { + _compatibleMagsCurrentWeapon = _compatibleMagsCurrentWeapon - _compatibleMags; + }; -private _fnc_clearPreviousWepMags = { - private _compatibleMags = getArray (configfile >> "cfgweapons" >> _baseWeapon >> "magazines"); { GVAR(center) removeMagazines _x; - } foreach _compatibleMags; + } forEach _compatibleMagsCurrentWeapon; - GVAR(currentItems) set [15, uniformItems GVAR(center)]; - GVAR(currentItems) set [16, vestItems GVAR(center)]; - GVAR(currentItems) set [17, backpackItems GVAR(center)]; + // Update currentItems + private _loadout = getUnitLoadout GVAR(center); + + GVAR(currentItems) set [IDX_CURR_UNIFORM_ITEMS, (_loadout select IDX_LOADOUT_UNIFORM) param [1, []]]; + GVAR(currentItems) set [IDX_CURR_VEST_ITEMS, (_loadout select IDX_LOADOUT_VEST) param [1, []]]; + GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, (_loadout select IDX_LOADOUT_BACKPACK) param [1, []]]; }; +// Check which right panel has changed switch (GVAR(currentLeftPanel)) do { + // Primary weapon + case IDC_buttonPrimaryWeapon: { + private _currentWeapon = GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON; - case IDC_buttonPrimaryWeapon : { - private _baseWeapon = ((GVAR(currentItems) select 0) call bis_fnc_baseWeapon); - + // If nothing selected, remove primary weapon and its magazines if (_item == "") then { - call _fnc_clearPreviousWepMags; + call _fnc_clearCurrentWeaponMags; GVAR(center) removeWeapon (primaryWeapon GVAR(center)); - GVAR(currentItems) set [18, ["", "", "", "", "", ""]]; - GVAR(currentItems) set [0, _item]; + GVAR(currentItems) set [IDX_CURR_PRIMARY_WEAPON_ITEMS, ["", "", "", "", "", ""]]; + GVAR(currentItems) set [IDX_CURR_PRIMARY_WEAPON, ""]; TOGGLE_RIGHT_PANEL_HIDE } else { - if ((GVAR(currentItems) select 0) != _item && {_baseWeapon != _item}) then { - call _fnc_clearPreviousWepMags; + // Check if a new primary weapon was selected + if (_item != _currentWeapon) then { + // Get magazines that are compatible with the new weapon + private _compatibleMags = compatibleMagazines _item; - private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; - private _cfgMags = configFile >> "CfgMagazines"; - private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; - GVAR(center) addWeapon _item; - if (_compatibleMags isNotEqualTo []) then { - GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + // Remove all magazines from the current weapon that aren't compatible with the new one + call _fnc_clearCurrentWeaponMags; + + // Add new weapon without taking a magazine from the inventory + [GVAR(center), _item] call EFUNC(common,addWeapon); + + private _linkedItems = primaryWeaponItems GVAR(center) - [""]; + + // Remove linked items if unavailable + if (_linkedItems isNotEqualTo []) then { + { + if !(_x in GVAR(virtualItemsFlat)) then { + GVAR(center) removePrimaryWeaponItem _x; + }; + } forEach _linkedItems; }; + // Add old attachments and magazines back if they are compatible { - if (tolower _x in _compatibleItems || {_x in _compatibleMags}) then { - GVAR(center) addPrimaryWeaponItem _x; + if (_item canAdd _x) then { + GVAR(center) addWeaponItem [_item, _x, true]; }; - } foreach (GVAR(currentItems) select 18); + } forEach (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS); - private _primaryMags = primaryWeaponMagazine GVAR(center); - GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + ([_primaryMags + [""], _primaryMags] select (count _primaryMags > 1))]; - GVAR(currentItems) set [0, _item]; + (getUnitLoadout GVAR(center) select IDX_LOADOUT_PRIMARY_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + + _primaryMagazine = _primaryMagazine param [0, ""]; + + // Add a magazine to the primary muzzle if empty + if (_primaryMagazine == "") then { + // Get magazines that are compatible with the new weapon's primary muzzle only + private _compatibleMagsPrimaryMuzzle = compatibleMagazines [_item, "this"]; + private _compatibleMagIndex = _compatibleMagsPrimaryMuzzle findAny (keys (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)); + + if (_compatibleMagIndex != -1) then { + _primaryMagazine = _compatibleMagsPrimaryMuzzle select _compatibleMagIndex; + GVAR(center) addWeaponItem [_item, _primaryMagazine, true]; + }; + }; + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_PRIMARY_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _secondaryMagazine param [0, ""]]]; + GVAR(currentItems) set [IDX_CURR_PRIMARY_WEAPON, _item]; }; TOGGLE_RIGHT_PANEL_WEAPON + [_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel); }; + // Make unit switch to new item call FUNC(showItem); - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); }; + // Handgun weapon + case IDC_buttonHandgun: { + private _currentWeapon = GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON; - case IDC_buttonHandgun : { - private _baseWeapon = ((GVAR(currentItems) select 2) call bis_fnc_baseWeapon); - + // If nothing selected, remove handgun weapon and its magazines if (_item == "") then { - call _fnc_clearPreviousWepMags; + call _fnc_clearCurrentWeaponMags; GVAR(center) removeWeapon (handgunWeapon GVAR(center)); - GVAR(currentItems) set [18, ["", "", "", "", "", ""]]; - GVAR(currentItems) set [2, _item]; + GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON_ITEMS, ["", "", "", "", "", ""]]; + GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON, ""]; TOGGLE_RIGHT_PANEL_HIDE } else { - if ((GVAR(currentItems) select 2) != _item && {_baseWeapon != _item}) then { - call _fnc_clearPreviousWepMags; + // Check if a new handgun weapon was selected + if (_item != _currentWeapon) then { + // Get magazines that are compatible with the new weapon + private _compatibleMags = compatibleMagazines _item; - private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; - private _cfgMags = configFile >> "CfgMagazines"; - private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; - GVAR(center) addWeapon _item; - if (_compatibleMags isNotEqualTo []) then { - GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + // Remove all magazines from the current weapon that aren't compatible with the new one + call _fnc_clearCurrentWeaponMags; + + // Add new weapon without taking a magazine from the inventory + [GVAR(center), _item] call EFUNC(common,addWeapon); + + private _linkedItems = handgunItems GVAR(center) - [""]; + + // Remove linked items if unavailable + if (_linkedItems isNotEqualTo []) then { + { + if !(_x in GVAR(virtualItemsFlat)) then { + GVAR(center) removeHandgunItem _x; + }; + } forEach _linkedItems; }; + // Add old attachments and magazines back if they are compatible { - if (tolower _x in _compatibleItems || {_x in _compatibleMags}) then { - GVAR(center) addHandgunItem _x; - }; - } foreach (GVAR(currentItems) select 20); - private _handgunMags = handgunMagazine GVAR(center); - GVAR(currentItems) set [20, (handgunItems GVAR(center)) + ([_handgunMags + [""], _handgunMags] select (count _handgunMags > 1))]; - GVAR(currentItems) set [2, _item]; + if (_item canAdd _x) then { + GVAR(center) addWeaponItem [_item, _x, true]; + }; + } forEach (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS); + + (getUnitLoadout GVAR(center) select IDX_LOADOUT_HANDGUN_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + + _primaryMagazine = _primaryMagazine param [0, ""]; + + // Add a magazine to the primary muzzle if empty + if (_primaryMagazine == "") then { + // Get magazines that are compatible with the new weapon's primary muzzle only + private _compatibleMagsPrimaryMuzzle = compatibleMagazines [_item, "this"]; + private _compatibleMagIndex = _compatibleMagsPrimaryMuzzle findAny (keys (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)); + + if (_compatibleMagIndex != -1) then { + _primaryMagazine = _compatibleMagsPrimaryMuzzle select _compatibleMagIndex; + GVAR(center) addWeaponItem [_item, _primaryMagazine, true]; + }; + }; + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _secondaryMagazine param [0, ""]]]; + GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON, _item]; }; TOGGLE_RIGHT_PANEL_WEAPON - [_display, [_selectCorrectPanelWeapon, _weaponDefaultRightPanel] select (GVAR(currentRightPanel) == IDC_buttonCurrentMag2)] call FUNC(fillRightPanel); + + [_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel); }; + // Make unit switch to new item call FUNC(showItem); - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); }; + // Secondary weapon + case IDC_buttonSecondaryWeapon: { + private _currentWeapon = GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON; + private _isDisposable = _item in (uiNamespace getVariable QGVAR(CBAdisposableLaunchers)); - case IDC_buttonSecondaryWeapon : { - private _baseWeapon = ((GVAR(currentItems) select 1) call bis_fnc_baseWeapon); - + // If nothing selected, remove secondary weapon and its magazines if (_item == "") then { - call _fnc_clearPreviousWepMags; + call _fnc_clearCurrentWeaponMags; GVAR(center) removeWeapon (secondaryWeapon GVAR(center)); - GVAR(currentItems) set [18, ["", "", "", "", "", ""]]; - GVAR(currentItems) set [1, _item]; + GVAR(currentItems) set [IDX_CURR_SECONDARY_WEAPON_ITEMS, ["", "", "", "", "", ""]]; + GVAR(currentItems) set [IDX_CURR_SECONDARY_WEAPON, ""]; + TOGGLE_RIGHT_PANEL_HIDE } else { - if ((GVAR(currentItems) select 1) != _item && {_baseWeapon != _item}) then { - call _fnc_clearPreviousWepMags; + // Check if a new secondary weapon was selected + if (_item != _currentWeapon) then { + // Get magazines that are compatible with the new weapon + private _compatibleMags = compatibleMagazines _item; - private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; - private _cfgMags = configFile >> "CfgMagazines"; - private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; - GVAR(center) addWeapon _item; - if (_compatibleMags isNotEqualTo []) then { - GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + // Remove all magazines from the current weapon that aren't compatible with the new one + call _fnc_clearCurrentWeaponMags; + + // Add new weapon without taking a magazine from the inventory + [GVAR(center), _item] call EFUNC(common,addWeapon); + + private _linkedItems = secondaryWeaponItems GVAR(center) - [""]; + + // Remove linked items if unavailable + if (_linkedItems isNotEqualTo []) then { + { + if !(_x in GVAR(virtualItemsFlat)) then { + GVAR(center) removeSecondaryWeaponItem _x; + }; + } forEach _linkedItems; }; + // Add old attachments and magazines back if they are compatible { - if (tolower _x in _compatibleItems || {_x in _compatibleMags}) then { - GVAR(center) addSecondaryWeaponItem _x; + if (_item canAdd _x) then { + GVAR(center) addWeaponItem [_item, _x, true]; }; - } foreach (GVAR(currentItems) select 19); + } forEach (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS); - private _secondaryMags = secondaryWeaponMagazine GVAR(center); - GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + ([_secondaryMags + [""], _secondaryMags] select (count _secondaryMags > 1))]; - GVAR(currentItems) set [1, _item]; + (getUnitLoadout GVAR(center) select IDX_LOADOUT_SECONDARY_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + + _primaryMagazine = _primaryMagazine param [0, ""]; + + // Add a magazine to the primary muzzle if empty + if (_primaryMagazine == "") then { + // Get magazines that are compatible with the new weapon's primary muzzle only + private _compatibleMagsPrimaryMuzzle = compatibleMagazines [_item, "this"]; + private _compatibleMagIndex = _compatibleMagsPrimaryMuzzle findAny (keys (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)); + + if (_compatibleMagIndex != -1) then { + _primaryMagazine = _compatibleMagsPrimaryMuzzle select _compatibleMagIndex; + GVAR(center) addWeaponItem [_item, _primaryMagazine, true]; + }; + }; + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_SECONDARY_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _secondaryMagazine param [0, ""]]]; + GVAR(currentItems) set [IDX_CURR_SECONDARY_WEAPON, _item]; }; TOGGLE_RIGHT_PANEL_WEAPON - [_display, [_selectCorrectPanelWeapon, _weaponDefaultRightPanel] select (GVAR(currentRightPanel) == IDC_buttonCurrentMag2)] call FUNC(fillRightPanel); + + // If item is a disposable launcher, delay a bit to show new compatible items + if (_isDisposable) then { + [{ + _this call FUNC(fillRightPanel); + }, [_display, _selectCorrectPanelWeapon]] call CBA_fnc_execNextFrame; + } else { + [_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel); + }; }; - call FUNC(showItem); - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); + // If item is a disposable launcher, delay a bit to show new compatible items + if (_isDisposable) then { + [{ + // Make unit switch to new item + call FUNC(showItem); + + // Display new items's info on the bottom right + _this call FUNC(itemInfo); + }, [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item]] call CBA_fnc_execNextFrame; + } else { + // Make unit switch to new item + call FUNC(showItem); + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; }; - - case IDC_buttonHeadgear : { - + // Headgear + case IDC_buttonHeadgear: { if (_item == "") then { removeHeadgear GVAR(center); - GVAR(currentItems) set [3, _item]; + GVAR(currentItems) set [IDX_CURR_HEADGEAR, ""]; } else { - if ((GVAR(currentItems) select 3) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_HEADGEAR) != _item) then { GVAR(center) addHeadgear _item; - GVAR(currentItems) set [3, _item]; + GVAR(currentItems) set [IDX_CURR_HEADGEAR, _item]; }; }; + + // Make unit switch to new item call FUNC(showItem); TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); }; - - case IDC_buttonUniform : { + // Uniform + case IDC_buttonUniform: { if (_item == "") then { + removeUniform GVAR(center); + + GVAR(currentItems) set [IDX_CURR_UNIFORM_ITEMS, []]; + GVAR(currentItems) set [IDX_CURR_UNIFORM, ""]; - removeuniform GVAR(center); - GVAR(currentItems) set [15, []]; - GVAR(currentItems) set [4, _item]; TOGGLE_RIGHT_PANEL_HIDE } else { + if ((GVAR(currentItems) select IDX_CURR_UNIFORM) != _item) then { + // Get the unit's current loadout and just change the container + private _loadout = getUnitLoadout GVAR(center); + _loadout set [IDX_LOADOUT_UNIFORM, [_item, GVAR(currentItems) select IDX_CURR_UNIFORM_ITEMS]]; + GVAR(center) setUnitLoadout _loadout; - if ((GVAR(currentItems) select 4) != _item) then { - GVAR(center) forceAddUniform _item; + private _uniformItems = uniformItems GVAR(center); + private _index = count _uniformItems - 1; - while {count uniformItems GVAR(center) > 0} do { - GVAR(center) removeItemFromUniform (uniformItems GVAR(center) select 0); - }; //--- Remove default config contents + // Remove any items that can't fit in the container (this prevents overloading) + while {loadUniform GVAR(center) > 1 && {_index >= 0}} do { + GVAR(center) removeItemFromUniform (_uniformItems select _index); + DEC(_index); + }; - {GVAR(center) addItemtoUniform _x} foreach (GVAR(currentItems) select 15); - GVAR(currentItems) set [4, _item]; + GVAR(currentItems) set [IDX_CURR_UNIFORM, _item]; - [GVAR(center), ""] call bis_fnc_setUnitInsignia; - [GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; + [GVAR(center), ""] call BIS_fnc_setUnitInsignia; + [GVAR(center), GVAR(currentInsignia)] call BIS_fnc_setUnitInsignia; }; TOGGLE_RIGHT_PANEL_CONTAINER + [_display, _selectCorrectPanelContainer] call FUNC(fillRightPanel); }; + // Make unit switch to new item call FUNC(showItem); - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Vest case IDC_buttonVest: { if (_item == "") then { - removeVest GVAR(center); - GVAR(currentItems) set [16, []]; - GVAR(currentItems) set [5, _item]; + GVAR(currentItems) set [IDX_CURR_VEST_ITEMS, []]; + GVAR(currentItems) set [IDX_CURR_VEST, ""]; + TOGGLE_RIGHT_PANEL_HIDE } else { + if ((GVAR(currentItems) select IDX_CURR_VEST) != _item) then { + // Get the unit's current loadout and just change the container + private _loadout = getUnitLoadout GVAR(center); + _loadout set [IDX_LOADOUT_VEST, [_item, GVAR(currentItems) select IDX_CURR_VEST_ITEMS]]; + GVAR(center) setUnitLoadout _loadout; - if ((GVAR(currentItems) select 5) != _item) then { - GVAR(center) addVest _item; - while {count vestItems GVAR(center) > 0} do { - GVAR(center) removeItemFromVest (VestItems GVAR(center) select 0); - }; //--- Remove default config contents - {GVAR(center) addItemToVest _x} foreach (GVAR(currentItems) select 16); + private _vestItems = vestItems GVAR(center); + private _index = count _vestItems - 1; - GVAR(currentItems) set [5, _item]; + // Remove any items that can't fit in the container (this prevents overloading) + while {loadVest GVAR(center) > 1 && {_index >= 0}} do { + GVAR(center) removeItemFromVest (_vestItems select _index); + DEC(_index); + }; + + GVAR(currentItems) set [IDX_CURR_VEST, _item]; }; TOGGLE_RIGHT_PANEL_CONTAINER + [_display, _selectCorrectPanelContainer] call FUNC(fillRightPanel); }; + // Make unit switch to new item call FUNC(showItem); - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonBackpack : { + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Backpack + case IDC_buttonBackpack: { if (_item == "") then { - removeBackpack GVAR(center); - GVAR(currentItems) set [17, []]; - GVAR(currentItems) set [6, _item]; + GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, []]; + GVAR(currentItems) set [IDX_CURR_BACKPACK, ""]; + TOGGLE_RIGHT_PANEL_HIDE } else { + if ((GVAR(currentItems) select IDX_CURR_BACKPACK) != _item) then { + // Get the unit's current loadout and just change the container + private _loadout = getUnitLoadout GVAR(center); + _loadout set [IDX_LOADOUT_BACKPACK, [_item, GVAR(currentItems) select IDX_CURR_BACKPACK_ITEMS]]; + GVAR(center) setUnitLoadout _loadout; - if ((GVAR(currentItems) select 6) != _item) then { - removeBackpack GVAR(center); - GVAR(center) addBackpackGlobal _item; - while {count backpackItems GVAR(center) > 0} do { - GVAR(center) removeItemFromBackpack (backpackItems GVAR(center) select 0); - }; //--- Remove default config contents - {GVAR(center) addItemToBackpack _x} foreach (GVAR(currentItems) select 17); + private _backpackItems = backpackItems GVAR(center); + private _index = count _backpackItems - 1; - GVAR(currentItems) set [6, _item]; + // Remove any items that can't fit in the container (this prevents overloading) + while {loadBackpack GVAR(center) > 1 && {_index >= 0}} do { + GVAR(center) removeItemFromBackpack (_backpackItems select _index); + DEC(_index); + }; + + GVAR(currentItems) set [IDX_CURR_BACKPACK, _item]; }; TOGGLE_RIGHT_PANEL_CONTAINER + [_display, _selectCorrectPanelContainer] call FUNC(fillRightPanel); }; + // Make unit switch to new item call FUNC(showItem); - [_display, _control, _curSel, (configFile >> "CfgVehicles" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonGoggles : { + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgVehicles" >> _item] call FUNC(itemInfo); + }; + // Facewear + case IDC_buttonGoggles: { if (_item == "") then { removeGoggles GVAR(center); - GVAR(currentItems) set [7, _item]; + GVAR(currentItems) set [IDX_CURR_GOGGLES, ""]; } else { - if ((GVAR(currentItems) select 7) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_GOGGLES) != _item) then { GVAR(center) addGoggles _item; - GVAR(currentItems) set [7, _item]; + GVAR(currentItems) set [IDX_CURR_GOGGLES, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgGlasses" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonNVG : { + TOGGLE_RIGHT_PANEL_HIDE + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgGlasses" >> _item] call FUNC(itemInfo); + }; + // NVG + case IDC_buttonNVG: { if (_item == "") then { - GVAR(center) unlinkItem (GVAR(currentItems) select 8); - GVAR(currentItems) set [8, _item]; + GVAR(center) unlinkItem (GVAR(currentItems) select IDX_CURR_NVG); + GVAR(currentItems) set [IDX_CURR_NVG, ""]; } else { - if ((GVAR(currentItems) select 8) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_NVG) != _item) then { GVAR(center) linkItem _item; - GVAR(currentItems) set [8, _item]; + GVAR(currentItems) set [IDX_CURR_NVG, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonBinoculars : { + TOGGLE_RIGHT_PANEL_HIDE + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Binoculars + case IDC_buttonBinoculars: { + private _currentWeapon = GVAR(currentItems) select IDX_CURR_BINO; + + // If nothing selected, remove secondary weapon and its magazines if (_item == "") then { + call _fnc_clearCurrentWeaponMags; + GVAR(center) removeWeapon (binocular GVAR(center)); - GVAR(currentItems) set [9, _item]; - } else { - if ((GVAR(currentItems) select 9) != _item) then { - GVAR(center) addWeapon _item; - GVAR(currentItems) set [9, _item]; - call FUNC(showItem); - ADDBINOCULARSMAG - }; - }; - call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; + GVAR(currentItems) set [IDX_CURR_BINO_ITEMS, ["", "", "", "", "", ""]]; + GVAR(currentItems) set [IDX_CURR_BINO, ""]; - case IDC_buttonMap : { + TOGGLE_RIGHT_PANEL_HIDE + } else { + // Check if a new binocular was selected + if (_item != _currentWeapon) then { + // Get magazines that are compatible with the new binocular + private _compatibleMags = compatibleMagazines _item; + + // Remove all magazines from the current binocular that aren't compatible with the new one + call _fnc_clearCurrentWeaponMags; + + // Add new weapon without taking a magazine from the inventory + [GVAR(center), _item] call EFUNC(common,addWeapon); + + private _linkedItems = binocularItems GVAR(center) - [""]; + + // Remove linked items if unavailable + if (_linkedItems isNotEqualTo []) then { + { + if !(_x in GVAR(virtualItemsFlat)) then { + GVAR(center) removeBinocularItem _x; + }; + } forEach _linkedItems; + }; + + // Add old attachments and magazines back if they are compatible + { + if (_item canAdd _x) then { + GVAR(center) addWeaponItem [_item, _x, true]; + }; + } forEach (GVAR(currentItems) select IDX_CURR_BINO_ITEMS); + + (getUnitLoadout GVAR(center) select IDX_LOADOUT_BINO) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + + _primaryMagazine = _primaryMagazine param [0, ""]; + + // Add a magazine to the primary muzzle if empty + if (_primaryMagazine == "") then { + // Get magazines that are compatible with the new weapon's primary muzzle only + private _compatibleMagsPrimaryMuzzle = compatibleMagazines [_item, "this"]; + private _compatibleMagIndex = _compatibleMagsPrimaryMuzzle findAny (keys (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)); + + if (_compatibleMagIndex != -1) then { + _primaryMagazine = _compatibleMagsPrimaryMuzzle select _compatibleMagIndex; + GVAR(center) addWeaponItem [_item, _primaryMagazine, true]; + }; + }; + + // Update currentItems + GVAR(currentItems) set [IDX_CURR_BINO_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _secondaryMagazine param [0, ""]]]; + GVAR(currentItems) set [IDX_CURR_BINO, _item]; + }; + + TOGGLE_RIGHT_PANEL_WEAPON + + [_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel); + }; + + // Make unit switch to new item + call FUNC(showItem); + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Map + case IDC_buttonMap: { if (_item == "") then { - GVAR(center) unlinkItem (GVAR(currentItems) select 10) select 0; - GVAR(currentItems) set [10, _item]; + GVAR(center) unlinkItem (GVAR(currentItems) select IDX_CURR_MAP); + GVAR(currentItems) set [IDX_CURR_MAP, ""]; } else { - if ((GVAR(currentItems) select 10) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_MAP) != _item) then { GVAR(center) linkItem _item; - GVAR(currentItems) set [10, _item]; + GVAR(currentItems) set [IDX_CURR_MAP, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonCompass : { + TOGGLE_RIGHT_PANEL_HIDE + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Compass + case IDC_buttonCompass: { if (_item == "") then { - GVAR(center) unlinkItem (GVAR(currentItems) select 11) select 0; - GVAR(currentItems) set [11, _item]; + GVAR(center) unlinkItem (GVAR(currentItems) select IDX_CURR_COMPASS); + GVAR(currentItems) set [IDX_CURR_COMPASS, ""]; } else { - if ((GVAR(currentItems) select 11) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_COMPASS) != _item) then { GVAR(center) linkItem _item; - GVAR(currentItems) set [11, _item]; + GVAR(currentItems) set [IDX_CURR_COMPASS, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonRadio : { + TOGGLE_RIGHT_PANEL_HIDE + + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Radio + case IDC_buttonRadio: { if (_item == "") then { - GVAR(center) unlinkItem (GVAR(currentItems) select 12) select 0; - GVAR(currentItems) set [12, _item]; + GVAR(center) unlinkItem (GVAR(currentItems) select IDX_CURR_RADIO); + GVAR(currentItems) set [IDX_CURR_RADIO, ""]; } else { - if ((GVAR(currentItems) select 12) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_RADIO) != _item) then { GVAR(center) linkItem _item; - GVAR(currentItems) set [12, _item]; + GVAR(currentItems) set [IDX_CURR_RADIO, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonWatch : { + TOGGLE_RIGHT_PANEL_HIDE + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Watch + case IDC_buttonWatch: { if (_item == "") then { - GVAR(center) unlinkItem (GVAR(currentItems) select 13); - GVAR(currentItems) set [13, _item]; + GVAR(center) unlinkItem (GVAR(currentItems) select IDX_CURR_WATCH); + GVAR(currentItems) set [IDX_CURR_WATCH, ""]; } else { - if ((GVAR(currentItems) select 13) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_WATCH) != _item) then { GVAR(center) linkItem _item; - GVAR(currentItems) set [13, _item]; + GVAR(currentItems) set [IDX_CURR_WATCH, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonGPS : { + TOGGLE_RIGHT_PANEL_HIDE + + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // GPS or UAV Terminal + case IDC_buttonGPS: { if (_item == "") then { - GVAR(center) unlinkItem (GVAR(currentItems) select 14) select 0; - GVAR(currentItems) set [14, _item]; + GVAR(center) unlinkItem (GVAR(currentItems) select IDX_CURR_COMMS); + GVAR(currentItems) set [IDX_CURR_COMMS, ""]; } else { - if ((GVAR(currentItems) select 14) != _item) then { + if ((GVAR(currentItems) select IDX_CURR_COMMS) != _item) then { GVAR(center) linkItem _item; - GVAR(currentItems) set [14, _item]; + GVAR(currentItems) set [IDX_CURR_COMMS, _item]; }; }; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgWeapons" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonFace : { + TOGGLE_RIGHT_PANEL_HIDE + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgWeapons" >> _item] call FUNC(itemInfo); + }; + // Face + case IDC_buttonFace: { private _face = [_item, "Default"] select (_item == ""); GVAR(center) setFace _face; GVAR(currentFace) = _face; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgFaces" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonVoice : { + TOGGLE_RIGHT_PANEL_HIDE + + [_display, _control, _curSel, configFile >> "CfgFaces" >> _item] call FUNC(itemInfo); + }; + // Voice + case IDC_buttonVoice: { GVAR(center) setSpeaker _item; GVAR(currentVoice) = _item; + // Make unit switch to new item call FUNC(showItem); - TOGGLE_RIGHT_PANEL_HIDE - [_display, _control, _curSel, (configFile >> "CfgVoice" >> _item)] call FUNC(itemInfo); - }; - case IDC_buttonInsignia : { - [GVAR(center), _item] call bis_fnc_setUnitInsignia; + TOGGLE_RIGHT_PANEL_HIDE + + // Display new items's info on the bottom right + [_display, _control, _curSel, configFile >> "CfgVoice" >> _item] call FUNC(itemInfo); + }; + // Insignia + case IDC_buttonInsignia: { + [GVAR(center), _item] call BIS_fnc_setUnitInsignia; GVAR(currentInsignia) = _item; + // Make unit switch to new item call FUNC(showItem); + TOGGLE_RIGHT_PANEL_HIDE - private _unitInsigniaConfig = (configFile >> "CfgUnitInsignia" >> _item); + private _unitInsigniaConfig = configFile >> "CfgUnitInsignia" >> _item; - if (configName _unitInsigniaConfig isEqualTo "") then { - [_display, _control, _curSel, (missionConfigFile >> "CfgUnitInsignia" >> _item)] call FUNC(itemInfo); + // Display new items's info on the bottom right + if (isNull _unitInsigniaConfig) then { + [_display, _control, _curSel, missionConfigFile >> "CfgUnitInsignia" >> _item] call FUNC(itemInfo); } else { [_display, _control, _curSel, _unitInsigniaConfig] call FUNC(itemInfo); }; }; }; -(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", [GVAR(center), 2] call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); +(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", GVAR(center) call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); diff --git a/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf b/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf index 529f69da75..c7e084f9ef 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe * Handles selection changes on loadouts panel. * * Arguments: - * 0: Loadouts panel control - * 1: Loadouts panel selection + * 0: Arsenal display + * 1: Loadouts panel control + * 2: Currently selected loadout's index * * Return Value: * None @@ -23,74 +24,76 @@ private _deleteButtonCtrl = _display displayCtrl IDC_buttonDelete; private _renameButtonCtrl = _display displayCtrl IDC_buttonRename; private _textEditBoxCtrl= _display displayCtrl IDC_textEditBox; +// If nothing selected, disable all buttons if (_curSel == -1) exitWith { - if (GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts) then { _saveButtonCtrl ctrlEnable false; _saveButtonCtrl ctrlCommit 0; }; - _shareButtonCtrl ctrlSetText (localize LSTRING(buttonSharePrivateText)); + _shareButtonCtrl ctrlSetText LLSTRING(buttonSharePrivateText); { _x ctrlEnable false; _x ctrlCommit 0; - } foreach [_shareButtonCtrl, _loadButtonCtrl, _deleteButtonCtrl, _renameButtonCtrl]; + } forEach [_shareButtonCtrl, _loadButtonCtrl, _renameButtonCtrl, _deleteButtonCtrl]; }; switch (GVAR(currentLoadoutsTab)) do { - + // Local loadouts case IDC_buttonMyLoadouts: { - + // Enable shared loadouts if option is enabled and MP _shareButtonCtrl ctrlEnable (GVAR(allowSharedLoadouts) && {isMultiplayer}); _shareButtonCtrl ctrlCommit 0; - _loadButtonCtrl ctrlEnable true; - _loadButtonCtrl ctrlCommit 0; - - _shareButtonCtrl ctrlSetText ( [ - localize LSTRING(buttonSharePrivateText), - localize LSTRING(buttonSharePublicText) + // Rename share button, depending if it's already shared or not + _shareButtonCtrl ctrlSetText ([ + LLSTRING(buttonSharePrivateText), + LLSTRING(buttonSharePublicText) ] select ((_control lnbValue [_curSel, 0]) == 1)); + // Enable all other buttons { _x ctrlEnable true; _x ctrlCommit 0; - } foreach [_renameButtonCtrl, _deleteButtonCtrl]; + } forEach [_loadButtonCtrl, _renameButtonCtrl, _deleteButtonCtrl]; _textEditBoxCtrl ctrlSetText (_control lnbText [_curSel, 1]); }; - + // Default loadouts case IDC_buttonDefaultLoadouts: { - + // Enable saving and loading for everyone { _x ctrlEnable true; _x ctrlCommit 0; - } foreach [_saveButtonCtrl, _loadButtonCtrl]; + } forEach [_saveButtonCtrl, _loadButtonCtrl]; + // Disable sharing button _shareButtonCtrl ctrlEnable false; _shareButtonCtrl ctrlCommit 0; + // Enable delete and renaming button if in 3DEN { - _x ctrlEnable (is3DEN); + _x ctrlEnable (call FUNC(canEditDefaultLoadout)); _x ctrlCommit 0; - } foreach [_deleteButtonCtrl, _renameButtonCtrl]; + } forEach [_renameButtonCtrl, _deleteButtonCtrl]; _textEditBoxCtrl ctrlSetText (_control lnbText [_curSel, 1]); }; - + // Shared loadouts case IDC_buttonSharedLoadouts: { - + // Enable saving and loading for everyone { _x ctrlEnable true; _x ctrlCommit 0; - } foreach [_saveButtonCtrl, _loadButtonCtrl]; + } forEach [_saveButtonCtrl, _loadButtonCtrl]; + // Disable sharing button _shareButtonCtrl ctrlEnable false; _shareButtonCtrl ctrlCommit 0; + // If admin or loadout author, enable button for shared loadout if ((serverCommandAvailable "#logout") || {(_control lnbText [_curSel, 0]) == profileName}) then { - _deleteButtonCtrl ctrlEnable true; _deleteButtonCtrl ctrlCommit 0; } else { diff --git a/addons/arsenal/functions/fnc_onSelChangedRight.sqf b/addons/arsenal/functions/fnc_onSelChangedRight.sqf index 38e051b4e2..ba4a9fe353 100644 --- a/addons/arsenal/functions/fnc_onSelChangedRight.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedRight.sqf @@ -1,12 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Handles selection changes on the right panel. * * Arguments: * 0: Right panel control - * 1: Right panel selection + * 1: Right panel selection * * Return Value: * None @@ -18,61 +18,173 @@ params ["_control", "_curSel"]; if (_curSel < 0) exitwith {}; -private _ctrlIDC = ctrlIDC _control; private _display = ctrlParent _control; private _item = _control lbData _curSel; +private _currentItemsIndex = IDX_CURR_PRIMARY_WEAPON_ITEMS + ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun, IDC_buttonBinoculars] find GVAR(currentLeftPanel)); +private _itemIndex = [IDC_buttonMuzzle, IDC_buttonItemAcc, IDC_buttonOptic, IDC_buttonBipod, IDC_buttonCurrentMag, IDC_buttonCurrentMag2] find GVAR(currentRightPanel); +// Check which right panel has changed +switch (_currentItemsIndex) do { + // Primary weapon + case IDX_CURR_PRIMARY_WEAPON_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select _itemIndex; + // If removal + if (_item == "") then { + private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select 5; -private _fnc_selectItem = { - params ["_item", "_currentItemsIndex", "_itemIndex"]; + // If secondary magazine, make sure to remove from correct muzzle + if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select 4) == _secondaryMagazine}) then { + // Remove both magazines + GVAR(center) removePrimaryWeaponItem _secondaryMagazine; + GVAR(center) removePrimaryWeaponItem _secondaryMagazine; - switch (_currentItemsIndex) do { - case 18: { - if (_item == "") then { - GVAR(center) removePrimaryWeaponItem ((GVAR(currentItems) select 18) select _itemIndex); - private _primaryMags = primaryWeaponMagazine GVAR(center); - GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + ([_primaryMags + [""], _primaryMags] select (count _primaryMags > 1))]; + // Add magazine back into primary muzzle + GVAR(center) addWeaponItem [primaryWeapon GVAR(center), _secondaryMagazine, true]; } else { - GVAR(center) addPrimaryWeaponItem _item; - private _primaryMags = primaryWeaponMagazine GVAR(center); - GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + ([_primaryMags + [""], _primaryMags] select (count _primaryMags > 1))]; + GVAR(center) removePrimaryWeaponItem _currentItemInSlot; + }; + } else { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { + // If magazine, make sure to add to correct muzzle + if (_itemIndex >= 4) then { + private _weapon = primaryWeapon GVAR(center); + + GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true]; + } else { + GVAR(center) addWeaponItem [primaryWeapon GVAR(center), _item, true]; + }; }; - [_display, _control, _curSel, (configFile >> (["CfgWeapons", "CfgMagazines"] select (_itemIndex in [4, 5]))>> _item)] call FUNC(itemInfo); }; - 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))]; - } else { - GVAR(center) addSecondaryWeaponItem _item; - private _secondaryMags = secondaryWeaponMagazine GVAR(center); - GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + ([_secondaryMags + [""], _secondaryMags] select (count _secondaryMags > 1))]; + // Update currentItems + (getUnitLoadout GVAR(center) select IDX_LOADOUT_PRIMARY_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + GVAR(currentItems) set [IDX_CURR_PRIMARY_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]]; + + [_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo); + }; + // Secondary weapon + case IDX_CURR_SECONDARY_WEAPON_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select _itemIndex; + private _isDisposable = CBA_disposable_replaceDisposableLauncher && {!isNil {CBA_disposable_loadedLaunchers getVariable (secondaryWeapon GVAR(center))}}; + + // If removal + if (_item == "") then { + // Don't unload magazines from diposable weapons + if (_isDisposable && {_itemIndex >= 4}) exitWith { + TRACE_1("Ignoring unload of magazine from disposable",secondaryWeapon GVAR(center)); + }; + + private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select 5; + + // If secondary magazine, make sure to remove from correct muzzle + if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select 4) == _secondaryMagazine}) then { + // Remove both magazines + GVAR(center) removeSecondaryWeaponItem _secondaryMagazine; + GVAR(center) removeSecondaryWeaponItem _secondaryMagazine; + + // Add magazine back into primary muzzle + GVAR(center) addWeaponItem [secondaryWeapon GVAR(center), _secondaryMagazine, true]; + } else { + GVAR(center) removeSecondaryWeaponItem _currentItemInSlot; + }; + } else { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { + // If magazine, make sure to add to correct muzzle + if (_itemIndex >= 4) then { + private _weapon = secondaryWeapon GVAR(center); + + GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true]; + } else { + GVAR(center) addWeaponItem [secondaryWeapon GVAR(center), _item, true]; + }; }; - [_display, _control, _curSel, (configFile >> (["CfgWeapons", "CfgMagazines"] select (_itemIndex in [4, 5]))>> _item)] call FUNC(itemInfo); }; - case 20: { - if (_item == "") then { - GVAR(center) removeHandgunItem ((GVAR(currentItems) select 20) select _itemIndex); - private _handgunMags = handgunMagazine GVAR(center); - GVAR(currentItems) set [20, (handgunItems GVAR(center)) + ([_handgunMags + [""], _handgunMags] select (count _handgunMags > 1))]; - } else { - GVAR(center) addHandgunItem _item; - private _handgunMags = handgunMagazine GVAR(center); - GVAR(currentItems) set [20, (handgunItems GVAR(center)) + ([_handgunMags + [""], _handgunMags] select (count _handgunMags > 1))]; - }; - [_display, _control, _curSel, (configFile >> (["CfgWeapons", "CfgMagazines"] select (_itemIndex in [4, 5]))>> _item)] call FUNC(itemInfo); + // Update currentItems + if !(_isDisposable && {_itemIndex >= 4}) then { + (getUnitLoadout GVAR(center) select IDX_LOADOUT_SECONDARY_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + GVAR(currentItems) set [IDX_CURR_SECONDARY_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]]; }; + + [_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo); + }; + // Handgun weapon + case IDX_CURR_HANDGUN_WEAPON_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select _itemIndex; + if (_item == "") then { + private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select 5; + + // If secondary magazine, make sure to remove from correct muzzle + if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select 4) == _secondaryMagazine}) then { + // Remove both magazines + GVAR(center) removeHandgunItem _secondaryMagazine; + GVAR(center) removeHandgunItem _secondaryMagazine; + + // Add magazine back into primary muzzle + GVAR(center) addWeaponItem [handgunWeapon GVAR(center), _secondaryMagazine, true]; + } else { + GVAR(center) removeHandgunItem _currentItemInSlot; + }; + } else { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { + // If magazine, make sure to add to correct muzzle + if (_itemIndex >= 4) then { + private _weapon = handgunWeapon GVAR(center); + + GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true]; + } else { + GVAR(center) addWeaponItem [handgunWeapon GVAR(center), _item, true]; + }; + }; + }; + + // Update currentItems + (getUnitLoadout GVAR(center) select IDX_LOADOUT_HANDGUN_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]]; + + [_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo); + }; + // Binoculars + case IDX_CURR_BINO_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select _itemIndex; + if (_item == "") then { + private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select 5; + + // If secondary magazine, make sure to remove from correct muzzle + if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select 4) == _secondaryMagazine}) then { + // Remove both magazines + GVAR(center) removeBinocularItem _secondaryMagazine; + GVAR(center) removeBinocularItem _secondaryMagazine; + + // Add magazine back into primary muzzle + GVAR(center) addWeaponItem [binocular GVAR(center), _secondaryMagazine, true]; + } else { + GVAR(center) removeBinocularItem _currentItemInSlot; + }; + } else { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { + // If magazine, make sure to add to correct muzzle + if (_itemIndex >= 4) then { + private _weapon = binocular GVAR(center); + + GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true]; + } else { + GVAR(center) addWeaponItem [binocular GVAR(center), _item, true]; + }; + }; + }; + + // Update currentItems + (getUnitLoadout GVAR(center) select IDX_LOADOUT_BINO) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; + GVAR(currentItems) set [IDX_CURR_BINO_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]]; + + [_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo); }; }; -[ - _item, - 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; - -(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", [GVAR(center), 2] call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); +// Update weight display +(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", GVAR(center) call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); diff --git a/addons/arsenal/functions/fnc_onSelChangedRightListnBox.sqf b/addons/arsenal/functions/fnc_onSelChangedRightListnBox.sqf index c2b14c6462..c1bdafba69 100644 --- a/addons/arsenal/functions/fnc_onSelChangedRightListnBox.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedRightListnBox.sqf @@ -1,12 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Handles selection changes on the right panel (listnbox). * * Arguments: * 0: Right panel control - * 1: Right panel selection + * 1: Right panel selection * * Return Value: * None @@ -16,36 +16,41 @@ params ["_control", "_curSel"]; -if (_curSel < 0) exitwith {}; +if (_curSel < 0 || {!(GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack])}) exitWith {}; -private _ctrlIDC = ctrlIDC _control; -private _display = ctrlParent _control; -private _item = [_control lnbData [_curSel, 0], _control lbData _curSel] select !(ctrlType _control == 102); +private _hasItems = false; -private _fnc_selectRight = { - params ["_item", "_cfgEntry"]; +// Get relevant container +private _container = switch (GVAR(currentLeftPanel)) do { + case IDC_buttonUniform: { + _hasItems = (GVAR(currentItems) select IDX_CURR_UNIFORM_ITEMS) isNotEqualTo []; - // Load remaining - private _maxLoad = switch (GVAR(currentLeftPanel)) do { - case IDC_buttonUniform: { - gettext (configfile >> "CfgWeapons" >> uniform GVAR(center) >> "ItemInfo" >> "containerClass") - }; - case IDC_buttonVest: { - gettext (configfile >> "CfgWeapons" >> vest GVAR(center) >> "ItemInfo" >> "containerClass") - }; - case IDC_buttonBackpack: { - backpack GVAR(center) - }; + uniformContainer GVAR(center) }; + case IDC_buttonVest: { + _hasItems = (GVAR(currentItems) select IDX_CURR_VEST_ITEMS) isNotEqualTo []; - [_control, _maxLoad] call FUNC(updateRightPanel); - [_display, _control, _curSel, (configFile >> _cfgEntry >> _item)] call FUNC(itemInfo); + vestContainer GVAR(center) + }; + case IDC_buttonBackpack: { + _hasItems = (GVAR(currentItems) select IDX_CURR_BACKPACK_ITEMS) isNotEqualTo []; + + backpackContainer GVAR(center) + }; }; -if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]) then { +// Refresh availibility of items based on space remaining in container +[_control, _container, _hasItems] call FUNC(updateRightPanel); - [ - _item, - ["CfgWeapons", "CfgMagazines"] select (GVAR(currentRightPanel) in [IDC_buttonMag, IDC_buttonMagALL, IDC_buttonThrow, IDC_buttonPut]) - ] call _fnc_selectRight; +private _item = _control lnbData [_curSel, 0]; +private _cfgEntry = ["CfgWeapons", "CfgMagazines"] select (GVAR(currentRightPanel) in [IDC_buttonMag, IDC_buttonMagALL, IDC_buttonThrow, IDC_buttonPut] || {_item in (uiNamespace getVariable [QGVAR(magazineMiscItems), []])}); + +_cfgEntry = configFile >> _cfgEntry >> _item; + +// If e.g. in misc. items, item could be e.g. a backpack +if (isNull _cfgEntry) then { + _cfgEntry = _item call CBA_fnc_getItemConfig; }; + +// Display item info on the bottom right +[ctrlParent _control, _control, _curSel, _cfgEntry] call FUNC(itemInfo); diff --git a/addons/arsenal/functions/fnc_open3DEN.sqf b/addons/arsenal/functions/fnc_open3DEN.sqf index 103ec870e1..b9dcd710fd 100644 --- a/addons/arsenal/functions/fnc_open3DEN.sqf +++ b/addons/arsenal/functions/fnc_open3DEN.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe - * Replace the 3DEN "edit loadout" menu action + * Replace the 3DEN "edit loadout" menu action. * * Arguments: * None @@ -9,9 +9,8 @@ * Return Value: * None * - * * Public: No */ -private _entity = (uinamespace getvariable ["bis_fnc_3DENEntityMenu_data",[]]) param [1, objnull]; +private _entity = (uiNamespace getVariable ["BIS_fnc_3DENEntityMenu_data", []]) param [1, objNull]; [_entity, _entity, true] call FUNC(openBox); diff --git a/addons/arsenal/functions/fnc_openBox.sqf b/addons/arsenal/functions/fnc_openBox.sqf index f1c6612671..941562a5b4 100644 --- a/addons/arsenal/functions/fnc_openBox.sqf +++ b/addons/arsenal/functions/fnc_openBox.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +#include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Open arsenal. * * Arguments: * 0: Box * 1: Unit to open the arsenal on - * 2: Ignore virtual items and fill arsenal + * 2: Ignore virtual items and fill arsenal (default: false) * * Return Value: * None @@ -26,31 +27,68 @@ if ( {!(isNull objectParent _center) && {!is3DEN}} ) exitWith {}; -if (isNil {_object getVariable [QGVAR(virtualItems), nil]} && {!_mode}) exitWith { - [localize LSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText); +// If object has no arsenal and chosen option is to not ignore virtual items of object, exit +if (isNil {_object getVariable QGVAR(virtualItems)} && {!_mode}) exitWith { + [LLSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText); }; +// Don't execute in scheduled environment if (canSuspend) exitWith { [{_this call FUNC(openBox)}, _this] call CBA_fnc_directCall; }; -private _displayToUse = [findDisplay 46, findDIsplay 312] select (!isNull findDisplay 312); -_displayToUse = [_displayToUse, findDisplay 313] select (is3DEN); +private _displayToUse = findDisplay IDD_RSCDISPLAYCURATOR; +_displayToUse = [_displayToUse, findDisplay IDD_MISSION] select (isNull _displayToUse); +_displayToUse = [_displayToUse, findDisplay IDD_DISPLAY3DEN] select is3DEN; -if (isNil "_displayToUse" || {!isnil QGVAR(camera)}) exitWith { - [localize LSTRING(CantOpenDisplay), false, 5, 1] call EFUNC(common,displayText); +// Check if the display is available and that there isn't already a camera for the arsenal +if (isNull _displayToUse || {!isNil QGVAR(camera)}) exitWith { + [LLSTRING(CantOpenDisplay), false, 5, 1] call EFUNC(common,displayText); }; GVAR(currentBox) = _object; if (_mode) then { + // Add all the items from the game that the arsenal has detected GVAR(virtualItems) = +(uiNamespace getVariable QGVAR(configItems)); GVAR(virtualItemsFlat) = +(uiNamespace getVariable QGVAR(configItemsFlat)); } else { - GVAR(virtualItems) = +(_object getVariable [QGVAR(virtualItems), [ - [[], [], []], [[], [], [], []], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [] - ]]); - GVAR(virtualItemsFlat) = flatten GVAR(virtualItems); + // Add only specified items to the arsenal + private _virtualItems = _object getVariable QGVAR(virtualItems); + + GVAR(virtualItems) = if (isNil "_virtualItems") then { + _virtualItems = [ + [IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]], + [IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]] + ]; + + _virtualItems = createHashMapFromArray _virtualItems; + + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _virtualItems set [_index, createHashMap]; + }; + } else { + +_virtualItems + }; + + // Flatten out hashmaps for easy checking later + private _virtualItemsFlat = +_virtualItems; + private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS; + private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS; + + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true]; + }; + + for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do { + _virtualItemsFlat merge [_weapons deleteAt _index, true]; + }; + + for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do { + _virtualItemsFlat merge [_attachments deleteAt _index, true]; + }; + + GVAR(virtualItemsFlat) = _virtualItemsFlat; }; GVAR(center) = _center; @@ -58,5 +96,7 @@ GVAR(center) = _center; if (is3DEN) then { _displayToUse createDisplay QGVAR(display); } else { - [{(_this select 0) createDisplay (_this select 1)}, [_displayToUse, QGVAR(display)]] call CBA_fnc_execNextFrame; + [{ + _this createDisplay QGVAR(display); + }, _displayToUse] call CBA_fnc_execNextFrame; }; diff --git a/addons/arsenal/functions/fnc_portVALoadouts.sqf b/addons/arsenal/functions/fnc_portVALoadouts.sqf index 0e403eae92..eb2c942abd 100644 --- a/addons/arsenal/functions/fnc_portVALoadouts.sqf +++ b/addons/arsenal/functions/fnc_portVALoadouts.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: alganthe + * Author: Alganthe, johnb43 * Port VA loadouts to ACE Arsenal. * * Arguments: @@ -9,34 +9,46 @@ * Return Value: * None * + * Example: + * call ace_arsenal_fnc_portVALoadouts + * * Public: Yes */ -private _VALoadouts = +(profilenamespace getvariable ["bis_fnc_saveInventory_data",[]]); -private _aceLoadouts = +(profileNamespace getVariable [QGVAR(saved_loadouts),[]]); +private _unit = player; -if (isNull player) exitWith { - [localize LSTRING(portLoadoutsPlayerError)] call BIS_fnc_error; +// Need a player object to transfer loadouts +if (isNull _unit) exitWith { + [LLSTRING(portLoadoutsPlayerError)] call BIS_fnc_error; }; +// Check if there are any VA loadouts +private _VALoadouts = profileNamespace getVariable ["BIS_fnc_saveInventory_data", []]; + if (_VALoadouts isEqualTo []) exitWith { - [localize LSTRING(portLoadoutsLoadoutError)] call BIS_fnc_error; + [LLSTRING(portLoadoutsLoadoutError)] call BIS_fnc_error; }; -for "_i" from 0 to (count _VALoadouts - 1) step 2 do { +private _aceLoadouts = +(profileNamespace getVariable [QGVAR(saved_loadouts),[]]); +private _name = ""; +private _index = -1; + +// Go through all VA loadouts and save them as ACE Arsenal loadouts +for "_i" from 0 to (count _VALoadouts) - 1 step 2 do { _name = _VALoadouts select _i; - _inventory = _VALoadouts select (_i + 1); - private _sameNameLoadoutsList = _aceLoadouts select {_x select 0 == _name}; - [player, [profilenamespace, _name]] call bis_fnc_loadinventory; + // Load VA loadout onto player + [_unit, [profileNamespace, _name]] call BIS_fnc_loadInventory; - private _loadout = getUnitLoadout player; - - if (count _sameNameLoadoutsList > 0) then { - _aceLoadouts set [_aceLoadouts find (_sameNameLoadoutsList select 0), [_name, _loadout]]; + // See if there is an already existing loadout with the same name + _index = _aceLoadouts findIf {(_x select 0) == _name}; + // If there is an already existing loadout with same name, overwrite it (in CBA extended loadout array) + if (_index != -1) then { + _aceLoadouts set [_index, [_name, [getUnitLoadout _unit, createHashMap]]]; } else { - _aceLoadouts pushBack [_name, _loadout]; + // Otherwise just add + _aceLoadouts pushBack [_name, [getUnitLoadout _unit, createHashMap]]; }; }; diff --git a/addons/arsenal/functions/fnc_refresh.sqf b/addons/arsenal/functions/fnc_refresh.sqf new file mode 100644 index 0000000000..6539b52151 --- /dev/null +++ b/addons/arsenal/functions/fnc_refresh.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Brett Mayson, johnb43 + * Refreshes the arsenal to show external changes. + * + * Arguments: + * 0: Update current and unique items lists (default: true) + * + * Return Value: + * None + * + * Example: + * call ace_arsenal_fnc_refresh + * + * Public: Yes +*/ +params [["_updateItems", true, [true]]]; + +if (_updateItems) then { + // Update current item list + call FUNC(updateCurrentItemsList); + + // This takes care of unique inventory items (arsenal doesn't have it whitelisted) + call FUNC(updateUniqueItemsList); +}; + +// Don't refresh left panel if in loadout tab +if (!isNull findDisplay IDD_loadouts_display) exitWith {}; + +private _display = findDisplay IDD_ace_arsenal; + +[_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); diff --git a/addons/arsenal/functions/fnc_removeAction.sqf b/addons/arsenal/functions/fnc_removeAction.sqf new file mode 100644 index 0000000000..8e9639caa9 --- /dev/null +++ b/addons/arsenal/functions/fnc_removeAction.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Remove a custom action button from ACE Arsenal. + * + * Arguments: + * 0: Array of IDs + * + * Return Value: + * None + * + * Example: + * [["TAG_myActions~text~0", "TAG_myActions~statement~0", "TAG_myActions~button~0"]] call ace_arsenal_fnc_removeAction + * + * Public: Yes +*/ + +params ["_IDList"]; + +// Compile sorts from config (in case this is called before preInit) +call FUNC(compileActions); + +// Remove entries (all names are unique, there are no duplicates) +{ + (_x splitString "~") params ["_rootClass", "_class", "_tab"]; + + _tab = parseNumber _tab; + + { + if ((_x select 0) == _rootClass) exitWith { + (_x select 3) deleteAt ((_x select 3) findIf {(_x select 0) == _class}); + + // If no entries left in group, remove group + if ((_x select 3) isEqualTo []) then { + (GVAR(actionList) select _tab) deleteAt _forEachIndex; + }; + }; + } forEach (GVAR(actionList) select _tab); +} forEach _IDList; + +nil // return diff --git a/addons/arsenal/functions/fnc_removeBox.sqf b/addons/arsenal/functions/fnc_removeBox.sqf index 7620529ef3..1764fe2630 100644 --- a/addons/arsenal/functions/fnc_removeBox.sqf +++ b/addons/arsenal/functions/fnc_removeBox.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Remove arsenal from target. * * Arguments: * 0: Target - * 1: Remove globally + * 1: Remove globally (default: true) * * Return Value: * None @@ -18,18 +18,24 @@ params [["_object", objNull, [objNull]], ["_global", true, [true]]]; -if (isNull _object || {isNil QGVAR(EHIDArray)}) exitWith {}; +if (isNull _object) exitWith {}; -if (_global && {isMultiplayer}) then { - private _ID = (GVAR(EHIDArray) select {_x select 1 == _object}) select 0; +private _id = _object getVariable QGVAR(initBoxJIP); - if (!isNil "_ID") then { - [_ID select 0] call CBA_fnc_removeGlobalEventJIP; - GVAR(EHIDArray) deleteAt (GVAR(EHIDArray) find _ID); - publicVariable QGVAR(EHIDArray); - [QGVAR(removeBox), [_object, false]] call CBA_fnc_globalEvent; - }; +if (_global && {isMultiplayer} && {!isNil "_id"}) then { + // Remove event from JIP queue + [_id] call CBA_fnc_removeGlobalEventJIP; + + // Reset JIP ID + _object setVariable [QGVAR(initBoxJIP), nil, true]; + + // Remove box for everyone + [QGVAR(removeBox), [_object, false]] call CBA_fnc_globalEvent; + + // Remove from JIP + _object setVariable [QGVAR(virtualItems), nil, true]; } else { - _object setVariable [QGVAR(virtualItems), nil, false]; + _object setVariable [QGVAR(virtualItems), nil]; [_object, 0, ["ACE_MainActions", QGVAR(interaction)]] call EFUNC(interact_menu,removeActionFromObject); + [QGVAR(boxRemoved), _object] call CBA_fnc_localEvent; }; diff --git a/addons/arsenal/functions/fnc_removeDefaultLoadout.sqf b/addons/arsenal/functions/fnc_removeDefaultLoadout.sqf new file mode 100644 index 0000000000..e84aad5c04 --- /dev/null +++ b/addons/arsenal/functions/fnc_removeDefaultLoadout.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Removes a loadout from the "Default Loadouts" list. + * + * Arguments: + * 0: Name of loadout + * 1: Remove globally (default: false) + * + * Return Value: + * None + * + * Example: + * ["Squad Leader", true] call ace_arsenal_fnc_removeDefaultLoadout + * + * Public: Yes +*/ +params [["_name", "", [""]], ["_global", false, [false]]]; + +if (_global) then { + [QGVAR(removeDefaultLoadout), [_name]] call CBA_fnc_remoteEvent; +}; + +GVAR(defaultLoadoutsList) deleteAt (GVAR(defaultLoadoutsList) findIf {(_x select 0) == _name}); + +if (is3DEN) then { + set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; +}; diff --git a/addons/arsenal/functions/fnc_removeSort.sqf b/addons/arsenal/functions/fnc_removeSort.sqf new file mode 100644 index 0000000000..3957257a6d --- /dev/null +++ b/addons/arsenal/functions/fnc_removeSort.sqf @@ -0,0 +1,53 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Remove a sort from ACE Arsenal. + * + * Arguments: + * 0: Array of IDs + * + * Return Value: + * None + * + * Example: + * [["scopeSortL00", "scopeSortL01", "scopeSortL02", "scopeSortR07"]] call ace_arsenal_fnc_removeSort; + * + * Public: Yes +*/ + +params ["_IDList"]; + +// Compile sorts from config (in case this is called before preInit) +call FUNC(compileSorts); + +private _currentID = ""; +private _stringCount = 0; +private _tabSide = ""; +private _tab = ""; +private _tabToChange = []; + +{ + _currentID = _x; + _stringCount = count _currentID; + + // Make sure to keep at least 1 sort per category, so make default sort not deletable + if ("ace_alphabetically" in toLower (_currentID select [0, _stringCount - 3])) then { + continue; + }; + + // Get tab info + _tabSide = _currentID select [_stringCount - 3, 1]; + _tab = _currentID select [_stringCount - 2, 2]; + + _tab = parseNumber _tab; + + // Check which side to delete it from + _tabToChange = if (_tabSide == "R") then { + GVAR(sortListRightPanel) select _tab + } else { + GVAR(sortListLeftPanel) select _tab + }; + + // Remove entry (all names are unique, there are no duplicates) + _tabToChange deleteAt (_tabToChange findIf {_x select 0 == _currentID}); +} forEach _IDList; diff --git a/addons/arsenal/functions/fnc_removeStat.sqf b/addons/arsenal/functions/fnc_removeStat.sqf index 79f2173798..af2cbf11fc 100644 --- a/addons/arsenal/functions/fnc_removeStat.sqf +++ b/addons/arsenal/functions/fnc_removeStat.sqf @@ -1,60 +1,47 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Remove a stat from ACE Arsenal. * * Arguments: - * 0: Array of IDs (ARRAY) + * 0: Array of IDs * * Return Value: * None * * Example: - * [["scopeStatL00","scopeStatL01","scopeStatL02","scopeStatR07"]] call ace_arsenal_fnc_removeStat; + * [["scopeStatL00", "scopeStatL01", "scopeStatL02", "scopeStatR07"]] call ace_arsenal_fnc_removeStat; * * Public: Yes */ params ["_IDList"]; +// Compile stats from config (in case this is called before preInit) call FUNC(compileStats); +private _currentID = ""; +private _stringCount = 0; +private _tabSide = ""; +private _tab = ""; +private _tabToChange = []; + { - private _currentID = _x; - private _stringCount = count _currentID; - private _side = _currentID select [_stringCount - 3, 1]; - private _tab = _currentID select [_stringCount - 2, 2]; + // Get tab info + _currentID = _x; + _stringCount = count _currentID; + _tabSide = _currentID select [_stringCount - 3, 1]; + _tab = _currentID select [_stringCount - 2, 2]; + _tab = parseNumber _tab; - private _tabToChange = if (_side == "R") then { + // Check which side to delete it from + _tabToChange = if (_tabSide == "R") then { GVAR(statsListRightPanel) select _tab } else { GVAR(statsListLeftPanel) select _tab }; - { - _x deleteAt (_x findIf {_x select 0 == _currentID}); - } foreach _tabToChange; -} foreach _IDList; - -// Clear empty pages -private _fnc_deleteEmptyPage = { - params ["_list"]; - { - private _evaluatedTab = _forEachIndex; - { - if (count _x == 0) then { - _markedForDeletion pushBack [_evaluatedTab, _forEachIndex]; - }; - } foreach _x; - - { - (_list select (_x select 0)) deleteAt (_x select 1); - } foreach _markedForDeletion; - } foreach (_this select 0); -}; - -private _markedForDeletion = []; - -[GVAR(statsListLeftPanel)] call _fnc_deleteEmptyPage; -[GVAR(statsListRightPanel)] call _fnc_deleteEmptyPage; + // Delete stat + _tabToChange deleteAt (_tabToChange findIf {_x select 5 == _currentID}); +} forEach _IDList; diff --git a/addons/arsenal/functions/fnc_removeVirtualItems.sqf b/addons/arsenal/functions/fnc_removeVirtualItems.sqf index ad9ff7f89e..f9cdc76c50 100644 --- a/addons/arsenal/functions/fnc_removeVirtualItems.sqf +++ b/addons/arsenal/functions/fnc_removeVirtualItems.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +#include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Remove virtual items to the provided target. * * Arguments: * 0: Target - * 1: Items - * 2: Add globally + * 1: Items + * 2: Remove globally (default: false) * * Return Value: * None @@ -18,63 +19,84 @@ * Public: Yes */ -params [ ["_object", objNull, [objNull]], ["_items", [], [true, [""]]], ["_global", false, [false]] ]; +params [["_object", objNull, [objNull]], ["_items", [], [true, [""]]], ["_global", false, [false]]]; -if (_object == objNull) exitWith {}; -if (_items isEqualType [] && {count _items == 0}) exitWith {}; - -private _cargo = _object getVariable [QGVAR(virtualItems), [ - [[], [], []], // Weapons 0, primary, handgun, secondary - [[], [], [], []], // WeaponAccessories 1, optic,side,muzzle,bipod - [ ], // Magazines 2 - [ ], // Headgear 3 - [ ], // Uniform 4 - [ ], // Vest 5 - [ ], // Backpacks 6 - [ ], // Goggles 7 - [ ], // NVGs 8 - [ ], // Binoculars 9 - [ ], // Map 10 - [ ], // Compass 11 - [ ], // Radio slot 12 - [ ], // Watch slot 13 - [ ], // Comms slot 14 - [ ], // WeaponThrow 15 - [ ], // WeaponPut 16 - [ ] // InventoryItems 17 -]]; +if (isNull _object || {_items isEqualTo []}) exitWith {}; if (_items isEqualType true) then { if (_items) then { [_object, _global] call FUNC(removeBox); - _object setVariable [QGVAR(virtualItems), nil, _global]; }; } else { + private _cargo = _object getVariable QGVAR(virtualItems); - // Make sure all items are in string form - _items = _items select {_x isEqualType "" && {_x != ""}}; + if (isNil "_cargo") exitWith { + [_object, _global] call FUNC(removeBox); + }; + // Make sure all items are in string form, then convert to config case (non-existent items return "") + _items = (_items select {_x isEqualType ""}) apply {_x call EFUNC(common,getConfigName)}; + + // Remove any invalid/non-existing items + _items = _items - [""]; + + private _configItemsFlat = uiNamespace getVariable QGVAR(configItemsFlat); + + // Convert all items to their baseWeapon + _items = _items apply {if (_x in _configItemsFlat) then {_x} else {_x call FUNC(baseWeapon)}}; + + // Remove items from lists { - if (_forEachIndex isEqualTo 0) then { - _cargo set [_forEachIndex, [(_x select 0) - _items, (_x select 1) - _items, (_x select 2) - _items]]; - } else { - if (_forEachIndex isEqualTo 1) then { - _cargo set [_forEachIndex, [(_x select 0) - _items, (_x select 1) - _items, (_x select 2) - _items, (_x select 3) - _items]]; - } else { - _cargo set [_cargo find _x, _x - _items]; + switch (true) do { + // Weapons + case (_x in ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_PRIMARY_WEAPONS)): { + ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_PRIMARY_WEAPONS) deleteAt _x; + }; + case (_x in ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_HANDGUN_WEAPONS)): { + ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_HANDGUN_WEAPONS) deleteAt _x; + }; + case (_x in ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_SECONDARY_WEAPONS)): { + ((_cargo get IDX_VIRT_WEAPONS) get IDX_VIRT_SECONDARY_WEAPONS) deleteAt _x; + }; + + // Weapon attachments + case (_x in ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS) deleteAt _x; + }; + case (_x in ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS) deleteAt _x; + }; + case (_x in ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS) deleteAt _x; + }; + case (_x in ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS)): { + ((_cargo get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS) deleteAt _x; + }; + + // Other + default { + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + if (_x in (_cargo get _index)) exitWith { + (_cargo get _index) deleteAt _x; + }; + }; }; }; - } foreach _cargo; + } forEach _items; - private _itemCount = { - if (_x isEqualTo (_cargo select 0) || {_x isEqualTo (_cargo select 1)}) then { - (_x isNotEqualTo [[],[],[]] || {_x isEqualTo [[],[],[],[]]}) - } else { - (_x isNotEqualTo []) - }; - } count _cargo; + private _empty = [ + [IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]], + [IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]] + ]; - if (_itemCount == 0) then { + _empty = createHashMapFromArray _empty; + + for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _empty set [_index, createHashMap]; + }; + + // If nothing is left, remove arsenal from object + if (_cargo isEqualTo _empty) then { [_object, _global] call FUNC(removeBox); } else { _object setVariable [QGVAR(virtualItems), _cargo, _global]; diff --git a/addons/arsenal/functions/fnc_renameDefaultLoadout.sqf b/addons/arsenal/functions/fnc_renameDefaultLoadout.sqf new file mode 100644 index 0000000000..b28088b9b6 --- /dev/null +++ b/addons/arsenal/functions/fnc_renameDefaultLoadout.sqf @@ -0,0 +1,25 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Renames a loadout from the "Default Loadouts" list. + * + * Arguments: + * 0: Current name of loadout + * 1: New name of loadout + * + * Return Value: + * None + * + * Example: + * ["Squad Leader", "Team Leader"] call ace_arsenal_fnc_renameDefaultLoadout + * + * Public: Yes +*/ +params [["_currentName", "", [""]], ["_newName", "", [""]]]; + +if (_currentName isEqualTo _newName) exitWith {}; + +private _loadoutIndex = GVAR(defaultLoadoutsList) findIf {(_x select 0) == _currentName}; +if (_loadoutIndex isEqualTo -1) exitWith {}; + +(GVAR(defaultLoadoutsList) select _loadoutIndex) set [0, _newName]; diff --git a/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf b/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf new file mode 100644 index 0000000000..cbbe02666e --- /dev/null +++ b/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf @@ -0,0 +1,154 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: johnb43 + * Replaces unique items in a loadout with their base items. Weapons are replaced with their base weapon. + * + * Arguments: + * 0: CBA extended loadout or getUnitLoadout array + * + * Return Value: + * Sanitised loadout (getUnitLoadout array) + * + * Example: + * [getUnitLoadout player] call ace_arsenal_fnc_replaceUniqueItemsLoadout + * + * Public: Yes +*/ + +params [["_loadout", [], [[]]]]; + +// IF CBA extended loadout, just take getUnitLoadout array +if (count _loadout == 2) then { + _loadout = _loadout select 0; +}; + +if (count _loadout != 10) exitWith {[]}; + +private _weapon = ""; +private _weaponsInfo = []; +private _uniqueBaseCfgText = ""; +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgVehicles = configFile >> "CfgVehicles"; + +{ + switch (_forEachIndex) do { + // Primary weapon, Secondary weapon, Handgun weapon, Binoculars + case IDX_LOADOUT_PRIMARY_WEAPON; + case IDX_LOADOUT_SECONDARY_WEAPON; + case IDX_LOADOUT_HANDGUN_WEAPON; + case IDX_LOADOUT_BINO: { + _weaponsInfo = _x; + + // Check weapon & weapon attachments + { + // Magazines + if (_forEachIndex in [4, 5]) then { + _x params [["_magazine", ""], "_count"]; + + if (_magazine != "") then { + _uniqueBaseCfgText = (getText (_cfgMagazines >> _magazine >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + _weaponsInfo set [_forEachIndex, [_uniqueBaseCfgText, _count]]; + }; + }; + } else { + // Other + if (_x != "") then { + _weaponsInfo set [_forEachIndex, _x call FUNC(baseWeapon)]; + }; + }; + } forEach _weaponsInfo; + }; + // Uniform, vest, backpack + case IDX_LOADOUT_UNIFORM; + case IDX_LOADOUT_VEST; + case IDX_LOADOUT_BACKPACK: { + _x params [["_containerClass", ""], ["_items", []]]; + + if (_containerClass != "") then { + _uniqueBaseCfgText = (getText ([_cfgWeapons, _cfgVehicles] select (_forEachIndex == IDX_LOADOUT_BACKPACK) >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + (_x select 0) set [0, _uniqueBaseCfgText]; + }; + + // Check if container has items that need replacing with a defined base + { + switch (true) do { + // Containers have 2 entries: Name and isBackpack + case (_x isEqualTypeArray ["", false]); + // Misc. items have 2 entries: Name and amount + case (_x isEqualTypeArray ["", 0]): { + _x params ["_item", "_arg"]; + + if (_item != "") then { + _uniqueBaseCfgText = (getText ([_cfgWeapons, _cfgVehicles] select ((_arg isEqualType false) && {_arg}) >> _item >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + _x set [0, _uniqueBaseCfgText]; + }; + }; + }; + // Weapons have 2 entries: Weapon info array and amount + case (_x isEqualTypeArray [[], 0]): { + _weaponsInfo = _x select 0; + + // Check weapon & weapon attachments + { + // Magazines in weapons have 2 entries: Name and ammo count + if (_forEachIndex in [4, 5]) then { + _x params [["_magazine", ""], "_count"]; + + if (_magazine != "") then { + _uniqueBaseCfgText = (getText (_cfgMagazines >> _magazine >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + _weaponsInfo set [_forEachIndex, [_uniqueBaseCfgText, _count]]; + }; + }; + } else { + // Other + if (_x != "") then { + _weaponsInfo set [_forEachIndex, _x call FUNC(baseWeapon)]; + }; + }; + } forEach _weaponsInfo; + }; + // Magazines have 3 entries: Name, amount and ammo count + case (_x isEqualTypeArray ["", 0, 0]): { + _x params ["_item"]; + + if (_item != "") then { + _uniqueBaseCfgText = (getText (_cfgMagazines >> _item >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + _x set [0, _uniqueBaseCfgText]; + }; + }; + }; + }; + } forEach _items; + }; + }; + // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs + case IDX_LOADOUT_ASSIGNEDITEMS: { + // Check if assignedItems have items that need replacing with a defined base + private _items = _x; + + { + if (_x != "") then { + _uniqueBaseCfgText = (getText (_cfgWeapons >> _x >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + _items set [_forEachIndex, _uniqueBaseCfgText]; + }; + }; + } forEach _items; + }; + }; +} forEach _loadout; + +_loadout diff --git a/addons/arsenal/functions/fnc_scanConfig.sqf b/addons/arsenal/functions/fnc_scanConfig.sqf index 26660d048c..484e1bbbca 100644 --- a/addons/arsenal/functions/fnc_scanConfig.sqf +++ b/addons/arsenal/functions/fnc_scanConfig.sqf @@ -1,7 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +#include "..\defines.hpp" /* - * Author: Dedmen - * Cache an array of all the compatible items for arsenal. + * Author: Dedmen, johnb43 + * Cache an array of all the compatible items for arsenals. * * Arguments: * None @@ -12,178 +13,270 @@ * Public: No */ -private _cargo = [ - [[], [], []], // Weapons 0, primary, secondary, handgun - [[], [], [], []], // WeaponAccessories 1, optic,side,muzzle,bipod - [ ], // Magazines 2 - [ ], // Headgear 3 - [ ], // Uniform 4 - [ ], // Vest 5 - [ ], // Backpacks 6 - [ ], // Goggles 7 - [ ], // NVGs 8 - [ ], // Binoculars 9 - [ ], // Map 10 - [ ], // Compass 11 - [ ], // Radio slot 12 - [ ], // Watch slot 13 - [ ], // Comms slot 14 - [ ], // WeaponThrow 15 - [ ], // WeaponPut 16 - [ ] // InventoryItems 17 +private _configItems = [ + [IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]], + [IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]] ]; -private _configCfgWeapons = configFile >> "CfgWeapons"; //Save this lookup in variable for perf improvement +_configItems = createHashMapFromArray _configItems; +for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _configItems set [_index, createHashMap]; +}; + +// Cache tools for separate tab +private _toolList = createHashMap; + +// https://community.bistudio.com/wiki/Arma_3:_Characters_And_Gear_Encoding_Guide#Character_configuration +// https://github.com/acemod/ACE3/pull/9040#issuecomment-1597748331 +private _filterFunction = toString { + isClass _x && {if (isNumber (_x >> "scopeArsenal")) then {getNumber (_x >> "scopeArsenal") == 2 && {getNumber (_x >> "scope") > 0}} else {getNumber (_x >> "scope") == 2}} && {getNumber (_x >> QGVAR(hide)) != 1} +}; + +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _className = ""; +private _simulationType = ""; +private _configItemInfo = ""; +private _hasItemInfo = false; +private _itemInfoType = 0; +private _isMiscItem = false; +private _isTool = false; + +// Get weapons and other various items { - private _configItemInfo = _x >> "ItemInfo"; - private _simulationType = getText (_x >> "simulation"); - private _className = configName _x; - private _hasItemInfo = isClass (_configItemInfo); - private _itemInfoType = if (_hasItemInfo) then {getNumber (_configItemInfo >> "type")} else {0}; - private _isMiscItem = _className isKindOf ["CBA_MiscItem", (_configCfgWeapons)]; + _className = configName _x; + _simulationType = getText (_x >> "simulation"); + _configItemInfo = _x >> "ItemInfo"; + _hasItemInfo = isClass (_configItemInfo); + _itemInfoType = if (_hasItemInfo) then {getNumber (_configItemInfo >> "type")} else {0}; + _isMiscItem = _className isKindOf ["CBA_MiscItem", _cfgWeapons]; + _isTool = getNumber (_x >> "ACE_isTool") isEqualTo 1; - switch true do { - /* Weapon acc */ + switch (true) do { + // Weapon attachments case ( - _hasItemInfo && - {_itemInfoType in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD]} && - {!_isMiscItem} - ): { - - //Convert type to array index - (_cargo select 1) select ([TYPE_OPTICS,TYPE_FLASHLIGHT,TYPE_MUZZLE,TYPE_BIPOD] find _itemInfoType) pushBackUnique _className; + _hasItemInfo && + {!_isMiscItem} && + {_itemInfoType in [TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_MUZZLE, TYPE_BIPOD]} + ): { + // Convert type to array index + ((_configItems get IDX_VIRT_ATTACHMENTS) get ([TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_MUZZLE, TYPE_BIPOD] find _itemInfoType)) set [_className call FUNC(baseWeapon), nil]; }; - /* Headgear */ + // Headgear case (_itemInfoType == TYPE_HEADGEAR): { - (_cargo select 3) pushBackUnique _className; + (_configItems get IDX_VIRT_HEADGEAR) set [_className, nil]; }; - /* Uniform */ + // Uniform case (_itemInfoType == TYPE_UNIFORM): { - (_cargo select 4) pushBackUnique _className; + (_configItems get IDX_VIRT_UNIFORM) set [_className, nil]; }; - /* Vest */ + // Vest case (_itemInfoType == TYPE_VEST): { - (_cargo select 5) pushBackUnique _className; + (_configItems get IDX_VIRT_VEST) set [_className, nil]; }; - /* NVgs */ + // NVGs case (_simulationType == "NVGoggles"): { - (_cargo select 8) pushBackUnique _className; + (_configItems get IDX_VIRT_NVG) set [_className, nil]; }; - /* Binos */ - case (_simulationType == "Binocular" || - ((_simulationType == 'Weapon') && {(getNumber (_x >> 'type') == TYPE_BINOCULAR_AND_NVG)})): { - (_cargo select 9) pushBackUnique _className; + // Binos + case ( + _simulationType == "Binocular" || + {_simulationType == "Weapon" && {getNumber (_x >> "type") == TYPE_BINOCULAR_AND_NVG}} + ): { + (_configItems get IDX_VIRT_BINO) set [_className call FUNC(baseWeapon), nil]; }; - /* Map */ + // Map case (_simulationType == "ItemMap"): { - (_cargo select 10) pushBackUnique _className; + (_configItems get IDX_VIRT_MAP) set [_className, nil]; }; - /* Compass */ + // Compass case (_simulationType == "ItemCompass"): { - (_cargo select 11) pushBackUnique _className; + (_configItems get IDX_VIRT_COMPASS) set [_className, nil]; }; - /* Radio */ + // Radio case (_simulationType == "ItemRadio"): { - (_cargo select 12) pushBackUnique _className; + (_configItems get IDX_VIRT_RADIO) set [_className, nil]; }; - /* Watch */ + // Watch case (_simulationType == "ItemWatch"): { - (_cargo select 13) pushBackUnique _className; + (_configItems get IDX_VIRT_WATCH) set [_className, nil]; }; - /* GPS */ - case (_simulationType == "ItemGPS"): { - (_cargo select 14) pushBackUnique _className; + // GPS and UAV terminals + case ( + _simulationType == "ItemGPS" || + {_itemInfoType == TYPE_UAV_TERMINAL} + ): { + (_configItems get IDX_VIRT_COMMS) set [_className, nil]; }; - /* UAV terminals */ - case (_itemInfoType == TYPE_UAV_TERMINAL): { - (_cargo select 14) pushBackUnique _className; - }; - /* Weapon, at the bottom to avoid adding binos */ - case (isClass (_x >> "WeaponSlotsInfo") && - {getNumber (_x >> 'type') != TYPE_BINOCULAR_AND_NVG}): { + // Weapon, at the bottom to avoid adding binos + case ( + isClass (_x >> "WeaponSlotsInfo") && + {getNumber (_x >> "type") != TYPE_BINOCULAR_AND_NVG} + ): { switch (getNumber (_x >> "type")) do { case TYPE_WEAPON_PRIMARY: { - (_cargo select 0) select 0 pushBackUnique (_className call bis_fnc_baseWeapon); + ((_configItems get IDX_VIRT_WEAPONS) get IDX_VIRT_PRIMARY_WEAPONS) set [_className call FUNC(baseWeapon), nil]; }; case TYPE_WEAPON_HANDGUN: { - (_cargo select 0) select 2 pushBackUnique (_className call bis_fnc_baseWeapon); + ((_configItems get IDX_VIRT_WEAPONS) get IDX_VIRT_HANDGUN_WEAPONS) set [_className call FUNC(baseWeapon), nil]; }; case TYPE_WEAPON_SECONDARY: { - (_cargo select 0) select 1 pushBackUnique (_className call bis_fnc_baseWeapon); + ((_configItems get IDX_VIRT_WEAPONS) get IDX_VIRT_SECONDARY_WEAPONS) set [_className call FUNC(baseWeapon), nil]; }; }; }; - /* Misc items */ + // Misc. items case ( - _hasItemInfo && - (_itemInfoType in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD] && - {_isMiscItem}) || - {_itemInfoType in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} || - {(getText ( _x >> "simulation")) == "ItemMineDetector"} - ): { - (_cargo select 17) pushBackUnique _className; + _hasItemInfo && + {_isMiscItem && + {_itemInfoType in [TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_MUZZLE, TYPE_BIPOD]}} || + {_itemInfoType in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} || + {_simulationType == "ItemMineDetector"} + ): { + (_configItems get IDX_VIRT_MISC_ITEMS) set [_className, nil]; + if (_isTool) then {_toolList set [_className, nil]}; }; }; -} foreach configProperties [_configCfgWeapons, "isClass _x && {(if (isNumber (_x >> 'scopeArsenal')) then {getNumber (_x >> 'scopeArsenal')} else {getNumber (_x >> 'scope')}) == 2} && {getNumber (_x >> 'ace_arsenal_hide') != 1}", true]; +} forEach configProperties [_cfgWeapons, _filterFunction, true]; -private _grenadeList = []; -{ - _grenadeList append getArray (_configCfgWeapons >> "Throw" >> _x >> "magazines"); -} foreach getArray (_configCfgWeapons >> "Throw" >> "muzzles"); - -private _putList = []; -{ - _putList append getArray (_configCfgWeapons >> "Put" >> _x >> "magazines"); -} foreach getArray (_configCfgWeapons >> "Put" >> "muzzles"); +// Get all grenades +// Explicitly don't look at scope for these, we want hidden items to be sorted as grenades/explosives properly +private _grenadeList = createHashMap; { - private _className = configName _x; + _grenadeList insert [true, (getArray (_cfgWeapons >> "Throw" >> _x >> "magazines")) apply {_x call EFUNC(common,getConfigName)}, []]; +} forEach getArray (_cfgWeapons >> "Throw" >> "muzzles"); - switch true do { +// Get all explosives, mines, IEDS and similar +private _putList = createHashMap; + +{ + _putList insert [true, (getArray (_cfgWeapons >> "Put" >> _x >> "magazines")) apply {_x call EFUNC(common,getConfigName)}, []]; +} forEach getArray (_cfgWeapons >> "Put" >> "muzzles"); + +// Get all magazine misc items +private _magazineMiscItems = createHashMap; + +{ + _magazineMiscItems set [configName _x, nil]; +} forEach ((toString {getNumber (_x >> "ACE_isUnique") == 1}) configClasses _cfgMagazines); + +// Remove invalid/non-existent entries +_grenadeList deleteAt ""; +_putList deleteAt ""; +_magazineMiscItems deleteAt ""; + +// Get all other grenades, explosives (and similar) and magazines +{ + _className = configName _x; + + switch (true) do { + // "Misc. items" magazines (e.g. spare barrels, intel, photos) + case (_className in _magazineMiscItems): { + (_configItems get IDX_VIRT_MISC_ITEMS) set [_className, nil]; + if (getNumber (_x >> "ACE_isTool") isEqualTo 1) then {_toolList set [_className, nil]}; + }; // Grenades case (_className in _grenadeList): { - (_cargo select 15) pushBackUnique _className; + (_configItems get IDX_VIRT_GRENADES) set [_className, nil]; }; - // Put + // Explosives case (_className in _putList): { - (_cargo select 16) pushBackUnique _className; + (_configItems get IDX_VIRT_EXPLOSIVES) set [_className, nil]; }; - // Rifle, handgun, secondary weapons mags + // Primary, handgun & secondary weapon magazines, and magazines that are forced with "ace_arsenal_hide = -1" case ( - ((getNumber (_x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW,TYPE_MAGAZINE_SECONDARY_AND_PUT,1536,TYPE_MAGAZINE_HANDGUN_AND_GL,TYPE_MAGAZINE_MISSILE]) || - {(getNumber (_x >> QGVAR(hide))) == -1}) - ): { - (_cargo select 2) pushBackUnique _className; + getNumber (_x >> QGVAR(hide)) == -1 || + {getNumber (_x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW, TYPE_MAGAZINE_SECONDARY_AND_PUT, 1536, TYPE_MAGAZINE_HANDGUN_AND_GL, TYPE_MAGAZINE_MISSILE]} + ): { + (_configItems get IDX_VIRT_ITEMS_ALL) set [_className, nil]; }; }; -} foreach configProperties [(configFile >> "CfgMagazines"), "isClass _x && {(if (isNumber (_x >> 'scopeArsenal')) then {getNumber (_x >> 'scopeArsenal')} else {getNumber (_x >> 'scope')}) == 2} && {getNumber (_x >> 'ace_arsenal_hide') != 1}", true]; +} forEach configProperties [_cfgMagazines, _filterFunction, true]; +// Get all backpacks { if (getNumber (_x >> "isBackpack") == 1) then { - (_cargo select 6) pushBackUnique (configName _x); + (_configItems get IDX_VIRT_BACKPACK) set [configName _x, nil]; }; -} foreach configProperties [(configFile >> "CfgVehicles"), "isClass _x && {(if (isNumber (_x >> 'scopeArsenal')) then {getNumber (_x >> 'scopeArsenal')} else {getNumber (_x >> 'scope')}) == 2} && {getNumber (_x >> 'ace_arsenal_hide') != 1}", true]; +} forEach configProperties [configFile >> "CfgVehicles", _filterFunction, true]; + +// Get all facewear +{ + (_configItems get IDX_VIRT_GOGGLES) set [configName _x, nil]; +} forEach configProperties [configFile >> "CfgGlasses", _filterFunction, true]; + +// Get all faces +private _faceCache = createHashMap; +private _dlcName = ""; +private _modPicture = ""; +private _faceCategory = ""; { - (_cargo select 7) pushBackUnique (configName _x); -} foreach configProperties [(configFile >> "CfgGlasses"), "isClass _x && {(if (isNumber (_x >> 'scopeArsenal')) then {getNumber (_x >> 'scopeArsenal')} else {getNumber (_x >> 'scope')}) == 2} && {getNumber (_x >> 'ace_arsenal_hide') != 1}", true]; + _faceCategory = configName _x; -private _magazineGroups = createHashMap; - -private _cfgMagazines = configFile >> "CfgMagazines"; - -{ - private _magList = []; { - private _magazines = (getArray _x) select {isClass (_cfgMagazines >> _x)}; //filter out non-existent magazines - _magazines = _magazines apply {configName (_cfgMagazines >> _x)}; //Make sure classname case is correct - _magList append _magazines; - } foreach configProperties [_x, "isArray _x", true]; + if (getNumber (_x >> "disabled") == 0 && {getText (_x >> "head") != ""} && {configName _x != "Default"}) then { + _dlcName = _x call EFUNC(common,getAddon); + _modPicture = ""; - _magazineGroups set [toLower configName _x, _magList arrayIntersect _magList]; -} foreach configProperties [(configFile >> "CfgMagazineWells"), "isClass _x", true]; + if (_dlcName != "") then { + _modPicture = (modParams [_dlcName, ["logo"]]) param [0, ""]; + }; -uiNamespace setVariable [QGVAR(configItems), _cargo]; -uiNamespace setVariable [QGVAR(configItemsFlat), flatten _cargo]; -uiNamespace setVariable [QGVAR(magazineGroups), _magazineGroups]; + _faceCache set [configName _x, [getText (_x >> "displayName"), _modPicture, _faceCategory]]; + }; + } forEach ("true" configClasses _x); +} forEach ("true" configClasses (configfile >> "CfgFaces")); + +// Get all voices +private _voiceCache = (configProperties [configFile >> "CfgVoice", "isClass _x && {getNumber (_x >> 'scope') == 2}", true]) - [configfile >> "CfgVoice" >> "NoVoice"]; +_voiceCache = _voiceCache apply {configName _x}; + +// Get all insignia +private _insigniaCache = "(if (isNumber (_x >> 'scope')) then {getNumber (_x >> 'scope')} else {2}) == 2" configClasses (configFile >> "CfgUnitInsignia"); +_insigniaCache = _insigniaCache apply {configName _x}; + +// Get all disposable launchers +private _launchersConfig = configProperties [configFile >> "CBA_DisposableLaunchers"]; +private _launchers = createHashMap; +private _launcher = ""; + +// Get the loaded launchers (used launchers aren't necessary) +{ + // Convert to config case + _launcher = ((getArray _x) param [0, ""]) call EFUNC(common,getConfigName); + + if (_launcher != "") then { + _launchers set [_launcher, nil]; + }; +} forEach _launchersConfig; + +private _configItemsFlat = +_configItems; +private _weapons = _configItemsFlat deleteAt IDX_VIRT_WEAPONS; +private _attachments = _configItemsFlat deleteAt IDX_VIRT_ATTACHMENTS; + +for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { + _configItemsFlat merge [_configItemsFlat deleteAt _index, true]; +}; + +for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do { + _configItemsFlat merge [_weapons deleteAt _index, true]; +}; + +for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do { + _configItemsFlat merge [_attachments deleteAt _index, true]; +}; + +// This contains config case entries only +uiNamespace setVariable [QGVAR(configItems), _configItems]; +uiNamespace setVariable [QGVAR(configItemsFlat), _configItemsFlat]; +uiNamespace setVariable [QGVAR(faceCache), _faceCache]; +uiNamespace setVariable [QGVAR(voiceCache), _voiceCache]; +uiNamespace setVariable [QGVAR(insigniaCache), _insigniaCache]; +uiNamespace setVariable [QGVAR(grenadeCache), _grenadeList]; +uiNamespace setVariable [QGVAR(putCache), _putList]; +uiNamespace setVariable [QGVAR(magazineMiscItems), _magazineMiscItems]; +uiNamespace setVariable [QGVAR(CBAdisposableLaunchers), _launchers]; +uiNamespace setVariable [QGVAR(configItemsTools), _toolList]; diff --git a/addons/arsenal/functions/fnc_showItem.sqf b/addons/arsenal/functions/fnc_showItem.sqf index 58142d5a3f..76a95e6981 100644 --- a/addons/arsenal/functions/fnc_showItem.sqf +++ b/addons/arsenal/functions/fnc_showItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* * Author: Alganthe @@ -15,54 +15,46 @@ if (GVAR(centerNotPlayer)) exitWith {}; +// Determine action to play based on current category selection private _nextAction = switch (GVAR(currentLeftPanel)) do { - - case IDC_buttonPrimaryWeapon : { - ["Civil", "PrimaryWeapon"] select ((GVAR(currentItems) select 0) != "") + // Primary weapon + case IDC_buttonPrimaryWeapon: { + ["Civil", "PrimaryWeapon"] select ((GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON) != "") }; - case IDC_buttonSecondaryWeapon : { - ["Civil", "SecondaryWeapon"] select (GVAR(currentItems) select 1 != "") + // Secondary weapon + case IDC_buttonSecondaryWeapon: { + ["Civil", "SecondaryWeapon"] select ((GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON) != "") }; - case IDC_buttonHandgun : { - ["Civil", "HandGunOn"] select (GVAR(currentItems) select 2 != "") + // Handgun weapon + case IDC_buttonHandgun: { + ["Civil", "HandGunOn"] select ((GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON) != "") }; - case IDC_buttonHeadgear; - case IDC_buttonUniform; - case IDC_buttonVest; - case IDC_buttonBackpack; - case IDC_buttonGoggles; - case IDC_buttonMap; - case IDC_buttonGPS; - case IDC_buttonRadio; - case IDC_buttonCompass; - case IDC_buttonWatch; - case IDC_buttonFace; - case IDC_buttonNVG : { - "Civil" + // Binoculars + case IDC_buttonBinoculars: { + ["Civil", "Binoculars"] select ((GVAR(currentItems) select IDX_CURR_BINO) != "") }; - case IDC_buttonBinoculars : { - ["Civil", "Binoculars"] select (GVAR(currentItems) select 9 != "") - }; - case IDC_buttonInsignia : { + // Insignia + case IDC_buttonInsignia: { "Salute" }; - case IDC_buttonVoice : { + // Voice + case IDC_buttonVoice: { GVAR(center) directSay "CuratorObjectPlaced"; "Civil" }; + // Other + default { + "Civil" + }; }; +// Play the action if a new category of item was selected if (_nextAction != GVAR(currentAction)) then { - switch (_nextAction) do { - case "PrimaryWeapon": { - GVAR(selectedWeaponType) = 0; - }; - case "SecondaryWeapon": { - GVAR(selectedWeaponType) = 1; - }; - case "HandGunOn": { - GVAR(selectedWeaponType) = 2; - }; + GVAR(selectedWeaponType) = switch (_nextAction) do { + case "PrimaryWeapon": {0}; + case "SecondaryWeapon": {1}; + case "HandGunOn": {2}; + default {GVAR(selectedWeaponType)}; }; if (simulationEnabled GVAR(center)) then { diff --git a/addons/arsenal/functions/fnc_sortPanel.sqf b/addons/arsenal/functions/fnc_sortPanel.sqf index d5524c9078..bbe48d6e35 100644 --- a/addons/arsenal/functions/fnc_sortPanel.sqf +++ b/addons/arsenal/functions/fnc_sortPanel.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe, Dedmen, Brett Mayson - * Sort arsenal panel. + * Author: Alganthe, Dedmen, Brett Mayson, johnb43 + * Sort an arsenal panel. * * Arguments: - * 0: Sort control + * 0: Control * * Return Value: * None @@ -13,12 +13,23 @@ * Public: No */ -params ["_sortControl"]; +params ["_control"]; -private _display = ctrlParent _sortControl; +// When filling the sorting panel, FUNC(sortPanel) is called twice, so ignore first call +if (GVAR(ignoreFirstSortPanelCall)) exitWith { + GVAR(ignoreFirstSortPanelCall) = false; +}; -private _rightSort = ctrlIDC _sortControl == 17; +private _display = ctrlParent _control; +private _rightSort = (ctrlIDC _control) in [IDC_sortRightTab, IDC_sortRightTabDirection]; private _right = _rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]}; +private _sortCtrl = _display displayCtrl ([IDC_sortLeftTab, IDC_sortRightTab] select _rightSort); +private _sortDirectionCtrl = _display displayCtrl ([IDC_sortLeftTabDirection, IDC_sortRightTabDirection] select _rightSort); + +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgFaces = configFile >> "CfgFaces"; +private _cfgUnitInsignia = configFile >> "CfgUnitInsignia"; +private _cfgUnitInsigniaMission = missionConfigFile >> "CfgUnitInsignia"; if (_rightSort) then { [ @@ -33,8 +44,8 @@ if (_rightSort) then { case IDC_buttonThrow; case IDC_buttonPut; case IDC_buttonMag; - case IDC_buttonMagALL: { configFile >> "CfgMagazines" }; - default { configFile >> "CfgWeapons" }; + case IDC_buttonMagALL: {_cfgMagazines}; + default {configFile >> "CfgWeapons"}; }, GVAR(sortListRightPanel) select ( switch (GVAR(currentRightPanel)) do { @@ -56,12 +67,12 @@ if (_rightSort) then { [ _display displayCtrl IDC_leftTabContent, switch (GVAR(currentLeftPanel)) do { - case IDC_buttonBackpack: { configFile >> "CfgVehicles" }; - case IDC_buttonGoggles: { configFile >> "CfgGlasses" }; - case IDC_buttonFace: { configFile >> "CfgFaces" >> "Man_A3" }; - case IDC_buttonVoice: { configFile >> "CfgVoice" }; - case IDC_buttonInsignia: { configFile >> "CfgUnitInsignia" }; - default { configFile >> "CfgWeapons" }; + case IDC_buttonBackpack: {configFile >> "CfgVehicles"}; + case IDC_buttonGoggles: {configFile >> "CfgGlasses"}; + case IDC_buttonFace: {_cfgFaces}; + case IDC_buttonVoice: {configFile >> "CfgVoice"}; + case IDC_buttonInsignia: {_cfgUnitInsignia}; + default {configFile >> "CfgWeapons"}; }, (GVAR(sortListLeftPanel) select ([ IDC_buttonPrimaryWeapon, @@ -86,101 +97,179 @@ if (_rightSort) then { ] } params ["_panel", "_cfgClass", "_sorts"]; +// Get sort & sort direction +private _sortName = _sortCtrl lbData (0 max lbCurSel _sortCtrl); +private _sortDirection = _sortDirectionCtrl lbValue (0 max lbCurSel _sortDirectionCtrl); +(_sorts select (0 max (_sorts findIf {(_x select 0) == _sortName}))) params ["", "_displayName", "_statement"]; + +// Update last sort & sort direction +missionNamespace setVariable [ + [QGVAR(lastSortLeft), QGVAR(lastSortRight)] select _rightSort, + _displayName +]; + +missionNamespace setVariable [ + [QGVAR(lastSortDirectionLeft), QGVAR(lastSortDirectionRight)] select _rightSort, + _sortDirection +]; + +// Get currently selected item private _curSel = if (_right) then { lnbCurSelRow _panel } else { lbCurSel _panel }; + private _selected = if (_right) then { - _panel lnbData [_curSel, 0]; + _panel lnbData [_curSel, 0] } else { _panel lbData _curSel }; -private _sortName = _sortControl lbData (0 max lbCurSel _sortControl); -private _sortConfig = _sorts select (0 max (_sorts findIf {(_x select 0) isEqualTo _sortName})); -private _statement = _sortConfig select 2; - -missionNamespace setVariable [ - [QGVAR(lastSortLeft), QGVAR(lastSortRight)] select _rightSort, - _sortConfig select 1 -]; - private _originalNames = createHashMap; +private _item = ""; +private _quantity = ""; +private _itemCfg = configNull; +private _value = ""; +private _name = ""; +private _fillerChar = toString [1]; + +private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems); +private _sortCache = uiNamespace getVariable QGVAR(sortCache); + +private _faceCache = if (_cfgClass == _cfgFaces) then { + uiNamespace getVariable [QGVAR(faceCache), createHashMap] +} else { + createHashMap +}; + +private _countColumns = if (_right) then { + count lnbGetColumnsPosition _panel +} else { + 0 +}; private _for = if (_right) then { - for '_i' from 0 to ((lnbSize _panel select 0) - 1) + for '_i' from 0 to (lnbSize _panel select 0) - 1 } else { - for '_i' from 0 to (lbSize _panel - 1) + for '_i' from 0 to (lbSize _panel) - 1 }; _for do { - private _item = if (_right) then { + // Get item + _item = if (_right) then { _panel lnbData [_i, 0] } else { _panel lbData _i }; - private _quantity = if (_right) then { + + // Get item's count + _quantity = if (_right) then { parseNumber (_panel lnbText [_i, 2]) } else { 0 }; - private _itemCfg = _cfgClass >> _item; + // "Misc. items" magazines (e.g. spare barrels, intel, photos) + if (_item in _magazineMiscItems) then { + _cfgClass = _cfgMagazines; + }; - // In rare cases, item may not belong to the config class for the panel - // For example, misc items panel can contain CfgVehicles and CfgGlasses items in addition to the usual CfgWeapons items + // Check item's config + _itemCfg = if !(_cfgClass in [_cfgFaces, _cfgUnitInsignia]) then { + _cfgClass >> _item + } else { + // If insignia, check both config and mission file + if (_cfgClass == _cfgUnitInsignia) then { + _itemCfg = _cfgClass >> _item; + + if (isNull _itemCfg) then { + _itemCfg = _cfgUnitInsigniaMission >> _item; + }; + + _itemCfg + } else { + // If face, check correct category + _cfgClass >> (_faceCache get _item) param [2, "Man_A3"] >> _item + }; + }; + + // Some items may not belong to the config class for the panel (e.g. misc. items panel can have unique items) if (isNull _itemCfg) then { _itemCfg = _item call CBA_fnc_getItemConfig; }; - private _value = [_itemCfg, _item, _quantity] call _statement; - if (_value isEqualType 0) then { - _value = [_value, 8] call CBA_fnc_formatNumber; - }; - if (_value isEqualTo "") then { - _value = "_"; - }; + // Value can be any type + _value = _sortCache getOrDefaultCall [format ["%1_%2_%3", _sortName, _item, _quantity], { + private _value = [_itemCfg, _item, _quantity] call _statement; + // If number, convert to string (keep 2 decimal after comma; Needed for correct weight sorting) + if (_value isEqualType 0) then { + _value = [_value, 8, 2] call CBA_fnc_formatNumber; + }; + + // If empty string, add alphabetically small char at beginning to make it sort correctly + if (_value isEqualTo "") then { + _value = "_"; + }; + + _value + }, true]; + + // Save the current row's item's name in a cache and set text to it's sorting value if (_right) then { - private _name = _panel lnbText [_i, 1]; + _name = _panel lnbText [_i, 1]; _originalNames set [_item, _name]; - _panel lnbSetText [[_i, 1], format ["%1%2", _value, _name]]; + // Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed + // Filler char has lowest lexicographical order possible + _panel lnbSetText [[_i, 1], format ["%1%2%4%3", _value, _name, _item, _fillerChar]]; } else { - if (_item isNotEqualTo "") then { - private _name = _panel lbText _i; + if (_item != "") then { + _name = _panel lbText _i; _originalNames set [_item, _name]; - _panel lbSetText [_i, format ["%1%2", _value, _name]]; + // Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed + // Filler char has lowest lexicographical order possible + _panel lbSetText [_i, format ["%1%2%4%3", _value, _name, _item, _fillerChar]]; }; }; }; +// Sort alphabetically, find the previously selected item, select it again and reset text to original text if (_right) then { - _panel lnbSort [1, false]; + _panel lnbSort [1, _sortDirection == ASCENDING]; _for do { - private _data = _panel lnbData [_i, 0]; + _item = _panel lnbData [_i, 0]; - if (_curSel >= 0 && {_data == _selected}) then { + _panel lnbSetText [[_i, 1], _originalNames get _item]; + + // Set selection after text, otherwise item info box on the right side shows invalid name + if (_curSel != -1 && {_item == _selected}) then { _panel lnbSetCurSelRow _i; - }; - _panel lnbSetText [[_i, 1], _originalNames get _data]; + // To avoid unnecessary checks after previsouly selected item was found + _curSel = -1; + }; }; } else { - lbSort [_panel, "ASC"]; + lbSort [_panel, ["DESC", "ASC"] select _sortDirection]; _for do { - private _data = _panel lbData _i; + _item = _panel lbData _i; - if (_curSel >= 0 && {_data == _selected}) then { - _panel lbSetCurSel _i; + // Check if valid item (problems can be caused when searching) + if (_item != "") then { + _panel lbSetText [_i, _originalNames get _item]; }; - if (_data isNotEqualTo "") then { - _panel lbSetText [_i, _originalNames get _data]; + // Set selection after text, otherwise item info box on the right side shows invalid name + if (_curSel != -1 && {_item == _selected}) then { + _panel lbSetCurSel _i; + + // To avoid unnecessary checks after previsouly selected item was found + _curSel = -1; }; }; }; diff --git a/addons/arsenal/functions/fnc_sortStatement_accuracy.sqf b/addons/arsenal/functions/fnc_sortStatement_accuracy.sqf index 76d7570433..48e09246ee 100644 --- a/addons/arsenal/functions/fnc_sortStatement_accuracy.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_accuracy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe, Brett Mayson * Statement to sort weapons by their accuracy. @@ -14,7 +14,6 @@ params ["_config"]; -private _fireModes = getArray (_config >> "modes"); private _dispersion = []; { @@ -27,7 +26,7 @@ private _dispersion = []; _dispersion pushBackUnique _n; }; -} foreach _fireModes; +} forEach (getArray (_config >> "modes")); _dispersion sort true; diff --git a/addons/arsenal/functions/fnc_sortStatement_amount.sqf b/addons/arsenal/functions/fnc_sortStatement_amount.sqf index afafc5dba6..533de80e4f 100644 --- a/addons/arsenal/functions/fnc_sortStatement_amount.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_amount.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Brett Mayson * Statement to sort items by the amount in inventory. * * Arguments: - * 0: Item Config - * 1: Item Name + * 0: Not used + * 1: Not used * 2: Quantity * * Return Value: diff --git a/addons/arsenal/functions/fnc_sortStatement_magCount.sqf b/addons/arsenal/functions/fnc_sortStatement_magCount.sqf index 77a33ff452..6c35911665 100644 --- a/addons/arsenal/functions/fnc_sortStatement_magCount.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_magCount.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Brett Mayson * Statement to sort magazines by their ammo count. diff --git a/addons/arsenal/functions/fnc_sortStatement_mass.sqf b/addons/arsenal/functions/fnc_sortStatement_mass.sqf index 552df474e5..6aa4524ea0 100644 --- a/addons/arsenal/functions/fnc_sortStatement_mass.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_mass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe, Brett Mayson * Statement to sort items by their mass. diff --git a/addons/arsenal/functions/fnc_sortStatement_mod.sqf b/addons/arsenal/functions/fnc_sortStatement_mod.sqf index acba504fc8..ab94520217 100644 --- a/addons/arsenal/functions/fnc_sortStatement_mod.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_mod.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brett Mayson + * Author: Brett Mayson, johnb43 * Statement to sort items by the mod they belong to. * * Arguments: @@ -14,13 +14,4 @@ params ["_config"]; -private _dlc = ""; -private _addons = configSourceAddonList _config; -if (_addons isNotEqualTo []) then { - private _mods = configSourceModList (configfile >> "CfgPatches" >> _addons select 0); - if (_mods isNotEqualTo []) then { - _dlc = _mods select 0; - }; -}; - -modParams [_dlc, ["name"]] param [0, ""] +(modParams [_config call EFUNC(common,getAddon), ["name"]]) param [0, ""] diff --git a/addons/arsenal/functions/fnc_sortStatement_protection.sqf b/addons/arsenal/functions/fnc_sortStatement_protection.sqf index 463c75e03d..f2a479f3b4 100644 --- a/addons/arsenal/functions/fnc_sortStatement_protection.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_protection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Statement to sort items by their protection (combination of ballistic and explosive). @@ -15,10 +15,8 @@ */ params ["_itemInfo", "_ballisticCo", "_explosiveCo"]; -_itemInfo params ["_itemCfg"]; +_itemInfo params ["_config"]; -(([[_itemCfg], ["passthrough", "armor"]] call BIS_fnc_configExtremes) select 1) params [["_passthroughMax", 0], ["_armorMax", 0]]; +(([[_config], ["passthrough", "armor"]] call BIS_fnc_configExtremes) select 1) params [["_passthroughMax", 0], ["_armorMax", 0]]; -private _protectionCombined = _passthroughMax * _ballisticCo + _armorMax * _explosiveCo; - -_protectionCombined +_passthroughMax * _ballisticCo + _armorMax * _explosiveCo; diff --git a/addons/arsenal/functions/fnc_sortStatement_rateOfFire.sqf b/addons/arsenal/functions/fnc_sortStatement_rateOfFire.sqf index 31f177b09d..c5190bb1ba 100644 --- a/addons/arsenal/functions/fnc_sortStatement_rateOfFire.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_rateOfFire.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe, Brett Mayson * Statement to sort weapons by their rate of fire. @@ -14,15 +14,15 @@ params ["_config"]; -private _fireModes = getArray (_config >> "modes"); private _fireRate = []; { _fireRate pushBackUnique getNumber (_config >> _x >> "reloadTime"); -} foreach _fireModes; +} forEach (getArray (_config >> "modes")); _fireRate sort true; _fireRate = _fireRate param [0, 0]; if (_fireRate == 0) exitWith {0}; + round (60 / _fireRate) diff --git a/addons/arsenal/functions/fnc_sortStatement_scopeMag.sqf b/addons/arsenal/functions/fnc_sortStatement_scopeMag.sqf index 76aedce006..4f0998aba5 100644 --- a/addons/arsenal/functions/fnc_sortStatement_scopeMag.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_scopeMag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe, Brett Mayson * Statement to sort optics by their magnification. @@ -7,7 +7,7 @@ * 0: Item Config * * Return Value: - * Sorting Value + * Sorting Value * * Public: No */ @@ -15,6 +15,7 @@ params ["_config"]; private _minZoom = 999; // FOV, so smaller is more zoomed in + { _minZoom = _minZoom min getNumber (_x >> "opticsZoomMin"); } forEach configProperties [_config >> "ItemInfo" >> "OpticsModes", "isClass _x"]; diff --git a/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf b/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf index 1cd3f149c3..e15d3fb659 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf @@ -1,35 +1,37 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Accuracy bar statement. * * Arguments: - * 0: stats array (ARRAY) - * 1: item config path (CONFIG) - * 2: Args - * 2.1: Stat limits (ARRAY of BOOL) - * 2.2: Bar limits (ARRAY of SCALAR) + * 0: Not used + * 1: Item config path + * 2: Args + * - 0: Stat limits + * - 1: Bar limits * * Return Value: - * Number + * * * Public: No */ -params ["_stat", "_config", "_args"]; +params ["", "_config", "_args"]; _args params ["_statMinMax", "_barLimits"]; -private _fireModes = getArray (_config >> "modes"); private _dispersion = []; { if (getNumber (_config >> _x >> "showToPlayer") != 0) then { private _n = log (getNumber (_config >> _x >> "dispersion")); - if (!finite _n) then {_n = 0;}; + if (!finite _n) then { + _n = 0; + }; + _dispersion pushBackUnique _n; }; -} foreach _fireModes; +} forEach (getArray (_config >> "modes")); _dispersion sort true; diff --git a/addons/arsenal/functions/fnc_statBarStatement_default.sqf b/addons/arsenal/functions/fnc_statBarStatement_default.sqf index 4eb0a36f98..0246e765fd 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_default.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_default.sqf @@ -1,21 +1,24 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Generic bar statement for stats. * * Arguments: - * 0: stat (STRING) - * 1: item config path (CONFIG) - * 2: Args for configExtreme - * 2.1: Stat limits (ARRAY of BOOL) - * 2.2: Bar limits (ARRAY of SCALAR) - * 2.3: Evaluate as a logarithmic number (BOOL) + * 0: Stat + * 1: Item config path + * 2: Args for configExtreme + * - 0: Stat limits + * - 1: Bar limits + * - 2: Evaluate as a logarithmic number * * Return Value: - * Number + * Bar statement + * + * Example: + * ["ACE_maxZeroing", _config, [[0, 2500], [0.01, 1], false]] call ace_arsenal_fnc_statBarStatement_default * * Public: Yes -*/ + */ params ["_stat", "_config", "_args"]; _args params ["_statMinMax", "_barLimits", "_configExtremeBool"]; diff --git a/addons/arsenal/functions/fnc_statBarStatement_impact.sqf b/addons/arsenal/functions/fnc_statBarStatement_impact.sqf index c8839e85c2..6707370440 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_impact.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_impact.sqf @@ -1,15 +1,15 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" +#include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Impact bar statement. * * Arguments: - * 0: stats array (ARRAY) - * 1: item config path (CONFIG) - * 2: Args for configExtreme - * 2.1: Stat limits (ARRAY of BOOL) - * 2.2: Bar limits (ARRAY of SCALAR) - * 2.3: Evaluate as a logarithmic number (BOOL) + * 0: Stats array + * 1: Item config path + * 2: Args for configExtreme + * - 0: Stats limits + * - 1: Bar limits * * Return Value: * Number @@ -18,7 +18,7 @@ */ params ["_stats", "_config", "_args"]; -_args params ["_hitMinMax", "_initSpeedMinMax", "_launcherTabIDC"]; +_args params ["_hitMinMax", "_initSpeedMinMax"]; private _statValues = [ [_config], @@ -31,4 +31,5 @@ private _statValues = [ _hit = linearConversion [_hitMinMax select 0, _hitMinMax select 1, _hit, 0.01, 1]; _initSpeed = linearConversion [_initSpeedMinMax select 0, _initSpeedMinMax select 1, _initSpeed, 0.01, 1]; -[sqrt(_hit^2 * _initSpeed), _hit] select (GVAR(currentLeftPanel) == _launcherTabIDC) +// If launcher tab +[sqrt (_hit ^ 2 * _initSpeed), _hit] select (GVAR(currentLeftPanel) == IDC_buttonSecondaryWeapon) diff --git a/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf b/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf index 6b268a3e56..562e920642 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf @@ -1,14 +1,14 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Rate of fire bar statement. * * Arguments: - * 0: stats array (ARRAY) - * 1: item config path (CONFIG) - * 2: Args - * 2.1: Stat limits (ARRAY of BOOL) - * 2.2: Bar limits (ARRAY of SCALAR) + * 0: Not used + * 1: Item config path + * 2: Args + * - 0: Stat limits + * - 1: Bar limits * * Return Value: * Number @@ -16,17 +16,20 @@ * Public: No */ -params ["_stat", "_config", "_args"]; +params ["", "_config", "_args"]; _args params ["_statMinMax", "_barLimits"]; -private _fireModes = getArray (_config >> "modes"); private _fireRate = []; { private _n = log (getNumber (_config >> _x >> "reloadTime")); - if (!finite _n) then {_n = 0;}; + + if (!finite _n) then { + _n = 0; + }; + _fireRate pushBackUnique _n; -} foreach _fireModes; +} forEach (getArray (_config >> "modes")); _fireRate sort true; diff --git a/addons/arsenal/functions/fnc_statTextStatement_accuracy.sqf b/addons/arsenal/functions/fnc_statTextStatement_accuracy.sqf index cb2687097b..10a929df67 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_accuracy.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_accuracy.sqf @@ -1,34 +1,30 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Accuracy text statement. * * Arguments: - * 0: stat (STRING) - * 1: item config path (CONFIG) - * 2: Args for configExtreme - * 2.1: Stat limits (ARRAY of BOOL) - * 2.2: Evaluate as a logarithmic number (BOOL) + * 0: Not used + * 1: Item config path * * Return Value: - * Number + * Stat Text * * Public: No */ -params ["_stat", "_config", "_args"]; -_args params ["_statMinMax", "_configExtremeBool"]; +params ["", "_config"]; +TRACE_1("statTextStatement_accuracy",_config); -private _fireModes = getArray (_config >> "modes"); private _dispersion = []; { if (getNumber (_config >> _x >> "showToPlayer") != 0) then { _dispersion pushBackUnique (getNumber (_config >> _x >> "dispersion")); }; -} foreach _fireModes; +} forEach (getArray (_config >> "modes")); _dispersion sort true; _dispersion = _dispersion param [0, 0]; -format ["%1 MIL (%2 MOA)", (_dispersion * 1000) toFixed 2, (_dispersion / pi * 10800) ToFixed 1]; +format ["%1 MIL (%2 MOA)", (_dispersion * 1000) toFixed 2, (_dispersion / pi * 10800) toFixed 1]; diff --git a/addons/arsenal/functions/fnc_statTextStatement_binoMag.sqf b/addons/arsenal/functions/fnc_statTextStatement_binoMag.sqf new file mode 100644 index 0000000000..15ff9f0347 --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_binoMag.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror, LinkIsGrim + * Text statement for the binocular magnification stat. + * + * Arguments: + * 0: Not used + * 1: Item config path + * + * Return Value: + * Stat Text + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_binoMag",_config); + +private _minZoom = getNumber (_config >> "opticsZoomMin"); // FOV, so smaller is more zoomed in +private _maxZoom = getNumber (_config >> "opticsZoomMax"); + +if (_minZoom == 0) exitWith {"?"}; + +private _maxMagnification = (0.25 / _minZoom) toFixed 1; +private _minMagnification = (0.25 / _maxZoom); +if (_minMagnification < 1) then { + _minMagnification = 1; +}; +_minMagnification = _minMagnification toFixed 1; + +if (_minMagnification == _maxMagnification) exitWith { + format ["%1x", _maxMagnification] +}; + +format ["%1x-%2x", _minMagnification, _maxMagnification] diff --git a/addons/arsenal/functions/fnc_statTextStatement_binoVisionMode.sqf b/addons/arsenal/functions/fnc_statTextStatement_binoVisionMode.sqf new file mode 100644 index 0000000000..6da45345f4 --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_binoVisionMode.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Dedmen, johnb43, LinkIsGrim + * Text statement for the binocular/NVG vision mode stat. + * + * Arguments: + * 0: Not used + * 1: Item config path + * + * Return Value: + * Stat Text + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_binoVisionMode",_config); + +private _text = []; +private _visionModes = getArray (_config >> "visionMode") apply {toLower _x}; +{ + if (_x in _visionModes) then { + _text pushBack (localize ([LSTRING(VisionNormal), LSTRING(VisionNight), LSTRING(VisionThermal)] select _forEachIndex)); + }; +} forEach ["normal", "nvg", "ti"]; + +_text joinString ", " diff --git a/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf b/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf index feaec39276..5b4d637299 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_explosionTime.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Text statement for the explosion time stat. * * Arguments: - * 0: Stats Array (not used) - * 1: Item Config + * 0: Not used + * 1: Item config path * * Return Value: * Stat Text @@ -17,17 +17,19 @@ */ params ["", "_config"]; +TRACE_1("statTextStatement_explosionTime",_config); private _ammoConfig = configFile >> "CfgAmmo" >> getText (_config >> "ammo"); private _timeToLive = getNumber (_ammoConfig >> "timeToLive"); private _explosionTime = getNumber (_ammoConfig >> "explosionTime"); +// Handle IR grenades if (_explosionTime > _timeToLive) exitWith { - "-" // Handle IR grenades + "-" }; if (_explosionTime == -1) exitWith { - localize LSTRING(DetonatesOnImpact) + LLSTRING(DetonatesOnImpact) }; format ["%1s", _explosionTime] diff --git a/addons/arsenal/functions/fnc_statTextStatement_magCount.sqf b/addons/arsenal/functions/fnc_statTextStatement_magCount.sqf new file mode 100644 index 0000000000..b2b46307fc --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_magCount.sqf @@ -0,0 +1,19 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Text statement for the magazine capacity stat. + * + * Arguments: + * 0: Stats Array (not used) + * 1: Item config path + * + * Return Value: + * String to display + * + * Public: No +*/ + +params ["", "_config"]; +TRACE_1("statTextStatement_magCount",_config) + +getNumber (_config >> "count"); diff --git a/addons/arsenal/functions/fnc_statTextStatement_mass.sqf b/addons/arsenal/functions/fnc_statTextStatement_mass.sqf index 9c2a0501a6..d87334c64f 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_mass.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_mass.sqf @@ -1,19 +1,20 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Text statement for the mass stat. * * Arguments: - * 0: not used - * 1: item config path (CONFIG) + * 0: Not used + * 1: Item config path * * Return Value: - * String to display + * Stat Text * * Public: No */ params ["", "_config"]; +TRACE_1("statTextStatement_mass",_config); private _mass = getNumber (_config >> "mass"); @@ -25,4 +26,4 @@ if (_mass == 0 && {isClass (_config >> "WeaponSlotsInfo")}) then { _mass = getNumber (_config >> "WeaponSlotsInfo" >> "mass"); }; -format ["%1kg (%2lb)",((_mass * 0.1 * (1/2.2046) * 100) / 100) ToFixed 2, ((_mass * 0.1 * 100) / 100) ToFixed 2] +format ["%1kg (%2lb)", ((_mass * 0.1 * (1 / 2.2046) * 100) / 100) toFixed 2, ((_mass * 0.1 * 100) / 100) toFixed 2] diff --git a/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf b/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf index edc6fafc9b..5d35e9a4e0 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_rateOfFire.sqf @@ -1,33 +1,30 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Rate of fire text statement. * * Arguments: - * 0: stat (STRING) - * 1: item config path (CONFIG) - * 2: Args for configExtreme - * 2.1: Stat limits (ARRAY of BOOL) - * 2.2: Evaluate as a logarithmic number (BOOL) + * 0: Not used + * 1: Item config path * * Return Value: - * String + * Stat Text * * Public: No */ -params ["_stat", "_config", "_args"]; -_args params ["_statMinMax", "_configExtremeBool"]; +params ["", "_config"]; +TRACE_1("statTextStatement_rateOfFire",_config); -private _fireModes = getArray (_config >> "modes"); private _fireRate = []; { _fireRate pushBackUnique (getNumber (_config >> _x >> "reloadTime")); -} foreach _fireModes; +} forEach (getArray (_config >> "modes")); _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_statTextStatement_scopeMag.sqf b/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf index f817ff6c3f..af6ef4b24e 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf @@ -1,14 +1,14 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Text statement for the scope magnification stat. * * Arguments: - * 0: not used - * 1: item config path (CONFIG) + * 0: Not used + * 1: Item config path * * Return Value: - * String to display + * Stat Text * * Public: No */ @@ -17,10 +17,31 @@ params ["", "_config"]; TRACE_1("statTextStatement_scopeMag",_config); private _minZoom = 999; // FOV, so smaller is more zoomed in +private _maxZoom = 1.25; // Cap at 1x zoomed out + +private _opticsModes = "true" configClasses (_config >> "ItemInfo" >> "OpticsModes"); { + // If there is a primary mode then just use that + if (getNumber (_x >> "useModelOptics") == 1 || {count _opticsModes == 1}) exitWith { + _minZoom = getNumber (_x >> "opticsZoomMin"); + _maxZoom = getNumber (_x >> "opticsZoomMax"); + }; + // Otherwise go through the optic's modes _minZoom = _minZoom min (getNumber (_x >> "opticsZoomMin")); -} forEach configProperties [_config >> "ItemInfo" >> "OpticsModes"]; + _maxZoom = _maxZoom max (getNumber (_x >> "opticsZoomMax")); +} forEach _opticsModes; if (_minZoom in [0, 999]) exitWith {"?"}; -format ["%1x", (0.25/_minZoom) toFixed 1] +private _maxMagnification = (0.25 / _minZoom) toFixed 1; +private _minMagnification = (0.25 / _maxZoom); +if (_minMagnification < 1) then { + _minMagnification = 1; +}; +_minMagnification = _minMagnification toFixed 1; + +if (_minMagnification == _maxMagnification) exitWith { + format ["%1x", _maxMagnification] +}; + +format ["%1x-%2x", _minMagnification, _maxMagnification] diff --git a/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf b/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf index f5a29f1996..dca83cb381 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf @@ -1,14 +1,14 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Dedmen + * Author: Dedmen, johnb43 * Text statement for the scope Night vision support stat. * * Arguments: - * 0: not used - * 1: item config path (CONFIG) + * 0: Not used + * 1: Item config path * * Return Value: - * String to display + * Stat Text * * Public: No */ @@ -17,12 +17,12 @@ params ["", "_config"]; TRACE_1("statTextStatement_scopeVisionMode",_config); private _opticsModes = ("true" configClasses (_config >> "ItemInfo" >> "OpticsModes")) apply { - private _visionMode = getArray (_x >> "visionMode"); + private _visionMode = getArray (_x >> "visionMode") apply {toLower _x}; [ - getNumber (_x >> "useModelOptics") == 1, //is in optics - _visionMode isEqualTo [], //optional NVG - "NVG" in _visionMode, //Integrated NVG - "Ti" in _visionMode //Integrated Thermal + getNumber (_x >> "useModelOptics") == 1, // Is in optics + _visionMode isEqualTo [], // Optional NVG + "nvg" in _visionMode, // Integrated NVG + "ti" in _visionMode // Integrated Thermal ] }; @@ -33,34 +33,40 @@ private _secondaryNVGSupported = false; { _x params ["_isPrimary", "_optionalNvg", "_integratedNVG", "_integratedTi"]; + if (_isPrimary) then { if (_integratedNVG) then { _primaryNVGIntegrated = true; }; + if (_optionalNvg) then { _primaryNVGSupported = true; }; + if (_integratedTi) then { _primaryTiIntegrated = true; }; } else { if (_optionalNvg) then { _secondaryNVGSupported = true; - } - } + }; + }; } forEach _opticsModes; -//Detecting Primary by useModelOptics works in 99.9% of cases. -//But on some scopes (from one specific mod) even the primary mode has useModelOptics=false -//So we have this workaround +// Detecting Primary by useModelOptics works in 99.9% of cases. +// But on some scopes (from one specific mod) even the primary mode has useModelOptics=false +// So we have this workaround -if ( - count _opticsModes == 1 || //If we only have a single mode. And it's a secondary, then consider it primary. - {{_x select 1} count _opticsModes == count _opticsModes} //If every mode supports it. Then then the primary also supports it -) then { +// If we only have a single mode and it's a secondary, then consider it primary. +if (count _opticsModes == 1 && {!(_opticsModes select 0 select 0)}) then { _primaryNVGSupported = _secondaryNVGSupported; }; +// If all modes support NVGs, then the primary also supports it +if (!_primaryNVGSupported && {(_opticsModes select {_x select 1}) isEqualTo _opticsModes}) then { + _primaryNVGSupported = true; +}; + if (_primaryNVGIntegrated) exitWith {LLSTRING(statVisionMode_IntPrim)}; if (_primaryNVGSupported) exitWith {LLSTRING(statVisionMode_supPrim)}; if (_secondaryNVGSupported) exitWith {LLSTRING(statVisionMode_supSec)}; diff --git a/addons/arsenal/functions/fnc_statTextStatement_smokeChemTTL.sqf b/addons/arsenal/functions/fnc_statTextStatement_smokeChemTTL.sqf index edbcc715ae..729a024073 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_smokeChemTTL.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_smokeChemTTL.sqf @@ -1,25 +1,25 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Text statement for the smoke / chemlight time to live stat. * * Arguments: - * 0: not used - * 1: item config path (CONFIG) + * 0: Not used + * 1: Item config path * * Return Value: - * String to display + * Stat Text * * Public: No */ params ["", "_config"]; +TRACE_1("statTextStatement_smokeChemTTL",_config); private _TTL = getNumber (configFile >> "CfgAmmo" >> getText (_config >> "ammo") >> "timeToLive"); if (_TTL > 3600) then { - - _TTL = _TTL / 60^2; + _TTL = _TTL / 3600; _TTL = str _TTL splitString "."; if (count _TTL > 1) then { @@ -35,6 +35,5 @@ if (_TTL > 3600) then { ] }; } else { - - format ["%1m", round (_TTL / 60)]; + format ["%1m", round (_TTL / 60)] }; diff --git a/addons/arsenal/functions/fnc_updateCamPos.sqf b/addons/arsenal/functions/fnc_updateCamPos.sqf index 66bad37936..0bbfeffded 100644 --- a/addons/arsenal/functions/fnc_updateCamPos.sqf +++ b/addons/arsenal/functions/fnc_updateCamPos.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Karel Moricky, modified by Alganthe - * Update camera position + * Update camera position. * Modernized a bit, modified vars to fit arsenal rewrite. * * Arguments: @@ -10,12 +10,16 @@ * Return Value: * None * + * Example: + * call ace_arsenal_fnc_updateCamPos + * * Public: Yes -*/ + */ -GVAR(cameraPosition) params ["_distance", "_dirH", "_dirV"]; -[GVAR(cameraHelper), [_dirH + 180, - _dirV, 0]] call bis_fnc_setobjectrotation; -GVAR(cameraHelper) attachTo [GVAR(center), GVAR(cameraPosition) select 3, ""]; //--- Reattach for smooth movement +GVAR(cameraPosition) params ["_distance", "_dirH", "_dirV"]; + +[GVAR(cameraHelper), [_dirH + 180, - _dirV, 0]] call BIS_fnc_setObjectRotation; +GVAR(cameraHelper) attachTo [GVAR(center), GVAR(cameraPosition) select 3, ""]; // Reattach for smooth movement GVAR(camera) setPos (GVAR(cameraHelper) modelToWorld [0, -_distance, 0]); GVAR(camera) setVectorDirAndUp [vectorDir GVAR(cameraHelper), vectorUp GVAR(cameraHelper)]; diff --git a/addons/arsenal/functions/fnc_updateCurrentItemsList.sqf b/addons/arsenal/functions/fnc_updateCurrentItemsList.sqf new file mode 100644 index 0000000000..0b1af5d465 --- /dev/null +++ b/addons/arsenal/functions/fnc_updateCurrentItemsList.sqf @@ -0,0 +1,85 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: johnb43 + * Updates the list of current items. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No +*/ + +GVAR(currentItems) = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", [], [], [], [], [], [], []]; + +private _isWeapon = false; +private _indexCurrentItems = -1; + +// Add the items the player has to currentItems +{ + switch (_forEachIndex) do { + // Primary weapon, Secondary weapon, Handgun weapon, Binoculars + case IDX_LOADOUT_PRIMARY_WEAPON; + case IDX_LOADOUT_SECONDARY_WEAPON; + case IDX_LOADOUT_HANDGUN_WEAPON; + case IDX_LOADOUT_BINO: { + _x params [["_weapon", ""], ["_muzzle", ""], ["_flashlight", ""], ["_optics", ""], ["_primaryMagazine", []], ["_secondaryMagazine", []], ["_bipod", ""]]; + + // Find baseweapon of weapon + if (_weapon != "") then { + _weapon = _weapon call FUNC(baseWeapon); + }; + + _isWeapon = _forEachIndex != IDX_LOADOUT_BINO; + + // If bino, add it in a different place than regular weapons + GVAR(currentItems) set [[IDX_CURR_BINO, _forEachIndex] select _isWeapon, _weapon]; + + _indexCurrentItems = [IDX_CURR_BINO_ITEMS, IDX_CURR_PRIMARY_WEAPON_ITEMS + _forEachIndex] select _isWeapon; + + // Add weapon attachments + { + (GVAR(currentItems) select _indexCurrentItems) set [[2, 1, 0, 3] select _forEachIndex, if (_x != "") then {_x call FUNC(baseWeapon)} else {_x}]; + } forEach [_optics, _flashlight, _muzzle, _bipod]; + + // Add magazines + { + // Magazines are at index 4 & 5 in array -> That's why +4 + (GVAR(currentItems) select _indexCurrentItems) set [_forEachIndex + 4, _x param [0, ""]]; + } forEach [_primaryMagazine, _secondaryMagazine]; + }; + // Uniform + case IDX_LOADOUT_UNIFORM: { + GVAR(currentItems) set [IDX_CURR_UNIFORM, _x param [0, ""]]; + GVAR(currentItems) set [IDX_CURR_UNIFORM_ITEMS, _x param [1, []]]; + }; + // Vest + case IDX_LOADOUT_VEST: { + GVAR(currentItems) set [IDX_CURR_VEST, _x param [0, ""]]; + GVAR(currentItems) set [IDX_CURR_VEST_ITEMS, _x param [1, []]]; + }; + // Backpack + case IDX_LOADOUT_BACKPACK: { + GVAR(currentItems) set [IDX_CURR_BACKPACK, _x param [0, ""]]; + GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, _x param [1, []]]; + }; + // Helmet + case IDX_LOADOUT_HEADGEAR: { + GVAR(currentItems) set [IDX_CURR_HEADGEAR, _x]; + }; + // Facewear + case IDX_LOADOUT_GOGGLES: { + GVAR(currentItems) set [IDX_CURR_GOGGLES, _x]; + }; + // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs + case IDX_LOADOUT_ASSIGNEDITEMS: { + { + // Order of storing currentItems is different than what getUnitLoadout returns, so do some math + GVAR(currentItems) set [IDX_CURR_NVG + ([2, 6, 4, 3, 5, 0] select _forEachIndex), _x]; + } forEach _x; + }; + }; +} forEach (getUnitLoadout GVAR(center)); // Only need items, not extended loadout diff --git a/addons/arsenal/functions/fnc_updateRightPanel.sqf b/addons/arsenal/functions/fnc_updateRightPanel.sqf index 8114b8a568..e51f923655 100644 --- a/addons/arsenal/functions/fnc_updateRightPanel.sqf +++ b/addons/arsenal/functions/fnc_updateRightPanel.sqf @@ -1,12 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe + * Author: Alganthe, johnb43 * Update the right panel (listnbox). * * Arguments: * 0: Right panel control - * 1: Max load of the current container + * 1: Container + * 2: If container has items * * Return Value: * None @@ -14,44 +15,46 @@ * Public: No */ -params ["_control", "_maxLoad"]; +params ["_control", "_container", "_hasItems"]; -private _loadIndicatorBarCtrl = _display displayCtrl IDC_loadIndicatorBar; -private _curSel = lnbCurSelRow _control; +private _loadRemaining = maxLoad _container - loadAbs _container; +private _rightPanelCache = uiNamespace getVariable [QGVAR(rightPanelCache), createHashMap]; -(lnbSize _control) params ["_rows"]; +private _mass = -1; +private _color = []; +private _alpha = 1; -_maxLoad = getnumber (configfile >> "CfgVehicles" >> _maxLoad >> "maximumLoad"); -_maxLoad = _maxLoad * (1 - (progressPosition _loadIndicatorBarCtrl)); -_maxLoad = parseNumber (_maxLoad toFixed 2); // Required to avoid an issue where even though the typename returns "SCALAR" it doesn't act as one. +// Grey out items that are too big to fit in remaining space of the container +for "_row" from 0 to (lnbSize _control select 0) - 1 do { + _mass = _rightPanelCache getOrDefault [_control lnbData [_row, 0], 0]; + _color = _control lnbColor [_row, 1]; -// Grey out items too big -for "_r" from 0 to (_rows - 1) do { - private _mass = _control getVariable (_control lnbData [_r, 0]); - private _class = _control lnbText [_r, 1]; - - private _alpha = [0.25, 1.0] select (_mass <= _maxLoad); - private _color = [1, 1, 1, _alpha]; - _control lnbSetColor [[_r, 1],_color]; - _control lnbSetColor [[_r, 2],_color]; + // Lower alpha on color for items that can't fit + _alpha = [0.25, 1] select (_mass <= _loadRemaining); + _color set [3, _alpha]; + _control lnbSetColor [[_row, 1], _color]; + _control lnbSetColor [[_row, 2], [1, 1, 1, _alpha]]; }; -// Remove all from container show / hide +private _display = ctrlParent _control; + +// If there are items inside container, show "remove all" button private _removeAllCtrl = _display displayCtrl IDC_buttonRemoveAll; -if (progressPosition _loadIndicatorBarCtrl > 0) then { +// A separate "_hasItems" argument is needed, because items can have no mass +_removeAllCtrl ctrlSetFade 0; +_removeAllCtrl ctrlShow _hasItems; +_removeAllCtrl ctrlEnable _hasItems; +_removeAllCtrl ctrlCommit FADE_DELAY; - _removeAllCtrl ctrlSetFade 0; - _removeAllCtrl ctrlShow true; - _removeAllCtrl ctrlEnable true; - _removeAllCtrl ctrlCommit FADE_DELAY; -}; +// Update weight display +(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", GVAR(center) call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); -(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", [GVAR(center), 2] call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); +private _curSel = lnbCurSelRow _control; -// change button color if unique or too big +// Disable '+' button if item is unique or too big to fit in remaining space if (_curSel != -1) then { private _plusButtonCtrl = _display displayCtrl IDC_arrowPlus; - _plusButtonCtrl ctrlEnable !((_control lnbValue [_curSel, 2]) == 1 || {(_control getVariable (_control lnbData [_curSel, 0])) > _maxLoad}); + _plusButtonCtrl ctrlEnable !((_control lnbValue [_curSel, 2]) == 1 || {(_rightPanelCache getOrDefault [_control lnbData [_curSel, 0], 0]) > _loadRemaining}); _plusButtonCtrl ctrlCommit FADE_DELAY; }; diff --git a/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf b/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf index e0aec74273..ccbf7b7abb 100644 --- a/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf +++ b/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf @@ -1,8 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe - * Update the list of unique items. + * Author: Alganthe, johnb43 + * Updates the list of unique inventory items and unique equipment. + * Unique inventory items are items within containers that can't be multiplied using the arsenal. + * Unique equipment are any items (such as weapons, containers, etc.) that can't be multiplied using the arsenal. * * Arguments: * None @@ -13,106 +15,266 @@ * Public: No */ -GVAR(virtualItems) set [18, []]; -GVAR(virtualItems) set [19, []]; -GVAR(virtualItems) set [20, []]; -GVAR(virtualItems) set [21, []]; -GVAR(virtualItems) set [22, [[], [], [], []]]; -GVAR(virtualItems) set [23, []]; -GVAR(virtualItems) set [24, []]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_MISC_ITEMS, createHashMap]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL, createHashMap]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_GRENADES, createHashMap]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_EXPLOSIVES, createHashMap]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_BACKPACKS, createHashMap]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_GOGGLES, createHashMap]; +GVAR(virtualItems) set [IDX_VIRT_UNIQUE_UNKNOWN_ITEMS, createHashMap]; -private _array = LIST_DEFAULTS select IDX_VIRT_ITEMS_ALL; -private _itemsCache = uiNamespace getVariable QGVAR(configItems); +private _configItems = uiNamespace getVariable QGVAR(configItems); -private _configCfgWeapons = configFile >> "CfgWeapons"; -private _configMagazines = configFile >> "CfgMagazines"; -private _configVehicles = configFile >> "CfgVehicles"; -private _configGlasses = configFile >> "CfgGlasses"; +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgVehicles = configFile >> "CfgVehicles"; +private _cfgGlasses = configFile >> "CfgGlasses"; +// Remove unique equipment in every panel +private _items = createHashMap; + +private _fnc_uniqueEquipment = { + params ["_items", "_item", ["_removeAllUniqueItems", true]]; + + // Remove all unique equipment from tab + if (_removeAllUniqueItems) then { + private _itemsToDelete = []; + + { + if (!isNil "_y") then { + _itemsToDelete pushBack _x; + }; + } forEach _items; + + { + _items deleteAt _x; + GVAR(virtualItemsFlatAll) deleteAt _x; + } forEach _itemsToDelete; + }; + + // Add item as a unique equipment + if (_item != "") then { + _items set [_item, true, true]; + GVAR(virtualItemsFlatAll) set [_item, true, true]; + }; +}; + +// Add the items the player has to virtualItems as unique equipment { - switch true do { - // Weapon mag - case ( - isClass (_configMagazines >> _x) && - {_x in (_itemsCache select 2)} && - {!(_x in (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL))} - ): { - (GVAR(virtualItems) select 19) pushBackUnique _x; + switch (_forEachIndex) do { + // Primary weapon, Secondary weapon, Handgun weapon, Binoculars + case IDX_LOADOUT_PRIMARY_WEAPON; + case IDX_LOADOUT_SECONDARY_WEAPON; + case IDX_LOADOUT_HANDGUN_WEAPON; + case IDX_LOADOUT_BINO: { + _x params [["_weapon", ""], ["_muzzle", ""], ["_flashlight", ""], ["_optics", ""], ["_primaryMagazine", []], ["_secondaryMagazine", []], ["_bipod", ""]]; + + // If bino, add it in a different place than regular weapons + _items = if (_forEachIndex != IDX_LOADOUT_BINO) then { + (GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _forEachIndex + } else { + GVAR(virtualItems) get IDX_VIRT_BINO + }; + + // Remove all unique equipment in tab; Add weapon as a unique equipment + [_items, _weapon call FUNC(baseWeapon)] call _fnc_uniqueEquipment; + + private _removeUniqueItems = _forEachIndex == IDX_LOADOUT_PRIMARY_WEAPON; + + // Add weapon attachments + { + // Remove all unique equipment in tab; Add weapon attachment as a unique equipment + [(GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get _forEachIndex, _x call FUNC(baseWeapon), _removeUniqueItems] call _fnc_uniqueEquipment; + } forEach [_optics, _flashlight, _muzzle, _bipod]; + + // Add magazines + { + // Remove all unique equipment in tab; Add magazine as unique equipment + [GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL, _x param [0, ""], _removeUniqueItems && {_forEachIndex == 0}] call _fnc_uniqueEquipment; + } forEach [_primaryMagazine, _secondaryMagazine]; }; - // Mag throw - case ( - isClass (_configMagazines >> _x) && - {_x in (_itemsCache select 15)} && - {!(_x in (GVAR(virtualItems) select 15))} - ): { - (GVAR(virtualItems) select 20) pushBackUnique _x; - }; + // Uniform, vest, backpack + case IDX_LOADOUT_UNIFORM; + case IDX_LOADOUT_VEST; + case IDX_LOADOUT_BACKPACK: { + _x params [["_containerClass", ""]]; - // Mag put - case ( - isClass (_configMagazines >> _x) && - {_x in (_itemsCache select 16)} && - {!(_x in (GVAR(virtualItems) select 16))} - ): { - (GVAR(virtualItems) select 21) pushBackUnique _x; + // Remove all unique equipment in tab; Add container as a unique equipment + [GVAR(virtualItems) get (_forEachIndex + 1), _containerClass] call _fnc_uniqueEquipment; }; - - // acc - case ( - isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 0))} && - {_x in ((_itemsCache select 1) select 0)} - ): { - ((GVAR(virtualItems) select 22) select 0) pushBackUnique _x; + // Helmet + case IDX_LOADOUT_HEADGEAR: { + // Remove all unique equipment in tab; Add item as a unique equipment + [GVAR(virtualItems) get IDX_VIRT_HEADGEAR, _x] call _fnc_uniqueEquipment; }; - - // acc - case ( - isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 1))} && - {_x in ((_itemsCache select 1) select 1)} - ): { - ((GVAR(virtualItems) select 22) select 1) pushBackUnique _x; - }; - - // acc - case ( - isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 2))} && - {_x in ((_itemsCache select 1) select 2)} - ): { - ((GVAR(virtualItems) select 22) select 2) pushBackUnique _x; - }; - // acc - case ( - isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 3))} && - {_x in ((_itemsCache select 1) select 3)} - ): { - ((GVAR(virtualItems) select 22) select 3) pushBackUnique _x; - }; - - // Misc - case ( - isClass (_configCfgWeapons >> _x) && - {!(_x in (GVAR(virtualItems) select 17))} && - {!(_x in ((_itemsCache select 1) select 0))} && - {!(_x in ((_itemsCache select 1) select 1))} && - {!(_x in ((_itemsCache select 1) select 2))} && - {!(_x in ((_itemsCache select 1) select 3))} - ): { - (GVAR(virtualItems) select 18) pushBackUnique _x; - }; - - // Backpacks - case (getNumber (_configVehicles >> _x >> "isBackpack") == 1): { - (GVAR(virtualItems) select 23) pushBackUnique _x; - }; - // Facewear - case (isClass (_configGlasses >> _x)): { - (GVAR(virtualItems) select 24) pushBackUnique _x; + case IDX_LOADOUT_GOGGLES: { + // Remove all unique equipment in tab; Add item as a unique equipment + [GVAR(virtualItems) get IDX_VIRT_GOGGLES, _x] call _fnc_uniqueEquipment; + }; + // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs + case IDX_LOADOUT_ASSIGNEDITEMS: { + { + // Order of storing virtualItems is different than what getUnitLoadout returns, so do some math + // Remove all unique equipment in tab; Add item as a unique equipment + [GVAR(virtualItems) get (IDX_VIRT_NVG + ([2, 6, 4, 3, 5, 0] select _forEachIndex)), _x] call _fnc_uniqueEquipment; + } forEach _x; }; }; -} foreach _array; +} forEach (getUnitLoadout GVAR(center)); // Only need items, not extended loadout + + +private _isMagazine = false; +private _isWeapon = false; +private _isGrenade = false; +private _isPut = false; +private _isMiscItem = false; +private _config = configNull; +private _simulationType = ""; +private _configItemInfo = ""; +private _hasItemInfo = false; +private _itemInfoType = 0; + +{ + _isMagazine = isClass (_cfgMagazines >> _x); + _isWeapon = isClass (_cfgWeapons >> _x); + + switch (true) do { + // Magazines + case (_isMagazine): { + _config = _cfgMagazines >> _x; + _isGrenade = _x in (uiNamespace getVariable QGVAR(grenadeCache)); + _isPut = _x in (uiNamespace getVariable QGVAR(putCache)); + _isMiscItem = _x in (uiNamespace getVariable QGVAR(magazineMiscItems)); + + switch (true) do { + // "Misc. items" magazines (e.g. spare barrels, intel, photos) + case ( + !(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)) && + {_isMiscItem} + ): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS) set [_x, nil]; + }; + // Grenades + case ( + !(_x in (GVAR(virtualItems) get IDX_VIRT_GRENADES)) && + {_isGrenade} + ): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GRENADES) set [_x, nil]; + }; + // Explosives + case ( + !(_x in (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES)) && + {_isPut} + ): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_EXPLOSIVES) set [_x, nil]; + }; + // Primary, Handgun, Secondary weapon magazines + case ( + !(_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) && + {!_isGrenade && {!_isPut} && {!_isMiscItem}} && + {_x in (_configItems get IDX_VIRT_ITEMS_ALL) || + {getNumber (_config >> QGVAR(hide)) == -1} || + {getNumber (_config >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW, TYPE_MAGAZINE_SECONDARY_AND_PUT, 1536, TYPE_MAGAZINE_HANDGUN_AND_GL, TYPE_MAGAZINE_MISSILE]}} + ): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL) set [_x, nil]; + }; + // Unknown + default { + // Don't add items that are part of the arsenal + if !(_x in GVAR(virtualItemsFlatAll)) then { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, nil]; + }; + }; + }; + }; + // Weapons + case (_isWeapon): { + _config = _cfgWeapons >> _x; + _simulationType = getText (_config >> "simulation"); + _configItemInfo = _config >> "ItemInfo"; + _hasItemInfo = isClass (_configItemInfo); + _itemInfoType = if (_hasItemInfo) then {getNumber (_configItemInfo >> "type")} else {0}; + _isMiscItem = _x isKindOf ["CBA_MiscItem", _cfgWeapons]; + + switch (true) do { + // Optics + case ( + !(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS)) && + {_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS) || + {_hasItemInfo && + {!_isMiscItem} && + {_itemInfoType == TYPE_OPTICS}}} + ): { + ((GVAR(virtualItems) get IDX_VIRT_UNIQUE_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS) set [_x, nil]; + }; + // Flashlights + case ( + !(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)) && + {_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS) || + {_hasItemInfo && + {!_isMiscItem} && + {_itemInfoType == TYPE_FLASHLIGHT}}} + ): { + ((GVAR(virtualItems) get IDX_VIRT_UNIQUE_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS) set [_x, nil]; + }; + // Muzzle attachments + case ( + !(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS)) && + {_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS) || + {_hasItemInfo && + {!_isMiscItem} && + {_itemInfoType == TYPE_MUZZLE}}} + ): { + ((GVAR(virtualItems) get IDX_VIRT_UNIQUE_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS) set [_x, nil]; + }; + // Bipods + case ( + !(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS)) && + {_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS) || + {_hasItemInfo && + {!_isMiscItem} && + {_itemInfoType == TYPE_BIPOD}}} + ): { + ((GVAR(virtualItems) get IDX_VIRT_UNIQUE_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS) set [_x, nil]; + }; + // Misc. items + case ( + !(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)) && + {_x in (_configItems get IDX_VIRT_MISC_ITEMS) || + {_hasItemInfo && + {_isMiscItem && + {_itemInfoType in [TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_MUZZLE, TYPE_BIPOD]}} || + {_itemInfoType in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} || + {_simulationType == "ItemMineDetector"}}} + ): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS) set [_x, nil]; + }; + // Unknown + default { + // Don't add items that are part of the arsenal + if !(_x in GVAR(virtualItemsFlatAll)) then { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, nil]; + }; + }; + }; + }; + // Backpacks + case (getNumber (_cfgVehicles >> _x >> "isBackpack") == 1): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_BACKPACKS) set [_x, nil]; + }; + // Facewear + case (isClass (_cfgGlasses >> _x)): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES) set [_x, nil]; + }; + // Unknown + default { + // Don't add items that are part of the arsenal + if !(_x in GVAR(virtualItemsFlatAll)) then { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, nil]; + }; + }; + }; +} forEach (keys ([GVAR(center), 0, 3, 3, 3, false] call EFUNC(common,uniqueUnitItems))); // Get all items from unit diff --git a/addons/arsenal/functions/fnc_verifyLoadout.sqf b/addons/arsenal/functions/fnc_verifyLoadout.sqf index bacd6a11b3..b5425c2117 100644 --- a/addons/arsenal/functions/fnc_verifyLoadout.sqf +++ b/addons/arsenal/functions/fnc_verifyLoadout.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "..\defines.hpp" /* - * Author: Alganthe - * Verify the provided loadout. + * Author: Alganthe, johnb43 + * Verify the provided loadout: Check what items do not exist and what items aren't available in current arsenal. * * Arguments: - * 0: Loadout (getUnitLoadout format) + * 0: Loadout (CBA Extended Loadout or getUnitLoadout format) * * Return Value: * Verified loadout and missing / unavailable items list and count @@ -15,220 +15,282 @@ params ["_loadout"]; -private _weaponCfg = configFile >> "CfgWeapons"; -private _magCfg = configFile >> "CfgMagazines"; -private _vehcCfg = configFile >> "CfgVehicles"; -private _glassesCfg = configFile >> "CfgGlasses"; -private _weaponsArray = GVAR(virtualItems) select IDX_VIRT_WEAPONS; -private _accsArray = GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS; +private _extendedInfo = createHashMap; +// Check if the provided loadout is a CBA extended loadout +if (count _loadout == 2) then { + _extendedInfo = _loadout select 1; + _loadout = _loadout select 0; +}; + +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgVehicles = configFile >> "CfgVehicles"; +private _cfgGlasses = configFile >> "CfgGlasses"; + +private _weapons = GVAR(virtualItems) get IDX_VIRT_WEAPONS; +private _attachments = GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS; + +private _name = ""; private _nullItemsAmount = 0; private _unavailableItemsAmount = 0; private _nullItemsList = []; private _unavailableItemsList = []; -private _fnc_weaponCheck = { - params ["_dataPath"]; +// Search for all items and turn them into config case; Don't touch other value types +private _fnc_toConfigCase = { + _this apply { + if (_x isEqualType "") then { + if (_x != "") then { + _name = _x call EFUNC(common,getConfigName); - if (count _dataPath != 0) then { - { - if (_x isEqualType "") then { - - private _item = _x; - - if (_item != "") then { - if (isClass (_weaponCfg >> _item)) then { - if !(CHECK_WEAPON_OR_ACC) then { - - _unavailableItemsList pushBackUnique _item; - _dataPath set [_forEachIndex, ""]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; - }; - } else { - - _nullItemsList pushBackUnique _item; - _dataPath set [_forEachIndex, ""]; - _nullItemsAmount = _nullItemsAmount + 1; - }; + // If item doesn't exist in config, "" is returned + // Just return unaltered item name in that case, so it can be documented as being unavailable + if (_name != "") then { + _name + } else { + _x }; - } else { - - if (count _x != 0) then { - private _mag = _x select 0; - - if (isClass (_magCfg >> _mag)) then { - if !(_mag in (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL)) then { - - _unavailableItemsList pushBackUnique _mag; - _dataPath set [_forEachIndex, []]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; - }; - } else { - - _nullItemsList pushBackUnique _mag; - _dataPath set [_forEachIndex, []]; - _nullItemsAmount = _nullItemsAmount + 1; - }; - }; + _x }; - } foreach _dataPath; + } else { + // Handle arrays + if (_x isEqualType []) then { + _x call _fnc_toConfigCase + } else { + // All other types + _x + }; + }; }; }; -for "_dataIndex" from 0 to 9 do { - switch (_dataIndex) do { - case 0; - case 1; - case 2; - case 8: { - [_loadout select _dataIndex] call _fnc_weaponCheck; +// Convert loadout to config case +// Loadout might come from a different modpack, which might have different config naming +_loadout = _loadout call _fnc_toConfigCase; + +// Check a weapon, with its attachments and magazines, if items are available +private _fnc_weaponCheck = { + params ["_weaponArray", ["_index", -1]]; + + { + // Weapons and attachments + if (_x isEqualType "") then { + if (_x != "") then { + // Check if item exists + if (isClass (_cfgWeapons >> _x)) then { + // Get base weapon + _x = _x call FUNC(baseWeapon); + + // Check if item is available in arsenal + if !( + // Weapon class name is at the very start of the array + if (_forEachIndex == 0) then { + // If the type of weapon is known, only look through that array + if (_index != -1) then { + // If binos, choose differently + if (_index == IDX_LOADOUT_BINO) then { + _x in (GVAR(virtualItems) get IDX_VIRT_BINO) + } else { + _x in (_weapons get _index) + }; + } else { + _x in (_weapons get IDX_VIRT_PRIMARY_WEAPONS) || + {_x in (_weapons get IDX_VIRT_SECONDARY_WEAPONS)} || + {_x in (_weapons get IDX_VIRT_HANDGUN_WEAPONS)} || + {_x in (GVAR(virtualItems) get IDX_VIRT_BINO)} + }; + } else { + _x in (_attachments get IDX_VIRT_OPTICS_ATTACHMENTS) || + {_x in (_attachments get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)} || + {_x in (_attachments get IDX_VIRT_MUZZLE_ATTACHMENTS)} || + {_x in (_attachments get IDX_VIRT_BIPOD_ATTACHMENTS)} + } + ) then { + _unavailableItemsList pushBackUnique _x; + _weaponArray set [_forEachIndex, ""]; + INC(_unavailableItemsAmount); + }; + } else { + _nullItemsList pushBackUnique _x; + _weaponArray set [_forEachIndex, ""]; + INC(_nullItemsAmount); + }; + }; + } else { + // Magazines + if (_x isNotEqualTo []) then { + _x params ["_magazine"]; + + // Check if item exists + if (isClass (_cfgMagazines >> _magazine)) then { + // Check if item is available in arsenal + if !(_magazine in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) then { + _unavailableItemsList pushBackUnique _magazine; + _weaponArray set [_forEachIndex, []]; + INC(_unavailableItemsAmount); + }; + } else { + _nullItemsList pushBackUnique _magazine; + _weaponArray set [_forEachIndex, []]; + INC(_nullItemsAmount); + }; + }; }; + } forEach _weaponArray; +}; - case 3; - case 4; - case 5: { - private _containerArray = (_loadout select _dataIndex); +private _item = ""; - if (count _containerArray != 0) then { - - _containerArray params ["_item", "_containerItems"]; - - if (isClass (_vehcCfg >> _item) || {isClass (_weaponCfg >> _item)}) then { - if !(CHECK_CONTAINER) then { +// Go through entire loadout to check if items are available in current arsenal +for "_dataIndex" from IDX_LOADOUT_PRIMARY_WEAPON to IDX_LOADOUT_ASSIGNEDITEMS do { + switch (_dataIndex) do { + // Primary weapon, Secondary weapon, Handgun weapon, Binoculars + case IDX_LOADOUT_PRIMARY_WEAPON; + case IDX_LOADOUT_SECONDARY_WEAPON; + case IDX_LOADOUT_HANDGUN_WEAPON; + case IDX_LOADOUT_BINO: { + [_loadout select _dataIndex, _dataIndex] call _fnc_weaponCheck; + }; + // Uniform, vest, backpack + case IDX_LOADOUT_UNIFORM; + case IDX_LOADOUT_VEST; + case IDX_LOADOUT_BACKPACK: { + (_loadout select _dataIndex) params [["_item", ""], ["_containerItems", []]]; + if (_item != "") then { + // Check if item exists + if (isClass (_cfgVehicles >> _item) || {isClass (_cfgWeapons >> _item)}) then { + // Check if item is available in arsenal + if !(_item in (GVAR(virtualItems) get (_dataIndex + 1))) then { _unavailableItemsList pushBackUnique _item; _loadout set [_dataIndex, []]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; + INC(_unavailableItemsAmount); } else { + { + switch (true) do { + // Magazines have each 3 entries: Name, number of magazines and ammo count + case (_x isEqualTypeArray ["", 0, 0]): { + _x params ["_item"]; - if (count _containerItems != 0) then { - { - private _currentIndex = _forEachIndex; - - switch (count _x) do { - case 2: { - - if ((_x select 0) isEqualType "") then { - - private _item = _x select 0; - - if (CLASS_CHECK_ITEM) then { - if !(CHECK_CONTAINER_ITEMS) then { - - _unavailableItemsList pushBackUnique _item; - ((_loadout select _dataIndex) select 1) set [_currentIndex, []]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; - }; - } else { - - _nullItemsList pushBackUnique _item; - ((_loadout select _dataIndex) select 1) set [_currentIndex, []]; - _nullItemsAmount = _nullItemsAmount + 1; - }; - } else { - - [(((_loadout select _dataIndex) select 1) select _currentIndex) select 0] call _fnc_weaponCheck; - }; - }; - - case 3: { - private _item = _x select 0; - - if (isClass (_magCfg >> _item)) then { - if !( - _item in (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) || - _item in (GVAR(virtualItems) select 15) || - _item in (GVAR(virtualItems) select 16) - ) then { - - _unavailableItemsList pushBackUnique _item; - ((_loadout select _dataIndex) select 1) set [_currentIndex, []]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; - }; - } else { - - _nullItemsList pushBackUnique _item; - ((_loadout select _dataIndex) select 1) set [_currentIndex, []]; - _nullItemsAmount = _nullItemsAmount + 1; + // Check if item exists + if (isClass (_cfgMagazines >> _item)) then { + // Check if item is available in arsenal + if !( + _item in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL) || + {_item in (GVAR(virtualItems) get IDX_VIRT_GRENADES)} || + {_item in (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES)} || + {_item in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)} + ) then { + _unavailableItemsList pushBackUnique _item; + ((_loadout select _dataIndex) select 1) set [_forEachIndex, []]; + INC(_unavailableItemsAmount); }; + } else { + _nullItemsList pushBackUnique _item; + ((_loadout select _dataIndex) select 1) set [_forEachIndex, []]; + INC(_nullItemsAmount); }; }; - } foreach _containerItems; - }; + // Weapons have 2 entries: Weapon info array and amount + case (_x isEqualTypeArray [[], 0]): { + [_x select 0] call _fnc_weaponCheck; + }; + // Misc. items have 2 entries: Name and amount, containers have 2 entries: Name and isBackpack + default { + _x params ["_item"]; + + // Check if item exists + if ( + isClass (_cfgWeapons >> _item) || + {isClass (_cfgMagazines >> _item)} || + {isClass (_cfgGlasses >> _item)} || + {isClass (_cfgVehicles >> _item)} + ) then { + // Check if item is available in arsenal + if !(_item in GVAR(virtualItemsFlat)) then { + _unavailableItemsList pushBackUnique _item; + ((_loadout select _dataIndex) select 1) set [_forEachIndex, []]; + INC(_unavailableItemsAmount); + }; + } else { + _nullItemsList pushBackUnique _item; + ((_loadout select _dataIndex) select 1) set [_forEachIndex, []]; + INC(_nullItemsAmount); + }; + }; + + }; + } forEach _containerItems; }; } else { - _nullItemsList pushBackUnique _item; _loadout set [_dataIndex, []]; - _nullItemsAmount = _nullItemsAmount + 1; + INC(_nullItemsAmount); }; }; }; - - case 6: { - private _item = _loadout select _dataIndex; + // Headgear + case IDX_LOADOUT_HEADGEAR: { + _item = _loadout select _dataIndex; if (_item != "") then { - - if (isClass (_weaponCfg >> _item)) then { - - if !(_item in (GVAR(virtualItems) select IDX_VIRT_HEADGEAR)) then { - + // Check if item exists + if (isClass (_cfgWeapons >> _item)) then { + // Check if item is available in arsenal + if !(_item in (GVAR(virtualItems) get IDX_VIRT_HEADGEAR)) then { _unavailableItemsList pushBackUnique _item; _loadout set [_dataIndex, ""]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; + INC(_unavailableItemsAmount); }; } else { - _nullItemsList pushBackUnique _item; _loadout set [_dataIndex, ""]; - _nullItemsAmount = _nullItemsAmount + 1; + INC(_nullItemsAmount); }; }; }; - - case 7: { - private _item = _loadout select _dataIndex; + // Facewear + case IDX_LOADOUT_GOGGLES: { + _item = _loadout select _dataIndex; if (_item != "") then { - - if (isClass (_glassesCfg >> _item)) then { - - if !(_item in (GVAR(virtualItems) select IDX_VIRT_GOGGLES)) then { - + // Check if item exists + if (isClass (_cfgGlasses >> _item)) then { + // Check if item is available in arsenal + if !(_item in (GVAR(virtualItems) get IDX_VIRT_GOGGLES)) then { _unavailableItemsList pushBackUnique _item; _loadout set [_dataIndex, ""]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; + INC(_unavailableItemsAmount); }; } else { - _nullItemsList pushBackUnique _item; _loadout set [_dataIndex, ""]; - _nullItemsAmount = _nullItemsAmount + 1; + INC(_nullItemsAmount); }; }; }; + // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs + case IDX_LOADOUT_ASSIGNEDITEMS: { + private _assignedItems = _loadout select _dataIndex; - case 9: { for "_subIndex" from 0 to 5 do { - private _item = (_loadout select _dataIndex) select _subIndex; + _item = _assignedItems select _subIndex; if (_item != "") then { - - if (isClass (_weaponCfg >> _item)) then { - - if !(CHECK_ASSIGNED_ITEMS) then { - + // Check if item exists + if (isClass (_cfgWeapons >> _item)) then { + // Check if item is available in arsenal + if !(_item in (GVAR(virtualItems) get (IDX_VIRT_NVG + ([2, 6, 4, 3, 5, 0] select _subIndex)))) then { _unavailableItemsList pushBackUnique _item; - (_loadout select _dataIndex) set [_subIndex, ""]; - _unavailableItemsAmount = _unavailableItemsAmount + 1; + _assignedItems set [_subIndex, ""]; + INC(_unavailableItemsAmount); }; } else { - _nullItemsList pushBackUnique _item; - (_loadout select _dataIndex) set [_subIndex, ""]; - _nullItemsAmount = _nullItemsAmount + 1; + _assignedItems set [_subIndex, ""]; + INC(_nullItemsAmount); }; }; }; @@ -236,4 +298,4 @@ for "_dataIndex" from 0 to 9 do { }; }; -[_loadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList] +[[_loadout, _extendedInfo], _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList] diff --git a/addons/arsenal/functions/script_component.hpp b/addons/arsenal/functions/script_component.hpp deleted file mode 100644 index 523addf768..0000000000 --- a/addons/arsenal/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\arsenal\script_component.hpp" \ No newline at end of file diff --git a/addons/arsenal/initSettings.sqf b/addons/arsenal/initSettings.sqf new file mode 100644 index 0000000000..bc093eb522 --- /dev/null +++ b/addons/arsenal/initSettings.sqf @@ -0,0 +1,107 @@ +// Arsenal +private _category = LLSTRING(settingCategory); +[ + QGVAR(camInverted), + "CHECKBOX", + LLSTRING(invertCameraSetting), + _category, + false +] call CBA_fnc_addSetting; + +[ + QGVAR(enableModIcons), + "CHECKBOX", + [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], + _category, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(fontHeight), + "SLIDER", + [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], + _category, + [1, 10, 4.5, 1] +] call CBA_fnc_addSetting; + +[ + QGVAR(enableIdentityTabs), + "CHECKBOX", + LLSTRING(enableIdentityTabsSettings), + _category, + true, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(defaultToFavorites), + "CHECKBOX", + [LSTRING(defaultToFavoritesSetting), LSTRING(defaultToFavoritesTooltip)], + _category, + false, + 2 // never overwrite the client +] call CBA_fnc_addSetting; + +[ + QGVAR(favoritesColor), + "COLOR", + [LSTRING(favoritesColorSetting), LSTRING(favoritesColorTooltip)], + _category, + [0.9, 0.875, 0.6], + 2 // never overwrite the client +] call CBA_fnc_addSetting; + +private _loadoutCategory = LLSTRING(loadoutSubcategory); + +// Arsenal loadouts +[ + QGVAR(allowDefaultLoadouts), + "CHECKBOX", + [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], + [_category, _loadoutCategory], + true, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(allowSharedLoadouts), + "CHECKBOX", + LLSTRING(allowSharingSetting), + [_category, _loadoutCategory], + true, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(EnableRPTLog), + "CHECKBOX", + [LSTRING(printToRPTSetting), + LSTRING(printToRPTTooltip)], + [_category, _loadoutCategory], + false, + false +] call CBA_fnc_addSetting; + +[ + QGVAR(loadoutsSaveFace), + "CHECKBOX", + LLSTRING(loadoutsSaveFaceSetting), + [_category, _loadoutCategory], + false +] call CBA_fnc_addSetting; + +[ + QGVAR(loadoutsSaveVoice), + "CHECKBOX", + LLSTRING(loadoutsSaveVoiceSetting), + [_category, _loadoutCategory], + false +] call CBA_fnc_addSetting; + +[ + QGVAR(loadoutsSaveInsignia), + "CHECKBOX", + LLSTRING(loadoutsSaveInsigniaSetting), + [_category, _loadoutCategory], + true +] call CBA_fnc_addSetting; diff --git a/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf b/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf index 5b24421c20..9f4b0aa538 100644 --- a/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf +++ b/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf @@ -8,7 +8,7 @@ cba_diagnostic_projectileMaxLines = 10; [QGVAR(displayOpened), { private _player = player; - // player pose + // Player pose [{ switch (true) do { case (primaryWeapon _this != ""): { @@ -23,15 +23,16 @@ cba_diagnostic_projectileMaxLines = 10; }; }, _player] call CBA_fnc_execNextFrame; - // hide everything except the player + // Hide everything except the player { _x enableSimulation false; _x hideObject true; - } forEach (allMissionObjects "" - [_player]); + } forEach (allMissionObjects "" - [_player] - attachedObjects _player); - if ((_player getVariable ["cba_projectile_firedEhId", -1]) != -1) then { + if ((_player getVariable ["CBA_projectile_firedEhId", -1]) != -1) then { _player call CBA_fnc_removeUnitTrackProjectiles; }; + _player setFatigue 0; // Esc to close mission @@ -44,6 +45,7 @@ cba_diagnostic_projectileMaxLines = 10; if (_key isEqualTo DIK_ESCAPE && {!_shift}) then { [_display] spawn { disableSerialization; + params ["_display"]; private _return = [ @@ -54,58 +56,62 @@ cba_diagnostic_projectileMaxLines = 10; ] call BIS_fnc_GUImessage; if (_return) then { - profileNamespace setVariable [QGVAR(missionLastLoadout), getUnitLoadout player]; - _display closeDisplay 2; - findDisplay 46 closeDisplay 0; + // Save loadout for next time arsenal mission is played + profileNamespace setVariable [QGVAR(missionLastLoadout), [player] call CBA_fnc_getLoadout]; + + // Quit mission + _display closeDisplay IDC_CANCEL; + findDisplay IDD_MISSION closeDisplay 0; }; }; + true }; }]; - private _buttonClose = _display displayCtrl IDC_menuBarClose; - _buttonClose ctrlSetText localize "str_a3_rscdisplayarsenal_buttonok"; + (_display displayCtrl IDC_menuBarClose) ctrlSetText localize "str_a3_rscdisplayarsenal_buttonok"; } call CBA_fnc_execNextFrame; }] call CBA_fnc_addEventHandler; [QGVAR(displayClosed), { private _player = player; - // unhide everthing + // Unhide everthing { _x enableSimulation true; _x hideObject false; } forEach allMissionObjects ""; - // update VR unit gear - { - private _unit = _x; + private _unit = objNull, - removeVest _unit; - _unit addVest vest _player; + // Update VR unit gear + { + _unit = _x; + + if (vest _player != "") then { _unit addVest vest _player; }; removeBackpack _unit; - _unit addBackpack backpack _player; - + if (backpack _player != "") then { _unit addBackpack backpack _player; }; removeHeadgear _unit; - _unit addHeadgear headgear _player; - + if (headgear _player != "") then { _unit addHeadgear headgear _player; }; removeGoggles _unit; - _unit addGoggles goggles _player; + if (goggles _player != "") then { _unit addGoggles goggles _player; }; removeAllWeapons _unit; - _unit addWeapon primaryWeapon _player; + if (primaryWeapon _player != "") then { _unit addWeapon primaryWeapon _player; }; + { _unit addPrimaryWeaponItem _x; } forEach primaryWeaponItems _player; - _unit addWeapon secondaryWeapon _player; + if (secondaryWeapon _player != "") then { _unit addWeapon secondaryWeapon _player; }; { _unit addSecondaryWeaponItem _x; } forEach secondaryWeaponItems _player; - _unit addWeapon handgunWeapon _player; + if (handgunWeapon _player != "") then { _unit addWeapon handgunWeapon _player; }; + { _unit addHandgunItem _x; } forEach handgunItems _player; diff --git a/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf b/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf index 30eac04a7f..a93611d329 100644 --- a/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf +++ b/addons/arsenal/missions/Arsenal.VR/fnc_createTarget.sqf @@ -1,18 +1,26 @@ #include "script_component.hpp" +/* + * Author: commy2 + * + * Public: No +*/ params ["_type", "_position", ["_group", grpNull], "_varName"]; + private _player = player; if (isNull _group) then { - _group = creategroup east; + _group = createGroup east; }; -private _target = _group createUnit [_type, [10,10,0], [], 0, "NONE"]; +private _target = _group createUnit [_type, [10, 10, 0], [], 0, "NONE"]; +// _varName is used for respawning unit if (isNil "_varName") then { _varName = _target call BIS_fnc_netId; }; +// Set up AI _target setPos _position; _target setDir (_position getDir _player); _target doWatch position _player; @@ -30,26 +38,31 @@ _target setSpeaker "BASE"; params ["_target", "_time"]; if (speaker _target == "BASE") exitWith {time > _time}; + _target setSpeaker "BASE"; + false }, {}, [_target, time + 1]] call CBA_fnc_waitUntilAndExecute; _player reveal [_target, 4]; -_target addVest vest _player; -_target addBackpack backpack _player; -_target addHeadgear headgear _player; -_target addGoggles goggles _player; -_target addWeapon primaryWeapon _player; -_target addWeapon secondaryWeapon _player; -_target addWeapon handgunWeapon _player; +// Copy player's gear onto target +if (vest _player != "") then { _target addVest vest _player; }; +if (backpack _player != "") then { _target addBackpack backpack _player; }; +if (headgear _player != "") then { _target addHeadgear headgear _player; }; +if (goggles _player != "") then { _target addGoggles goggles _player; }; +if (primaryWeapon _player != "") then { _target addWeapon primaryWeapon _player; }; +if (secondaryWeapon _player != "") then { _target addWeapon secondaryWeapon _player; }; +if (handgunWeapon _player != "") then { _target addWeapon handgunWeapon _player; }; +// Save AI for respawn _target setVehicleVarName _varName; -missionNamespace setvariable [_varName, _target]; +missionNamespace setVariable [_varName, _target]; _target switchMove "amovpercmstpslowwrfldnon"; _target setVariable ["origin", _position]; +// When killed, respawn AI _target addEventHandler ["killed", { params ["_target"]; @@ -61,6 +74,7 @@ _target addEventHandler ["killed", { [_target, true] spawn BIS_fnc_VREffectKilled; + // When unit's corpse is deleted, spawn in new one of same type [{isNull (_this select 0)}, { (_this select 1) call FUNC(createTarget); }, [_target, [typeOf _target, _position, group _target, _varName]]] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/arsenal/missions/Arsenal.VR/fnc_onPause.sqf b/addons/arsenal/missions/Arsenal.VR/fnc_onPause.sqf index 25e49405bf..f7536cae67 100644 --- a/addons/arsenal/missions/Arsenal.VR/fnc_onPause.sqf +++ b/addons/arsenal/missions/Arsenal.VR/fnc_onPause.sqf @@ -1,15 +1,32 @@ #include "script_component.hpp" +#include "\z\ace\addons\arsenal\defines.hpp" +/* + * Author: commy2 + * + * Public: No +*/ params ["_display"]; +// Change the abort button to a return button private _ctrlButtonAbort = _display displayCtrl 104; -_ctrlButtonAbort ctrlSetText localize LSTRING(Mission); -_ctrlButtonAbort ctrlSetTooltip localize LSTRING(ReturnToArsenal); +_ctrlButtonAbort ctrlSetText LLSTRING(Mission); +_ctrlButtonAbort ctrlSetTooltip LLSTRING(ReturnToArsenal); _ctrlButtonAbort ctrlSetEventHandler ["ButtonClick", { - params ["_control"]; - ctrlParent _control closeDisplay 2; - {[player, player, true] call FUNC(openBox)} call CBA_fnc_execNextFrame; + // Don't open arsenal unless it's the player, on foot + if (player == call CBA_fnc_currentUnit && {isNull objectParent player}) then { + params ["_control"]; + + // Close pause menu + (ctrlParent _control) closeDisplay IDC_CANCEL; + + // Open the arsenal again + { + [player, player, true] call FUNC(openBox); + } call CBA_fnc_execNextFrame; + }; + true } call EFUNC(common,codeToString)]; diff --git a/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf b/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf index 111202d04e..28e19bba47 100644 --- a/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf +++ b/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf @@ -1,43 +1,41 @@ #include "script_component.hpp" +#include "\z\ace\addons\arsenal\defines.hpp" params ["_unit"]; private _loadout = profileNamespace getVariable QGVAR(missionLastLoadout); +// Load loadout from previous arsenal mission session if (!isNil "_loadout") then { - _unit setUnitLoadout _loadout; + [_unit, _loadout] call CBA_fnc_setLoadout; }; _unit allowDamage false; -//--- Static targets in various distance +// Static targets at various distances { - private _position = _unit getRelPos [_x, _forEachIndex]; - ["O_Soldier_VR_F", _position] call FUNC(createTarget); + ["O_Soldier_VR_F", _unit getRelPos [_x, _forEachIndex]] call FUNC(createTarget); } forEach [10, 20, 30, 40, 50, 100, 500, 1000, 2000]; -//--- Target line +// Target line to the left of the player private _position = _unit getRelPos [20, -90]; for "_i" from 0 to 5 do { - private _position = _position vectorAdd [0, -3 + _i, 0]; - ["O_Soldier_VR_F", _position] call FUNC(createTarget); + ["O_Soldier_VR_F", _position vectorAdd [0, -3 + _i, 0]] call FUNC(createTarget); }; -//--- Target cluster +// Target cluster to the right of the player _position = _unit getRelPos [20, 90]; for "_i" from 0 to 8 do { private _index = floor (_i / 3); - private _position = _position vectorAdd [_index * 1.5, 1.5 + (_i % 3), 0]; - - private _target = ["O_Soldier_VR_F", _position] call FUNC(createTarget); + private _target = ["O_Soldier_VR_F", _position vectorAdd [_index * 1.5, 1.5 + (_i % 3), 0]] call FUNC(createTarget); _target switchMove (["aidlpercmstpslowwrfldnon", "aidlpknlmstpslowwrfldnon_ai", "aidlppnemstpsraswrfldnon_ai"] select _index); _target setUnitPos (["UP", "MIDDLE", "DOWN"] select _index); }; -//--- Target patrol +// Target patrol: Spawn waypoints around player private _group = createGroup east; { @@ -51,6 +49,7 @@ private _group = createGroup east; _position = _unit getRelPos [10, 180]; +// Spawn in AI for patrol for "_i" from 0 to 1 do { private _target = ["O_Soldier_VR_F", _position] call FUNC(createTarget); @@ -60,11 +59,11 @@ for "_i" from 0 to 1 do { _target setSpeedMode "LIMITED"; }; -//--- Armored vehicles +// Armored vehicles to the rear of the player private _vehicles = []; private _step = 15; -_position = [position _unit select 0,(position _unit select 1) + 30,0]; +_position = _unit getRelPos [30, 180]; { private _row = _forEachIndex; @@ -76,7 +75,7 @@ _position = [position _unit select 0,(position _unit select 1) + 30,0]; private _vehicle = createVehicle [_x, _position, [], 0, "NONE"]; _vehicle setPos _position; _vehicle setDir 180; - _vehicle setVelocity [0,0,-1]; + _vehicle setVelocity [0, 0, -1]; _vehicle call BIS_fnc_VRHitpart; private _marker = _vehicle call BIS_fnc_boundingBoxMarker; @@ -93,23 +92,29 @@ _position = [position _unit select 0,(position _unit select 1) + 30,0]; "Land_VR_Target_MBT_01_cannon_F" ]]; -_vehicles spawn { - waituntil { - private _allDisabled = true; +private _massDestructionAchieved = getStatValue "MarkMassVirtualDestruction"; - { - _hitAlive = _x getVariable ["bis_fnc_VRHitParts_hitalive", []]; - _allDisabled = _allDisabled && ({!_x} count _hitAlive >= 2); - sleep 0.1; - } forEach _this; +// Don't check for achievement conditions if achievement already aquired +if (!isNil "_massDestructionAchieved" && {_massDestructionAchieved isEqualTo 1}) then { + _vehicles spawn { + waitUntil { + private _allDisabled = true; - _allDisabled + { + _hitAlive = _x getVariable ["BIS_fnc_VRHitParts_hitalive", []]; + _allDisabled = _allDisabled && ({!_x} count _hitAlive >= 2); + + sleep 0.1; + } forEach _this; + + _allDisabled + }; + + setStatValue ["MarkMassVirtualDestruction", 1]; }; - - setStatValue ["MarkMassVirtualDestruction", 1]; }; -//--- Cover objects +// Cover objects private _coverObjects = [ "Land_VR_CoverObject_01_kneel_F", "Land_VR_CoverObject_01_kneelHigh_F", @@ -118,42 +123,45 @@ private _coverObjects = [ "Land_VR_CoverObject_01_standHigh_F" ]; +private _coverObjectsCount = count _coverObjects; + +// Set up cover objects for "_i" from 5 to 11 do { private _direction = 180 + _i * 45; private _position = _unit getRelPos [(abs sin _direction + abs cos _direction) * 3, _direction]; - private _block = createVehicle [_coverObjects select (_i % count _coverObjects), _position, [], 0, "NONE"]; + private _block = createVehicle [_coverObjects select (_i % _coverObjectsCount), _position, [], 0, "NONE"]; _block setPos _position; }; -//--- Starting point +// Starting point private _square = createVehicle ["VR_Area_01_square_1x1_grey_F", position _unit, [], 0, "NONE"]; _square setPosASL getPosASL _unit; private _marker = createMarker [QGVAR(start), getPosWorld _unit]; _marker setMarkerType "mil_start"; -//--- Open Arsenal +// Init Arsenal [_unit, true, false] call FUNC(initBox); -[{!isNull findDisplay 46}, { +// Wait until the mission screen is available +[{!isNull findDisplay IDD_MISSION}, { [_this, _this, true] call FUNC(openBox); }, _unit] call CBA_fnc_waitUntilAndExecute; -//--- Salute +// Salute _unit addEventHandler ["AnimChanged", { params ["_unit", "_anim"]; - _anim = _anim splitString "_"; - if ("salute" in _anim) then { + if ("salute" in (_anim splitString "_")) then { { _x playAction "salute"; } forEach ((_unit nearObjects ["CAManBase", 10]) - [_unit]); }; }]; -["#(argb,8,8,3)color(0,0,0,1)", false, nil, 0.1, [0,0.5]] spawn BIS_fnc_textTiles; +["#(argb,8,8,3)color(0,0,0,1)", false, nil, 0.1, [0, 0.5]] spawn BIS_fnc_textTiles; -//--- Target markers +// Target markers private _markers = []; { @@ -164,12 +172,14 @@ private _markers = []; _markers pushBack _marker; } forEach (allMissionObjects "CAManBase" - [_unit]); +// Make the markers move with the targets _markers spawn { while {true} do { { private _target = missionNamespace getVariable _x; _x setMarkerPos position _target; } forEach _this; + sleep 0.1; }; }; diff --git a/addons/arsenal/missions/Arsenal.VR/mission.sqm b/addons/arsenal/missions/Arsenal.VR/mission.sqm index c43d901f6e..b23f61c1bf 100644 --- a/addons/arsenal/missions/Arsenal.VR/mission.sqm +++ b/addons/arsenal/missions/Arsenal.VR/mission.sqm @@ -1,163 +1,163 @@ version=12; class Mission { - addOns[]= - { - "A3_Map_VR", - "A3_Characters_F_BLUFOR", - "a3_characters_f_beta", - "a3_characters_f" - }; - addOnsAuto[]= - { - "A3_Characters_F_BLUFOR", - "a3_characters_f", - "A3_Map_VR" - }; - randomSeed=5486937; - class Intel - { - briefingName="@STR_A3_Arsenal"; - startWeather=0; - startWind=0.099999994; - startWaves=0.099999994; - forecastWeather=0; - forecastWind=0.099999994; - forecastWaves=0.099999994; - forecastLightnings=0.099999994; - year=2035; - month=2; - day=24; - hour=12; - minute=0; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; - class Groups - { - items=1; - class Item0 - { - side="CIV"; - class Vehicles - { - items=1; - class Item0 - { - position[]={4256,5,4192}; - azimut=180; - id=0; - side="CIV"; - vehicle="C_man_1"; - player="PLAYER COMMANDER"; - leader=1; - skill=0.60000002; - }; - }; - }; - }; - class Sensors - { - items=1; - class Item0 - { - position[]={4271.2827,5,4170.251}; - a=0; - b=0; - interruptable=1; - age="UNKNOWN"; - expCond="cheat1"; - expActiv="endmission ""end1"""; - class Effects - { - }; - }; - }; + addOns[]= + { + "A3_Map_VR", + "A3_Characters_F_BLUFOR", + "a3_characters_f_beta", + "a3_characters_f" + }; + addOnsAuto[]= + { + "A3_Characters_F_BLUFOR", + "a3_characters_f", + "A3_Map_VR" + }; + randomSeed=5486937; + class Intel + { + briefingName="@STR_A3_Arsenal"; + startWeather=0; + startWind=0.099999994; + startWaves=0.099999994; + forecastWeather=0; + forecastWind=0.099999994; + forecastWaves=0.099999994; + forecastLightnings=0.099999994; + year=2035; + month=2; + day=24; + hour=12; + minute=0; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; + class Groups + { + items=1; + class Item0 + { + side="CIV"; + class Vehicles + { + items=1; + class Item0 + { + position[]={4256,5,4192}; + azimut=180; + id=0; + side="CIV"; + vehicle="C_man_1"; + player="PLAYER COMMANDER"; + leader=1; + skill=0.60000002; + }; + }; + }; + }; + class Sensors + { + items=1; + class Item0 + { + position[]={4271.2827,5,4170.251}; + a=0; + b=0; + interruptable=1; + age="UNKNOWN"; + expCond="cheat1"; + expActiv="endmission ""end1"""; + class Effects + { + }; + }; + }; }; class Intro { - addOns[]= - { - "A3_Map_VR" - }; - addOnsAuto[]= - { - "A3_Map_VR" - }; - randomSeed=12455686; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0; - startWind=0.1; - startWaves=0.1; - forecastWeather=0; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - day=28; - hour=13; - minute=37; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; + addOns[]= + { + "A3_Map_VR" + }; + addOnsAuto[]= + { + "A3_Map_VR" + }; + randomSeed=12455686; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0; + startWind=0.1; + startWaves=0.1; + forecastWeather=0; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + day=28; + hour=13; + minute=37; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; }; class OutroWin { - addOns[]= - { - "A3_Map_VR" - }; - addOnsAuto[]= - { - "A3_Map_VR" - }; - randomSeed=9312504; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0; - startWind=0.1; - startWaves=0.1; - forecastWeather=0; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - day=28; - hour=13; - minute=37; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; + addOns[]= + { + "A3_Map_VR" + }; + addOnsAuto[]= + { + "A3_Map_VR" + }; + randomSeed=9312504; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0; + startWind=0.1; + startWaves=0.1; + forecastWeather=0; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + day=28; + hour=13; + minute=37; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; }; class OutroLoose { - addOns[]= - { - "A3_Map_VR" - }; - addOnsAuto[]= - { - "A3_Map_VR" - }; - randomSeed=15192082; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0; - startWind=0.1; - startWaves=0.1; - forecastWeather=0; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - day=28; - hour=13; - minute=37; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; + addOns[]= + { + "A3_Map_VR" + }; + addOnsAuto[]= + { + "A3_Map_VR" + }; + randomSeed=15192082; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0; + startWind=0.1; + startWaves=0.1; + forecastWeather=0; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + day=28; + hour=13; + minute=37; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; }; diff --git a/addons/arsenal/missions/Arsenal.VR/script_component.hpp b/addons/arsenal/missions/Arsenal.VR/script_component.hpp index e1e6528a49..da24982170 100644 --- a/addons/arsenal/missions/Arsenal.VR/script_component.hpp +++ b/addons/arsenal/missions/Arsenal.VR/script_component.hpp @@ -1,4 +1,4 @@ -#include "\z\ace\addons\arsenal\script_component.hpp" +#include "..\..\script_component.hpp" #undef PREP // make.py can't redefine already defined macros #define PREP(var) FUNC(var) = compileFinal preprocessFileLineNumbers format ["fnc_%1.sqf", QUOTE(var)] diff --git a/addons/arsenal/script_component.hpp b/addons/arsenal/script_component.hpp index 2eb9c3f170..0f7348b9db 100644 --- a/addons/arsenal/script_component.hpp +++ b/addons/arsenal/script_component.hpp @@ -15,3 +15,6 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define ACTION_TYPE_BUTTON 0 +#define ACTION_TYPE_TEXT 1 diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index 7b980ff310..452ba160a1 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -27,7 +27,7 @@ Nascondi interfaccia 인터페이스 숨기기 隱藏介面 - 隐藏介面 + 隐藏界面 Скрыть интерфейс Oculta a Interface Skrýt rozhraní @@ -43,7 +43,7 @@ Equipaggiamenti 로드아웃 裝備 - 装备 + 负载 Комплекты Loadouts Sady vybavení @@ -59,7 +59,7 @@ Esporta 내보내기 匯出 - 汇出 + 导出 Экспорт Exportar Export @@ -75,7 +75,7 @@ Importa 가져오기 匯入 - 汇入 + 导入 Импорт Importar Import @@ -139,7 +139,7 @@ Salva l'equipaggiamento corrente 현재 로드아웃 저장 保存當前的裝備 - 保存当前的装备 + 保存当前的负载 Сохранить текущий комплект экипировки Salva o loadout atual Uložit současnou sadu vybavení @@ -155,9 +155,11 @@ [Shift+Clique para salvar nos padrões da missão] [Shift+Clic pour enregistrer en tant qu'équipement prédéfini.] [Shift+左鍵來保存至任務預設] + [Shift+左鍵 以保存至任务默认值] [Shift+Click per salvare la missione con gli equipaggiamenti predefiniti] [Shift+Klik pro uložení jako standardního vybavení pro misi] [Shift+Click varsayılan kıyafetlere kaydet] + [쉬프트+클릭 하여 임무 기본으로 설정] Rename the selected loadout @@ -169,7 +171,7 @@ Rinomina l'equipaggiamento selezionato 선택한 로드아웃의 이름 바꾸기 重新命名當前選擇的裝備 - 重新命名当前选择的装备 + 重命名当前选择的负载 Переименовать выбранный комплект экипировки Renomeia o loadout selecionado Přejmenovat vybranou sadu vybavení @@ -201,7 +203,7 @@ Carica l'equipaggiamento selezionato 선택한 로드아웃 불러오기 載入當前選擇的裝備 - 载入当前选择的装备 + 载入当前选择的负载 Загрузить выбранный комплект экипировки Carrega o loadout selecionado Nahrát vybranou sadu vybavení @@ -233,7 +235,7 @@ Elimina l'equipaggiamento selezionato 선택한 로드아웃 삭제하기 刪除當前選擇的裝備 - 删除当前选择的装备 + 删除当前选择的负载 Удалить выбранный комплект экипировки Apaga o loadout selecionado Smazat vybranou sadu vybavení @@ -249,7 +251,7 @@ I miei equipaggiamenti 내 로드아웃 我的裝備 - 我的装备 + 我的负载 Мои комплекты Meus loadouts Moje sady vybavení @@ -265,7 +267,7 @@ Gli equipaggiamenti salvati nel tuo profilo 프로필에 저장된 로드아웃 裝備已保存到你的設定檔中 - 装备已保存到你的设定档中 + 负载已保存到你的档案中 Комплекты экипировки, сохраненные в вашем профиле Loadouts salvos em seu perfil Sadz vybavení uložené ve vašem profilu @@ -281,7 +283,7 @@ Equipaggiamenti standard 기본 로드아웃 預設裝備 - 预设装备 + 默认负载 По умолчанию Loadouts padrões Standardní sady vybavení @@ -297,7 +299,7 @@ Equipaggiamenti resi disponibili dal creatore della missione 미션메이커가 허용한 로드아웃 任務作者提供的預設裝備 - 任务作者提供的预设装备 + 任务作者提供的负载 Комплекты экипировки, предоставляемые создателем миссии Loadouts definidos pelo criador da missão Sady vybavení od autora mise @@ -313,7 +315,7 @@ Equipaggiamenti pubblici 공용 로드아웃 公用裝備 - 公用装备 + 公用负载 Публичные комплекты Loadouts públicos Veřejné sady vybavení @@ -329,7 +331,7 @@ Equipaggiamenti condivisi da te e da altri giocatori 플레이어들이 공유하는 로드아웃 由你與其他玩家分享的裝備配置 - 由你与其他玩家分享的装备配置 + 你和其他玩家分享的负载配置 Комплекты экипировки, опубликованные вами и другими игроками Loadouts compartilhados por você ou outros jogadores Sady vybavení sdílené vámi a ostatními hráči @@ -343,7 +345,7 @@ Sortuj wg wagi 重量で並び替え Ordina per peso - 무게로 정렬 + 무게 순서로 정렬 以重量排序 以重量排序 Сортировка по весу @@ -359,7 +361,7 @@ Sortuj wg ilości 量で並び替え Ordina per quantitativo - 갯수로 정렬 + 갯수 순서로 정렬 以數量排序 以数量排序 Сортировка по количеству @@ -375,6 +377,8 @@ Ordenar por capacidad Сортировка по вместимости Sortuj po rozmiarze + 공간 순서로 정렬 + 以容量排序 Sort by accuracy @@ -385,6 +389,8 @@ Ordenar por precisión Сортировка по точности Sortuj po celności + 정확도 순서로 정렬 + 以精度排序 Sort by rate of fire @@ -395,6 +401,8 @@ Ordenar por cadencia de tiro Сортировка по темпу стрельбы Sortuj po szybkostrzelności + 발사속도 순서로 정렬 + 以射速排序 Sort by magnification @@ -404,6 +412,8 @@ Ordenar por magnificación Сортировка по кратности приближения Sortuj po przybliżeniu + 배율 순서로 정렬 + 以放大倍数排序 Sort by ammo count @@ -414,6 +424,8 @@ Ordenar por cantidad de munición Сортировка по количеству боеприпасов Sortuj po ilości amunicji + 총알 갯수 순서롤 정렬 + 以弹量排序 Sort by ballistic protection @@ -422,6 +434,9 @@ Ordenar por protección balística Сортировка по баллистической защите Sortuj po ochronie balistycznej + Nach ballistischem Schutz sortieren + 방탄 성능 순서로 정렬 + 以防弹性能排序 Sort by explosive protection @@ -430,6 +445,9 @@ Ordenar por protección de explosivos Сортировка по защите от взрывов Sortuj po ochronie przeciw wybuchom + Nach Explosionsschutz sortieren + 방폭 성능 순서로 정렬 + 以防爆性能排序 Share or stop sharing the selected loadout @@ -439,9 +457,9 @@ Udostępnij lub przestań udostępniać wybrany zestaw 選択した装備の共有設定 Condividi o smetti di condividere l'equipaggiamento selezionato - 선택한 로드아웃 공유 혹은 공유중지 + 선택한 로드아웃 공유 혹은 공유 중지 開始/停止分享當前選擇的裝備 - 开始/停止分享当前选择的装备 + 开始/停止分享当前选择的负载 Открыть или закрыть общий доступ к комплекту экипировки Compartilhar ou parar de compartilhar o loadout selecionado Sdílet nebo přestat sdílet vybranou sadu vybavení @@ -489,7 +507,7 @@ La lista degli equipaggiamenti standard è vuota! 기본 로드아웃 목록이 비어있습니다! 沒有預設的裝備清單! - 没有预设的装备清单! + 没有默认负载清单! Список комплекта экипировки пуст! A lista de loadouts padrões está vazia! Seznam standardních sad vybavení je prázdný! @@ -505,7 +523,7 @@ 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 @@ -521,7 +539,7 @@ Equipaggiamento corrente esportato negli appunti 현재 로드아웃을 클립보드로 내보냈습니다. 當前的裝備已匯出到剪貼簿中 - 当前的装备已汇出到剪贴簿中 + 当前负载已导出到剪贴板 Текущий список комплекта экипировки экспортирован в буфер Loadout atual foi exportado pra área de transferência Současná sada vybavení byla exportována do schránky @@ -553,7 +571,7 @@ 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 @@ -569,7 +587,7 @@ Equipaggiamento importato dagli appunti 클립보드에서 로드아웃을 가져왔습니다. 裝備已從剪貼簿中匯入 - 装备已从剪贴簿中汇入 + 负载已从剪贴板中导入 Список комплекта экипировки импортирован из буфера Loadout importado da área de transferência Sada vybavení byla importována ze schránky @@ -585,7 +603,7 @@ Il seguente equipaggiamento è stato eliminato: 다음 로드아웃이 삭제됨 : 以下的裝備已被刪除: - 以下的装备已被删除: + 以下的负载已被删除: Удален комплект экипировки: O seguinte loadout foi apagado: Tato sada vybavení byla smazána: @@ -601,7 +619,7 @@ Il seguente equipaggiamento non è più pubblico: 다음 로드아웃이 더이상 공용이 아님: 以下的裝備已不再被分享: - 以下的装备已不再被分享: + 以下的负载已不再被分享: Этот комплект экипировки больше не публичный: O seguinte loadout não é mais público: Tato sada vybavení již není veřejná: @@ -617,7 +635,7 @@ Il campo del nome è vuoto! 이름칸이 비었습니다! 名稱欄位為空! - 名称栏位为空! + 名称栏位为空! Поле имени пустое! O nome não pode estar vazio! Pole "Jméno" je prázdné! @@ -633,7 +651,7 @@ Sei l'autore di questo equipaggiamento 이 로드아웃의 제작자입니다. 你是這個裝備的作者 - 你是这个装备的作者 + 你是这个负载的作者 Вы автор этого комплекта экипировки Você é o autor desse loadout Jste autorem této sady vybavení @@ -649,7 +667,7 @@ Un tuo equipaggiamento con lo stesso nome è pubblico 같은 이름의 로드아웃이 공용에 있습니다. 已有相同名稱的裝備在公用分享區 - 已有相同名称的装备在公用分享区 + 已有相同名称的负载在公用分享区 Ваш комплект экипировки с таким же именем является публичным Um loadout seu com o mesmo nome é público Vaše sada vybavení se stejným jménem je veřejná @@ -665,7 +683,7 @@ Il seguente equipaggiamento è stato salvato: 다음 로드아웃이 저장됨: 以下的裝備已被保存: - 以下的装备已被保存: + 以下的负载已被保存: Сохранен комплект экипировки: O seguinte loadout foi salvo: Tato sada vybavení byla uložena: @@ -681,7 +699,7 @@ Il seguente equipaggiamento è stato caricato: 다음 로드아웃을 불러옴: 以下的裝備已被載入: - 以下的装备已被载入: + 以下的负载已被载入: Загружен комплект экипировки: O seguinte loadout foi carregado: Tato sada vybavení byla načtena: @@ -697,7 +715,7 @@ Un equipaggiamento con lo stesso nome è gia esistente! 같은 이름의 로드아웃이 이미 존재합니다! 已有相同名稱的裝備! - 已有相同名称的装备! + 已有相同名称的负载! Комплект с таким именем уже существует! Um loadout com o mesmo nome já existe! Již existuje sada vybavení se stejným jménem! @@ -746,7 +764,7 @@ 모드 아이콘 허가 啟用模組圖示 启用模组图示 - Включить иконки модов + Вкл. иконки модов Ativar ícones de mods Zapnout ikony modů Mod simgelerini etkinleştir @@ -777,7 +795,7 @@ Consenti equipaggiamenti standard 기본 로드아웃 허용 允許預設裝備 - 允许预设装备 + 允许默认负载 Разрешить комплекты по умолчанию Permitir loadouts padrões Povolit standardní sady vybavení @@ -793,7 +811,7 @@ Consenti condivisione equipaggiamenti 로드아웃 공유 허용 允許分享裝備 - 允许分享装备 + 允许分享负载 Разрешить публикацию комплектов Permitir compartilhar loadouts Povolit sdílení sad vybavení @@ -825,7 +843,7 @@ 주무기 탄약 Primärmagazin 主要武器彈匣 - 主要武器弹匣 + 主武器弹匣 Основной магазин Carregador Primário Hlavní zásobník @@ -841,7 +859,7 @@ 보조무기 탄약 Sekundärmagazin 次要武器彈匣 - 次要武器弹匣 + 副武器弹匣 Вторичный магазин Carregador Secundário Vedlejší zásobník @@ -855,14 +873,30 @@ ACE Arsenał ACE 武器庫 ACE Arsenale - ACE 아스날 + ACE 무기고 ACE虛擬軍火庫 - ACE虚拟军火库 + ACE 虚拟军火库 ACE Арсенал ACE Arsenal ACE Arzenál ACE Arsenal + + Loadouts + Equipamiento + Sets d'équipement + Ausrüstungen + Zestawy wyposażenia + 装備 + Equipaggiamenti + 로드아웃 + 裝備 + 负载 + Комплекты + Loadouts + Sady vybavení + Kıyafetler + Allow the use of the default loadouts tab Permitir el uso de la pestaña de equipamientos por defecto @@ -873,7 +907,7 @@ 기본 로드아웃 탭 사용 허가 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í @@ -921,7 +955,7 @@ RPT에 누락 된 항목 / 사용할 수없는 항목 기록 Fehlende Gegenstände werden in der RPT aufgezeichnet 記錄遺失/無法使用的項目到RPT檔案中 - 记录遗失/无法使用的项目到RPT档案中 + 记录遗失/无法使用的项目到 RPT Вести журнал отсутствующих / недоступных предметов в RPT Registrar em log itens indisponíveis no RPT Zalogovat chybějící/nedostupné předměty do RPT logu @@ -936,7 +970,7 @@ ACE 武器庫を開けません ACE 아스날을 열 수 없음 無法開啟ACE虛擬軍火庫 - 无法开启ACE虚拟军火库 + 无法开启 ACE 虚拟军火库 Nie można otworzyć arsenału ACE Невозможно открыть ACE Арсенал Não foi possível abrir o ACE Arsenal @@ -949,9 +983,9 @@ Importer les sets BI VA dans l'arsenal ACE Importiert die BI-VA-Ausrüstungen in das ACE-Arsenal 標準の VA 装備から ACE 武器庫へ取り込み - 바닐라 로드아웃을 ace 아스날로 가져오기 + 바닐라 로드아웃을 ACE 아스날로 가져오기 匯入BI原廠虛擬軍火庫的裝備到ACE虛擬軍火庫中 - 汇入BI原厂虚拟军火库的装备到ACE虚拟军火库中 + 导入 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 @@ -963,10 +997,10 @@ 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"と名付けてください。 + プレイヤーユニットがありません!ユニットを設置し"Player"と名付けてください。 플레이어 유닛을 사용할 수 없습니다! 유닛을 놓고 "플레이어"라고 표시하십시오. 沒有可用的玩家單位!請擺放一個單位並設定成"玩家" - 没有可用的玩家单位!请摆放一个单位并设定成"玩家"。 + 没有可用的玩家单位!请摆放一个单位并设定成“玩家”。 Non ci sono giocatori! Poisziona una unità e impostala come "Giocatore". Brak dostępnych jednostek gracza! Postaw jednostkę i oznacz ją jako "Gracz". Нет доступных игроков! Разместите юнит и отметьте его как «Игрок» @@ -979,9 +1013,9 @@ Aucun équipement à importer. Keine Ausrüstungen zum Importieren インポートする装備がありません。 - 가져올 로드 아웃이 없습니다. + 가져올 로드아웃이 없습니다. 沒有裝備被匯入 - 没有装备被汇入。 + 没有负载被导入。 Non ci sono equipaggiamenti da importare. Brak zestawów wyposażenia do zaimportowania. Нет комплектов для импорта @@ -994,9 +1028,9 @@ ACE Arsenal ACE-Arsenal ACE 武器庫 - ACE 아스날 + ACE 무기고 ACE虛擬軍火庫 - ACE虚拟军火库 + ACE 虚拟军火库 Arsenale ACE Arsenał ACE ACE Арсенал @@ -1010,9 +1044,9 @@ Volver al arsenal de ACE Zurück zum ACE-Arsenal. ACE 武器庫へ戻ります。 - ACE 아스날로 돌아가기 + ACE 무기고로 돌아가기 返回到ACE虛擬軍火庫 - 返回到ACE虚拟军火库。 + 返回到 ACE 虚拟军火库。 Torna all'arsenale ACE Wróć do arsenału ACE. Вернуться в ACE Арсенал @@ -1026,9 +1060,9 @@ 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을 사용하여 다른 무기와 장비를 시험해보십시오. + ACE 무기고를 사용하여 다른 무기와 장비를 시험해보십시오. 使用ACE虛擬軍火庫來嘗試不同的武器與裝備 - 使用ACE虚拟军火库来尝试不同的武器与装备。 + 使用 ACE 虚拟军火库来尝试不同的武器与装备。 Usa l'arsenale ACE per provare armi ed equipaggiamenti vari. Skorzystaj z arsenału ACE by wypróbować broń i ekwipunek. Используйте ACE Arsenal, чтобы опробовать различное оружие и снаряжение. @@ -1043,7 +1077,7 @@ 様々な武器と装備を試して、あなただけの装備を作成してください。 무기와 장비를 사용해보고 자신의 로드아웃을 만듭니다. 嘗試不同的武器與裝備來組合你個人的裝備配置 - 尝试不同的武器与装备来组合你个人的装备配置。 + 尝试不同的武器与装备来组合你个人的负载配置。 Prova armi ed equipaggiamenti e creai i tuoi equipaggiamenti personalizzati. Wypróbuj broń i ekwipunek i stwórz swoje własne zestawy wyposażenia. Опробуйте оружие и снаряжение, создавайте собственные комплекты экипировки. @@ -1057,7 +1091,7 @@ Öffnet das Ausrüstungsmenü Affiche les sets d'équipement. 開啟裝備選單 - 开启装备选单 + 开启负载菜单 装備画面を開く Apri la pagina degli equipaggiamenti Otwórz ekran zestawów @@ -1065,6 +1099,7 @@ Abre a tela de loadouts Otevřít obrazovku se sadami vybavení Kıyafetler ekranını aç + 로드아웃 화면 열기 Export current / default loadouts @@ -1072,13 +1107,14 @@ 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 @@ -1086,13 +1122,14 @@ 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 @@ -1108,6 +1145,7 @@ Úrovně draslíku Potasyum seviyeleri カリウム含有量 + 칼륨 레벨 Magnification @@ -1136,8 +1174,10 @@ Suporte de Visão Noturna Support JVN 夜視鏡支援 + 支持夜视仪 Podpora nočního vidění Gece Görüş Desteği + 야간투시 지원여부 Primary supported @@ -1150,7 +1190,9 @@ Primária suportada Primaire supportée 主武器支援 + 主镜支持 Hlavní část hledí podporuje + 주무기 지원여부 Secondary supported @@ -1163,7 +1205,9 @@ Secundária suportada Secondaire supportée 次要武器支援 + 副镜支持 Vedlejší část hledí podporuje + 보조무기 지원여부 Primary integrated @@ -1176,7 +1220,9 @@ Primária integrada Primaire intégrée 整合主武器 + 主镜内置 Integrováno do hlavní části hledí + 주무기 내장여부 Not Supported @@ -1189,8 +1235,74 @@ Não suportado Non supporté 不支援 + 不支持 Není podporováno Desteklenmiyor + 지원되지 않음 + + + Vision Mode + Sichtmodus + ビジョン モード + Modalità Visiva + 視覺模式 + 视觉模式 + 보기 모드 + Mode de vision + Tryb Wizji + Режим видения + Modo de Visão + Režim sledování + Görüş Modu + Modo de visión + + + Normal + Normal + Normalna + Normal + Нормальное + Normální + Normal + Normale + Normale + 通常 + 일반 + 正常 + 正常 + Normal + + + Night + Nacht + Noc + Visão Norturna + Ночное + Noční + Nocturna + Notturno + Nocturne + 暗視装置 + 야간 + 夜视 + 夜視 + Gece + + + Thermal + Wärme + Termo + Térmica + Тепловизор + Termální + Térmica + Termico + Thermique + 熱源画像 + 열상 + 热成像 + 熱成像 + Termal Page @@ -1206,21 +1318,23 @@ Página Stránka Sayfa + 페이지 Enable the faces / voices / insignias tabs 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 @@ -1228,13 +1342,14 @@ 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 @@ -1242,13 +1357,14 @@ 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 @@ -1294,8 +1410,10 @@ Lista Negra Liste noire 黑名單 + 黑名单 Seznam zakázaných Kara Liste + 블랙리스트 Items @@ -1324,7 +1442,9 @@ Экспорт текущего списка предметов в виде массива для использования в скриптах 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) @@ -1336,8 +1456,10 @@ 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 @@ -1349,8 +1471,10 @@ 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 @@ -1362,8 +1486,10 @@ 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 @@ -1376,8 +1502,10 @@ Время действия Time to live 有效時間 + 有效时间 Time to live Bitme Süresi + 유효 시간 Fuse Time @@ -1386,6 +1514,9 @@ Opoźnienie zapalnika 信管設定時間 Tiempo de espoleta + Detonationsverzögerung + 引信时间 + 신관 시간 Detonates on impact @@ -1395,6 +1526,99 @@ Detonuj przy uderzeniu 着発信管 Detona mediante impacto + 碰炸引信 + 충격 신관 + + + Save Face + 얼굴 저장 + Сохранить лицо + Guardar Cara + 顔の保存 + Zapisz Twarz + Gesicht Speichern + + + Save Voice + 목소리 저장 + Сохранить голос + Guardar Voz + 声の保存 + Zapisz Głos + Stimme Speichern + + + Save Insignia + 계급장 저장 + Сохранить эмблему + Guardar Insignia + 記章(バッジ)の保存 + Zapisz Naszywkę + Insignia Speichern + + + Descending + 下降 + Malejąco + Absteigend + + + Ascending + 昇順 + Rosnąco + Aufsteigend + + + Tools + Nástroje + Werkzeuge + Инструменты + Narzędzia + Strumenti + Herramientas + Outils + 工具 + ツール + 도구 + Ferramentas + 工具 + Araçlar + + + Ammo count + 弾薬数 + Ilość amunicji + Munitionszahl + + + Default to Favorites + お気に入りをデフォルト + Domyślnie do Ulubionych + Standardmäßig auf Favoriten eingestellt + + + Controls whether the ACE Arsenal defaults to showing all items or favorites. + ACE Arsenalがデフォルトで全てのアイテムを表示するか、お気に入りを表示するかを制御します。 + Kontroluje, czy ACE Arsenal domyślnie wyświetla wszystkie przedmioty, czy tylko ulubione. + Steuert, ob das ACE Arsenal standardmäßig alle Gegenstände oder nur Favoriten anzeigt. + + + Favorites Color + お気に入りの色 + Kolor Ulubionych + Favoritenfarbe + + + Highlight color for favorited items. + お気に入りアイテムのハイライト色。 + Kolor podświetlenia ulubionych elementów. + Hervorhebungsfarbe für Lieblingsgegenstände. + + + Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item. + Shiftを押しながらダブルクリックするとアイテムを追加・削除できます。 + Przełączanie między wyświetlaniem wszystkich przedmiotów lub tylko ulubionych. \nKliknij dwukrotnie, przytrzymując Shift, aby dodać lub usunąć przedmiot. + Wechseln Sie zwischen der Anzeige aller Elemente oder Ihrer Favoriten.\nDoppelklicken Sie bei gedrückter Umschalttaste, um ein Element hinzuzufügen oder zu entfernen. diff --git a/addons/arsenal/ui/RscAttributes.hpp b/addons/arsenal/ui/RscAttributes.hpp index 1bd6c9909b..3a707a3dc3 100644 --- a/addons/arsenal/ui/RscAttributes.hpp +++ b/addons/arsenal/ui/RscAttributes.hpp @@ -3,18 +3,18 @@ class GVAR(display) { idd = IDD_ace_arsenal; - enableSimulation=1; + enableSimulation = 1; onLoad = QUOTE([ARR_3('onLoad', _this, QQGVAR(display))] call FUNC(onArsenalOpen)); onUnload = QUOTE([ARR_3('onUnload', _this, QQGVAR(display))] call FUNC(onArsenalClose)); onKeyDown = QUOTE([ARR_3('onKeyDown', _this, QQGVAR(display))] call FUNC(onKeyDown)); onKeyUp = QUOTE(GVAR(shiftState) = _this select 2); onMouseButtonDown = QUOTE([ARR_3('onMouseButtonDown', _this, QQGVAR(display))] call FUNC(onMouseButtonDown)); onMouseButtonUp = QUOTE([ARR_3('onMouseButtonUp', _this, QQGVAR(display))] call FUNC(onMouseButtonUp)); - icon="\A3\Ui_f\data\Logos\a_64_ca.paa"; - logo="\A3\Ui_f\data\Logos\arsenal_1024_ca.paa"; + icon = "\A3\Ui_f\data\Logos\a_64_ca.paa"; + logo = "\A3\Ui_f\data\Logos\arsenal_1024_ca.paa"; class ControlsBackground { class blackLeft: ctrlStatic { - colorBackground[]={0,0,0,1}; + colorBackground[] = {0,0,0,1}; x = QUOTE(safezoneXAbs); y = QUOTE(safezoneY); w = QUOTE(safezoneXAbs - safezoneX); @@ -41,7 +41,7 @@ class GVAR(display) { class ArrowLeft: ctrlButton { idc = IDC_arrowMinus; text = "-"; - colorBackground[]={0,0,0,0.8}; + colorBackground[] = {0,0,0,0.8}; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), -1)] call FUNC(buttonCargo)); fade = 1; enable = 0; @@ -54,7 +54,7 @@ class GVAR(display) { class ArrowRight: ArrowLeft { idc = IDC_arrowPlus; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), 1)] call FUNC(buttonCargo)); - text="+"; + text = "+"; }; class blockLeftFrame: RscFrame { idc = IDC_blockLeftFrame; @@ -149,10 +149,10 @@ class GVAR(display) { class message: RscText { idc = IDC_message; fade = 1; - style=2; - shadow=0; - colorBackground[]={0,0,0,0.69999999}; - text=""; + style = 2; + shadow = 0; + colorBackground[] = {0,0,0,0.69999999}; + text = ""; x = QUOTE(0.5 - WIDTH_TOTAL / 2); y = QUOTE(safeZoneH + safezoneY - 25 * GRID_H); w = QUOTE(WIDTH_TOTAL); @@ -175,8 +175,8 @@ class GVAR(display) { h = QUOTE(7 * GRID_H); text = CSTRING(buttonHideText); sizeEx = QUOTE(5 * GRID_H); - shortcuts[] = {"0x0E"}; tooltip = CSTRING(buttonHideTooltip); + onMouseEnter = QUOTE(ctrlSetFocus (_this select 0)); onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonHide)); }; class buttonLoadouts: buttonHide { @@ -200,10 +200,17 @@ class GVAR(display) { tooltip = CSTRING(buttonImportTooltip); onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonImport)); }; + class buttonFavorites: buttonHide { + idc = IDC_buttonFavorites; + x = QUOTE(5 * WIDTH_GAP + 4 * WIDTH_SINGLE); + text = ""; + tooltip = CSTRING(buttonFavoritesTooltip); + onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), (_this select 0))] call FUNC(buttonFavorites)); + }; class buttonClose: ctrlButtonOK { idc = IDC_menuBarClose; colorBackground[] = {0,0,0,0.8}; - x = QUOTE(5 * WIDTH_GAP + 4 * WIDTH_SINGLE); + x = QUOTE(6 * WIDTH_GAP + 5 * WIDTH_SINGLE); y = QUOTE(0); w = QUOTE(WIDTH_SINGLE); h = QUOTE(7 * GRID_H); @@ -260,7 +267,7 @@ class GVAR(display) { fade = 1; color[] = {1,1,1,1}; colorActive[] = {1,1,1,1}; - text="#(argb,8,8,3)color(1,1,1,1)"; + text = "#(argb,8,8,3)color(1,1,1,1)"; x = QUOTE(80 * GRID_W); y = QUOTE(0); w = QUOTE(12 * GRID_W); @@ -281,7 +288,7 @@ class GVAR(display) { y = QUOTE(0); w = QUOTE(47 * GRID_W); h = QUOTE(55 * GRID_H); - colorBackground[]={0.1,0.1,0.1,0.5}; + colorBackground[] = {0.1,0.1,0.1,0.5}; }; class statsStaticBackground2: ctrlStaticBackground { idc = -1; @@ -289,7 +296,7 @@ class GVAR(display) { y = QUOTE(0); w = QUOTE(47 * GRID_W); h = QUOTE(5 * GRID_H); - colorBackground[]={0.1,0.1,0.1,0.8}; + colorBackground[] = {0.1,0.1,0.1,0.8}; }; class statsTitle1: RscText { idc = IDC_statsTitle1; @@ -298,8 +305,8 @@ class GVAR(display) { y = QUOTE(5 * GRID_H); w = QUOTE(45 * GRID_W); h = QUOTE(5 * GRID_H); - colorBackground[]={0,0,0,0}; - colorText[]={0.7,0.7,0.7,1}; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.7,0.7,0.7,1}; sizeEx = QUOTE(5 * GRID_H); text = ""; }; @@ -310,7 +317,7 @@ class GVAR(display) { y = QUOTE(10 * GRID_H); w = QUOTE(45 * GRID_W); h = QUOTE(4 * GRID_H); - colorBackground[]={1,1,1,0.15}; + colorBackground[] = {1,1,1,0.15}; }; class statsBar1: ctrlProgress { idc = IDC_statsBar1; @@ -326,10 +333,10 @@ class GVAR(display) { }; class statsText1: RscText { idc = IDC_statsText1; - shadow=0; + shadow = 0; fade = 1; - colorShadow[]={1,1,1,1}; - colorText[]={0,0,0,1}; + colorShadow[] = {1,1,1,1}; + colorText[] = {0,0,0,1}; x = QUOTE(0 * GRID_W); y = QUOTE(10 * GRID_H); w = QUOTE(45 * GRID_W); @@ -396,7 +403,7 @@ class GVAR(display) { class statsBar5: statsBar1 { idc = IDC_statsBar5; y = QUOTE(50 * GRID_H); - colorBackground[]={1,1,1,0.15}; + colorBackground[] = {1,1,1,0.15}; }; class statsText5: statsText1 { idc = IDC_statsText5; @@ -404,23 +411,12 @@ class GVAR(display) { }; }; }; - class statsButton: ctrlButton { - idc = IDC_statsButton; - style= 2; - text=">"; - onButtonClick = QUOTE([ARR_2(QQGVAR(statsButton), [ctrlParent (_this select 0)])] call CBA_fnc_localEvent); - x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP); - y = QUOTE(safezoneY + 1.8 * GRID_H); - w = QUOTE(6 * GRID_W); - h = QUOTE(6 * GRID_H); - sizeEx = QUOTE(5 * GRID_H); - }; class statsPreviousPage: ctrlButton { idc = IDC_statsPreviousPage; - style= 2; - text="<"; - colorBackground[]={0,0,0,0}; - colorBackgroundDisabled[]= {0,0,0,0}; + style = 2; + text = "<"; + colorBackground[] = {0,0,0,0}; + colorBackgroundDisabled[] = {0,0,0,0}; onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, false)])] call CBA_fnc_localEvent); x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP); y = QUOTE(safezoneY + 1.8 * GRID_H); @@ -432,29 +428,126 @@ class GVAR(display) { idc = IDC_statsNextPage; text = ">"; onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)])] call CBA_fnc_localEvent); - x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 30 * GRID_W); + x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 42 * GRID_W); }; class statsCurrentPage: RscText { idc = IDC_statsCurrentPage; style = ST_CENTER; x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 5 * GRID_W); y = QUOTE(safezoneY + 1.8 * GRID_H); - w = QUOTE(25 * GRID_W); + w = QUOTE(37 * GRID_W); h = QUOTE(5 * GRID_H); - colorBackground[]={0,0,0,0}; - shadow=2; + colorBackground[] = {0,0,0,0}; + shadow = 2; sizeEx = QUOTE(5 * GRID_H); text = ""; }; - class statsButtonClose: ctrlButtonPicture { - idc = IDC_statsButtonClose; - colorBackground[]={0,0,0,0}; - text="\a3\3DEN\Data\Displays\Display3DEN\search_end_ca.paa"; - onButtonClick = QUOTE([ARR_2(QQGVAR(statsButton), [ctrlParent (_this select 0)])] call CBA_fnc_localEvent); - x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 42 * GRID_W); - y = QUOTE(safezoneY + 1.8 * GRID_H); - w = QUOTE(5 * GRID_W); - h = QUOTE(5 * GRID_H); + class actionsBox: RscControlsGroupNoScrollbars { + idc = IDC_actionsBox; + x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP); + y = QUOTE(safezoneY + 58.6 * GRID_H); + w = QUOTE(47 * GRID_W); + h = QUOTE(55 * GRID_H); + class controls { + class actionsStaticBackground1: ctrlStaticBackground { + idc = -1; + x = QUOTE(0); + y = QUOTE(0); + w = QUOTE(47 * GRID_W); + h = QUOTE(56 * GRID_H); + colorBackground[]={0.1,0.1,0.1,0.5}; + }; + class actionsStaticBackground2: ctrlStaticBackground { + idc = -1; + x = QUOTE(0); + y = QUOTE(0); + w = QUOTE(47 * GRID_W); + h = QUOTE(5 * GRID_H); + colorBackground[]={0.1,0.1,0.1,0.8}; + }; + class actionsText1: RscText { + idc = IDC_actionsText1; + fade = 1; + x = QUOTE(0 * GRID_W); + y = QUOTE(5 * GRID_H); + w = QUOTE(45 * GRID_W); + h = QUOTE(5 * GRID_H); + colorBackground[]={0,0,0,0}; + colorText[]={0.7,0.7,0.7,1}; + sizeEx = QUOTE(5 * GRID_H); + text = ""; + }; + class actionsButton1: ctrlButton { + idc = IDC_actionsButton1; + fade = 1; + text = ""; + x = QUOTE(1 * GRID_W); + y = QUOTE(6 * GRID_H); + w = QUOTE(45 * GRID_W); + h = QUOTE(4 * GRID_H); + }; + class actionsText2: actionsText1 { + idc = IDC_actionsText2; + y = QUOTE(10 * GRID_H); + }; + class actionsButton2: actionsButton1 { + idc = IDC_actionsButton2; + y = QUOTE(11 * GRID_H); + }; + class actionsText3: actionsText1 { + idc = IDC_actionsText3; + y = QUOTE(15 * GRID_H); + }; + class actionsButton3: actionsButton1 { + idc = IDC_actionsButton3; + y = QUOTE(16 * GRID_H); + }; + class actionsText4: actionsText1 { + idc = IDC_actionsText4; + y = QUOTE(20 * GRID_H); + }; + class actionsButton4: actionsButton1 { + idc = IDC_actionsButton4; + y = QUOTE(21 * GRID_H); + }; + class actionsText5: actionsText1 { + idc = IDC_actionsText5; + y = QUOTE(25 * GRID_H); + }; + class actionsButton5: actionsButton1 { + idc = IDC_actionsButton5; + y = QUOTE(26 * GRID_H); + }; + class actionsPreviousPage: ctrlButton { + idc = IDC_actionsPreviousPage; + style= 2; + text="<"; + colorBackground[]={0,0,0,0}; + colorBackgroundDisabled[]= {0,0,0,0}; + onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, false)])] call CBA_fnc_localEvent); + x = QUOTE(0); + y = QUOTE(0); + w = QUOTE(5 * GRID_W); + h = QUOTE(5 * GRID_H); + sizeEx = QUOTE(5.5 * GRID_H); + }; + class actionsNextPage: actionsPreviousPage { + idc = IDC_actionsNextPage; + text = ">"; + onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)])] call CBA_fnc_localEvent); + x = QUOTE(42 * GRID_W); + }; + class actionsCurrentPage: RscText { + idc = IDC_actionsCurrentPage; + style = ST_CENTER; + x = QUOTE(5 * GRID_W); + w = QUOTE(37 * GRID_W); + colorBackground[]={0,0,0,0}; + shadow=2; + sizeEx = QUOTE(5 * GRID_H); + text = ""; + }; + }; }; class mouseBlock: RscText { idc = IDC_mouseBlock; @@ -466,14 +559,15 @@ class GVAR(display) { }; class leftTabContent: RscListBox { idc = IDC_leftTabContent; - colorBackground[]={0,0,0,0}; - colorSelectBackground[]={1,1,1,0.5}; - colorSelectBackground2[]={1,1,1,0.5}; - colorPictureSelected[]={1,1,1,1}; - colorSelect[]={1,1,1,1}; - colorSelect2[]={1,1,1,1}; - colorPictureRightSelected[]={1,1,1,1}; + colorBackground[] = {0,0,0,0}; + colorSelectBackground[] = {1,1,1,0.5}; + colorSelectBackground2[] = {1,1,1,0.5}; + colorPictureSelected[] = {1,1,1,1}; + colorSelect[] = {1,1,1,1}; + colorSelect2[] = {1,1,1,1}; + colorPictureRightSelected[] = {1,1,1,1}; onLBSelChanged = QUOTE(_this call FUNC(onSelChangedLeft)); + onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick)); onSetFocus = QUOTE(GVAR(leftTabFocus) = true); onKillFocus = QUOTE(GVAR(leftTabFocus) = false); x = QUOTE(safezoneX + 13 * GRID_W); @@ -484,9 +578,10 @@ class GVAR(display) { }; class rightTabContent: leftTabContent { idc = IDC_rightTabContent; - drawSideArrows=1; - disableOverflow=1; + drawSideArrows = 1; + disableOverflow = 1; onLBSelChanged = QUOTE(_this call FUNC(onSelChangedRight)); + onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick)); onSetFocus = QUOTE(GVAR(rightTabFocus) = true); onKillFocus = QUOTE(GVAR(rightTabFocus) = false); x = QUOTE(safezoneX + safezoneW - 93 * GRID_W); @@ -494,19 +589,20 @@ class GVAR(display) { }; class rightTabContentListnBox: RscListNBox { idc = IDC_rightTabContentListnBox; - colorBackground[]={0,0,0,0}; - colorSelectBackground[]={1,1,1,0.5}; - colorSelectBackground2[]={1,1,1,0.5}; - colorPictureSelected[]={1,1,1,1}; - colorSelect[]={1,1,1,1}; - colorSelect2[]={1,1,1,1}; - colorPictureRightSelected[]={1,1,1,1}; - columns[]={0.07, 0.15, 0.75}; + colorBackground[] = {0,0,0,0}; + colorSelectBackground[] = {1,1,1,0.5}; + colorSelectBackground2[] = {1,1,1,0.5}; + colorPictureSelected[] = {1,1,1,1}; + colorSelect[] = {1,1,1,1}; + colorSelect2[] = {1,1,1,1}; + colorPictureRightSelected[] = {1,1,1,1}; + columns[] = {0.07, 0.15, 0.75}; idcLeft = IDC_arrowMinus; idcRIght = IDC_arrowPlus; - drawSideArrows=1; - disableOverflow=1; + drawSideArrows = 1; + disableOverflow = 1; onLBSelChanged = QUOTE(_this call FUNC(onSelChangedRightListnBox)); + onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick)); onSetFocus = QUOTE(GVAR(rightTabLnBFocus) = true); onKillFocus = QUOTE(GVAR(rightTabLnBFocus) = false); x = QUOTE(safezoneX + safezoneW - 93 * GRID_W); @@ -519,15 +615,24 @@ class GVAR(display) { idc = IDC_sortLeftTab; x = QUOTE(safezoneX + 13 * GRID_W); y = QUOTE(safezoneY + 8 * GRID_H); - w = QUOTE(80 * GRID_W); + w = QUOTE(40 * GRID_W); h = QUOTE(6 * GRID_H); onLBSelChanged = QUOTE(_this call FUNC(sortPanel)); sizeEx = QUOTE(5 * GRID_H); }; + class sortLeftTabDirection: sortLeftTab { + idc = IDC_sortLeftTabDirection; + x = QUOTE(safezoneX + 53 * GRID_W); + w = QUOTE(40 * GRID_W); + }; class sortRightTab: sortLeftTab { idc = IDC_sortRightTab; x = QUOTE(safezoneX + safezoneW - 93 * GRID_W); }; + class sortRightTabDirection: sortLeftTabDirection { + idc = IDC_sortRightTabDirection; + x = QUOTE(safezoneX + safezoneW - 53 * GRID_W); + }; class leftSearchbar: ctrlEdit { idc = IDC_leftSearchbar; onSetFocus = QUOTE(GVAR(leftSearchbarFocus) = true); @@ -542,7 +647,7 @@ class GVAR(display) { class leftSearchbarButton: ctrlButtonPicture { idc = IDC_leftSearchbarButton; text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa"; - colorBackground[]={0,0,0,0.5}; + colorBackground[] = {0,0,0,0.5}; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_leftSearchbar)] call FUNC(handleSearchbar)); x = QUOTE(safezoneX + 87 * GRID_W); y = QUOTE(safezoneY + 1.8 * GRID_H); @@ -569,9 +674,9 @@ class GVAR(display) { class controls { class iconBackgroundPrimaryWeapon: ctrlStaticBackground { idc = IDC_iconBackgroundPrimaryWeapon; - fade=1; - enable=0; - colorBackground[]={0,0,0,1}; + fade = 1; + enable = 0; + colorBackground[] = {0,0,0,1}; x = QUOTE(0); y = QUOTE(0 * GRID_H); w = QUOTE(12 * GRID_W); @@ -579,10 +684,10 @@ class GVAR(display) { }; class buttonPrimaryWeapon: RscButtonArsenal { idc = IDC_buttonPrimaryWeapon; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\PrimaryWeapon_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_PrimaryWeapon"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\PrimaryWeapon_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_PrimaryWeapon"; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillLeftPanel)); - colorBackground[]={0,0,0,0.5}; + colorBackground[] = {0,0,0,0.5}; x = QUOTE(0 * GRID_W); y = QUOTE(0 * GRID_H); w = QUOTE(9 * GRID_W); @@ -594,8 +699,8 @@ class GVAR(display) { }; class buttonHandgun: buttonPrimaryWeapon { idc = IDC_buttonHandgun; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Handgun_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_Handgun"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Handgun_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Handgun"; y = QUOTE(10 * GRID_H); }; class iconBackgroundSecondaryWeapon: IconBackgroundPrimaryWeapon { @@ -604,8 +709,8 @@ class GVAR(display) { }; class buttonSecondaryWeapon: buttonPrimaryWeapon { idc = IDC_buttonSecondaryWeapon; - tooltip="$STR_A3_RscDisplayArsenal_tab_SecondaryWeapon"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\SecondaryWeapon_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_SecondaryWeapon"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\SecondaryWeapon_ca.paa"; y = QUOTE(20 * GRID_H); }; class iconBackgroundHeadgear: IconBackgroundPrimaryWeapon { @@ -614,8 +719,8 @@ class GVAR(display) { }; class buttonHeadgear: buttonPrimaryWeapon { idc = IDC_buttonHeadgear; - tooltip="$STR_A3_RscDisplayArsenal_tab_Headgear"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Headgear_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Headgear"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Headgear_ca.paa"; y = QUOTE(30 * GRID_H); }; class iconBackgroundUniform: IconBackgroundPrimaryWeapon { @@ -624,8 +729,8 @@ class GVAR(display) { }; class buttonUniform: buttonPrimaryWeapon { idc = IDC_buttonUniform; - tooltip="$STR_A3_RscDisplayArsenal_tab_Uniform"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Uniform_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Uniform"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Uniform_ca.paa"; y = QUOTE(40 * GRID_H); }; class iconBackgroundVest: IconBackgroundPrimaryWeapon { @@ -634,8 +739,8 @@ class GVAR(display) { }; class buttonVest: buttonPrimaryWeapon { idc = IDC_buttonVest; - tooltip="$STR_A3_RscDisplayArsenal_tab_Vest"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Vest_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Vest"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Vest_ca.paa"; y = QUOTE(50 * GRID_H); }; class iconBackgroundBackpack: IconBackgroundPrimaryWeapon { @@ -644,8 +749,8 @@ class GVAR(display) { }; class buttonBackpack: buttonPrimaryWeapon { idc = IDC_buttonBackpack; - tooltip="$STR_A3_RscDisplayArsenal_tab_Backpack"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Backpack_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Backpack"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Backpack_ca.paa"; y = QUOTE(60 * GRID_H); }; class iconBackgroundGoggles: IconBackgroundPrimaryWeapon { @@ -654,8 +759,8 @@ class GVAR(display) { }; class buttonGoggles: buttonPrimaryWeapon { idc = IDC_buttonGoggles; - tooltip="$STR_A3_RscDisplayArsenal_tab_Goggles"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Goggles_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Goggles"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Goggles_ca.paa"; y = QUOTE(70 * GRID_H); }; class iconBackgroundNVG: IconBackgroundPrimaryWeapon { @@ -664,8 +769,8 @@ class GVAR(display) { }; class buttonNVG: buttonPrimaryWeapon { idc = IDC_buttonNVG; - tooltip="$STR_A3_RscDisplayArsenal_tab_NVGs"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\NVGs_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_NVGs"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\NVGs_ca.paa"; y = QUOTE(80 * GRID_H); }; class iconBackgroundBinoculars: IconBackgroundPrimaryWeapon { @@ -674,8 +779,8 @@ class GVAR(display) { }; class buttonBinoculars: buttonPrimaryWeapon { idc = IDC_buttonBinoculars; - tooltip="$STR_A3_RscDisplayArsenal_tab_Binoculars"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Binoculars_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Binoculars"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Binoculars_ca.paa"; y = QUOTE(90 * GRID_H); }; class iconBackgroundMap: IconBackgroundPrimaryWeapon { @@ -684,8 +789,8 @@ class GVAR(display) { }; class buttonMap: buttonPrimaryWeapon { idc = IDC_buttonMap; - tooltip="$STR_A3_RscDisplayArsenal_tab_Map"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Map_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Map"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Map_ca.paa"; y = QUOTE(100 * GRID_H); }; class iconBackgroundGPS: IconBackgroundPrimaryWeapon { @@ -694,8 +799,8 @@ class GVAR(display) { }; class buttonGPS: buttonPrimaryWeapon { idc = IDC_buttonGPS; - tooltip="$STR_A3_RscDisplayArsenal_tab_GPS"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\GPS_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_GPS"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\GPS_ca.paa"; y = QUOTE(110 * GRID_H); }; class iconBackgroundRadio: IconBackgroundPrimaryWeapon { @@ -704,8 +809,8 @@ class GVAR(display) { }; class buttonRadio: buttonPrimaryWeapon { idc = IDC_buttonRadio; - tooltip="$STR_A3_RscDisplayArsenal_tab_Radio"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Radio_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Radio"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Radio_ca.paa"; y = QUOTE(120 * GRID_H); }; class iconBackgroundCompass: IconBackgroundPrimaryWeapon { @@ -714,8 +819,8 @@ class GVAR(display) { }; class buttonCompass: buttonPrimaryWeapon { idc = IDC_buttonCompass; - tooltip="$STR_A3_RscDisplayArsenal_tab_Compass"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Compass_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Compass"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Compass_ca.paa"; y = QUOTE(130 * GRID_H); }; class iconBackgroundWatch: IconBackgroundPrimaryWeapon { @@ -724,8 +829,8 @@ class GVAR(display) { }; class buttonWatch: buttonPrimaryWeapon { idc = IDC_buttonWatch; - tooltip="$STR_A3_RscDisplayArsenal_tab_Watch"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Watch_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Watch"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Watch_ca.paa"; y = QUOTE(140 * GRID_H); }; class iconBackgroundFace: IconBackgroundPrimaryWeapon { @@ -734,8 +839,8 @@ class GVAR(display) { }; class buttonFace: buttonPrimaryWeapon { idc = IDC_buttonFace; - tooltip="$STR_A3_RscDisplayArsenal_tab_Face"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Face_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Face"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Face_ca.paa"; y = QUOTE(150 * GRID_H); }; class iconBackgroundVoice: IconBackgroundPrimaryWeapon { @@ -744,8 +849,8 @@ class GVAR(display) { }; class buttonVoice: buttonPrimaryWeapon { idc = IDC_buttonVoice; - tooltip="$STR_A3_RscDisplayArsenal_tab_Voice"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Voice_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Voice"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Voice_ca.paa"; y = QUOTE(160 * GRID_H); }; class iconBackgroundInsigna: IconBackgroundPrimaryWeapon { @@ -754,17 +859,17 @@ class GVAR(display) { }; class buttonInsigna: buttonPrimaryWeapon { idc = IDC_buttonInsignia; - tooltip="$STR_A3_RscDisplayArsenal_tab_Insignia"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Insignia_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_Insignia"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Insignia_ca.paa"; y = QUOTE(170 * GRID_H); }; }; }; class iconBackgroundOptic: ctrlStaticBackground { idc = IDC_iconBackgroundOptic; - colorBackground[]={0,0,0,1}; - fade=1; - enable=0; + colorBackground[] = {0,0,0,1}; + fade = 1; + enable = 0; x = QUOTE(safezoneW + safezoneX - 13 * GRID_W); y = QUOTE(safezoneY + 8 * GRID_H); w = QUOTE(12 * GRID_W); @@ -772,10 +877,10 @@ class GVAR(display) { }; class buttonOptic: RscButtonArsenal { idc = IDC_buttonOptic; - tooltip="$STR_A3_RscDisplayArsenal_tab_ItemOptic"; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemOptic_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemOptic"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemOptic_ca.paa"; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillRightPanel)); - colorBackground[]={0,0,0,0.5}; + colorBackground[] = {0,0,0,0.5}; x = QUOTE(safezoneW + safezoneX - 10 * GRID_W); y = QUOTE(safezoneY + 8 * GRID_H); w = QUOTE(9 * GRID_W); @@ -787,8 +892,8 @@ class GVAR(display) { }; class buttonItemAcc: buttonOptic { idc = IDC_buttonItemAcc; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemAcc_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_ItemAcc"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemAcc_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemAcc"; y = QUOTE(safezoneY + 18 * GRID_H); }; class iconBackgroundMuzzle: iconBackgroundOptic { @@ -797,8 +902,8 @@ class GVAR(display) { }; class buttonMuzzle: buttonOptic { idc = IDC_buttonMuzzle; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemMuzzle_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_ItemMuzzle"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemMuzzle_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemMuzzle"; y = QUOTE(safezoneY + 28 * GRID_H); }; class iconBackgroundBipod: iconBackgroundOptic { @@ -807,8 +912,8 @@ class GVAR(display) { }; class buttonBipod: buttonOptic { idc = IDC_buttonBipod; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemBipod_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_ItemBipod"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemBipod_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemBipod"; y = QUOTE(safezoneY + 38 * GRID_H); }; class iconBackgroundCurrentMag: iconBackgroundOptic { @@ -817,8 +922,8 @@ class GVAR(display) { }; class buttonCurrentMag: buttonOptic { idc = IDC_buttonCurrentMag; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMag_ca.paa"; - tooltip= CSTRING(buttonCurrentMagTooltip); + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMag_ca.paa"; + tooltip = CSTRING(buttonCurrentMagTooltip); y = QUOTE(safezoneY + 48 * GRID_H); }; class iconBackgroundCurrentMag2: iconBackgroundOptic { @@ -827,8 +932,8 @@ class GVAR(display) { }; class buttonCurrentMag2: buttonOptic { idc = IDC_buttonCurrentMag2; - text= QPATHTOF(data\iconSecondaryMuzzle); - tooltip= CSTRING(buttonCurrentMag2Tooltip); + text = QPATHTOF(data\iconSecondaryMuzzle); + tooltip = CSTRING(buttonCurrentMag2Tooltip); y = QUOTE(safezoneY + 58 * GRID_H); }; class iconBackgroundMag: iconBackgroundOptic { @@ -837,8 +942,8 @@ class GVAR(display) { }; class buttonMag: buttonOptic { idc = IDC_buttonMag; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMag_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_CargoMag"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMag_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoMag"; y = QUOTE(safezoneY + 48 * GRID_H); }; class iconBackgroundMagALL: iconBackgroundOptic { @@ -847,8 +952,8 @@ class GVAR(display) { }; class buttonMagALL: buttonOptic { idc = IDC_buttonMagALL; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMagAll_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_CargoMagAll"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMagAll_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoMagAll"; y = QUOTE(safezoneY + 58 * GRID_H); }; class iconBackgroundThrow: iconBackgroundOptic { @@ -857,8 +962,8 @@ class GVAR(display) { }; class buttonThrow: buttonOptic { idc = IDC_buttonThrow; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoThrow_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_CargoThrow"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoThrow_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoThrow"; y = QUOTE(safezoneY + 68 * GRID_H); }; class iconBackgroundPut: iconBackgroundOptic { @@ -867,8 +972,8 @@ class GVAR(display) { }; class buttonPut: buttonOptic { idc = IDC_buttonPut; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoPut_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_CargoPut"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoPut_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoPut"; y = QUOTE(safezoneY + 78 * GRID_H); }; class iconBackgroundMisc: iconBackgroundOptic { @@ -877,8 +982,8 @@ class GVAR(display) { }; class buttonMisc: buttonOptic { idc = IDC_buttonMisc; - text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMisc_ca.paa"; - tooltip="$STR_A3_RscDisplayArsenal_tab_CargoMisc"; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMisc_ca.paa"; + tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoMisc"; y = QUOTE(safezoneY + 88 * GRID_H); }; @@ -886,10 +991,10 @@ class GVAR(display) { idc = IDC_buttonRemoveAll; text = QPATHTOF(data\iconClearContainer.paa); tooltip = CSTRING(buttonClearContainerTooltip); - colorBackground[]={0,0,0,0.5}; + colorBackground[] = {0,0,0,0.5}; onButtonClick = QUOTE(ctrlParent (_this select 0) call FUNC(buttonClearAll)); - fade=1; - enable=0; + fade = 1; + enable = 0; x = QUOTE(safezoneW + safezoneX - 11 * GRID_W); y = QUOTE(safeZoneH + safezoneY - 29 * GRID_H); w = QUOTE(9 * GRID_W); @@ -938,9 +1043,9 @@ class GVAR(loadoutsDisplay) { }; class contentPanel: RscListnBox { idc = IDC_contentPanel; - columns[]={0, 0.05, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90}; - drawSideArrows=0; - disableOverflow=1; + columns[] = {0, 0.05, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90}; + drawSideArrows = 0; + disableOverflow = 1; onSetFocus = QUOTE(GVAR(loadoutsPanelFocus) = true); onKillFocus = QUOTE(GVAR(loadoutsPanelFocus) = false); onLBSelChanged = QUOTE([ARR_3(ctrlParent (_this select 0), _this select 0, _this select 1)] call FUNC(onSelChangedLoadouts)); @@ -952,17 +1057,17 @@ class GVAR(loadoutsDisplay) { sizeEx = QUOTE(7 * GRID_H); }; class textTitle: RscText { - idc= -1; - text="$STR_DISP_GAME_NAME"; + idc = -1; + text = "$STR_DISP_GAME_NAME"; x = QUOTE(0 * GRID_W); y = QUOTE(safezoneH - (51 * GRID_H)); w = QUOTE(15 * GRID_W); h = QUOTE(5 * GRID_H); sizeEx = QUOTE(5 * GRID_H); - colorBackground[]={0,0,0,0.2}; + colorBackground[] = {0,0,0,0.2}; }; class textEditBox: ctrlEdit { - idc= IDC_textEditBox; + idc = IDC_textEditBox; x = QUOTE(15 * GRID_W); y = QUOTE(safezoneH - (51 * GRID_H)); w = QUOTE(65 * GRID_W); @@ -983,7 +1088,7 @@ class GVAR(loadoutsDisplay) { class loadoutsSearchbarButton: ctrlButtonPicture { idc = -1; text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa"; - colorBackground[]={0,0,0,0.5}; + colorBackground[] = {0,0,0,0.5}; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_loadoutsSearchbar)] call FUNC(handleLoadoutsSearchbar)); x = QUOTE(155 * GRID_W); y = QUOTE(safezoneH - (51 * GRID_H)); @@ -996,8 +1101,8 @@ class GVAR(loadoutsDisplay) { y = QUOTE(safezoneH - (44 * GRID_H)); w = QUOTE(30 * GRID_W); h = QUOTE(10 * GRID_H); - text= CSTRING(buttonSaveText); - tooltip= CSTRING(buttonSaveTooltip); + text = CSTRING(buttonSaveText); + tooltip = CSTRING(buttonSaveTooltip); sizeEx = QUOTE(5 * GRID_H); onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsSave)); colorBackground[] = {0,0,0,0.8}; @@ -1012,22 +1117,22 @@ class GVAR(loadoutsDisplay) { class buttonLoad: buttonSave { idc = IDC_buttonLoad; x = QUOTE(65 * GRID_W); - text= CSTRING(buttonLoadText); - tooltip= CSTRING(buttonLoadTooltip); + text = CSTRING(buttonLoadText); + tooltip = CSTRING(buttonLoadTooltip); onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsLoad)); }; class buttonShare: buttonSave { idc = IDC_buttonShare; x = QUOTE(97.5 * GRID_W); - text= CSTRING(buttonSharePrivateText); - tooltip= CSTRING(buttonShareTooltip); + text = CSTRING(buttonSharePrivateText); + tooltip = CSTRING(buttonShareTooltip); onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsShare)); }; class buttonDelete: buttonSave { idc = IDC_buttonDelete; x = QUOTE(130 * GRID_W); - text= CSTRING(buttonDeleteText); - tooltip= CSTRING(buttonDeleteTooltip); + text = CSTRING(buttonDeleteText); + tooltip = CSTRING(buttonDeleteTooltip); colorBackgroundActive[] = {0.5,0,0,1}; onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsDelete)); }; @@ -1040,9 +1145,8 @@ class GVAR(loadoutsDisplay) { w = QUOTE(30 * GRID_W); h = QUOTE(7 * GRID_H); sizeEx = QUOTE(5 * GRID_H); - text= CSTRING(buttonCloseText); - shortcuts[]= {"0x01"}; - tooltip= ""; + text = CSTRING(buttonCloseText); + tooltip = ""; onButtonClick = QUOTE(ctrlParent (_this select 0) closeDisplay 2); }; class buttonBar: ctrlControlsGroupNoScrollbars { @@ -1068,8 +1172,8 @@ class GVAR(loadoutsDisplay) { w = QUOTE(52 * GRID_W); h = QUOTE(7 * GRID_H); sizeEx = QUOTE(5 * GRID_H); - text= CSTRING(tabMyLoadoutsText); - tooltip= CSTRING(tabMyLoadoutsTooltip); + text = CSTRING(tabMyLoadoutsText); + tooltip = CSTRING(tabMyLoadoutsTooltip); onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(loadoutsChangeTab)); }; class buttonDefaultLoadoutsBackground: buttonMyLoadoutsBackground { @@ -1079,8 +1183,8 @@ class GVAR(loadoutsDisplay) { class buttonDefaultLoadouts: buttonMyLoadouts { idc = IDC_buttonDefaultLoadouts; x = QUOTE(54.5 * GRID_W); - text= CSTRING(tabDefaultLoadoutsText); - tooltip= CSTRING(tabDefaultLoadoutsTooltip); + text = CSTRING(tabDefaultLoadoutsText); + tooltip = CSTRING(tabDefaultLoadoutsTooltip); }; class buttonSharedLoadoutsBackground: buttonMyLoadoutsBackground { idc = IDC_buttonSharedLoadoutsBackground; @@ -1089,8 +1193,8 @@ class GVAR(loadoutsDisplay) { class buttonSharedLoadouts: buttonMyLoadouts { idc = IDC_buttonSharedLoadouts; x = QUOTE(109 * GRID_W); - text= CSTRING(tabSharedLoadoutsText); - tooltip= CSTRING(tabSharedLoadoutsTooltip); + text = CSTRING(tabSharedLoadoutsText); + tooltip = CSTRING(tabSharedLoadoutsTooltip); }; }; }; diff --git a/addons/arsenal/ui/script_component.hpp b/addons/arsenal/ui/script_component.hpp index 523addf768..fcf9da9867 100644 --- a/addons/arsenal/ui/script_component.hpp +++ b/addons/arsenal/ui/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\arsenal\script_component.hpp" \ No newline at end of file +#include "..\script_component.hpp" diff --git a/addons/artillerytables/CfgWeapons.hpp b/addons/artillerytables/CfgWeapons.hpp index 7c4d408673..56aa257b46 100644 --- a/addons/artillerytables/CfgWeapons.hpp +++ b/addons/artillerytables/CfgWeapons.hpp @@ -8,6 +8,7 @@ class CfgWeapons { displayName = CSTRING(rangetable_displayName); descriptionShort = CSTRING(rangetable_description); picture = QPATHTOF(UI\icon_rangeTable.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 0.5; }; diff --git a/addons/artillerytables/RscRangeTable.hpp b/addons/artillerytables/RscRangeTable.hpp index 3245b77af6..424dd10995 100644 --- a/addons/artillerytables/RscRangeTable.hpp +++ b/addons/artillerytables/RscRangeTable.hpp @@ -30,8 +30,8 @@ class GVAR(rangeTableDialog) { 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; + 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; @@ -48,7 +48,6 @@ class GVAR(rangeTableDialog) { }; 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)"; diff --git a/addons/artillerytables/RscTitles.hpp b/addons/artillerytables/RscTitles.hpp index 0da1131bc8..c26f302a00 100644 --- a/addons/artillerytables/RscTitles.hpp +++ b/addons/artillerytables/RscTitles.hpp @@ -36,7 +36,6 @@ class RscTitles { }; }; }; - }; }; }; diff --git a/addons/artillerytables/dev/showShotInfo.sqf b/addons/artillerytables/dev/showShotInfo.sqf index aab2f0ef5f..ac99acbdc1 100644 --- a/addons/artillerytables/dev/showShotInfo.sqf +++ b/addons/artillerytables/dev/showShotInfo.sqf @@ -1,5 +1,5 @@ //pragma SKIP_COMPILE -// #include "\z\ace\addons\artillerytables\script_component.hpp" +// #include "..\script_component.hpp" INFO("showing shot info"); diff --git a/addons/artillerytables/functions/fnc_firedEH.sqf b/addons/artillerytables/functions/fnc_firedEH.sqf index b2053136e8..01947b4ebe 100644 --- a/addons/artillerytables/functions/fnc_firedEH.sqf +++ b/addons/artillerytables/functions/fnc_firedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Called when the mortar is fired. diff --git a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf index 8e396a0f13..b7d6371339 100644 --- a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf +++ b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Interaction menu opened, search for nearby artillery vehicles. @@ -46,10 +46,10 @@ TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown); } 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); }; + if ((count _turret) != 1) then { WARNING_2("sub turret %1-%2",configName _vehicleCfg,_turret); }; private _weaponsTurret = _vehicle weaponsTurret _turret; - if ((count _weaponsTurret) != 1) exitWith { WARNING_1("multiple weapons - %1",_typeOf); }; + if ((count _weaponsTurret) != 1) exitWith { WARNING_1("multiple weapons - %1",configName _vehicleCfg); }; private _weapon = _weaponsTurret select 0; private _turretAnimBody = getText (_turretCfg >> "animationSourceBody"); diff --git a/addons/artillerytables/functions/fnc_rangeTableOpen.sqf b/addons/artillerytables/functions/fnc_rangeTableOpen.sqf index b96101bfce..97c8dfe435 100644 --- a/addons/artillerytables/functions/fnc_rangeTableOpen.sqf +++ b/addons/artillerytables/functions/fnc_rangeTableOpen.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Opens the rangetable and fills the charge listbox. diff --git a/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf b/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf index 4f0a3d6156..56135025ae 100644 --- a/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf +++ b/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Called when listbox selection changes. Updates the rangetable with new values. diff --git a/addons/artillerytables/functions/fnc_turretChanged.sqf b/addons/artillerytables/functions/fnc_turretChanged.sqf index 1975f65c73..b2c6bafb65 100644 --- a/addons/artillerytables/functions/fnc_turretChanged.sqf +++ b/addons/artillerytables/functions/fnc_turretChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Turret changed, determine if we are in the gunner seat of an artillery vehicle. @@ -19,7 +19,7 @@ params ["_player", "_turret"]; private _vehicle = vehicle _player; private _typeOf = typeOf _vehicle; -private _vehicleCfg = configFile >> "CfgVehicles" >> _typeOf; +private _vehicleCfg = configOf _vehicle; // 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 { diff --git a/addons/artillerytables/functions/fnc_turretPFEH.sqf b/addons/artillerytables/functions/fnc_turretPFEH.sqf index 5ab7c499b0..9ad10de1aa 100644 --- a/addons/artillerytables/functions/fnc_turretPFEH.sqf +++ b/addons/artillerytables/functions/fnc_turretPFEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Shows real azimuth and elevation on hud diff --git a/addons/artillerytables/functions/script_component.hpp b/addons/artillerytables/functions/script_component.hpp deleted file mode 100644 index d85f88930a..0000000000 --- a/addons/artillerytables/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\artillerytables\script_component.hpp" diff --git a/addons/artillerytables/initSettings.sqf b/addons/artillerytables/initSettings.sqf index 0a909ae41b..762010b2ca 100644 --- a/addons/artillerytables/initSettings.sqf +++ b/addons/artillerytables/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_artillerytables]: - private _categoryName = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], LLSTRING(rangetable_displayName)]; [ diff --git a/addons/artillerytables/stringtable.xml b/addons/artillerytables/stringtable.xml index d1d4ab23ef..5aef75b4ed 100644 --- a/addons/artillerytables/stringtable.xml +++ b/addons/artillerytables/stringtable.xml @@ -5,6 +5,7 @@ Artillery Rangetable Artillerieschusstafel 火炮射程表 + 火炮射表 Tavola balistica per artigliria Dělostřelecké tabulky střelby 火砲射表 @@ -14,11 +15,13 @@ 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 汎用の火砲用射程表 @@ -28,6 +31,7 @@ Tabla de distancias universal de artillería Uluslar arası Topçu Menzil Tablosu Универсальная артиллерийская баллистическая таблица + 범용 포병 사격거리표 Air Resistance @@ -59,7 +63,7 @@ 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 @@ -67,6 +71,7 @@ Artillery Computer Disabled Artilleriecomputer ausgeschaltet 停用火炮電腦 + 停用弹道计算机 Computer artiglieria disattivato Zakázat používání dělostřeleckého počítače 砲撃コンピュータ無効化 @@ -75,12 +80,14 @@ 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 ゲームの砲撃コンピュータを無効化します。 @@ -89,7 +96,8 @@ 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/CfgWeapons.hpp b/addons/atragmx/CfgWeapons.hpp index 2fa31fc628..c6eeb566c6 100644 --- a/addons/atragmx/CfgWeapons.hpp +++ b/addons/atragmx/CfgWeapons.hpp @@ -12,6 +12,7 @@ class CfgWeapons { picture = QPATHTOF(UI\ATRAG_Icon.paa); icon = "iconObject_circle"; mapSize = 0.034; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2; diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 896bc78ae0..6196346c57 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -14,12 +14,12 @@ class ATragMX_RscText { colorBackground[]={0,0,0,0}; colorText[]={0,0,0,1}; text=""; - x=0; - y=0; - h=0.037; - w=0.30; + x="0"; + y="0"; + h="0.037"; + w="0.30"; font="TahomaB"; - SizeEx=0.03; + SizeEx="0.03"; shadow=0; }; class ATragMX_RscButton { @@ -38,32 +38,32 @@ class ATragMX_RscButton { soundEscape[]={"",0,1}; type=1; style="0x02+0x100"; - x=0; - y=0; - w=0.03; - h=0.03; + x="0"; + y="0"; + w="0.03"; + h="0.03"; font="TahomaB"; - SizeEx=0.025; - offsetX=0.003; - offsetY=0.003; - offsetPressedX=0.0020; - offsetPressedY=0.0020; + SizeEx="0.025"; + offsetX="0.003"; + offsetY="0.003"; + offsetPressedX="0.0020"; + offsetPressedY="0.0020"; borderSize=0; shadow=0; }; class ATragMX_RscEdit { type=2; style=ST_RIGHT; - x=0; - y=0; - w=0.05; - h=0.03; + x="0"; + y="0"; + w="0.05"; + h="0.03"; colorDisabled[]={0,0,0,0.0}; colorBackground[]={0,0,0,0}; colorText[]={0,0,0,1}; colorSelection[]={0,0,0,0.25}; font="TahomaB"; - sizeEx=0.025; + sizeEx="0.025"; text=""; size=0.2; autocomplete=""; @@ -72,10 +72,10 @@ class ATragMX_RscEdit { class ATragMX_RscToolbox { type=6; style=ST_LEFT; - x=0; - y=0; - w=0.2; - h=0.03; + x="0"; + y="0"; + w="0.2"; + h="0.03"; colorDisabled[]={0,0,0,0.0}; colorBackground[]={1,1,1,1}; colorText[]={0,0,0,1}; @@ -86,7 +86,7 @@ class ATragMX_RscToolbox { colorTextDisable[]={0.4,0.4,0.4,1}; colorDisable[]={0.4,0.4,0.4,1}; font="TahomaB"; - sizeEx=0.027; + sizeEx="0.027"; rows=1; columns=2; strings[]={"Entry 1","Entry 2"}; @@ -98,7 +98,7 @@ class ATragMX_RscListBox { type=5; style=LB_TEXTURES; font="TahomaB"; - sizeEx=0.028; + sizeEx="0.028"; rowHeight=0.03; colorDisabled[]={0,0,0,0.0}; colorBackground[]={1,1,1,1}; @@ -109,14 +109,14 @@ class ATragMX_RscListBox { colorSelectBackground[]={0.925,0.925,0.925,1}; colorSelectBackground2[]={0.925,0.925,0.925,1}; period=0; - maxHistoryDelay=1.0; + maxHistoryDelay="1.0"; autoScrollSpeed=-1; - autoScrollDelay=5; + autoScrollDelay="5"; autoScrollRewind=0; soundSelect[]={"",0.09,1}; class ScrollBar { - width=0.05; + width="0.05"; color[]={0.15,0.21,0.23,0.3}; colorActive[]={0.15,0.21,0.23,0.3}; colorDisabled[]={0.15,0.21,0.23,0.3}; @@ -154,125 +154,125 @@ class ATragMX_Display { moving=1; type=0; font="TahomaB"; - SizeEX=0.025; + SizeEX="0.025"; idc=720000; style=48; - x=0.55*safezoneW+safezoneX-0.256; - y=0.265*safezoneH+safezoneY-0.1; - w=1.024; - h=1.024*4/3; + x="0.55*safezoneW+safezoneX-0.256"; + y="0.265*safezoneH+safezoneY-0.1"; + w="1.024"; + h="1.024*4/3"; colorBackground[]={1,1,1,1}; colorText[]={1,1,1,1}; - text=PATHTOF(UI\atrag_d.paa); + text=QPATHTOF(UI\atrag_d.paa); }; class POWER: ATragMX_RscButton { idc=-1; - x=0.55*safezoneW+safezoneX+0.145; - y=0.265*safezoneH+safezoneY+0.94; - w=0.045; - h=0.045*4/3; + x="0.55*safezoneW+safezoneX+0.145"; + y="0.265*safezoneH+safezoneY+0.94"; + w="0.045"; + h="0.045*4/3"; colorBackground[]={0,0,0,0.0}; action="closeDialog 0"; }; class BACK: POWER { idc=-1; - w=0.06; - x=0.55*safezoneW+safezoneX+0.3122; + w="0.06"; + x="0.55*safezoneW+safezoneX+0.3122"; action=QUOTE(call FUNC(init); call FUNC(update_target_selection)); }; class WINDOWS: ATragMX_RscButton { idc=-1; - x=0.55*safezoneW+safezoneX+0.130; - y=0.265*safezoneH+safezoneY+0.88; - w=0.035; - h=0.035*4/3; + x="0.55*safezoneW+safezoneX+0.130"; + y="0.265*safezoneH+safezoneY+0.88"; + w="0.035"; + h="0.035*4/3"; colorBackground[]={0,0,0,0.0}; }; class OK: WINDOWS { idc=-1; - x=0.55*safezoneW+safezoneX+0.347; - y=0.265*safezoneH+safezoneY+0.878; + x="0.55*safezoneW+safezoneX+0.347"; + y="0.265*safezoneH+safezoneY+0.878"; }; class TOP: ATragMX_RscButton { idc=-1; - x=0.55*safezoneW+safezoneX+0.242; - y=0.265*safezoneH+safezoneY+0.85; - w=0.03; - h=0.03; + x="0.55*safezoneW+safezoneX+0.242"; + y="0.265*safezoneH+safezoneY+0.85"; + w="0.03"; + h="0.03"; colorBackground[]={0,0,0,0.0}; action=QUOTE(-1 call FUNC(cycle_gun_list)); }; class BOTTOM: TOP { idc=-1; - y=0.265*safezoneH+safezoneY+0.955; + y="0.265*safezoneH+safezoneY+0.955"; action=QUOTE(+1 call FUNC(cycle_gun_list)); }; class LEFT: ATragMX_RscButton { idc=-1; - x=0.55*safezoneW+safezoneX+0.1925; - y=0.265*safezoneH+safezoneY+0.9; - w=0.05; - h=0.03; + x="0.55*safezoneW+safezoneX+0.1925"; + y="0.265*safezoneH+safezoneY+0.9"; + w="0.05"; + h="0.03"; colorBackground[]={0,0,0,0}; action=QUOTE(((4 + GVAR(currentTarget) - 1) % 4) call FUNC(change_target_slot)); }; class RIGHT: LEFT { idc=-1; - x=0.55*safezoneW+safezoneX+0.2725; + x="0.55*safezoneW+safezoneX+0.2725"; action=QUOTE(((4 + GVAR(currentTarget) + 1) % 4) call FUNC(change_target_slot)); }; class TOP_LEFT: ATragMX_RscButton { idc=-1; - x=0.55*safezoneW+safezoneX+0.162; - y=0.265*safezoneH+safezoneY+0.82; - w=0.031; - h=0.031*4/3; + x="0.55*safezoneW+safezoneX+0.162"; + y="0.265*safezoneH+safezoneY+0.82"; + w="0.031"; + h="0.031*4/3"; colorBackground[]={0,0,0,0.0}; }; class TOP_RIGHT: TOP_LEFT { idc=-1; - x=0.55*safezoneW+safezoneX+0.315; + x="0.55*safezoneW+safezoneX+0.315"; }; class TEXT_GUN_FRAME: ATragMX_RscText { idc=1001; style=64; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.25; - w=0.0925; - h=0.205; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.25"; + w="0.0925"; + h="0.205"; text=""; }; class TEXT_ATMOSPHERE_FRAME: TEXT_GUN_FRAME { idc=1002; - x=0.550*safezoneW+safezoneX+0.205; + x="0.550*safezoneW+safezoneX+0.205"; }; class TEXT_TARGET_FRAME: TEXT_GUN_FRAME { idc=1003; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; }; class TEXT_RESULT_FRAME: TEXT_GUN_FRAME { idc=1004; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.46; - w=0.2825; - h=0.15; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.46"; + w="0.2825"; + h="0.15"; }; class TEXT_GUN_PROFILE: ATragMX_RscText { idc=1000; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.20; - w=0.18; - h=0.03; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.20"; + w="0.18"; + h="0.03"; style=ST_LEFT; - sizeEx=0.025; + sizeEx="0.025"; text=""; }; class TEXT_D: ATragMX_RscButton { idc=600; - w=0.0231; - x=0.550*safezoneW+safezoneX+0.29; - y=0.265*safezoneH+safezoneY+0.20; + w="0.0231"; + x="0.550*safezoneW+safezoneX+0.29"; + y="0.265*safezoneH+safezoneY+0.20"; colorText[]={0,0,0,1}; colorDisabled[]={0.8,0.8,0.8,1}; colorBackgroundDisabled[]={0,0,0,1}; @@ -282,20 +282,20 @@ class ATragMX_Display { }; class TEXT_E: TEXT_D { idc=601; - x=0.550*safezoneW+safezoneX+0.3131; + x="0.550*safezoneW+safezoneX+0.3131"; text="E"; action=QUOTE(GVAR(currentUnit)=1; call FUNC(update_unit_selection)); }; class TEXT_M: TEXT_E { idc=602; - x=0.550*safezoneW+safezoneX+0.3362; + x="0.550*safezoneW+safezoneX+0.3362"; text="M"; action=QUOTE(GVAR(currentUnit)=2; call FUNC(update_unit_selection)); }; class TEXT_RANGE_CARD: TEXT_D { idc=603; - w=0.03; - x=0.550*safezoneW+safezoneX+0.36; + w="0.03"; + x="0.550*safezoneW+safezoneX+0.36"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="RC"; @@ -304,9 +304,9 @@ class ATragMX_Display { class TEXT_GUN: ATragMX_RscButton { idc=4000; - w=0.0925; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.25; + w="0.0925"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.25"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="Gun"; @@ -315,41 +315,41 @@ class ATragMX_Display { class TEXT_BORE_HEIGHT: TEXT_GUN_PROFILE { idc=10; style=ST_LEFT; - y=0.265*safezoneH+safezoneY+0.285; + y="0.265*safezoneH+safezoneY+0.285"; text="BH"; }; class TEXT_BORE_HEIGHT_OUTPUT: TEXT_BORE_HEIGHT { idc=100; style=ST_RIGHT; - w=0.058; - x=0.550*safezoneW+safezoneX+0.145; - y=0.265*safezoneH+safezoneY+0.285; + w="0.058"; + x="0.550*safezoneW+safezoneX+0.145"; + y="0.265*safezoneH+safezoneY+0.285"; }; class TEXT_BULLET_MASS: TEXT_BORE_HEIGHT { idc=11; style=ST_LEFT; - y=0.265*safezoneH+safezoneY+0.320; + y="0.265*safezoneH+safezoneY+0.320"; text="BW"; }; class TEXT_BULLET_MASS_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=110; - y=0.265*safezoneH+safezoneY+0.320; + y="0.265*safezoneH+safezoneY+0.320"; }; class TEXT_AIR_FRICTION: TEXT_BORE_HEIGHT { idc=12; - y=0.265*safezoneH+safezoneY+0.355; + y="0.265*safezoneH+safezoneY+0.355"; text="C1"; }; class TEXT_AIR_FRICTION_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=120; - y=0.265*safezoneH+safezoneY+0.355; + y="0.265*safezoneH+safezoneY+0.355"; }; class TEXT_MUZZLE_VELOCITY: ATragMX_RscButton { idc=13; style=0; - w=0.03; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.390; + w="0.03"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.390"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="MV"; @@ -357,69 +357,69 @@ class ATragMX_Display { }; class TEXT_MUZZLE_VELOCITY_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=130; - y=0.265*safezoneH+safezoneY+0.390; + y="0.265*safezoneH+safezoneY+0.390"; }; class TEXT_ZERO_RANGE: TEXT_BORE_HEIGHT { idc=14; - y=0.265*safezoneH+safezoneY+0.425; + y="0.265*safezoneH+safezoneY+0.425"; text="ZR"; }; class TEXT_ZERO_RANGE_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=140; - y=0.265*safezoneH+safezoneY+0.425; + y="0.265*safezoneH+safezoneY+0.425"; }; class TEXT_ATMOSPHERE: TEXT_GUN { idc=4001; - x=0.550*safezoneW+safezoneX+0.205; + x="0.550*safezoneW+safezoneX+0.205"; text="Atmsphr"; action=QUOTE(0 call FUNC(toggle_atmo_env_data)); }; class TEXT_TEMPERATURE: TEXT_BULLET_MASS { idc=20; - x=0.550*safezoneW+safezoneX+0.20; + x="0.550*safezoneW+safezoneX+0.20"; text="Tmp"; }; class TEXT_TEMPERATURE_OUTPUT: TEXT_TEMPERATURE { idc=200; style=ST_RIGHT; - w=0.050; - x=0.550*safezoneW+safezoneX+0.245; - y=0.265*safezoneH+safezoneY+0.320; + w="0.050"; + x="0.550*safezoneW+safezoneX+0.245"; + y="0.265*safezoneH+safezoneY+0.320"; text=""; }; class TEXT_BAROMETRIC_PRESSURE: TEXT_TEMPERATURE { idc=21; - x=0.550*safezoneW+safezoneX+0.20; - y=0.265*safezoneH+safezoneY+0.355; + x="0.550*safezoneW+safezoneX+0.20"; + y="0.265*safezoneH+safezoneY+0.355"; text="BP"; }; class TEXT_BAROMETRIC_PRESSURE_OUTPUT: TEXT_TEMPERATURE_OUTPUT { idc=210; - y=0.265*safezoneH+safezoneY+0.355; + y="0.265*safezoneH+safezoneY+0.355"; }; class TEXT_RELATIVE_HUMIDITY: TEXT_BAROMETRIC_PRESSURE { idc=22; - y=0.265*safezoneH+safezoneY+0.390; + y="0.265*safezoneH+safezoneY+0.390"; text="RH"; }; class TEXT_RELATIVE_HUMIDITY_OUTPUT: TEXT_TEMPERATURE_OUTPUT { idc=220; - y=0.265*safezoneH+safezoneY+0.390; + y="0.265*safezoneH+safezoneY+0.390"; }; class TEXT_ALTITUDE: TEXT_BORE_HEIGHT { idc=23; - x=0.550*safezoneW+safezoneX+0.20; + x="0.550*safezoneW+safezoneX+0.20"; text="Alt"; }; class TEXT_ALTITUDE_OUTPUT: TEXT_TEMPERATURE_OUTPUT { idc=230; - y=0.265*safezoneH+safezoneY+0.285; + y="0.265*safezoneH+safezoneY+0.285"; }; class TEXT_TARGET_A: ATragMX_RscButton { idc=500; - w=0.0231; - x=0.550*safezoneW+safezoneX+0.205; - y=0.265*safezoneH+safezoneY+0.425; + w="0.0231"; + x="0.550*safezoneW+safezoneX+0.205"; + y="0.265*safezoneH+safezoneY+0.425"; colorText[]={0,0,0,1}; colorDisabled[]={0.8,0.8,0.8,1}; colorBackgroundDisabled[]={0,0,0,1}; @@ -429,180 +429,180 @@ class ATragMX_Display { }; class TEXT_TARGET_B: TEXT_TARGET_A { idc=501; - x=0.550*safezoneW+safezoneX+0.2281; + x="0.550*safezoneW+safezoneX+0.2281"; text="B"; action=QUOTE(1 call FUNC(change_target_slot)); }; class TEXT_TARGET_C: TEXT_TARGET_A { idc=502; - x=0.550*safezoneW+safezoneX+0.2512; + x="0.550*safezoneW+safezoneX+0.2512"; text="C"; action=QUOTE(2 call FUNC(change_target_slot)); }; class TEXT_TARGET_D: TEXT_TARGET_A { idc=503; - x=0.550*safezoneW+safezoneX+0.2743; + x="0.550*safezoneW+safezoneX+0.2743"; text="D"; action=QUOTE(3 call FUNC(change_target_slot)); }; class TEXT_TARGET: TEXT_GUN { idc=4002; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; text="Target"; action=QUOTE(0 call FUNC(toggle_target_data)); }; class TEXT_WIND_SPEED: TEXT_BORE_HEIGHT { idc=30; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; text="WS"; }; class TEXT_WIND_SPEED_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=300; - w=0.058; - x=0.550*safezoneW+safezoneX+0.335; - y=0.265*safezoneH+safezoneY+0.285; + w="0.058"; + x="0.550*safezoneW+safezoneX+0.335"; + y="0.265*safezoneH+safezoneY+0.285"; text="0"; }; class TEXT_WIND_DIRECTION: TEXT_BULLET_MASS { idc=31; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; text="WD"; }; class TEXT_WIND_DIRECTION_OUTPUT: TEXT_WIND_SPEED_OUTPUT { idc=310; - y=0.265*safezoneH+safezoneY+0.32; + y="0.265*safezoneH+safezoneY+0.32"; }; class TEXT_INCLINATION_ANGLE: TEXT_AIR_FRICTION { idc=32; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; text="IA"; }; class TEXT_INCLINATION_ANGLE_OUTPUT: TEXT_WIND_SPEED_OUTPUT { idc=320; - y=0.265*safezoneH+safezoneY+0.355; + y="0.265*safezoneH+safezoneY+0.355"; }; class TEXT_TARGET_SPEED: TEXT_MUZZLE_VELOCITY { idc=33; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; text="TS"; action=QUOTE(0 call FUNC(toggle_target_speed_assist)); }; class TEXT_TARGET_SPEED_OUTPUT: TEXT_WIND_SPEED_OUTPUT { idc=330; - y=0.265*safezoneH+safezoneY+0.39; + y="0.265*safezoneH+safezoneY+0.39"; }; class TEXT_TARGET_RANGE: TEXT_TARGET_SPEED { idc=34; - y=0.265*safezoneH+safezoneY+0.425; + y="0.265*safezoneH+safezoneY+0.425"; text="TR"; action=QUOTE(0 call FUNC(toggle_target_range_assist)); }; class TEXT_TARGET_RANGE_INPUT: TEXT_WIND_SPEED_OUTPUT { idc=340; - y=0.265*safezoneH+safezoneY+0.425; + y="0.265*safezoneH+safezoneY+0.425"; }; class TEXT_ELEVATION: TEXT_GUN_PROFILE { idc=40; - w=0.05; - x=0.550*safezoneW+safezoneX+0.115; - y=0.265*safezoneH+safezoneY+0.50; + w="0.05"; + x="0.550*safezoneW+safezoneX+0.115"; + y="0.265*safezoneH+safezoneY+0.50"; text="Elev"; }; class TEXT_ABSOLUTE: TEXT_GUN_PROFILE { idc=4003; - w=0.07; + w="0.07"; style=ST_CENTER; - x=0.550*safezoneW+safezoneX+0.17; - y=0.265*safezoneH+safezoneY+0.47; + x="0.550*safezoneW+safezoneX+0.17"; + y="0.265*safezoneH+safezoneY+0.47"; text="Abs"; }; class TEXT_RELATIVE: TEXT_ABSOLUTE { idc=4004; - x=0.550*safezoneW+safezoneX+0.245; + x="0.550*safezoneW+safezoneX+0.245"; text="Rel"; }; class TEXT_CURRENT: TEXT_ABSOLUTE { idc=4005; - x=0.550*safezoneW+safezoneX+0.32; + x="0.550*safezoneW+safezoneX+0.32"; text="Cur"; }; class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscText { idc=400; - style=ST_WITH_RECT+ST_RIGHT; - sizeEx=0.025; - w=0.065; - h=0.032; - x=0.550*safezoneW+safezoneX+0.17; - y=0.265*safezoneH+safezoneY+0.50; + style=QUOTE(ST_WITH_RECT+ST_RIGHT); + sizeEx="0.025"; + w="0.065"; + h="0.032"; + x="0.550*safezoneW+safezoneX+0.17"; + y="0.265*safezoneH+safezoneY+0.50"; text=""; }; class TEXT_ELEVATION_OUTPUT_RELATIVE: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=401; - x=0.550*safezoneW+safezoneX+0.2465; + x="0.550*safezoneW+safezoneX+0.2465"; }; class TEXT_ELEVATION_INPUT_CURRENT: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=402; - x=0.550*safezoneW+safezoneX+0.323; + x="0.550*safezoneW+safezoneX+0.323"; }; class TEXT_WINDAGE: TEXT_ELEVATION { idc=41; - y=0.265*safezoneH+safezoneY+0.535; + y="0.265*safezoneH+safezoneY+0.535"; text="Wind"; }; class TEXT_WINDAGE_OUTPUT_ABSOLUTE: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=410; - y=0.265*safezoneH+safezoneY+0.535; + y="0.265*safezoneH+safezoneY+0.535"; }; class TEXT_WINDAGE_OUTPUT_RELATIVE: TEXT_WINDAGE_OUTPUT_ABSOLUTE { idc=411; - x=0.550*safezoneW+safezoneX+0.2465; + x="0.550*safezoneW+safezoneX+0.2465"; }; class TEXT_WINDAGE_INPUT_CURRENT: TEXT_WINDAGE_OUTPUT_ABSOLUTE { idc=412; - x=0.550*safezoneW+safezoneX+0.323; + x="0.550*safezoneW+safezoneX+0.323"; }; class TEXT_LEAD: TEXT_GUN { idc=42; - w=0.05; - x=0.550*safezoneW+safezoneX+0.115; - y=0.265*safezoneH+safezoneY+0.57; + w="0.05"; + x="0.550*safezoneW+safezoneX+0.115"; + y="0.265*safezoneH+safezoneY+0.57"; text="Lead"; action=QUOTE(GVAR(showWind2) = !GVAR(showWind2); call FUNC(update_result); call FUNC(update_target)); }; class TEXT_LEAD_OUTPUT: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=420; - y=0.265*safezoneH+safezoneY+0.57; + y="0.265*safezoneH+safezoneY+0.57"; }; class TEXT_RESET_SCOPE_ZERO: TEXT_GUN { idc=4006; - w=0.07; + w="0.07"; style=ST_CENTER; colorBackground[]={0,0,0,0}; - x=0.550*safezoneW+safezoneX+0.2465; - y=0.265*safezoneH+safezoneY+0.57; + x="0.550*safezoneW+safezoneX+0.2465"; + y="0.265*safezoneH+safezoneY+0.57"; text="Reset"; action=QUOTE(call FUNC(reset_relative_click_memory)); }; class TEXT_UPDATE_SCOPE_ZERO: TEXT_RESET_SCOPE_ZERO { idc=4007; - x=0.550*safezoneW+safezoneX+0.323; + x="0.550*safezoneW+safezoneX+0.323"; text="Update"; action=QUOTE(call FUNC(update_relative_click_memory)); }; class TEXT_GUN_LIST: TEXT_GUN { idc=4008; style=ST_LEFT; - y=0.265*safezoneH+safezoneY+0.65; + y="0.265*safezoneH+safezoneY+0.65"; text="GunList"; action=QUOTE(call FUNC(toggle_gun_list)); }; class TEXT_SCOPE_UNIT: TEXT_GUN_LIST { idc=2000; style=ST_CENTER; - w=0.06; - x=0.550*safezoneW+safezoneX+0.205; + w="0.06"; + x="0.550*safezoneW+safezoneX+0.205"; colorBackground[]={0,0,0,0}; text="TMOA"; action=QUOTE(call FUNC(cycle_scope_unit)); @@ -610,15 +610,15 @@ class ATragMX_Display { class TEXT_SCOPE_CLICK_NUMBER: TEXT_GUN_LIST { idc=2001; style=ST_CENTER; - w=0.025; - x=0.550*safezoneW+safezoneX+0.27; + w="0.025"; + x="0.550*safezoneW+safezoneX+0.27"; text="4"; action=QUOTE(call FUNC(toggle_solution_setup)); }; class TEXT_OPTIONS: TEXT_GUN_LIST { idc=3000; style=ST_RIGHT; - x=0.550*safezoneW+safezoneX+0.3; + x="0.550*safezoneW+safezoneX+0.3"; text="Options"; action=QUOTE(false call FUNC(toggle_option_menu)); }; @@ -627,22 +627,22 @@ class ATragMX_Display { colorBackground[]={0.15,0.21,0.23,0.2}; colorBackgroundActive[]={0.15,0.21,0.23,0.2}; colorFocused[]={0.15,0.21,0.23,0.2}; - x=0.550*safezoneW+safezoneX+0.105; - y=0.265*safezoneH+safezoneY+0.17; - w=0.3; - h=0.535; - offsetPressedX=0.0; - offsetPressedY=0.0; + x="0.550*safezoneW+safezoneX+0.105"; + y="0.265*safezoneH+safezoneY+0.17"; + w="0.3"; + h="0.535"; + offsetPressedX="0.0"; + offsetPressedY="0.0"; action=QUOTE(false call FUNC(toggle_option_menu)); }; class TEXT_OPTIONS_LIST_OUTPUT: ATragMX_RscListBox { idc=3002; style=0; - w=0.17; - h=0.28; - x=0.550*safezoneW+safezoneX+0.225; - y=0.265*safezoneH+safezoneY+0.355; - sizeEx=0.025; + w="0.17"; + h="0.28"; + x="0.550*safezoneW+safezoneX+0.225"; + y="0.265*safezoneH+safezoneY+0.355"; + sizeEx="0.025"; onMouseButtonClick=QUOTE(true call FUNC(toggle_option_menu)); }; @@ -652,9 +652,9 @@ class ATragMX_Display { }; class TEXT_RANGE_CARD_SETUP: ATragMX_RscButton { idc=5001; - w=0.055675; - x=0.550*safezoneW+safezoneX+0.28; - y=0.265*safezoneH+safezoneY+0.20; + w="0.055675"; + x="0.550*safezoneW+safezoneX+0.28"; + y="0.265*safezoneH+safezoneY+0.20"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="Setup"; @@ -662,32 +662,32 @@ class ATragMX_Display { }; class TEXT_RANGE_CARD_DONE: TEXT_RANGE_CARD_SETUP { idc=5002; - x=0.550*safezoneW+safezoneX+0.3362; + x="0.550*safezoneW+safezoneX+0.3362"; text="Done"; action=QUOTE(call FUNC(toggle_range_card)); }; class TEXT_RANGE_CARD_COLUMN_1_CAPTION: ATragMX_RscButton { idc=5003; style=ST_LEFT; - w=0.07; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.24; + w="0.07"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.24"; colorBackground[]={0.15,0.21,0.23,0.3}; text="Meters"; }; class TEXT_RANGE_CARD_COLUMN_2_CAPTION: TEXT_RANGE_CARD_COLUMN_1_CAPTION { idc=5004; - x=0.550*safezoneW+safezoneX+0.180625; + x="0.550*safezoneW+safezoneX+0.180625"; text="Elev"; }; class TEXT_RANGE_CARD_COLUMN_3_CAPTION: TEXT_RANGE_CARD_COLUMN_1_CAPTION { idc=5005; - x=0.550*safezoneW+safezoneX+0.25125; + x="0.550*safezoneW+safezoneX+0.25125"; text="Wind"; }; class TEXT_RANGE_CARD_COLUMN_4_CAPTION: TEXT_RANGE_CARD_COLUMN_1_CAPTION { idc=5006; - x=0.550*safezoneW+safezoneX+0.321875; + x="0.550*safezoneW+safezoneX+0.321875"; text="TmFlt"; action=QUOTE(call FUNC(cycle_range_card_columns)); }; @@ -696,98 +696,98 @@ class ATragMX_Display { columns[]={0.0, 0.225, 0.475, 0.7}; idcLeft=50061; idcRight=50062; - w=0.285; - h=0.42; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.27; + w="0.285"; + h="0.42"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.27"; }; class TEXT_GUN_LIST_OUTPUT: ATragMX_RscListNBox { idc=6000; columns[]={-0.05}; - w=0.16; - h=0.45; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.24; - sizeEx=0.018; + w="0.16"; + h="0.45"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.24"; + sizeEx="0.018"; colorSelectBackground[]={0.15,0.21,0.23,0.3}; colorSelectBackground2[]={0.15,0.21,0.23,0.3}; onLBDblClick=QUOTE(true call FUNC(toggle_gun_list)); }; class TEXT_GUN_LIST_COLUMN_CAPTION: TEXT_GUN_PROFILE { idc=6001; - w=0.16; + w="0.16"; colorBackground[]={0.15,0.21,0.23,0.3}; text="AtragGun.gun"; }; class TEXT_GUN_LIST_OPEN_GUN: ATragMX_RscButton { idc=6002; style=ST_RIGHT; - w=0.115; - x=0.550*safezoneW+safezoneX+0.28; - y=0.265*safezoneH+safezoneY+0.20; + w="0.115"; + x="0.550*safezoneW+safezoneX+0.28"; + y="0.265*safezoneH+safezoneY+0.20"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; - sizeEx=0.024; + sizeEx="0.024"; text="Open Gun"; action=QUOTE(true call FUNC(toggle_gun_list)); }; class TEXT_GUN_LIST_SAVE_GUN: TEXT_GUN_LIST_OPEN_GUN { idc=6003; - y=0.265*safezoneH+safezoneY+0.24; + y="0.265*safezoneH+safezoneY+0.24"; text="Save Gun"; action=QUOTE(call FUNC(save_gun)); }; class TEXT_GUN_LIST_ADD_NEW_GUN: TEXT_GUN_LIST_OPEN_GUN { idc=6004; - y=0.265*safezoneH+safezoneY+0.28; + y="0.265*safezoneH+safezoneY+0.28"; text="Add New Gun"; action=QUOTE(false call FUNC(show_gun_list); true call FUNC(show_add_new_gun)); }; class TEXT_GUN_LIST_DELETE_GUN: TEXT_GUN_LIST_OPEN_GUN { idc=6005; - y=0.265*safezoneH+safezoneY+0.34; + y="0.265*safezoneH+safezoneY+0.34"; text="Delete Gun"; action=QUOTE(call FUNC(delete_gun)); }; class TEXT_GUN_LIST_NOTE: TEXT_GUN_LIST_OPEN_GUN { idc=6006; - y=0.265*safezoneH+safezoneY+0.40; + y="0.265*safezoneH+safezoneY+0.40"; text="Note"; }; class TEXT_GUN_LIST_DONE: TEXT_GUN_LIST_OPEN_GUN { idc=6007; - y=0.265*safezoneH+safezoneY+0.65; + y="0.265*safezoneH+safezoneY+0.65"; text="Done"; action=QUOTE(false call FUNC(toggle_gun_list)); }; class TEXT_TARGET_RANGE_ASSIST_CAPTION: ATragMX_RscText { idc=7000; - style=16+0x200; + style="16+0x200"; lineSpacing=1.0; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.24; - w=0.29; - h=0.10; - sizeEx=0.022; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.24"; + w="0.29"; + h="0.10"; + sizeEx="0.022"; text="When using WIDTH to size a target, UP/Down Angle does not effect range calculation but will effect bullet drop."; }; class TEXT_TARGET_RANGE_ASSIST_MEASUREMENT_METHOD: TEXT_TARGET_RANGE_ASSIST_CAPTION { idc=7001; style=ST_LEFT; - x=0.550*safezoneW+safezoneX+0.115; - y=0.265*safezoneH+safezoneY+0.35; - w=0.12; - h=0.03; - sizeEx=0.027; + x="0.550*safezoneW+safezoneX+0.115"; + y="0.265*safezoneH+safezoneY+0.35"; + w="0.12"; + h="0.03"; + sizeEx="0.027"; text="Using Target:"; }; class TEXT_TARGET_RANGE_ASSIST_WIDTH_HEIGHT: ATragMX_RscToolbox { idc=7002; - w=0.14; - x=0.550*safezoneW+safezoneX+0.24; - y=0.265*safezoneH+safezoneY+0.35; + w="0.14"; + x="0.550*safezoneW+safezoneX+0.24"; + y="0.265*safezoneH+safezoneY+0.35"; strings[]={"Height","Width"}; values[]={1,0}; onToolBoxSelChanged=QUOTE(GVAR(rangeAssistUseTargetHeight) = ((_this select 1) == 0)); @@ -795,89 +795,89 @@ class ATragMX_Display { class TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE: TEXT_TARGET_RANGE_ASSIST_MEASUREMENT_METHOD { idc=7003; style=ST_RIGHT; - x=0.550*safezoneW+safezoneX+0.092; - y=0.265*safezoneH+safezoneY+0.4; - w=0.128; + x="0.550*safezoneW+safezoneX+0.092"; + y="0.265*safezoneH+safezoneY+0.4"; + w="0.128"; text="Target Size"; }; class TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=7004; - y=0.265*safezoneH+safezoneY+0.45; + y="0.265*safezoneH+safezoneY+0.45"; text="Image Size"; }; class TEXT_TARGET_RANGE_ASSIST_ANGLE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=7005; - y=0.265*safezoneH+safezoneY+0.5; + y="0.265*safezoneH+safezoneY+0.5"; text="Angle"; }; class TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=7006; - y=0.265*safezoneH+safezoneY+0.55; + y="0.265*safezoneH+safezoneY+0.55"; text="Est Range"; }; class TEXT_TARGET_RANGE_ASSIST_CALC_1: TEXT_MUZZLE_VELOCITY { idc=7007; - w=0.0231; - x=0.550*safezoneW+safezoneX+0.22; - y=0.265*safezoneH+safezoneY+0.4; - sizeEx=0.03; + w="0.0231"; + x="0.550*safezoneW+safezoneX+0.22"; + y="0.265*safezoneH+safezoneY+0.4"; + sizeEx="0.03"; text="!"; action=QUOTE(0 call FUNC(calculate_target_range_assist)); }; class TEXT_TARGET_RANGE_ASSIST_CALC_2: TEXT_TARGET_RANGE_ASSIST_CALC_1 { idc=7008; - y=0.265*safezoneH+safezoneY+0.45; + y="0.265*safezoneH+safezoneY+0.45"; action=QUOTE(1 call FUNC(calculate_target_range_assist)); }; class TEXT_TARGET_RANGE_ASSIST_CALC_3: TEXT_TARGET_RANGE_ASSIST_CALC_1 { idc=7009; - y=0.265*safezoneH+safezoneY+0.55; + y="0.265*safezoneH+safezoneY+0.55"; action=QUOTE(2 call FUNC(calculate_target_range_assist)); }; class TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT: ATragMX_RscEdit { idc=7010; - w=0.065; - x=0.550*safezoneW+safezoneX+0.2475; - y=0.265*safezoneH+safezoneY+0.4; + w="0.065"; + x="0.550*safezoneW+safezoneX+0.2475"; + y="0.265*safezoneH+safezoneY+0.4"; }; class TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { idc=7011; - y=0.265*safezoneH+safezoneY+0.45; + y="0.265*safezoneH+safezoneY+0.45"; }; class TEXT_TARGET_RANGE_ASSIST_ANGLE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { idc=7012; - y=0.265*safezoneH+safezoneY+0.5; + y="0.265*safezoneH+safezoneY+0.5"; }; class TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { idc=7013; - y=0.265*safezoneH+safezoneY+0.55; + y="0.265*safezoneH+safezoneY+0.55"; }; class TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_UNIT: TEXT_TARGET_RANGE_ASSIST_CALC_1 { idc=7014; - w=0.07; - x=0.550*safezoneW+safezoneX+0.32; + w="0.07"; + x="0.550*safezoneW+safezoneX+0.32"; text="cm"; action=QUOTE(call FUNC(cycle_target_size_units)); }; class TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_UNIT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_UNIT { idc=7015; - y=0.265*safezoneH+safezoneY+0.45; + y="0.265*safezoneH+safezoneY+0.45"; text="MIL"; action=QUOTE(call FUNC(cycle_image_size_units)); }; class TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE_UNIT: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE { idc=7016; style=ST_LEFT; - w=0.07; - x=0.550*safezoneW+safezoneX+0.32; + w="0.07"; + x="0.550*safezoneW+safezoneX+0.32"; text="Meters"; }; class TEXT_TARGET_RANGE_ASSIST_DONE: ATragMX_RscButton { idc=7017; style=ST_CENTER; - w=0.07; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.60; + w="0.07"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.60"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="Done"; @@ -885,41 +885,41 @@ class ATragMX_Display { }; class TEXT_TARGET_RANGE_ASSIST_CANCEL: TEXT_TARGET_RANGE_ASSIST_DONE { idc=7018; - x=0.550*safezoneW+safezoneX+0.180625; + x="0.550*safezoneW+safezoneX+0.180625"; text="Cancel"; action=QUOTE(0 call FUNC(toggle_target_range_assist)); }; class TEXT_TARGET_RANGE_ASSIST_PREV: TEXT_TARGET_RANGE_ASSIST_DONE { idc=7019; - x=0.550*safezoneW+safezoneX+0.25125; + x="0.550*safezoneW+safezoneX+0.25125"; text="Prev"; action=""; }; class TEXT_TARGET_RANGE_ASSIST_NEXT: TEXT_TARGET_RANGE_ASSIST_DONE { idc=7020; - x=0.550*safezoneW+safezoneX+0.321875; + x="0.550*safezoneW+safezoneX+0.321875"; text="Next"; action=""; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=8000; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="Target Range"; }; class TEXT_TARGET_SPEED_ASSIST_NUM_TICKS: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE { idc=8001; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="Num Ticks"; }; class TEXT_TARGET_SPEED_ASSIST_TIME: TEXT_TARGET_RANGE_ASSIST_ANGLE { idc=8002; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="Time (secs)"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_ESTIMATED_SPEED: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE { idc=8003; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="Est Speed"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { @@ -936,15 +936,15 @@ class ATragMX_Display { }; class TEXT_TARGET_SPEED_ASSIST_TARGET_ESTIMATED_SPEED_OUTPUT: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE { idc=8007; - w=0.065; - x=0.550*safezoneW+safezoneX+0.2475; - y=0.265*safezoneH+safezoneY+0.55; + w="0.065"; + x="0.550*safezoneW+safezoneX+0.2475"; + y="0.265*safezoneH+safezoneY+0.55"; colorBackground[]={0.15,0.21,0.23,0.3}; text="0"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE_UNIT: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE_UNIT { idc=8008; - y=0.265*safezoneH+safezoneY+0.4; + y="0.265*safezoneH+safezoneY+0.4"; text="Meters"; }; class TEXT_TARGET_SPEED_ASSIST_NUM_TICKS_UNIT: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_UNIT { @@ -954,7 +954,7 @@ class ATragMX_Display { }; class TEXT_TARGET_SPEED_ASSIST_TIMER_START: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_UNIT { idc=8010; - y=0.265*safezoneH+safezoneY+0.5; + y="0.265*safezoneH+safezoneY+0.5"; text="Start"; action=QUOTE(call FUNC(target_speed_assist_timer)); }; @@ -979,31 +979,31 @@ class ATragMX_Display { class TEXT_TARGET_SPEED_ASSIST_TIMER_STOP_BACKGROUND: ATragMX_RscButton { idc=9000; - w=0.285; - h=0.49; - x=0.550*safezoneW+safezoneX+0.11; - y=0.265*safezoneH+safezoneY+0.2; + w="0.285"; + h="0.49"; + x="0.550*safezoneW+safezoneX+0.11"; + y="0.265*safezoneH+safezoneY+0.2"; colorBackground[]={0,0,0,0}; colorBackgroundActive[]={0,0,0,0}; action=QUOTE(GVAR(speedAssistTimer)=false); }; class TEXT_TARGET_SPEED_ASSIST_TIME_OUTPUT: ATragMX_RscText { idc=9001; - x=0.550*safezoneW+safezoneX+0.22; - y=0.265*safezoneH+safezoneY+0.51; - w=0.08; - h=0.09; + x="0.550*safezoneW+safezoneX+0.22"; + y="0.265*safezoneH+safezoneY+0.51"; + w="0.08"; + h="0.09"; style=ST_CENTER; - sizeEx=0.05; + sizeEx="0.05"; text="0.0"; }; class TEXT_TARGET_SPEED_ASSIST_TIMER_STOP: ATragMX_RscButton { idc=9002; style=ST_CENTER; - w=0.07; - h=0.04; - x=0.550*safezoneW+safezoneX+0.225; - y=0.265*safezoneH+safezoneY+0.60; + w="0.07"; + h="0.04"; + x="0.550*safezoneW+safezoneX+0.225"; + y="0.265*safezoneH+safezoneY+0.60"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="Stop"; @@ -1012,17 +1012,17 @@ class ATragMX_Display { class TEXT_RANGE_CARD_SETUP_START_RANGE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=10000; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="Start Range"; }; class TEXT_RANGE_CARD_SETUP_END_RANGE: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE { idc=10001; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="End Range"; }; class TEXT_RANGE_CARD_SETUP_INCREMENT: TEXT_TARGET_RANGE_ASSIST_ANGLE { idc=10002; - x=0.550*safezoneW+safezoneX+0.12; + x="0.550*safezoneW+safezoneX+0.12"; text="Increment"; }; class TEXT_RANGE_CARD_SETUP_START_RANGE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { @@ -1055,20 +1055,20 @@ class ATragMX_Display { class TEXT_ADD_NEW_GUN_CAPTION: ATragMX_RscText { idc=11000; style=ST_LEFT; - w=0.25; - h=0.04; - x=0.550*safezoneW+safezoneX+0.12; - y=0.265*safezoneH+safezoneY+0.24; - sizeEx=0.025; + w="0.25"; + h="0.04"; + x="0.550*safezoneW+safezoneX+0.12"; + y="0.265*safezoneH+safezoneY+0.24"; + sizeEx="0.025"; text="New Gun Name"; }; class TEXT_ADD_NEW_GUN_GUN_NAME_INPUT: ATragMX_RscEdit { idc=11001; style=ST_LEFT; - w=0.225; - h=0.04; - x=0.550*safezoneW+safezoneX+0.12; - y=0.265*safezoneH+safezoneY+0.28; + w="0.225"; + h="0.04"; + x="0.550*safezoneW+safezoneX+0.12"; + y="0.265*safezoneH+safezoneY+0.28"; text=""; onKeyDown=QUOTE(call FUNC(trim_gun_name)); onKeyUp=QUOTE(call FUNC(trim_gun_name)); @@ -1076,10 +1076,10 @@ class ATragMX_Display { class TEXT_ADD_NEW_GUN_OK: ATragMX_RscButton { idc=11002; style=ST_CENTER; - w=0.1; - h=0.04; - x=0.550*safezoneW+safezoneX+0.12; - y=0.265*safezoneH+safezoneY+0.33; + w="0.1"; + h="0.04"; + x="0.550*safezoneW+safezoneX+0.12"; + y="0.265*safezoneH+safezoneY+0.33"; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="OK"; @@ -1087,82 +1087,82 @@ class ATragMX_Display { }; class TEXT_ADD_NEW_GUN_CANCEL: TEXT_ADD_NEW_GUN_OK { idc=11003; - x=0.550*safezoneW+safezoneX+0.245; + x="0.550*safezoneW+safezoneX+0.245"; text="Cancel"; action=QUOTE(false call FUNC(show_add_new_gun); true call FUNC(show_gun_list)); }; class TEXT_GUN_AMMO_DATA_BORE_HEIGHT: TEXT_BORE_HEIGHT { idc=12000; - w=0.22; - y=0.265*safezoneH+safezoneY+0.28; + w="0.22"; + y="0.265*safezoneH+safezoneY+0.28"; text="Bore (cm)"; }; class TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT: ATragMX_RscEdit { idc=120000; - w=0.06; - x=0.550*safezoneW+safezoneX+0.335; - y=0.265*safezoneH+safezoneY+0.28; + w="0.06"; + x="0.550*safezoneW+safezoneX+0.335"; + y="0.265*safezoneH+safezoneY+0.28"; }; class TEXT_GUN_AMMO_DATA_BULLET_MASS: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=12001; - y=0.265*safezoneH+safezoneY+0.320; + y="0.265*safezoneH+safezoneY+0.320"; text="Bullet Weight (grams)"; }; class TEXT_GUN_AMMO_DATA_BULLET_MASS_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=120010; - y=0.265*safezoneH+safezoneY+0.320; + y="0.265*safezoneH+safezoneY+0.320"; }; class TEXT_GUN_AMMO_DATA_BULLET_DIAMETER: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=12002; - y=0.265*safezoneH+safezoneY+0.360; + y="0.265*safezoneH+safezoneY+0.360"; text="Bullet Diam (cm)"; }; class TEXT_GUN_AMMO_DATA_BULLET_DIAMETER_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=120020; - y=0.265*safezoneH+safezoneY+0.360; + y="0.265*safezoneH+safezoneY+0.360"; }; class TEXT_GUN_AMMO_DATA_AIR_FRICTION: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=12003; - y=0.265*safezoneH+safezoneY+0.400; + y="0.265*safezoneH+safezoneY+0.400"; text="C1 Coefficient"; }; class TEXT_GUN_AMMO_DATA_AIR_FRICTION_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=120030; - y=0.265*safezoneH+safezoneY+0.400; + y="0.265*safezoneH+safezoneY+0.400"; }; class TEXT_GUN_AMMO_DATA_RIFLE_TWIST: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=12004; - y=0.265*safezoneH+safezoneY+0.440; + y="0.265*safezoneH+safezoneY+0.440"; text="Rifle Twist (cm/trn)"; }; class TEXT_GUN_AMMO_DATA_RIFLE_TWIST_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=120040; - y=0.265*safezoneH+safezoneY+0.440; + y="0.265*safezoneH+safezoneY+0.440"; }; class TEXT_GUN_AMMO_DATA_MUZZLE_VELOCITY: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=12005; - y=0.265*safezoneH+safezoneY+0.480; + y="0.265*safezoneH+safezoneY+0.480"; text="Muzzle Velocity (m/s)"; }; class TEXT_GUN_AMMO_DATA_MUZZLE_VELOCITY_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=120050; - y=0.265*safezoneH+safezoneY+0.480; + y="0.265*safezoneH+safezoneY+0.480"; }; class TEXT_GUN_AMMO_DATA_ZERO_RANGE: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=12006; - y=0.265*safezoneH+safezoneY+0.520; + y="0.265*safezoneH+safezoneY+0.520"; text="Zero Range (meters)"; }; class TEXT_GUN_AMMO_DATA_ZERO_RANGE_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=120060; - y=0.265*safezoneH+safezoneY+0.520; + y="0.265*safezoneH+safezoneY+0.520"; }; class TEXT_GUN_AMMO_DATA_ZERO_RANGE_METER_INDICATOR: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=120061; - w=0.05; - x=0.550*safezoneW+safezoneX+0.315; - y=0.265*safezoneH+safezoneY+0.520; + w="0.05"; + x="0.550*safezoneW+safezoneX+0.315"; + y="0.265*safezoneH+safezoneY+0.520"; text=""; }; class TEXT_GUN_AMMO_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { @@ -1182,63 +1182,63 @@ class ATragMX_Display { class TEXT_ATMO_ENV_DATA_DEFAULT: TEXT_LEAD { idc=13000; - w=0.08; - x=0.550*safezoneW+safezoneX+0.15; - y=0.265*safezoneH+safezoneY+0.320; + w="0.08"; + x="0.550*safezoneW+safezoneX+0.15"; + y="0.265*safezoneH+safezoneY+0.320"; text="Default"; action=QUOTE(call FUNC(restore_atmo_default)); }; class TEXT_ATMO_ENV_DATA_AT: TEXT_TARGET_A { idc=13001; - w=0.04; - x=0.550*safezoneW+safezoneX+0.24; - y=0.265*safezoneH+safezoneY+0.320; + w="0.04"; + x="0.550*safezoneW+safezoneX+0.24"; + y="0.265*safezoneH+safezoneY+0.320"; text="AT"; action=QUOTE(GVAR(atmosphereModeTBH) = false; call FUNC(update_atmo_selection)); }; class TEXT_ATMO_ENV_DATA_TBH: TEXT_ATMO_ENV_DATA_AT { idc=13002; - x=0.550*safezoneW+safezoneX+0.28; + x="0.550*safezoneW+safezoneX+0.28"; text="TBH"; action=QUOTE(GVAR(atmosphereModeTBH) = true; call FUNC(update_atmo_selection)); }; class TEXT_ATMO_ENV_DATA_ALTITUDE: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=13003; - x=0.550*safezoneW+safezoneX+0.115; - y=0.265*safezoneH+safezoneY+0.400; + x="0.550*safezoneW+safezoneX+0.115"; + y="0.265*safezoneH+safezoneY+0.400"; text="Altitude (ft)"; }; class TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { idc=130030; - x=0.550*safezoneW+safezoneX+0.330; - y=0.265*safezoneH+safezoneY+0.400; + x="0.550*safezoneW+safezoneX+0.330"; + y="0.265*safezoneH+safezoneY+0.400"; }; class TEXT_ATMO_ENV_DATA_TEMPERATURE: TEXT_ATMO_ENV_DATA_ALTITUDE { idc=13004; - y=0.265*safezoneH+safezoneY+0.440; + y="0.265*safezoneH+safezoneY+0.440"; text="temperature (F)"; }; class TEXT_ATMO_ENV_DATA_TEMPERATURE_INPUT: TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT { idc=130040; - y=0.265*safezoneH+safezoneY+0.440; + y="0.265*safezoneH+safezoneY+0.440"; }; class TEXT_ATMO_ENV_DATA_BAROMETRIC_PRESSURE: TEXT_ATMO_ENV_DATA_ALTITUDE { idc=13005; - y=0.265*safezoneH+safezoneY+0.480; + y="0.265*safezoneH+safezoneY+0.480"; text="Barom Pres (in.merc.)"; }; class TEXT_ATMO_ENV_DATA_BAROMETRIC_PRESSURE_INPUT: TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT { idc=130050; - y=0.265*safezoneH+safezoneY+0.480; + y="0.265*safezoneH+safezoneY+0.480"; }; class TEXT_ATMO_ENV_DATA_RELATIVE_HUMIDITY: TEXT_ATMO_ENV_DATA_ALTITUDE { idc=13006; - y=0.265*safezoneH+safezoneY+0.520; + y="0.265*safezoneH+safezoneY+0.520"; text="Relative Humidity (%)"; }; class TEXT_ATMO_ENV_DATA_RELATIVE_HUMIDITY_INPUT: TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT { idc=130060; - y=0.265*safezoneH+safezoneY+0.520; + y="0.265*safezoneH+safezoneY+0.520"; }; class TEXT_ATMO_ENV_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { idc=13007; @@ -1257,144 +1257,144 @@ class ATragMX_Display { class TEXT_ATMO_ENV_DATA_CALC_METHOD: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=13011; style=64; - w=0.14; - h=0.07; - x=0.550*safezoneW+safezoneX+0.235; - y=0.265*safezoneH+safezoneY+0.29; + w="0.14"; + h="0.07"; + x="0.550*safezoneW+safezoneX+0.235"; + y="0.265*safezoneH+safezoneY+0.29"; text="Calc Method"; }; class TEXT_TARGET_DATA_LATITUDE: TEXT_BORE_HEIGHT { idc=14000; - w=0.22; - y=0.265*safezoneH+safezoneY+0.28; + w="0.22"; + y="0.265*safezoneH+safezoneY+0.28"; text="Latitude"; }; class TEXT_TARGET_DATA_LATITUDE_INPUT: ATragMX_RscEdit { idc=140000; - w=0.06; - x=0.550*safezoneW+safezoneX+0.335; - y=0.265*safezoneH+safezoneY+0.28; + w="0.06"; + x="0.550*safezoneW+safezoneX+0.335"; + y="0.265*safezoneH+safezoneY+0.28"; }; class TEXT_TARGET_DATA_DIR_OF_FIRE: TEXT_TARGET_DATA_LATITUDE { idc=14001; - y=0.265*safezoneH+safezoneY+0.320; + y="0.265*safezoneH+safezoneY+0.320"; text="Dir of Fire (deg from N)"; }; class TEXT_TARGET_DATA_DIR_OF_FIRE_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140010; - y=0.265*safezoneH+safezoneY+0.320; + y="0.265*safezoneH+safezoneY+0.320"; }; class TEXT_TARGET_DATA_WIND_SPEED: TEXT_TARGET_DATA_LATITUDE { idc=14002; - w=1.2; - y=0.265*safezoneH+safezoneY+0.360; + w="1.2"; + y="0.265*safezoneH+safezoneY+0.360"; text="Wind Speed (m/s)"; }; class TEXT_TARGET_DATA_WIND_SPEED_1: TEXT_TARGET_DATA_LATITUDE { idc=141020; colorText[]={0,0,0,0.6}; - w=0.05; - h=0.03; - sizeEx=0.025; - x=0.550*safezoneW+safezoneX+0.270; - y=0.265*safezoneH+safezoneY+0.357; + w="0.05"; + h="0.03"; + sizeEx="0.025"; + x="0.550*safezoneW+safezoneX+0.270"; + y="0.265*safezoneH+safezoneY+0.357"; text="1"; }; class TEXT_TARGET_DATA_WIND_SPEED_INPUT_1: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140020; - w=0.045; - x=0.550*safezoneW+safezoneX+0.290; - y=0.265*safezoneH+safezoneY+0.360; + w="0.045"; + x="0.550*safezoneW+safezoneX+0.290"; + y="0.265*safezoneH+safezoneY+0.360"; }; class TEXT_TARGET_DATA_WIND_SPEED_2: TEXT_TARGET_DATA_WIND_SPEED_1 { idc=141021; - x=0.550*safezoneW+safezoneX+0.330; + x="0.550*safezoneW+safezoneX+0.330"; text="2"; }; class TEXT_TARGET_DATA_WIND_SPEED_INPUT_2: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140021; - w=0.045; - x=0.550*safezoneW+safezoneX+0.350; - y=0.265*safezoneH+safezoneY+0.360; + w="0.045"; + x="0.550*safezoneW+safezoneX+0.350"; + y="0.265*safezoneH+safezoneY+0.360"; }; class TEXT_TARGET_DATA_WIND_DIRECTION: TEXT_TARGET_DATA_LATITUDE { idc=14003; - y=0.265*safezoneH+safezoneY+0.400; + y="0.265*safezoneH+safezoneY+0.400"; text="Wind Direction (clock)"; }; class TEXT_TARGET_DATA_WIND_DIRECTION_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140030; - y=0.265*safezoneH+safezoneY+0.400; + y="0.265*safezoneH+safezoneY+0.400"; }; class TEXT_TARGET_DATA_INCLINATION_ANGLE: TEXT_TARGET_DATA_LATITUDE { idc=14004; - w=1.2; - y=0.265*safezoneH+safezoneY+0.440; + w="1.2"; + y="0.265*safezoneH+safezoneY+0.440"; text="Inclination Angle"; }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE: TEXT_TARGET_DATA_LATITUDE { idc=141041; colorText[]={0,0,0,0.6}; - w=0.05; - h=0.03; - sizeEx=0.025; - x=0.550*safezoneW+safezoneX+0.270; - y=0.265*safezoneH+safezoneY+0.437; + w="0.05"; + h="0.03"; + sizeEx="0.025"; + x="0.550*safezoneW+safezoneX+0.270"; + y="0.265*safezoneH+safezoneY+0.437"; text="c"; }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_COSINE: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140041; - w=0.045; - x=0.550*safezoneW+safezoneX+0.290; - y=0.265*safezoneH+safezoneY+0.440; + w="0.045"; + x="0.550*safezoneW+safezoneX+0.290"; + y="0.265*safezoneH+safezoneY+0.440"; onKeyUp=QUOTE(if (_this select 1 == 28) then {0 call FUNC(update_inclination_angle)}); }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_DEGREE: TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE { idc=141040; - x=0.550*safezoneW+safezoneX+0.330; + x="0.550*safezoneW+safezoneX+0.330"; text="d"; }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_DEGREE: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140040; - w=0.045; - x=0.550*safezoneW+safezoneX+0.350; - y=0.265*safezoneH+safezoneY+0.440; + w="0.045"; + x="0.550*safezoneW+safezoneX+0.350"; + y="0.265*safezoneH+safezoneY+0.440"; onKeyUp=QUOTE(if (_this select 1 == 28) then {1 call FUNC(update_inclination_angle)}); }; class TEXT_TARGET_DATA_TARGET_SPEED: TEXT_TARGET_DATA_LATITUDE { idc=14005; - y=0.265*safezoneH+safezoneY+0.480; + y="0.265*safezoneH+safezoneY+0.480"; text="Target Speed (m/s)"; }; class TEXT_TARGET_DATA_TARGET_SPEED_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140050; - y=0.265*safezoneH+safezoneY+0.480; + y="0.265*safezoneH+safezoneY+0.480"; }; class TEXT_TARGET_DATA_TARGET_SPEED_DIRECTION: ATragMX_RscButton { idc=140051; colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; - w=0.0231; - x=0.550*safezoneW+safezoneX+0.305; - y=0.265*safezoneH+safezoneY+0.480; + w="0.0231"; + x="0.550*safezoneW+safezoneX+0.305"; + y="0.265*safezoneH+safezoneY+0.480"; text=">"; action=QUOTE(call FUNC(cycle_target_speed_direction)); }; class TEXT_TARGET_DATA_TARGET_RANGE: TEXT_TARGET_DATA_LATITUDE { idc=14006; - y=0.265*safezoneH+safezoneY+0.520; + y="0.265*safezoneH+safezoneY+0.520"; text="Target Range (meters)"; }; class TEXT_TARGET_DATA_TARGET_RANGE_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140060; - y=0.265*safezoneH+safezoneY+0.520; + y="0.265*safezoneH+safezoneY+0.520"; }; class TEXT_TARGET_DATA_TARGET_RANGE_METER_INDICATOR: TEXT_TARGET_DATA_LATITUDE { idc=140061; - w=0.05; - x=0.550*safezoneW+safezoneX+0.315; - y=0.265*safezoneH+safezoneY+0.520; + w="0.05"; + x="0.550*safezoneW+safezoneX+0.315"; + y="0.265*safezoneH+safezoneY+0.520"; text=""; }; class TEXT_TARGET_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { @@ -1415,176 +1415,176 @@ class ATragMX_Display { class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=15000; style=64; - w=0.25; - h=0.07; - x=0.550*safezoneW+safezoneX+0.13; - y=0.265*safezoneH+safezoneY+0.32; + w="0.25"; + h="0.07"; + x="0.550*safezoneW+safezoneX+0.13"; + y="0.265*safezoneH+safezoneY+0.32"; text="Show result in"; }; class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1: TEXT_TARGET_A { idc=15001; - w=0.04; - x=0.550*safezoneW+safezoneX+0.14; - y=0.265*safezoneH+safezoneY+0.35; + w="0.04"; + x="0.550*safezoneW+safezoneX+0.14"; + y="0.265*safezoneH+safezoneY+0.35"; text="1"; action=QUOTE(GVAR(currentScopeClickNumberTemp) = 1; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_2: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { idc=15002; - x=0.550*safezoneW+safezoneX+0.18; + x="0.550*safezoneW+safezoneX+0.18"; text="2"; action=QUOTE(GVAR(currentScopeClickNumberTemp) = 2; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_3: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { idc=15003; - x=0.550*safezoneW+safezoneX+0.22; + x="0.550*safezoneW+safezoneX+0.22"; text="3"; action=QUOTE(GVAR(currentScopeClickNumberTemp) = 3; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_4: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { idc=15004; - x=0.550*safezoneW+safezoneX+0.26; + x="0.550*safezoneW+safezoneX+0.26"; text="4"; action=QUOTE(GVAR(currentScopeClickNumberTemp) = 4; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_8: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { idc=15005; - x=0.550*safezoneW+safezoneX+0.30; + x="0.550*safezoneW+safezoneX+0.30"; text="8"; action=QUOTE(GVAR(currentScopeClickNumberTemp) = 8; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_10: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { idc=15006; - x=0.550*safezoneW+safezoneX+0.34; + x="0.550*safezoneW+safezoneX+0.34"; text="10"; action=QUOTE(GVAR(currentScopeClickNumberTemp) = 10; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_CLICKS_PER: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=15007; style=64; - w=0.25; - h=0.07; - x=0.550*safezoneW+safezoneX+0.13; - y=0.265*safezoneH+safezoneY+0.42; + w="0.25"; + h="0.07"; + x="0.550*safezoneW+safezoneX+0.13"; + y="0.265*safezoneH+safezoneY+0.42"; text="Clicks per"; }; class TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA: TEXT_TARGET_A { idc=15008; - w=0.05; - x=0.550*safezoneW+safezoneX+0.15; - y=0.265*safezoneH+safezoneY+0.45; + w="0.05"; + x="0.550*safezoneW+safezoneX+0.15"; + y="0.265*safezoneH+safezoneY+0.45"; text="TMOA"; action=QUOTE(GVAR(currentScopeClickUnitTemp) = 0; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_CLICKS_PER_SMOA: TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA { idc=15009; - x=0.550*safezoneW+safezoneX+0.23; + x="0.550*safezoneW+safezoneX+0.23"; text="SMOA"; action=QUOTE(GVAR(currentScopeClickUnitTemp) = 1; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_CLICKS_PER_MILS: TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA { idc=15010; - x=0.550*safezoneW+safezoneX+0.31; + x="0.550*safezoneW+safezoneX+0.31"; text="MILS"; action=QUOTE(GVAR(currentScopeClickUnitTemp) = 2; call FUNC(update_solution_setup)); }; class TEXT_SOLUTION_SETUP_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { idc=15011; - x=0.550*safezoneW+safezoneX+0.18; - y=0.265*safezoneH+safezoneY+0.55; + x="0.550*safezoneW+safezoneX+0.18"; + y="0.265*safezoneH+safezoneY+0.55"; action=QUOTE(1 call FUNC(toggle_solution_setup)); }; class TEXT_SOLUTION_SETUP_CANCEL: TEXT_TARGET_SPEED_ASSIST_CANCEL { idc=15012; - x=0.550*safezoneW+safezoneX+0.26; - y=0.265*safezoneH+safezoneY+0.55; + x="0.550*safezoneW+safezoneX+0.26"; + y="0.265*safezoneH+safezoneY+0.55"; action=QUOTE(0 call FUNC(toggle_solution_setup)); }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE: TEXT_BORE_HEIGHT { idc=16000; - w=0.22; - y=0.265*safezoneH+safezoneY+0.25; - sizeEx=0.022; + w="0.22"; + y="0.265*safezoneH+safezoneY+0.25"; + sizeEx="0.022"; text="Temperature"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE { idc=16001; - x=0.550*safezoneW+safezoneX+0.215; - sizeEx=0.022; + x="0.550*safezoneW+safezoneX+0.215"; + sizeEx="0.022"; text="Muzzle velocity"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1: ATragMX_RscEdit { idc=160021; - w=0.082; - h=0.035; - x=0.550*safezoneW+safezoneX+0.128; - y=0.265*safezoneH+safezoneY+0.29; + w="0.082"; + h="0.035"; + x="0.550*safezoneW+safezoneX+0.128"; + y="0.265*safezoneH+safezoneY+0.29"; text="0"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_2: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160022; - y=0.265*safezoneH+safezoneY+0.325; + y="0.265*safezoneH+safezoneY+0.325"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_3: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160023; - y=0.265*safezoneH+safezoneY+0.360; + y="0.265*safezoneH+safezoneY+0.360"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_4: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160024; - y=0.265*safezoneH+safezoneY+0.395; + y="0.265*safezoneH+safezoneY+0.395"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_5: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160025; - y=0.265*safezoneH+safezoneY+0.430; + y="0.265*safezoneH+safezoneY+0.430"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_6: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160026; - y=0.265*safezoneH+safezoneY+0.465; + y="0.265*safezoneH+safezoneY+0.465"; }; class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_7: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160027; - y=0.265*safezoneH+safezoneY+0.500; + y="0.265*safezoneH+safezoneY+0.500"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_1: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { idc=160031; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_2: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_2 { idc=160032; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_3: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_3 { idc=160033; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_4: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_4 { idc=160034; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_5: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_5 { idc=160035; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_6: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_6 { idc=160036; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_7: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_7 { idc=160037; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_MUZZLE_VELOCITY_DATA_CLEAR: TEXT_TARGET_DATA_NEXT { idc=16004; style=ST_CENTER; - h=0.035; - y=0.265*safezoneH+safezoneY+0.3625; + h="0.035"; + y="0.265*safezoneH+safezoneY+0.3625"; text="Clear"; action=QUOTE(call FUNC(clear_muzzle_velocity_data)); }; class TEXT_MUZZLE_VELOCITY_DATA_QUESTIONMARK: TEXT_MUZZLE_VELOCITY_DATA_CLEAR { idc=16005; - y=0.265*safezoneH+safezoneY+0.430; + y="0.265*safezoneH+safezoneY+0.430"; text="?"; action=""; }; @@ -1605,91 +1605,91 @@ class ATragMX_Display { class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE: TEXT_BORE_HEIGHT { idc=17000; - w=0.22; - x=0.550*safezoneW+safezoneX+0.15; - y=0.265*safezoneH+safezoneY+0.25; - sizeEx=0.022; + w="0.22"; + x="0.550*safezoneW+safezoneX+0.15"; + y="0.265*safezoneH+safezoneY+0.25"; + sizeEx="0.022"; text="Meters"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE { idc=17001; - x=0.550*safezoneW+safezoneX+0.235; - sizeEx=0.022; + x="0.550*safezoneW+safezoneX+0.235"; + sizeEx="0.022"; text="BC-Coef"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1: ATragMX_RscEdit { idc=170021; - w=0.082; - h=0.035; - x=0.550*safezoneW+safezoneX+0.128; - y=0.265*safezoneH+safezoneY+0.29; + w="0.082"; + h="0.035"; + x="0.550*safezoneW+safezoneX+0.128"; + y="0.265*safezoneH+safezoneY+0.29"; text="0"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_2: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170022; - y=0.265*safezoneH+safezoneY+0.325; + y="0.265*safezoneH+safezoneY+0.325"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_3: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170023; - y=0.265*safezoneH+safezoneY+0.360; + y="0.265*safezoneH+safezoneY+0.360"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_4: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170024; - y=0.265*safezoneH+safezoneY+0.395; + y="0.265*safezoneH+safezoneY+0.395"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_5: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170025; - y=0.265*safezoneH+safezoneY+0.430; + y="0.265*safezoneH+safezoneY+0.430"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_6: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170026; - y=0.265*safezoneH+safezoneY+0.465; + y="0.265*safezoneH+safezoneY+0.465"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_7: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170027; - y=0.265*safezoneH+safezoneY+0.500; + y="0.265*safezoneH+safezoneY+0.500"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_1: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { idc=170031; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_2: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_2 { idc=170032; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_3: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_3 { idc=170033; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_4: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_4 { idc=170034; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_5: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_5 { idc=170035; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_6: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_6 { idc=170036; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_7: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_7 { idc=170037; - x=0.550*safezoneW+safezoneX+0.225; + x="0.550*safezoneW+safezoneX+0.225"; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_QUESTIONMARK: TEXT_TARGET_DATA_NEXT { idc=17004; style=ST_CENTER; - w=0.04; - h=0.035; - y=0.265*safezoneH+safezoneY+0.35; + w="0.04"; + h="0.035"; + y="0.265*safezoneH+safezoneY+0.35"; text="?"; action=""; }; class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_CLEAR: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_QUESTIONMARK { idc=17005; - w=0.07; - y=0.265*safezoneH+safezoneY+0.4175; + w="0.07"; + y="0.265*safezoneH+safezoneY+0.4175"; text="Clear"; action=QUOTE(call FUNC(clear_c1_ballistic_coefficient_data)); }; @@ -1711,130 +1711,130 @@ class ATragMX_Display { class TEXT_TRUING_DROP_ZERO_RANGE: ATragMX_RscText { idc=18000; style=ST_LEFT; - x=0.550*safezoneW+safezoneX+0.115; - y=0.265*safezoneH+safezoneY+0.220; - w=0.135; - h=0.03; - sizeEx=0.025; + x="0.550*safezoneW+safezoneX+0.115"; + y="0.265*safezoneH+safezoneY+0.220"; + w="0.135"; + h="0.03"; + sizeEx="0.025"; text="ZR=100meters"; }; class TEXT_TRUING_DROP_DROP_UNIT: TEXT_TRUING_DROP_ZERO_RANGE { idc=18001; style=ST_LEFT; - x=0.550*safezoneW+safezoneX+0.25; + x="0.550*safezoneW+safezoneX+0.25"; text="Drop=mil"; }; class TEXT_TRUING_DROP_TARGET_RANGE: TEXT_TRUING_DROP_ZERO_RANGE { idc=18002; - y=0.265*safezoneH+safezoneY+0.35; - sizeEx=0.027; + y="0.265*safezoneH+safezoneY+0.35"; + sizeEx="0.027"; text="Target Range"; }; class TEXT_TRUING_DROP_DROP: TEXT_TRUING_DROP_TARGET_RANGE { idc=18003; - w=0.07; - y=0.265*safezoneH+safezoneY+0.40; + w="0.07"; + y="0.265*safezoneH+safezoneY+0.40"; text="Drop"; }; class TEXT_TRUING_DROP_MUZZLE_VELOCITY: TEXT_TRUING_DROP_DROP { idc=18004; - y=0.265*safezoneH+safezoneY+0.50; + y="0.265*safezoneH+safezoneY+0.50"; text="MV"; }; class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT: TEXT_TRUING_DROP_DROP { idc=18005; - y=0.265*safezoneH+safezoneY+0.55; + y="0.265*safezoneH+safezoneY+0.55"; text="C1"; }; class TEXT_TRUING_DROP_DROP_OUTPUT: ATragMX_RscEdit { idc=18006; - style=ST_WITH_RECT+ST_RIGHT; + style=QUOTE(ST_WITH_RECT+ST_RIGHT); colorBackground[]={0.15,0.21,0.23,0.3}; colorDisabled[]={0,0,0,1}; - w=0.06; - y=0.265*safezoneH+safezoneY+0.40; - x=0.550*safezoneW+safezoneX+0.17; + w="0.06"; + y="0.265*safezoneH+safezoneY+0.40"; + x="0.550*safezoneW+safezoneX+0.17"; text=""; }; class TEXT_TRUING_DROP_MUZZLE_VELOCITY_OUTPUT: TEXT_TRUING_DROP_DROP_OUTPUT { idc=18007; - y=0.265*safezoneH+safezoneY+0.50; + y="0.265*safezoneH+safezoneY+0.50"; text=""; }; class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT_OUTPUT: TEXT_TRUING_DROP_DROP_OUTPUT { idc=18008; - y=0.265*safezoneH+safezoneY+0.55; + y="0.265*safezoneH+safezoneY+0.55"; text=""; }; class TEXT_TRUING_DROP_SUPER: TEXT_TARGET_A { idc=18009; - w=0.06; - x=0.550*safezoneW+safezoneX+0.25; - y=0.265*safezoneH+safezoneY+0.30; + w="0.06"; + x="0.550*safezoneW+safezoneX+0.25"; + y="0.265*safezoneH+safezoneY+0.30"; text="SUPER"; action=QUOTE(GVAR(truingDropMode) = 0; call FUNC(update_truing_drop_selection)); }; class TEXT_TRUING_DROP_SUB: TEXT_TRUING_DROP_SUPER { idc=18010; - x=0.550*safezoneW+safezoneX+0.32; + x="0.550*safezoneW+safezoneX+0.32"; text="SUB"; action=QUOTE(GVAR(truingDropMode) = 1; call FUNC(update_truing_drop_selection)); }; class TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT: ATragMX_RscEdit { idc=18011; - style=ST_WITH_RECT+ST_RIGHT; + style=QUOTE(ST_WITH_RECT+ST_RIGHT); colorDisabled[]={0,0,0,0.6}; - w=0.06; - x=0.550*safezoneW+safezoneX+0.25; - y=0.265*safezoneH+safezoneY+0.35; + w="0.06"; + x="0.550*safezoneW+safezoneX+0.25"; + y="0.265*safezoneH+safezoneY+0.35"; }; class TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT { idc=18012; - x=0.550*safezoneW+safezoneX+0.32; + x="0.550*safezoneW+safezoneX+0.32"; }; class TEXT_TRUING_DROP_DROP_SUPER_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT { idc=18013; - y=0.265*safezoneH+safezoneY+0.40; + y="0.265*safezoneH+safezoneY+0.40"; }; class TEXT_TRUING_DROP_DROP_SUB_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT { idc=18014; - y=0.265*safezoneH+safezoneY+0.40; + y="0.265*safezoneH+safezoneY+0.40"; }; class TEXT_TRUING_DROP_CALC: TEXT_GUN_LIST { idc=18015; style=ST_CENTER; - w=0.11; - x=0.550*safezoneW+safezoneX+0.26; - y=0.265*safezoneH+safezoneY+0.45; + w="0.11"; + x="0.550*safezoneW+safezoneX+0.26"; + y="0.265*safezoneH+safezoneY+0.45"; text="Calc"; action=QUOTE(true call FUNC(calculate_truing_drop)); }; class TEXT_TRUING_DROP_MV_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT { idc=18016; - y=0.265*safezoneH+safezoneY+0.50; + y="0.265*safezoneH+safezoneY+0.50"; }; class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT { idc=18017; - y=0.265*safezoneH+safezoneY+0.55; + y="0.265*safezoneH+safezoneY+0.55"; }; class TEXT_TRUING_DROP_ACCEPT: TEXT_GUN_LIST { idc=18018; - w=0.085; - h=0.04; - x=0.550*safezoneW+safezoneX+0.125; - y=0.265*safezoneH+safezoneY+0.60; + w="0.085"; + h="0.04"; + x="0.550*safezoneW+safezoneX+0.125"; + y="0.265*safezoneH+safezoneY+0.60"; text="Accept"; action=QUOTE(1 call FUNC(toggle_truing_drop)); }; class TEXT_TRUING_DROP_CANCEL: TEXT_TRUING_DROP_ACCEPT { idc=18019; - x=0.550*safezoneW+safezoneX+0.210; + x="0.550*safezoneW+safezoneX+0.210"; text="Cancel"; action=QUOTE(0 call FUNC(toggle_truing_drop)); }; class TEXT_TRUING_DROP_RESTORE: TEXT_TRUING_DROP_CANCEL { idc=18020; - x=0.550*safezoneW+safezoneX+0.29525; + x="0.550*safezoneW+safezoneX+0.29525"; text="Restore"; action=QUOTE(true call FUNC(restore_truing_drop)); }; diff --git a/addons/atragmx/functions/fnc_add_new_gun.sqf b/addons/atragmx/functions/fnc_add_new_gun.sqf index 94415852f9..7ef1367b53 100644 --- a/addons/atragmx/functions/fnc_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_add_new_gun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Adds a new (default) gun profile to the profileNamespace diff --git a/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf b/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf index 1f06d79988..9fe18a258d 100644 --- a/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf +++ b/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates distance at which the bullet velocity drops below the threshold velocity diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index 473e49a8a1..23fef6d414 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the range card output based on the current data set diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 3c854499d9..7efc25ebbf 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the fireing solution diff --git a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf index 51f00cdaaf..dc9c62c3fc 100644 --- a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the target range and updates the output fields diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 775467f5de..7fd70ca09a 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the fireing solution and updates the result input/output fields diff --git a/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf index 1e28a82339..69af9eba16 100644 --- a/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the target speed and updates the output fields diff --git a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf index e3dfe5b6a4..5191848d05 100644 --- a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf +++ b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the truing drop and updates the output fields diff --git a/addons/atragmx/functions/fnc_can_show.sqf b/addons/atragmx/functions/fnc_can_show.sqf index fff2a93702..ffa538f542 100644 --- a/addons/atragmx/functions/fnc_can_show.sqf +++ b/addons/atragmx/functions/fnc_can_show.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Tests if the ATragMX dialog can be shown diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index 9b3863420b..2c0f3e33bc 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Selects a new gun profile and updates the gun column and the result input/output fields diff --git a/addons/atragmx/functions/fnc_change_target_slot.sqf b/addons/atragmx/functions/fnc_change_target_slot.sqf index 71118748d9..e2a0479998 100644 --- a/addons/atragmx/functions/fnc_change_target_slot.sqf +++ b/addons/atragmx/functions/fnc_change_target_slot.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Selects a target slot (A, B, C or D) diff --git a/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf index 22aa0ac3f8..477b9760fe 100644 --- a/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Clears the c1 ballistic coefficient data fields diff --git a/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf index 4e686202e1..7c814c7bb4 100644 --- a/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf +++ b/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Clears the muzzle velocity data fields diff --git a/addons/atragmx/functions/fnc_clear_user_data.sqf b/addons/atragmx/functions/fnc_clear_user_data.sqf index e166b56880..850b10aece 100644 --- a/addons/atragmx/functions/fnc_clear_user_data.sqf +++ b/addons/atragmx/functions/fnc_clear_user_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Removes all user data from the profileNamespace diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 6930bf6786..e1655abfb0 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Creates the ATragMX dialog diff --git a/addons/atragmx/functions/fnc_cycle_gun_list.sqf b/addons/atragmx/functions/fnc_cycle_gun_list.sqf index 5487ac71cb..dab0b174e9 100644 --- a/addons/atragmx/functions/fnc_cycle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_cycle_gun_list.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the gun list diff --git a/addons/atragmx/functions/fnc_cycle_image_size_units.sqf b/addons/atragmx/functions/fnc_cycle_image_size_units.sqf index 70b35ec58c..3fc0de9664 100644 --- a/addons/atragmx/functions/fnc_cycle_image_size_units.sqf +++ b/addons/atragmx/functions/fnc_cycle_image_size_units.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the image size units diff --git a/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf b/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf index 65361b9860..26056817a2 100644 --- a/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf +++ b/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the num ticks units diff --git a/addons/atragmx/functions/fnc_cycle_range_card_columns.sqf b/addons/atragmx/functions/fnc_cycle_range_card_columns.sqf index b9432996cb..deed82901a 100644 --- a/addons/atragmx/functions/fnc_cycle_range_card_columns.sqf +++ b/addons/atragmx/functions/fnc_cycle_range_card_columns.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the range card columns diff --git a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf index 74c5a37dd4..74b3e81daa 100644 --- a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the scope units diff --git a/addons/atragmx/functions/fnc_cycle_target_size_units.sqf b/addons/atragmx/functions/fnc_cycle_target_size_units.sqf index 36165ddae5..f53932cbfb 100644 --- a/addons/atragmx/functions/fnc_cycle_target_size_units.sqf +++ b/addons/atragmx/functions/fnc_cycle_target_size_units.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the target size units diff --git a/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf b/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf index 7a2fade7e6..522423ea23 100644 --- a/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf +++ b/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Cycles through the target directions left/right diff --git a/addons/atragmx/functions/fnc_delete_gun.sqf b/addons/atragmx/functions/fnc_delete_gun.sqf index b5c209717d..43b2618e49 100644 --- a/addons/atragmx/functions/fnc_delete_gun.sqf +++ b/addons/atragmx/functions/fnc_delete_gun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Deletes the currently selected gun profile from the profileNamespace diff --git a/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf b/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf index bcbd2b87c5..0927e6a73b 100644 --- a/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf +++ b/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Evalutes input from the option menu diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 2dcd34d493..5c3cedc88c 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Inits all global variables with the default values diff --git a/addons/atragmx/functions/fnc_initGunList.sqf b/addons/atragmx/functions/fnc_initGunList.sqf index faf655c595..783a68202a 100644 --- a/addons/atragmx/functions/fnc_initGunList.sqf +++ b/addons/atragmx/functions/fnc_initGunList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Inits the gun list from user profile @@ -32,7 +32,8 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == if (_resetGunList) then { WARNING("Reseting Profile Gunlist"); // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation, Persistent - GVAR(gunList) = [["12.7x108mm" , 812, 100, 0.0958029, -0.00063800, 8.89, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0946366, -0.00065098, 8.89, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,801],[0,808],[10,815],[15,820],[25,834],[30,843],[35,854]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x108mm APDS" , 1060, 100, 0.0766151, -0.00036000, 8.89, 0, 2, 10, 120, 0, 0, 27.95, 11.08, 38.10, 1.052, 1, "ICAO" , [[-15,1041],[0,1048],[10,1055],[15,1060],[25,1074],[30,1083],[35,1094]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["12.7x99mm AMAX" , 852, 100, 0.0907214, -0.00037397, 8.89, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["12.7x99mm" , 892, 100, 0.0879633, -0.00058679, 8.89, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], diff --git a/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf index 69d23b4e43..c4b66d319d 100644 --- a/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Inserts entry in the c1 ballistic coefficient vs. distance interpolation table diff --git a/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf index 0e508e37e1..be646af89b 100644 --- a/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf +++ b/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Inserts entry in the muzzle velocity vs. temperature interpolation table diff --git a/addons/atragmx/functions/fnc_lookup_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_lookup_c1_ballistic_coefficient.sqf index 3d0b348874..16881c93b6 100644 --- a/addons/atragmx/functions/fnc_lookup_c1_ballistic_coefficient.sqf +++ b/addons/atragmx/functions/fnc_lookup_c1_ballistic_coefficient.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Lookup the correct C1 ballistic coefficient in the c1 ballistic coefficient vs. distance interpolation table diff --git a/addons/atragmx/functions/fnc_on_close_dialog.sqf b/addons/atragmx/functions/fnc_on_close_dialog.sqf index d9ebf1cb00..e1809d1eb4 100644 --- a/addons/atragmx/functions/fnc_on_close_dialog.sqf +++ b/addons/atragmx/functions/fnc_on_close_dialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * On close Dialog diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index d03b8bd186..1c3ea3398a 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Parses all input fields in the gun-, atmosphere- and target column, the result input fields and the muzzle velocity data input fields diff --git a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf index 3ae566557b..31451c7ff8 100644 --- a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf +++ b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Reads gun list entries from the config and appends them to the gun list diff --git a/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf index 273d73a3e3..327adce1b3 100644 --- a/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf +++ b/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Recalculates the c1 ballistic coefficient based on the current target range diff --git a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf index c46cd9ab16..f7e4709cc1 100644 --- a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf +++ b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Recalculates the muzzle velocity based on the muzzle velocity vs. temperature interpolation input diff --git a/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf b/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf index 4a847123df..5beea4cd38 100644 --- a/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf +++ b/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Resets the relative click memory and updates the result input/output fields diff --git a/addons/atragmx/functions/fnc_restore_atmo_default.sqf b/addons/atragmx/functions/fnc_restore_atmo_default.sqf index 9b03c337b2..62b6faa8b5 100644 --- a/addons/atragmx/functions/fnc_restore_atmo_default.sqf +++ b/addons/atragmx/functions/fnc_restore_atmo_default.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Restores the atmospheric data defaults diff --git a/addons/atragmx/functions/fnc_restore_truing_drop.sqf b/addons/atragmx/functions/fnc_restore_truing_drop.sqf index 301c94f7a8..ca8f51882a 100644 --- a/addons/atragmx/functions/fnc_restore_truing_drop.sqf +++ b/addons/atragmx/functions/fnc_restore_truing_drop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Restores the truing drop defaults diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index beb2c50c4d..c72a154acd 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Reads user data from profileNamespace diff --git a/addons/atragmx/functions/fnc_save_gun.sqf b/addons/atragmx/functions/fnc_save_gun.sqf index 2560dbd42b..0780958041 100644 --- a/addons/atragmx/functions/fnc_save_gun.sqf +++ b/addons/atragmx/functions/fnc_save_gun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Saves the currently select gun profile into the profileNamespace diff --git a/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf index 95ac59b705..0a41e8f3f8 100644 --- a/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shifts all c1 ballistic coefficient entries in the c1 ballistic coefficient vs. distance interpolation table diff --git a/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf index 4d4e4d2b22..ae588c623d 100644 --- a/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf +++ b/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shifts all muzzle velocity entries in the muzzle velocity vs. temperature interpolation table diff --git a/addons/atragmx/functions/fnc_show_add_new_gun.sqf b/addons/atragmx/functions/fnc_show_add_new_gun.sqf index a00860490b..11fad2eaa3 100644 --- a/addons/atragmx/functions/fnc_show_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_show_add_new_gun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides add new gun controls diff --git a/addons/atragmx/functions/fnc_show_atmo_env_data.sqf b/addons/atragmx/functions/fnc_show_atmo_env_data.sqf index b07843e18a..4c9b58402d 100644 --- a/addons/atragmx/functions/fnc_show_atmo_env_data.sqf +++ b/addons/atragmx/functions/fnc_show_atmo_env_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the atmosphere and environmental data controls diff --git a/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf index 34f598ac6c..f482f1e6e3 100644 --- a/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the c1 ballistic coefficient data controls diff --git a/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf index 108108a14c..854784ddaf 100644 --- a/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the gun ammo data controls diff --git a/addons/atragmx/functions/fnc_show_gun_list.sqf b/addons/atragmx/functions/fnc_show_gun_list.sqf index 714e9a0d12..7c9aacadb9 100644 --- a/addons/atragmx/functions/fnc_show_gun_list.sqf +++ b/addons/atragmx/functions/fnc_show_gun_list.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the gun list controls diff --git a/addons/atragmx/functions/fnc_show_main_page.sqf b/addons/atragmx/functions/fnc_show_main_page.sqf index 7b12af4439..048282f99c 100644 --- a/addons/atragmx/functions/fnc_show_main_page.sqf +++ b/addons/atragmx/functions/fnc_show_main_page.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the main menu controls diff --git a/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf index e12263d36f..b4a195f183 100644 --- a/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf +++ b/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the muzzle velocity data controls diff --git a/addons/atragmx/functions/fnc_show_range_card.sqf b/addons/atragmx/functions/fnc_show_range_card.sqf index 02f65164bb..98052ce760 100644 --- a/addons/atragmx/functions/fnc_show_range_card.sqf +++ b/addons/atragmx/functions/fnc_show_range_card.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the range card controls diff --git a/addons/atragmx/functions/fnc_show_range_card_setup.sqf b/addons/atragmx/functions/fnc_show_range_card_setup.sqf index 183e115b1b..15558ceb98 100644 --- a/addons/atragmx/functions/fnc_show_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_show_range_card_setup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the range card setup controls diff --git a/addons/atragmx/functions/fnc_show_solution_setup.sqf b/addons/atragmx/functions/fnc_show_solution_setup.sqf index 4eafd38a31..e7846be426 100644 --- a/addons/atragmx/functions/fnc_show_solution_setup.sqf +++ b/addons/atragmx/functions/fnc_show_solution_setup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the solution setup controls diff --git a/addons/atragmx/functions/fnc_show_target_data.sqf b/addons/atragmx/functions/fnc_show_target_data.sqf index 6987047cbf..7d8329ba2a 100644 --- a/addons/atragmx/functions/fnc_show_target_data.sqf +++ b/addons/atragmx/functions/fnc_show_target_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the target data controls diff --git a/addons/atragmx/functions/fnc_show_target_range_assist.sqf b/addons/atragmx/functions/fnc_show_target_range_assist.sqf index 89453c9134..83516ef5c6 100644 --- a/addons/atragmx/functions/fnc_show_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_range_assist.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the target range assist controls diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf index 267c3676b6..3efa6ed6d4 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the target speed assist controls diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf index fca074547f..b0a2b9b0c2 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the target speed assist timer controls diff --git a/addons/atragmx/functions/fnc_show_truing_drop.sqf b/addons/atragmx/functions/fnc_show_truing_drop.sqf index ca69346c49..5e7f60f4d4 100644 --- a/addons/atragmx/functions/fnc_show_truing_drop.sqf +++ b/addons/atragmx/functions/fnc_show_truing_drop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows/Hides the truing drop controls diff --git a/addons/atragmx/functions/fnc_sord.sqf b/addons/atragmx/functions/fnc_sord.sqf index 327db0f117..f50e1042c3 100644 --- a/addons/atragmx/functions/fnc_sord.sqf +++ b/addons/atragmx/functions/fnc_sord.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Handles incoming data packets from the Vectronix Vector LRF diff --git a/addons/atragmx/functions/fnc_store_gun_list.sqf b/addons/atragmx/functions/fnc_store_gun_list.sqf index 14fb0f8350..ff007a8c9f 100644 --- a/addons/atragmx/functions/fnc_store_gun_list.sqf +++ b/addons/atragmx/functions/fnc_store_gun_list.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Saves the persistent gun list entries into profileNamespace diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 09b710e1d4..d40652c5fb 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Saves user data into profileNamespace diff --git a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf index 69be94dd8f..b34dd666f2 100644 --- a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows and starts the target speed assist timer diff --git a/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf b/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf index 6f2fc11e27..a7ce8ad93c 100644 --- a/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the atmospheric data screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf index 088658b747..bb581ad6ea 100644 --- a/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the c1 ballistic coefficient data screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_coriolis.sqf b/addons/atragmx/functions/fnc_toggle_coriolis.sqf index aad845ce35..2e5e9fc06e 100644 --- a/addons/atragmx/functions/fnc_toggle_coriolis.sqf +++ b/addons/atragmx/functions/fnc_toggle_coriolis.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the coriolis and spin drift output on/off diff --git a/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf index 1be813fec6..01b324fc9f 100644 --- a/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the gun ammo data screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_gun_list.sqf b/addons/atragmx/functions/fnc_toggle_gun_list.sqf index 291faf98a4..cdd4a631b9 100644 --- a/addons/atragmx/functions/fnc_toggle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_toggle_gun_list.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the gun list screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf index 64aadc62cb..562ef30553 100644 --- a/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the muzzle velocity data screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_option_menu.sqf b/addons/atragmx/functions/fnc_toggle_option_menu.sqf index c39846f466..5762a5741f 100644 --- a/addons/atragmx/functions/fnc_toggle_option_menu.sqf +++ b/addons/atragmx/functions/fnc_toggle_option_menu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the option menu on/off diff --git a/addons/atragmx/functions/fnc_toggle_range_card.sqf b/addons/atragmx/functions/fnc_toggle_range_card.sqf index f34b60c146..7a025e1904 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the range card screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf index fb98cfcb0e..5c499b8b82 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the range card setup screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_solution_setup.sqf b/addons/atragmx/functions/fnc_toggle_solution_setup.sqf index 11c3c0f4bc..8d233b204a 100644 --- a/addons/atragmx/functions/fnc_toggle_solution_setup.sqf +++ b/addons/atragmx/functions/fnc_toggle_solution_setup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the solution setup screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_target_data.sqf b/addons/atragmx/functions/fnc_toggle_target_data.sqf index ecfcab2c41..a012a879c1 100644 --- a/addons/atragmx/functions/fnc_toggle_target_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the target data screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf index ac1934ee3e..1e6c485e99 100644 --- a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the target range assist screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf index 47d14a32d9..009074105e 100644 --- a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the target speed assist screen on/off diff --git a/addons/atragmx/functions/fnc_toggle_truing_drop.sqf b/addons/atragmx/functions/fnc_toggle_truing_drop.sqf index dbacceb52f..2c61b1776b 100644 --- a/addons/atragmx/functions/fnc_toggle_truing_drop.sqf +++ b/addons/atragmx/functions/fnc_toggle_truing_drop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Toggles the truing drop screen on/off diff --git a/addons/atragmx/functions/fnc_trim_gun_name.sqf b/addons/atragmx/functions/fnc_trim_gun_name.sqf index 46f20bede6..77fcbdf1ba 100644 --- a/addons/atragmx/functions/fnc_trim_gun_name.sqf +++ b/addons/atragmx/functions/fnc_trim_gun_name.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Trims the gun name input field diff --git a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf index 8a6046d1d8..84371ca852 100644 --- a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf +++ b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Trues the c1 ballistic coefficient diff --git a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf index cee3af2536..f8fb9e621c 100644 --- a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf +++ b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Trues the muzzle velocity diff --git a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf index 27a1e1510b..340924b5aa 100644 --- a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf +++ b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the atmospheric data fields diff --git a/addons/atragmx/functions/fnc_update_atmo_selection.sqf b/addons/atragmx/functions/fnc_update_atmo_selection.sqf index caa7c206cc..caafe1eed2 100644 --- a/addons/atragmx/functions/fnc_update_atmo_selection.sqf +++ b/addons/atragmx/functions/fnc_update_atmo_selection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the atmospheric data input method diff --git a/addons/atragmx/functions/fnc_update_atmosphere.sqf b/addons/atragmx/functions/fnc_update_atmosphere.sqf index 438dfe04f2..7d52315892 100644 --- a/addons/atragmx/functions/fnc_update_atmosphere.sqf +++ b/addons/atragmx/functions/fnc_update_atmosphere.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all atmosphere column input fields diff --git a/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf index a7a20d31df..4c0c6d7175 100644 --- a/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the c1 ballistic coefficient data fields diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf index 2df4bbe1ee..5a5dab00fa 100644 --- a/addons/atragmx/functions/fnc_update_gun.sqf +++ b/addons/atragmx/functions/fnc_update_gun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all gun column input fields diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf index 3a2c1a8106..59bd014973 100644 --- a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the gun ammo data fields diff --git a/addons/atragmx/functions/fnc_update_inclination_angle.sqf b/addons/atragmx/functions/fnc_update_inclination_angle.sqf index f0150c1cfe..532b3d94e8 100644 --- a/addons/atragmx/functions/fnc_update_inclination_angle.sqf +++ b/addons/atragmx/functions/fnc_update_inclination_angle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the inclination angle input fields diff --git a/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf index 55453ce6e9..23193aa903 100644 --- a/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf +++ b/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the muzzle velocity data fields diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 3af37cf3f6..066bd65174 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the range card listbox content diff --git a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf index ae847d6c13..8ef06914ac 100644 --- a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf +++ b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the relative click memory diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index 21c192549c..4def2f87a6 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the result input and output fields diff --git a/addons/atragmx/functions/fnc_update_scope_unit.sqf b/addons/atragmx/functions/fnc_update_scope_unit.sqf index 05f7f85b93..d1f0e9cf17 100644 --- a/addons/atragmx/functions/fnc_update_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_update_scope_unit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the scope unit fields diff --git a/addons/atragmx/functions/fnc_update_solution_setup.sqf b/addons/atragmx/functions/fnc_update_solution_setup.sqf index 37ea36c069..0c8353cfcb 100644 --- a/addons/atragmx/functions/fnc_update_solution_setup.sqf +++ b/addons/atragmx/functions/fnc_update_solution_setup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all solution setup input fields diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index 72e6e1f208..a87ba9ba54 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all target column input fields diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf index a93dc1347f..92b5df50a0 100644 --- a/addons/atragmx/functions/fnc_update_target_data.sqf +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all target column input fields diff --git a/addons/atragmx/functions/fnc_update_target_selection.sqf b/addons/atragmx/functions/fnc_update_target_selection.sqf index 55f39c80fe..e45d6ef8a2 100644 --- a/addons/atragmx/functions/fnc_update_target_selection.sqf +++ b/addons/atragmx/functions/fnc_update_target_selection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all input fields based on the currently selected target diff --git a/addons/atragmx/functions/fnc_update_truing_drop_data.sqf b/addons/atragmx/functions/fnc_update_truing_drop_data.sqf index d331523432..ad0f0dda0e 100644 --- a/addons/atragmx/functions/fnc_update_truing_drop_data.sqf +++ b/addons/atragmx/functions/fnc_update_truing_drop_data.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the truing drop data fields diff --git a/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf b/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf index f2fffd8fe3..461b4ccf9b 100644 --- a/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf +++ b/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the truing drop input method diff --git a/addons/atragmx/functions/fnc_update_unit_selection.sqf b/addons/atragmx/functions/fnc_update_unit_selection.sqf index ab3edb9256..ce735e773c 100644 --- a/addons/atragmx/functions/fnc_update_unit_selection.sqf +++ b/addons/atragmx/functions/fnc_update_unit_selection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates all input fields based on the currently selected unit diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 4de6370591..023a5a7ee2 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the scope base angle based on the zero range input diff --git a/addons/atragmx/functions/script_component.hpp b/addons/atragmx/functions/script_component.hpp deleted file mode 100644 index 6e49f39695..0000000000 --- a/addons/atragmx/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\atragmx\script_component.hpp" \ No newline at end of file diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index d76ccec087..04f678ec21 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -32,7 +32,7 @@ ATragMX を開く ATragMX 열기 開啟ATragMX - 开启ATragMX + 开启 ATragMX ATragMX'i aç @@ -49,7 +49,7 @@ ATragMX 付きの携行型端末 ATragMX가 달린 PDA 裝有軍用PDA的ATragMX - 装有军用PDA的ATragMX + 装有 ATragMX 的军用 PDA Rugged PDA with ATragMX @@ -66,7 +66,7 @@ ATragMX を開く ATragMX 열기 開啟ATragMX - 开启ATragMX + 开启 ATragMX ATragMX'i aç diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index a6f091a689..e36f2ba316 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: eRazeri, esteldunedain, PabstMirror * Attach an item to the unit diff --git a/addons/attach/functions/fnc_canAttach.sqf b/addons/attach/functions/fnc_canAttach.sqf index 00e7b34e8a..a9277155d9 100644 --- a/addons/attach/functions/fnc_canAttach.sqf +++ b/addons/attach/functions/fnc_canAttach.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if a unit can attach a specific item. diff --git a/addons/attach/functions/fnc_canDetach.sqf b/addons/attach/functions/fnc_canDetach.sqf index 8ff4ef3249..7202ba410f 100644 --- a/addons/attach/functions/fnc_canDetach.sqf +++ b/addons/attach/functions/fnc_canDetach.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if a unit has an item attached and if it can remove that item. diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 8c7a817891..2ae30f5663 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: eRazeri and esteldunedain * Detach an item from a unit diff --git a/addons/attach/functions/fnc_getChildrenActions.sqf b/addons/attach/functions/fnc_getChildrenActions.sqf index 22b4c28892..e64d2847f6 100644 --- a/addons/attach/functions/fnc_getChildrenActions.sqf +++ b/addons/attach/functions/fnc_getChildrenActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth de Wet (LH), PabstMirror, mharis001 * Returns children actions for attachable items. diff --git a/addons/attach/functions/fnc_handleGetIn.sqf b/addons/attach/functions/fnc_handleGetIn.sqf index 418c62ebfe..16afd0dd63 100644 --- a/addons/attach/functions/fnc_handleGetIn.sqf +++ b/addons/attach/functions/fnc_handleGetIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles when a unit gets in to a vehicle. diff --git a/addons/attach/functions/fnc_handleGetOut.sqf b/addons/attach/functions/fnc_handleGetOut.sqf index 4e1dac1e89..b81fa93cfa 100644 --- a/addons/attach/functions/fnc_handleGetOut.sqf +++ b/addons/attach/functions/fnc_handleGetOut.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles when a unit gets in to a vehicle. diff --git a/addons/attach/functions/fnc_handleKilled.sqf b/addons/attach/functions/fnc_handleKilled.sqf index 0aaf0b03cb..ef08aff305 100644 --- a/addons/attach/functions/fnc_handleKilled.sqf +++ b/addons/attach/functions/fnc_handleKilled.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror - * Handles when vehicle or man is killed. + * Handles when vehicle or man is killed. * Note: Runs where unit is local. * * Arguments: diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index 0e9595efd6..b9b5466018 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Pabst Mirror (based on Explosive attach by Garth de Wet (LH)) * Approves placement of the lightObject, scans for an appropriate location and attaches diff --git a/addons/attach/functions/script_component.hpp b/addons/attach/functions/script_component.hpp deleted file mode 100644 index b28de85182..0000000000 --- a/addons/attach/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\attach\script_component.hpp" \ No newline at end of file diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 831c4384e4..f7c01c5f61 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -13,7 +13,7 @@ Tárgy hozzácsatolása Прикрепить предмет アイテムを取り付ける - 물건 부착 + 아이템 부착 附掛裝備>> 附挂装备>> Eşyayı bağla @@ -47,7 +47,7 @@ Tárgy lecsatolása Отсоединить アイテムを外す - 분리 + 떼내기 取下裝備 取下装备 Eşyayı sök @@ -66,7 +66,7 @@ 赤外線ストロボを取り付けました 적외선 스트로브 부착됨 已附掛紅外線頻閃器 - 已附挂红外线频闪器 + 已附挂红外频闪器 IR Strobe Bağlandı @@ -81,9 +81,9 @@ Infravörös jeladó lecsatolva ИК-маяк отсоединён 赤外線ストロボを外しました - 적외선 스트로브 분리됨 + 적외선 스트로브 떼어냄 已取下紅外線頻閃器 - 已取下红外线频闪器 + 已取下红外频闪器 IR Strobe Söküldü @@ -100,7 +100,7 @@ 赤外線グレネードを取り付けました 적외선 수류탄 부착됨 已附掛紅外線手榴彈 - 已附挂红外线手榴弹 + 已附挂红外手雷 IR Bombası Bağlandı @@ -115,9 +115,9 @@ Infravörös gránát lecsatolva ИК-граната отсоединена 赤外線グレネードを外しました - 적외선 수류탄 분리됨 + 적외선 수류탄 떼어냄 已取下紅外線手榴彈 - 已取下红外线手榴弹 + 已取下红外手雷 IR Bombası Söküldü @@ -134,7 +134,7 @@ ケミライトを取り付けました 켐라이트 부착됨 已附掛螢光棒 - 已附挂萤光棒 + 已附挂荧光棒 Işık Çubuğu Bağlandı @@ -149,9 +149,9 @@ Chemlight hozzácsatolva Химсвет отсоединён ケミライトを外しました - 켐라이트 분리됨 + 켐라이트 떼어냄 已取下螢光棒 - 已取下萤光棒 + 已取下荧光棒 Işık Çubuğu Söküldü @@ -168,7 +168,7 @@ 赤外線ストロボ 적외선 스트로브 紅外線頻閃器 - 红外线频闪器 + 红外频闪器 IR Stroboskop @@ -185,7 +185,7 @@ 赤外線ストロボはあなたの位置を知らせますが、夜間暗視装置を介してでしか見れません。 적외선 스트로브는 자신의 위치를 반짝이면서 표시합니다. 이는 야간투시경으로 밖에 보지 못합니다. 紅外線閃頻器,藉由紅外線閃頻信號來辨識你的位置,僅能使用夜視系統來辨識紅外線信號 - 红外线闪频器,藉由红外线闪频信号来辨识你的位置,仅能使用夜视系统来辨识红外线信号 + 红外频闪器制造只有用夜视仪才能看到的频闪信标,发出一个位置信号。 IR Stroboskop, yalnızca gece görüşlerinden gözükebilen titreşimli bir ışık aracılığıyla konumunuzu gösterir. @@ -200,7 +200,7 @@ Elhelyez Установить 置く - 두기 + 놓기 放置 放置 Yerleştir @@ -268,7 +268,7 @@ %1<br/>lecsatolva %1<br/>отсоединен(-а) %1<br/>を外しました - %1<br/>분리됨 + %1<br/>떼어냄 %1<br/>已取下 %1<br/>已取下 %1<br/>Söküldü diff --git a/addons/backpacks/functions/fnc_backpackOpened.sqf b/addons/backpacks/functions/fnc_backpackOpened.sqf index 50ab9891cc..9b64450e38 100644 --- a/addons/backpacks/functions/fnc_backpackOpened.sqf +++ b/addons/backpacks/functions/fnc_backpackOpened.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Someone opened your backpack. Play sound and camshake. Execute locally. diff --git a/addons/backpacks/functions/fnc_isBackpack.sqf b/addons/backpacks/functions/fnc_isBackpack.sqf index a101a514e9..f70c3d5a31 100644 --- a/addons/backpacks/functions/fnc_isBackpack.sqf +++ b/addons/backpacks/functions/fnc_isBackpack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the given backpack is an actual backpack that can store items. Parachute, static weapon packs, etc. will return false. @@ -17,10 +17,10 @@ params [["_backpack", objNull, [objNull, ""]]]; -if (_backpack isEqualType objNull) then { - _backpack = typeOf _backpack; +private _config = if (_backpack isEqualType objNull) then { + configOf _backpack +} else { + configFile >> "CfgVehicles" >> _backpack }; -private _config = configFile >> "CfgVehicles" >> _backpack; - getText (_config >> "vehicleClass") == "backpacks" && {getNumber (_config >> "maximumLoad") > 0} // return diff --git a/addons/backpacks/functions/fnc_onOpenInventory.sqf b/addons/backpacks/functions/fnc_onOpenInventory.sqf index bfb380efe2..6d72a40b66 100644 --- a/addons/backpacks/functions/fnc_onOpenInventory.sqf +++ b/addons/backpacks/functions/fnc_onOpenInventory.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle the open inventory event. Camshake and sound on target client. diff --git a/addons/backpacks/functions/script_component.hpp b/addons/backpacks/functions/script_component.hpp deleted file mode 100644 index b6bb78fff5..0000000000 --- a/addons/backpacks/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\backpacks\script_component.hpp" \ No newline at end of file diff --git a/addons/ballistics/ACE_Arsenal_Stats.hpp b/addons/ballistics/ACE_Arsenal_Stats.hpp index 9e4982656b..c3a1de2bce 100644 --- a/addons/ballistics/ACE_Arsenal_Stats.hpp +++ b/addons/ballistics/ACE_Arsenal_Stats.hpp @@ -24,6 +24,7 @@ class EGVAR(arsenal,stats) { stats[] = {"ammo", "displayName"}; displayName = "$STR_dn_ammo"; showText = 1; + condition = QUOTE(getText (_this select 1 >> _this select 0 select 0) isNotEqualTo ''); textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _ammoDisplayName = getText (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 1); [ARR_2(_ammoDisplayName, getText (_config >> _stat select 0))] select (_ammoDisplayName == '')); tabs[] = {{}, {4}}; }; @@ -50,20 +51,30 @@ class EGVAR(arsenal,stats) { class ACE_magMuzzleVelocity: statBase { scope = 2; priority = 3; - stats[] = {"initSpeed"}; + stats[] = {"initSpeed", "ammo"}; displayName= CSTRING(statMuzzleVelocity); showText= 1; 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); + condition = QUOTE(getText (_this select 1 >> _this select 0 select 1) isNotEqualTo '' && {getNumber (_this select 1 >> (_this select 0) select 0) > 0}); tabs[] = {{}, {4}}; }; class ACE_weaponMuzzleVelocity: statBase { scope = 2; - priority = 3; + priority = 1; stats[] = {"initSpeed"}; displayName= CSTRING(statMuzzleVelocity); showText = 1; textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_weaponMuzzleVelocity)); tabs[] = {{0,1}, {}}; }; + class ACE_magazineAiUsage: statBase { + scope = 2; + priority = 0; + stats[] = {"aiAmmoUsageFlags"}; + displayName= CSTRING(ammoUsage_ai); + showText= 1; + textStatement = QUOTE(call FUNC(statTextStatement_magazineAiUsage)); + condition = QUOTE(is3DEN || {!isNull getAssignedCuratorLogic player} || {missionNamespace getVariable [ARR_2(QQGVAR(showAIMagazineUse), missionName == 'Arsenal')]}); + tabs[] = {{}, {4}}; + }; }; diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 51e5c4ddd4..8bdb9b393c 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -280,7 +280,7 @@ class CfgAmmo { class B_762x51_Ball: BulletBase { airFriction=-0.00103711; tracerScale = 1.2; //0.6; - tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m + tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator ACE_caliber=7.823; ACE_bulletLength=28.956; @@ -365,20 +365,30 @@ class CfgAmmo { ACE_barrelLengths[]={330.2, 406.4, 508.0}; }; class ACE_762x51_Ball_Subsonic: B_762x51_Ball { - airFriction=-0.00060194; - caliber=1; - hit=6; - typicalSpeed=320; - ACE_caliber=7.823; - ACE_bulletLength=34.036; - ACE_bulletMass=12.96; - 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.235}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={305, 325, 335, 340}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + airFriction = -0.00060194; + caliber = 1; + hit = 6; + typicalSpeed = 320; + visibleFire = 1; // B_762x51_Ball: 3 + audibleFire = 5; // B_762x51_Ball: 45 + dangerRadiusBulletClose = 4; // B_762x51_Ball: 8 + suppressionRadiusBulletClose = 2; // B_762x51_Ball: 6 + ACE_caliber = 7.823; + ACE_bulletLength = 34.036; + ACE_bulletMass = 12.96; + 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.235}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {305, 325, 335, 340}; + ACE_barrelLengths[] = {406.4, 508.0, 609.6, 660.4}; + class CamShakeExplode { + power = 2.2360699; // B_762x51_Ball: 2.8284299 + duration = 0.4; // B_762x51_Ball: 0.6 + frequency = 20; // B_762x51_Ball: 20 + distance = 6.7082; // B_762x51_Ball: 8.48528 + }; }; class ACE_762x67_Ball_Mk248_Mod_0: B_762x51_Ball { airFriction=-0.00072468; @@ -685,24 +695,34 @@ class CfgAmmo { ACE_barrelLengths[]={736.6}; }; class B_127x108_Ball: BulletBase { - timeToLive=10; - airFriction=-0.00065098; - tracerScale = 1.3; //1.5; - ACE_caliber=12.979; - ACE_bulletLength=64.008; - ACE_bulletMass=48.276; - 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.63}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={820}; - ACE_barrelLengths[]={728.98}; - }; - class B_127x108_APDS: B_127x108_Ball { - typicalSpeed = 820; + timeToLive = 10; airFriction = -0.00065098; + tracerScale = 1.3; //1.5; + ACE_caliber = 12.979; + ACE_bulletLength = 64.008; + ACE_bulletMass = 48.276; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; // Muzzle Velocity shift 0 at 70°F (21°C), -8m/s at 15°C + ACE_ballisticCoefficients[] = {0.63}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {828}; // muzzle velocity 828 m/s at 21°C (70°F: Temp vs MV chart zero), 820 m/s at 15°C (ASM: 15°C, 999,916 hPa, 78%) according to 5Rnd_127x108_Mag initSpeed + ACE_barrelLengths[] = {730}; // GM6 Lynx barrel length https://gm6lynx.com/ }; + + class B_127x108_APDS: B_127x108_Ball { + ACE_caliber = 7.13; // Chinese 12.7x108mm APDS (Armour Piercing Discarding Sabot) https://i.imgur.com/8mlXD0e.png + ACE_bulletLength = 34.08; // Chinese 12.7x108mm APDS (Armour Piercing Discarding Sabot) https://i.imgur.com/8mlXD0e.png + ACE_bulletMass = 27.95; // Average value from "Norinco 2017 Weapon Systems", Type 54 12.7x108 mm Tungsten APDS https://i-com.cdn.gaijin.net/monthly_2023_03/image.png.5e6ae14e7b69a610c716872abea1061e.png + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.8, -7.64, -1.53, 5.96, 15.17, 26.19}; // Muzzle Velocity shift 0 at 70°F (21°C), -8m/s at 15°C + ACE_ballisticCoefficients[] = {1.052}; // Compromise based on bullet drops, times of flight and remaining velocities according to vanilla B_127x108_APDS airFriction -0.00036 + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {1068}; // muzzle velocity 1068 m/s at 21°C (70°F: Temp vs MV chart zero), 1060 m/s at 15°C (ICAO: 15°C, 1013.25 hPa, 0%) according to 5Rnd_127x108_APDS_Mag initSpeed + ACE_barrelLengths[] = {730}; // GM6 Lynx barrel length https://gm6lynx.com/ + }; + class B_45ACP_Ball: BulletBase { airFriction=-0.00082143; tracerScale = 0.6; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 999987a24b..4a6abcca01 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -592,10 +592,6 @@ class CfgMagazines { }; class 5Rnd_127x108_Mag; - 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"; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 2dfc62b754..024b6a6343 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -9,7 +9,7 @@ class CfgWeapons { // GM6 Lynx class GM6_base_F: Rifle_Long_Base_F {}; class srifle_GM6_F: GM6_base_F { - ACE_barrelLength = 730; + ACE_barrelLength = 730; // GM6 Lynx barrel length https://gm6lynx.com/ ACE_barrelTwist = 381.0; initSpeed = -1.0; magazineWell[] += { @@ -101,7 +101,7 @@ class CfgWeapons { // Rifle_Long_Base_F MG // Stoner 99 LMG class LMG_Mk200_F: Rifle_Long_Base_F { - ACE_barrelLength = 317.5; + ACE_barrelLength = 381; ACE_barrelTwist = 177.8; initSpeed = -0.999327; }; diff --git a/addons/ballistics/XEH_PREP.hpp b/addons/ballistics/XEH_PREP.hpp index c370b5fe1f..03a5055fcb 100644 --- a/addons/ballistics/XEH_PREP.hpp +++ b/addons/ballistics/XEH_PREP.hpp @@ -1,2 +1,3 @@ -PREP(statTextStatement_weaponMuzzleVelocity); +PREP(statTextStatement_magazineAiUsage); PREP(statTextStatement_magazineMuzzleVelocity); +PREP(statTextStatement_weaponMuzzleVelocity); diff --git a/addons/ballistics/functions/fnc_statTextStatement_magazineAiUsage.sqf b/addons/ballistics/functions/fnc_statTextStatement_magazineAiUsage.sqf new file mode 100644 index 0000000000..c7017f648b --- /dev/null +++ b/addons/ballistics/functions/fnc_statTextStatement_magazineAiUsage.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Text statement for the magazine's AI Usage. + * + * Arguments: + * 0: not used + * 1: item config path (CONFIG) + * + * Return Value: + * String to display + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_magazineAiUsage",_config); + +private _ammo = getText (_config >> "ammo"); +private _aiAmmoUsageFlags = getNumber (configFile >> "CfgAmmo" >> _ammo >> "aiAmmoUsageFlags"); +private _cost = getNumber (configFile >> "CfgAmmo" >> _ammo >> "cost"); + +private _output = []; + +if ([_aiAmmoUsageFlags, 1] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_illumination) }; +if ([_aiAmmoUsageFlags, 4] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_concealment) }; +if ([_aiAmmoUsageFlags, 64] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_infantry) }; +if ([_aiAmmoUsageFlags, 128] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_lightVehicle) }; +if ([_aiAmmoUsageFlags, 256] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_armor) }; +if ([_aiAmmoUsageFlags, 512] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_aircraft) }; + +(_output joinString ", ") + format [" [%1 %2]", localize "str_a3_cfgvehicles_modulecuratorsetobjectcost_f_arguments_cost", _cost] diff --git a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf index 73f671343a..49eb43302e 100644 --- a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf +++ b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Text statement for the magazine ammo muzzle velocity stat. diff --git a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf index 227af9158d..a720935c74 100644 --- a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf +++ b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Alganthe * Text statement for the weapon muzzle velocity stat. diff --git a/addons/ballistics/functions/script_component.hpp b/addons/ballistics/functions/script_component.hpp deleted file mode 100644 index a257e3d384..0000000000 --- a/addons/ballistics/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\ballistics\script_component.hpp" diff --git a/addons/ballistics/scripts/initTargetWall.sqf b/addons/ballistics/scripts/initTargetWall.sqf index 7f9578f09a..7297e6ba17 100644 --- a/addons/ballistics/scripts/initTargetWall.sqf +++ b/addons/ballistics/scripts/initTargetWall.sqf @@ -1,5 +1,5 @@ // by commy2 -#include "script_component.hpp" +#include "..\script_component.hpp" params ["_wall"]; diff --git a/addons/ballistics/scripts/script_component.hpp b/addons/ballistics/scripts/script_component.hpp deleted file mode 100644 index 998ced0210..0000000000 --- a/addons/ballistics/scripts/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\ballistics\script_component.hpp" \ No newline at end of file diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 967e00b9cd..00d5f6f068 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -7,6 +7,7 @@ Postas #00 #00 Schrotmunition #00 鹿彈 + #00 鹿弹 #00 Buckshot #00 バックショット Chevrotine #00 @@ -15,12 +16,14 @@ #00 Chumbo #00 Irisaçma #00 Картечь + #00 벅샷 #00 Buckshot Postas #00 #00 Schrotmunition - #00 鹿彈 + #00 鹿彈(8.38 mm) + #00 鹿弹(8.38 mm) #00 Buckshot #00 バックショット Chevrotine #00 @@ -29,12 +32,14 @@ #00 Chumbo #00 Irisaçma #00 Картечь + #00 벅샷 #0 Buckshot Postas #0 #0 Schrotmunition #0 鹿彈 + #0 鹿弹 #0 Buckshot #0 バックショット Chevrotine #0 @@ -43,12 +48,14 @@ #0 Chumbo #0 Irisaçma #0 Картечь + #0 벅샷 #0 Buckshot Postas #0 #0 Schrotmunition #0 鹿彈 + #0 鹿弹(8.1 mm) #0 Buckshot #0 バックショット Chevrotine #0 @@ -57,12 +64,14 @@ #0 Chumbo #0 Irisaçma #0 Картечь + #0 벅샷 #1 Buckshot Postas #1 #1 Schrotmunition #1 鹿彈 + #1 鹿弹 #1 Buckshot #1 バックショット Chevrotine #1 @@ -71,12 +80,14 @@ #1 Chumbo #1 Irisaçma #1 Картечь + #1 벅샷 #1 Buckshot Postas #1 #1 Schrotmunition #1 鹿彈 + #1 鹿弹(7.6 mm) #1 Buckshot #1 バックショット Chevrotine #1 @@ -85,12 +96,14 @@ #1 Chumbo #1 Irisaçma #1 Картечь + #1 벅샷 #2 Buckshot Postas #2 #2 Schrotmunition #2 鹿彈 + #2 鹿弹 #2 Buckshot #2 バックショット Chevrotine #2 @@ -99,12 +112,14 @@ #2 Chumbo #2 Irisaçma #2 Картечь + #2 벅샷 #2 Buckshot Postas #2 #2 Schrotmunition #2 鹿彈 + #2 鹿弹(6.9 mm) #2 Buckshot #2 バックショット Chevrotine #2 @@ -113,12 +128,14 @@ #2 Chumbo #2 Irisaçma #2 Картечь + #2 벅샷 #3 Buckshot Postas #3 #3 Schrotmunition #3 鹿彈 + #3 鹿弹 #3 Buckshot #3 バックショット Chevrotine #3 @@ -127,12 +144,14 @@ #3 Chumbo #3 Irisaçma #3 Картечь + #3 벅샷 #3 Buckshot Postas #3 #3 Schrotmunition #3 鹿彈 + #3 鹿弹(6.4 mm) #3 Buckshot #3 バックショット Chevrotine #3 @@ -141,12 +160,14 @@ #3 Chumbo #3 Irisaçma #3 Картечь + #3 벅샷 #4 Buckshot Postas #4 #4 Schrotmunition #4 鹿彈 + #4 鹿弹 #4 Buckshot #4 バックショット Chevrotine #4 @@ -155,12 +176,14 @@ #4 Chumbo #4 Irisaçma #4 Картечь + #4 벅샷 #4 Buckshot Postas #4 #4 Schrotmunition #4 鹿彈 + #4 鹿弹(6.10 mm) #4 Buckshot #4 バックショット Chevrotine #4 @@ -169,12 +192,14 @@ #4 Chumbo #4 Irisaçma #4 Картечь + #4 벅샷 #4 Birdshot Perdigones #4 #4 Vogelschrot - #4 鹿彈 + #4 鳥彈 + #4 鸟弹 #4 Birdshot #4 バックショット Grenaille No.4 @@ -182,12 +207,14 @@ #4 Śrut Drobny #4 Küçük saçma #4 Дробь + #4 버드샷 #4 Birdshot Perdigones #4 #4 Vogelschrot - #4 鹿彈 + #4 鳥彈 + #4 鸟弹(3.30 mm) #4 Birdshot #4 バックショット Grenaille No.4 @@ -195,12 +222,14 @@ #4 Śrut Drobny (Birdshot) #4 Küçük saçma #4 Дробь + #4 버드샷 12 Gauge 2Rnd #00 Buckshot 2 Cartuchos de Postas Calibre 12 #00 12 Gauge 2Schuss #00 Schrotmunition 12鉛徑 2發 #00 鹿彈 + 12铅径 2发 #00 鹿弹 12 Gauge 2Rnd #00 Buckshot 12 ゲージ 2 発入り #00 バックショット 2 balles cal. 12 Chevrotine #00 @@ -209,12 +238,14 @@ Chumbo #00 Calibre Doze 2 Tiros 12 Калибр 2 патр. #00 Картечь 12 kalibre 2 mermi #00 İrisaçma + 12 게이지 2발 #00 벅샷 12 Gauge 2Rnd #0 Buckshot 2 Cartuchos de Postas Calibre 12 #0 12 Gauge 2Schuss #0 Schrotmunition 12鉛徑 2發 #0 鹿彈 + 12铅径 2发 #0 鹿弹 12 Gauge 2Rnd #0 Buckshot 12 ゲージ 2 発入り #0 バックショット 2 balles cal. 12 Chevrotine #0 @@ -223,12 +254,14 @@ Chumbo #0 Calibre Doze 2 Tiros 12 Калибр 2 патр. #0 Картечь 12 kalibre 2 mermi #0 İrisaçma + 12 게이지 2발 #00 벅샷 12 Gauge 2Rnd #1 Buckshot 2 Cartuchos de Postas Calibre 12 #1 12 Gauge 2Schuss #1 Schrotmunition 12鉛徑 2發 #1 鹿彈 + 12铅径 2发 #1 鹿弹 12 Gauge 2Rnd #1 Buckshot 12 ゲージ 2 発入り #1 バックショット 2 balles cal. 12 Chevrotine #1 @@ -237,12 +270,14 @@ Chumbo #1 Calibre Doze 2 Tiros 12 Калибр 2 патр. #1 Картечь 12 kalibre 2 mermi #1 İrisaçma + 12 게이지 2발 #1 벅샷 12 Gauge 2Rnd #2 Buckshot 2 Cartuchos de Postas Calibre 12 #2 12 Gauge 2Schuss #2 Schrotmunition 12鉛徑 2發 #2 鹿彈 + 12铅径 2发 #2 鹿弹 12 Gauge 2Rnd #2 Buckshot 12 ゲージ 2 発入り #2 バックショット 2 balles cal. 12 Chevrotine #2 @@ -251,12 +286,14 @@ Chumbo #2 Calibre Doze 2 Tiros 12 Калибр 2 патр. #2 Картечь 12 kalibre 2 mermi #2 İrisaçma + 12 게이지 2발 #2 벅샷 12 Gauge 2Rnd #3 Buckshot 2 Cartuchos de Postas Calibre 12 #3 12 Gauge 2Schuss #3 Schrotmunition 12鉛徑 2發 #3 鹿彈 + 12铅径 2发 #3 鹿弹 12 Gauge 2Rnd #3 Buckshot 12 ゲージ 2 発入り #3 バックショット 2 balles cal. 12 Chevrotine #3 @@ -265,12 +302,14 @@ Chumbo #3 Calibre Doze 2 Tiros 12 Калибр 2 патр. #3 Картечь 12 kalibre 2 mermi #3 İrisaçma + 12 게이지 2발 #3 벅샷 12 Gauge 2Rnd #4 Buckshot 2 Cartuchos de Postas Calibre 12 #4 12 Gauge 2Schuss #4 Schrotmunition 12鉛徑 2發 #4 鹿彈 + 12铅径 2发 #4 鹿弹 12 Gauge 2Rnd #4 Buckshot 12 ゲージ 2 発入り #4 バックショット 2 balles cal. 12 Chevrotine #4 @@ -279,12 +318,14 @@ Chumbo #4 Calibre Doze 2 Tiros 12 Калибр 2 патр. #4 Картечь 12 kalibre 2 mermi #4 İrisaçma + 12 게이지 2발 #4 벅샷 12 Gauge 2Rnd #4 Birdshot 2 Cartuchos de Perdigones Calibre 12 #4 12 Gauge 2Schuss #4 Schrotmunition - 12鉛徑 2發 #4 鹿彈 + 12鉛徑 2發 #4 鳥彈 + 12铅径 2发 #4 鸟弹 12 Gauge 2Rnd #4 Birdshot 12 ゲージ 2 発入り #4 バックショット 2 balles cal. 12 Grenaille No.4 @@ -293,12 +334,14 @@ Chumbo #4 Calibre Doze 2 Tiros 12 Калибр 2 патр. #4 Дробь 12 kalibre 2 mermi #4 İrisaçma + 12 게이지 2발 #4 버드샷 12 Gauge 6Rnd #00 Buckshot 6 Cartuchos de Postas Calibre 12 #00 12 Gauge 6Schuss #00 Schrotmunition 12鉛徑 6發 #00 鹿彈 + 12铅径 6发 #00 鹿弹 12 Gauge 6Rnd #00 Buckshot 12 ゲージ 6 発入り #00 バックショット 6 balles cal. 12 Chevrotine #00 @@ -307,12 +350,14 @@ Chumbo #00 Calibre Doze 6 Tiros 12 Калибр 6 патр. #00 Картечь 12 kalibre 6 mermi #00 İrisaçma + 12 게이지 6발 #00 벅샷 12 Gauge 6Rnd #0 Buckshot 6 Cartuchos de Postas Calibre 12 #0 12 Gauge 6Schuss #0 Schrotmunition 12鉛徑 6發 #0 鹿彈 + 12铅径 6发 #0 鹿弹 12 Gauge 6Rnd #0 Buckshot 12 ゲージ 6 発入り #0 バックショット 6 balles cal. 12 Chevrotine #0 @@ -321,12 +366,14 @@ Chumbo #0 Calibre Doze 6 Tiros 12 Калибр 6 патр. #0 Картечь 12 kalibre 6 mermi #0 İrisaçma + 12 게이지 6발 #0 벅샷 12 Gauge 6Rnd #1 Buckshot 6 Cartuchos de Postas Calibre 12 #1 12 Gauge 6Schuss #1 Schrotmunition 12鉛徑 6發 #1 鹿彈 + 12铅径 6发 #1 鹿弹 12 Gauge 6Rnd #1 Buckshot 12 ゲージ 6 発入り #1 バックショット 6 balles cal. 12 Chevrotine #1 @@ -335,12 +382,14 @@ Chumbo #1 Calibre Doze 6 Tiros 12 Калибр 6 патр. #1 Картечь 12 kalibre 6 mermi #1 İrisaçma + 12 게이지 6발 #1 벅샷 12 Gauge 6Rnd #2 Buckshot 6 Cartuchos de Postas Calibre 12 #2 12 Gauge 6Schuss #2 Schrotmunition 12鉛徑 6發 #2 鹿彈 + 12铅径 6发 #2 鹿弹 12 Gauge 6Rnd #2 Buckshot 12 ゲージ 6 発入り #2 バックショット 6 balles cal. 12 Chevrotine #2 @@ -349,12 +398,14 @@ Chumbo #2 Calibre Doze 6 Tiros 12 Калибр 6 патр. #2 Картечь 12 kalibre 6 mermi #2 İrisaçma + 12 게이지 6발 #2 벅샷 12 Gauge 6Rnd #3 Buckshot 6 Cartuchos de Postas Calibre 12 #3 12 Gauge 6Schuss #3 Schrotmunition 12鉛徑 6發 #3 鹿彈 + 12铅径 6发 #3 鹿弹 12 Gauge 6Rnd #3 Buckshot 12 ゲージ 6 発入り #3 バックショット 6 balles cal. 12 Chevrotine #3 @@ -363,12 +414,14 @@ Chumbo #3 Calibre Doze 6 Tiros 12 Калибр 6 патр. #3 Картечь 12 kalibre 6 mermi #3 İrisaçma + 12 게이지 6발 #3 벅샷 12 Gauge 6Rnd #4 Buckshot 6 Cartuchos de Postas Calibre 12 #4 12 Gauge 6Schuss #4 Schrotmunition 12鉛徑 6發 #4 鹿彈 + 12铅径 6发 #4 鹿弹 12 Gauge 6Rnd #4 Buckshot 12 ゲージ 6 発入り #4 バックショット 6 balles cal. 12 Chevrotine #4 @@ -377,12 +430,14 @@ Chumbo #4 Calibre Doze 6 Tiros 12 Калибр 6 патр. #4 Картечь 12 kalibre 6 mermi #4 İrisaçma + 12 게이지 6발 #4 벅샷 12 Gauge 6Rnd #4 Birdshot 6 Cartuchos de Perdigones Calibre 12 #4 12 Gauge 6Schuss #4 Schrotmunition - 12鉛徑 6發 #4 鹿彈 + 12鉛徑 6發 #4 鳥彈 + 12铅径 6发 #4 鸟弹 12 Gauge 6Rnd #4 Birdshot 12 ゲージ 6 発入り #4 バックショット 6 balles cal. 12 Grenaille No.4 @@ -390,12 +445,14 @@ 12 Gauge 6 naboi #4 Śrut 12 Калибр 6 патр. #4 Дробь 12 kalibre 6 mermi #4 İrisaçma + 12 게이지 6발 #4 버드샷 12 Gauge 15Rnd #00 Buckshot 15 Cartuchos de Postas Calibre 12 #00 12 Gauge 15Schuss #00 Schrotmunition 12鉛徑 15發 #00 鹿彈 + 12铅径 15发 #00 鹿弹 12 Gauge 15Rnd #00 Buckshot 12 ゲージ 15 発入り #00 バックショット 15 balles cal. 12 Chevrotine #00 @@ -404,6 +461,7 @@ Chumbo #00 Calibre Doze 15 Tiros 12 Калибр 15 патр. #00 Картечь 12 kalibre 15 mermi #00 İrisaçma + 12 게이지 15발 #00 벅샷 @@ -418,9 +476,9 @@ Carregador 6.5x47 mm com 20 cartuchos (HPBT Scenar) 6,5x47 mm 20-lövedékes tár (HPBT Scenar) 6.5x47 mm 20発入り 弾倉 (HPBT Scenar) - 20발들이 6.5x47 mm (HPBT Scenar) + 20발 들이 6.5x47mm (HPBT Scenar) 6.5x47毫米 20發 彈匣 (拉普 空尖艇尾狙擊專用彈) - 6.5x47 mm 20发 弹匣 (Lapua 空尖艇尾狙击专用弹) + 6.5x47 mm 20发 弹匣(HPBT Scenar) 6.5x47 mm 20Rnd Mag (HPBT Scenar) @@ -435,9 +493,9 @@ 6.5 mm Lapua 6,5 mm Lapua 6.5 mm Lapua - 6.5 mm Lapua + 6.5mm 라푸아 6.5毫米 拉普 空尖艇尾狙擊專用彈 - 6.5 mm Lapua 空尖艇尾狙击专用弹 + 6.5 mm Lapua 6.5 mm Lapua @@ -452,9 +510,9 @@ Calibre: 6.5x47 mm (HPBT Scenar)<br/>Cartuchos: 20<br/>Usado em: QBU-88 Kaliber: 6,5x47 mm (HPBT Scenar)<br />Lövedékek: 20<br />Használható: QBU-88 口径: 6.5x47 mm (HPBT Scenar)<br />装填数: 20<br />次で使用: QBU-88 - 구경: 6.5x47 mm (HPBT Scenar)<br />장탄수: 20<br />사용처: QBU-88 + 구경: 6.5x47mm (HPBT Scenar)<br/>장탄수: 20<br/>사용처: QBU-88 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 20<br />使用於: QBU-88 - 口径: 6.5x47 mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 20<br />使用于: QBU-88 + 口径:6.5x47 mm(HPBT Scenar)<br />发数:20<br />使用于:QBU-88 Kalibre: 6.5x47 mm (HPBT Scenar)<br />Mermi: 20<br />Kullanıyor: QBU-88 @@ -469,9 +527,9 @@ Carregador 6.5 mm com 20 cartuchos Creedmor 6,5 mm Creedmor 20-lövedékes tár 6.5 mm Creedmor 20発入り 弾倉 - 20발들이 6.5 mm Creedmor 탄창 + 20발 들이 6.5mm 크리드무어 탄창 6.5毫米 20發 彈匣 (克里德莫爾(CM) 狙擊專用彈) - 6.5 mm 20发 弹匣 (Creedmor 狙击专用弹) + 6.5 mm 20发 弹匣(Creedmor) 6.5 mm Creedmor 20Rnd Mag @@ -486,9 +544,9 @@ 6.5 mm CM 6,5 mm CM 6.5 mm CM - 6.5 mm CM + 6.5mm 크리드무어 6.5毫米 CM 狙擊專用彈 - 6.5 mm CM 狙击专用弹 + 6.5 mm CM 6.5 mm CM @@ -503,9 +561,9 @@ Calibre: 6.5x47 mm Creedmor<br/>Cartuchos: 20<br/>Usado em: QBU-88 Kaliber: 6,5x47 mm Creedmor<br />Lövedékek: 20<br />Használható: QBU-88 口径: 6.5x47 mm Creedmor<br />装填数: 20<br />次で使用: QBU-88 - 구경: 6.5x47 mm Creedmor<br />장탄수: 20<br />사용처: QBU-88 + 구경: 6.5x47mm 크리드무어<br/>장탄수: 20<br/>사용처: QBU-88 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 20<br />使用於: QBU-88 - 口径: 6.5x47 mm Creedmor 狙击专用弹<br />发数: 20<br />使用于: QBU-88 + 口径:6.5x47 mm Creedmor 狙击专用弹<br />发数:20<br />使用于:QBU-88 Kalibre: 6.5x47 mm Creedmor<br />Mermi: 20<br />Kullanıyor: QBU-88 @@ -520,9 +578,9 @@ Carregador 5.8 mm com 10 cartuchos DBP88 5,8 mm DBP88 10-lövedékes tár 5.8 mm DBP88 10発入り 弾倉 - 10발들이 5.8 mm DBP88 탄창 + 10발 들이 5.8mm DBP88 탄창 5.8毫米 10發 彈匣 (DBP88) - 5.8 mm 10发 弹匣 (DBP88) + 5.8 mm 10发 弹匣(DBP88) 5.8 mm DBP88 10Rnd Mag @@ -537,7 +595,7 @@ 5.8 mm DBP88 5,8 mm DBP88 5.8 mm DBP88 - 5.8 mm DBP88 + 5.8mm DBP88 5.8毫米 DBP88 5.8 mm DBP88 5.8 mm DBP88 @@ -554,9 +612,9 @@ Calibre: 5.8x42 mm DBP88<br/>Cartuchos: 10<br/>Usado em: QBU-88 Kaliber: 5,8x42 mm DBP88<br />Lövedékek: 10<br />Használható: QBU-88 口径: 5.8x42 mm DBP88<br />装填数: 10<br />次で使用: QBU-88 - 구경: 5.8x42 mm DBP88<br />장탄수: 10<br />사용처: QBU-88 + 구경: 5.8x42mm DBP88<br/>장탄수: 10<br/>사용처: QBU-88 口徑: 5.8x42毫米 DBP88<br />發數: 10<br />使用於: QBU-88 - 口径: 5.8x42 mm DBP88<br />发数: 10<br />使用于: QBU-88 + 口径:5.8x42 mm DBP88<br />发数:10<br />使用于:QBU-88 Kalibre: 5.8x42 mm DBP88<br />Mermi: 10<br />Kullanıyor: QBU-88 @@ -572,9 +630,9 @@ Caricatore 6.5 mm 30Rnd Traccianti IR-DIM Магазин из 30-ти 6,5 мм ИК-трассирующих 6.5 mm 30発入り IR-DIM曳光弾 弾倉 - 30발들이 6.5 mm IR-DIM 예광탄 탄창 + 30발 들이 6.5mm IR-DIM 예광탄 탄창 6.5毫米 30發 低視度紅外線曳光彈 彈匣 - 6.5 mm 30发 低视度红外线曳光弹 弹匣 + 6.5 mm 30发 弹匣(红外曳光) 6.5 mm 30Rnd Tracer IR-DIM Mag @@ -589,9 +647,9 @@ 6.5 mm IR-DIM 6,5 мм ИК-трассирующие 6.5 mm IR-DIM曳光弾 - 6.5 mm IR-DIM 예광탄 + 6.5mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -606,9 +664,9 @@ Calibro: 6.5x39 mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 口径: 6.5x39 mm 曳光弾 IR-DIM<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL - 구경: 6.5x39 mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL + 구경: 6.5x39mm IR-DIM 예광탄<br/>장탄수: 30<br/>사용처: MX/C/M/SW/3GL 口徑: 6.5x39毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL - 口径: 6.5x39 mm 低视度红外线曳光弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL + 口径:6.5x39 mm 红外曳光<br />发数:30<br />使用于:MX/C/M/SW/3GL Kalibre: 6.5x39 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL @@ -623,9 +681,9 @@ Caricatore 6.5 mm 30Rnd Sil. Магазин из 30-ти 6,5 мм дозвуковых 6.5 mm 30発入り 亜音速弾 弾倉 - 30발들이 6.5 mm 아음속탄 탄창 + 30발 들이 6.5mm 아음속탄 탄창 6.5毫米 30發 消音彈 彈匣 - 6.5 mm 30发 消音弹 弹匣 + 6.5 mm 30发 弹匣(亚音速) 6.5 mm 30Rnd SD Mag @@ -640,9 +698,9 @@ 6.5 mm Sil. 6,5 мм дозвуковые 6.5 mm 亜音速弾 - 6.5 mm 아음속탄 + 6.5mm 아음속탄 6.5毫米 消音彈 - 6.5 mm 消音弹 + 6.5 mm 亚音速 6.5 mm SD @@ -657,9 +715,9 @@ Calibro: 6.5x39 mm Sil.<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 口径: 6.5x39 mm 亜音速弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL - 구경: 6.5x39 mm 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.5x39 mm 消音弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL + 口径:6.5x39 mm 亚音速<br />发数:30<br />使用于:MX/C/M/SW/3GL Kalibre: 6.5x39 mm SD<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL @@ -674,9 +732,9 @@ Caricatore 6.5 mm 30Rnd AP Магазин из 30-ти 6,5 мм бронебойных 6.5 mm 30 発入り徹甲弾 弾倉 - 30발들이 6.5 mm 철갑탄 탄창 + 30발 들이 6.5mm 철갑탄 탄창 6.5毫米30發 穿甲彈 彈匣 - 6.5 mm 30发 穿甲弹 弹匣 + 6.5 mm 30发 弹匣(穿甲) 6.5 mm 30Rnd AP Mag @@ -691,9 +749,9 @@ 6.5 mm AP 6,5 мм бронебойные 6.5 mm 徹甲弾 - 6.5 mm 철갑탄 + 6.5mm 철갑탄 6.5毫米 穿甲彈 - 6.5 mm 穿甲弹 + 6.5 mm 穿甲 6.5 mm AP @@ -708,9 +766,9 @@ Calibro: 6.5x39 mm AP<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 口径: 6.5x39 mm 徹甲弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL - 구경: 6.5x39 mm 철갑탄<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.5x39 mm 穿甲弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL + 口径:6.5x39 mm 穿甲<br />发数:30<br />使用于:MX/C/M/SW/3GL Kalibre: 6.5x39 mm AP<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL @@ -726,9 +784,9 @@ Caricatore 6.5 mm 30Rnd Traccianti IR-DIM Магазин из 30-ти 6,5 мм ИК-трассирующих 6.5 mm 30発入り IR-DIM曳光弾 弾倉 - 30발들이 6.5 mm IR-DIM 예광탄 탄창 + 30발 들이 6.5mm IR-DIM 예광탄 탄창 6.5毫米 30發 低視度紅外線曳光彈 彈匣 - 6.5 mm 30发 低视度红外线曳光弹 弹匣 + 6.5 mm 30发 弹匣(红外曳光) 6.5 mm 30Rnd Tracer IR-DIM Mag @@ -743,9 +801,9 @@ 6.5 mm IR-DIM 6,5 мм ИК-трассирующие 6.5 mm IR-DIM曳光弾 - 6.5 mm IR-DIM 예광탄 + 6.5mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -760,9 +818,9 @@ Calibro: 6.5x39 mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: Katiba 口径: 6.5x39 mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: Katiba - 구경: 6.5x39 mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: Katiba + 구경: 6.5x39mm IR-DIM 예광탄<br/>장탄수: 30<br/>사용처: KH-2002 口徑: 6.5x39毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: Katiba - 口径: 6.5x39 mm 低视度红外线曳光弹<br />发数: 30<br />使用于: Katiba + 口径:6.5x39 mm 红外曳光<br />发数:30<br />使用于:Katiba Kalibre: 6.5x39 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: Katiba @@ -777,9 +835,9 @@ Caricatore 6.5 mm 30Rnd Sil. Магазин из 30-ти 6,5 мм дозвуковых 6.5 mm 30発入り 亜音速弾 弾倉 - 30발들이 6.5 mm 아음속탄 탄창 + 30발 들이 6.5mm 아음속탄 탄창 6.5毫米 30發 消音彈 彈匣 - 6.5 mm 30发 消音弹 弹匣 + 6.5 mm 30发 弹匣(亚音速) 6.5 mm 30Rnd SD Mag @@ -794,9 +852,9 @@ 6.5 mm Sil. 6,5 мм дозвуковые 6.5 mm 亜音速弾 - 6.5 mm 아음속탄 + 6.5mm 아음속탄 6.5毫米 消音彈 - 6.5 mm 消音弹 + 6.5 mm 亚音速 6.5 mm SD @@ -811,9 +869,9 @@ Calibro: 6.5x39 mm Sil.<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: Katiba 口径: 6.5x39 mm 亜音速弾<br />装填数: 30<br />次で使用: Katiba - 구경: 6.5x39 mm 아음속탄<br />장탄수: 30<br />사용처: Katiba + 구경: 6.5x39mm 아음속탄<br/>장탄수: 30<br/>사용처: KH-2002 口徑: 6.5x39毫米 消音彈<br />發數: 30<br />使用於: Katiba - 口径: 6.5x39 mm 消音弹<br />发数: 30<br />使用于: Katiba + 口径:6.5x39 mm 亚音速<br />发数:30<br />使用于:Katiba Kalibre: 6.5x39 mm SD<br />Mermi: 30<br />Kullanıyor: Katiba @@ -828,9 +886,9 @@ Caricatore 6.5 mm 30Rnd AP Магазин из 30-ти 6,5 мм бронебойных 6.5 mm 30 発入り徹甲弾 弾倉 - 30발들이 6.5 mm 철갑탄 탄창 + 30발 들이 6.5mm 철갑탄 탄창 6.5毫米 30發 穿甲彈 彈匣 - 6.5 mm 30发 穿甲弹 弹匣 + 6.5 mm 30发 弹匣(穿甲) 6.5 mm 30Rnd AP Mag @@ -845,9 +903,9 @@ 6.5 mm AP 6,5 мм бронебойные 6.5 mm 徹甲弾 - 6.5 mm 철갑탄 + 6.5mm 철갑탄 6.5毫米 穿甲彈 - 6.5 mm 穿甲弹 + 6.5 mm 穿甲 6.5 mm AP @@ -862,9 +920,9 @@ Calibro: 6.5x39 mm AP<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: Katiba 口径: 6.5x39 mm 徹甲弾<br />装填数: 30<br />次で使用: Katiba - 구경: 6.5x39 mm 철갑탄<br />장탄수: 30<br />사용처: Katiba + 구경: 6.5x39mm 철갑탄<br/>장탄수: 30<br/>사용처: KH-2002 口徑: 6.5x39m毫米 穿甲彈<br />發數: 30<br />使用於: Katiba - 口径: 6.5x39 mm 穿甲弹<br />发数: 30<br />使用于: Katiba + 口径:6.5x39 mm 穿甲<br />发数:30<br />使用于:Katiba Kalibre: 6.5x39 mm AP<br />Mermi: 30<br />Kullanıyor: Katiba @@ -880,9 +938,9 @@ Caricatore 5.56 mm 30rnd Traccianti IR-DIM Магазин из 30-ти 5,56 мм ИК-трассирующих 5.56 mm 30発入り IR-DIM曳光弾 弾倉 - 30발 들이 5.56 mm IR-DIM 예광탄 탄창 + 30발 들이 5.56mm IR-DIM 예광탄 탄창 5.56毫米 30發 低視度紅外線曳光彈 彈匣 - 5.56 mm 30发 低视度红外线曳光弹 弹匣 + 5.56 mm 30发 弹匣(红外曳光) 5.56 mm 30rnd Tracer IR-DIM Mag @@ -897,9 +955,9 @@ 5.56 mm IR-DIM 5,56 мм ИК-трассирующие 5.56 mm IR-DIM曳光弾 - 5.56 mm IR-DIM 예광탄 + 5.56mm IR-DIM 예광탄 5.56毫米 低視紅外曳光彈 - 5.56 mm 低视红外曳光弹 + 5.56 mm 红外曳光 5.56 mm IR-DIM @@ -914,9 +972,9 @@ Calibro: 5.56x45 mm Traccianti IR-DIM<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Калибр: 5,56x45 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 口径: 5.56x45 mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 구경: 5.56x45 mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 구경: 5.56x45 mm IR-DIM 예광탄<br/>장탄수: 30<br/>사용처: CTAR-21, TAR-21/GTAR-21 EGLM, F2000/택티컬/EGLM, SDAR 口徑: 5.56x45毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 口径: 5.56x45 mm 低视度红外线曳光弹<br />发数: 30<br />使用于: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 口径:5.56x45 mm 红外曳光<br />发数:30<br />使用于:TRG-20,TRG-21/EGLM, Mk20/C/EGLM, SDAR Kalibre: 5.56x45 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -932,9 +990,9 @@ Caricatore 7.62 mm 20Rnd Traccianti Магазин из 20-ти 7,62 мм трассирующих 7.62 mm 20発入り 曳光弾 - 20발들이 7.62 mm 예광탄 탄창 + 20발 들이 7.62mm 예광탄 탄창 7.62毫米 20發 曳光彈 彈匣 - 7.62 mm 20发 曳光弹 弹匣 + 7.62 mm 20发 弹匣(曳光) 7.62 mm 20Rnd Mag (Tracer) @@ -949,9 +1007,9 @@ 7.62 mm Traccianti 7,62 мм трассирущие 7.62 mm 曳光弾 - 7.62 mm 예광탄 + 7.62mm 예광탄 7.62毫米 曳光彈 - 7.62 mm 曳光弹 + 7.62 mm 曳光 7.62 mm İzli @@ -966,9 +1024,9 @@ Calibro: 7.62x51 mm Traccianti<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 口径: 7.62x51 mm 曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR - 구경: 7.62x51 mm 예광탄<br />장탄수: 20<br />사용처: Mk18 ABR + 구경: 7.62x51mm 예광탄<br/>장탄수: 20<br/>사용처: Mk.14 Mod 1 EBR 口徑: 7.62x51毫米 曳光彈<br />發數: 20<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 曳光弹<br />发数: 20<br />使用于: Mk18 ABR + 口径:7.62x51 mm 曳光<br />发数:20<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer<br />Mermi: 20<br />Kullanıyor: Mk18 ABR @@ -983,9 +1041,9 @@ Caricatore 7.62 mm 20rnd Traccianti IR-DIM Магазин из 20-ти 7,62 мм ИК-трассирующих 7.62 mm 20発入り IR-DIM曳光弾 - 20발들이 7.62 mm IR-DIM 예광탄 탄창 + 20발 들이 7.62mm IR-DIM 예광탄 탄창 7.62毫米 20發 低視度紅外線曳光彈 彈匣 - 7.62 mm 20发 低视度红外线曳光弹 弹匣 + 7.62 mm 20发 弹匣(红外曳光) 7.62 mm 20Rnd Mag (IR-DIM) @@ -1000,9 +1058,9 @@ 7.62 mm IR-DIM 7,62 мм ИК-трассирующие 7.62 mm IR-DIM曳光弾 - 7.62 mm IR-DIM 예광탄 + 7.62mm IR-DIM 예광탄 7.62毫米 低視紅外曳光彈 - 7.62 mm 低视红外曳光弹 + 7.62 mm 红外曳光 7.62 mm IR-DIM @@ -1017,9 +1075,9 @@ Calibro: 7.62x51 mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 口径: 7.62x51 mm IR-DIM曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR - 구경: 7.62x51 mm IR-DIM 예광탄<br />장탄수: 20<br />사용처: Mk18 ABR + 구경: 7.62x51mm IR-DIM 예광탄<br/>장탄수: 20<br/>사용처: Mk.14 Mod 1 EBR 口徑: 7.62x51毫米 低視度紅外線曳光彈<br />發數: 20<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 低视度红外线曳光弹<br />发数: 20<br />使用于: Mk18 ABR + 口径:7.62x51 mm 红外曳光<br />发数:20<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer IR-DIM<br />Mermi: 20<br />Kullanıyor: Mk18 ABR @@ -1034,9 +1092,9 @@ Caricatore 7.62 mm 20Rnd Sil. Магазин из 20-ти 7,62 мм дозвуковых 7.62 mm 20発入り 亜音速弾 弾倉 - 20발들이 7.62 mm 아음속탄 탄창 + 20발 들이 7.62mm 아음속탄 탄창 7.62毫米 20發 消音彈 彈匣 - 7.62 mm 20发 消音弹 弹匣 + 7.62 mm 20发 弹匣(亚音速) 7.62 mm 20Rnd Mag (SD) @@ -1051,9 +1109,9 @@ 7.62 mm Sil. 7,62 мм дозвуковые 7.62 mm 亜音速弾 - 7.62 mm 아음속탄 + 7.62mm 아음속탄 7.62毫米 消音彈 - 7.62 mm 消音弹 + 7.62 mm 亚音速 7.62 mm SD @@ -1068,9 +1126,9 @@ Calibro: 7.62x51 mm Sil.<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR 口径: 7.62x51 mm 亜音速弾<br />装填数: 20<br />次で使用: Mk18 ABR - 구경: 7.62x51 mm SD<br />장탄수: 20<br />사용처: Mk18 ABR + 구경: 7.62x51mm 아음속탄<br/>장탄수: 20<br/>사용처: Mk.14 Mod 1 EBR 口徑: 7.62x51毫米 消音彈<br />發數: 20<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 消音弹<br />发数: 20<br />使用于: Mk18 ABR + 口径:7.62x51 mm 亚音速<br />发数:20<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm SD<br />Mermi: 20<br />Kullanıyor: Mk18 ABR @@ -1085,9 +1143,9 @@ Caricatore 7.62 mm 10Rnd Traccianti Магазин из 10-ти 7,62 мм трассирующих 7.62 mm 10発入り 曳光弾 - 10발들이 7.62 mm 예광탄 탄창 + 10발 들이 7.62mm 예광탄 탄창 7.62毫米 10發 曳光彈 彈匣 - 7.62 mm 10发 曳光弹 弹匣 + 7.62 mm 10发 弹匣(曳光) 7.62 mm 10Rnd Mag (Tracer) @@ -1102,9 +1160,9 @@ 7.62 mm Traccianti 7,62 мм трассирущие 7.62 mm 曳光弾 - 7.62 mm 예광탄 + 7.62mm 예광탄 7.62毫米 曳光彈 - 7.62 mm 曳光弹 + 7.62 mm 曳光 7.62 mm İzli @@ -1119,9 +1177,9 @@ Calibro: 7.62x51 mm Traccianti<br />Munizioni: 10<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм трассирующие<br />Патронов: 10<br />Используются с: Mk18 ABR 口径: 7.62x51 mm 曳光弾<br />装填数: 10<br />次で使用: Mk18 ABR - 구경: 7.62x51 mm 예광탄<br />장탄수: 10<br />사용처: Mk18 ABR + 구경: 7.62x51mm 예광탄<br/>장탄수: 10<br/>사용처: Mk.14 Mod 1 EBR 口徑: 7.62x51毫米 曳光彈<br />發數: 10<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 曳光弹<br />发数: 10<br />使用于: Mk18 ABR + 口径:7.62x51 mm 曳光<br />发数:10<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer<br />Mermi: 10<br />Kullanıyor: Mk18 ABR @@ -1136,9 +1194,9 @@ Caricatore 7.62 mm 10rnd Traccianti IR-DIM Магазин из 10-ти 7,62 мм ИК-трассирующих 7.62 mm 10発入り IR-DIM曳光弾 - 10발들이 7.62 mm IR-DIM 예광탄 탄창 + 10발 들이 7.62mm IR-DIM 예광탄 탄창 7.62毫米 10發 低視度紅外線曳光彈 彈匣 - 7.62 mm 10发 低视度红外线曳光弹 弹匣 + 7.62 mm 10发 弹匣(红外曳光) 7.62 mm 10Rnd Mag (IR-DIM) @@ -1153,9 +1211,9 @@ 7.62 mm IR-DIM 7,62 мм ИК-трассирующие 7.62 mm IR-DIM曳光弾 - 7.62 mm IR-DIM 예광탄 + 7.62mm IR-DIM 예광탄 7.62毫米 低視紅外曳光彈 - 7.62 mm 低视红外曳光弹 + 7.62 mm 红外曳光 7.62 mm IR-DIM @@ -1170,9 +1228,9 @@ Calibro: 7.62x51 mm Traccianti IR-DIM<br />Munizioni: 10<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 10<br />Используются с: Mk18 ABR 口径: 7.62x51 mm IR-DIM曳光弾<br />装填数: 10<br />次で使用: Mk18 ABR - 구경: 7.62x51 mm IR-DIM 예광탄<br />장탄수: 10<br />사용처: Mk18 ABR + 구경: 7.62x51mm IR-DIM 예광탄<br/>장탄수: 10<br/>사용처: Mk.14 Mod 1 EBR 口徑: 7.62x51毫米 低視度紅外線曳光彈<br />發數: 10<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 低视度红外线曳光弹<br />发数: 10<br />使用于: Mk18 ABR + 口径:7.62x51 mm 红外曳光<br />发数:10<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer IR-DIM<br />Mermi: 10<br />Kullanıyor: Mk18 ABR @@ -1187,9 +1245,9 @@ Caricatore 7.62 mm 10Rnd Sil. Магазин из 10-ти 7,62 мм дозвуковых 7.62 mm 10発入り 亜音速弾 弾倉 - 10발들이 7.62 mm 아음속탄 탄창 + 10발 들이 7.62mm 아음속탄 탄창 7.62毫米 10發 消音彈 彈匣 - 7.62 mm 10发 消音弹 弹匣 + 7.62 mm 10发 弹匣(亚音速) 7.62 mm 10Rnd Mag (SD) @@ -1204,9 +1262,9 @@ 7.62 mm Sil. 7,62 мм дозвуковые 7.62 mm 亜音速弾 - 7.62 mm 아음속탄 + 7.62mm 아음속탄 7.62毫米 消音彈 - 7.62 mm 消音弹 + 7.62 mm 亚音速 7.62 mm SD @@ -1221,9 +1279,9 @@ Calibro: 7.62x51 mm Sil.<br />Munizioni: 10<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм дозвуковые<br />Патронов: 10<br />Используются с: Mk18 ABR 口径: 7.62x51 mm 亜音速弾<br />装填数: 10<br />次で使用: Mk18 ABR - 구경: 7.62x51 mm SD<br />장탄수: 10<br />사용처: Mk18 ABR + 구경: 7.62x51 mm 아음속탄<br/>장탄수: 10<br/>사용처: Mk.14 Mod 1 EBR 口徑: 7.62x51毫米 消音彈<br />發數: 10<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 消音弹<br />发数: 10<br />使用于: Mk18 ABR + 口径:7.62x51 mm 亚音速<br />发数:10<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm SD<br />Mermi: 10<br />Kullanıyor: Mk18 ABR @@ -1239,9 +1297,9 @@ Cinto de munição .338 NM com 130 cartuchos .338 NM 130-lövedékes nyomkövető heveder .338 NM 130発入り 曳光弾ベルト - 130발들이 .338 NM 예광탄 벨트 + 130발 들이 .338구경 노르마 매그넘 예광탄 벨트 .338 拉普麥格農(NM) 130發 曳光彈 彈鏈 - .338 NM 130发 曳光弹 弹链 + .338 NM 130发 弹链(曳光) .338 NM 130Rnd Tracer Belt @@ -1256,9 +1314,9 @@ .338 NM Traçante .338 NM nyomkövető .338 NM 曳光弾 - .338 NM 예광탄 + .338구경 노르마 매그넘 예광탄 .338 NM 曳光彈 - .338 NM 曳光弹 + .338 NM 曳光 .338 NM İzli @@ -1273,9 +1331,9 @@ Calibre: .338 Norma Magnum Traçante<br />Cartuchos: 130<br />Usado em: SPMG 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구경 노르마 매그넘 예광탄<br/>장탄수: 130<br/>사용처: LWMMG 口徑: .338 拉普麥格農 曳光彈<br />發數: 130<br />使用於: SPMG - 口径: .338 Norma Magnum 曳光弹<br />发数: 130<br />使用于: SPMG + 口径:.338 Norma Magnum 曳光<br />发数:130<br />使用于:SPMG Kalibre: .338 Norma Magnum Tracer<br />Mermi: 130<br />Kullanıyor: SPMG @@ -1290,9 +1348,9 @@ Cinto de munição traçante .338 NM IR-DIM com 130 cartuchos .338 NM 130-lövedékes infravörös nyomkövető heveder .338 NM 130発入り IR-DIM曳光弾ベルト - 130발들이 .338 NM IR-DIM 예광탄 벨트 + 130발 들이 .338rnrud 노르마 매그넘 IR-DIM 예광탄 벨트 .338 拉普麥格農(NM) 130發 低視度紅外線曳光彈 彈鏈 - .338 NM 130发 低视度红外线曳光弹 弹链 + .338 NM 130发 弹链(红外曳光) .338 NM 130Rnd IR-DIM Belt @@ -1307,9 +1365,9 @@ .338 NM IR-DIM .338 NM infravörös nyomkövető .338 NM IR-DIM曳光弾 - .338 NM IR-DIM 예광탄 + .338구경 노르마 매그넘 IR-DIM 예광탄 .338 NM 低視紅外曳光彈 - .338 NM 低视红外曳光弹 + .338 NM 红外曳光 .338 NM IR-DIM @@ -1324,9 +1382,9 @@ Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartuchos: 130<br />Usado em: SPMG 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구경 노르마 매그넘 IR-DIM 예광탄<br/>장탄수: 130<br/>사용처: LWMMG 口徑: .338 拉普麥格農 低視度紅外線曳光彈<br />發數: 130<br />使用於: SPMG - 口径: .338 Norma Magnum 低视度红外线曳光弹<br />发数: 130<br />使用于: SPMG + 口径:.338 Norma Magnum 红外曳光<br />发数:130<br />使用于:SPMG Kalibre: .338 Norma Magnum Tracer IR-DIM<br />Mermi: 130<br />Kullanıyor: SPMG @@ -1341,9 +1399,9 @@ Cinto de munição .338 NM com 130 cartuchos AP .338 NM 130-lövedékes páncéltörő heveder .338 NM 130発入り 徹甲弾ベルト - 130발들이 .338 NM 철갑탄 벨트 + 130발 들이 .338구경 노르마 매그넘 철갑탄 벨트 .338 拉普麥格農(NM) 130發 穿甲彈 彈鏈 - .338 NM 130发 穿甲弹 弹链 + .338 NM 130发 弹链(穿甲) .338 NM 130Rnd AP Belt @@ -1358,9 +1416,9 @@ .338 NM AP .338 NM páncéltörő .338 NM 徹甲弾 - .338 NM 철갑탄 + .338구경 노르마 매그넘 철갑탄 .338 NM 穿甲彈 - .338 NM 穿甲弹 + .338 NM 穿甲 .338 NM AP @@ -1375,9 +1433,9 @@ Calibre: .338 Norma Magnum AP<br />Cartuchos: 130<br />Usado em: SPMG 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구경 노르마 매그넘 철갑탄<br/>장탄수: 130<br/>사용처: LWMMG 口徑: .338 拉普麥格農 穿甲彈<br />發數: 130<br />使用於: SPMG - 口径: .338 Norma Magnum 穿甲弹<br />发数: 130<br />使用于: SPMG + 口径:.338 Norma Magnum 穿甲<br />发数:130<br />使用于:SPMG Kalibre: .338 Norma Magnum AP<br />Mermi: 130<br />Kullanıyor: SPMG @@ -1393,9 +1451,9 @@ Carregador de 10 cartuchos 9.3 mm traçantes 9,3 mm 10-lövedékes nyomkövető tár 9.3 mm 10発入り 曳光弾 弾倉 - 10발들이 9.3 mm 예광탄 탄창 + 10발 들이 9.3 mm 예광탄 탄창 9.3毫米 10發 曳光彈 彈匣 - 9.3 mm 10发 曳光弹 弹匣 + 9.3 mm 10发 弹匣(曳光) 9.3 mm 10Rnd Tracer Mag @@ -1410,9 +1468,9 @@ 9.3 mm Traçante 9,3 mm nyomkövető 9.3 mm 曳光弾 - 9.3 mm 예광탄 + 9.3mm 예광탄 9.3毫米 曳光彈 - 9.3 mm 曳光弹 + 9.3 mm 曳光 9.3 mm Tracer @@ -1427,9 +1485,9 @@ Calibre: 9.3x64 mm Traçante<br />Cartuchos: 10<br />Usado em: Cyrus Kaliber: 9,3x64 mm nyomkövető<br />Lövedékek: 10<br />Használható: Cyrus 口径: 9.3x64 mm 曳光弾<br />装填数: 10<br />次で使用: Cyrus - 구경: 9.3x64 mm 예광탄<br />장탄수: 10<br />사용처: Cyrus + 구경: 9.3x64mm 예광탄<br/>장탄수: 10<br/>사용처: 사이러스 口徑: 9.3x64毫米 曳光彈<br />發數: 10<br />使用於: Cyrus - 口径: 9.3x64 mm 曳光弹<br />发数: 10<br />使用于: Cyrus + 口径:9.3x64 mm 曳光<br />发数:10<br />使用于:"居鲁士" Kalibre: 9.3x64 mm Tracer<br />Mermi: 10<br />Kullanıyor: Cyrus @@ -1444,9 +1502,9 @@ Carregador de 10 cartuchos 9.3 mm traçantes IR-DIM 9,3 mm 10-lövedékes infravörös nyomkövető tár 9.3 mm 10発入り IR-DIM曳光弾 弾倉 - 10발들이 9.3 mm IR-DIM 예광탄 탄창 + 10발들이 9.3mm IR-DIM 예광탄 탄창 9.3毫米 10發 低視度紅外線曳光彈 彈匣 - 9.3 mm 10发 低视度红外线曳光弹 弹匣 + 9.3 mm 10发 弹匣(红外曳光) 9.3 mm 10Rnd Tracer IR-DIM Mag @@ -1461,9 +1519,9 @@ 9.3 mm IR-DIM 9,3 mm infravörös nyomkövető 9.3 mm IR-DIM曳光弾 - 9.3 mm IR-DIM 예광탄 + 9.3mm IR-DIM 예광탄 9.3毫米 低視紅外曳光彈 - 9.3 mm 低视红外曳光弹 + 9.3 mm 红外曳光 9.3 mm IR-DIM @@ -1478,9 +1536,9 @@ Calibre: 9.3x64 mm Traçante IR-DIM<br />Cartuchos: 10<br />Usado em: Cyrus Kaliber: 9,3x64 mm infravörös nyomkövető<br />Lövedékek: 10<br /> Használható: Cyrus 口径: 9.3x64 mm IR-DIM曳光弾<br />装填数: 10<br />次で使用: Cyrus - 구경: 9.3x64 mm IR-DIM 예광탄<br />장탄수: 10<br />사용처: Cyrus + 구경: 9.3x64mm IR-DIM 예광탄<br/>장탄수: 10<br/>사용처: 사이러스 口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 10<br />使用於: Cyrus - 口径: 9.3x64 mm 低视度红外线曳光弹<br />发数: 10<br />使用于: Cyrus + 口径:9.3x64 mm 红外曳光<br />发数:10<br />使用于:"居鲁士" Kalibre: 9.3x64 mm Tracer IR-DIM<br />Mermi: 10<br />Kullanıyor: Cyrus @@ -1496,9 +1554,9 @@ Cinto de munição traçante 9.3 mm com 150 cartuchos 9,3 mm 150-lövedékes nyomkövető heveder 9.3 mm 150発入り 曳光弾ベルト - 150발들이 9.3 mm 예광탄 벨트 + 150발 들이 9.3mm 예광탄 벨트 9.3毫米 150發 曳光彈 彈鏈 - 9.3 mm 150发 曳光弹 弹链 + 9.3 mm 150发 弹链(曳光) 9.3 mm 150Rnd Tracer Belt @@ -1513,9 +1571,9 @@ 9.3 mm Traçante 9,3 mm nyomkövető 9.3 mm 曳光弾 - 9.3 mm 예광탄 + 9.3mm 예광탄 9.3毫米 曳光彈 - 9.3 mm 曳光弹 + 9.3 mm 曳光 9.3 mm Tracer @@ -1530,9 +1588,9 @@ Calibre: 9.3x64 mm Traçante<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64 mm nyomkövető<br />Lövedékek: 150<br />Használható: Navid 口径: 9.3x64 mm 曳光弾<br />装填数: 150<br />次で使用: Navid - 구경: 9.3x64 mm 예광탄<br />장탄수: 150<br />사용처: Navid + 구경: 9.3x64mm 예광탄<br/>장탄수: 150<br/>사용처: HK121 口徑: 9.3x64m毫米 曳光彈<br />發數: 150<br />使用於: Navid - 口径: 9.3x64 mm 曳光弹<br />发数: 150<br />使用于: Navid + 口径:9.3x64 mm 曳光<br />发数:150<br />使用于:Navid Kalibre: 9.3x64 mm Tracer<br />Mermi: 150<br />Kullanıyor: Navid @@ -1547,9 +1605,9 @@ Cinto de munição traçante 9.3 mm IR-DIM com 150 cartuchos 9,3 mm 150-lövedékes infravörös nyomkövető heveder 9.3 mm 150発入り IR-DIM曳光弾ベルト - 150발들이 9.3 mm IR-DIM 예광탄 벨트 + 150발들이 9.3mm IR-DIM 예광탄 벨트 9.3毫米 150發 低視度紅外線曳光彈 彈鏈 - 9.3 mm 150发 低视度红外线曳光弹 弹链 + 9.3 mm 150发 弹链(红外曳光) 9.3 mm 150Rnd Tracer IR-DIM Belt @@ -1564,9 +1622,9 @@ 9.3 mm IR-DIM 9,3 mm infravörös nyomkövető 9.3 mm IR-DIM曳光弾 - 9.3 mm IR-DIM 예광탄 + 9.3mm IR-DIM 예광탄 9.3毫米 低視紅外曳光彈 - 9.3 mm 低视红外曳光弹 + 9.3 mm 红外曳光 9.3 mm IR-DIM @@ -1581,9 +1639,9 @@ Calibre: 9.3x64 mm Traçante IR-DIM<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64 mm infravörös nyomkövető<br />Lövedékek: 150<br />Használható: Navid 口径: 9.3x64 mm IR-DIM曳光弾<br />装填数: 150<br />次で使用: Navid - 구경: 9.3x64 mm IR-DIM 예광탄<br />장탄수: 150<br />사용처: Navid + 구경: 9.3x64mm IR-DIM 예광탄<br/>장탄수: 150<br/>사용처: HK121 口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 150<br />使用於: Navid - 口径: 9.3x64 mm 低视度红外线曳光弹<br />发数: 150<br />使用于: Navid + 口径:9.3x64 mm 红外曳光<br />发数:150<br />使用于:Navid Kalibre: 9.3x64 mm Tracer IR-DIM<br />Mermi: 150<br />Kullanıyor: Navid @@ -1598,9 +1656,9 @@ Cinto de munição 9.3 mm AP com 150 cartuchos 9,3 mm 150-lövedékes páncéltörő heveder 9.3 mm 150発入り 徹甲弾ベルト - 150발들이 9.3 mm 철갑탄 벨트 + 150발들이 9.3mm 철갑탄 벨트 9.3毫米 150發 穿甲彈 彈鏈 - 9.3 mm 150发 穿甲弹 弹链 + 9.3 mm 150发 弹链(穿甲) 9.3 mm 150Rnd AP Belt @@ -1615,9 +1673,9 @@ 9.3 mm AP 9,3 mm páncéltörő 9.3 mm 徹甲弾 - 9.3 mm 철갑탄 + 9.3mm 철갑탄 9.3毫米 穿甲彈 - 9.3 mm 穿甲弹 + 9.3 mm 穿甲 9.3 mm AP @@ -1632,9 +1690,9 @@ Calibre: 9.3x64 mm AP<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64 mm páncéltörő<br />Lövedékek: 150<br />Használható: Navid 口径: 9.3x64 mm 徹甲弾<br />装填数: 150<br />次で使用: Navid - 구경: 9.3x64 mm 철갑탄<br />장탄수: 150<br />사용처: Navid + 구경: 9.3x64mm 철갑탄<br/>장탄수: 150<br/>사용처: HK121 口徑: 9.3x64毫米 穿甲彈<br />發數: 150<br />使用於: Navid - 口径: 9.3x64 mm 穿甲弹<br />发数: 150<br />使用于: Navid + 口径:9.3x64 mm 穿甲<br />发数:150<br />使用于:Navid Kalibre: 9.3x64 mm AP<br />Mermi: 150<br />Kullanıyor: Navid @@ -1649,7 +1707,7 @@ Carregador de 16 cartuchos 9x19 mm 9x19 mm 16-lövedékes tár 9x19 mm 16発入り 弾倉 - 16발들이 9x19 mm 탄창 + 16발들이 9x19mm 탄창 9x19毫米 16發 彈匣 9x19 mm 16发 弹匣 9x19 mm 16Rnd Mag @@ -1666,7 +1724,7 @@ 9x19 mm 9x19 mm 9x19 mm - 9x19 mm + 9x19mm 9x19毫米 9x19 mm 9x19 mm @@ -1683,7 +1741,7 @@ Carregador de 16 cartuchos 9x19 mm 9x19 mm 16-lövedékes tár 9x19 mm 30発入り 弾倉 - 30발들이 9x19 mm 탄창 + 30발 들이 9x19mm 탄창 9x19毫米 30發 彈匣 9x19 mm 30发 弹匣 9x19 mm 30Rnd Mag @@ -1700,7 +1758,7 @@ Carregador de 30 cartuchos 9x19 mm 9x19 mm 30-lövedékes tár 9x19 mm 30発入り 弾倉 - 30발들이 9x19 mm 탄창 + 30발 들이 9x19mm 탄창 9x19毫米 30發 彈匣 9x19 mm 30发 弹匣 9x19 mm 30Rnd Mag @@ -1717,7 +1775,7 @@ 9x19 mm 9x19 mm 9x19 mm - 9x19 mm + 9x19mm 9x19毫米 9x19 mm 9x19 mm @@ -1734,7 +1792,7 @@ Carregador de 30 cartuchos 9x19 mm 9x19 mm 30-lövedékes tár 9x19 mm 30発入り 弾倉 - 30발들이 9x19 mm 탄창 + 30발 들이 9x19mm 탄창 9x19毫米 30發 彈匣 9x19 mm 30发 弹匣 9x19 mm 30Rnd Mag @@ -1751,9 +1809,9 @@ Carregador com 10 cartuchos 7.62x54 mm Traçante 7,62x54 mm 10-lövedékes nyomkövető tár 7.62x54 mm 10発入り 曳光弾 弾倉 - 10발들이 7.62x54 mm 예광탄 탄창 + 10발 들이 7.62x54mm 예광탄 탄창 7.62x54毫米 10發 曳光彈 彈匣 - 7.62x54 mm 10发 曳光弹 弹匣 + 7.62x54 mm 10发 弹匣(曳光) 7.62x54 mm 10Rnd Tracer Mag @@ -1768,7 +1826,7 @@ 7.62 mm 7,62 mm 7.62 mm - 7.62 mm + 7.62mm 7.62毫米 7.62 mm 7.62 mm @@ -1785,9 +1843,9 @@ Carregador com 10 cartuchos 7.62x54 mm Traçante 7,62x54 mm 10-lövedékes nyomkövető tár 7.62x54 mm 10発入り 曳光弾 弾倉 - 10발들이 7.62x54 mm 예광탄 탄창 + 10발 들이 7.62x54mm 예광탄 탄창 7.62x54毫米 10發 曳光彈 彈匣 - 7.62x54 mm 10发 曳光弹 弹匣 + 7.62x54 mm 10发 弹匣(曳光) 7.62x54 mm 10Rnd Tracer Mag @@ -1802,9 +1860,9 @@ Carregador com 100 cartuchos 6.5 mm IR-DIM Traçante 6,5 mm 100-lövedékes infravörös nyomkövető tár 6.5 mm 100発入り IR-DIM曳光弾 弾倉 - 100발들이 6.5 mm IR-DIM 예광탄 탄창 + 100발 들이 6.5mm IR-DIM 예광탄 탄창 6.5毫米 100發 低視度紅外線曳光彈 彈匣 - 6.5 mm 100发 低视度红外线曳光弹 弹匣 + 6.5 mm 100发 弹匣(红外曳光) 6.5 mm 100Rnd Tracer IR-DIM Mag @@ -1819,9 +1877,9 @@ 6.5 mm IR-DIM 6,5 mm infravörös nyomkövető 6.5 mm IR-DIM曳光弾 - 6.5 mm IR-DIM 예광탄 + 6.5mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -1836,9 +1894,9 @@ Carregador 6.5 mm 100 Cartuchos Traçantes IR-DIM<br />Cartuchos: 100<br />Usado em: MX LSW 6.5 mm 100-lövedékes infravörös nyomkövető tár<br />Lövedékek: 100<br />Használható: MX LSW 6.5 mm 100発入り IR-DIM曳光弾 弾倉<br />装填数: 100<br />次で使用: MX LSW - 100발들이 6.5 mm IR-DIM 예광탄 탄창<br />장탄수: 100<br />사용처: MX LSW + 6.5mm IR-DIM 예광탄<br/>장탄수: 100<br/>사용처: MX LSW 6.5毫米 100發 低視度紅外線曳光彈<br />發數: 100<br />使用於: MX LSW - 6.5 mm 100发 低视度红外线曳光弹<br />发数: 100<br />使用于: MX LSW + 口径:6.5 mm 100发 红外曳光<br />发数:100<br />使用于:MX LSW 6.5 mm 100Rnd Tracer IR-DIM Mag<br />Mermi: 100<br />Kullanıyor: MX LSW @@ -1853,9 +1911,9 @@ Cinto de munição traçante 6.5 mm IR-DIM com 200 cartuchos 6,5 mm 200-lövedékes infravörös nyomkövető heveder 6.5 mm 200発入り IR-DIM曳光弾ベルト - 200발들이 6.5 mm IR-DIM 예광탄 탄창 + 200발 들이 6.5mm IR-DIM 예광탄 탄창 6.5毫米 200發 低視度紅外線曳光彈 彈鏈 - 6.5 mm 200发 低视度红外线曳光弹 弹链 + 6.5 mm 200发 弹链(红外曳光) 6.5 mm 200Rnd Belt Tracer (IR-DIM) @@ -1870,9 +1928,9 @@ 6.5 mm IR-DIM 6,5 mm infravörös nyomkövető 6.5 mm IR-DIM曳光弾 - 6.5 mm IR-DIM 예광탄 + 6.5mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -1887,9 +1945,9 @@ Cinto de munição traçante 6.5 mm IR-DIM com 200 cartuchos<br />Cartuchos: 200<br />Usado em: Stoner 99 LMG 6.5 mm 200-lövedékes infravörös nyomkövető heveder<br />Lövedékek: 200<br />Használható: Stoner 99 LMG 6.5 mm 200発入り IR-DIM曳光弾ベルト<br />装填数: 200<br />次で使用: Stoner 99 LMG - 200발들이 6.5 mm IR-DIM 예광탄 벨트<br />장탄수: 200<br />사용처: Stoner 99 LMG + 200발 들이 6.5mm IR-DIM 예광탄 벨트<br/>장탄수: 200<br/>사용처: 스토너 99 LMG 6.5毫米 200發 低視度紅外線曳光彈<br />發數: 200<br />使用於: Stoner 99 重機槍 - 6.5 mm 200发 低视度红外线曳光弹<br />发数: 200<br />使用于: Stoner 99 LMG + 口径:6.5 mm 200发 红外曳光<br />发数:200<br />使用于:Stoner 99 LMG 6.5 mm 200Rnd Belt Tracer (IR-DIM)<br />Mermi: 200<br />Kullanıyor: Stoner 99 LMG @@ -1904,9 +1962,9 @@ Carregador 5.56 mm com 30 cartuchos (Mk262) 5,56 mm 30-lövedékes tár (Mk262) 5.56 mm 30発入り 弾倉 (Mk262) - 30발들이 5.56 mm 탄창 (Mk262) + 30발 들이 5.56mm 탄창 (Mk.262) 5.56毫米 30發 彈匣 (Mk262 狙擊專用彈) - 5.56 mm 30发 弹匣 (Mk262 狙击专用弹) + 5.56 mm 30发 弹匣(Mk262) 5.56 mm 30Rnd Mag (Mk262) @@ -1921,9 +1979,9 @@ 5.56 mm Mk262 5,56 mm Mk262 5.56 mm Mk262 - 5.56 mm Mk262 + 5.56mm Mk.262 5.56毫米 Mk262 狙擊專用彈 - 5.56 mm Mk262 狙击专用弹 + 5.56 mm Mk262 5.56 mm Mk262 @@ -1938,9 +1996,9 @@ Calibre: 5.56x45 mm NATO (Mk262)<br/>Cartuchos: 30 Kaliber: 5,56x45 mm NATO (Mk262)<br />Lövedékek: 30 口径: 5.56x45 mm NATO (Mk262)<br />装填数: 30 - 구경: 5.56x45 mm NATO (Mk262)<br />장탄수: 30 + 구경: 5.56x45mm NATO (Mk.262)<br/>장탄수: 30 口徑: 5.56x45毫米 NATO標準 (Mk262 狙擊專用彈)<br />發數: 30 - 口径: 5.56x45 mm NATO标准 (Mk262 狙击专用弹)<br />发数: 30 + 口径:5.56x45 mm 北约(Mk262 狙击专用弹)<br />发数:30 Kalibre: 5.56x45 mm NATO (Mk262)<br />Mermi: 30 @@ -1955,9 +2013,9 @@ Carregador 5.56 mm com 30 cartuchos (Mk318) 5,56 mm 30-lövedékes tár (Mk318) 5.56 mm 30発入り 弾倉 (Mk318) - 30발들이 5.56 mm 탄창 (Mk318) + 30발들이 5.56mm 탄창 (Mk.318) 5.56毫米 30發 彈匣 (Mk318 特戰專用彈) - 5.56 mm 30发 弹匣 (Mk318 特战专用弹) + 5.56 mm 30发 弹匣(Mk318) 5.56 mm 30Rnd Mag (Mk318) @@ -1972,9 +2030,9 @@ 5.56 mm Mk318 5,56 mm Mk318 5.56 mm Mk318 - 5.56 mm Mk318 + 5.56mm Mk.318 5.56毫米 Mk318 特戰專用彈 - 5.56 mm Mk318 特战专用弹 + 5.56 mm Mk318 5.56 mm Mk318 @@ -1989,9 +2047,9 @@ Calibre: 5.56x45 mm NATO (Mk318)<br/>Cartuchos: 30 Kaliber: 5,56x45 mm NATO (Mk318)<br />Lövedékek: 30 口径: 5.56x45 mm NATO (Mk318)<br />装填数: 30 - 구경: 5.56x45 mm NATO (Mk318)<br />장탄수: 30 + 구경: 5.56x45mm NATO (Mk.318)<br/>장탄수: 30 口徑: 5.56x45毫米 NATO標準 (Mk318 特戰專用彈)<br />發數: 30 - 口径: 5.56x45 mm NATO标准 (Mk318 特战专用弹)<br />发数: 30 + 口径:5.56x45 mm 北约(Mk318 特战专用弹)<br />发数:30 Kalibre: 5.56x45 mm NATO (Mk318)<br />Mermi: 30 @@ -2006,9 +2064,9 @@ Carregador 5.56 mm com 30 cartuchos (M995 AP) 5,56 mm 30-lövedékes tár (M995 páncéltörő) 5.56 mm 30発入り 弾倉 (M995 徹甲弾) - 30발들이 5.56 mm 탄창 (Mk995 철갑탄) + 30발 들이 5.56mm 탄창 (M995 철갑탄) 5.56毫米 30發 彈匣 (M995 穿甲彈) - 5.56 mm 30发 弹匣 (M995 穿甲弹) + 5.56 mm 30发 弹匣(M995 穿甲) 5.56 mm 30Rnd Mag (M995 AP) @@ -2023,9 +2081,9 @@ 5.56 mm M995 AP 5,56 mm páncéltörő 5.56 mm 徹甲弾 - 5.56 mm 철갑탄 + 5.56mm 철갑탄 5.56毫米 M995 穿甲彈 - 5.56 mm M995 穿甲弹 + 5.56 mm 穿甲 5.56 mm AP @@ -2040,9 +2098,9 @@ Calibre: 5.56x45 mm NATO (M995 AP)<br/>Cartuchos: 30 Kaliber: 5,56x45 mm NATO (M995 páncéltörő)<br />Lövedékek: 30 口径: 5.56x45 mm NATO (M995 徹甲弾)<br />装填数: 30 - 구경: 5.56x45 mm NATO (Mk995 철갑탄)<br />장탄수: 30 + 구경: 5.56x45mm NATO (M995 철갑탄)<br/>장탄수: 30 口徑: 5.56x45毫米 NATO標準 (M995 穿甲彈)<br />發數: 30 - 口径: 5.56x45 mm NATO标准 (M995 穿甲弹)<br />发数: 30 + 口径:5.56x45 mm 北约(M995 穿甲)<br />发数:30 Kalibre: 5.56x45 mm NATO (M995 AP)<br />Mermi: 30 @@ -2057,9 +2115,9 @@ Carregador 7.62 mm com 10 cartuchos (M118LR) 7,62 mm 10-lövedékes tár (M118LR) 7.62 mm 10発入り 弾倉 (M118LR) - 10발들이 7.62 mm 탄창 (M118LR) + 10발 들이 7.62mm 탄창 (M118LR) 7.62毫米 10發 彈匣 (M118LR 狙擊專用彈) - 7.62 mm 10发 弹匣 (M118LR 狙击专用弹) + 7.62 mm 10发 弹匣(M118LR) 7.62 mm 10Rnd Mag (M118LR) @@ -2074,9 +2132,9 @@ 7.62 mm M118LR 7,62 mm M118LR 7.62 mm M118LR - 7.62 mm M118LR + 7.62mm M118LR 7.62m毫米 M118LR 狙擊專用彈 - 7.62 mm M118LR 狙击专用弹 + 7.62 mm M118LR 7.62 mm M118LR @@ -2091,9 +2149,9 @@ Calibre: 7.26x51 mm NATO (M118LR)<br/>Cartuchos: 10 Kaliber: 7,62x51 mm NATO (M118LR)<br />Lövedékek: 10 口径: 7.62x51 mm NATO (M118LR)<br />装填数: 10 - 구경: 7.62x51 mm NATO (M118LR)<br />장탄수: 10 + 구경: 7.62x51mm NATO (M118LR)<br/>장탄수: 10 口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (M118LR 狙击专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(M118LR 狙击专用弹)<br />发数:10 Kalibre: 7.62x51 mm NATO (M118LR)<br />Mermi: 10 @@ -2108,9 +2166,9 @@ Carregador 7.62 mm com 20 cartuchos (M118LR) 7,62 mm 20-lövedékes tár (M118LR) 7.62 mm 20発入り 弾倉 (M118LR) - 20발들이 7.62 mm 탄창 (M118LR) + 20발 들이 7.62mm 탄창 (M118LR) 7.62毫米 20發 彈匣 (M118LR 狙擊專用彈) - 7.62 mm 20发 弹匣 (M118LR 狙击专用弹) + 7.62 mm 20发 弹匣(M118LR) 7.62 mm 20Rnd Mag (M118LR) @@ -2125,9 +2183,9 @@ 7.62 mm M118LR 7,62 mm M118LR 7.62 mm M118LR - 7.62 mm M118LR + 7.62mm M118LR 7.62毫米 M118LR 狙擊專用彈 - 7.62 mm M118LR 狙击专用弹 + 7.62 mm M118LR 7.62 mm M118LR @@ -2142,9 +2200,9 @@ Calibre: 7.26x51 mm NATO (M118LR)<br/>Cartuchos: 20 Kaliber: 7,62x51 mm NATO (M118LR)<br />Lövedékek: 20 口径: 7.62x51 mm NATO (M118LR)<br />装填数: 20 - 구경: 7.62x51 mm NATO (M118LR)<br />장탄수: 20 + 구경: 7.62x51mm NATO (M118LR)<br/>장탄수: 20 口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (M118LR 狙击专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(M118LR 狙击专用弹)<br />发数:20 Kalibre: 7.62x51 mm NATO (M118LR)<br />Mermi: 20 @@ -2159,9 +2217,9 @@ Carregador 7.62 mm com 10 cartuchos (Mk316 Mod 0) 7,62 mm 10-lövedékes tár (Mk316 Mod 0) 7.62 mm 10発入り 弾倉 (Mk316 Mod 0) - 10발들이 7.62 mm 탄창 (Mk316 Mod 0) + 10발 들이 7.62mm 탄창 (Mk.316 Mod 0) 7.62毫米 10發 彈匣 (Mk316 Mod 0 狙擊專用彈) - 7.62 mm 10发 弹匣 (Mk316 Mod 0 狙击专用弹) + 7.62 mm 10发 弹匣(Mk316 Mod 0) 7.62 mm 10Rnd Mag (Mk316 Mod 0) @@ -2176,9 +2234,9 @@ 7.62 mm Mk316 7,62 mm Mk316 7.62 mm Mk316 - 7.62 mm Mk316 + 7.62mm Mk.316 7.62毫米 Mk316 狙擊專用彈 - 7.62 mm Mk316 狙击专用弹 + 7.62 mm Mk316 7.62 mm Mk316 @@ -2193,9 +2251,9 @@ Calibre: 7.26x51 mm NATO (Mk316 Mod 0)<br/>Cartuchos: 10 Kaliber: 7,62x51 mm NATO (Mk316 Mod 0)<br />Lövedékek: 10 口径: 7.62x51 mm NATO (Mk316 Mod 0)<br />装填数: 10 - 구경: 7.62x51 mm NATO (Mk316 Mod 0)<br />장탄수: 10 + 구경: 7.62x51mm NATO (Mk.316 Mod 0)<br/>장탄수: 10 口徑: 7.62x51毫米 NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (Mk316 Mod 0 狙击专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(Mk316 Mod 0 狙击专用弹)<br />发数:10 Kalibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Mermi: 10 @@ -2210,9 +2268,9 @@ Carregador 7.62 mm com 20 cartuchos (Mk316 Mod 0) 7,62 mm 20-lövedékes tár (Mk316 Mod 0) 7.62 mm 20発入り 弾倉 (Mk316 Mod 0) - 20발들이 7.62 mm 탄창 (Mk316 Mod 0) + 20발 들이 7.62mm 탄창 (Mk.316 Mod 0) 7.62毫米 20發 彈匣 (Mk316 Mod 0 狙擊專用彈) - 7.62 mm 20发 弹匣 (Mk316 Mod 0 狙击专用弹) + 7.62 mm 20发 弹匣(Mk316 Mod 0) 7.62 mm 20Rnd Mag (Mk316 Mod 0) @@ -2227,9 +2285,9 @@ 7.62 mm Mk316 7,62 mm Mk316 7.62 mm Mk316 - 7.62 mm Mk316 + 7.62mm Mk.316 7.62毫米 Mk316 狙擊專用彈 - 7.62 mm Mk316 狙击专用弹 + 7.62 mm Mk316 7.62 mm Mk316 @@ -2244,9 +2302,9 @@ Calibre: 7.26x51 mm NATO (Mk316 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51 mm NATO (Mk316 Mod 0)<br />Lövedékek: 20 口径: 7.62x51 mm NATO (Mk316 Mod 0)<br />装填数: 20 - 구경: 7.62x51 mm NATO (Mk316 Mod 0)<br />장탄수: 20 + 구경: 7.62x51mm NATO (Mk.316 Mod 0)<br/>장탄수: 20 口徑: 7.62x51毫米 NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (Mk316 Mod 0 狙击专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(Mk316 Mod 0 狙击专用弹)<br />发数:20 Kalibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Mermi: 20 @@ -2261,9 +2319,9 @@ Carregador 7.62 mm com 10 cartuchos (Mk319 Mod 0) 7,62 mm 10-lövedékes tár (Mk319 Mod 0) 7.62 mm 10発入り 弾倉 (Mk319 Mod 0) - 10발들이 7.62 mm 탄창 (Mk319 Mod 0) + 10발들이 7.62mm 탄창 (Mk.319 Mod 0) 7.62毫米 10發 彈匣 (Mk319 Mod 0 特戰專用彈) - 7.62 mm 10发 弹匣 (Mk319 Mod 0 特战专用弹) + 7.62 mm 10发 弹匣(Mk319 Mod 0) 7.62 mm 10Rnd Mag (Mk319 Mod 0) @@ -2278,9 +2336,9 @@ 7.62 mm Mk319 7,62 mm Mk319 7.62 mm Mk319 - 7.62 mm Mk319 + 7.62mm Mk.319 7.62毫米 Mk319 特戰專用彈 - 7.62 mm Mk319 特战专用弹 + 7.62 mm Mk319 7.62 mm Mk319 @@ -2295,9 +2353,9 @@ Calibre: 7.26x51 mm NATO (Mk319 Mod 0)<br/>Cartuchos: 10 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Lövedékek: 10 口径: 7.62x51 mm NATO (Mk319 Mod 0)<br />装填数: 10 - 구경: 7.62x51 mm NATO (Mk319 Mod 0)<br />장탄수: 10 + 구경: 7.62x51mm NATO (Mk.319 Mod 0)<br/>장탄수: 10 口徑: 7.62x51毫米 NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (Mk319 Mod 0 特战专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(Mk319 Mod 0 特战专用弹)<br />发数:10 Kalibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Mermi: 20 @@ -2312,9 +2370,9 @@ Carregador 7.62 mm com 20 cartuchos (Mk319 Mod 0) 7,62 mm 20-lövedékes tár (Mk319 Mod 0) 7.62 mm 20発入り 弾倉 (Mk319 Mod 0) - 20발들이 7.62 mm 탄창 (Mk319 Mod 0) + 20들이 7.62mm 탄창 (Mk.319 Mod 0) 7.62毫米 20發 彈匣 (Mk319 Mod 0 特戰專用彈) - 7.62 mm 20发 弹匣 (Mk319 Mod 0 特战专用弹) + 7.62 mm 20发 弹匣(Mk319 Mod 0) 7.62 mm 20Rnd Mag (Mk319 Mod 0) @@ -2329,9 +2387,9 @@ 7.62 mm Mk319 7,62 mm Mk319 7.62 mm Mk319 - 7.62 mm Mk319 + 7.62mm Mk.319 7.62毫米 Mk319 特戰專用彈 - 7.62 mm Mk319 特战专用弹 + 7.62 mm Mk319 7.62 mm Mk319 @@ -2346,9 +2404,9 @@ Calibre: 7.26x51 mm NATO (Mk319 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Lövedékek: 20 口径: 7.62x51 mm NATO (Mk319 Mod 0)<br />装填数: 20 - 구경: 7.62x51 mm NATO (Mk319 Mod 0)<br />장탄수: 20 + 구경: 7.62x51mm NATO (Mk.319 Mod 0)<br/>장탄수: 20 口徑: 7.62x51毫米 NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (Mk319 Mod 0 特战专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(Mk319 Mod 0)<br />发数:20 Kalibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Mermi: 20 @@ -2363,9 +2421,9 @@ Carregador 7.62 mm com 10 cartuchos (M993 AP) 7,62 mm 10-lövedékes tár (M993 páncéltörő) 7.62 mm 10発入り 弾倉 (M993 徹甲弾) - 10발들이 7.62 mm 탄창 (M993 철갑탄) + 10발 들이 7.62mm 탄창 (M993 철갑탄) 7.62毫米 10發 彈匣 (M993 穿甲專用彈) - 7.62 mm 10发 弹匣 (M993 穿甲专用弹) + 7.62 mm 10发 弹匣(M993 穿甲) 7.62 mm 10Rnd Mag (M993 AP) @@ -2380,9 +2438,9 @@ 7.62 mm AP 7,62 mm páncéltörő 7.62 mm 徹甲弾 - 7.62 mm 철갑탄 + 7.62mm 철갑탄 7.62毫米 M993 穿甲專用彈 - 7.62 mm M993 穿甲专用弹 + 7.62 mm M993 7.62 mm AP @@ -2397,9 +2455,9 @@ Calibre: 7.26x51 mm NATO (M993 AP)<br/>Cartuchos: 10 Kaliber: 7,62x51 mm NATO (M993 páncéltörő)<br />Lövedékek: 10 口径: 7.62x51 mm NATO (Mk319 Mod 0)<br />装填数: 10 - 구경: 7.62x51 mm NATO (M993 철갑탄)<br />장탄수: 10 + 구경: 7.62x51mm NATO (M993 철갑탄)<br/>장탄수: 10 口徑: 7.62x51毫米 NATO標準 (M993 穿甲專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (M993 穿甲专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(M993 穿甲)<br />发数:10 Kalibre: 7.62x51 mm NATO (M993 AP)<br />Mermi: 10 @@ -2414,9 +2472,9 @@ Carregador 7.62 mm com 20 cartuchos (M993 AP) 7,62 mm 20-lövedékes tár (M993 páncéltörő) 7.62 mm 20発入り 弾倉 (M993 徹甲弾) - 20발들이 7.62 mm 탄창 (M993 철갑탄) + 20발 들이 7.62mm 탄창 (M993 철갑탄) 7.62毫米 20發 彈匣 (M993 穿甲專用彈) - 7.62 mm 20发 弹匣 (M993 穿甲专用弹) + 7.62 mm 20发 弹匣(M993 穿甲) 7.62 mm 20Rnd Mag (M993 AP) @@ -2431,9 +2489,9 @@ 7.62 mm AP 7,62 mm páncéltörő 7.62 mm 徹甲弾 - 7.62 mm 철갑탄 + 7.62mm 철갑탄 7.62毫米 M993 穿甲專用彈 - 7.62 mm M993 穿甲专用弹 + 7.62 mm M993 7.62 mm AP @@ -2448,9 +2506,9 @@ Calibre: 7.26x51 mm NATO (M993 AP)<br/>Cartuchos: 20 Kaliber: 7,62x51 mm NATO (M993 páncéltörő)<br />Lövedékek: 20 口径: 7.62x51 mm NATO (M993 徹甲弾)<br />装填数: 20 - 구경: 7.62x51 mm NATO (M993 철갑탄)<br />장탄수: 20 + 구경: 7.62x51mm NATO (M993 철갑탄)<br/>장탄수: 20 口徑: 7.62x51毫米 NATO標準 (M993 穿甲專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (M993 穿甲专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(M993 穿甲)<br />发数:20 Kalibre: 7.62x51 mm NATO (M993 AP)<br />Mermi: 20 @@ -2465,9 +2523,9 @@ Carregador .300 WM com 20 cartuchos (Mk248 Mod 0) .300 WM 20-lövedékes tár (Mk248 Mod 0) .300 WM 20発入り 弾倉 (Mk248 Mod 0) - 20발들이 .300 WM 탄창 (Mk248 Mod 0) + 20발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 0) .300 萬能(WM) 20發 彈匣 (Mk248 Mod 0 狙擊專用彈) - .300 WM 20发 弹匣 (Mk248 Mod 0 狙击专用弹) + .300 WM 20发 弹匣(Mk248 Mod 0) .300 WM 20Rnd Mag (Mk248 Mod 0) @@ -2482,9 +2540,9 @@ .300 WM Mk248 .300 WM Mk248 .300 WM Mk248 - .300 WM Mk248 + .300구경 윈체스터 매그넘 Mk.248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2499,9 +2557,9 @@ Calibre: .300 WM NATO (Mk248 Mod 0)<br/>Cartuchos: 20 Kaliber: .300 WM NATO (Mk248 Mod 0)<br />Lövedékek: 20 口径: .300 WM NATO (Mk248 Mod 0)<br />装填数: 20 - 구경: .300 WM NATO (Mk248 Mod 0)<br />장탄수: 20 + 구경: .300 윈체스터 매그넘 (Mk.248 Mod 0)<br/>장탄수: 20 口徑: .300 西米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 20 - 口径: .300 WM NATO标准 (Mk248 Mod 0 狙击专用弹)<br />发数: 20 + 口径:.300 WM 北约(Mk248 Mod 0 狙击专用弹)<br />发数:20 Kalibre: .300 WM NATO (Mk248 Mod 0)<br />Mermi: 20 @@ -2516,9 +2574,9 @@ Carregador .300 WM com 20 cartuchos (Mk248 Mod 1) .300 WM 20-lövedékes tár (Mk248 Mod 1) .300 WM 20発入り 弾倉 (Mk248 Mod 1) - 20발들이 .300 WM 탄창 (Mk248 Mod 1) + 20발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 1) .300 西米 20發 彈匣 (Mk248 Mod 1 狙擊專用彈) - .300 WM 20发 弹匣 (Mk248 Mod 1 狙击专用弹) + .300 WM 20发 弹匣(Mk248 Mod 1) .300 WM 20Rnd Mag (Mk248 Mod 1) @@ -2533,9 +2591,9 @@ .300 WM Mk248 .300 WM Mk248 .300 WM Mk248 - .300 WM Mk248 + .300구경 윈체스터 매그넘 Mk.248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2550,9 +2608,9 @@ Calibre: .300 WM NATO (Mk248 Mod 1)<br/>Cartuchos: 20 Kaliber: .300 WM NATO (Mk248 Mod 1)<br />Lövedékek: 20 口径: .300 WM NATO (Mk248 Mod 1)<br />装填数: 20 - 구경: .300 WM NATO (Mk248 Mod 1)<br />장탄수: 20 + 구경: .300구경 윈체스터 매그넘 (Mk.248 Mod 1)<br/>장탄수: 20 口徑: .300 西米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 20 - 口径: .300 WM NATO标准 (Mk248 Mod 1 狙击专用弹)<br />发数: 20 + 口径:.300 WM 北约(Mk248 Mod 1 狙击专用弹)<br />发数:20 Kalibre: .300 WM NATO (Mk248 Mod 1)<br />Mermi: 20 @@ -2567,9 +2625,9 @@ Carregador .300 WM com 20 cartuchos (Berger Hybrid OTM) .300 WM 20-lövedékes tár (Berger Hybrid OTM) .300 WM 20発入り 弾倉 (Berger Hybrid OTM) - 20발들이 .300 WM 탄창 (Berger Hybrid OTM) + 20발 들이 .300구경 윈체스터 매그넘 탄창 (Berger Hybrid OTM) .300 西米 20發 彈匣 (Berger Hybrid 空尖比賽專用彈) - .300 WM 20发 弹匣 (Berger Hybrid 空尖比赛专用弹) + .300 WM 20发 弹匣(Berger Hybrid 空尖) .300 WM 20Rnd Mag (Berger Hybrid OTM) @@ -2584,9 +2642,9 @@ .300 WM OTM .300 WM OTM .300 WM OTM - .300 WM OTM + .300구경 윈체스터 매그넘 OTM .300 西米 空尖比賽專用彈 - .300 WM 空尖比赛专用弹 + .300 WM 空尖 .300 WM OTM @@ -2601,9 +2659,9 @@ Calibre: .300 WM OTM NATO (Berger Hybrid OTM)<br/>Cartuchos: 20 Kaliber: .300 WM NATO (Berger Hybrid OTM)<br />Lövedékek: 20 口径: .300 WM NATO (Berger Hybrid OTM)<br />装填数: 20 - 구경: .300 WM NATO (Berger Hybrid OTM)<br />장탄수: 20 + 구경: .300구경 윈체스터 매그넘 (Berger Hybrid OTM)<br/>장탄수: 20 口徑: .300 西米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 20 - 口径: .300 WM NATO标准 (Berger Hybrid 空尖比赛专用弹)<br />发数: 20 + 口径:.300 WM 北约(Berger Hybrid 空尖)<br />发数:20 Kalibre: .300 WM NATO (Berger Hybrid OTM)<br />Mermi: 20 @@ -2618,9 +2676,9 @@ Carregador .300 WM com 10 cartuchos (Mk248 Mod 0) .300 WM 10-lövedékes tár (Mk248 Mod 0) .300 WM 10発入り 弾倉 (Mk248 Mod 0) - 10발들이 .300 WM 탄창 (Mk248 Mod 0) + 10발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 0) .300 萬能(WM) 10發 彈匣 (Mk248 Mod 0 狙擊專用彈) - .300 WM 10发 弹匣 (Mk248 Mod 0 狙击专用弹) + .300 WM 10发 弹匣(Mk248 Mod 0) .300 WM 10Rnd Mag (Mk248 Mod 0) @@ -2635,9 +2693,9 @@ .300 WM Mk248 .300 WM Mk248 .300 WM Mk248 - .300 WM Mk248 + .300구경 윈체스터 매그넘 Mk.248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2652,9 +2710,9 @@ Calibre: .300 WM NATO (Mk248 Mod 0)<br/>Cartuchos: 10 Kaliber: .300 WM NATO (Mk248 Mod 0)<br />Lövedékek: 10 口径: .300 WM NATO (Mk248 Mod 0)<br />装填数: 10 - 구경: .300 WM NATO (Mk248 Mod 0)<br />장탄수: 10 + 구경: .300구경 윈체스터 매그넘 (Mk.248 Mod 0)<br/>장탄수: 10 口徑: .300 西米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 10 - 口径: .300 WM NATO标准 (Mk248 Mod 0 狙击专用弹)<br />发数: 10 + 口径:.300 WM 北约(Mk248 Mod 0 狙击专用弹)<br />发数:10 Kalibre: .300 WM NATO (Mk248 Mod 0)<br />Mermi: 10 @@ -2669,9 +2727,9 @@ Carregador .300 WM com 10 cartuchos (Mk248 Mod 1) .300 WM 10-lövedékes tár (Mk248 Mod 1) .300 WM 10発入り 弾倉 (Mk248 Mod 1) - 10발들이 .300 WM 탄창 (Mk248 Mod 1) + 10발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 1) .300 西米 10發 彈匣 (Mk248 Mod 1 狙擊專用彈) - .300 WM 10发 弹匣 (Mk248 Mod 1 狙击专用弹) + .300 WM 10发 弹匣(Mk248 Mod 1) .300 WM 10Rnd Mag (Mk248 Mod 1) @@ -2686,9 +2744,9 @@ .300 WM Mk248 .300 WM Mk248 .300 WM Mk248 - .300 WM Mk248 + .300구경 윈체스터 매그넘 Mk.248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2703,9 +2761,9 @@ Calibre: .300 WM NATO (Mk248 Mod 1)<br/>Cartuchos: 10 Kaliber: .300 WM NATO (Mk248 Mod 1)<br />Lövedékek: 10 口径: .300 WM NATO (Mk248 Mod 1)<br />装填数: 10 - 구경: .300 WM NATO (Mk248 Mod 1)<br />장탄수: 10 + 구경: .300구경 윈체스터 매그넘 (Mk.248 Mod 1)<br/>장탄수: 10 口徑: .300 西米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 10 - 口径: .300 WM NATO标准 (Mk248 Mod 1 狙击专用弹)<br />发数: 10 + 口径:.300 WM 北约(Mk248 Mod 1 狙击专用弹)<br />发数:10 Kalibre: .300 WM NATO (Mk248 Mod 1)<br />Mermi: 10 @@ -2720,9 +2778,9 @@ Carregador .300 WM com 10 cartuchos (Berger Hybrid OTM) .300 WM 10-lövedékes tár (Berger Hybrid OTM) .300 WM 10発入り 弾倉 (Berger Hybrid OTM) - 10발들이 .300 WM 탄창 (Berger Hybrid OTM) + 10발 들이 .300구경 윈체스터 매그넘 탄창 (Berger Hybrid OTM) .300 西米 10發 彈匣 (Berger Hybrid 空尖比賽專用彈) - .300 WM 10发 弹匣 (Berger Hybrid 空尖比赛专用弹) + .300 WM 10发 弹匣(Berger Hybrid 空尖) .300 WM 10Rnd Mag (Berger Hybrid OTM) @@ -2737,9 +2795,9 @@ .300 WM OTM .300 WM OTM .300 WM OTM - .300 WM OTM + .300구경 윈체스터 매그넘 OTM .300 西米 空尖比賽專用彈 - .300 WM 空尖比赛专用弹 + .300 WM 空尖 .300 WM OTM @@ -2754,26 +2812,54 @@ Calibre: .300 WM OTM NATO (Berger Hybrid OTM)<br/>Cartuchos: 10 Kaliber: .300 WM NATO (Berger Hybrid OTM)<br />Lövedékek: 10 口径: .300 WM NATO (Berger Hybrid OTM)<br />装填数: 10 - 구경: .300 WM NATO (Berger Hybrid OTM)<br />장탄수: 10 + 구경: .300구경 윈체스터 매그넘 (Berger Hybrid OTM)<br/>장탄수: 10 口徑: .300 西米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 10 - 口径: .300 WM NATO标准 (Berger Hybrid 空尖比赛专用弹)<br />发数: 10 + 口径:.300 WM 北约(Berger Hybrid 空尖)<br />发数:10 Kalibre: .300 WM NATO (Berger Hybrid OTM)<br />Mermi: 10 6.5x47 mm 30Rnd Sand Mag (HPBT Scenar) 6.5x47 mm 30発入り サンド 弾倉 (HPBT Scenar) + Ch. 6,5x47 mm 30Cps Sable (HPBT Scenar) + 6.5x47 mm 30-Patronen-Magazin Sandfarben (HPBT Scenar) + Magazynek 6.5x47 mm 30rd Piaskowy (HPBT Scenar) + 6.5x47 mm 30发 沙色弹匣(HPBT Scenar) + 6.5x47mm 30발 사막 탄창 (HPBT Scenar) + Магазин из 30-ти 6.5x47 мм Песочный (HPBT Scenar) + Cargador de 30 balas de 6.5x47mm Arena (HPBT Scenar) 6.5x47 mm 30Rnd Promet Mag (HPBT Scenar) 6.5x47 mm 30発入り プロメット 弾倉 (HPBT Scenar) + Ch. 6,5x47 mm 30Cps Promet (HPBT Scenar) + 6.5x47 mm 30-Patronen-Magazin für Promet (HPBT Scenar) + Magazynek 6.5x47 mm 30rd Promet (HPBT Scenar) + 6.5x47 mm 30发 Promet 弹匣(HPBT Scenar) + 6.5x47mm 30발 그롯 탄창 (HPBT Scenar) + Магазин из 30-ти 6.5x47 мм Promet (HPBT Scenar) + Cargador de 30 balas de 6.5x47mm Promet (HPBT Scenar) 6.5x47 mm 30Rnd Black Mag (HPBT Scenar) 6.5x47 mm 30発入り ブラック 弾倉 (HPBT Scenar) + Ch. 6,5x47 mm 30Cps Noir (HPBT Scenar) + 6.5x47 mm 30-Patronen-Magazin Schwarz (HPBT Scenar) + Magazynek 6.5x47 mm 30rd Czarny (HPBT Scenar) + 6.5x47 mm 30发 黑色弹匣(HPBT Scenar) + 6.5x47mm 30발 검정 탄창 (HPBT Scenar) + Магазин из 30-ти 6.5x47 мм Чёрный (HPBT Scenar) + Cargador de 30 balas de 6.5x47mm Negro (HPBT Scenar) 6.5x47 mm 30Rnd Khaki Mag (HPBT Scenar) 6.5x47 mm 30発入り カーキ 弾倉 (HPBT Scenar) + Ch. 6,5x47 mm 30Cps Kaki (HPBT Scenar) + 6.5x47 mm 30-Patronen-Magazin Khaki (HPBT Scenar) + Magazynek 6.5x47 mm 30rd Khaki (HPBT Scenar) + 6.5x47 mm 30发 卡其色弹匣(HPBT Scenar) + 6.5x47mm 30발 카키 탄창 (HPBT Scenar) + Магазин из 30-ти 6.5x47 мм Хаки (HPBT Scenar) + Cargador de 30 balas de 6.5x47mm Caqui (HPBT Scenar) 6.5 mm Lapua @@ -2787,9 +2873,9 @@ 6.5 mm Lapua 6,5 mm Lapua 6.5 mm Lapua - 6.5 mm Lapua + 6.5mm 라푸아 6.5毫米 拉普 空尖艇尾狙擊專用彈 - 6.5 mm Lapua 空尖艇尾狙击专用弹 + 6.5 mm Lapua 6.5 mm Lapua @@ -2804,9 +2890,9 @@ Calibre: 6.5x47 mm (HPBT Scenar)<br/>Cartuchos: 30<br/>Usado em: MXM Kaliber: 6,5x47 mm (HPBT Scenar)<br />Lövedékek: 30<br />Használható: MXM 口径: 6.5x47 mm (HPBT Scenar)<br />装填数: 30<br />次で使用: MXM - 구경: 6.5x47 mm (HPBT Scenar)<br />장탄수: 30<br />사용처: MXM + 구경: 6.5x47mm (HPBT Scenar)<br/>장탄수: 30<br/>사용처: MXM 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 30<br />使用於: MXM - 口径: 6.5x47 mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 30<br />使用于: MXM + 口径:6.5x47 mm(HPBT Scenar 狙击专用弹)<br />发数:30<br />使用于:MXM Kalibre: 6.5x47 mm (HPBT Scenar)<br />Mermi: 30<br />Kullanıyor: MXM @@ -2821,26 +2907,54 @@ Calibre: 6.5x47 mm (HPBT Scenar)<br/>Cartuchos: 30<br/>Usado em: Promet MR Kaliber: 6,5x47 mm (HPBT Scenar)<br />Lövedékek: 30<br />Használható: Promet MR 口径: 6.5x47 mm (HPBT Scenar)<br />装填数: 30<br />次で使用: Promet MR - 구경: 6.5x47 mm (HPBT Scenar)<br />장탄수: 30<br />사용처: Promet MR + 구경: 6.5x47mm (HPBT Scenar)<br/>장탄수: 30<br/>사용처: MSBS 그롯/GL/MR/SG 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 30<br />使用於: Promet MR - 口径: 6.5x47 mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 30<br />使用于: Promet MR + 口径:6.5x47 mm(HPBT Scenar 狙击专用弹)<br />发数:30<br />使用于:Promet MR Kalibre: 6.5x47 mm (HPBT Scenar)<br />Mermi: 30<br />Kullanıyor: Promet MR 6.5 mm Creedmor 30Rnd Sand Mag 6.5 mm クリードモア 30発入り サンド 弾倉 + Ch. 6,5 mm Creedmor 30Cps Sable + 6.5 mm Creedmor 30-Patronen-Magazin Sandfarben + Magazynek 6.5 mm Creedmor 30Rnd Piaskowy + 6.5 mm 30发 沙色弹匣(Creedmor) + 6.5mm 크리드무어 30발 사막 탄창 + Магазин из 30-ти 6.5 мм Creedmor Песочный + Cargador de 30 balas de 6.5mm Creedmor Arena 6.5 mm Creedmor 30Rnd Promet Mag 6.5 mm クリードモア 30発入り プロメット 弾倉 + Ch. 6,5 mm Creedmor 30Cps Promet + 6.5 mm Creedmor 30-Patronen-Magazin für Promet + Magazynek 6.5 mm Creedmor 30Rnd Promet + 6.5 mm 30发 Promet 弹匣(Creedmor) + 6.5mm 크리드무어 30발 프로멧 탄창 + Магазин из 30-ти 6.5 мм Creedmor Promet + Cargador de 30 balas de 6.5mm Creedmor Promet 6.5 mm Creedmor 30Rnd Black Mag 6.5 mm クリードモア 30発入り ブラック 弾倉 + Ch. 6,5 mm Creedmor 30Cps Noir + 6.5 mm Creedmor 30-Patronen-Magazin Schwarz + Magazynek 6.5 mm Creedmor 30Rnd Czarny + 6.5 mm 30发 黑色弹匣(Creedmor) + 6.5mm 크리드무어 30발 검정 탄창 + Магазин из 30-ти 6.5 мм Creedmor Чёрный + Cargador de 30 balas de 6.5mm Creedmor Negro 6.5 mm Creedmor 30Rnd Khaki Mag 6.5 mm クリードモア 30発入り カーキ 弾倉 + Ch. 6,5 mm Creedmor 30Cps Kaki + 6.5 mm Creedmor 30-Patronen-Magazin Khaki + Magazynek 6.5 mm Creedmor 30Rnd Khaki + 6.5 mm 30发 卡其色弹匣(Creedmor) + 6.5mm 크리드무어 30발 카키 탄창 + Магазин из 30-ти 6.5 мм Creedmor Хаки + Cargador de 30 balas de 6.5mm Creedmor Caqui 6.5 mm CM @@ -2854,9 +2968,9 @@ 6.5 mm CM 6,5 mm CM 6.5 mm CM - 6.5 mm CM + 6.5mm 크리드무어 6.5毫米 CM狙擊專用彈 - 6.5 mm CM 狙击专用弹 + 6.5 mm CM 6.5 mm CM @@ -2871,9 +2985,9 @@ Calibre: 6.5x47 mm Creedmor<br/>Cartuchos: 30<br/>Usado em: MXM Kaliber: 6,5x47 mm Creedmor<br />Lövedékek: 30<br />Használható: MXM 口径: 6.5x47 mm Creedmor<br />装填数: 30<br />次で使用: MXM - 구경: 6.5x47 mm Creedmor<br />장탄수: 30<br />사용처: MXM + 구경: 6.5x47mm 크리드무어<br/>장탄수: 30<br/>사용처: MXM 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 30<br />使用於: MXM - 口径: 6.5x47 mm Creedmor 狙击专用弹<br />发数: 30<br />使用于: MXM + 口径:6.5x47 mm Creedmor 狙击专用弹<br />发数:30<br />使用于:MXM Kalibre: 6.5x47 mm Creedmor<br />Mermi: 30<br />Kullanıyor: MXM @@ -2888,9 +3002,9 @@ Calibre: 6.5x47 mm Creedmor<br/>Cartuchos: 30<br/>Usado em: Promet MR Kaliber: 6,5x47 mm Creedmor<br />Lövedékek: 30<br />Használható: Promet MR 口径: 6.5x47 mm Creedmor<br />装填数: 30<br />次で使用: Promet MR - 구경: 6.5x47 mm Creedmor<br />장탄수: 30<br />사용처: Promet MR + 구경: 6.5x47mm 크리드무어<br/>장탄수: 30<br/>사용처: MSBS 그롯/GL/MR/SG 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 30<br />使用於: Promet MR - 口径: 6.5x47 mm Creedmor 狙击专用弹<br />发数: 30<br />使用于: Promet MR + 口径:6.5x47 mm Creedmor 狙击专用弹<br />发数:30<br />使用于:Promet MR Kalibre: 6.5x47 mm Creedmor<br />Mermi: 30<br />Kullanıyor: Promet MR @@ -2905,9 +3019,9 @@ Carregador .338 LM (300gr Lapua Scenar) com 10 cartuchos .338 LM 10-lövedékes tár (300gr Lapua Scenar) .338 LM 10発入り 弾倉 (300gr Lapua Scenar) - 10발들이 .338 탄창 (300gr Lapua Scenar) + 10발 들이 .338구경 라푸아 매그넘 탄창 (300그레인 Scenar) .338 10發 彈匣 (300公克 Lapua Scenar) - .338 LM 10发 弹匣 (300公克 Lapua Scenar) + .338 LM 10发 弹匣(300gr Lapua Scenar) .338 LM 10Rnd Mag (300gr Lapua Scenar) @@ -2922,7 +3036,7 @@ .338 Scenar .338 Scenar 338 Scenar - .338 Scenar + .338구경 라푸아 매그넘 Scenar .338 Scenar .338 Scenar .338 Scenar @@ -2939,9 +3053,9 @@ Calibre: 8.6x70mm (300gr Lapua Scenar)<br/>Cartuchos: 10 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그레인 Scenar)<br/>장탄수: 10 口徑: 8.6x70毫米 (300公克 Lapua Scenar)<br />發數: 10 - 口径: 8.6x70mm (300公克 Lapua Scenar)<br />发数: 10 + 口径:8.6x70 mm(300gr Lapua Scenar)<br />发数:10 Kalibre: 8.6x70mm (300gr Lapua Scenar)<br />Mermi: 10 @@ -2956,9 +3070,9 @@ Carregador .338 LM (API526) com 10 cartuchos .338 LM 10-lövedékes tár (API526) .338 LM 10発入り 弾倉 (API526) - 10발들이 .338 LM 탄창 (API526) + 10발 들이 .338구경 라푸아 매그넘 탄창 (API526) .338 10發 彈匣 (API526 穿甲燃燒彈) - .338 LM 10发 弹匣 (API526 穿甲燃烧弹) + .338 LM 10发 弹匣(API526 穿燃) .338 LM 10Rnd Mag (API526) @@ -2973,9 +3087,9 @@ .338 AP .338 páncéltörő .338 徹甲弾 - .338 철갑탄 + .338구경 라푸아 매그넘 철갑탄 .338 API526 穿甲燃燒彈 - .338 API526 穿甲燃烧弹 + .338 穿燃 .338 AP @@ -2990,9 +3104,9 @@ Calibre: 8.6x70mm (API526)<br/>Cartuchos: 10 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 + 口径:8.6x70 mm(API526 穿燃)<br />发数:10 Kalibre: 8.6x70mm (API526)<br />Mermi: 10 @@ -3007,9 +3121,9 @@ Carregador .408 (305gr) com 7 cartuchos .408 7-lövedékes tár (305gr) .408 7発入り 弾倉 (305gr) - 7발들이 .408 탄창 (305gr) + 7발 들이 .408구경 샤이택 탄창 (305그레인) .408 7發 彈匣 (305公克) - .408 7发 弹匣 (305公克) + .408 7发 弹匣(305gr) .408 7Rnd Mag (305gr) @@ -3024,7 +3138,7 @@ .408 .408 .408 - .408 + .408구경 샤이택 .408 .408 .408 @@ -3041,9 +3155,9 @@ Calibre: .408 CheyTac (305gr)<br/>Cartuchos: 7 Kaliber: .408 CheyTac (305gr)<br />Lövedékek: 7 口径: .408 CheyTac (305gr)<br />装填数: 7 - 구경: .408 CheyTac (305gr)<br />장탄수: 7 + 구경: .408구경 샤이택(305그레인)<br/>장탄수: 7 口徑: .408 夏伊戰術狙擊彈 (305公克)<br />發數: 7 - 口径: .408 夏伊战术狙击弹 (305公克)<br />发数: 7 + 口径:.408 夏伊(305gr)<br />发数:7 Kalibre: .408 CheyTac (305gr)<br />Mermi: 7 @@ -3058,7 +3172,7 @@ Carregador 12.7x99 mm com 5 cartuchos 12,7x99 mm 5-lövedékes tár 12.7x99 mm 5発入り 弾倉 - 5발들이 12.7x99 mm 탄창 + 5발 들이 12.7x99mm 탄창 12.7x99毫米 5發 彈匣 12.7x99 mm 5发 弹匣 12.7x99 mm 5Rnd Mag @@ -3075,9 +3189,9 @@ Calibre: 12.7x99 mm<br/>Cartuchos: 5 Kaliber: 12,7x99 mm<br />Lövedékek: 5 口径: 12.7x99 mm<br />装填数: 5 - 구경: 12.7x99 mm<br />장탄수: 5 + 구경: 12.7x99mm<br/>장탄수: 5 口徑: 12.7x99毫米<br />發數: 5 - 口径: 12.7x99 mm<br />发数: 5 + 口径:12.7x99 mm<br />发数:5 Kalibre: 12.7x99 mm<br />Mermi: 5 @@ -3092,7 +3206,7 @@ Carregador 12.7x99 mm com 10 cartuchos 12,7x99 mm 10-lövedékes tár 12.7x99 mm 10発入り 弾倉 - 10발들이 12.7x99 mm 탄창 + 10발 들이 12.7x99mm 탄창 12.7x99毫米 10發 彈匣 12.7x99 mm 10发 弹匣 12.7x99 mm 10Rnd Mag @@ -3109,9 +3223,9 @@ Calibre: 12.7x99 mm<br/>Cartuchos: 10 Kaliber: 12,7x99 mm<br />Lövedékek: 10 口径: 12.7x99 mm<br />装填数: 10 - 구경: 12.7x99 mm<br />장탄수: 10 + 구경: 12.7x99 mm<br/>장탄수: 10 口徑: 12.7x99毫米<br />發數: 10 - 口径: 12.7x99 mm<br />发数: 10 + 口径:12.7x99 mm<br />发数:10 Kalibre: 12.7x99 mm<br />Mermi: 10 @@ -3126,7 +3240,7 @@ 12.7 mm 12,7 mm 12.7 mm - 12.7 mm + 12.7mm 12.7毫米 12.7 mm 12.7 mm @@ -3143,9 +3257,9 @@ Carregador 12.7x99 mm API com 5 cartuchos 12,7x99 mm 5-lövedékes tár (páncéltörő-gyújtó) 12.7x99 mm 5発入り焼夷徹甲弾 弾倉 - 5발들이 12.7x99 mm 철갑소이탄 탄창 + 5발 들이 12.7x99mm 철갑소이탄 탄창 12.7x99毫米 穿甲燃燒彈 5發 彈匣 - 12.7x99 mm 穿甲燃烧弹 5发 弹匣 + 12.7x99 mm 穿燃 5发 弹匣 12.7x99 mm API 5Rnd Mag @@ -3160,9 +3274,9 @@ Calibre: 12.7x99 mm API<br/>Cartuchos: 5 Kaliber: 12,7x99 mm API<br />Lövedékek: 5 口径: 12.7x99 mm 焼夷徹甲弾<br />装填数: 5 - 구경: 12.7x99 mm 철갑소이탄<br />장탄수: 5 + 구경: 12.7x99mm 철갑소이탄<br/>장탄수: 5 口徑: 12.7x99毫米 穿甲燃燒彈<br />發數: 5 - 口径: 12.7x99 mm 穿甲燃烧弹<br />发数: 5 + 口径:12.7x99 mm 穿燃<br />发数:5 Kalibre: 12.7x99 mm API<br />Mermi: 5 @@ -3177,9 +3291,9 @@ Carregador 12.7x99 mm API com 10 cartuchos 12,7x99 mm 10-lövedékes tár (páncéltörő-gyújtó) 12.7x99 mm 10発入り焼夷徹甲弾 弾倉 - 10발들이 12.7x99 mm 철갑소이탄 탄창 + 10발 들이 12.7x99mm 철갑소이탄 탄창 12.7x99毫米 穿甲燃燒彈 10發 彈匣 - 12.7x99 mm 穿甲燃烧弹 10发 弹匣 + 12.7x99 mm 穿燃 10发 弹匣 12.7x99 mm API 10Rnd Mag @@ -3194,9 +3308,9 @@ Calibre: 12.7x99 mm API<br/>Cartuchos: 10 Kaliber: 12,7x99 mm API<br />Lövedékek: 10 口径: 12.7x99 mm 焼夷徹甲弾<br />装填数: 10 - 구경: 12.7x99 mm 철갑소이탄<br />장탄수: 10 + 구경: 12.7x99mm 철갑소이탄<br/>장탄수: 10 口徑: 12.7x99毫米 穿甲燃燒彈<br />發數: 10 - 口径: 12.7x99 mm 穿甲燃烧弹<br />发数: 10 + 口径:12.7x99 mm 穿燃<br />发数:10 Kalibre: 12.7x99 mm API<br />Mermi: 10 @@ -3211,9 +3325,9 @@ Carregador 12.7x99 mm (AMAX) com 5 cartuchos 12,7x99 mm 5-lövedékes tár (AMAX) 12.7x99 mm 5発入り 弾倉 (AMAX) - 5발들이 12.7x99 mm 탄창 (AMAX) + 5발들이 12.7x99mm 탄창 (AMAX) 12.7x99毫米 5發 彈匣 (AMAX 比賽專用彈) - 12.7x99 mm 5发 弹匣 (AMAX 比赛专用弹) + 12.7x99 mm 5发 弹匣(AMAX) 12.7x99 mm 5Rnd Şarjör (AMAX) @@ -3228,9 +3342,9 @@ Calibre: 12.7x99 mm (AMAX)<br/>Cartuchos: 5 Kaliber: 12,7x99 mm (AMAX)<br />Lövedékek: 5 口径: 12.7x99 mm (AMAX)<br />装填数: 5 - 구경: 12.7x99 mm (AMAX)<br />장탄수: 5 + 구경: 12.7x99mm (AMAX)<br/>장탄수: 5 口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 5 - 口径: 12.7x99 mm (AMAX 比赛专用弹)<br />发数: 5 + 口径:12.7x99 mm(AMAX)<br />发数:5 Kalibre: 12.7x99 mm (AMAX)<br />Mermi: 5 @@ -3245,9 +3359,9 @@ Carregador 12.7x99 mm (AMAX) com 10 cartuchos 12,7x99 mm 10-lövedékes tár (AMAX) 12.7x99 mm 10発入り 弾倉 (AMAX) - 10발들이 12.7x99 mm 탄창 (AMAX) + 10발들이 12.7x99mm 탄창 (AMAX) 12.7x99毫米 10發 彈匣 (AMAX 比賽專用彈) - 12.7x99 mm 10发 弹匣 (AMAX 比赛专用弹) + 12.7x99 mm 10发 弹匣(AMAX) 12.7x99 mm 10Rnd Şarjör (AMAX) @@ -3262,9 +3376,9 @@ Calibre: 12.7x99 mm (AMAX)<br/>Cartuchos: 10 Kaliber: 12,7x99 mm (AMAX)<br />Lövedékek: 10 口径: 12.7x99 mm (AMAX)<br />装填数: 10 - 구경: 12.7x99 mm (AMAX)<br />장탄수: 10 + 구경: 12.7x99mm (AMAX)<br/>장탄수: 10 口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 10 - 口径: 12.7x99 mm (AMAX 比赛专用弹)<br />发数: 10 + 口径:12.7x99 mm(AMAX)<br />发数:10 Kalibre: 12.7x99 mm (AMAX)<br />Mermi: 10 @@ -3279,27 +3393,27 @@ 12.7 mm 12,7 mm 12.7 mm - 12.7 mm + 12.7mm 12.7毫米 AMAX 比賽專用彈 - 12.7 mm AMAX 比赛专用弹 + 12.7 mm 12.7 mm - 12.7mm API - 12,7mm API - 12.7mm API - 12,7mm API - 12.7mm API + 12.7 mm API + 12,7 mm API + 12.7 mm API + 12,7 mm API + 12.7 mm API 12.7 мм бронебойно-зажигательные - 12,7mm API - 12.7mm API - 12.7mm API - 12,7mm páncéltörő-gyújtó - 12.7mm 焼夷徹甲弾 + 12,7 mm API + 12.7 mm API + 12.7 mm API + 12,7 mm páncéltörő-gyújtó + 12.7 mm 焼夷徹甲弾 12.7mm 철갑소이탄 12.7毫米 穿甲燃燒彈 - 12.7mm 穿甲燃烧弹 - 12.7mm API + 12.7 mm 穿燃 + 12.7 mm API [ACE] Ammo Supply Crate @@ -3313,7 +3427,7 @@ [ACE] Ящик с боеприпасами [ACE] Cassa munizioni [ACE] 弾薬物資箱 - [ACE] 탄약 보급 상자 + [ACE] 탄약 보급상자 [ACE] 彈藥補給箱 [ACE] 弹药补给箱 [ACE] Cephane Ikmal Kutusu @@ -3331,13 +3445,14 @@ 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 @@ -3346,6 +3461,7 @@ Délka hlavně Longitud del cañón Namlu Uzunluğu + 총열 길이 Ballistic coefficient @@ -3361,6 +3477,7 @@ Balistický koeficient Coheficiente de balística Balistik Katsayısı + 탄도 계수 Bullet mass @@ -3376,6 +3493,7 @@ Váha projektilu Masa de la bala Mermi Ağırlığı + 탄두 질량 Muzzle velocity @@ -3391,6 +3509,49 @@ Úsťová rychlost Velocidad inicial Namlu çıkış hızı + 총구 속도 + + + AI Usage + AIの使用 + Wykorzystanie przez AI + KI Verwendet + + + Illum + 照明弾 + Flary + Leuchtmittel + + + Smoke + 発煙弾 + Granaty dymne + Rauch + + + Inf + 歩兵 + Piechota + Infanterie + + + Veh + 車両 + Pojazdy + Fahrzeug + + + Armor + 機甲 + Pojazdy opancerzone + Panzerung + + + Air + 航空 + Lotnictwo + Luft diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index d000ad6083..8fe0596338 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class ACE_ApplyHandcuffs { displayName = CSTRING(SetCaptive); selection = "righthand"; - distance = 2; + distance = HANDCUFFS_DISTANCE; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); exceptions[] = {"isNotSwimming", "isNotInside"}; @@ -16,7 +16,7 @@ class CfgVehicles { class ACE_RemoveHandcuffs { displayName = CSTRING(ReleaseCaptive); selection = "righthand"; - distance = 2; + distance = HANDCUFFS_DISTANCE; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); exceptions[] = {"isNotSwimming", "isNotInside"}; diff --git a/addons/captives/CfgWeapons.hpp b/addons/captives/CfgWeapons.hpp index 34f7b59e10..23c7d0c2ce 100644 --- a/addons/captives/CfgWeapons.hpp +++ b/addons/captives/CfgWeapons.hpp @@ -4,6 +4,7 @@ class CfgWeapons { class ACE_CableTie: ACE_ItemCore { author = ECSTRING(common,ACETeam); + GVAR(restraint) = 1; displayName = CSTRING(CableTie); descriptionShort = CSTRING(CableTieDescription); model = QPATHTOF(models\ace_cabletie.p3d); diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index fc0880b794..8d34c4fb40 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -41,7 +41,7 @@ if (!hasInterface) exitWith {}; private _target = cursorObject; if !([ACE_player, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; if !(_target isKindOf "CAManBase") exitWith {false}; - if ((_target distance ACE_player) > getNumber (configFile >> "CfgVehicles" >> "CAManBase" >> "ACE_Actions" >> "ACE_ApplyHandcuffs" >> "distance")) exitWith {false}; + if ((_target distance ACE_player) > getNumber (configOf ACE_player >> "ACE_Actions" >> "ACE_ApplyHandcuffs" >> "distance")) exitWith {false}; if ([ACE_player, _target] call FUNC(canApplyHandcuffs)) exitWith { [ACE_player, _target] call FUNC(doApplyHandcuffs); diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 61bd9788a3..8ec915e4f2 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -8,6 +8,8 @@ PREP_RECOMPILE_END; GVAR(captivityEnabled) = false; +GVAR(restraints) = call (uiNamespace getVariable QGVAR(restraints)); + #include "initSettings.sqf" ADDON = true; diff --git a/addons/captives/XEH_preStart.sqf b/addons/captives/XEH_preStart.sqf index 022888575e..75cbb90ef9 100644 --- a/addons/captives/XEH_preStart.sqf +++ b/addons/captives/XEH_preStart.sqf @@ -1,3 +1,6 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _restraints = (QUOTE(getNumber (_x >> QQGVAR(restraint)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x}); +uiNamespace setVariable [QGVAR(restraints), compileFinal str _restraints]; diff --git a/addons/captives/functions/fnc_addLoadCaptiveActions.sqf b/addons/captives/functions/fnc_addLoadCaptiveActions.sqf index 279ca0924e..d3f771be8d 100644 --- a/addons/captives/functions/fnc_addLoadCaptiveActions.sqf +++ b/addons/captives/functions/fnc_addLoadCaptiveActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Adds child actions to the "load captive" action for near vehicles. diff --git a/addons/captives/functions/fnc_canApplyHandcuffs.sqf b/addons/captives/functions/fnc_canApplyHandcuffs.sqf index 72ac745517..9d91e2f517 100644 --- a/addons/captives/functions/fnc_canApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_canApplyHandcuffs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Checks the conditions for being able to apply handcuffs @@ -20,7 +20,7 @@ params ["_unit", "_target"]; //Check sides, Player has cableTie, target is alive and not already handcuffed (GVAR(allowHandcuffOwnSide) || {(side _unit) != (side _target)}) && -{"ACE_CableTie" in (_unit call EFUNC(common,uniqueItems))} && +{((_unit call EFUNC(common,uniqueItems)) findAny GVAR(restraints)) != -1} && {alive _target} && {!(_target getVariable [QGVAR(isHandcuffed), false])} && { diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index cb5fdd4972..4f98227eae 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Tests if can escort target (attach) diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index b1757884b7..982e4025a2 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can load the target object into a vehicle. diff --git a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf index 37dc156bf0..0ff4ab0f5d 100644 --- a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Checks the conditions for being able to remove handcuffs diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index 01010c8f97..7519904abd 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Tests if player can stop escorting. diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index bec8edca04..80e1d26fb5 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Checks the conditions for being able switch surrender states diff --git a/addons/captives/functions/fnc_canUnloadCaptive.sqf b/addons/captives/functions/fnc_canUnloadCaptive.sqf index 3c5b302529..0eb64e7373 100644 --- a/addons/captives/functions/fnc_canUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_canUnloadCaptive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can unload a captive from the vehicle. diff --git a/addons/captives/functions/fnc_doApplyHandcuffs.sqf b/addons/captives/functions/fnc_doApplyHandcuffs.sqf index ad1ef3f2d6..c6a9be8e2a 100644 --- a/addons/captives/functions/fnc_doApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_doApplyHandcuffs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Checks the conditions for being able to apply handcuffs @@ -23,4 +23,6 @@ playSound3D [QUOTE(PATHTO_R(sounds\cable_tie_zipping.ogg)), objNull, false, (get [QGVAR(setHandcuffed), [_target, true, _unit], [_target]] call CBA_fnc_targetEvent; -_unit removeItem "ACE_CableTie"; +private _cuffs = (_unit call EFUNC(common,uniqueItems)) arrayIntersect GVAR(restraints); + +_unit removeItem (_cuffs#0); diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index 700a68c42e..1d94b30b87 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nic547 * Attaches a Captive to the _unit diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index 7740610b6a..34bc46b1f5 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Unit loads the target object into a vehicle. (logic same as canLoadCaptive) diff --git a/addons/captives/functions/fnc_doRemoveHandcuffs.sqf b/addons/captives/functions/fnc_doRemoveHandcuffs.sqf index 3e9aac73e6..a9a35cd607 100644 --- a/addons/captives/functions/fnc_doRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_doRemoveHandcuffs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Remove handcuffs from a target diff --git a/addons/captives/functions/fnc_doUnloadCaptive.sqf b/addons/captives/functions/fnc_doUnloadCaptive.sqf index 8f78b7b323..c278e48363 100644 --- a/addons/captives/functions/fnc_doUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_doUnloadCaptive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Unit unloads a captive from a vehicle. diff --git a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf index 7c9daf1080..4341867b29 100644 --- a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf +++ b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Finds a free cargo seat, searching non FFV first @@ -20,18 +20,21 @@ TRACE_1("params", _vehicle); scopeName "main"; +private _seats = fullCrew [_vehicle, "", true]; +reverse _seats; + { _x params ["_unit", "_role", "_cargoIndex", "_turretPath", "_isPersonTurret"]; if (isNull _unit && {_role == "cargo"} && {_cargoIndex > -1} && {!_isPersonTurret}) then { [_cargoIndex, false] breakOut "main"; }; -} forEach (fullCrew [_vehicle, "", true]); +} forEach _seats; { _x params ["_unit", "_role", "_cargoIndex", "_turretPath", "_isPersonTurret"]; if (isNull _unit && {_cargoIndex > -1}) then { [_cargoIndex, true] breakOut "main"; }; -} forEach (fullCrew [_vehicle, "", true]); +} forEach _seats; [-1, false] diff --git a/addons/captives/functions/fnc_handleAnimChangedHandcuffed.sqf b/addons/captives/functions/fnc_handleAnimChangedHandcuffed.sqf index bdd61f6686..3363ca923e 100644 --- a/addons/captives/functions/fnc_handleAnimChangedHandcuffed.sqf +++ b/addons/captives/functions/fnc_handleAnimChangedHandcuffed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nic547, commy2 * Restart the handcuffing animation if it got interrupted. Called from a AnimChanged EH. diff --git a/addons/captives/functions/fnc_handleAnimChangedSurrendered.sqf b/addons/captives/functions/fnc_handleAnimChangedSurrendered.sqf index 08d6369ed6..b9164ddbe5 100644 --- a/addons/captives/functions/fnc_handleAnimChangedSurrendered.sqf +++ b/addons/captives/functions/fnc_handleAnimChangedSurrendered.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nic547, commy2 * Restart the surrendering animation if it got interrupted. Called from a AnimChanged EH. diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf index 3fc2db1711..00a090a6bb 100644 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles when a unit gets in to a vehicle. Release escorted captive when entering a vehicle diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index 7f5de6f330..610ec719f6 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles when a captive unit gets out of a vehicle. diff --git a/addons/captives/functions/fnc_handleKilled.sqf b/addons/captives/functions/fnc_handleKilled.sqf index 39158ae662..3b8139e9fa 100644 --- a/addons/captives/functions/fnc_handleKilled.sqf +++ b/addons/captives/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Called when a unit dies. diff --git a/addons/captives/functions/fnc_handleLocal.sqf b/addons/captives/functions/fnc_handleLocal.sqf index be92b1c7dc..e6f9a11e3d 100644 --- a/addons/captives/functions/fnc_handleLocal.sqf +++ b/addons/captives/functions/fnc_handleLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Called when a unit switched locality diff --git a/addons/captives/functions/fnc_handleOnUnconscious.sqf b/addons/captives/functions/fnc_handleOnUnconscious.sqf index 745b651a0d..1527038ce9 100644 --- a/addons/captives/functions/fnc_handleOnUnconscious.sqf +++ b/addons/captives/functions/fnc_handleOnUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, PabstMirror * Handles the "ace_unconscious" event diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index c6adce4f84..1e4c729c0e 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles playerChanged. Resets "showHUD" based on handcuff status diff --git a/addons/captives/functions/fnc_handleRespawn.sqf b/addons/captives/functions/fnc_handleRespawn.sqf index 3643eb4393..1dc6ca7bfa 100644 --- a/addons/captives/functions/fnc_handleRespawn.sqf +++ b/addons/captives/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 PabstMirror * Fix, because captiveNum doesn't reset properly on respawn diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 2f189e2ffb..1045046b2a 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * handle captive and unconsciousness state and prevent grenades diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf index df78c9773f..9bc5fc18aa 100644 --- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles ZeusDisplayChanged event diff --git a/addons/captives/functions/fnc_moduleHandcuffed.sqf b/addons/captives/functions/fnc_moduleHandcuffed.sqf index 1cd50dd4ce..32438643d7 100644 --- a/addons/captives/functions/fnc_moduleHandcuffed.sqf +++ b/addons/captives/functions/fnc_moduleHandcuffed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Module Function to make a unit handcuffed (can be called from editor) diff --git a/addons/captives/functions/fnc_moduleSettings.sqf b/addons/captives/functions/fnc_moduleSettings.sqf index d31a57a43d..5f44de695c 100644 --- a/addons/captives/functions/fnc_moduleSettings.sqf +++ b/addons/captives/functions/fnc_moduleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Module for captivity settings diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index ab31ea6bc9..8f59d913d8 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Module Function to make a unit surrender (can be called from editor) diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index c0065438af..c13da8f927 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nic547, commy2 * Handcuffs a unit. diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 331a5ab231..393465e08e 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 PabstMirror * Lets a unit surrender diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index 6089625961..95a7f43f84 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Loads a captive into a vehicle diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf index f26ff45370..f2c2762f95 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Unloads a captive from a vehicle. diff --git a/addons/captives/functions/script_component.hpp b/addons/captives/functions/script_component.hpp deleted file mode 100644 index e91d5c843b..0000000000 --- a/addons/captives/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\captives\script_component.hpp" \ No newline at end of file diff --git a/addons/captives/script_component.hpp b/addons/captives/script_component.hpp index c0cbefe5b2..76094f990d 100644 --- a/addons/captives/script_component.hpp +++ b/addons/captives/script_component.hpp @@ -15,3 +15,5 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define HANDCUFFS_DISTANCE 2 diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index d9cf15bf71..8c4f85db06 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -8,7 +8,7 @@ 俘虜 俘虏 捕虜 - 포로설정 + 포로 Jeńcy Пленные Prisioneiros @@ -31,7 +31,7 @@ 捕虜にする 포박하기 逮捕俘虜 - 逮捕俘虏 + 俘获 Kelepçele @@ -99,7 +99,7 @@ 捕虜を取っている必要があります! 먼저 포로로 만들어야합니다! 你必須先逮捕他! - 你必须先逮捕他! + 你必须先俘获他! Önce onu tutuklamalısın! @@ -330,7 +330,7 @@ Разрешить игрокам арестовывать юнитов своей стороны I giocatori possono ammanettare unità alleate プレイヤーが拘束したユニットの陣営を自陣営に変更させます。 - 자기편에게 케이블타이를 사용할 수 있게합니다 + 자기 편에게 케이블 타이를 사용할 수 있게 합니다 玩家可以使用束線帶銬住同陣營隊友 玩家可以使用束线带铐住同阵营队友 @@ -362,7 +362,7 @@ プレイヤーは拘束される前に、投降する必要があります。 체포하기 전에 먼저 플레이어가 투항을 해야만 합니다 玩家須先要求目標投降,才可以進行逮捕 - 玩家须先要求目标投降,才可以进行逮捕 + 玩家须先要求目标投降,才可以进行俘获 Surrendering only @@ -430,9 +430,9 @@ Require AI surrendering Benötigt für KI Kapitulation Necessita arresa AI - AI の投降を必要とする + AIの投降を必要とする 需要AI先行投降 - 需要AI先行投降 + 需要 AI 先行投降 AI 항복 필요 Wymaga poddania się przez SI Требовать ИИ сдаться для ареста @@ -445,9 +445,9 @@ Require AI to surrender before they can be arrested KI muss sich erst ergeben, bevor sie gefangen genommen werden kann Necessita che le AI si arrendano prima di essere arrestate - AI の拘束は AI が投降している場合に限り可能にします。 + AIの拘束はAIが投降している場合に限り可能にします。 在逮捕AI之前該AI必須先進入投降狀態 - 在逮捕AI之前该AI必须先进入投降状态。 + 在俘获 AI 之前该 AI 必须先进入投降状态。 포박하기 전에 먼저 AI가 투항해야만 합니다. Wymaga poddania się przez SI zanim aresztowanie będzie możliwe Требовать для ареста, чтобы ИИ вначале сдавались @@ -462,7 +462,7 @@ カーソル先のユニットを拘束 Imposta l'unità nello stato di prigioniero. 設置在游標下的單位成俘虜狀態 - 设置在游标下的单位成俘虏状态。 + 设置在光标下的单位成俘虏状态。 커서의 병력을 포박합니다. Ustawia jednostkę pod kursorem jako jeniec. Арестовывает указанный курсором юнит diff --git a/addons/cargo/CfgVehicles.hpp b/addons/cargo/CfgVehicles.hpp index 1cbe96833b..7a47a8a943 100644 --- a/addons/cargo/CfgVehicles.hpp +++ b/addons/cargo/CfgVehicles.hpp @@ -265,11 +265,11 @@ class CfgVehicles { }; class VTOL_Base_F; class VTOL_01_base_F: VTOL_Base_F { - GVAR(space) = 4; + GVAR(space) = 20; GVAR(hasCargo) = 1; }; class VTOL_02_base_F: VTOL_Base_F { - GVAR(space) = 4; + GVAR(space) = 10; GVAR(hasCargo) = 1; }; @@ -322,6 +322,11 @@ class CfgVehicles { GVAR(canLoad) = 1; }; + // Invisible Target Soldier + class TargetSoldierBase: StaticWeapon { + GVAR(canLoad) = 0; + }; + class StaticMortar; class Mortar_01_base_F: StaticMortar { GVAR(size) = 2; // 1 = small, 2 = large @@ -426,30 +431,43 @@ class CfgVehicles { class Land_CanisterFuel_F: Items_base_F { GVAR(size) = 1; GVAR(canLoad) = 1; + GVAR(noRename) = 1; + }; + + // Flexible Fuel tanks, 300L + class FlexibleTank_base_F: ThingX { + GVAR(size) = 3; + GVAR(canLoad) = 1; + GVAR(noRename) = 1; }; // objects class RoadCone_F: ThingX { GVAR(size) = 1; GVAR(canLoad) = 1; + GVAR(noRename) = 1; }; class RoadBarrier_F: RoadCone_F { GVAR(size) = 2; + GVAR(noRename) = 1; }; class Lamps_base_F; class Land_PortableLight_single_F: Lamps_base_F { GVAR(size) = 2; GVAR(canLoad) = 1; + GVAR(noRename) = 1; }; class FloatingStructure_F; class Land_Camping_Light_F: FloatingStructure_F { GVAR(size) = 0.2; GVAR(canLoad) = 1; + GVAR(noRename) = 1; }; class Land_Camping_Light_off_F: ThingX { GVAR(size) = 0.2; GVAR(canLoad) = 1; + GVAR(noRename) = 1; }; diff --git a/addons/cargo/XEH_PREP.hpp b/addons/cargo/XEH_PREP.hpp index aa1600b82d..95fefb4ba0 100644 --- a/addons/cargo/XEH_PREP.hpp +++ b/addons/cargo/XEH_PREP.hpp @@ -19,5 +19,6 @@ PREP(setSize); PREP(setSpace); PREP(startLoadIn); PREP(startUnload); +PREP(unloadCarryItem); PREP(unloadItem); PREP(validateCargoSpace); diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf index 1a7fbbc4fb..5ade83b41c 100644 --- a/addons/cargo/XEH_postInit.sqf +++ b/addons/cargo/XEH_postInit.sqf @@ -2,9 +2,9 @@ ["ace_addCargo", {_this call FUNC(addCargoItem)}] call CBA_fnc_addEventHandler; [QGVAR(paradropItem), { - params ["_item", "_vehicle"]; + params ["_item", "_vehicle", ["_showHint", true]]; - private _unloaded = [_item, _vehicle] call FUNC(paradropItem); + private _unloaded = [_item, _vehicle, _showHint] call FUNC(paradropItem); if (_unloaded && {GVAR(openAfterUnload) in [2, 3]}) then { GVAR(interactionVehicle) = _vehicle; @@ -50,8 +50,6 @@ GVAR(interactionParadrop) = false; createDialog QGVAR(menu); }; - - // TOOO maybe drag/carry the unloaded item? }] call CBA_fnc_addEventHandler; [QGVAR(serverUnload), { @@ -101,8 +99,7 @@ GVAR(objectActions) = [ {(_target getVariable [QGVAR(canLoad), getNumber (configOf _target >> QGVAR(canLoad))]) in [true, 1]} && {alive _target} && {[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} && - {!((typeOf _target) in ["ACE_Wheel", "ACE_Track"])} && // Exclude Wheel and Track - {!(_target iskindOf "Land_CanisterFuel_F")} // Exclude Fuel Canisters + {(_target getVariable [QGVAR(noRename), getNumber (configOf _target >> QGVAR(noRename))]) in [false, 0]} } ] call EFUNC(interact_menu,createAction), [QGVAR(load), localize LSTRING(loadObject), "a3\ui_f\data\IGUI\Cfg\Actions\loadVehicle_ca.paa", @@ -153,3 +150,10 @@ private _objectClassesAddClassEH = call (uiNamespace getVariable [QGVAR(objectCl { [_x, "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler; } forEach _objectClassesAddClassEH; + +if (isServer) then { + ["ace_placedInBodyBag", { + params ["_target", "_bodyBag"]; + _bodyBag setVariable [QGVAR(customName), [_target, false, true] call EFUNC(common,getName), true]; + }] call CBA_fnc_addEventHandler; +}; diff --git a/addons/cargo/functions/fnc_addCargoItem.sqf b/addons/cargo/functions/fnc_addCargoItem.sqf index 8be00818c6..ecaa4e316f 100644 --- a/addons/cargo/functions/fnc_addCargoItem.sqf +++ b/addons/cargo/functions/fnc_addCargoItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Jonpas * Adds a cargo item to the vehicle. diff --git a/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf b/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf index 2bec4f4df3..811ccd2b36 100644 --- a/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf +++ b/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Create actions for nearest vehicles with cargo. diff --git a/addons/cargo/functions/fnc_canLoadItemIn.sqf b/addons/cargo/functions/fnc_canLoadItemIn.sqf index 469dc45c9d..0851c07fac 100644 --- a/addons/cargo/functions/fnc_canLoadItemIn.sqf +++ b/addons/cargo/functions/fnc_canLoadItemIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if item can be loaded into other Object. @@ -35,7 +35,10 @@ if (_item isEqualType "") then { } else { _validItem = (alive _item) && - {_ignoreInteraction || {([_item, _vehicle] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}}; + {_ignoreInteraction || {([_item, _vehicle] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}} && + {!(_item getVariable [QEGVAR(cookoff,isCookingOff), false])} && + {isNull(_item getVariable [QEGVAR(refuel,nozzle), objNull])} && // Objects which have a refueling nozzle connected to them cannot be loaded + {isNull(_item getVariable [QEGVAR(refuel,ownedNozzle), objNull])}; // Fuel sources which have their nozzle out cannot be loaded }; _validItem && diff --git a/addons/cargo/functions/fnc_canUnloadItem.sqf b/addons/cargo/functions/fnc_canUnloadItem.sqf index 311f3cb36d..fd69d5f9bd 100644 --- a/addons/cargo/functions/fnc_canUnloadItem.sqf +++ b/addons/cargo/functions/fnc_canUnloadItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, ViperMaul * Check if item can be unloaded. diff --git a/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf b/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf index b03108066d..a0e8d2993d 100644 --- a/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf +++ b/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the cargo space left on object. diff --git a/addons/cargo/functions/fnc_getNameItem.sqf b/addons/cargo/functions/fnc_getNameItem.sqf index ac97dd51dc..a28d128c63 100644 --- a/addons/cargo/functions/fnc_getNameItem.sqf +++ b/addons/cargo/functions/fnc_getNameItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: JasperRab * Gets the name of the item, and alternatively the custom name if requested and available. @@ -18,8 +18,11 @@ params ["_object", ["_addCustomPart", false]]; -private _class = if (_object isEqualType "") then {_object} else {typeOf _object}; -private _displayName = getText (configFile >> "CfgVehicles" >> _class >> "displayName"); +private _displayName = if (_object isEqualType "") then { + getText (configFile >> "CfgVehicles" >> _object >> "displayName") +} else { + getText ((configOf _object) >> "displayName") +}; if (_addCustomPart && {!(_object isEqualType "")}) then { private _customPart = _object getVariable [QGVAR(customName), ""]; diff --git a/addons/cargo/functions/fnc_getSizeItem.sqf b/addons/cargo/functions/fnc_getSizeItem.sqf index 5d66e59b72..24b47f70b2 100644 --- a/addons/cargo/functions/fnc_getSizeItem.sqf +++ b/addons/cargo/functions/fnc_getSizeItem.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Glowbal, SilentSpike + * Author: Glowbal, kymckay * Get the cargo size of an object. * * Arguments: diff --git a/addons/cargo/functions/fnc_handleDeleted.sqf b/addons/cargo/functions/fnc_handleDeleted.sqf index 94043fdb92..a4300aea25 100644 --- a/addons/cargo/functions/fnc_handleDeleted.sqf +++ b/addons/cargo/functions/fnc_handleDeleted.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles an object being deleted by deleting all loaded cargo. diff --git a/addons/cargo/functions/fnc_handleDestroyed.sqf b/addons/cargo/functions/fnc_handleDestroyed.sqf index 8048aa278f..016917f5f7 100644 --- a/addons/cargo/functions/fnc_handleDestroyed.sqf +++ b/addons/cargo/functions/fnc_handleDestroyed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handle object being destroyed. diff --git a/addons/cargo/functions/fnc_initObject.sqf b/addons/cargo/functions/fnc_initObject.sqf index 0df277c520..0842d51faa 100644 --- a/addons/cargo/functions/fnc_initObject.sqf +++ b/addons/cargo/functions/fnc_initObject.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Glowbal, SilentSpike + * Author: Glowbal, kymckay * Initializes variables for loadable objects. Called from init EH. * * Arguments: @@ -17,6 +17,7 @@ params ["_object"]; private _type = typeOf _object; +private _config = configOf _object; TRACE_2("params",_object,_type); // If object had size given to it via eden/public then override config canLoad setting @@ -24,7 +25,7 @@ private _canLoadPublic = _object getVariable [QGVAR(canLoad), false]; if (!(_canLoadPublic isEqualType false)) then { WARNING_4("%1[%2] - Variable %3 is %4 - Should be bool",_object,_type,QGVAR(canLoad),_canLoadPublic); }; -private _canLoadConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(canLoad)) == 1; +private _canLoadConfig = getNumber (_config >> QGVAR(canLoad)) == 1; // Nothing to do here if object can't be loaded if !(_canLoadConfig || {_canLoadPublic in [true, 1]}) exitWith {}; diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index dac28a5ac9..948fdf525e 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Initializes vehicle, adds open cargo menu action if available. @@ -19,10 +19,11 @@ params ["_vehicle"]; TRACE_1("params", _vehicle); private _type = typeOf _vehicle; +private _config = configOf _vehicle; // If vehicle had space given to it via eden/public then override config hasCargo setting private _hasCargoPublic = _vehicle getVariable [QGVAR(hasCargo), false]; -private _hasCargoConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) == 1; +private _hasCargoConfig = getNumber (_config >> QGVAR(hasCargo)) == 1; // Nothing to do here if vehicle has no cargo space if !(_hasCargoConfig || _hasCargoPublic) exitWith {}; @@ -40,13 +41,11 @@ if (_addCargoType) then { // Vehicle can have default ace cargo in its config if (isServer) then { { - if (isClass _x) then { - private _cargoClassname = getText (_x >> "type"); - private _cargoCount = getNumber (_x >> "amount"); - TRACE_3("adding ACE_Cargo", (configName _x), _cargoClassname, _cargoCount); - ["ace_addCargo", [_cargoClassname, _vehicle, _cargoCount]] call CBA_fnc_localEvent; - }; - } count ("true" configClasses (configFile >> "CfgVehicles" >> _type >> "ACE_Cargo" >> "Cargo")); + private _cargoClassname = getText (_x >> "type"); + private _cargoCount = getNumber (_x >> "amount"); + TRACE_3("adding ACE_Cargo", (configName _x), _cargoClassname, _cargoCount); + ["ace_addCargo", [_cargoClassname, _vehicle, _cargoCount]] call CBA_fnc_localEvent; + } forEach ("true" configClasses (_config >> QUOTE(ADDON) >> "Cargo")); }; // Servers and HCs do not require action menus (beyond this point) diff --git a/addons/cargo/functions/fnc_loadItem.sqf b/addons/cargo/functions/fnc_loadItem.sqf index f69996c1d4..ae2d845d38 100644 --- a/addons/cargo/functions/fnc_loadItem.sqf +++ b/addons/cargo/functions/fnc_loadItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Load object into vehicle. diff --git a/addons/cargo/functions/fnc_moduleSettings.sqf b/addons/cargo/functions/fnc_moduleSettings.sqf index 54a2d72e5c..9c337364b1 100644 --- a/addons/cargo/functions/fnc_moduleSettings.sqf +++ b/addons/cargo/functions/fnc_moduleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Module for adjusting the cargo settings diff --git a/addons/cargo/functions/fnc_onMenuOpen.sqf b/addons/cargo/functions/fnc_onMenuOpen.sqf index bc56c0fb96..16e66a6ed1 100644 --- a/addons/cargo/functions/fnc_onMenuOpen.sqf +++ b/addons/cargo/functions/fnc_onMenuOpen.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handle the UI data display. diff --git a/addons/cargo/functions/fnc_paradropItem.sqf b/addons/cargo/functions/fnc_paradropItem.sqf index 707ae42b69..d1f61fb6a2 100644 --- a/addons/cargo/functions/fnc_paradropItem.sqf +++ b/addons/cargo/functions/fnc_paradropItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: marc_book, commy2, CAA-Picard * Unload and paradrop object from plane or helicopter. @@ -49,7 +49,7 @@ if (_item isEqualType objNull) then { _object setPosASL (AGLtoASL _posBehindVehicleAGL); }; -_object setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vectorDir _vehicle)) vectorMultiply -5)); +[QEGVAR(common,setVelocity), [_object, ((velocity _vehicle) vectorAdd ((vectorNormalized (vectorDir _vehicle)) vectorMultiply -5))], _object] call CBA_fnc_targetEvent; // open parachute and ir light effect [{ @@ -59,13 +59,20 @@ _object setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vectorDir private _parachute = createVehicle ["B_Parachute_02_F", [0,0,0], [], 0, "CAN_COLLIDE"]; + // Prevent collision damage + [QEGVAR(common,fixCollision), _parachute] call CBA_fnc_localEvent; + [QEGVAR(common,fixCollision), _object, _object] call CBA_fnc_targetEvent; + // cannot use setPos on parachutes without them closing down _parachute attachTo [_object, [0,0,0]]; detach _parachute; private _velocity = velocity _object; - _object attachTo [_parachute, [0,0,1]]; + // Attach to the middle of the object + (2 boundingBoxReal _object) params ["_bb1", "_bb2"]; + + _object attachTo [_parachute, [0, 0, ((_bb2 select 2) - (_bb1 select 2)) / 2]]; _parachute setVelocity _velocity; if ((GVAR(disableParadropEffectsClasstypes) findIf {_object isKindOf _x}) == -1) then { diff --git a/addons/cargo/functions/fnc_removeCargoItem.sqf b/addons/cargo/functions/fnc_removeCargoItem.sqf index ee6de29cab..b15a5a7434 100644 --- a/addons/cargo/functions/fnc_removeCargoItem.sqf +++ b/addons/cargo/functions/fnc_removeCargoItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Removes a cargo item from the vehicle. diff --git a/addons/cargo/functions/fnc_renameObject.sqf b/addons/cargo/functions/fnc_renameObject.sqf index e935620048..c088dcf62a 100644 --- a/addons/cargo/functions/fnc_renameObject.sqf +++ b/addons/cargo/functions/fnc_renameObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: JasperRab * Renames object. @@ -19,6 +19,7 @@ private _display = uiNamespace getVariable QGVAR(menuDisplay); if (isNil "_display") exitWith {}; private _ctrlEditText = ctrlText 100; +_ctrlEditText = _ctrlEditText select [0,32]; if (_ctrlEditText isEqualTo "") then { // custom name has been removed [LSTRING(clearedCustomName), 3] call EFUNC(common,displayTextStructured); } else { diff --git a/addons/cargo/functions/fnc_setSize.sqf b/addons/cargo/functions/fnc_setSize.sqf index 9c9cc34f39..523bbdbb61 100644 --- a/addons/cargo/functions/fnc_setSize.sqf +++ b/addons/cargo/functions/fnc_setSize.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Set the cargo size of any object. Has global effect. * Adds the load action menu if necessary. * Negative size makes unloadable. diff --git a/addons/cargo/functions/fnc_setSpace.sqf b/addons/cargo/functions/fnc_setSpace.sqf index ed34914fdc..f573019a11 100644 --- a/addons/cargo/functions/fnc_setSpace.sqf +++ b/addons/cargo/functions/fnc_setSpace.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Set the cargo space of any object. Has global effect. * Adds the cargo action menu if necessary. * diff --git a/addons/cargo/functions/fnc_startLoadIn.sqf b/addons/cargo/functions/fnc_startLoadIn.sqf index b84ecd4df2..5add1386ed 100644 --- a/addons/cargo/functions/fnc_startLoadIn.sqf +++ b/addons/cargo/functions/fnc_startLoadIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Start load item. diff --git a/addons/cargo/functions/fnc_startUnload.sqf b/addons/cargo/functions/fnc_startUnload.sqf index aa05b9f929..cf00327dcc 100644 --- a/addons/cargo/functions/fnc_startUnload.sqf +++ b/addons/cargo/functions/fnc_startUnload.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Start unload action. diff --git a/addons/cargo/functions/fnc_unloadCarryItem.sqf b/addons/cargo/functions/fnc_unloadCarryItem.sqf new file mode 100644 index 0000000000..3b97cf1599 --- /dev/null +++ b/addons/cargo/functions/fnc_unloadCarryItem.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" +/* + * Author: Grim + * Dragging integration. Unloader starts carrying unloaded object. + * + * Arguments: + * 0: Unloader + * 1: Item + * + * Return Value: + * None + * + * Example: + * [player, object] call ace_cargo_fnc_unloadCarryItem + * + * Public: No + */ +params ["_unloader", "_object"]; +TRACE_2("unloadCarryItem-start",_unloader,_object); + +if !(["ace_dragging"] call EFUNC(common,isModLoaded)) exitWith {}; +if (!GVAR(carryAfterUnload) || {getNumber (configOf _object >> QGVAR(blockUnloadCarry)) > 0}) exitWith {}; + +// When unloading attached objects, this code will run before server has finished moving object to the safe position +[{ + params ["_unloader", "_object"]; + (_unloader distance _object) < 10 +}, { + params ["_unloader", "_object"]; + TRACE_2("unloadCarryItem-unloaded",_unloader,_object); + if ([_unloader, _object] call EFUNC(dragging,canCarry)) exitWith { + [_unloader, _object] call EFUNC(dragging,startCarry); + }; + if ([_unloader, _object] call EFUNC(dragging,canDrag)) exitWith { + [_unloader, _object] call EFUNC(dragging,startDrag); + }; +}, _this, 1.0, { // delay is based on how long it will take server event to trigger and take effect + // not a hard error if this fails, could have just unloaded to other side of vehicle because of findSafePos + TRACE_1("unloadCarryItem-failed to unload nearby player",_this); +}] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/cargo/functions/fnc_unloadItem.sqf b/addons/cargo/functions/fnc_unloadItem.sqf index 94d94276ff..83b0b2ff0e 100644 --- a/addons/cargo/functions/fnc_unloadItem.sqf +++ b/addons/cargo/functions/fnc_unloadItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, ViperMaul * Unload object from vehicle. @@ -56,10 +56,14 @@ if (_object isEqualType objNull) then { } else { _object = createVehicle [_item, _emptyPosAGL, [], 0, "NONE"]; _object setPosASL (AGLtoASL _emptyPosAGL); - + [QEGVAR(common,fixCollision), _object] call CBA_fnc_localEvent; [QEGVAR(common,fixPosition), _object] call CBA_fnc_localEvent; }; + +// Dragging integration +[_unloader, _object] call FUNC(unloadCarryItem); + // Invoke listenable event ["ace_cargoUnloaded", [_object, _vehicle, "unload"]] call CBA_fnc_globalEvent; true diff --git a/addons/cargo/functions/fnc_validateCargoSpace.sqf b/addons/cargo/functions/fnc_validateCargoSpace.sqf index 4f996a30aa..f5b976c395 100644 --- a/addons/cargo/functions/fnc_validateCargoSpace.sqf +++ b/addons/cargo/functions/fnc_validateCargoSpace.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Validate the vehicle cargo space. diff --git a/addons/cargo/functions/script_component.hpp b/addons/cargo/functions/script_component.hpp deleted file mode 100644 index cc6204b83b..0000000000 --- a/addons/cargo/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\cargo\script_component.hpp" diff --git a/addons/cargo/initSettings.sqf b/addons/cargo/initSettings.sqf index cf40c55beb..e971d2d9c7 100644 --- a/addons/cargo/initSettings.sqf +++ b/addons/cargo/initSettings.sqf @@ -42,3 +42,12 @@ false, {[QGVAR(enableRename), _this, true] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; + +[ + QGVAR(carryAfterUnload), "CHECKBOX", + [LSTRING(carryAfterUnload), LSTRING(carryAfterUnload_description)], + [LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(openMenu)], + true, + false, + {[QGVAR(carryAfterUnload), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; diff --git a/addons/cargo/menu.hpp b/addons/cargo/menu.hpp index a945f6e94c..d86c49e6f5 100644 --- a/addons/cargo/menu.hpp +++ b/addons/cargo/menu.hpp @@ -32,7 +32,7 @@ class GVAR(menu) { y = "1 * ((((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 = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_LEFT + ST_SHADOW; + style = QUOTE(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}; diff --git a/addons/cargo/renameMenu.hpp b/addons/cargo/renameMenu.hpp index af54026e70..a1d0885f9e 100644 --- a/addons/cargo/renameMenu.hpp +++ b/addons/cargo/renameMenu.hpp @@ -32,7 +32,7 @@ class GVAR(renameMenu) { y = "1 * ((((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 = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_LEFT + ST_SHADOW; + style = QUOTE(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}; diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index d1cb26a406..b81fcf9886 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -36,22 +36,57 @@ Renamed to:<br/>%1 名前を次に変更:<br/>%1 + Renommé en :<br/>%1 + Переименовано в:<br/>%1 + Neu Bewaffnet: <br/>%1 + Nazwa zmieniona na:<br/>%1 + 重命名为:<br/>%1 + %1(으)로 명칭을 바꿈 + Renombrado a:<br/>%1 Custom name has been cleared. カスタム名が削除されました。 + Le nom personnalisé a été supprimé. + Пользовательское название удалено. + Eigener Name wurde gelöscht. + Własna nazwa została usunięta + 自定义名称已被清除。 + 임의로 지은 명칭을 지웠습니다. + El nombre personalizado ha sido borrado. Set New Name: 新しい名前: + Définir un nouveau nom : + Задать новое название: + Neuen Namen setzen: + Ustaw nową nazwę: + 设定新名称: + 새로운 명칭 설정: + Establecer nuevo nombre: Enable Rename Action 名前変更を有効化 + Possibilité de renommage + Вкл. возможность переименования + Aktiviere Umbenennungs-Aktion + Włącz możliwość zmiany nazwy + 启用重命名动作 + 새로 명칭 짓기 행동 활성화 + Habilitar renombrado Enables the rename action for renamable objects. 名前変更が可能なオブジェクトに対して、名前変更動作を有効化します。 + Active la possibilité de donner un nom personnalisé aux objets transportables (si renommables). + Включает переименование для объектов, допускающих переименование. + Aktiviert die Umbenennungs-Aktion für neu benennbare Objekte. + Włącza akcję zmiany nazwy dla obiektów z możliwością zmiany nazwy. + 启用可重命名物体的重命名动作。 + 개체의 명칭을 새로 짓는 것을 허가합니다. + Habilitar renombrado para los objetos renombrables. Cargo @@ -82,7 +117,7 @@ カーゴ メニュー 화물 메뉴 貨物選單 - 货物选单 + 货物菜单 Kargo Menüsü @@ -98,7 +133,7 @@ カーゴの空き容量: %1 선적 공간 남음: %1 貨物剩餘空間: %1 - 货物剩余空间: %1 + 货物剩余空间:%1 Kargo Alanı Kaldı: %1 @@ -106,7 +141,7 @@ Aktiviere Fracht Aktywuj cargo Ativar carga - Включить модуль перевозки грузов + Вкл. модуль перевозки грузов Povolit náklad Habilitar carga Abilita Cargo @@ -128,7 +163,7 @@ Abilita il modulo di caricamento in cargo Active la possibilité de charger du matériel dans un module de fret (véhicule/container). カーゴ モジュールで積み込みを有効化 - 화물 모듈에 싣기를 활성화합니다 + 화물 모듈을 활성화합니다 啟用貨物裝載功能 启用货物装载功能 @@ -175,7 +210,7 @@ %1<br/>berakodva ide:<br/>%2 %1<br/>загружен в<br/>%2 %1<br/>は<br/>%2へ積み込まれました - %1<br/>는<br/>%2 에 실림 + %1은(는)<br/>%2 에 실림 %1<br/>裝載至<br/>%2 %1<br/>装载至<br/>%2 @@ -191,7 +226,7 @@ 1%<br/>kirakodva ebből:<br/>%2 %1<br/>разгружен из<br/>%2 <br/>%1が<br/>%2から降ろされました - %1<br/>는<br/>%2 에서 내려짐 + %1은(는)<br/>%2에서 내려짐 從<br/>%2卸載<br/>%1 从<br/>%2卸载<br/>%1 @@ -238,7 +273,7 @@ %1<br/>no pudo ser cargado %1<br />n'a pas pu être chargé %1<br/>は積み込めませんでした - %1<br/>이 실릴 수가 없습니다 + %1을(를) 싣을 수가 없습니다 %1<br/>無法被裝載 %1<br/>无法被装载 %1<br/> kargo yüklenemedi @@ -254,7 +289,7 @@ %1<br/>no pudo ser descargado %1<br />n'a pas pu être déchargé %1<br/>は降ろせませんでした - %1<br/>이 내려질 수가 없습니다 + %1을(를) 하역할 수가 없습니다 %1<br/>無法被卸載 %1<br/>无法被卸载 %1<br/> kargo boşaltılamadı @@ -262,10 +297,24 @@ Custom Name カスタム名 + Nom personnalisé + Eigener Name + Własna nazwa + 自定义名称 + 임의 명칭 + Собственное название + Nombre personalizado Set a custom cargo name used in the cargo interface. カーゴ欄で使われるカスタム名を設定します。 + Définit un nom de fret personnalisé qui sera visible dans le menu de cargaison. + Установить пользовательское имя груза, используемое в интерфейсе погрузки. + Definiere eigenen Frachtnamen, welcher im Frachtraum genutzt wird. + Ustaw własną nazwę ładunku, używaną w menu ładunku. + 设置货物界面中使用的一个自定义货物名称。 + 화물 인터페이스에 쓰일 화물의 명칭을 설정합니다. + Establecer un nombre personalizado de carga en la interfaz de carga. Cargo Space @@ -320,7 +369,7 @@ Lo spazio del cargo necessita di mantenere questo oggetto (-1 per scaricabile) オブジェクトを積載するのに必要なカーゴ スペース (-1 で積載不可) 此貨物會佔掉多少空間(設定-1的話此貨物就不能被裝載) - 此货物会占掉多少空间(设定-1的话此货物就不能被装载) + 此货物会占掉多少空间(设定 -1 的话此货物就不能被装载) Wymagana przestrzeń ładunkowa dla tego obiektu (-1 dla niemożliwych do załadowania) 이 화물을 적재하는데 필요한 공간 (-1=무조건 적재가능) Грузовое пространство, необходимое для размещения этого объекта (-1 для незагружаемого) @@ -369,7 +418,7 @@ 空投时间系数 Współczynnik czasu zrzutu 공중 투하 시간 계수 - Коэффициент времени десантирования + Коэф. времени десантирования Fator de Tempo para soltar a carga Koeficient času nákladního výsadku Coeficiente de tiempo para lanzamiento @@ -381,9 +430,9 @@ Modificato per quanto tempo ci impiega a paracadutare un oggetto cargo. 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. @@ -395,12 +444,14 @@ 積載時間の係数 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. @@ -414,16 +465,50 @@ 修改要花多長時間來裝載/卸載物品。\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. + 修改装载/卸载物体所需的时间。\n时间,单位:秒,物体的大小乘以该系数值。 + 화물의 적재/하역 시 걸리는 시간을 설정합니다.\n초 단위로 물건의 크기에 곱셈하여 계산합니다. Reopen Cargo Menu Kargo Menüsünü Tekrar Aç カーゴ メニューを再度開く + Rouvrir le menu de cargaison + Переоткрыть меню погрузки + Frachtmenü erneut öffnen + Ponownie otwórz menu załadunku + 重新打开货物菜单 + 화물 메뉴 다시 열기 + Reabrir menú de carga Reopen the Cargo Menu after successful unload. Başarılı bir yük indirmeden sonra Kargo Menüsünü tekrar göster. カーゴを降ろした後に再びカーゴ メニューを開きます。 + Réouvre le menu de cargaison après un déchargement réussi. + Переоткрыть меню погрузки после успешной выгрузки. + Frachtmenü erneut öffnen, nach erfolgreichen Entladen. + Ponownie otwórz menu załadunku po udanym wyładowaniu. + 成功卸货后,重新打开货物菜单。 + 화물을 성공적으로 내리고 난 다음 화물 메뉴를 열지 결정합니다. + Reabrir menú de carga despues de una descarga satisfactoria. + + + Carry After Unload + 화물 내린 후 운반 + Нести после выгрузки + Llevar encima tras la descarga + 荷降ろし後の運搬 + Niesienie Po Rozładowaniu + Nach dem Entladen tragen + + + Controls whether cargo items are carried or dragged after unloading. + 화물 아이템을 내린 후 들거나 끌지 여부를 결정합니다. + Нужно ли переносить или тащить предметы после их выгрузки. + Controla si los objetos de carga son llevados encima o arrastrados despues de la descarga. + 荷降ろし後、貨物アイテムを運ぶか引きずるかを制御する。 + Kontroluje, czy przedmioty z ładunku są przenoszone lub ciągnięte po ich wyładowaniu. + Steuert, ob Objekte nach dem Entladen getragen oder gezogen werden. diff --git a/addons/casings/$PBOPREFIX$ b/addons/casings/$PBOPREFIX$ new file mode 100644 index 0000000000..622c48c2bb --- /dev/null +++ b/addons/casings/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\casings diff --git a/optionals/compat_rhs_afrf3/CfgEventHandlers.hpp b/addons/casings/CfgEventHandlers.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/CfgEventHandlers.hpp rename to addons/casings/CfgEventHandlers.hpp diff --git a/addons/casings/README.md b/addons/casings/README.md new file mode 100644 index 0000000000..7c1ac9b2a0 --- /dev/null +++ b/addons/casings/README.md @@ -0,0 +1,4 @@ +ace_casings +=============== + +Create persistent empty casing when bullets are fired by infantry weapons. diff --git a/addons/casings/XEH_PREP.hpp b/addons/casings/XEH_PREP.hpp new file mode 100644 index 0000000000..8a0738b272 --- /dev/null +++ b/addons/casings/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(createCasing); diff --git a/addons/casings/XEH_postInit.sqf b/addons/casings/XEH_postInit.sqf new file mode 100644 index 0000000000..e91ab96c0d --- /dev/null +++ b/addons/casings/XEH_postInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +if (!hasInterface || !GVAR(enabled)) exitWith {}; + +GVAR(cachedCasings) = createHashMap; +GVAR(casings) = []; +["CAManBase", "FiredMan", {call FUNC(createCasing)}] call CBA_fnc_addClassEventHandler; diff --git a/addons/casings/XEH_preInit.sqf b/addons/casings/XEH_preInit.sqf new file mode 100644 index 0000000000..9361d05015 --- /dev/null +++ b/addons/casings/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/optionals/compat_gm/XEH_preStart.sqf b/addons/casings/XEH_preStart.sqf similarity index 100% rename from optionals/compat_gm/XEH_preStart.sqf rename to addons/casings/XEH_preStart.sqf diff --git a/addons/casings/config.cpp b/addons/casings/config.cpp new file mode 100644 index 0000000000..815048a082 --- /dev/null +++ b/addons/casings/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"esteldunedain","Cyruz","diwako"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/casings/functions/fnc_createCasing.sqf b/addons/casings/functions/fnc_createCasing.sqf new file mode 100644 index 0000000000..22347d36a7 --- /dev/null +++ b/addons/casings/functions/fnc_createCasing.sqf @@ -0,0 +1,77 @@ +#include "..\script_component.hpp" +/* + * Author: esteldunedain / Cyruz / diwako + * Produces a casing matching the fired weapons caliber on the ground around the unit + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: ammo - Ammo used + * + * Return Value: + * None + * + * Example: + * [player, "", "","", "B_556x45_Ball"] call ace_casings_fnc_createCasing + * + * Public: No + */ + +params ["_unit", "", "", "", "_ammo"]; + +if (!isNull objectParent _unit) exitWith {}; + +private _modelPath = GVAR(cachedCasings) get _ammo; + +if (isNil "_modelPath") then { + private _cartridge = getText (configFile >> "CfgAmmo" >> _ammo >> "cartridge"); + //Default cartridge is a 5.56mm model + _modelPath = switch (_cartridge) do { + case "FxCartridge_9mm": { "A3\Weapons_f\ammo\cartridge_small.p3d" }; + case "FxCartridge_65": { "A3\weapons_f\ammo\cartridge_65.p3d" }; + case "FxCartridge_762": { "A3\weapons_f\ammo\cartridge_762.p3d" }; + case "FxCartridge_762x39": { "A3\weapons_f_enoch\ammo\cartridge_762x39.p3d" }; + case "FxCartridge_93x64_Ball": { "A3\Weapons_F_Mark\Ammo\cartridge_93x64.p3d" }; + case "FxCartridge_338_Ball": { "A3\Weapons_F_Mark\Ammo\cartridge_338_LM.p3d" }; + case "FxCartridge_338_NM": { "A3\Weapons_F_Mark\Ammo\cartridge_338_NM.p3d" }; + case "FxCartridge_127": { "A3\weapons_f\ammo\cartridge_127.p3d" }; + case "FxCartridge_127x54": { "A3\Weapons_F_Mark\Ammo\cartridge_127x54.p3d" }; + case "FxCartridge_slug": { "A3\weapons_f\ammo\cartridge_slug.p3d" }; + case "FxCartridge_12Gauge_HE_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_he_lxws.p3d" }; + case "FxCartridge_12Gauge_Slug_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_slug_lxws.p3d" }; + case "FxCartridge_12Gauge_Smoke_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_smoke_lxws.p3d" }; + case "FxCartridge_12Gauge_Pellet_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_pellet_lxws.p3d" }; + case "": { "" }; + default { "A3\Weapons_f\ammo\cartridge.p3d" }; + }; + GVAR(cachedCasings) set [_ammo, _modelPath]; +}; + +if (_modelPath isEqualTo "") exitWith {}; + +private _unitPos = getposASL _unit; +// Distant shooters don't produce as many cases +if ((AGLToASL positionCameraToWorld [0,0,0]) vectorDistance _unitPos > 100 && {random 1 < 0.9}) exitWith {}; + +private _weapDir = _unit weaponDirection currentWeapon _unit; +private _ejectDir = _weapDir vectorCrossProduct [0, 0, 1]; +private _pos = _unitPos + vectorAdd (_weapDir vectorMultiply (-0.5 + random 2)) + vectorAdd (_ejectDir vectorMultiply (0.2 + random 2)); + +[ + { + params ["_modelPath", "_pos"]; + + private _lisPos = (lineIntersectsSurfaces [_pos, _pos vectorAdd [0,0,-1e11], objNull, objNull, true, 1, "ROADWAY", "FIRE"]) #0; + private _casing = createSimpleObject [_modelPath, (_lisPos #0 vectorAdd [0,0,0.005]), true]; + _casing setDir (random 360); + _casing setVectorUp _lisPos #1; + private _idx = GVAR(casings) pushBack _casing; + + for "_" from 0 to (_idx - GVAR(maxCasings)) do { + deleteVehicle (GVAR(casings) deleteAt 0); + }; + }, + [_modelPath,_pos], + 0.4 +] call CBA_fnc_waitAndExecute; diff --git a/addons/casings/initSettings.sqf b/addons/casings/initSettings.sqf new file mode 100644 index 0000000000..3dea180e2d --- /dev/null +++ b/addons/casings/initSettings.sqf @@ -0,0 +1,17 @@ +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(displayName), LSTRING(description)], + LSTRING(Settings_DisplayName), + true, + false, + {}, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(maxCasings), "SLIDER", + [LSTRING(maxCasings_displayName), LSTRING(maxCasings_description)], + LSTRING(Settings_DisplayName), + [100, 500, 250, -1], + false +] call CBA_fnc_addSetting; diff --git a/addons/casings/script_component.hpp b/addons/casings/script_component.hpp new file mode 100644 index 0000000000..c734aca4e3 --- /dev/null +++ b/addons/casings/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT casings +#define COMPONENT_BEAUTIFIED Casings +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_CASINGS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_CASINGS + #define DEBUG_SETTINGS DEBUG_SETTINGS_CASINGS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/casings/stringtable.xml b/addons/casings/stringtable.xml new file mode 100644 index 0000000000..5250262098 --- /dev/null +++ b/addons/casings/stringtable.xml @@ -0,0 +1,55 @@ + + + + + ACE Casings + ACE 薬莢 + ACE Łuski + ACE 탄피 + ACE 弹壳 + ACE Гильзы + ACE Casquillos + ACE Patronenhülsen + + + Casings Enabled + 薬莢の有効化 + Łuski włączone + 탄피 활성화 + 开启弹壳生成 + Гильзы включены + Habilitar Casquillos + Patronenhülsen aktiviert + + + Enable persistent casings (POTENTIAL performance impact on old/weak systems) + 永続的な薬莢を有効にする (古い/弱いシステムに対する潜在的なパフォーマンスの影響) + Włącz pozostawanie łusek (MOŻLIWY wpływ na wydajność na starych/słabych komputerach) + 영구적으로 남는 탄피를 활성화합니다(오래되고 취약한 시스템에 잠재적인 성능에 영향을 미칩니다.) + 开启生成持续存在的弹壳(可能对较老和性能不行的系统有影响) + Включить постоянные гильзы (ПОТЕНЦИАЛЬНО может повлиять на производительность на старых/слабых системах) + Habilitar persistencia de casquillos (POTENCIAL impacto en el rendimiento de ordenadores antiguos o no potentes) + Persistente Patronenhülsen aktivieren (POTENZIELLE Leistungseinbußen bei alten/schwachen Systemen) + + + Maximum casings + 薬莢の最大量 + Maksymalna liczba łusek + 탄피 최대 갯수 + 最大弹壳量 + Макс. кол-во гильз + Casquillos máximos + Maximale Patronenhülsen + + + Maximum amount of casings to display + 表示される薬莢の最大の数 + Maksymalna liczba wyświetlanych łusek + 표시할 최대 탄피 갯수 + 显示的最大弹壳数量 + Максимальное количество гильз для отображения + Máxima cantidad de casquillos para mostrar + Maximale Anzahl an Patronenhülsen, die angezeigt werden + + + diff --git a/addons/chemlights/CfgAmmo.hpp b/addons/chemlights/CfgAmmo.hpp index 696c39e724..8c2b9a43ae 100644 --- a/addons/chemlights/CfgAmmo.hpp +++ b/addons/chemlights/CfgAmmo.hpp @@ -2,57 +2,57 @@ class CfgAmmo { class Chemlight_base; - + class Chemlight_Blue: Chemlight_base { timeToLive = 28800; // 8h as per cyalume website }; - + class Chemlight_Red: Chemlight_base { timeToLive = 43200; // 12h as per cyalume website }; - + class Chemlight_Green: Chemlight_base { timeToLive = 43200; }; - + class Chemlight_Yellow: Chemlight_base { timeToLive = 43200; }; - + class ACE_G_Chemlight_Orange: Chemlight_base { timeToLive = 43200; effectsSmoke = "ACE_ChemlightEffect_Orange"; model = "\A3\Weapons_f\chemlight\chemlight_yellow_lit"; }; - + class ACE_G_Chemlight_Orange_Infinite: ACE_G_Chemlight_Orange { timeToLive = 1e10; }; - + class ACE_G_Chemlight_White: Chemlight_base { timeToLive = 28800; effectsSmoke = "ACE_ChemlightEffect_White"; model = "\A3\Weapons_f\chemlight\chemlight_yellow_lit"; }; - + class ACE_G_Chemlight_White_Infinite: ACE_G_Chemlight_White { timeToLive = 1e10; }; - - class ACE_G_Chemlight_HiRed: Chemlight_Red { + + class ACE_G_Chemlight_HiRed: Chemlight_Red { effectsSmoke = "ACE_ChemlightEffect_HiRed"; timeToLive = 1800; }; - + class ACE_G_Chemlight_HiRed_Infinite: ACE_G_Chemlight_HiRed { timeToLive = 1e10; }; - + class ACE_G_Chemlight_HiYellow: Chemlight_Yellow { effectsSmoke = "ACE_ChemlightEffect_HiYellow"; timeToLive = 1800; }; - + class ACE_G_Chemlight_HiYellow_Infinite: ACE_G_Chemlight_HiYellow { timeToLive = 1e10; }; @@ -88,7 +88,7 @@ class CfgAmmo { effectsSmoke = "ACE_ChemlightEffect_UltraHiOrange"; timeToLive = 300; }; - + class ACE_G_Chemlight_UltraHiOrange_Infinite: ACE_G_Chemlight_UltraHiOrange { timeToLive = 1e10; }; diff --git a/addons/chemlights/CfgLights.hpp b/addons/chemlights/CfgLights.hpp index 1b9d445f30..005cc26460 100644 --- a/addons/chemlights/CfgLights.hpp +++ b/addons/chemlights/CfgLights.hpp @@ -99,7 +99,7 @@ class CfgLights { class ACE_ChemlightLight_UltraHiOrange: ACE_ChemlightLight_Orange { intensity = 12000; - + ULTRA_HI_ATTENUATION }; diff --git a/addons/chemlights/CfgWeapons.hpp b/addons/chemlights/CfgWeapons.hpp index 8ed9d73583..a3d5ab5afe 100644 --- a/addons/chemlights/CfgWeapons.hpp +++ b/addons/chemlights/CfgWeapons.hpp @@ -54,6 +54,7 @@ class CfgWeapons { model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = QPATHTOF(UI\ace_chemlight_shield_x_ca.paa); scope = 2; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; diff --git a/addons/chemlights/functions/fnc_compileChemlightMenu.sqf b/addons/chemlights/functions/fnc_compileChemlightMenu.sqf index c8cccb88bd..4deade18e6 100644 --- a/addons/chemlights/functions/fnc_compileChemlightMenu.sqf +++ b/addons/chemlights/functions/fnc_compileChemlightMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Compile list of chemlight classnames and add to the "Chemlight shield" parent menu. diff --git a/addons/chemlights/functions/fnc_getShieldComponents.sqf b/addons/chemlights/functions/fnc_getShieldComponents.sqf index f372241599..f942480146 100644 --- a/addons/chemlights/functions/fnc_getShieldComponents.sqf +++ b/addons/chemlights/functions/fnc_getShieldComponents.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Check a unit for whether they're carrying a chemlight shield and a chemlight. diff --git a/addons/chemlights/functions/fnc_initIR.sqf b/addons/chemlights/functions/fnc_initIR.sqf index b6be8cf5fe..a49cf96447 100644 --- a/addons/chemlights/functions/fnc_initIR.sqf +++ b/addons/chemlights/functions/fnc_initIR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Spawn IR marker for dummy IR physX object. diff --git a/addons/chemlights/functions/fnc_isIRClass.sqf b/addons/chemlights/functions/fnc_isIRClass.sqf index 3d2021749e..7d43bc731c 100644 --- a/addons/chemlights/functions/fnc_isIRClass.sqf +++ b/addons/chemlights/functions/fnc_isIRClass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Check if an ammo classname is an IR chemlight. diff --git a/addons/chemlights/functions/fnc_prepShield.sqf b/addons/chemlights/functions/fnc_prepShield.sqf index 3f4f09d430..46c567a6b3 100644 --- a/addons/chemlights/functions/fnc_prepShield.sqf +++ b/addons/chemlights/functions/fnc_prepShield.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Combine a chemlight shield item and a chemlight item into a light. diff --git a/addons/chemlights/functions/fnc_removeIR.sqf b/addons/chemlights/functions/fnc_removeIR.sqf index 1c40a5b126..e6c186c3f1 100644 --- a/addons/chemlights/functions/fnc_removeIR.sqf +++ b/addons/chemlights/functions/fnc_removeIR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Kill chemlight and any dummy objects attached to it. diff --git a/addons/chemlights/functions/fnc_throwEH.sqf b/addons/chemlights/functions/fnc_throwEH.sqf index 2bedff7cb7..49ec199db1 100644 --- a/addons/chemlights/functions/fnc_throwEH.sqf +++ b/addons/chemlights/functions/fnc_throwEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, voiper * Fired EH, for handling chemlight ThrowMuzzles. diff --git a/addons/chemlights/functions/fnc_throwIR.sqf b/addons/chemlights/functions/fnc_throwIR.sqf index b507c8e5b1..da581a90b0 100644 --- a/addons/chemlights/functions/fnc_throwIR.sqf +++ b/addons/chemlights/functions/fnc_throwIR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Create and throw IR chemlight. diff --git a/addons/chemlights/functions/script_component.hpp b/addons/chemlights/functions/script_component.hpp deleted file mode 100644 index 961201c26c..0000000000 --- a/addons/chemlights/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\chemlights\script_component.hpp" diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index c1c6c930d8..ce31e952ab 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -6,11 +6,11 @@ ケミライト Świetliki Knicklichter - 켐라이트 + 화학조명 Cyalumes Luce chimica 螢光棒 - 萤光棒 + 荧光棒 Химсвет Bastões de Luz Chemická světla @@ -54,11 +54,11 @@ [ACE] ケミライト [ACE] Świetliki [ACE] Knicklichter - [ACE] 켐라이트 + [ACE] 화학조명 [ACE] Cyalumes [ACE] Luci chimiche [ACE] 螢光棒 - [ACE] 萤光棒 + [ACE] 荧光棒 [ACE] Химсвет [ACE] Bastões de Luz [ACE] Chemická světla @@ -74,8 +74,8 @@ Cyalume (orange) Luce chimica (Arancione) 螢光棒 (橘色) - 萤光棒 (橘色) - Химсвет (Оранжевый) + 荧光棒(橘色) + Химсвет (оранжевый) Bastão de Luz (Laranja) Chemické světlo (Oranžové) Luz química (naranja) @@ -102,12 +102,12 @@ 種類: 照明 - オレンジ<br />装填数: 1<br />次で使用: 携帯 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 />사용처: 손 + 종류: 밝은 오렌지<br />수량: 1<br />사용처: 손 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 />В руках + 类型:光—橘色<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 @@ -118,12 +118,12 @@ ケミライト (白) Świetlik (biały) Knicklicht (weiß) - 켐라이트 (하양) + 화학조명 (하양) Cyalume (blanc) Luce chimica (Bianca) 螢光棒 (白色) - 萤光棒 (白色) - Химсвет (Белый) + 荧光棒(白色) + Химсвет (белый) Bastão de Luz (Branco) Chemické světlo (Bílé) Luz química (Blanca) @@ -150,12 +150,12 @@ 種類: 照明 - 白<br />装填数: 1<br />次で使用: 携帯 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 />사용처: 손 + 종류: 하얀색<br />수량: 1<br />사용처: 손 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 />В руках + 类型:光—白色<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 @@ -166,12 +166,12 @@ ケミライト (高輝度 赤) Świetlik (jaskrawy czerwony) Knicklicht (rot, hell) - 켐라이트 (밝은 빨간색) + 화학조명 (밝은 빨간색) Cyalume HL (rouge) Luce chimica (Hi Rossa) 螢光棒 (超亮紅色) - 萤光棒 (超亮红色) - Химсвет (Ярко-Красный) + 荧光棒(高亮红色) + Химсвет (ярко-красный) Bastão de Luz (Vermelho Forte) Chemické světlo (Červené jasné) Luz química (Roja Hi) @@ -186,8 +186,8 @@ Lum. rouge HL Luce Hi Rossa 超亮紅色光 - 超亮红色光 - Яркий Красный свет + 高亮红色光 + Яркий красный свет Luz forte vermelha Červené jasné světlo Luz roja Hi @@ -202,8 +202,8 @@ 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 />В руках + 类型:光—高亮红色(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 @@ -214,12 +214,12 @@ ケミライト (高輝度 黄) Świetlik (jaskrawy żółty) Knicklicht (gelb, hell) - 켐라이트 (밝은 노란색) + 화학조명 (밝은 노란색) Cyalume HL (jaune) Luce chimica (Hi Gialla) 螢光棒 (超亮黃色) - 萤光棒 (超亮黄色) - Химсвет (Ярко-Желтый) + 荧光棒(高亮黄色) + Химсвет (ярко-жёлтый) Bastão de Luz (Amarelo Forte) Chemické světlo (Žluté jasné) Luz química (Amarilla Hi) @@ -234,8 +234,8 @@ Lum. jaune HL Luce Hi Gialla 超亮黃色光 - 超亮黄色光 - Яркий Желтый свет + 高亮黄色光 + Яркий жёлтый свет Luz forte amarela Žluté jasné světlo Luz amarilla Hi @@ -246,12 +246,12 @@ 種類: 照明 - 高輝度 黄 (30分間)<br />装填数: 1<br />次で使用: 携帯 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 + 종류: 밝은 노란색 (30분)<br />수량: 1<br />사용처: Hand 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 />В руках + 类型:光—高亮黄色(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 @@ -262,12 +262,12 @@ ケミライト (高輝度 白) Świetlik (jaskrawy biały) Knicklicht (weiß, hell) - 켐라이트 (밝은 하얀색) + 화학조명 (밝은 하얀색) Cyalume HL (blanc) Luce chimica (Hi Bianca) 螢光棒 (超亮白色) - 萤光棒 (超亮白色) - Химсвет (Ярко-Белый) + 荧光棒(高亮白色) + Химсвет (ярко-белый) Bastão de Luz (Branco Forte) Chemické světlo (Bílé jasné) Luz química (Blanca Hi) @@ -282,8 +282,8 @@ Lum. blanche HL Luce Hi Bianca 超亮白色光 - 超亮白色光 - Яркий Белый свет + 高亮白色光 + Яркий белый свет Luz forte branca Bílé jasné světlo Luz blanca Hi @@ -298,8 +298,8 @@ 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 />В руках + 类型:光—高亮白色(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 @@ -312,12 +312,14 @@ Ś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) Işık Çubuğu (Mavi) + 화학조명 (밝은 파란색) Blue Hi Light @@ -326,12 +328,14 @@ 高輝度の青色 Jaskrawe niebieskie światło Luce Hi Blu - Яркий Синий свет + Яркий синий свет Luz forte azul 超亮藍色光 + 高亮蓝色光 Modré jasné světlo Luz azul Hi Mavi Yüksek Işık + 밝은 파란색 Type: Light - Blue Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -340,12 +344,14 @@ 種類: 照明 - 高輝度 青 (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 />В руках + Тип: Свет - ярко-синий (30 минут)<br />1 штука<br />В руках Tipo: Luz - Azul Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão 類型: 光 - 超亮藍色 (30分鐘)<br />發數: 1<br />使用於: 手 + 类型:光—高亮蓝色(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 Type: Light - Blue Hi (30 minute)<br />Rounds: 1<br />Used in: Hand + 종류: 밝은 파란색 (30분)<br />수량: 1<br />사용처: 손 Chemlight (Hi Green) @@ -354,12 +360,14 @@ ケミライト (高輝度 緑) Świetlik (jaskrawy zielony) Luce chimica (Hi Verde) - Химсвет (Ярко-Зеленый) + Химсвет (ярко-зелёный) Bastão de Luz (Verde Forte) 螢光棒(超亮綠色) + 荧光棒(高亮绿色) Chemické světlo (Zelené jasné) Luz química (Verde Hi) Işık Çubuğu (Yeşil) + 화학조명 (밝은 초록색) Green Hi Light @@ -368,12 +376,14 @@ 高輝度の青色 Jaskrawe zielone światło Luce Hi Verde - Яркий Зеленый свет + Яркий зелёный свет Luz forte verde 超亮綠色光 + 高亮绿色光 Zelené jasné světlo Luz verde Hi Yeşil Yüksek Işık + 밝은 초록색 Type: Light - Green Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -382,12 +392,14 @@ 種類: 照明 - 高輝度 緑 (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 />В руках + Тип: Свет - ярко-зелёный (30 минут)<br />1 штука<br />В руках Tipo: Luz - Verde Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão 類型: 光 - 超亮綠色 (30分鐘)<br />發數: 1<br />使用於: 手 + 类型:光—高亮绿色(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 Type: Light - Green Hi (30 minute)<br />Rounds: 1<br />Used in: Hand + 종류: 밝은 초록색 (30분)<br />수량: 1<br />사용처: 손 Chemlight (Ultra-Hi Orange) @@ -396,12 +408,14 @@ ケミライト (高輝度 オレンジ) Ś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) Işık Çubuğu (Turuncu) + 화학조명 (밝은 주황색) Orange Ultra-Hi Light @@ -410,12 +424,14 @@ ウルトラ高輝度のオレンジ色 Ultra-jaskrawe pomarańczowe światło Luce Ultra-Hi Arancione - Ультраяркий Оранжевый свет + Ультраяркий оранжевый свет Luz ultra forte laranja 極亮橘色光 + 高亮橘色光 Oranžové velmi jasné světlo Luz naranja Ultra-Hi Turuncu Yüksek Işık + 밝은 주황색 Type: Light - Orange Ultra-Hi (5 minute)<br />Rounds: 1<br />Used in: Hand @@ -424,24 +440,26 @@ 種類: 照明 - ウルトラ高輝度 オレンジ (5分間)<br />装填数: 1<br />次で使用: 携帯 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 />В руках + Тип: Свет - ультраяркий оранжевый (5 минут)<br />1 штука<br />В руках Tipo: Luz - Laranja Ultra Forte (5 minutos)<br/>Usos: 1<br/>Usado em: Mão 類型: 光 - 極亮橘色 (5分鐘)<br />發數: 1<br />使用於: 手 + 类型:光—高亮橘色(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 Type: Light - Orange Ultra-Hi (5 minute)<br />Rounds: 1<br />Used in: Hand + 종류: 밝은 주황색 (5분)<br />수량: 1<br />사용처: 손 Chemlight (IR) ケミライト (IR) Świetlik (podczerwony) Knicklicht (IR) - 켐라이트 (적외선) + 화학조명 (적외선) Cyalume (IR) Luce chimica (IR) 螢光棒 (紅外線) - 萤光棒 (红外线) - Химсвет (Инфракрасный) + 荧光棒(红外线) + Химсвет (инфракрасный) Bastão de Luz (IV) Chemické světlo (Infračervené) Luz química (IR) @@ -452,7 +470,7 @@ 赤外線光 Światło podczerwone IR-Knicklicht - 적외선 켐라이트 + 적외선 화학조명 Lum. IR Luce IR 紅外線光 @@ -472,8 +490,8 @@ 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 />В руках + 类型:光—红外线<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 @@ -484,12 +502,12 @@ ケミライト シールド (空) Osłona na świetlik (pusta) Knicklicht-Abschirmung (leer) - 켐라이트 쉴드 (비어있음) + 화학조명 가림막 (비어있음) Etui cyalume (vide) Scudo Luce chimica (Vuoto) 螢光棒保護殼 (空) - 萤光棒保护壳 (空) - Контейнер для Химсвета (Пуст) + 荧光棒保护壳(空) + Контейнер для химсвета (пустой) Estojo de Luz (Vazio) Clona na chemické světlo Protector de luz química (Vacía) @@ -500,12 +518,12 @@ ケミライトを入れられます。シールドとケミライトを組み合わせることで、照明にもなりえます。 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. 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 @@ -516,12 +534,12 @@ ケミライト シールド (緑) Osłona na świetlik (zielona) Knicklicht-Abschirmung (grün) - 켐라이트 쉴드 (초록) + 화학조명 가림막 (초록) 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) @@ -537,7 +555,7 @@ Luce da lettura Verde. 綠色閱讀燈 绿色阅读灯。 - Ночник из Химсвета (Зеленый) + Ночник из зелёного химсвета. Luz de leitura verde. Zelené světlo na čtení. Luz de lectura verde @@ -548,12 +566,12 @@ ケミライト シールド (赤) Osłona na świetlik (czerwona) Knicklicht-Abschirmung (rot) - 켐라이트 쉴드 (빨강) + 화학조명 가림막 (빨강) 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) @@ -569,7 +587,7 @@ Luce da lettura Rossa. 紅色閱讀燈 红色阅读灯。 - Ночник из Химсвета (Красный) + Ночник из красного химсвета. Luz de leitura vermelha. Červené světlo na čtení. Luz de lectura roja @@ -580,12 +598,12 @@ ケミライト シールド (青) Osłona na świetlik (niebieska) Knicklicht-Abschirmung (blau) - 켐라이트 쉴드 (파랑) + 화학조명 가림막 (파랑) 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) @@ -601,7 +619,7 @@ Luce da lettura Blu. 藍色閱讀燈 蓝色阅读灯。 - Ночник из Химсвета (Синий) + Ночник из синего химсвета. Luz de leitura azul. Modré světlo na čtení. Luz de lectura azul @@ -612,12 +630,12 @@ ケミライト シールド (黄) Osłona na świetlik (żółta) Knicklicht-Abschirmung (gelb) - 켐라이트 쉴드 (노랑) + 화학조명 가림막 (노랑) 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) @@ -633,7 +651,7 @@ Luce da lettura Gialla. 黃色閱讀燈 黄色阅读灯。 - Ночник из Химсвета (Желтый) + Ночник из жёлтого химсвета. Luz de leitura amarela. Žluté světlo na čtení. Luz de lectura amarilla @@ -644,12 +662,12 @@ ケミライト シールド (オレンジ) Osłona na świetlik (pomarańczowa) Knicklicht-Abschirmung (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) @@ -665,7 +683,7 @@ Luce da lettura Arancione. 橘色閱讀燈 橘色阅读灯。 - Ночник из Химсвета (Оранжевый) + Ночник из оранжевого химсвета. Luz de leitura laranja. Oranžové světlo na čtení. Luz de lectura naranja @@ -676,12 +694,12 @@ ケミライト シールド (白) Osłona na świetlik (biała) Knicklicht-Abschirmung (weiß) - 켐라이트 쉴드 (하양) + 화학조명 가림막 (하양) 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) @@ -697,7 +715,7 @@ Luce da lettura Bianca. 白色閱讀燈 白色阅读灯。 - Ночник из Химсвета (Белый) + Ночник из белого химсвета. Luz de leitura branca. Bílé světlo na čtení. Luz de lectura blanca diff --git a/addons/common/CfgSounds.hpp b/addons/common/CfgSounds.hpp index d564f6717d..5681d1a194 100644 --- a/addons/common/CfgSounds.hpp +++ b/addons/common/CfgSounds.hpp @@ -1,7 +1,7 @@ class CfgSounds { class ACE_Sound_Click { - sound[] = {PATHTOF(sounds\ACE_click.wav), 1, 1, 200}; + sound[] = {QPATHTOF(sounds\ACE_click.wav), 1, 1, 200}; titles[] = {}; }; }; diff --git a/addons/common/CfgUIGrids.hpp b/addons/common/CfgUIGrids.hpp index 295a9098eb..1e8963e03e 100644 --- a/addons/common/CfgUIGrids.hpp +++ b/addons/common/CfgUIGrids.hpp @@ -3,7 +3,16 @@ class CfgUIGrids { class Presets { class Arma3 { class Variables { - grid_ACE_displayText[] = {{((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)),safeZoneY + 0.175 * safezoneH, (10 *(((safezoneW / safezoneH) min 1.2) / 40)), (3 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; + grid_ACE_displayText[] = { + { + "((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40))", + "safeZoneY + 0.175 * safezoneH", + "(10 *(((safezoneW / safezoneH) min 1.2) / 40))", + "(3 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))" + }, + "(((safezoneW / safezoneH) min 1.2) / 40)", + "((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)" + }; }; }; }; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index 09a828e475..8662df8d82 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -39,4 +39,3 @@ class CfgWeapons { }; }; }; - diff --git a/addons/common/CompassControl.hpp b/addons/common/CompassControl.hpp index 899c609161..971a4a2f99 100644 --- a/addons/common/CompassControl.hpp +++ b/addons/common/CompassControl.hpp @@ -37,25 +37,25 @@ class GVAR(CompassControl): RscControlsGroupNoScrollbars { _display displayAddEventHandler [ARR_2('MouseMoving',_fnc_update)];\ _display displayAddEventHandler [ARR_2('MouseHolding',_fnc_update)];\ ); - x = LEFT; - y = TOP; - w = WIDTH; - h = HEIGHT; + x = QUOTE(LEFT); + y = QUOTE(TOP); + w = QUOTE(WIDTH); + h = QUOTE(HEIGHT); class controls { class Background: RscText { colorBackground[] = BACKGROUND_COLOR; x = 0; y = 0; - w = WIDTH; - h = HEIGHT; + w = QUOTE(WIDTH); + h = QUOTE(HEIGHT); }; class Pointer: RscText { colorBackground[] = POINTER_COLOR; - x = WIDTH/2 - WIDTH*POINTER_WIDTH_FACTOR/2; + x = QUOTE(WIDTH/2 - WIDTH*POINTER_WIDTH_FACTOR/2); y = 0; - w = WIDTH*POINTER_WIDTH_FACTOR; - h = HEIGHT; + w = QUOTE(WIDTH*POINTER_WIDTH_FACTOR); + h = QUOTE(HEIGHT); }; class CompassGroup: RscControlsGroupNoScrollbars { onLoad = QUOTE(\ @@ -65,44 +65,44 @@ class GVAR(CompassControl): RscControlsGroupNoScrollbars { ); x = 0; y = 0; - w = 2*WIDTH; - h = 2*HEIGHT; + w = QUOTE(2*WIDTH); + h = QUOTE(2*HEIGHT); class controls { class Compass0: RscPicture { text = TEXTURE_0; - x = 0 * (WIDTH / 4); + x = QUOTE(0 * (WIDTH / 4)); y = 0; - w = WIDTH/4; - h = HEIGHT; + w = QUOTE(WIDTH/4); + h = QUOTE(HEIGHT); }; class Compass1: Compass0 { text = TEXTURE_1; - x = 1 * (WIDTH / 4); + x = QUOTE(1 * (WIDTH / 4)); }; class Compass2: Compass0 { text = TEXTURE_2; - x = 2 * (WIDTH / 4); + x = QUOTE(2 * (WIDTH / 4)); }; class Compass3: Compass0 { text = TEXTURE_3; - x = 3 * (WIDTH / 4); + x = QUOTE(3 * (WIDTH / 4)); }; class Compass4: Compass0 { text = TEXTURE_0; - x = 4 * (WIDTH / 4); + x = QUOTE(4 * (WIDTH / 4)); }; class Compass5: Compass0 { text = TEXTURE_1; - x = 5 * (WIDTH / 4); + x = QUOTE(5 * (WIDTH / 4)); }; class Compass6: Compass0 { text = TEXTURE_2; - x = 6 * (WIDTH / 4); + x = QUOTE(6 * (WIDTH / 4)); }; class Compass7: Compass0 { text = TEXTURE_3; - x = 7 * (WIDTH / 4); + x = QUOTE(7 * (WIDTH / 4)); }; }; }; diff --git a/addons/common/DisableMouseDialog.hpp b/addons/common/DisableMouseDialog.hpp index c723ea759e..75689cf652 100644 --- a/addons/common/DisableMouseDialog.hpp +++ b/addons/common/DisableMouseDialog.hpp @@ -1,4 +1,3 @@ -class ctrlMapEmpty; class GVAR(DisableMouse_Dialog) { idd = -1; movingEnable = 0; diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index f647b7b1de..72fd7f6233 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -37,10 +37,10 @@ class RscTitles { SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0, 0, 0, 0.5}; - x = safeZoneW + safeZoneX - 0 * safezoneW; //safeZoneW + safeZoneX - 0.2 * safezoneW; - y = safeZoneY + 0.2 * safezoneH; - w = 0.2 * safeZoneW; - h = 0.1 * SafeZoneH; + x = "safeZoneW + safeZoneX - 0 * safezoneW"; //safeZoneW + safeZoneX - 0.2 * safezoneW; + y = "safeZoneY + 0.2 * safezoneH"; + w = "0.2 * safeZoneW"; + h = "0.1 * SafeZoneH"; font = "RobotoCondensed"; }; }; @@ -61,10 +61,10 @@ class RscTitles { SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0.8, 0, 0, 0.5}; - x = 0.3 * safeZoneW + safeZoneX; - y = 0.4 * safezoneH + safeZoneY; - w = 0.4 * safeZoneW; - h = 0.2 * SafeZoneH; + x = "0.3 * safeZoneW + safeZoneX"; + y = "0.4 * safezoneH + safeZoneY"; + w = "0.4 * safeZoneW"; + h = "0.2 * SafeZoneH"; }; }; }; diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index 6770ca598b..bef2994e7d 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -1,19 +1,20 @@ class GVAR(ProgressBar_Dialog) { idd = -1; movingEnable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBG)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 2)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 3)];); + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(dlgProgress)),_this select 0)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBG)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 2)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 3)];); objects[] = {}; class controlsBackground { - class Background { - idc = -1; + class Background: ctrlMapEmpty { + idc = 101; moving = 0; + fade = 1; font = "TahomaB"; text = ""; sizeEx = 0; lineSpacing = 0; - type = 0; - style = 0; + style = 48; + type = 101; size = 1; colorBackground[] = {0, 0, 0, 0.0}; colorText[] = {0, 0, 0, 0}; diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index 4b54765539..24ffbce3b7 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -10,7 +10,9 @@ PREP(readSettingsFromParamsArray); PREP(actionKeysNamesConverted); PREP(addCanInteractWithCondition); PREP(addLineToDebugDraw); +PREP(addSwayFactor); PREP(addToInventory); +PREP(addWeapon); PREP(assignedItemFix); PREP(assignObjectsInList); PREP(ambientBrightness); @@ -50,20 +52,24 @@ PREP(dropBackpack); PREP(endRadioTransmission); PREP(eraseCache); PREP(errorMessage); +PREP(escapeRegex); PREP(findUnloadPosition); PREP(firedEH); PREP(fixCollision); PREP(fixFloating); PREP(fixLoweredRifleAnimation); PREP(fixPosition); +PREP(getAddon); PREP(getAllDefinedSetVariables); PREP(getAwakeAnim); +PREP(getConfigName); PREP(getCountOfItem); PREP(getDeathAnim); PREP(getDefaultAnim); PREP(getDefinedVariable); PREP(getDefinedVariableDefault); PREP(getDefinedVariableInfo); +PREP(getFiremodeIndex); PREP(getFirstObjectIntersection); PREP(getFirstTerrainIntersection); PREP(getGunner); @@ -104,6 +110,7 @@ PREP(handleModifierKey); PREP(handleModifierKeyUp); PREP(hasItem); PREP(hasMagazine); +PREP(hasZeusAccess); PREP(headBugFix); PREP(hideUnit); PREP(interpolateFromArray); @@ -111,7 +118,6 @@ PREP(inTransitionAnim); PREP(isAwake); PREP(isEngineer); PREP(isEOD); -PREP(isFeatureCameraActive); PREP(isInBuilding); PREP(isMedic); PREP(isModLoaded); @@ -127,7 +133,6 @@ PREP(muteUnitHandleInitPost); PREP(muteUnitHandleRespawn); PREP(nearestVehiclesFreeSeat); PREP(numberToDigits); -PREP(numberToDigitsString); PREP(numberToString); PREP(onAnswerRequest); PREP(owned); @@ -142,9 +147,11 @@ PREP(receiveRequest); PREP(registerItemReplacement); PREP(removeCanInteractWithCondition); PREP(removeSpecificMagazine); +PREP(replaceRegisteredItems); PREP(requestCallback); PREP(resetAllDefaults); PREP(restoreVariablesJIP); +PREP(rscObjectHelper); PREP(runAfterSettingsInit); PREP(runTests); PREP(sanitizeString); @@ -175,6 +182,7 @@ PREP(statusEffect_sendEffects); PREP(statusEffect_set); PREP(stringCompare); PREP(stringToColoredText); +PREP(swayLoop); PREP(switchPersistentLaser); PREP(switchToGroupSide); PREP(throttledPublicVariable); @@ -182,11 +190,14 @@ PREP(toBin); PREP(toBitmask); PREP(toHex); PREP(toNumber); +PREP(throwWeapon); PREP(unhideUnit); PREP(uniqueElements); PREP(uniqueItems); +PREP(uniqueUnitItems); PREP(unloadPerson); PREP(unloadPersonLocal); +PREP(unloadUnitWeapon); PREP(unmuteUnit); PREP(useItem); PREP(useMagazine); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 78a5091369..c250bda652 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -19,14 +19,16 @@ //Status Effect EHs: [QGVAR(setStatusEffect), {_this call FUNC(statusEffect_set)}] call CBA_fnc_addEventHandler; -["forceWalk", false, ["ace_advanced_fatigue", "ACE_SwitchUnits", "ACE_Attach", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches", "ace_medical_fracture"]] call FUNC(statusEffect_addType); -["blockSprint", false, ["ace_advanced_fatigue", "ace_medical_fracture"]] 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", "ace_medical_fracture"]] call FUNC(statusEffect_addType); +["blockSprint", false, ["ace_advanced_fatigue", "ace_dragging", "ace_medical_fracture"]] call FUNC(statusEffect_addType); ["setCaptive", true, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered)]] call FUNC(statusEffect_addType); ["blockDamage", false, ["fixCollision", "ACE_cargo"]] call FUNC(statusEffect_addType); ["blockEngine", false, ["ACE_Refuel"]] call FUNC(statusEffect_addType); -["blockThrow", false, ["ACE_Attach", "ACE_concertina_wire", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_rearm", "ACE_refuel", "ACE_Sandbag", "ACE_Trenches", "ACE_tripod"]] call FUNC(statusEffect_addType); +["blockThrow", false, ["ACE_Attach", "ACE_concertina_wire", "ace_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_rearm", "ACE_refuel", "ACE_Sandbag", "ACE_Trenches", "ACE_tripod"]] call FUNC(statusEffect_addType); ["setHidden", true, ["ace_unconscious"]] call FUNC(statusEffect_addType); ["blockRadio", false, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType); +["blockSpeaking", false, ["ace_unconscious"]] call FUNC(statusEffect_addType); +["lockInventory", true, []] call FUNC(statusEffect_addType); [QGVAR(forceWalk), { params ["_object", "_set"]; @@ -78,12 +80,23 @@ if (_object isEqualTo ACE_Player && {_set > 0}) then { call FUNC(endRadioTransmission); }; - if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { + if (["task_force_radio"] call FUNC(isModLoaded)) then { _object setVariable ["tf_unable_to_use_radio", _set > 0, true]; }; - if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { + if (["acre_main"] call FUNC(isModLoaded)) then { + _object setVariable ["acre_sys_core_isDisabledRadio", _set > 0, true]; + }; +}] call CBA_fnc_addEventHandler; + +[QGVAR(blockSpeaking), { + params ["_object", "_set"]; + TRACE_2("blockSpeaking EH",_object,_set); + if (["acre_main"] call FUNC(isModLoaded)) then { _object setVariable ["acre_sys_core_isDisabled", _set > 0, true]; }; + if (["task_force_radio"] call FUNC(isModLoaded)) then { + _object setVariable ["tf_voiceVolume", [1, 0] select (_set > 0), true]; + }; }] call CBA_fnc_addEventHandler; [QGVAR(blockDamage), { //Name reversed from `allowDamage` because we want NOR logic @@ -108,6 +121,12 @@ _object setMass _mass; }] call CBA_fnc_addEventHandler; +[QGVAR(lockInventory), { + params ["_object", "_set"]; + TRACE_2("lockInventory EH",_object,_set); + _object lockInventory (_set > 0); +}] 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 { @@ -390,11 +409,11 @@ addMissionEventHandler ["PlayerViewChanged", { params ["_unit", "_target"]; // Players can always interact with himself if not boarded - vehicle _unit == _unit || + isNull objectParent _unit || // Players can always interact with his vehicle - {vehicle _unit == _target} || + {objectParent _unit isEqualTo _target} || // Players can always interact with passengers of the same vehicle - {_unit != _target && {vehicle _unit == vehicle _target}} || + {_unit isNotEqualTo _target && {!isNull objectParent _target} && {objectParent _unit isEqualTo objectParent _target}} || // Players can always interact with connected UAV {!(isNull (ACE_controlledUAV select 0))} }] call FUNC(addCanInteractWithCondition); @@ -403,7 +422,7 @@ addMissionEventHandler ["PlayerViewChanged", { ["isNotUnconscious", { params ["_unit"]; - lifeState _unit != "INCAPACITATED" + lifeState _unit isNotEqualTo "INCAPACITATED" }] call FUNC(addCanInteractWithCondition); ////////////////////////////////////////////////// @@ -464,6 +483,23 @@ GVAR(reloadMutex_lastMagazines) = []; GVAR(reloadMutex_lastMagazines) = _mags; }, true] call CBA_fnc_addPlayerEventHandler; +////////////////////////////////////////////////// +// Start the sway loop +////////////////////////////////////////////////// +["CBA_settingsInitialized", { + [{ + // frame after settingsInitialized to ensure all other addons have added their factors + if ((GVAR(swayFactorsBaseline) + GVAR(swayFactorsMultiplier)) isNotEqualTo []) then { + call FUNC(swayLoop) + }; + // check for pre-3.16 sway factors being added + if (!isNil {missionNamespace getVariable "ACE_setCustomAimCoef"}) then { + WARNING("ACE_setCustomAimCoef no longer supported - use ace_common_fnc_addSwayFactor"); + WARNING_1("source: %1",(missionNamespace getVariable "ACE_setCustomAimCoef") apply {_x}); + }; + }] call CBA_fnc_execNextFrame; +}] call CBA_fnc_addEventHandler; + ////////////////////////////////////////////////// // Set up PlayerJIP eventhandler ////////////////////////////////////////////////// @@ -527,4 +563,40 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [true, false, false]], false] call CBA_fnc_addKeybind; //SHIFT + Home Key + +["ACE3 Weapons", QGVAR(unloadWeapon), LSTRING(unloadWeapon), { + private _unit = ACE_player; + + // Conditions + if !([_unit, objNull, ["isNotInside"]] call FUNC(canInteractWith)) exitWith {false}; + + if !(_unit call CBA_fnc_canUseWeapon) exitWith {false}; + + (weaponState _unit) params ["_weapon", "_muzzle", "", "_magazine", "_ammo"]; + + // Check if there is any ammo + if (_ammo < 1) exitWith {false}; + + // Check if the unit has a weapon + if (_weapon == "") exitWith {false}; + + // Check if the unit has a weapon selected + if !(_weapon in [primaryWeapon _unit, handgunWeapon _unit, secondaryWeapon _unit]) exitWith {false}; + + // Statement + [_unit, _weapon, _muzzle, _magazine, _ammo, false] call FUNC(unloadUnitWeapon); + + true +}, {false}, [19, [false, false, true]], false] call CBA_fnc_addKeybind; // Alt + R + +["CBA_loadoutSet", { + params ["_unit", "_loadout"]; + _loadout params ["_primaryWeaponArray"]; + + if ((_primaryWeaponArray param [0, ""]) == "ACE_FakePrimaryWeapon") then { + TRACE_1("Ignoring fake gun",_primaryWeaponArray); + _loadout set [0, []]; + }; +}] call CBA_fnc_addEventHandler; + GVAR(commonPostInited) = true; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 536b6431d5..efe9b10c0c 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -11,9 +11,17 @@ GVAR(syncedEvents) = createHashMap; GVAR(showHudHash) = createHashMap; GVAR(vehicleIconCache) = createHashMap; // for getVehicleIcon +GVAR(blockItemReplacement) = false; + +// Cache for FUNC(isModLoaded) +GVAR(isModLoadedCache) = createHashMap; + GVAR(settingsInitFinished) = false; GVAR(runAtSettingsInitialized) = []; +GVAR(swayFactorsBaseline) = []; +GVAR(swayFactorsMultiplier) = []; + // @todo: Generic local-managed global-synced objects (createVehicleLocal) //Debug @@ -56,6 +64,16 @@ GVAR(hexArray) = [ "F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF" ]; +GVAR(canDigSurfaces) = createHashMapFromArray [ + ["int_concrete",false],["int_pavement_exp",false],["int_solidwood_exp",false],["tiling",false],["roof_tiles",false],["stony",false], + ["wavymetal",false],["int_wood",false],["int_tiles",false],["softwood_exp",false],["int_concrete_exp",false],["tiles_int",false], + ["metalplate_exp",false],["int_metalplate_exp",false],["steel_exp",false],["metal",false],["int_lino_exp",false],["metal_int",false], + ["wavymetal_exp",false],["int_metal",false],["asphalt_exp",false],["pavement_exp",false],["gridmetal_exp",false], + ["rooftiles_exp",false],["rock",false],["int_mat_exp",false],["wood_int",false],["concrete_int",false],["tarmac",false],["wood",false], + ["roof_tin",false],["lino_exp",false],["concrete",false],["int_softwood_exp",false], ["concrete_exp",false],["stones_exp",false], + ["forest_exp",true],["snow",true],["grasstall_exp",true],["grass",true] +]; + isHC = !hasInterface && !isDedicated; // deprecated because no tag missionNamespace setVariable ["ACE_isHC", ACE_isHC]; uiNamespace setVariable ["ACE_isHC", ACE_isHC]; diff --git a/addons/common/XEH_preStart.sqf b/addons/common/XEH_preStart.sqf index 022888575e..b872756af8 100644 --- a/addons/common/XEH_preStart.sqf +++ b/addons/common/XEH_preStart.sqf @@ -1,3 +1,17 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +if (isFilePatchingEnabled) then { + private _notLoaded = configProperties [configfile >> "ace_notLoaded", "isText _x"]; + { + INFO_2("%1 not loaded because %2",configName _x, getText _x); + } forEach _notLoaded; +}; + +// These functions are used for the ace arsenal, one of which are called in preStart (ace_arsenal_fnc_scanConfig) +// Cache for FUNC(getAddon) +uiNamespace setVariable [QGVAR(addonCache), createHashMap]; + +// Cache for FUNC(getConfigName) +uiNamespace setVariable [QGVAR(configNames), createHashMap]; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 0df756d034..758957987e 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -58,6 +58,8 @@ class ACE_Rsc_Control_Base { h = 0; }; +class ctrlMapEmpty; + #include "ACE_Settings.hpp" #include "define.hpp" #include "ProgressScreen.hpp" diff --git a/addons/common/dev/test_cfgPatches.sqf b/addons/common/dev/test_cfgPatches.sqf index 9412651940..bd00869360 100644 --- a/addons/common/dev/test_cfgPatches.sqf +++ b/addons/common/dev/test_cfgPatches.sqf @@ -1,4 +1,4 @@ -#include "\z\ace\addons\common\script_component.hpp" +#include "..\script_component.hpp" // PabstMirror // ["cfgPatches"] call ace_common_fnc_runTests; diff --git a/addons/common/dev/test_mapConfigs.sqf b/addons/common/dev/test_mapConfigs.sqf index 1b5c8b04a9..369b2b1808 100644 --- a/addons/common/dev/test_mapConfigs.sqf +++ b/addons/common/dev/test_mapConfigs.sqf @@ -2,7 +2,7 @@ // ["mapConfigs"] call ace_common_fnc_runTests; // execVM "z\ace\addons\common\dev\test_mapConfigs.sqf"; -#include "\z\ace\addons\common\script_component.hpp" +#include "..\script_component.hpp" diag_log text format ["--- Checking Map Configs ---"]; diff --git a/addons/common/functions/fnc_ASLToPosition.sqf b/addons/common/functions/fnc_ASLToPosition.sqf index 81e99ef8c3..b99e9fb88a 100644 --- a/addons/common/functions/fnc_ASLToPosition.sqf +++ b/addons/common/functions/fnc_ASLToPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Converts ASL to Arma "Position" diff --git a/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf b/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf index f2c2d0ff2e..2d8f8be259 100644 --- a/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf +++ b/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Handles a server-side request for synchronization ALL events on JIP to a client. diff --git a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf index c86aa9feac..a5bb286768 100644 --- a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf +++ b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Receives either requests for synchronization from clients, or the synchronization data from the server. diff --git a/addons/common/functions/fnc__handleSyncedEvent.sqf b/addons/common/functions/fnc__handleSyncedEvent.sqf index 76e84ebdbb..a7b28de1a6 100644 --- a/addons/common/functions/fnc__handleSyncedEvent.sqf +++ b/addons/common/functions/fnc__handleSyncedEvent.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Handles synced events being received. Server will log them, and server/client will execute them. diff --git a/addons/common/functions/fnc_actionKeysNamesConverted.sqf b/addons/common/functions/fnc_actionKeysNamesConverted.sqf index 53ebba0cd6..dd62fc8789 100644 --- a/addons/common/functions/fnc_actionKeysNamesConverted.sqf +++ b/addons/common/functions/fnc_actionKeysNamesConverted.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Reports same as actionKeysNames(Array) but in a format processable by "keyDown". diff --git a/addons/common/functions/fnc_addActionEventHandler.sqf b/addons/common/functions/fnc_addActionEventHandler.sqf index 8fafef07cf..49846756a2 100644 --- a/addons/common/functions/fnc_addActionEventHandler.sqf +++ b/addons/common/functions/fnc_addActionEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Add an addAction event to a unit. Used to handle multiple addAction events. Global arguments, local effects. Does only work for player controlled units. diff --git a/addons/common/functions/fnc_addActionMenuEventHandler.sqf b/addons/common/functions/fnc_addActionMenuEventHandler.sqf index 67d531c22e..02d61b141b 100644 --- a/addons/common/functions/fnc_addActionMenuEventHandler.sqf +++ b/addons/common/functions/fnc_addActionMenuEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Add an addAction event to a unit. Used to handle multiple addAction events and add a action to the mouse wheel menu. Global arguments, local effects. Does only work for player controlled units. diff --git a/addons/common/functions/fnc_addCanInteractWithCondition.sqf b/addons/common/functions/fnc_addCanInteractWithCondition.sqf index 5db1a79a3d..d9c4e3335d 100644 --- a/addons/common/functions/fnc_addCanInteractWithCondition.sqf +++ b/addons/common/functions/fnc_addCanInteractWithCondition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Add a condition that gets checked by ace_common_fnc_canInteractWith. diff --git a/addons/common/functions/fnc_addLineToDebugDraw.sqf b/addons/common/functions/fnc_addLineToDebugDraw.sqf index 3056d750d6..016c99ddf4 100644 --- a/addons/common/functions/fnc_addLineToDebugDraw.sqf +++ b/addons/common/functions/fnc_addLineToDebugDraw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Add line to draw on debug diff --git a/addons/common/functions/fnc_addMapMarkerCreatedEventHandler.sqf b/addons/common/functions/fnc_addMapMarkerCreatedEventHandler.sqf index c698d30272..3fe674afcc 100644 --- a/addons/common/functions/fnc_addMapMarkerCreatedEventHandler.sqf +++ b/addons/common/functions/fnc_addMapMarkerCreatedEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Add a map marker creation event handler. diff --git a/addons/common/functions/fnc_addSwayFactor.sqf b/addons/common/functions/fnc_addSwayFactor.sqf new file mode 100644 index 0000000000..7a258bc12a --- /dev/null +++ b/addons/common/functions/fnc_addSwayFactor.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Adds a factor to player sway calculation + * + * Arguments: + * 0: Type of factor, "baseline" or "multiplier" + * 1: Factor function, must return number + * 2: Factor ID, unique to type + * + * Return Value: + * Factor added + * + * Example: + * ["baseline", {1}, "ace_common"] call ace_common_fnc_addSwayFactor + * + * Public: Yes +*/ +params ["_type", "_code", "_id"]; + +_type = toLower _type; + +if !(_type in ["baseline", "multiplier"]) exitWith { ERROR_2("%1-%2 type unsupported",_type,_id); false }; + +if !((call _code) isEqualType 0) exitWith { ERROR_2("%1-%2 bad return type",_type,_id); false }; + +[missionNamespace, format ["ACE_setCustomAimCoef_%1", _type], _id, _code] call FUNC(arithmeticSetSource); + +if (_type isEqualTo "baseline") then { + GVAR(swayFactorsBaseline) pushBackUnique [_id]; +} else { + GVAR(swayFactorsMultiplier) pushBackUnique [_id]; +}; + +true diff --git a/addons/common/functions/fnc_addSyncedEventHandler.sqf b/addons/common/functions/fnc_addSyncedEventHandler.sqf index 4cf5163477..dbe0612e95 100644 --- a/addons/common/functions/fnc_addSyncedEventHandler.sqf +++ b/addons/common/functions/fnc_addSyncedEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Register an event handler for an ACE synced event diff --git a/addons/common/functions/fnc_addToInventory.sqf b/addons/common/functions/fnc_addToInventory.sqf index b514495b27..39e6903390 100644 --- a/addons/common/functions/fnc_addToInventory.sqf +++ b/addons/common/functions/fnc_addToInventory.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Adds an item, weapon, or magazine to the unit's inventory or places it in a weaponHolder if no space. @@ -112,13 +112,13 @@ switch (_type select 0) do { switch (_container) do { case "vest": { - (vestContainer _unit) addMagazineCargoGlobal [_classname, 1/*_ammoCount*/]; //@todo Bug! This isn't really the ammo, but magazine count. No such command. + _unit addItemToVest _classname; //@todo Bug! A full magazine, ignoring ammo. No such command. }; case "backpack": { - (backpackContainer _unit) addMagazineCargoGlobal [_classname, 1/*_ammoCount*/]; //@todo Bug! This isn't really the ammo, but magazine count. No such command. + _unit addItemToBackpack _classname; //@todo Bug! A full magazine, ignoring ammo. No such command. }; case "uniform": { - (uniformContainer _unit) addMagazineCargoGlobal [_classname, 1/*_ammoCount*/]; //@todo Bug! This isn't really the ammo, but magazine count. No such command. + _unit addItemToUniform _classname; //@todo Bug! A full magazine, ignoring ammo. No such command. }; default { _unit addMagazine [_classname, _ammoCount]; diff --git a/addons/common/functions/fnc_addWeapon.sqf b/addons/common/functions/fnc_addWeapon.sqf new file mode 100644 index 0000000000..16ae92c4f5 --- /dev/null +++ b/addons/common/functions/fnc_addWeapon.sqf @@ -0,0 +1,59 @@ +#include "..\script_component.hpp" +/* + * Author: commy2, johnb43 + * Adds weapon to unit without taking a magazine. + * Same as CBA_fnc_addWeaponWithoutItems, but doesn't remove linked items. + * + * Arguments: + * 0: Unit to add the weapon to + * 1: Weapon to add + * + * Return Value: + * None + * + * Example: + * [player, "arifle_AK12_F"] call ace_common_fnc_addWeapon + * + * Public: Yes +*/ + +params ["_unit", "_weapon"]; + +// Config case +private _compatibleMagazines = compatibleMagazines _weapon; + +private _uniform = uniformContainer _unit; +private _uniformMagazines = (magazinesAmmoCargo _uniform) select { + (_x select 0) in _compatibleMagazines // Also config case +}; + +private _vest = vestContainer _unit; +private _vestMagazines = (magazinesAmmoCargo _vest) select { + (_x select 0) in _compatibleMagazines +}; + +private _backpack = backpackContainer _unit; +private _backpackMagazines = (magazinesAmmoCargo _backpack) select { + (_x select 0) in _compatibleMagazines +}; + +// Remove all compatible magazines +{ + _unit removeMagazines _x; +} forEach _compatibleMagazines; + +// Add weapon +_unit addWeapon _weapon; + +// Add all magazines back +{ + _uniform addMagazineAmmoCargo [_x select 0, 1, _x select 1]; +} forEach _uniformMagazines; + +{ + _vest addMagazineAmmoCargo [_x select 0, 1, _x select 1]; +} forEach _vestMagazines; + +{ + _backpack addMagazineAmmoCargo [_x select 0, 1, _x select 1]; +} forEach _backpackMagazines; diff --git a/addons/common/functions/fnc_ambientBrightness.sqf b/addons/common/functions/fnc_ambientBrightness.sqf index 608c35dfef..2b1e172cc0 100644 --- a/addons/common/functions/fnc_ambientBrightness.sqf +++ b/addons/common/functions/fnc_ambientBrightness.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, idea by Falke * Returns a brightness value depending on the sun and moon state. Ranges from 0 to 1 (dark ... bright). diff --git a/addons/common/functions/fnc_arithmeticGetResult.sqf b/addons/common/functions/fnc_arithmeticGetResult.sqf index 0263785789..e64fed6eb4 100644 --- a/addons/common/functions/fnc_arithmeticGetResult.sqf +++ b/addons/common/functions/fnc_arithmeticGetResult.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns the arithmetic result of performing the given operation on a set. diff --git a/addons/common/functions/fnc_arithmeticSetSource.sqf b/addons/common/functions/fnc_arithmeticSetSource.sqf index 388313ba11..2645e87c28 100644 --- a/addons/common/functions/fnc_arithmeticSetSource.sqf +++ b/addons/common/functions/fnc_arithmeticSetSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Adds or removes a source to an arithmetic set. diff --git a/addons/common/functions/fnc_assignObjectsInList.sqf b/addons/common/functions/fnc_assignObjectsInList.sqf index 764675fa5f..23d373c310 100644 --- a/addons/common/functions/fnc_assignObjectsInList.sqf +++ b/addons/common/functions/fnc_assignObjectsInList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Loops through a string and filters out object names/variables to assign a value for given variable. diff --git a/addons/common/functions/fnc_assignedItemFix.sqf b/addons/common/functions/fnc_assignedItemFix.sqf index 3f523f4a59..942d170fea 100644 --- a/addons/common/functions/fnc_assignedItemFix.sqf +++ b/addons/common/functions/fnc_assignedItemFix.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Initialized the assigned item fix. @@ -37,11 +37,11 @@ GVAR(AssignedItemsShownItems) = [ private _assignedItems = getUnitLoadout _unit param [9, ["","","","","",""]]; // ["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch","NVGoggles"] GVAR(AssignedItemsShownItems) = [ - !((_assignedItems select 0) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 0 >> "ACE_hideItemType") != "map"}, - !((_assignedItems select 3) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 3 >> "ACE_hideItemType") != "compass"}, - !((_assignedItems select 4) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 4 >> "ACE_hideItemType") != "watch"}, - !((_assignedItems select 2) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 2 >> "ACE_hideItemType") != "radio"}, - !((_assignedItems select 1) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 1 >> "ACE_hideItemType") != "gps"} + ((_assignedItems select 0) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 0 >> "ACE_hideItemType") != "map"}, + ((_assignedItems select 3) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 3 >> "ACE_hideItemType") != "compass"}, + ((_assignedItems select 4) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 4 >> "ACE_hideItemType") != "watch"}, + ((_assignedItems select 2) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 2 >> "ACE_hideItemType") != "radio"}, + ((_assignedItems select 1) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 1 >> "ACE_hideItemType") != "gps"} ]; GVAR(AssignedItemsShownItems) params ["_showMap", "_showCompass", "_showWatch", "_showRadio", "_showGPS"]; diff --git a/addons/common/functions/fnc_binarizeNumber.sqf b/addons/common/functions/fnc_binarizeNumber.sqf index 780551756c..830417477a 100644 --- a/addons/common/functions/fnc_binarizeNumber.sqf +++ b/addons/common/functions/fnc_binarizeNumber.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get a binary equivalent of a decimal number. diff --git a/addons/common/functions/fnc_blurScreen.sqf b/addons/common/functions/fnc_blurScreen.sqf index 339a1138e6..bbc57d43a8 100644 --- a/addons/common/functions/fnc_blurScreen.sqf +++ b/addons/common/functions/fnc_blurScreen.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Blurs screen. diff --git a/addons/common/functions/fnc_cachedCall.sqf b/addons/common/functions/fnc_cachedCall.sqf index 728303d6cd..0062aec1f3 100644 --- a/addons/common/functions/fnc_cachedCall.sqf +++ b/addons/common/functions/fnc_cachedCall.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, Jaynus * Returns the result of the function and caches it up to a given time or event @@ -40,7 +40,7 @@ if ((_namespace getVariable [_uid, [-99999]]) select 0 < diag_tickTime) then { INFO_1("Clear cached variables on event: %1",_eventName); #endif // Get the list of caches to clear - //IGNORE_PRIVATE_WARNING ["_eventName"]; + //IGNORE_PRIVATE_WARNING ["_eventName"]; // _eventName is defined on the function that calls the event private _varName = format [QGVAR(clearCache_%1), _eventName]; private _cacheList = missionNamespace getVariable [_varName, []]; diff --git a/addons/common/functions/fnc_canDig.sqf b/addons/common/functions/fnc_canDig.sqf index a75f32b5d4..bd620d313a 100644 --- a/addons/common/functions/fnc_canDig.sqf +++ b/addons/common/functions/fnc_canDig.sqf @@ -1,37 +1,39 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg, commy2 * Checks if the player can dig on the surface below (enough dust). * * Arguments: - * 0: Unit + * 0: Unit or Position (2d/3d) * * Return Value: * Can Dig * * Example: * [ACE_player] call ace_common_fnc_canDig + * [[1000,2000]] call ace_common_fnc_canDig * * Public: No */ -params ["_unit"]; +params ["_input"]; -private _posASL = getPosASL _unit; +private _posASL = _input; -if ((getPosATL _unit) select 2 > 0.05 || // Walking on objects, such as buildings, pavements, etc. - {surfaceIsWater _posASL} // posATL in low water (not as low to allow awalking) is negative -) exitWith {false}; +if ((_input isEqualType objNull) && { + _posASL = getPosASL _input; + (getPosATL _input) select 2 > 0.05 || // Walking on objects, such as buildings, pavements, etc. + {surfaceIsWater _posASL} // posATL in low water (not as low to allow walking) is negative +}) exitWith {false}; private _surfaceClass = (surfaceType _posASL) select [1]; private _config = configFile >> "CfgSurfaces" >> _surfaceClass; -private _surfaceType = getText (_config >> "soundEnviron"); -private _surfaceDust = getNumber (_config >> "dust"); -TRACE_2("Surface",_surfaceType,_surfaceDust); +TRACE_3("",_surfaceClass,getText (_config >> "soundEnviron"),getNumber (_config >> "dust")); if (isNumber (_config >> "ACE_canDig")) then { (getNumber (_config >> "ACE_canDig")) == 1 // return } else { - !(_surfaceType in DIG_SURFACE_BLACKLIST) && {(_surfaceDust >= 0.1) || {_surfaceType in DIG_SURFACE_WHITELIST}} // return + private _surfaceType = getText (_config >> "soundEnviron"); + GVAR(canDigSurfaces) getOrDefault [_surfaceType, getNumber (_config >> "dust") >= 0.1, true] // return }; diff --git a/addons/common/functions/fnc_canGetInPosition.sqf b/addons/common/functions/fnc_canGetInPosition.sqf index c8870cebd7..d78e623d7b 100644 --- a/addons/common/functions/fnc_canGetInPosition.sqf +++ b/addons/common/functions/fnc_canGetInPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Is the unit able to enter the vehicle in the given position? diff --git a/addons/common/functions/fnc_canInteractWith.sqf b/addons/common/functions/fnc_canInteractWith.sqf index 62fbba322e..4cbcb1c19d 100644 --- a/addons/common/functions/fnc_canInteractWith.sqf +++ b/addons/common/functions/fnc_canInteractWith.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can interact. @@ -21,11 +21,10 @@ params ["_unit", "_target", ["_exceptions", []]]; _exceptions = _exceptions apply {toLower _x}; +private _owner = _target getVariable [QGVAR(owner), objNull]; + // exit if the target is not free to interact -if ((!isNull _target) && { - private _owner = _target getVariable [QGVAR(owner), objNull]; - (!isNull _owner) && {_unit != _owner}} -) exitWith {false}; +if (!isNull _owner && {_unit != _owner}) exitWith {false}; // check general conditions private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]]; diff --git a/addons/common/functions/fnc_cbaSettings.sqf b/addons/common/functions/fnc_cbaSettings.sqf index 273c72323e..3e6f66fa42 100644 --- a/addons/common/functions/fnc_cbaSettings.sqf +++ b/addons/common/functions/fnc_cbaSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Called at pre-init: Loads all ace_settings and converts them to CBA Settings. diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index 6e7a4456c7..4597cf3d40 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -1,5 +1,5 @@ #define DEBUG_MODE_FULL -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Dev function: Converts ace_settings to code, outputs to clipboard @@ -55,7 +55,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x private _cbaSettingType = ""; private _cbaValueInfo = []; - _cbaValueInfoHint = "default value"; + private _cbaValueInfoHint = "default value"; switch (_typeName) do { case ("SCALAR"): { // ACE's Scalar can be a float or an index for a list if (!isNumber (_config >> "value")) then {WARNING_2("Setting [%1] - value type [%2] is missing number",_varName,_typeName);}; diff --git a/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf b/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf index a996f39158..d3a6f29f84 100644 --- a/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf +++ b/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Converts a ace_setting config into a cba setting diff --git a/addons/common/functions/fnc_cbaSettings_settingChanged.sqf b/addons/common/functions/fnc_cbaSettings_settingChanged.sqf index 055e9b9da6..43711d4c97 100644 --- a/addons/common/functions/fnc_cbaSettings_settingChanged.sqf +++ b/addons/common/functions/fnc_cbaSettings_settingChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Function for handeling a cba setting being changed. diff --git a/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf b/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf index 869668cc21..eaa9d089fc 100644 --- a/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf +++ b/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Transfers a client's old ace settings to cba diff --git a/addons/common/functions/fnc_changeProjectileDirection.sqf b/addons/common/functions/fnc_changeProjectileDirection.sqf index f355662598..85f84d1fe9 100644 --- a/addons/common/functions/fnc_changeProjectileDirection.sqf +++ b/addons/common/functions/fnc_changeProjectileDirection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Adjust a projectiles velocity and dir + up vector. diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 463ee20f0b..622855da02 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Compares version numbers of PBOs and DLLs. diff --git a/addons/common/functions/fnc_checkPBOs.sqf b/addons/common/functions/fnc_checkPBOs.sqf index b45fae45d6..f69f486d5e 100644 --- a/addons/common/functions/fnc_checkPBOs.sqf +++ b/addons/common/functions/fnc_checkPBOs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Used to execute the checkPBOs module without placing the module. Don't use this together with the module. diff --git a/addons/common/functions/fnc_claim.sqf b/addons/common/functions/fnc_claim.sqf index 130bbac79b..06b13d0778 100644 --- a/addons/common/functions/fnc_claim.sqf +++ b/addons/common/functions/fnc_claim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * 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. diff --git a/addons/common/functions/fnc_claimSafeServer.sqf b/addons/common/functions/fnc_claimSafeServer.sqf index e6520aad87..b8d761c22a 100644 --- a/addons/common/functions/fnc_claimSafeServer.sqf +++ b/addons/common/functions/fnc_claimSafeServer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#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. diff --git a/addons/common/functions/fnc_codeToString.sqf b/addons/common/functions/fnc_codeToString.sqf index b938148220..e686dc353b 100644 --- a/addons/common/functions/fnc_codeToString.sqf +++ b/addons/common/functions/fnc_codeToString.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Removes the brackets around a code and returns the code as a string. It does nothing if the code is already a string. @@ -16,10 +16,7 @@ */ params ["_code"]; + if (_code isEqualType "") exitWith {_code}; -_code = str(_code); -_code = _code select [1, count _code - 2]; - -_code - +toString _code diff --git a/addons/common/functions/fnc_createOrthonormalReference.sqf b/addons/common/functions/fnc_createOrthonormalReference.sqf index d705086e85..1b57dd6f0d 100644 --- a/addons/common/functions/fnc_createOrthonormalReference.sqf +++ b/addons/common/functions/fnc_createOrthonormalReference.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Returns a orthonormal system of reference aligned with the supplied vector * * Arguments: - * Vector to align the coordinate system with + * 0: Vector to align the coordinate system with * * Return Value: * 0: Vector Normalized diff --git a/addons/common/functions/fnc_currentChannel.sqf b/addons/common/functions/fnc_currentChannel.sqf index 350f91c9a2..da43a7e2c9 100644 --- a/addons/common/functions/fnc_currentChannel.sqf +++ b/addons/common/functions/fnc_currentChannel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the current radio / chat / marker channel. diff --git a/addons/common/functions/fnc_debug.sqf b/addons/common/functions/fnc_debug.sqf index 2e08a19faf..055bf58380 100644 --- a/addons/common/functions/fnc_debug.sqf +++ b/addons/common/functions/fnc_debug.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Print logging messages through the ACE framework. diff --git a/addons/common/functions/fnc_debugModule.sqf b/addons/common/functions/fnc_debugModule.sqf index 90ad5ab6ba..c77b5a27ee 100644 --- a/addons/common/functions/fnc_debugModule.sqf +++ b/addons/common/functions/fnc_debugModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * ? diff --git a/addons/common/functions/fnc_defineVariable.sqf b/addons/common/functions/fnc_defineVariable.sqf index ba12d1c426..6cf537b1f8 100644 --- a/addons/common/functions/fnc_defineVariable.sqf +++ b/addons/common/functions/fnc_defineVariable.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Define a variable for the ACE variable framework diff --git a/addons/common/functions/fnc_deprecateComponent.sqf b/addons/common/functions/fnc_deprecateComponent.sqf index a723b733ec..5408a896a1 100644 --- a/addons/common/functions/fnc_deprecateComponent.sqf +++ b/addons/common/functions/fnc_deprecateComponent.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Mark a component as deprecated and switches it to a new component if that is available @@ -22,7 +22,7 @@ params ["_oldComponent", "_newComponent", "_version"]; _oldComponent params ["_oldComponentName", "_oldSettingName"]; _newComponent params ["_newComponentName", "_newSettingName"]; -private _isReplacementAvailable = isClass (configFile >> "CfgPatches" >> _newComponentName); +private _isReplacementAvailable = [_newComponentName] call FUNC(isModLoaded); private _isDeprecatedLoaded = missionNamespace getvariable [_oldSettingName, false]; private _isReplacementLoaded = missionNamespace getvariable [_newSettingName, false]; diff --git a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf index 1e8ea86a53..062d10793e 100644 --- a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf +++ b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Finds next valid index for the device array. diff --git a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf index 2e6dbbee99..9479efe916 100644 --- a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf +++ b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Finds next valid index for the device array. diff --git a/addons/common/functions/fnc_disableAI.sqf b/addons/common/functions/fnc_disableAI.sqf index 88b6f2bd49..52f1ed37c3 100644 --- a/addons/common/functions/fnc_disableAI.sqf +++ b/addons/common/functions/fnc_disableAI.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, KoffeinFlummi * Disables/Enables AI diff --git a/addons/common/functions/fnc_disableUserInput.sqf b/addons/common/functions/fnc_disableUserInput.sqf index 514fa3601c..629d5b42e5 100644 --- a/addons/common/functions/fnc_disableUserInput.sqf +++ b/addons/common/functions/fnc_disableUserInput.sqf @@ -1,5 +1,5 @@ -#include "script_component.hpp" -#include "\a3\ui_f_curator\ui\defineresincldesign.inc" +#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. @@ -66,9 +66,13 @@ if (_state) then { _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"; + if (["ace_medical"] call FUNC(isModLoaded)) then { + _ctrl ctrlSetEventHandler ["buttonClick", 'closeDialog 0; [player, "respawn_button"] call EFUNC(medical_status,setDead); [false] call DFUNC(disableUserInput);']; + } else { + _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; + }; + _ctrl ctrlEnable ((getMissionConfigValue ["respawnButton", -1]) != 0); // handles 3den attribute or description.ext + _ctrl ctrlSetText localize "$str_3den_multiplayer_attributecategory_respawn_displayname"; _ctrl ctrlSetTooltip "Respawn."; }; @@ -103,11 +107,24 @@ if (_state) then { }; GVAR(disableInputPFH) = [{ - if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && {isNull findDisplay IDD_INTERRUPT} && {isNull findDisplay IDD_RSCDISPLAYCURATOR} && {isNull findDisplay IDD_TEAMSWITCH}}) then { + if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && {isNull findDisplay IDD_INTERRUPT} && {isNull findDisplay IDD_RSCDISPLAYCURATOR} && {isNull findDisplay IDD_TEAMSWITCH}}) exitWith { [GVAR(disableInputPFH)] call CBA_fnc_removePerFrameHandler; GVAR(disableInputPFH) = nil; [true] call FUNC(disableUserInput); }; + + // Allow user input if the player is respawning and a respawn template (menu position or spectator) + // is open (otherwise they cannot click the respawn button) + if ( + !alive player + && {playerRespawnTime != -1} + && { + missionNamespace getVariable ["BIS_RscRespawnControlsMap_shown", false] + || {missionNamespace getVariable ["BIS_RscRespawnControlsSpectate_shown", false]} + } + ) exitWith { + [false] call FUNC(disableUserInput); + }; }, 0, []] call CBA_fnc_addPerFrameHandler; } else { if (!isNil QGVAR(disableInputPFH)) then { diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf index 96572bffc1..1b307fdf33 100644 --- a/addons/common/functions/fnc_displayIcon.sqf +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Draw progress bar and execute given function if succesful. diff --git a/addons/common/functions/fnc_displayText.sqf b/addons/common/functions/fnc_displayText.sqf index f34a0cdfcd..cdec636b13 100644 --- a/addons/common/functions/fnc_displayText.sqf +++ b/addons/common/functions/fnc_displayText.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Display a message. diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index b25945382f..2da2977482 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Glowbal * Display a structured text with image. diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index e54e481b5a..a9376552a9 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Glowbal, GitHawk * Display a structured text. diff --git a/addons/common/functions/fnc_doAnimation.sqf b/addons/common/functions/fnc_doAnimation.sqf index 667ab792c1..9e85c30dce 100644 --- a/addons/common/functions/fnc_doAnimation.sqf +++ b/addons/common/functions/fnc_doAnimation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Execute an animation. This is used to not break things like the unconsciousness animation. diff --git a/addons/common/functions/fnc_doGesture.sqf b/addons/common/functions/fnc_doGesture.sqf index 3aa4656cfd..84d448143a 100644 --- a/addons/common/functions/fnc_doGesture.sqf +++ b/addons/common/functions/fnc_doGesture.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Play a gesture. diff --git a/addons/common/functions/fnc_dropBackpack.sqf b/addons/common/functions/fnc_dropBackpack.sqf index 38f1be8a52..f87f462561 100644 --- a/addons/common/functions/fnc_dropBackpack.sqf +++ b/addons/common/functions/fnc_dropBackpack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Drops a backback. Also returns the ground wepaon holder object of the dropped backpack. diff --git a/addons/common/functions/fnc_dummy.sqf b/addons/common/functions/fnc_dummy.sqf index a70fed35c0..30074d29c8 100644 --- a/addons/common/functions/fnc_dummy.sqf +++ b/addons/common/functions/fnc_dummy.sqf @@ -1,5 +1,5 @@ /* - * Author: SilentSpike + * Author: kymckay * A dummy function which does nothing. Can be useful. * * Arguments: diff --git a/addons/common/functions/fnc_dumpArray.sqf b/addons/common/functions/fnc_dumpArray.sqf index 4997ad119a..754b811314 100644 --- a/addons/common/functions/fnc_dumpArray.sqf +++ b/addons/common/functions/fnc_dumpArray.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ? * Dumps an array to the RPT, showing the depth of each element. diff --git a/addons/common/functions/fnc_dumpPerformanceCounters.sqf b/addons/common/functions/fnc_dumpPerformanceCounters.sqf index 2dad092a2c..fa0b4e4e6d 100644 --- a/addons/common/functions/fnc_dumpPerformanceCounters.sqf +++ b/addons/common/functions/fnc_dumpPerformanceCounters.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ? * Dumps performance counter statistics into Logs. diff --git a/addons/common/functions/fnc_endRadioTransmission.sqf b/addons/common/functions/fnc_endRadioTransmission.sqf index 196d0f4d4a..289936c95e 100644 --- a/addons/common/functions/fnc_endRadioTransmission.sqf +++ b/addons/common/functions/fnc_endRadioTransmission.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * @@ -19,7 +19,7 @@ ["ace_endRadioTransmissions"] call CBA_fnc_localEvent; // ACRE -if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { +if (["acre_main"] call FUNC(isModLoaded)) then { [-1] call acre_sys_core_fnc_handleMultiPttKeyPressUp; [0] call acre_sys_core_fnc_handleMultiPttKeyPressUp; [1] call acre_sys_core_fnc_handleMultiPttKeyPressUp; @@ -27,8 +27,8 @@ if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { }; // TFAR -if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { - if (isClass (configFile >> "CfgPatches" >> "tfar_core")) exitWith { // Beta TFAR, exit to avoid script errors from legacy functions not existing +if (["task_force_radio"] call FUNC(isModLoaded)) then { + if (["tfar_core"] call FUNC(isModLoaded)) exitWith { // Beta TFAR, exit to avoid script errors from legacy functions not existing ACE_Player call TFAR_fnc_releaseAllTangents; }; call TFAR_fnc_onSwTangentReleased; diff --git a/addons/common/functions/fnc_eraseCache.sqf b/addons/common/functions/fnc_eraseCache.sqf index 79eb4444fa..1f574db588 100644 --- a/addons/common/functions/fnc_eraseCache.sqf +++ b/addons/common/functions/fnc_eraseCache.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Deletes a cached result diff --git a/addons/common/functions/fnc_errorMessage.sqf b/addons/common/functions/fnc_errorMessage.sqf index c062c8836c..021fdba10c 100644 --- a/addons/common/functions/fnc_errorMessage.sqf +++ b/addons/common/functions/fnc_errorMessage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, based on BIS_fnc_errorMsg and BIS_fnc_guiMessage by Karel Moricky (BI) * Stops simulation and opens a textbox with error message. diff --git a/addons/common/functions/fnc_escapeRegex.sqf b/addons/common/functions/fnc_escapeRegex.sqf new file mode 100644 index 0000000000..8266a7dfa7 --- /dev/null +++ b/addons/common/functions/fnc_escapeRegex.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Escapes special characters used in regex from a string + * + * Arguments: + * 0: String + * + * Return Value: + * Safe string + * + * Example: + * "\Q.*?AK-15.*?\E" call ace_common_fnc_escapeRegex + * + * Public: Yes + */ +params [["_string", "", [""]]]; + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping +_string regexReplace ["[.?*+^$[\]\\(){}|-]/gio", "\\$&"] diff --git a/addons/common/functions/fnc_findUnloadPosition.sqf b/addons/common/functions/fnc_findUnloadPosition.sqf index 50727b438f..3e961b50d1 100644 --- a/addons/common/functions/fnc_findUnloadPosition.sqf +++ b/addons/common/functions/fnc_findUnloadPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, ViperMaul * Find a safe place near a vehicle to unload something. @@ -43,9 +43,13 @@ if (_cargo isKindOf "CAManBase") then { _radiusOfItem = 1.1; } else { //`sizeOf` is unreliable, and does not work with object types that don't exist on map, so estimate size based on cargo size - private _typeOfCargo = if (_cargo isEqualType "") then {_cargo} else {typeOf _cargo}; - private _itemSize = if (isNumber (configFile >> "CfgVehicles" >> _typeOfCargo >> QEGVAR(cargo,size)) && {getNumber (configFile >> "CfgVehicles" >> _typeOfCargo >> QEGVAR(cargo,size)) != -1}) then { - getNumber (configFile >> "CfgVehicles" >> _typeOfCargo >> QEGVAR(cargo,size)); + private _configOfCargo = if (_cargo isEqualType objNull) then { + configOf _cargo + } else { + configFile >> "CfgVehicles" >> _cargo + }; + private _itemSize = if (isNumber (_configOfCargo >> QEGVAR(cargo,size)) && {getNumber (_configOfCargo >> QEGVAR(cargo,size)) != -1}) then { + getNumber (_configOfCargo >> QEGVAR(cargo,size)); } else { if (["ace_cargo"] call FUNC(isModLoaded)) then { [_cargo] call EFUNC(cargo,getSizeItem); diff --git a/addons/common/functions/fnc_firedEH.sqf b/addons/common/functions/fnc_firedEH.sqf index 22a64f5c23..9a4c8e50d6 100644 --- a/addons/common/functions/fnc_firedEH.sqf +++ b/addons/common/functions/fnc_firedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Unfied handling of weapon fire diff --git a/addons/common/functions/fnc_fixCollision.sqf b/addons/common/functions/fnc_fixCollision.sqf index ee61d83c35..0269ccb594 100644 --- a/addons/common/functions/fnc_fixCollision.sqf +++ b/addons/common/functions/fnc_fixCollision.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Attempt to fix PhysX collisions causing unreasonable impact forces and damage. diff --git a/addons/common/functions/fnc_fixFloating.sqf b/addons/common/functions/fnc_fixFloating.sqf index 03e7933e2e..e82375cbbf 100644 --- a/addons/common/functions/fnc_fixFloating.sqf +++ b/addons/common/functions/fnc_fixFloating.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Attempt to fix floating physx with disabled damage after setPosXXX commands. diff --git a/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf b/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf index d89a3978c6..4e8aa1ec2a 100644 --- a/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf +++ b/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Fixes the lowered rifle animation diff --git a/addons/common/functions/fnc_fixPosition.sqf b/addons/common/functions/fnc_fixPosition.sqf index e4f956dadb..79d3c6272b 100644 --- a/addons/common/functions/fnc_fixPosition.sqf +++ b/addons/common/functions/fnc_fixPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Jonpas * Fixes position of an object. E.g. moves object above ground and adjusts to terrain slope. Requires local object. diff --git a/addons/common/functions/fnc_getAddon.sqf b/addons/common/functions/fnc_getAddon.sqf new file mode 100644 index 0000000000..b1a6f7cf99 --- /dev/null +++ b/addons/common/functions/fnc_getAddon.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Returns a config's addon. + * + * Arguments: + * 0: Config entry + * + * Return Value: + * Addon name + * + * Example: + * [configFile >> "CfgWeapons" >> "arifle_AK12_F"] call ace_common_fnc_getAddon + * + * Public: Yes +*/ + +params ["_config"]; + +(uiNamespace getVariable QGVAR(addonCache)) getOrDefaultCall [_config, { + private _addons = configSourceAddonList _config; + + // Return first addon + if (_addons isNotEqualTo []) then { + (configSourceModList (configfile >> "CfgPatches" >> _addons select 0)) param [0, ""] + } else { + // If nothing found at all, return "" + "" + } +}, true] diff --git a/addons/common/functions/fnc_getAllDefinedSetVariables.sqf b/addons/common/functions/fnc_getAllDefinedSetVariables.sqf index eeb96002d1..6642a09789 100644 --- a/addons/common/functions/fnc_getAllDefinedSetVariables.sqf +++ b/addons/common/functions/fnc_getAllDefinedSetVariables.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Returns an 2d array of all variables that have been set on the object diff --git a/addons/common/functions/fnc_getAwakeAnim.sqf b/addons/common/functions/fnc_getAwakeAnim.sqf index c58e2796ba..e7db13ac63 100644 --- a/addons/common/functions/fnc_getAwakeAnim.sqf +++ b/addons/common/functions/fnc_getAwakeAnim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Report awake animation of unit inside vehicle. diff --git a/addons/common/functions/fnc_getChildren.sqf b/addons/common/functions/fnc_getChildren.sqf index 998d0b4399..b632b0642f 100644 --- a/addons/common/functions/fnc_getChildren.sqf +++ b/addons/common/functions/fnc_getChildren.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Obtain children of a config entry diff --git a/addons/common/functions/fnc_getConfigCommander.sqf b/addons/common/functions/fnc_getConfigCommander.sqf index a49664bcf2..6fbe381173 100644 --- a/addons/common/functions/fnc_getConfigCommander.sqf +++ b/addons/common/functions/fnc_getConfigCommander.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the commander config of a vehicles turret. diff --git a/addons/common/functions/fnc_getConfigGunner.sqf b/addons/common/functions/fnc_getConfigGunner.sqf index d1e86a9bd0..68aa432aa3 100644 --- a/addons/common/functions/fnc_getConfigGunner.sqf +++ b/addons/common/functions/fnc_getConfigGunner.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the gunner config of a vehicles turret. diff --git a/addons/common/functions/fnc_getConfigName.sqf b/addons/common/functions/fnc_getConfigName.sqf new file mode 100644 index 0000000000..54ebf84343 --- /dev/null +++ b/addons/common/functions/fnc_getConfigName.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Returns an item's config case sensitive name. + * + * Arguments: + * 0: Class name (item or object) + * + * Return Value: + * Config case item name ("" if config is not found) + * + * Example: + * ["arifle_AK12_F"] call ace_common_fnc_getConfigName + * + * Public: Yes +*/ + +params ["_className"]; + +(uiNamespace getVariable QGVAR(configNames)) getOrDefaultCall [toLower _className, { + private _config = configNull; + + { + _config = configFile >> _x >> _className; + + if (isClass _config) exitWith {}; + } forEach ["CfgWeapons", "CfgMagazines", "CfgGlasses", "CfgVehicles", "CfgVoice", "CfgUnitInsignia"]; + + configName _config +}, true] diff --git a/addons/common/functions/fnc_getCountOfItem.sqf b/addons/common/functions/fnc_getCountOfItem.sqf index a6cf3b9233..5667b6c980 100644 --- a/addons/common/functions/fnc_getCountOfItem.sqf +++ b/addons/common/functions/fnc_getCountOfItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dedmen * Return how many items of type _itemType the player has in his containers (Uniform, Vest, Backpack) diff --git a/addons/common/functions/fnc_getDeathAnim.sqf b/addons/common/functions/fnc_getDeathAnim.sqf index 8fb72e0a21..2b92e6ef10 100644 --- a/addons/common/functions/fnc_getDeathAnim.sqf +++ b/addons/common/functions/fnc_getDeathAnim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, PabstMirror * Get the death animation for the unit at current time diff --git a/addons/common/functions/fnc_getDefaultAnim.sqf b/addons/common/functions/fnc_getDefaultAnim.sqf index 9fea3e15df..788fd2b6bd 100644 --- a/addons/common/functions/fnc_getDefaultAnim.sqf +++ b/addons/common/functions/fnc_getDefaultAnim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the Defualt animation for the unit diff --git a/addons/common/functions/fnc_getDefinedVariable.sqf b/addons/common/functions/fnc_getDefinedVariable.sqf index 7e20570cc1..d600d62cf2 100644 --- a/addons/common/functions/fnc_getDefinedVariable.sqf +++ b/addons/common/functions/fnc_getDefinedVariable.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Grabs a variable. If variable has not been set, attempts to use default defined value diff --git a/addons/common/functions/fnc_getDefinedVariableDefault.sqf b/addons/common/functions/fnc_getDefinedVariableDefault.sqf index fc6108469a..e78090b636 100644 --- a/addons/common/functions/fnc_getDefinedVariableDefault.sqf +++ b/addons/common/functions/fnc_getDefinedVariableDefault.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the variable default value diff --git a/addons/common/functions/fnc_getDefinedVariableInfo.sqf b/addons/common/functions/fnc_getDefinedVariableInfo.sqf index f6aeca0df9..61dec04e04 100644 --- a/addons/common/functions/fnc_getDefinedVariableInfo.sqf +++ b/addons/common/functions/fnc_getDefinedVariableInfo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the variable Informations diff --git a/addons/common/functions/fnc_getDisplayConfigName.sqf b/addons/common/functions/fnc_getDisplayConfigName.sqf index f952d5c385..f6be033be3 100644 --- a/addons/common/functions/fnc_getDisplayConfigName.sqf +++ b/addons/common/functions/fnc_getDisplayConfigName.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get display classnames from config with given idd. diff --git a/addons/common/functions/fnc_getDoorTurrets.sqf b/addons/common/functions/fnc_getDoorTurrets.sqf index 8fb872a6f7..fb652cfd1a 100644 --- a/addons/common/functions/fnc_getDoorTurrets.sqf +++ b/addons/common/functions/fnc_getDoorTurrets.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Returns all turret indecies of door gunners. diff --git a/addons/common/functions/fnc_getFiremodeIndex.sqf b/addons/common/functions/fnc_getFiremodeIndex.sqf new file mode 100644 index 0000000000..7abf65cafa --- /dev/null +++ b/addons/common/functions/fnc_getFiremodeIndex.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Get the firemode index of the weapon for use with "SwitchWeapon" + * + * Arguments: + * 0: Unit + * 1: Muzzle (default: current weapon muzzle) + * 2: Firemode (default: current weapon fire mode) + * + * Return Value: + * Weapon/Mode index + * + * Example: + * [player] call ace_common_fnc_getFiremodeIndex + * + * Public: Yes + */ + +params ["_unit"]; +(weaponState _unit) params ["", "_currentMuzzle", "_currentFiremode"]; +params ["", ["_muzzle", _currentMuzzle], ["_firemode", _currentFireMode]]; + +private _weapons = _unit weaponsInfo [_muzzle, false]; +private _index = -1; +{ + _x params ["_xIndex", "", "", "", "_xFiremode"]; + if (_xFiremode == _firemode) exitWith { _index = _xIndex; }; +} forEach _weapons; + +_index diff --git a/addons/common/functions/fnc_getFirstObjectIntersection.sqf b/addons/common/functions/fnc_getFirstObjectIntersection.sqf index 0cebf6232f..cc2e9ff736 100644 --- a/addons/common/functions/fnc_getFirstObjectIntersection.sqf +++ b/addons/common/functions/fnc_getFirstObjectIntersection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Returns the the first intersection with terrain between two positions. diff --git a/addons/common/functions/fnc_getFirstTerrainIntersection.sqf b/addons/common/functions/fnc_getFirstTerrainIntersection.sqf index 989486b1ac..cc85562087 100644 --- a/addons/common/functions/fnc_getFirstTerrainIntersection.sqf +++ b/addons/common/functions/fnc_getFirstTerrainIntersection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Returns the the first intersection with an object between two positions. @todo rewrite using lineIntersectsSurfaces? diff --git a/addons/common/functions/fnc_getGunner.sqf b/addons/common/functions/fnc_getGunner.sqf index bd65c49ed4..ffa0334a26 100644 --- a/addons/common/functions/fnc_getGunner.sqf +++ b/addons/common/functions/fnc_getGunner.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns gunner using specified weapon type in vehicle. Only works if all turrets have different weapons. diff --git a/addons/common/functions/fnc_getInPosition.sqf b/addons/common/functions/fnc_getInPosition.sqf index ef012a33b4..fdbad3ee4a 100644 --- a/addons/common/functions/fnc_getInPosition.sqf +++ b/addons/common/functions/fnc_getInPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Move unit into given vehicle position or switch to that position if the unit is already inside the vehicle. diff --git a/addons/common/functions/fnc_getItemType.sqf b/addons/common/functions/fnc_getItemType.sqf index 5212c6d57e..e39605f0cc 100644 --- a/addons/common/functions/fnc_getItemType.sqf +++ b/addons/common/functions/fnc_getItemType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns item type of given classname. diff --git a/addons/common/functions/fnc_getLightProperties.sqf b/addons/common/functions/fnc_getLightProperties.sqf index 635284ade4..03cefc63dc 100644 --- a/addons/common/functions/fnc_getLightProperties.sqf +++ b/addons/common/functions/fnc_getLightProperties.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Read properties of given vehicles light. diff --git a/addons/common/functions/fnc_getLightPropertiesWeapon.sqf b/addons/common/functions/fnc_getLightPropertiesWeapon.sqf index fca17dd51f..1bf6ae6cac 100644 --- a/addons/common/functions/fnc_getLightPropertiesWeapon.sqf +++ b/addons/common/functions/fnc_getLightPropertiesWeapon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Read properties of given flashlight. diff --git a/addons/common/functions/fnc_getLocalUnits.sqf b/addons/common/functions/fnc_getLocalUnits.sqf index 17163d0e77..5bf0788283 100644 --- a/addons/common/functions/fnc_getLocalUnits.sqf +++ b/addons/common/functions/fnc_getLocalUnits.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: dedmen * Gets localUnits array filtering out nullObjects. @@ -6,7 +6,7 @@ * Should be equivalent to `allUnits select {local _x}` * * Arguments: - * Nothing + * None * * Return Value: * Array of local Units diff --git a/addons/common/functions/fnc_getMGRSdata.sqf b/addons/common/functions/fnc_getMGRSdata.sqf index cbea1511eb..92cedec3b9 100644 --- a/addons/common/functions/fnc_getMGRSdata.sqf +++ b/addons/common/functions/fnc_getMGRSdata.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Gets the current map's MGRS grid zone designator and 100km square. diff --git a/addons/common/functions/fnc_getMapGridData.sqf b/addons/common/functions/fnc_getMapGridData.sqf index 08d5820309..f37e146288 100644 --- a/addons/common/functions/fnc_getMapGridData.sqf +++ b/addons/common/functions/fnc_getMapGridData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Finds real x/y offset and map step for a 10 digit grid diff --git a/addons/common/functions/fnc_getMapGridFromPos.sqf b/addons/common/functions/fnc_getMapGridFromPos.sqf index defee04e57..fb12ad9dfc 100644 --- a/addons/common/functions/fnc_getMapGridFromPos.sqf +++ b/addons/common/functions/fnc_getMapGridFromPos.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing, PabstMirror * Gets a 10-digit map grid for the given world position diff --git a/addons/common/functions/fnc_getMapPosFromGrid.sqf b/addons/common/functions/fnc_getMapPosFromGrid.sqf index d4469b56cc..7466ce5899 100644 --- a/addons/common/functions/fnc_getMapPosFromGrid.sqf +++ b/addons/common/functions/fnc_getMapPosFromGrid.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets position from grid cords diff --git a/addons/common/functions/fnc_getMarkerType.sqf b/addons/common/functions/fnc_getMarkerType.sqf index 7f44861769..3f5d5132be 100644 --- a/addons/common/functions/fnc_getMarkerType.sqf +++ b/addons/common/functions/fnc_getMarkerType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Get the apropriate marker for a group. diff --git a/addons/common/functions/fnc_getName.sqf b/addons/common/functions/fnc_getName.sqf index 7d9dd35803..058386cde4 100644 --- a/addons/common/functions/fnc_getName.sqf +++ b/addons/common/functions/fnc_getName.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the name of the object. Used to prevent issues with the name command. diff --git a/addons/common/functions/fnc_getNumberMagazinesIn.sqf b/addons/common/functions/fnc_getNumberMagazinesIn.sqf index 7beaf3ee37..fc2c3d0605 100644 --- a/addons/common/functions/fnc_getNumberMagazinesIn.sqf +++ b/addons/common/functions/fnc_getNumberMagazinesIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Count magazines of unit. diff --git a/addons/common/functions/fnc_getPitchBankYaw.sqf b/addons/common/functions/fnc_getPitchBankYaw.sqf index 6cdec367de..e53d1d7fc4 100644 --- a/addons/common/functions/fnc_getPitchBankYaw.sqf +++ b/addons/common/functions/fnc_getPitchBankYaw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Returns pitch, bank, yaw for given vehicle in degrees. diff --git a/addons/common/functions/fnc_getPylonTurret.sqf b/addons/common/functions/fnc_getPylonTurret.sqf index cc6d3c6635..f7891e4ba9 100644 --- a/addons/common/functions/fnc_getPylonTurret.sqf +++ b/addons/common/functions/fnc_getPylonTurret.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns the turret path that owns the given pylon. diff --git a/addons/common/functions/fnc_getReflectorsWithSelections.sqf b/addons/common/functions/fnc_getReflectorsWithSelections.sqf index 8d40642ae5..1e874c0208 100644 --- a/addons/common/functions/fnc_getReflectorsWithSelections.sqf +++ b/addons/common/functions/fnc_getReflectorsWithSelections.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/common/functions/fnc_getSelectionsWithoutHitPoints.sqf b/addons/common/functions/fnc_getSelectionsWithoutHitPoints.sqf index 5c30245732..5367b0ae61 100644 --- a/addons/common/functions/fnc_getSelectionsWithoutHitPoints.sqf +++ b/addons/common/functions/fnc_getSelectionsWithoutHitPoints.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/common/functions/fnc_getSettingData.sqf b/addons/common/functions/fnc_getSettingData.sqf index 79ee4f3264..a2dceb746c 100644 --- a/addons/common/functions/fnc_getSettingData.sqf +++ b/addons/common/functions/fnc_getSettingData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Returns the metadata of a setting if it exists diff --git a/addons/common/functions/fnc_getStaminaBarControl.sqf b/addons/common/functions/fnc_getStaminaBarControl.sqf index a426a7f933..18721606fb 100644 --- a/addons/common/functions/fnc_getStaminaBarControl.sqf +++ b/addons/common/functions/fnc_getStaminaBarControl.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the control of the Stamina Bar from Arma 1.54. diff --git a/addons/common/functions/fnc_getTargetAzimuthAndInclination.sqf b/addons/common/functions/fnc_getTargetAzimuthAndInclination.sqf index 3a4da0326f..baf1871b9f 100644 --- a/addons/common/functions/fnc_getTargetAzimuthAndInclination.sqf +++ b/addons/common/functions/fnc_getTargetAzimuthAndInclination.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get players viewing direction and slope. diff --git a/addons/common/functions/fnc_getTargetDistance.sqf b/addons/common/functions/fnc_getTargetDistance.sqf index ff6d2cc198..27a336d9ab 100644 --- a/addons/common/functions/fnc_getTargetDistance.sqf +++ b/addons/common/functions/fnc_getTargetDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Get the distance to the next object the player is looking at. Used for laser distance measurements. diff --git a/addons/common/functions/fnc_getTargetObject.sqf b/addons/common/functions/fnc_getTargetObject.sqf index a15cd309be..ab699e1f3d 100644 --- a/addons/common/functions/fnc_getTargetObject.sqf +++ b/addons/common/functions/fnc_getTargetObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the nearest object the player is looking at. Used for laser designator instead of cursorTarget. diff --git a/addons/common/functions/fnc_getTurnedOnLights.sqf b/addons/common/functions/fnc_getTurnedOnLights.sqf index a40832d61d..fcfd1b92df 100644 --- a/addons/common/functions/fnc_getTurnedOnLights.sqf +++ b/addons/common/functions/fnc_getTurnedOnLights.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns all turned on lights of any vehicle or streetlamp. diff --git a/addons/common/functions/fnc_getTurretCommander.sqf b/addons/common/functions/fnc_getTurretCommander.sqf index 49d0798d35..5bb1e107c6 100644 --- a/addons/common/functions/fnc_getTurretCommander.sqf +++ b/addons/common/functions/fnc_getTurretCommander.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the turret index of a vehicles commander. diff --git a/addons/common/functions/fnc_getTurretConfigPath.sqf b/addons/common/functions/fnc_getTurretConfigPath.sqf index aee865b3fb..98cc6b08a9 100644 --- a/addons/common/functions/fnc_getTurretConfigPath.sqf +++ b/addons/common/functions/fnc_getTurretConfigPath.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the config path of a vehicles turret. @@ -16,27 +16,4 @@ * Public: Yes */ -params ["_config", "_turretIndex"]; - -for "_index" from 0 to (count _turretIndex - 1) do { - _config = _config >> "Turrets"; - - private _offset = 0; - private _config2 = _config select 0; - private _foundClasses = 0; - - for "_a" from 0 to (count _config - 1) do { - if (isClass _config2) then { - _foundClasses = _foundClasses + 1; - } else { - _offset = _offset + 1; - }; - _config2 = _config select (_turretIndex select _index) + _offset; - - if (_foundClasses == _turretIndex select _index) exitWith {}; - }; - - _config = _config2; -}; - -_config +call CBA_fnc_getTurret diff --git a/addons/common/functions/fnc_getTurretCopilot.sqf b/addons/common/functions/fnc_getTurretCopilot.sqf index 7207ac5b17..0b2fee3f37 100644 --- a/addons/common/functions/fnc_getTurretCopilot.sqf +++ b/addons/common/functions/fnc_getTurretCopilot.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the turret index of a vehicles copilot. diff --git a/addons/common/functions/fnc_getTurretDirection.sqf b/addons/common/functions/fnc_getTurretDirection.sqf index 1678eeaa32..6f24b40f3e 100644 --- a/addons/common/functions/fnc_getTurretDirection.sqf +++ b/addons/common/functions/fnc_getTurretDirection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Get the absolute turret direction for FOV/PIP turret. diff --git a/addons/common/functions/fnc_getTurretGunner.sqf b/addons/common/functions/fnc_getTurretGunner.sqf index 180a10914e..f485ab3bbc 100644 --- a/addons/common/functions/fnc_getTurretGunner.sqf +++ b/addons/common/functions/fnc_getTurretGunner.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the turret index of a vehicles gunner. diff --git a/addons/common/functions/fnc_getTurretIndex.sqf b/addons/common/functions/fnc_getTurretIndex.sqf index 423f2e6289..dcbaafb3b2 100644 --- a/addons/common/functions/fnc_getTurretIndex.sqf +++ b/addons/common/functions/fnc_getTurretIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the turret index of a units current turret. @@ -20,7 +20,7 @@ params [["_unit", objNull, [objNull]]]; private _vehicle = vehicle _unit; if (_unit == _vehicle) exitWith {[]}; -scopeName "main"; +scopeName "main"; { if (_unit == (_vehicle turretUnit _x)) then {_x breakOut "main"}; diff --git a/addons/common/functions/fnc_getTurretsFFV.sqf b/addons/common/functions/fnc_getTurretsFFV.sqf index 0ae04a3032..e7ea4b369e 100644 --- a/addons/common/functions/fnc_getTurretsFFV.sqf +++ b/addons/common/functions/fnc_getTurretsFFV.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the turret indices of ffv turrets. diff --git a/addons/common/functions/fnc_getTurretsOther.sqf b/addons/common/functions/fnc_getTurretsOther.sqf index c84b50d842..681596a329 100644 --- a/addons/common/functions/fnc_getTurretsOther.sqf +++ b/addons/common/functions/fnc_getTurretsOther.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the turret indices of other turrets (not gunner, commander, copilot or ffv). diff --git a/addons/common/functions/fnc_getUavControlPosition.sqf b/addons/common/functions/fnc_getUavControlPosition.sqf index 9d6f6de9f2..0c6be45bf5 100644 --- a/addons/common/functions/fnc_getUavControlPosition.sqf +++ b/addons/common/functions/fnc_getUavControlPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns the seat position of a UAV that the unit is activly controling. diff --git a/addons/common/functions/fnc_getVehicleCargo.sqf b/addons/common/functions/fnc_getVehicleCargo.sqf index 82442700a2..fc3ec83994 100644 --- a/addons/common/functions/fnc_getVehicleCargo.sqf +++ b/addons/common/functions/fnc_getVehicleCargo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the vehicle cargo positions. Codrivers and ffv positions are not listed. @@ -15,15 +15,16 @@ * Public: Yes */ -params [["_vehicle", objNull, [objNull]]]; +params [["_classname", "", [""]]]; -private _config = configFile >> "CfgVehicles" >> _vehicle; +private _config = configFile >> "CfgVehicles" >> _classname; +if (isNull _config) then { ERROR_1("ace_common_fnc_getVehicleCargo bad classname %1",_this); }; private _cargo = []; private _codrivers = getArray (_config >> "cargoIsCoDriver"); for "_index" from 0 to (getNumber (_config >> "transportSoldier") - 1) do { - if !(_index in _codrivers && {_vehicle isKindOf "Car"} && {!(_vehicle isKindOf "Wheeled_APC_F")}) then { + if !(_index in _codrivers && {_classname isKindOf "Car"} && {!(_classname isKindOf "Wheeled_APC_F")}) then { _cargo pushBack _index; }; }; diff --git a/addons/common/functions/fnc_getVehicleCodriver.sqf b/addons/common/functions/fnc_getVehicleCodriver.sqf index 8deef3f9cd..366c4db8ff 100644 --- a/addons/common/functions/fnc_getVehicleCodriver.sqf +++ b/addons/common/functions/fnc_getVehicleCodriver.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the vehicle codriver positions. @@ -17,7 +17,7 @@ params [["_vehicle", objNull, [objNull]]]; -private _config = configFile >> "CfgVehicles" >> _vehicle; +private _config = configOf _vehicle; private _cargo = []; private _codrivers = getArray (_config >> "cargoIsCoDriver"); diff --git a/addons/common/functions/fnc_getVehicleCrew.sqf b/addons/common/functions/fnc_getVehicleCrew.sqf index af699d3b6b..00a90b1ab2 100644 --- a/addons/common/functions/fnc_getVehicleCrew.sqf +++ b/addons/common/functions/fnc_getVehicleCrew.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns array of crew member objects. diff --git a/addons/common/functions/fnc_getVehicleIcon.sqf b/addons/common/functions/fnc_getVehicleIcon.sqf index 3c3e4aa727..208bb144d8 100644 --- a/addons/common/functions/fnc_getVehicleIcon.sqf +++ b/addons/common/functions/fnc_getVehicleIcon.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: AACO * Function used to get the vehicle icon for provided object (cached for repeat use) * * Arguments: - * 0: Object to get icon of + * 0: Object to get icon of * * Return Value: * Icon of vehicle @@ -18,7 +18,7 @@ params [["_object", objNull, [objNull, ""]]]; -if ((_object isEqualType objNull && {isNull _object}) || {_object isEqualType "" && {_object == ""}}) exitWith { DEFAULT_TEXTURE }; +if (_object isEqualTo objNull || {_object isEqualTo ""}) exitWith { DEFAULT_TEXTURE }; private _objectType = if (_object isEqualType objNull) then { typeOf _object diff --git a/addons/common/functions/fnc_getVehicleUAVCrew.sqf b/addons/common/functions/fnc_getVehicleUAVCrew.sqf index b1b1ae002e..0ac91e644a 100644 --- a/addons/common/functions/fnc_getVehicleUAVCrew.sqf +++ b/addons/common/functions/fnc_getVehicleUAVCrew.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns array of uav dummy ais. diff --git a/addons/common/functions/fnc_getVersion.sqf b/addons/common/functions/fnc_getVersion.sqf index ccf4966715..3908cd3050 100644 --- a/addons/common/functions/fnc_getVersion.sqf +++ b/addons/common/functions/fnc_getVersion.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the version number of the current ACE build. diff --git a/addons/common/functions/fnc_getWeaponAzimuthAndInclination.sqf b/addons/common/functions/fnc_getWeaponAzimuthAndInclination.sqf index 83df3782e4..2370a19e69 100644 --- a/addons/common/functions/fnc_getWeaponAzimuthAndInclination.sqf +++ b/addons/common/functions/fnc_getWeaponAzimuthAndInclination.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get local players weapon direction and slope. diff --git a/addons/common/functions/fnc_getWeaponIndex.sqf b/addons/common/functions/fnc_getWeaponIndex.sqf index b4e94e678f..f6077806e1 100644 --- a/addons/common/functions/fnc_getWeaponIndex.sqf +++ b/addons/common/functions/fnc_getWeaponIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the index of the weapon. diff --git a/addons/common/functions/fnc_getWeaponModes.sqf b/addons/common/functions/fnc_getWeaponModes.sqf index 93a8614f7f..55e260ef27 100644 --- a/addons/common/functions/fnc_getWeaponModes.sqf +++ b/addons/common/functions/fnc_getWeaponModes.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the available firing modes of a weapon. Will ignore the AI helper modes. diff --git a/addons/common/functions/fnc_getWeaponMuzzles.sqf b/addons/common/functions/fnc_getWeaponMuzzles.sqf index 264ad2b405..11fffaf196 100644 --- a/addons/common/functions/fnc_getWeaponMuzzles.sqf +++ b/addons/common/functions/fnc_getWeaponMuzzles.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the muzzles of a weapon. diff --git a/addons/common/functions/fnc_getWeaponState.sqf b/addons/common/functions/fnc_getWeaponState.sqf index 219f52d369..7ccb016c7a 100644 --- a/addons/common/functions/fnc_getWeaponState.sqf +++ b/addons/common/functions/fnc_getWeaponState.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Return current state of the weapon. Attachments and magazines with ammo. diff --git a/addons/common/functions/fnc_getWeaponType.sqf b/addons/common/functions/fnc_getWeaponType.sqf index 1b3e8fd331..527ce7c893 100644 --- a/addons/common/functions/fnc_getWeaponType.sqf +++ b/addons/common/functions/fnc_getWeaponType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check what kind of weapon the given class name is. diff --git a/addons/common/functions/fnc_getWeight.sqf b/addons/common/functions/fnc_getWeight.sqf index 5fc92b7703..fd50c62c14 100644 --- a/addons/common/functions/fnc_getWeight.sqf +++ b/addons/common/functions/fnc_getWeight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the weight (from the loadAbs command) in lbs/kg (based on user option) diff --git a/addons/common/functions/fnc_getWindDirection.sqf b/addons/common/functions/fnc_getWindDirection.sqf index cb10e18f85..d34df2a529 100644 --- a/addons/common/functions/fnc_getWindDirection.sqf +++ b/addons/common/functions/fnc_getWindDirection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get the compass direction the wind is blowing from. diff --git a/addons/common/functions/fnc_getZoom.sqf b/addons/common/functions/fnc_getZoom.sqf index 26144da81e..2b79ac9cf1 100644 --- a/addons/common/functions/fnc_getZoom.sqf +++ b/addons/common/functions/fnc_getZoom.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns a value depending on current zoom level. diff --git a/addons/common/functions/fnc_goKneeling.sqf b/addons/common/functions/fnc_goKneeling.sqf index e9317cc74e..881fad7669 100644 --- a/addons/common/functions/fnc_goKneeling.sqf +++ b/addons/common/functions/fnc_goKneeling.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Move unit to kneeling position (only if not yet prone and not underwater). diff --git a/addons/common/functions/fnc_hadamardProduct.sqf b/addons/common/functions/fnc_hadamardProduct.sqf index 07295dcef9..7d5d6557ae 100644 --- a/addons/common/functions/fnc_hadamardProduct.sqf +++ b/addons/common/functions/fnc_hadamardProduct.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Returns the Hadamard Product of two vectors. diff --git a/addons/common/functions/fnc_handleEngine.sqf b/addons/common/functions/fnc_handleEngine.sqf index 40574c69c6..442c800d28 100644 --- a/addons/common/functions/fnc_handleEngine.sqf +++ b/addons/common/functions/fnc_handleEngine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Blocks turning on the vehicles engine if set by the status effect handler. diff --git a/addons/common/functions/fnc_handleModifierKey.sqf b/addons/common/functions/fnc_handleModifierKey.sqf index 1440a7849e..1c7c968149 100644 --- a/addons/common/functions/fnc_handleModifierKey.sqf +++ b/addons/common/functions/fnc_handleModifierKey.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles key down event for modifier key. diff --git a/addons/common/functions/fnc_handleModifierKeyUp.sqf b/addons/common/functions/fnc_handleModifierKeyUp.sqf index 9ab3cadf7d..2047e21036 100644 --- a/addons/common/functions/fnc_handleModifierKeyUp.sqf +++ b/addons/common/functions/fnc_handleModifierKeyUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles key up event for modifier key. diff --git a/addons/common/functions/fnc_hasHatch.sqf b/addons/common/functions/fnc_hasHatch.sqf index ab6a25035d..5a2157d1ae 100644 --- a/addons/common/functions/fnc_hasHatch.sqf +++ b/addons/common/functions/fnc_hasHatch.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if unit is in a vehicle position where it can turn in or out. diff --git a/addons/common/functions/fnc_hasItem.sqf b/addons/common/functions/fnc_hasItem.sqf index 9ae4e7ec63..f446c5dac0 100644 --- a/addons/common/functions/fnc_hasItem.sqf +++ b/addons/common/functions/fnc_hasItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if unit has item. Note: case-sensitive. diff --git a/addons/common/functions/fnc_hasMagazine.sqf b/addons/common/functions/fnc_hasMagazine.sqf index fceee87c11..7874bcbd16 100644 --- a/addons/common/functions/fnc_hasMagazine.sqf +++ b/addons/common/functions/fnc_hasMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if given unit has a magazine of given classname diff --git a/addons/common/functions/fnc_hasZeusAccess.sqf b/addons/common/functions/fnc_hasZeusAccess.sqf new file mode 100644 index 0000000000..2ac1f1efb3 --- /dev/null +++ b/addons/common/functions/fnc_hasZeusAccess.sqf @@ -0,0 +1,19 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Check if current player has Zeus access + * + * Arguments: + * None + * + * Return Value: + * Has Zeus + * + * Example: + * call ace_common_fnc_hasZeusAccess + * + * Public: Yes + */ + +// Use of player is intentional +!isNull getAssignedCuratorLogic player // return diff --git a/addons/common/functions/fnc_headBugFix.sqf b/addons/common/functions/fnc_headBugFix.sqf index 2c6c072c34..838f48c89e 100644 --- a/addons/common/functions/fnc_headBugFix.sqf +++ b/addons/common/functions/fnc_headBugFix.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: rocko * Fixes animation issues that may get you stuck diff --git a/addons/common/functions/fnc_hideUnit.sqf b/addons/common/functions/fnc_hideUnit.sqf index e67f68dcc3..6c81729dde 100644 --- a/addons/common/functions/fnc_hideUnit.sqf +++ b/addons/common/functions/fnc_hideUnit.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike (based on muteUnit) + * Author: kymckay (based on muteUnit) * Globally hides a unit. This allows the handling of more than one reason to hide an object globally. * * Arguments: diff --git a/addons/common/functions/fnc_inTransitionAnim.sqf b/addons/common/functions/fnc_inTransitionAnim.sqf index 5999bcbe27..bd731f4be6 100644 --- a/addons/common/functions/fnc_inTransitionAnim.sqf +++ b/addons/common/functions/fnc_inTransitionAnim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if given unit is in a transitional animation diff --git a/addons/common/functions/fnc_interpolateFromArray.sqf b/addons/common/functions/fnc_interpolateFromArray.sqf index 851d368d37..184ccba765 100644 --- a/addons/common/functions/fnc_interpolateFromArray.sqf +++ b/addons/common/functions/fnc_interpolateFromArray.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Interpolates between two set points in a curve. diff --git a/addons/common/functions/fnc_isAwake.sqf b/addons/common/functions/fnc_isAwake.sqf index 5a59a3cb69..f564e5e872 100644 --- a/addons/common/functions/fnc_isAwake.sqf +++ b/addons/common/functions/fnc_isAwake.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if unit is awake. Will be false when death or unit is unconscious. diff --git a/addons/common/functions/fnc_isEOD.sqf b/addons/common/functions/fnc_isEOD.sqf index 303b258cb5..f2ec119d23 100644 --- a/addons/common/functions/fnc_isEOD.sqf +++ b/addons/common/functions/fnc_isEOD.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth de Wet (LH) * Checks whether the passed unit is an explosive specialist. diff --git a/addons/common/functions/fnc_isEngineer.sqf b/addons/common/functions/fnc_isEngineer.sqf index 1805bb50e5..f01472dc02 100644 --- a/addons/common/functions/fnc_isEngineer.sqf +++ b/addons/common/functions/fnc_isEngineer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: marc_book, edited by commy2 * Checks if a unit is an engineer. diff --git a/addons/common/functions/fnc_isFeatureCameraActive.sqf b/addons/common/functions/fnc_isFeatureCameraActive.sqf deleted file mode 100644 index 24ea0667be..0000000000 --- a/addons/common/functions/fnc_isFeatureCameraActive.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Sniperwolf572 - * Checks if one of the following common feature cameras is active: - * - * - Curator - * - ACE Spectator - * - Arsenal camera (BIS_fnc_arsenal) - * - Nexus Spectator (BIS_fnc_EGSpectator) - * - Establishing shot (BIS_fnc_establishingShot) - * - Splendid camera (BIS_fnc_camera) - * - Animation viewer (BIS_fnc_animViewer) - * - Classic camera (BIS_fnc_cameraOld) - * - * Arguments: - * 0: None - * - * Return Value: - * A feature camera is active - * - * Example: - * [] call ace_common_fnc_isFeatureCameraActive - * - * Public: Yes - */ - -ACE_DEPRECATED(QFUNC(isFeatureCameraActive),"3.14.0","CBA_fnc_getActiveFeatureCamera"); - -!( - isNull curatorCamera && // Curator - {!GETMVAR(EGVAR(spectator,isSet),false)} && // ACE Spectator - {GETMVAR(EGVAR(huntir,stop),true)} && // ACE Hunt IR - {isNull GETMVAR(BIS_EGSpectatorCamera_camera, objNull)} && // BIS Nexus Spectator - {isNull GETUVAR(BIS_fnc_arsenal_cam, objNull)} && // Arsenal camera - {isNull GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull)} && // Establishing shot camera - {isNull GETMVAR(BIS_fnc_camera_cam, objNull)} && // Splendid camera - {isNull GETUVAR(BIS_fnc_animViewer_cam, objNull)} && // Animation viewer camera - {isNull GETMVAR(BIS_DEBUG_CAM, objNull)} // Classic camera -) // return diff --git a/addons/common/functions/fnc_isInBuilding.sqf b/addons/common/functions/fnc_isInBuilding.sqf index 4b843fcea4..a6813ec4f3 100644 --- a/addons/common/functions/fnc_isInBuilding.sqf +++ b/addons/common/functions/fnc_isInBuilding.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit is in a building. Will return true if the unit is sitting in a bush. diff --git a/addons/common/functions/fnc_isMedic.sqf b/addons/common/functions/fnc_isMedic.sqf index 43d7f6a7ea..a5a70c6443 100644 --- a/addons/common/functions/fnc_isMedic.sqf +++ b/addons/common/functions/fnc_isMedic.sqf @@ -1,12 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Check if a unit is a medic * * Arguments: * 0: The Unit * - * ReturnValue: + * Return Value: * Unit is medic * * Example: diff --git a/addons/common/functions/fnc_isModLoaded.sqf b/addons/common/functions/fnc_isModLoaded.sqf index b69086e39d..fb7b1807b6 100644 --- a/addons/common/functions/fnc_isModLoaded.sqf +++ b/addons/common/functions/fnc_isModLoaded.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Glowbal - * Check in cfgPatches if modification is loaded + * Author: Glowbal, Grim + * Check in CfgPatches if modification is loaded * * Arguments: - * 0: Mod Name or Classname of the mod in cfgPatches + * 0: Mod Name or Classname of the mod in CfgPatches * * Return Value: * if modification is loaded @@ -17,4 +17,11 @@ params [["_modName", "", [""]]]; -isClass (configFile >> "CfgPatches" >> _modName) // return +private _return = GVAR(isModLoadedCache) get _modName; + +if (isNil "_return") then { + _return = isClass (configFile >> "CfgPatches" >> _modName); + GVAR(isModLoadedCache) set [_modName, _return]; +}; + +_return diff --git a/addons/common/functions/fnc_isPlayer.sqf b/addons/common/functions/fnc_isPlayer.sqf index 8aabbd3bc0..ae5dc72197 100644 --- a/addons/common/functions/fnc_isPlayer.sqf +++ b/addons/common/functions/fnc_isPlayer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578, commy2, akalegman * Checks if a unit is a player / curator controlled unit. diff --git a/addons/common/functions/fnc_isSwimming.sqf b/addons/common/functions/fnc_isSwimming.sqf index c7b290a65c..f190284503 100644 --- a/addons/common/functions/fnc_isSwimming.sqf +++ b/addons/common/functions/fnc_isSwimming.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: das attorney, Jonpas * Check if unit is swimming (surface swimming or diving). diff --git a/addons/common/functions/fnc_lightIntensityFromObject.sqf b/addons/common/functions/fnc_lightIntensityFromObject.sqf index e2099def69..38895557ad 100644 --- a/addons/common/functions/fnc_lightIntensityFromObject.sqf +++ b/addons/common/functions/fnc_lightIntensityFromObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Calculate light intensity object 1 recieves from object 2 @@ -30,8 +30,6 @@ if (_lightSource isKindOf "CAManBase") then { private _flashlight = (_lightSource weaponAccessories _weapon) select 1; - if (getNumber (configFile >> "CfgWeapons" >> _flashlight >> "ACE_laserpointer") > 0) exitWith {}; // Red = 1, Green = 2 - private _properties = [[_flashlight], FUNC(getLightPropertiesWeapon), uiNamespace, format [QEGVAR(cache,%1_%2), QUOTE(DFUNC(getLightPropertiesWeapon)), _flashlight], 1E11] call FUNC(cachedCall); //_properties = [_flashlight] call FUNC(getLightPropertiesWeapon); diff --git a/addons/common/functions/fnc_loadPerson.sqf b/addons/common/functions/fnc_loadPerson.sqf index 160344258b..f8fe96d17c 100644 --- a/addons/common/functions/fnc_loadPerson.sqf +++ b/addons/common/functions/fnc_loadPerson.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Loads a specified unit into any nearby vehicle, or _vehicle parameter. @@ -7,6 +7,8 @@ * 0: Unit that will load * 1: Unit to be loaded * 2: Vehicle that the unit will be loaded in (default: objNull) + * 3: Preferred seats + * 4: Reverse fill * * Return Value: * Vehicle that the unitToBeloaded has been loaded in. Returns objNull if function failed @@ -19,8 +21,8 @@ #define GROUP_SWITCH_ID QFUNC(loadPerson) -params ["_caller", "_unit", ["_vehicle", objNull]]; -TRACE_3("loadPerson",_caller,_unit,_vehicle); +params ["_caller", "_unit", ["_vehicle", objNull], ["_preferredSeats", []], ["_reverseFill", false]]; +TRACE_5("loadPerson",_caller,_unit,_vehicle,_preferredSeats,_reverseFill); if (!([_caller, _unit, ["isNotDragging", "isNotCarrying", "isNotSwimming"]] call FUNC(canInteractWith)) || {_caller == _unit}) exitWith { objNull }; @@ -39,8 +41,8 @@ if (!isNull _vehicle) then { }; }; - TRACE_3("sending ace_loadPersonEvent",_unit,_vehicle,_caller); - ["ace_loadPersonEvent", [_unit, _vehicle, _caller], _unit] call CBA_fnc_targetEvent; + TRACE_5("sending ace_loadPersonEvent",_unit,_vehicle,_caller,_preferredSeats,_reverseFill); + ["ace_loadPersonEvent", [_unit, _vehicle, _caller, _preferredSeats, _reverseFill], _unit] call CBA_fnc_targetEvent; }; _vehicle diff --git a/addons/common/functions/fnc_loadPersonLocal.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf index 8490bf70e9..8288f13924 100644 --- a/addons/common/functions/fnc_loadPersonLocal.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Load a person, local @@ -7,6 +7,8 @@ * 0: unit to be loaded * 1: vehicle that will beloaded * 2: caller that will load + * 3: preferred seats + * 4: reverse fill * * Return Value: * None @@ -17,14 +19,37 @@ * Public: Yes */ -params ["_unit", "_vehicle", ["_caller", objNull]]; -TRACE_3("loadPersonLocal",_unit,_vehicle,_caller); +params ["_unit", "_vehicle", ["_caller", objNull], ["_preferredSeats", []], ["_reverseFill", false]]; +TRACE_5("loadPersonLocal",_unit,_vehicle,_caller,_preferredSeats,_reverseFill); private _slotsOpen = false; if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false]) || {(getNumber (configOf _vehicle >> "ejectDeadCargo")) == 0}}) then { - _unit moveInCargo _vehicle; - TRACE_1("moveInCargo",_vehicle); - _slotsOpen = true; + if (_preferredSeats isNotEqualTo []) then { + private _taken = []; + { + _taken pushBackUnique (_vehicle getCargoIndex _x); + } forEach crew _vehicle; + private _preferredSeats = _preferredSeats - _taken; + if (count _preferredSeats > 0) then { + _unit moveInCargo [_vehicle, _preferredSeats select 0]; + TRACE_2("moveInCargo",_vehicle,_preferredSeats select 0); + _slotsOpen = true; + }; + }; + if (!_slotsOpen) then { + private _cargoSeats = fullCrew [_vehicle, "cargo", true]; + // FFV cargo seats are empty cargo positions but are not returned by fullCrew "cargo" + if (_cargoSeats isEqualTo []) then { + _cargoSeats = (fullCrew [_vehicle, "turret", true]) select {_x select 4}; + }; + if (_reverseFill) then { + reverse _cargoSeats; + }; + private _index = _cargoSeats findIf {isNull (_x select 0)}; + _unit moveInCargo [_vehicle, (_cargoSeats select _index) select 2]; + TRACE_2("moveInCargo",_vehicle,_index); + _slotsOpen = true; + }; } else { // Check if an empty turret is available // This already excludes FFV seats, which count as cargo positions diff --git a/addons/common/functions/fnc_moduleCheckPBOs.sqf b/addons/common/functions/fnc_moduleCheckPBOs.sqf index 583441d4d2..2720292c8e 100644 --- a/addons/common/functions/fnc_moduleCheckPBOs.sqf +++ b/addons/common/functions/fnc_moduleCheckPBOs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Initializes the check-PBOs module. diff --git a/addons/common/functions/fnc_moduleLSDVehicles.sqf b/addons/common/functions/fnc_moduleLSDVehicles.sqf index e006463d1e..fde230b0ca 100644 --- a/addons/common/functions/fnc_moduleLSDVehicles.sqf +++ b/addons/common/functions/fnc_moduleLSDVehicles.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, joko // Jonas * Nothing to see here, move along. diff --git a/addons/common/functions/fnc_monitor.sqf b/addons/common/functions/fnc_monitor.sqf index 17d3087c53..d6fd5c1330 100644 --- a/addons/common/functions/fnc_monitor.sqf +++ b/addons/common/functions/fnc_monitor.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * hint retun value of given function every frame * * Arguments: - * + * 0: Code to monitor * * Return Value: * None diff --git a/addons/common/functions/fnc_muteUnit.sqf b/addons/common/functions/fnc_muteUnit.sqf index fe65a56492..392f7ed61a 100644 --- a/addons/common/functions/fnc_muteUnit.sqf +++ b/addons/common/functions/fnc_muteUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Mutes the unit. It won't trigger auto generated chat messages either. diff --git a/addons/common/functions/fnc_muteUnitHandleInitPost.sqf b/addons/common/functions/fnc_muteUnitHandleInitPost.sqf index 4681ca73aa..134cc0ee3d 100644 --- a/addons/common/functions/fnc_muteUnitHandleInitPost.sqf +++ b/addons/common/functions/fnc_muteUnitHandleInitPost.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Applies speaker changes on init post. Used because setSpeaker is broken on init. diff --git a/addons/common/functions/fnc_muteUnitHandleRespawn.sqf b/addons/common/functions/fnc_muteUnitHandleRespawn.sqf index b507e7ec1d..6aa878bea5 100644 --- a/addons/common/functions/fnc_muteUnitHandleRespawn.sqf +++ b/addons/common/functions/fnc_muteUnitHandleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Applies speaker changes on respawn. Used because speaker is respawning breaks the speaker on non-local clients. Also resets the public object variable (broken for JIP clients, that join after respawn) diff --git a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf index 03a01cf395..71f62959b9 100644 --- a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf +++ b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Returns a list of vehicles near given unit that the unit can be a passenger in. diff --git a/addons/common/functions/fnc_numberToDigits.sqf b/addons/common/functions/fnc_numberToDigits.sqf index ff4cd23977..83fad813c8 100644 --- a/addons/common/functions/fnc_numberToDigits.sqf +++ b/addons/common/functions/fnc_numberToDigits.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2, SilentSpike + * Author: commy2, kymckay * Transforms a number to an array of the correspondending digits. * * Arguments: * 0: Number to 'digitize' - * 1: Set the minimal length of the returned array. Useful for getting left hand zeroes. , optional + * 1: Set the minimal length of the returned array. Useful for getting left hand zeroes. (default: 1) * * Return Value: * Digits. The maximum count is six digits. @@ -16,7 +16,7 @@ * Public: Yes */ -params ["_number", "_minLength"]; +params ["_number", ["_minLength", 1]]; _number = [_number min 999999, _minLength] call CBA_fnc_formatNumber; diff --git a/addons/common/functions/fnc_numberToDigitsString.sqf b/addons/common/functions/fnc_numberToDigitsString.sqf deleted file mode 100644 index 35b0d0fd9b..0000000000 --- a/addons/common/functions/fnc_numberToDigitsString.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Transforms a number to an string of the correspondending digits. - * - * Arguments: - * 0: Number to 'digitize' - * 1: Set the minimal length of the returned string. Useful for getting left hand zeroes. (Optional) - * - * Return Value: - * Digits. The maximum length is six digits. - * - * Example: - * [5, 5] call ace_common_fnc_numberToDigitsString - * - * Public: Yes - */ - -ACE_DEPRECATED(QFUNC(numberToDigitsString),"3.14.0","CBA_fnc_formatNumber"); - -_this call CBA_fnc_formatNumber diff --git a/addons/common/functions/fnc_numberToString.sqf b/addons/common/functions/fnc_numberToString.sqf index 8d5aaa09a1..bb1c4f7ced 100644 --- a/addons/common/functions/fnc_numberToString.sqf +++ b/addons/common/functions/fnc_numberToString.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Converts a number to a string without losing as much precission as str or format. diff --git a/addons/common/functions/fnc_onAnswerRequest.sqf b/addons/common/functions/fnc_onAnswerRequest.sqf index 5613e5d1bc..f3ab80de17 100644 --- a/addons/common/functions/fnc_onAnswerRequest.sqf +++ b/addons/common/functions/fnc_onAnswerRequest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * N/A diff --git a/addons/common/functions/fnc_owned.sqf b/addons/common/functions/fnc_owned.sqf index e216b10c39..15e8dce3be 100644 --- a/addons/common/functions/fnc_owned.sqf +++ b/addons/common/functions/fnc_owned.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Counterpart of ace_common_fnc_claim. Check if the given object is claimed by another unit. diff --git a/addons/common/functions/fnc_parseList.sqf b/addons/common/functions/fnc_parseList.sqf index 7f5bb59294..93ceccf17d 100644 --- a/addons/common/functions/fnc_parseList.sqf +++ b/addons/common/functions/fnc_parseList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Jonpas * Makes a list from a string using comma as a delimiter, optionally trim or remove whitespace and check each for object existence. diff --git a/addons/common/functions/fnc_playConfigSound3D.sqf b/addons/common/functions/fnc_playConfigSound3D.sqf index ee8d81f2c9..c282199365 100644 --- a/addons/common/functions/fnc_playConfigSound3D.sqf +++ b/addons/common/functions/fnc_playConfigSound3D.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Plays a sound defined in CfgSounds using playSound3D, with global effect. diff --git a/addons/common/functions/fnc_player.sqf b/addons/common/functions/fnc_player.sqf index 382db0bced..1a5614e44e 100644 --- a/addons/common/functions/fnc_player.sqf +++ b/addons/common/functions/fnc_player.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578, commy2 * Returns the player or curator controlled unit. diff --git a/addons/common/functions/fnc_playerSide.sqf b/addons/common/functions/fnc_playerSide.sqf index 6d42df6511..fe6c6e44eb 100644 --- a/addons/common/functions/fnc_playerSide.sqf +++ b/addons/common/functions/fnc_playerSide.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Return the current side of the player diff --git a/addons/common/functions/fnc_positionToASL.sqf b/addons/common/functions/fnc_positionToASL.sqf index 8d0586e097..b286d2f7ab 100644 --- a/addons/common/functions/fnc_positionToASL.sqf +++ b/addons/common/functions/fnc_positionToASL.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Converts Arma "Position" to ASL diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index 6639b21948..20c1283da4 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Glowbal, PabstMirror * Draw progress bar and execute given function if succesful. @@ -30,6 +30,15 @@ private _player = ACE_player; closeDialog 0; createDialog QGVAR(ProgressBar_Dialog); +private _display = uiNamespace getVariable QGVAR(dlgProgress); + +// Ensure CBA keybindings are hooked into the display +_display call (uiNamespace getVariable "CBA_events_fnc_initDisplayCurator"); + +// Hide cursor by using custom transparent cursor +private _map = _display displayCtrl 101; +_map ctrlMapCursor ["", QGVAR(blank)]; + (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetText _localizedTitle; //Adjust position based on user setting: diff --git a/addons/common/functions/fnc_readSettingFromModule.sqf b/addons/common/functions/fnc_readSettingFromModule.sqf index d61671d604..dc9ead397f 100644 --- a/addons/common/functions/fnc_readSettingFromModule.sqf +++ b/addons/common/functions/fnc_readSettingFromModule.sqf @@ -1,5 +1,5 @@ #define DEBUG_MODE_FULL -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Reads a setting value from a module, set it and force it. Logs if the setting is missing from the module. diff --git a/addons/common/functions/fnc_readSettingsFromParamsArray.sqf b/addons/common/functions/fnc_readSettingsFromParamsArray.sqf index e205fb15bf..2abb5fa73e 100644 --- a/addons/common/functions/fnc_readSettingsFromParamsArray.sqf +++ b/addons/common/functions/fnc_readSettingsFromParamsArray.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Read settins from paramsArray that have a ACE_setting = 1. @@ -47,7 +47,7 @@ TRACE_1("Reading missionConfigFile params",_paramsArray); case (_settingType == "CHECKBOX"): { _settingValue = _settingValue > 0; _validValue = [_settingName, _settingValue] call CBA_settings_fnc_check; - }; + }; // Will not Handle ARRAY,COLOR,STRING??? (bool/scalar covers most important settings) }; diff --git a/addons/common/functions/fnc_receiveRequest.sqf b/addons/common/functions/fnc_receiveRequest.sqf index 30adf7af58..6c45fb8966 100644 --- a/addons/common/functions/fnc_receiveRequest.sqf +++ b/addons/common/functions/fnc_receiveRequest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * N/A diff --git a/addons/common/functions/fnc_registerItemReplacement.sqf b/addons/common/functions/fnc_registerItemReplacement.sqf index 4f8429678c..ce2fd7e393 100644 --- a/addons/common/functions/fnc_registerItemReplacement.sqf +++ b/addons/common/functions/fnc_registerItemReplacement.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Registers an event handler that replaces an item or item type with one or @@ -20,76 +20,13 @@ 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); - _newItems = _newItems arrayIntersect _newItems; // Get unique items only - if (_newItems isEqualTo []) exitWith { - GVAR(oldItems) = _items; - }; - - private _cfgWeapons = configFile >> "CfgWeapons"; // Microoptimization - - for "_i" from 0 to count _newItems - 1 do { - private _item = _newItems#_i; - - // Get count of item in each container - private _containerCount = []; - { - _containerCount pushBack ({_x == _item} count _x) - } forEach [uniformItems _unit, vestItems _unit, backpackItems _unit]; - - // 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); - - // Replace all items of current class in list - if (_replacements isNotEqualTo []) then { - TRACE_3("replace",_item,_count,_replacements); - _unit removeItems _item; - - { - if (_x == 0) then {continue}; - private _container = ["uniform", "vest", "backpack"] select _forEachIndex; - for "_j" from 1 to _x do { - { - if ([_unit, _x, 1, _container == "uniform", _container == "vest", _container == "backpack"] call CBA_fnc_canAddItem) then { - [_unit, _x, _container] call FUNC(addToInventory) // add to specific container - } else { - [_unit, _x, ""] call FUNC(addToInventory) // no room, add anywhere - } - } forEach _replacements; - } - } forEach _containerCount; - }; - }; - - 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; + ["loadout", LINKFUNC(replaceRegisteredItems)] call CBA_fnc_addPlayerEventHandler; }; // Save item replacement @@ -110,12 +47,12 @@ _oldReplacements append _newItems; GVAR(itemReplacements) setVariable [_oldItem, _oldReplacements]; // Force item scan when new replacement was registered in PostInit -if (!isNull ACE_player) then { +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; + [LINKFUNC(replaceRegisteredItems), [ACE_player]] call CBA_fnc_execNextFrame; }; diff --git a/addons/common/functions/fnc_removeActionEventHandler.sqf b/addons/common/functions/fnc_removeActionEventHandler.sqf index e536adc191..6d5b0711c3 100644 --- a/addons/common/functions/fnc_removeActionEventHandler.sqf +++ b/addons/common/functions/fnc_removeActionEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove an addAction event from a unit. diff --git a/addons/common/functions/fnc_removeActionMenuEventHandler.sqf b/addons/common/functions/fnc_removeActionMenuEventHandler.sqf index ed072db89a..cb07949188 100644 --- a/addons/common/functions/fnc_removeActionMenuEventHandler.sqf +++ b/addons/common/functions/fnc_removeActionMenuEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove an addAction menu event from a unit. diff --git a/addons/common/functions/fnc_removeCanInteractWithCondition.sqf b/addons/common/functions/fnc_removeCanInteractWithCondition.sqf index 4538a67fb0..9cc3fda3c3 100644 --- a/addons/common/functions/fnc_removeCanInteractWithCondition.sqf +++ b/addons/common/functions/fnc_removeCanInteractWithCondition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove a condition that gets checked by ace_common_fnc_canInteractWith. diff --git a/addons/common/functions/fnc_removeMapMarkerCreatedEventHandler.sqf b/addons/common/functions/fnc_removeMapMarkerCreatedEventHandler.sqf index 2a95b0f4d7..950ac5002e 100644 --- a/addons/common/functions/fnc_removeMapMarkerCreatedEventHandler.sqf +++ b/addons/common/functions/fnc_removeMapMarkerCreatedEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove a map marker creation event handler. diff --git a/addons/common/functions/fnc_removeSpecificMagazine.sqf b/addons/common/functions/fnc_removeSpecificMagazine.sqf index 8da754ce32..8a93e25ef0 100644 --- a/addons/common/functions/fnc_removeSpecificMagazine.sqf +++ b/addons/common/functions/fnc_removeSpecificMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Removes a magazine from the unit or object that has a specific ammo count @@ -25,19 +25,8 @@ private _fnc_removeMagazine = { params ["_container", "_magArray"]; _magArray params ["_magazineType", "_ammoCount"]; - private _allMagazines = magazinesAmmoCargo _container; - private _specificMagazineIndex = _allMagazines findIf {_x isEqualTo _magArray}; - _allMagazines deleteAt _specificMagazineIndex; - - if (_specificMagazineIndex > -1) exitWith { - clearMagazineCargoGlobal _container; - private _containerType = typeOf _container; - if (_containerType in ["GroundWeaponHolder", "WeaponHolderSimulated"]) then { - _container = createVehicle [_containerType, getPosATL _container, [], 0, "CAN_COLLIDE"]; - }; - { - _container addMagazineAmmoCargo [_x select 0, 1, _x select 1]; - } forEach _allMagazines; + if (_magArray in (magazinesAmmoCargo _container)) exitWith { + _container addMagazineAmmoCargo [_magazineType, -1, _ammoCount]; true }; false diff --git a/addons/common/functions/fnc_removeSyncedEventHandler.sqf b/addons/common/functions/fnc_removeSyncedEventHandler.sqf index 51d7d1df66..5aed6270f4 100644 --- a/addons/common/functions/fnc_removeSyncedEventHandler.sqf +++ b/addons/common/functions/fnc_removeSyncedEventHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Remove a synced event handler diff --git a/addons/common/functions/fnc_replaceRegisteredItems.sqf b/addons/common/functions/fnc_replaceRegisteredItems.sqf new file mode 100644 index 0000000000..43f3b0153c --- /dev/null +++ b/addons/common/functions/fnc_replaceRegisteredItems.sqf @@ -0,0 +1,83 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles replacing unit's items with their registered replacements. + * Called by CBA Player Loadout Event, but can be used to replace items on AI. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [ACE_player] call ace_common_fnc_replaceRegisteredItems + * + * Public: Yes + */ +params [["_unit", objNull, [objNull]]]; + +private _items = items _unit; +if (_items isEqualTo GVAR(oldItems)) exitWith {}; + +private _newItems = _items - GVAR(oldItems); +_newItems = _newItems arrayIntersect _newItems; // Get unique items only +if (_newItems isEqualTo []) exitWith { + GVAR(oldItems) = _items; +}; +TRACE_2("replacing",_unit,_newItems); + +if (GVAR(blockItemReplacement)) exitWith { + TRACE_2("blocked delay",_unit,_newItems); + [{!GVAR(blockItemReplacement)}, LINKFUNC(replaceRegisteredItems), _unit] call CBA_fnc_waitUntilAndExecute; +}; + +private _cfgWeapons = configFile >> "CfgWeapons"; // Microoptimization + +for "_i" from 0 to count _newItems - 1 do { + private _item = _newItems#_i; + + // Get count of item in each container + private _containerCount = []; + { + _containerCount pushBack ({_x == _item} count _x) + } forEach [uniformItems _unit, vestItems _unit, backpackItems _unit]; + + // 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); + + // Replace all items of current class in list + if (_replacements isNotEqualTo []) then { + TRACE_3("replace",_item,_count,_replacements); + _unit removeItems _item; + + { + if (_x == 0) then {continue}; + private _container = ["uniform", "vest", "backpack"] select _forEachIndex; + for "_j" from 1 to _x do { + { + if ([_unit, _x, 1, _container == "uniform", _container == "vest", _container == "backpack"] call CBA_fnc_canAddItem) then { + [_unit, _x, _container] call FUNC(addToInventory) // add to specific container + } else { + [_unit, _x, ""] call FUNC(addToInventory) // no room, add anywhere + } + } forEach _replacements; + } + } forEach _containerCount; + }; +}; + +GVAR(oldItems) = items _unit; diff --git a/addons/common/functions/fnc_requestCallback.sqf b/addons/common/functions/fnc_requestCallback.sqf index 6729c19a6d..ddd2f89233 100644 --- a/addons/common/functions/fnc_requestCallback.sqf +++ b/addons/common/functions/fnc_requestCallback.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * N/A diff --git a/addons/common/functions/fnc_requestSyncedEvent.sqf b/addons/common/functions/fnc_requestSyncedEvent.sqf index 44b633b9de..8e566c0e67 100644 --- a/addons/common/functions/fnc_requestSyncedEvent.sqf +++ b/addons/common/functions/fnc_requestSyncedEvent.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Send a request to synchronize an event name from the client->server. Execute on client only. diff --git a/addons/common/functions/fnc_resetAllDefaults.sqf b/addons/common/functions/fnc_resetAllDefaults.sqf index be2b5a6cc8..4d9f42a13b 100644 --- a/addons/common/functions/fnc_resetAllDefaults.sqf +++ b/addons/common/functions/fnc_resetAllDefaults.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * reset all variables that have been defined diff --git a/addons/common/functions/fnc_restoreVariablesJIP.sqf b/addons/common/functions/fnc_restoreVariablesJIP.sqf index 0c0617be77..905353d8ab 100644 --- a/addons/common/functions/fnc_restoreVariablesJIP.sqf +++ b/addons/common/functions/fnc_restoreVariablesJIP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called from respawn eventhandler. Resets all public object namespace variables that are added via FUNC(setVariableJIP). diff --git a/addons/common/functions/fnc_rscObjectHelper.sqf b/addons/common/functions/fnc_rscObjectHelper.sqf new file mode 100644 index 0000000000..c7d1342de9 --- /dev/null +++ b/addons/common/functions/fnc_rscObjectHelper.sqf @@ -0,0 +1,64 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Convert between screen and 3d object coordinates + * + * Arguments: + * 0: Function + * 1: Input array + * 2: Scale (optional: 1) + * + * Return Value: + * Value + * + * Example: + * ["2d", [0,0,0], 1] call ace_common_fnc_rscObjectHelper + * + * Public: No + */ + +params ["_func", "_array", ["_scale", 1]]; + +private _adjustCam = 1; +private _topFOV = getResolution # 6; +private _leftFOV = getResolution # 7; + +private _topLeftX = (_leftFOV-1)*0.5/_leftFOV; +private _bottomRightX = 1-_topLeftX; +private _topLeftY = 0; +private _bottomRightY = 1; + +private _return = []; + +switch (toLower _func) do { + case ("2d"): { + _array params ["_pointX", "_z", "_pointY"]; + + private _scrX = _pointX * (_bottomRightX - _topLeftX) + _topLeftX; + private _vX = _leftFOV * (_scrX - 0.5) * _adjustCam * _z; + + private _scrY = _pointY * (_bottomRightY - _topLeftY) + _topLeftY; + private _vY = _topFOV * (0.5 - _scrY) * _adjustCam * _z; + + _vX = _vX / _scale; + _vY = _vY / _scale; + + _return = [_vX, _vY, _z]; + }; + case ("3d"): { + _array params ["_vX", "_vY", "_z"]; // z is distance from screen + + _vX = _vX * _scale; + _vY = _vY * _scale; + + private _scrX = _vX / (_leftFOV * _adjustCam * _z) + 0.5; + private _pointX = (_scrX - _topLeftX) / (_bottomRightX - _topLeftX); + + private _scrY = 0.5 - _vY / (_topFOV * _adjustCam * _z); + private _pointY = (_scrY - _topLeftY) / (_bottomRightY - _topLeftY); + + _return = [_pointX, _z, _pointY]; + }; +}; + +_return diff --git a/addons/common/functions/fnc_runAfterSettingsInit.sqf b/addons/common/functions/fnc_runAfterSettingsInit.sqf index f989501dd5..5a731d130d 100644 --- a/addons/common/functions/fnc_runAfterSettingsInit.sqf +++ b/addons/common/functions/fnc_runAfterSettingsInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Executes code after setting are initilized. diff --git a/addons/common/functions/fnc_runTests.sqf b/addons/common/functions/fnc_runTests.sqf index 019055443c..946255c42f 100644 --- a/addons/common/functions/fnc_runTests.sqf +++ b/addons/common/functions/fnc_runTests.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Run test functions. diff --git a/addons/common/functions/fnc_sanitizeString.sqf b/addons/common/functions/fnc_sanitizeString.sqf index 3517c5086a..c30cbe1292 100644 --- a/addons/common/functions/fnc_sanitizeString.sqf +++ b/addons/common/functions/fnc_sanitizeString.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, based on Killzone-Kid code * Removes quotation marks to avoid exploits and optionally html tags from text to avoid conflicts with structured text. diff --git a/addons/common/functions/fnc_sendRequest.sqf b/addons/common/functions/fnc_sendRequest.sqf index cfa52de068..d5ec9643da 100644 --- a/addons/common/functions/fnc_sendRequest.sqf +++ b/addons/common/functions/fnc_sendRequest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Send a request to an unit and execute code based upon results. diff --git a/addons/common/functions/fnc_serverLog.sqf b/addons/common/functions/fnc_serverLog.sqf index 183e110071..0ea811c3c2 100644 --- a/addons/common/functions/fnc_serverLog.sqf +++ b/addons/common/functions/fnc_serverLog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Log a RPT messaged on just the server diff --git a/addons/common/functions/fnc_setAimCoef.sqf b/addons/common/functions/fnc_setAimCoef.sqf index 5680918dfa..8b22831c06 100644 --- a/addons/common/functions/fnc_setAimCoef.sqf +++ b/addons/common/functions/fnc_setAimCoef.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: xrufix, Glowbal * Handle set AimCoef calls. Will use the highest available setting. diff --git a/addons/common/functions/fnc_setApproximateVariablePublic.sqf b/addons/common/functions/fnc_setApproximateVariablePublic.sqf index 562bdfd1c8..3ef9595121 100644 --- a/addons/common/functions/fnc_setApproximateVariablePublic.sqf +++ b/addons/common/functions/fnc_setApproximateVariablePublic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Publish a variable if it's different enough from the previously published value. diff --git a/addons/common/functions/fnc_setDefinedVariable.sqf b/addons/common/functions/fnc_setDefinedVariable.sqf index 4800958048..a9cb8ac595 100644 --- a/addons/common/functions/fnc_setDefinedVariable.sqf +++ b/addons/common/functions/fnc_setDefinedVariable.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * setVariable value diff --git a/addons/common/functions/fnc_setDisableUserInputStatus.sqf b/addons/common/functions/fnc_setDisableUserInputStatus.sqf index 843837caba..8de0a0c72d 100644 --- a/addons/common/functions/fnc_setDisableUserInputStatus.sqf +++ b/addons/common/functions/fnc_setDisableUserInputStatus.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Disables the user input. Works stacked. diff --git a/addons/common/functions/fnc_setHearingCapability.sqf b/addons/common/functions/fnc_setHearingCapability.sqf index 5fdb5b1272..45858278c1 100644 --- a/addons/common/functions/fnc_setHearingCapability.sqf +++ b/addons/common/functions/fnc_setHearingCapability.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handle set volume calls. Will use the lowest available volume setting. diff --git a/addons/common/functions/fnc_setName.sqf b/addons/common/functions/fnc_setName.sqf index d725dcc30d..1b0a436aee 100644 --- a/addons/common/functions/fnc_setName.sqf +++ b/addons/common/functions/fnc_setName.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Sets the name variable of the object. Used to prevent issues with the name command. diff --git a/addons/common/functions/fnc_setParameter.sqf b/addons/common/functions/fnc_setParameter.sqf index f7b2ca579f..25dc183865 100644 --- a/addons/common/functions/fnc_setParameter.sqf +++ b/addons/common/functions/fnc_setParameter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Sets the value of an ACE_Parameter and makes it public. diff --git a/addons/common/functions/fnc_setPitchBankYaw.sqf b/addons/common/functions/fnc_setPitchBankYaw.sqf index debe133484..8d46c08639 100644 --- a/addons/common/functions/fnc_setPitchBankYaw.sqf +++ b/addons/common/functions/fnc_setPitchBankYaw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Bohemia Interactive edit by KoffeinFlummi * Sets the value of an ACE_Parameter and makes it public. diff --git a/addons/common/functions/fnc_setPlayerOwner.sqf b/addons/common/functions/fnc_setPlayerOwner.sqf index c15974098b..2b37349f9a 100644 --- a/addons/common/functions/fnc_setPlayerOwner.sqf +++ b/addons/common/functions/fnc_setPlayerOwner.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Sets the player's owner id as a variable on his player ojbect. diff --git a/addons/common/functions/fnc_setProne.sqf b/addons/common/functions/fnc_setProne.sqf index f12545290c..20bbbfe550 100644 --- a/addons/common/functions/fnc_setProne.sqf +++ b/addons/common/functions/fnc_setProne.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Force a unit to go prone diff --git a/addons/common/functions/fnc_setSetting.sqf b/addons/common/functions/fnc_setSetting.sqf index a50cf89214..93c6045a6c 100644 --- a/addons/common/functions/fnc_setSetting.sqf +++ b/addons/common/functions/fnc_setSetting.sqf @@ -1,5 +1,5 @@ #define DEBUG_MODE_FULL -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Change the value of an existing setting if it was not previously forced. Force if neccesary. diff --git a/addons/common/functions/fnc_setVariableJIP.sqf b/addons/common/functions/fnc_setVariableJIP.sqf index 857bd1b9b9..36b3d0c3ed 100644 --- a/addons/common/functions/fnc_setVariableJIP.sqf +++ b/addons/common/functions/fnc_setVariableJIP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Sets a public object namespace variable that gets reset with the same value after respawn, so JIP clients keep the value. diff --git a/addons/common/functions/fnc_setVariablePublic.sqf b/addons/common/functions/fnc_setVariablePublic.sqf index ba58308243..8b583849be 100644 --- a/addons/common/functions/fnc_setVariablePublic.sqf +++ b/addons/common/functions/fnc_setVariablePublic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 and CAA-Picard and joko and PabstMirror * Publish a variable, but wait a certain amount of time before allowing it to be published it again. diff --git a/addons/common/functions/fnc_setVolume.sqf b/addons/common/functions/fnc_setVolume.sqf index b4d0423d0e..1b0378bb78 100644 --- a/addons/common/functions/fnc_setVolume.sqf +++ b/addons/common/functions/fnc_setVolume.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Sets the volume of the game, including third party radio modifications such as TFAR and ACRE. @@ -31,7 +31,6 @@ if (_setVolume) then { 2 fadeSound NORMAL_LEVEL; // TFAR - _unit setVariable ["tf_voiceVolume", NORMAL_LEVEL, true]; _unit setVariable ["tf_globalVolume", NORMAL_LEVEL]; // ACRE2 @@ -42,7 +41,6 @@ if (_setVolume) then { 2 fadeSound MUTED_LEVEL; // TFAR - _unit setVariable ["tf_voiceVolume", NO_SOUND, true]; _unit setVariable ["tf_globalVolume", MUTED_LEVEL]; // ACRE2 diff --git a/addons/common/functions/fnc_setupLocalUnitsHandler.sqf b/addons/common/functions/fnc_setupLocalUnitsHandler.sqf index 75f696e324..0ab01cddbd 100644 --- a/addons/common/functions/fnc_setupLocalUnitsHandler.sqf +++ b/addons/common/functions/fnc_setupLocalUnitsHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: dedmen * Adds the local unit event handlers. diff --git a/addons/common/functions/fnc_showHud.sqf b/addons/common/functions/fnc_showHud.sqf index 8d6bfb8e9d..da6f2e0975 100644 --- a/addons/common/functions/fnc_showHud.sqf +++ b/addons/common/functions/fnc_showHud.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Allows multiple sources to not overwrite showHud command. diff --git a/addons/common/functions/fnc_showUser.sqf b/addons/common/functions/fnc_showUser.sqf index a30c7cada3..3907849e15 100644 --- a/addons/common/functions/fnc_showUser.sqf +++ b/addons/common/functions/fnc_showUser.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * hint the Variable ACE_isUsedBy from the input Object every frame diff --git a/addons/common/functions/fnc_statusEffect_addType.sqf b/addons/common/functions/fnc_statusEffect_addType.sqf index 2a1efdc9d8..959ae8c2ef 100644 --- a/addons/common/functions/fnc_statusEffect_addType.sqf +++ b/addons/common/functions/fnc_statusEffect_addType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Adds a status effect that will be handled. diff --git a/addons/common/functions/fnc_statusEffect_get.sqf b/addons/common/functions/fnc_statusEffect_get.sqf index 683c235214..bef27fc6e8 100644 --- a/addons/common/functions/fnc_statusEffect_get.sqf +++ b/addons/common/functions/fnc_statusEffect_get.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Retrives list of current status effects diff --git a/addons/common/functions/fnc_statusEffect_localEH.sqf b/addons/common/functions/fnc_statusEffect_localEH.sqf index 9f5cd7c42a..f8ff93dba7 100644 --- a/addons/common/functions/fnc_statusEffect_localEH.sqf +++ b/addons/common/functions/fnc_statusEffect_localEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles locality switch, runs a respawn check and then reapplies all effect events. diff --git a/addons/common/functions/fnc_statusEffect_resetVariables.sqf b/addons/common/functions/fnc_statusEffect_resetVariables.sqf index b819174753..a9b6853b9f 100644 --- a/addons/common/functions/fnc_statusEffect_resetVariables.sqf +++ b/addons/common/functions/fnc_statusEffect_resetVariables.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Resets all effect numbers to 0 when an object respawns (but does not apply the effect event). diff --git a/addons/common/functions/fnc_statusEffect_respawnEH.sqf b/addons/common/functions/fnc_statusEffect_respawnEH.sqf index 56fe38b6a8..2c4a4840fe 100644 --- a/addons/common/functions/fnc_statusEffect_respawnEH.sqf +++ b/addons/common/functions/fnc_statusEffect_respawnEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the Respawn Event Handler to reset effects. diff --git a/addons/common/functions/fnc_statusEffect_sendEffects.sqf b/addons/common/functions/fnc_statusEffect_sendEffects.sqf index dae88d35e4..10f7ffb30c 100644 --- a/addons/common/functions/fnc_statusEffect_sendEffects.sqf +++ b/addons/common/functions/fnc_statusEffect_sendEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Sends all status effects for an object (can be run on non-local objects) diff --git a/addons/common/functions/fnc_statusEffect_set.sqf b/addons/common/functions/fnc_statusEffect_set.sqf index ff8fa8565a..48af4bf771 100644 --- a/addons/common/functions/fnc_statusEffect_set.sqf +++ b/addons/common/functions/fnc_statusEffect_set.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Adds or removes an id to a status effect and will send an event to apply. diff --git a/addons/common/functions/fnc_stringCompare.sqf b/addons/common/functions/fnc_stringCompare.sqf index 9a0955b27a..8ed3c63c75 100644 --- a/addons/common/functions/fnc_stringCompare.sqf +++ b/addons/common/functions/fnc_stringCompare.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bovine3dom * Determines whether one string matches another and how many characters match. Case insensitive. diff --git a/addons/common/functions/fnc_stringToColoredText.sqf b/addons/common/functions/fnc_stringToColoredText.sqf index c7eaaaecb3..0a292753c4 100644 --- a/addons/common/functions/fnc_stringToColoredText.sqf +++ b/addons/common/functions/fnc_stringToColoredText.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Create a centered, colored text. diff --git a/addons/common/functions/fnc_swayLoop.sqf b/addons/common/functions/fnc_swayLoop.sqf new file mode 100644 index 0000000000..ec12f3f0aa --- /dev/null +++ b/addons/common/functions/fnc_swayLoop.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Calculates and applies final sway coefficient from sway factors + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_common_fnc_swayLoop + * + * Public: No +*/ + +private _baseline = 1; +if (GVAR(swayFactorsBaseline) isNotEqualTo []) then { + _baseline = 1 max ([missionNamespace, "ACE_setCustomAimCoef_baseline", "max"] call EFUNC(common,arithmeticGetResult)); +}; + +private _multiplier = 1; +if (GVAR(swayFactorsMultiplier) isNotEqualTo []) then { + _multiplier = [missionNamespace, "ACE_setCustomAimCoef_multiplier", "product"] call EFUNC(common,arithmeticGetResult); +}; + +ACE_player setCustomAimCoef (_baseline * _multiplier); + +[FUNC(swayLoop), [], 1] call CBA_fnc_waitAndExecute diff --git a/addons/common/functions/fnc_switchPersistentLaser.sqf b/addons/common/functions/fnc_switchPersistentLaser.sqf index 2e2fb7505b..a2b7b9c1a8 100644 --- a/addons/common/functions/fnc_switchPersistentLaser.sqf +++ b/addons/common/functions/fnc_switchPersistentLaser.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Controls persistent laser state. diff --git a/addons/common/functions/fnc_switchToGroupSide.sqf b/addons/common/functions/fnc_switchToGroupSide.sqf index 842bdffabd..94d8c52701 100644 --- a/addons/common/functions/fnc_switchToGroupSide.sqf +++ b/addons/common/functions/fnc_switchToGroupSide.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Stack group switches. Will always trace back to original group. diff --git a/addons/common/functions/fnc_syncedEvent.sqf b/addons/common/functions/fnc_syncedEvent.sqf index dbcf7f621b..5bcb678524 100644 --- a/addons/common/functions/fnc_syncedEvent.sqf +++ b/addons/common/functions/fnc_syncedEvent.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Call and propegate a synced event diff --git a/addons/common/functions/fnc_syncedEventPFH.sqf b/addons/common/functions/fnc_syncedEventPFH.sqf index 8f356ed433..2ed238bd9e 100644 --- a/addons/common/functions/fnc_syncedEventPFH.sqf +++ b/addons/common/functions/fnc_syncedEventPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/common/functions/fnc_throttledPublicVariable.sqf b/addons/common/functions/fnc_throttledPublicVariable.sqf index abfcfc8c8c..3c1ed2761b 100644 --- a/addons/common/functions/fnc_throttledPublicVariable.sqf +++ b/addons/common/functions/fnc_throttledPublicVariable.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Schedules the publishment of an object variable to reduce network overhead diff --git a/addons/common/functions/fnc_throwWeapon.sqf b/addons/common/functions/fnc_throwWeapon.sqf new file mode 100644 index 0000000000..c3c234e61f --- /dev/null +++ b/addons/common/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_common_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/common/functions/fnc_toBin.sqf b/addons/common/functions/fnc_toBin.sqf index c5da7ece8e..038a091d83 100644 --- a/addons/common/functions/fnc_toBin.sqf +++ b/addons/common/functions/fnc_toBin.sqf @@ -1,10 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Converts number to binary number * * Arguments: - * A number + * 0: A number + * 1: Minumum length of numbers (default: 1) * * Return Value: * A binary number as string diff --git a/addons/common/functions/fnc_toBitmask.sqf b/addons/common/functions/fnc_toBitmask.sqf index 2d46811c6b..2efd5414c9 100644 --- a/addons/common/functions/fnc_toBitmask.sqf +++ b/addons/common/functions/fnc_toBitmask.sqf @@ -1,10 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Convert an array of booleans into a number. * * Arguments: - * N: Booleans + * 0: Boolean + * 1: Boolean + * 2: Boolean + * ... * * Return Value: * Bitmask diff --git a/addons/common/functions/fnc_toHex.sqf b/addons/common/functions/fnc_toHex.sqf index 697fbb9b6d..08e903405b 100644 --- a/addons/common/functions/fnc_toHex.sqf +++ b/addons/common/functions/fnc_toHex.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, esteldunedain * Converts number to hexadecimal number * * Arguments: - * A number between 0 and 255 + * 0: A number between 0 and 255 * * Return Value: * A hexadecimal number as string diff --git a/addons/common/functions/fnc_toNumber.sqf b/addons/common/functions/fnc_toNumber.sqf index 14e8179a63..835ebfb48a 100644 --- a/addons/common/functions/fnc_toNumber.sqf +++ b/addons/common/functions/fnc_toNumber.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth de Wet (LH) * Takes a string/number and returns the number. diff --git a/addons/common/functions/fnc_translateToModelSpace.sqf b/addons/common/functions/fnc_translateToModelSpace.sqf index 843c710c8d..9583f6063c 100644 --- a/addons/common/functions/fnc_translateToModelSpace.sqf +++ b/addons/common/functions/fnc_translateToModelSpace.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * ? diff --git a/addons/common/functions/fnc_translateToWeaponSpace.sqf b/addons/common/functions/fnc_translateToWeaponSpace.sqf index 4f4bbeae3b..143ded9350 100644 --- a/addons/common/functions/fnc_translateToWeaponSpace.sqf +++ b/addons/common/functions/fnc_translateToWeaponSpace.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * ? diff --git a/addons/common/functions/fnc_unhideUnit.sqf b/addons/common/functions/fnc_unhideUnit.sqf index b6d669366e..d78de70b26 100644 --- a/addons/common/functions/fnc_unhideUnit.sqf +++ b/addons/common/functions/fnc_unhideUnit.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike (based on unmuteUnit) + * Author: kymckay (based on unmuteUnit) * Globally unhides a unit. Only unhides if the last reason was removed. * * Arguments: diff --git a/addons/common/functions/fnc_uniqueElements.sqf b/addons/common/functions/fnc_uniqueElements.sqf index 5aad721d48..8a578cd008 100644 --- a/addons/common/functions/fnc_uniqueElements.sqf +++ b/addons/common/functions/fnc_uniqueElements.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Make a copy of an array with only the unique elements. diff --git a/addons/common/functions/fnc_uniqueItems.sqf b/addons/common/functions/fnc_uniqueItems.sqf index 5d7e5e8633..dc783ebbea 100644 --- a/addons/common/functions/fnc_uniqueItems.sqf +++ b/addons/common/functions/fnc_uniqueItems.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Returns list of unique items in a unit's inventory. diff --git a/addons/common/functions/fnc_uniqueUnitItems.sqf b/addons/common/functions/fnc_uniqueUnitItems.sqf new file mode 100644 index 0000000000..9fa03386c6 --- /dev/null +++ b/addons/common/functions/fnc_uniqueUnitItems.sqf @@ -0,0 +1,47 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Returns list of items (including magazines, backpacks and other) in a unit's inventory. + * Number definition: 0: Do not return value, 1: Return container only, 2: Return container and content, 3: Return content only + * + * Arguments: + * 0: Unit + * 1: Weapon items (default: 2) + * 2: Uniform items (default: 2) + * 3: Vest items (default: 2) + * 4: Backpack items (default: 2) + * 5: Assigned items (default: true) + * + * Return Value: + * Items + * + * Example: + * [player] call ace_common_fnc_uniqueUnitItems + * + * Public: Yes + */ + +params ["_unit", ["_weaponItems", 2, [0]], ["_uniformItems", 2, [0]], ["_vestItems", 2, [0]], ["_backpackItems", 2, [0]], ["_assignedItems", true, [false]]]; + +// 'uniqueUnitItems' can take any number, number other than 0 and 1 have the same effect as the number '2' +private _uniqueUnitItems = uniqueUnitItems [_unit, _weaponItems, _uniformItems, _vestItems, _backpackItems, _assignedItems]; + +private _amount = 0; + +// Remove unit's uniform, vest and backpack if there aren't in the containers themselves if necessary +{ + _x params ["_container", "_filter"]; + + if ((_filter == 3) && {_container != ""}) then { + _amount = _uniqueUnitItems get _container; + + // Delete item from hashmap if it's the only one + if (_amount == 1) then { + _uniqueUnitItems deleteAt _container; + } else { + _uniqueUnitItems set [_container, _amount - 1]; + }; + }; +} forEach [[uniform _unit, _uniformItems], [vest _unit, _vestItems], [backpack _unit, _backpackItems]]; + +_uniqueUnitItems diff --git a/addons/common/functions/fnc_unloadPerson.sqf b/addons/common/functions/fnc_unloadPerson.sqf index 5f435a1455..f6dc7534d2 100644 --- a/addons/common/functions/fnc_unloadPerson.sqf +++ b/addons/common/functions/fnc_unloadPerson.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Unload a person from a vehicle diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index 21c16f8f6d..d7a2f57db0 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ViperMaul * Unload a person from a vehicle, local @@ -19,7 +19,7 @@ #define GROUP_SWITCH_ID QFUNC(loadPerson) -params ["_unit", "_vehicle", ["_unloader", objNull]]; +params ["_unit", ["_vehicle", objNull], ["_unloader", objNull]]; TRACE_3("unloadpersonLocal",_unit,_vehicle,_unloader); //This covers testing vehicle stability and finding a safe position @@ -46,16 +46,20 @@ if (count _emptyPos != 3) exitwith { unassignVehicle _unit; [_unit] orderGetIn false; -TRACE_1("Ejecting", alive _unit); -private _vehicle = vehicle _unit; +TRACE_2("Ejecting",alive _unit,local _vehicle); + if (local _vehicle) then { _unit action ["Eject", _vehicle]; // Failsafe - sometimes eject alone doesn't work, but moveOut does [{ params ["_unit"]; - if (vehicle _unit != _unit) then { - WARNING_1("UnloadPersonLocal [%1] did not eject normally",_unit); + if (!isNull objectParent _unit) then { + if ([_unit] call FUNC(isAwake)) then { + WARNING_1("UnloadPersonLocal [%1] did not eject normally",_unit); + } else { + TRACE_1("UnloadPersonLocal dead/uncon did not eject normally",_unit); + }; moveOut _unit; }; }, [_unit], 1] call CBA_fnc_waitAndExecute; @@ -64,18 +68,21 @@ if (local _vehicle) then { moveOut _unit; }; -[{ - params ["_unit", "_emptyPos"]; - (alive _unit) && {(vehicle _unit) != _unit} -}, { - params ["_unit", "_emptyPos"]; - TRACE_2("success",_unit,_emptyPos); - _unit setPosASL AGLToASL _emptyPos; -}, [_unit, _emptyPos], 2, { - params ["_unit", "_emptyPos"]; - if (!alive _unit) exitWith {}; - WARNING_2("timeout %1->%2",_unit,vehicle _unit); -}] call CBA_fnc_waitUntilAndExecute; +// Wait until unit has actually exited vehicle and then move them to the unload position +if (alive _unit) then { + [{ + params ["_unit", "_emptyPos"]; + (alive _unit) && {isNull objectParent _unit} + }, { + params ["_unit", "_emptyPos"]; + TRACE_2("unload success",_unit,_emptyPos); + _unit setPosASL AGLToASL _emptyPos; + }, [_unit, _emptyPos], 2, { + params ["_unit", "_emptyPos"]; + if (!alive _unit) exitWith {}; + WARNING_2("timeout %1->%2",_unit,objectParent _unit); + }] call CBA_fnc_waitUntilAndExecute; +}; [_unit, false, GROUP_SWITCH_ID, side group _unit] call FUNC(switchToGroupSide); diff --git a/addons/common/functions/fnc_unloadUnitWeapon.sqf b/addons/common/functions/fnc_unloadUnitWeapon.sqf new file mode 100644 index 0000000000..ef367d103c --- /dev/null +++ b/addons/common/functions/fnc_unloadUnitWeapon.sqf @@ -0,0 +1,128 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh, commy2, johnb43 + * Unload the magazine from the unit's weapon and attempt to put it in a sensible place. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Muzzle (default: Weapon) + * 3: Magazine (default: magazine in Weapon) + * 4: Ammo count (default: Unit ammo Muzzle) + * 5: Skip animation? (default: false) + * + * Return Value: + * None + * + * Example: + * [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player, currentMagazine ACE_player, 23, false] call ace_common_fnc_unloadUnitWeapon + * + * Public: No + */ + +params ["_unit", "_weapon", "_muzzle", "_magazine", "_ammoCount", ["_skipAnim", false]]; +TRACE_6("params",_unit,_weapon,_muzzle,_magazine,_ammoCount,_skipAnim); + +if (_unit getVariable [QGVAR(isUnloadingWeapon), false]) exitWith {}; + +// Only allow 1 weapon to be unloaded at a time (because of animation length) +_unit setVariable [QGVAR(isUnloadingWeapon), true]; + +if (isNil "_muzzle") then { + _muzzle = _weapon; +}; + +if (isNil "_magazine") then { + private _weaponState = _unit weaponState _muzzle; + + _magazine = _weaponState select 3; + _ammoCount = _weaponState select 4; +}; + +if (isNil "_ammoCount") then { + _ammoCount = _unit ammo _muzzle; +}; + +// Audiovisual effects +private _delay = 0; + +if (!_skipAnim) then { + _delay = 1.5; + + private _config = configFile >> "CfgWeapons" >> _weapon; + + if (_weapon != _muzzle) then { + _config = _config >> _muzzle; + }; + + // Get and play animation + private _unloadAction = getText (_config >> "ACE_unloadAction"); + + if (_unloadAction == "") then { + _unloadAction = getText (_config >> "reloadAction"); + }; + + [_unit, _unloadAction, 1] call FUNC(doGesture); + + // Get and play sound + private _unloadSound = getText (_config >> "ACE_unloadSound"); + + if (_unloadSound == "") then { + _unloadSound = "A3\Sounds_F\arsenal\weapons\Rifles\Katiba\reload_Katiba.wss"; + + private _unloadSoundArray = getArray (_config >> "reloadMagazineSound"); + + // File extention is required for playSound3D + if (_unloadSoundArray isNotEqualTo []) then { + private _wssTest = format ["%1.wss", _unloadSoundArray select 0]; + + if (fileExists _wssTest) then { + _unloadSound = _wssTest; + } else { + private _wavTest = format ["%1.wav", _unloadSoundArray select 0]; + + if (fileExists _wavTest) then { + _unloadSound = _wavTest; + } else { + private _oggTest = format ["%1.ogg", _unloadSoundArray select 0]; + + if (fileExists _oggTest) then { + _unloadSound = _oggTest; + }; + }; + }; + }; + }; + + playSound3D [_unloadSound, _unit]; +}; + +// Remove magazine from weapon and add it to inventory +[{ + params ["_unit", "_weapon", "_muzzle", "_magazine", "_ammoCount"]; + + _unit setVariable [QGVAR(isUnloadingWeapon), nil]; + + private _returnMagazine = true; + + // Check if it's possible to remove given item from weapon; If possible, remove weapon item + switch (true) do { + case (_weapon == primaryWeapon _unit && {_weapon canAdd [_magazine, _muzzle]}): { + _unit removePrimaryWeaponItem _magazine; + }; + case (_weapon == handgunWeapon _unit && {_weapon canAdd [_magazine, _muzzle]}): { + _unit removeHandgunItem _magazine; + }; + case (_weapon == secondaryWeapon _unit && {_weapon canAdd [_magazine, _muzzle]}): { + _unit removeSecondaryWeaponItem _magazine; + }; + default { + _returnMagazine = false; + }; + }; + + // Avoid duplicating magazines (e.g. by switching weapons mid unload) + if (!_returnMagazine) exitWith {}; + + [_unit, _magazine, _ammoCount, true] call CBA_fnc_addMagazine; +}, [_unit, _weapon, _muzzle, _magazine, _ammoCount], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/common/functions/fnc_unmuteUnit.sqf b/addons/common/functions/fnc_unmuteUnit.sqf index 03a7a33e23..e624cfac54 100644 --- a/addons/common/functions/fnc_unmuteUnit.sqf +++ b/addons/common/functions/fnc_unmuteUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Unmutes the unit. Only unmutes if the last reason was removed. diff --git a/addons/common/functions/fnc_useItem.sqf b/addons/common/functions/fnc_useItem.sqf index ba4e668792..ea2a743751 100644 --- a/addons/common/functions/fnc_useItem.sqf +++ b/addons/common/functions/fnc_useItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Use item diff --git a/addons/common/functions/fnc_useMagazine.sqf b/addons/common/functions/fnc_useMagazine.sqf index 109f01f996..c08cb1534a 100644 --- a/addons/common/functions/fnc_useMagazine.sqf +++ b/addons/common/functions/fnc_useMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Use magazine diff --git a/addons/common/functions/fnc_watchVariable.sqf b/addons/common/functions/fnc_watchVariable.sqf index b3ec33bddc..fb1f7db671 100644 --- a/addons/common/functions/fnc_watchVariable.sqf +++ b/addons/common/functions/fnc_watchVariable.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Shows multiple watched variables on the main display (for easy debugging). @@ -7,12 +7,12 @@ * 0: Title (var name) (default: "") * 1: Code to generate result (passed nothing, can return any) (default: {}) * 2: Array containing modifiers (default: []) - * For Numbers: - * 0: Show Delta change (default: true) - * 1: Slider Min Value (default: 0) - * 1: Slider Max Value (default: 0) - * For Anything else: - * 0: Number of structured text lines (default: 1) + * For Numbers: + * - 0: Show Delta change (default: true) + * - 1: Slider Min Value (default: 0) + * - 2: Slider Max Value (default: 0) + * For Anything else: + * + 0: Number of structured text lines (default: 1) * * Return Value: * None diff --git a/addons/common/functions/fnc_waveHeightAt.sqf b/addons/common/functions/fnc_waveHeightAt.sqf index 969f4fc87e..ae0ad9f192 100644 --- a/addons/common/functions/fnc_waveHeightAt.sqf +++ b/addons/common/functions/fnc_waveHeightAt.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Gets the wave height at a specific location. Uses a logic, so may be performance iffy diff --git a/addons/common/functions/fnc_worldToScreenBounds.sqf b/addons/common/functions/fnc_worldToScreenBounds.sqf index 74c19d0b4e..13cb7f5633 100644 --- a/addons/common/functions/fnc_worldToScreenBounds.sqf +++ b/addons/common/functions/fnc_worldToScreenBounds.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: zGuba 2011 * Function helper for framing objects on screen. diff --git a/addons/common/functions/script_component.hpp b/addons/common/functions/script_component.hpp deleted file mode 100644 index 6a1bf9154d..0000000000 --- a/addons/common/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\common\script_component.hpp" diff --git a/addons/common/initSettings.sqf b/addons/common/initSettings.sqf index 77e1521e15..e6b8b73248 100644 --- a/addons/common/initSettings.sqf +++ b/addons/common/initSettings.sqf @@ -1,4 +1,5 @@ -private _category = localize LSTRING(ACEKeybindCategoryCommon); +private _category = format ["ACE %1", LLSTRING(DisplayName)]; +private _categoryColors = [_category, format ["| %1 |", LLSTRING(subcategory_colors)]]; [ QGVAR(checkPBOsAction), @@ -49,7 +50,7 @@ private _category = localize LSTRING(ACEKeybindCategoryCommon); QGVAR(displayTextColor), "COLOR", [LSTRING(SettingDisplayTextColorName),LSTRING(SettingDisplayTextColorDesc)], - _category, + _categoryColors, [0, 0, 0, 0.1], 0 ] call CBA_fnc_addSetting; @@ -58,7 +59,7 @@ private _category = localize LSTRING(ACEKeybindCategoryCommon); QGVAR(displayTextFontColor), "COLOR", [LSTRING(SettingDisplayTextFontColorName),LSTRING(SettingDisplayTextFontColorDesc)], - _category, + _categoryColors, [1, 1, 1, 1], 0 ] call CBA_fnc_addSetting; @@ -67,7 +68,7 @@ private _category = localize LSTRING(ACEKeybindCategoryCommon); QGVAR(persistentLaserEnabled), "CHECKBOX", [LSTRING(SettingPersistentLaserName), LSTRING(SettingPersistentLaserDesc)], - localize LSTRING(ACEKeybindCategoryWeapons), + LSTRING(ACEKeybindCategoryWeapons), false, false, LINKFUNC(switchPersistentLaser) diff --git a/addons/common/script_component.hpp b/addons/common/script_component.hpp index b3312e8a18..a5c9744c88 100644 --- a/addons/common/script_component.hpp +++ b/addons/common/script_component.hpp @@ -16,7 +16,7 @@ #include "\z\ace\addons\main\script_macros.hpp" - +// just kept for BWC, canDig now uses GVAR(canDigSurfaces) #define DIG_SURFACE_BLACKLIST [ \ "concrete", "concrete_exp", "concrete_int", "int_concrete", "int_concrete_exp", \ "pavement_exp", "int_pavement_exp", \ diff --git a/addons/common/scripts/checkVersionNumber.sqf b/addons/common/scripts/checkVersionNumber.sqf index 15832ed2bd..0f2c055500 100644 --- a/addons/common/scripts/checkVersionNumber.sqf +++ b/addons/common/scripts/checkVersionNumber.sqf @@ -1,5 +1,5 @@ // by commy2 -#include "script_component.hpp" +#include "..\script_component.hpp" private _aceWhitelist = missionNamespace getVariable ["ACE_Version_Whitelist", []]; private _files = CBA_common_addons select { diff --git a/addons/common/scripts/script_component.hpp b/addons/common/scripts/script_component.hpp deleted file mode 100644 index 23da62b05c..0000000000 --- a/addons/common/scripts/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\common\script_component.hpp" \ No newline at end of file diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 121d62805b..9cb581b91f 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -28,9 +28,9 @@ ACE-Team ACE-Team ACE チーム - ACE-Team + ACE-팀 ACE-製作團隊 - ACE-制作团队 + ACE—制作团队 ACE-Takımı @@ -47,6 +47,7 @@ アドバンスド 고급 進階 + 进阶 Gelişmiş @@ -97,7 +98,7 @@ ACE オプション ACE 옵션 ACE設定選項 - ACE设定选项 + ACE 设定选项 ACE Ayarları @@ -132,7 +133,7 @@ 北北東 북북동 北北東 - 北北东 + 东北偏北 KKD @@ -166,7 +167,7 @@ 東北東 동북동 東北東 - 东北东 + 东北偏东 DKD @@ -200,7 +201,7 @@ 東南東 동남동 東南東 - 东南东 + 东南偏东 DGD @@ -234,7 +235,7 @@ 南南東 남남동 南南東 - 南南东 + 东南偏南 GGD @@ -268,7 +269,7 @@ 南南西 남남서 南南西 - 南南西 + 西南偏南 GGB @@ -302,7 +303,7 @@ 西南西 서남서 西南西 - 西南西 + 西南偏西 BGB @@ -336,7 +337,7 @@ 北北西 서북서 西北西 - 西北西 + 西北偏西 BKB @@ -370,7 +371,7 @@ 北北西 북북서 北北西 - 北北西 + 西北偏北 KKB @@ -414,14 +415,14 @@ Wyłącz menu dowodzenia Vypnout velící menu Désactiver menu commande - Выключить командное меню + Выкл. командное меню Parancsnoki menü kikapcsolása Disabilita menù di comando Desabilitar menu de comando 指揮メニューを無効化 - 지휘 메뉴 종료 + 지휘 메뉴 비활성화 關閉命令選單 - 关闭命令选单 + 关闭命令菜单 Komut Menüsünü Devre Dışı Bırak @@ -455,6 +456,7 @@ 通常 보통 普通 + 正常 Normal @@ -471,7 +473,7 @@ 音声なし 무음 無語音 - 没声音 + 无语音 Ses yok @@ -479,7 +481,7 @@ PBO Überprüfung Controlla Azioni PBO 檢查PBO動作 - 检查PBO动作 + 检查 PBO 动作 PBO 検査の挙動 PBO 검사 Sprawdź akcję PBO @@ -493,18 +495,21 @@ 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檔案時要如何處置。 + 设定当玩家有错误的 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. + Definiert, was passieren soll, wenn ein Spieler nicht die korrekten PBOs nutzt. + 플레이어가 같은 PBO를 가지고 있지 않을 시 취할 행동을 정합니다. Check PBO All Alle PBOs überprüfen Controlla Tutti i PBO 檢查所有PBO - 检查所有PBO + 检查所有 PBO PBO 全てを検査 모든 PBO 검사 Sprawdź wszystkie PBO @@ -518,20 +523,23 @@ Check all addons, not only those of ACE. Vérifie tous les addons, même ceux qui ne sont pas liés à ACE. 檢查全部的插件而非只有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. + Überprüft alle Erweiterungen, nicht nur die von ACE. + ACE 뿐만이 아닌 다른 PBO 모두 검사합니다. Check PBO Whitelist PBO Whitelist Controlla Whitelist PBO 檢查PBO白名單 - 检查PBO白名单 + 检查 PBO 白名单 許可リスト内の PBO を検査 - 검사 제외 PBO + PBO 화이트리스트 확인 Sprawdź białą listę PBO Белый список для проверки PBO Lista Branca de PBO @@ -543,11 +551,14 @@ 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 Задать список непроверяемых аддонов. + Ermöglicht das Erstellen einer Liste von immer erlaubten Erweiterungen. + 허용된 애드온 목록을 정의합니다. Feedback icons @@ -579,14 +590,14 @@ 画面上に表示するフィードバック アイコンの位置や無効化を選択できます。このアイコンは自キャラクター状態や動作の状況をフィードバックするために表示されています。 피드백 아이콘의 위치를 설정하거나 비활성화합니다. 피드백 아이콘은 캐릭터의 상세정보와 행동을 보여줍니다. 選擇位置或取消回饋圖標顯示在螢幕上。這些圖標將顯示出你角色額外的狀態與行動等資訊 - 选择位置或取消回馈图标显示在荧幕上。这些图标将显示出你角色额外的状态与行动等资讯。 + 选择位置或取消回馈图标显示在屏幕上。这些图标将显示出你角色额外的状态与行动等信息。 Progress bar location Position der Fortschrittsanzeige Ubicación de la barra de progreso Posizione della barra di avanzamento - Положение прогресс-бара + Положение индикатора процесса Lokalizacja paska postępu Position de la barre de progression Pozice ukazetele průběhu činnosti @@ -643,7 +654,7 @@ ACE によるヒントの背景色を指定します。 ACE힌트의 배경색을 정합니다. 設定ACE提示的背景顏色. - 设定ACE提示的背景颜色. + 设定 ACE 提示的背景颜色。 Hint text font color @@ -672,20 +683,34 @@ 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. - ACE によるヒントの文章へ、色を設定できます。この色は ACE ヒント システムを介して表示される全文章の色と標準でなっており、特定の色を設定していても、標準色になります。 + ACE によるヒントの文章に色を設定できます。この色は ACE ヒント システムを介して表示される全文章の色と標準でなっており、特定の色を設定していても、標準色になります。 ACE 힌트에 쓰이는 글씨 색입니다. 힌트 글씨의 색이 정해지지 않을경우 모든 힌트의 색은 기본으로 설정됩니다. 設定ACE提示文字的顏色。若提示字體並無指定其他顏色,將會自動選用ACE系統的預設顏色 - 设定ACE提示文字的颜色。若提示字体并无指定其他颜色,将会自动选用ACE系统的预设颜色。 + 设定 ACE 提示文字的颜色。若提示字体并无指定其他颜色,将会自动选用 ACE 的预设颜色。 + + + Colors + Barvy + Couleurs + Farben + Colori + Kolory + Cores + Цвета + Colores + + 颜色 + 색상 Persistent weapon laserpointer/flashlight Автоматический ЛЦУ/тактический фонарь 武器のレーザー ポインタ/フラッシュライトの永続 Laser/torcia dell'arma costantemente accesi - 무기 레이저 포인터 / 손전등 지속 + 무기 레이저 지시기/손전등 지속 Kontinuität des Laserpointers/Taktischen Lichts 保持武器雷射/手電筒的狀態 - 保持武器雷射/手电筒的状态 + 保持武器激光/手电筒的状态 Trwały znacznik laserowy/latarka Luz da lanterna/laser da arma persistente Rémanence du pointeur laser/de la lampe torche @@ -697,10 +722,10 @@ Включать ЛЦУ/тактический фонарь после смены оружия или входа/выхода из машины, если он был до этого включен. 銃のライト等を点けていると武器を切り替えた後や車両を乗り降りしても、ライト等を点けたままにします。 Abilita la torcia/laser dopo il cambio dell'arma o l'entrata/uscita del veicolo se precedentemente attiva. - 무기를 바꾸거나 차량에 승하차 할 때 이전에 스위치 켜고 끔을 유지합니다. + 이전에 무기의 손전등/레이저를 켠 경우 무기 전환이나 차량 승하차시 켠 상태를 유지합니다. Aktiviert Laserpointer/Taktisches Licht nach einem Waffenwechsel oder dem Auf-/Absitzen, falls es zuvor aktiv war. - 保存武器雷射/手電筒的開關狀態,使玩家切換武器或進出載具時能保持之前的的狀態 - 保存武器雷射/手电筒的开关状态,使玩家切换武器或进出载具时能保持之前的的状态。 + 保存武器雷射/手電筒的開關狀態,使玩家切換武器或進出載具時能保持之前的狀態 + 保持武器激光/手电筒的开关状态,使玩家切换武器或进出载具时能保持之前的状态。 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. @@ -718,7 +743,7 @@ Banane Banán Banana - 甘蕉 + バナナ 바나나 香蕉 香蕉 @@ -734,10 +759,10 @@ 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 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. - 甘蕉は食べられる果物でバショウ科バショウ属のうち、果実を食用とする品種群の総称。また、その果実のこと。いくつかの原種から育種された多年草。種によっては熟すまでは毒を持つものもある。 + バナナは、バショウ科バショウ属のうち、果実を食用とする品種群の総称である。また、その果実のこと。いくつかの原種から育種された多年性植物。熱帯~亜熱帯の地域で栽培されるトロピカルフルーツ。種によっては熟すまでは毒を持つものもある。 바나나는 식용 과일로써 식물학적으로 열매류이며 여러 종류의 개화가능한 초본의 파초과로 부터 생산됩니다. 香蕉(學名: Musa × paradisiaca),為芭蕉科芭蕉屬小果野蕉及野蕉的人工栽培雜交種,為多年生草本植物。果實長有棱; 果皮黃色,果肉白色,味道香甜。主要生長在熱帶、亞熱帶地區。原產於亞洲東南部熱帶、亞熱帶地區 - 香蕉(学名: Musa × paradisiaca),为芭蕉科芭蕉属小果野蕉及野蕉的人工栽培杂交种,为多年生草本植物。果实长有棱; 果皮黄色,果肉白色,味道香甜。主要生长在热带、亚热带地区。原产于亚洲东南部热带、亚热带地区。 + 香蕉(学名:Musa paradisiaca),为芭蕉科芭蕉属小果野蕉及野蕉的人工栽培杂交种,为多年生草本植物。果实长有棱; 果皮黄色,果肉白色,味道香甜。主要生长在热带、亚热带地区。原产于亚洲东南部热带、亚热带地区。 Check PBOs @@ -753,7 +778,7 @@ PBO を検査 PBO 검사 檢查PBO檔 - 检查PBO档 + 检查 PBO Check addon integrity with server and do selected action if an addon is missing. @@ -766,9 +791,9 @@ /!\ 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 サーバがアドオンの整合性を検査し、もし不備があれば実行する動作を選択できます。 - 서버 에드온의 무결성을 검사하고 사라진 에드온이 있을경우 행동을 선택합니다. + 서버 애드온의 무결성을 검사하고 사라진 애드온이 있을 경우 행동을 선택합니다. 檢查客戶端與伺服器端的模組清單是否一致且完整,並提供訊息表示遺失的模組 - 检查客户端与伺服器端的模组清单是否一致且完整,并提供讯息表示遗失的模组。 + 检查客户端与服务器端的模组清单是否一致且完整,并提供信息表示遗失的模组。 Action @@ -798,9 +823,9 @@ Что делать с игроками с неправильными аддонами? Cosa fare con giocatori che non hanno i PBO corretti? プレイヤーが正しい PBO を持っていない場合は? - 올바르지 않는 PBO를 가진 사람을 어떻게 할까요? + 올바르지 않은 PBO를 가진 사람을 어떻게 할까요? 若玩家沒有正確的PBO檔時,將採取何種動作? - 若玩家没有正确的PBO档时,将采取何种动作? + 若玩家没有正确的 PBO 档时,将采取何种动作? Warn once @@ -816,7 +841,7 @@ 一度の警告 경고 한 번 警告 (一次) - 警告 (一次) + 警告(一次) UYAR @@ -833,7 +858,7 @@ 警告 (永久的) 경고 (영구적) 警告 (持續) - 警告 (持续) + 警告(持续) UYAR (KALICI) @@ -865,7 +890,7 @@ Проверять все аддоны Controlla tutti gli addon 全アドオンを検査 - 모든 에드온 검사 + 모든 애드온 검사 檢查所有模組 检查所有模组 @@ -883,7 +908,7 @@ ACE MOD の代わりに全アドオンを検査しますか? ACE를 제외한 모든 모드를 검사할까요? 檢查包含ACE之外的其他模組? - 检查包含ACE之外的其他模组? + 检查包含 ACE 之外的其他模组? Whitelist @@ -914,9 +939,9 @@ Какие аддоны дополнительно разрешены? Quali addon sono permessi in ogni caso? どのようなアドオンを許可しますか? - 허가되는 에드온은 어느것입니까? + 허가되는 애드온은 어느 것입니까? 哪些模組是可被允許/忽略的? - 哪些模组是可被允许/忽略的? + 无论如何都允许的附加组件 LSD Vehicles @@ -946,9 +971,9 @@ Добавляет эффект LSD (мигание всеми цветами радуги) синхронизированным транспортным средствам Aggiunge effetti LSD ai veicoli sincronizzati 同期されたオブジェクトに LSD の効果を追加します - 동기화된 차량에 LSD효과를 추가합니다. + 동기화된 차량에 LSD 효과를 추가합니다. 使被同步的載具產生瘋狂的迷幻效果。(後果自負) - 使被同步的载具产生疯狂的迷幻效果。(后果自负) + 使被同步的载具产生疯狂的迷幻效果。(后果自负) Toggle Handheld Device @@ -1006,7 +1031,7 @@ Disattivato Wyłączone Desativado - Откл. + Отключено Desactivado 無効化 비활성화 @@ -1022,7 +1047,7 @@ Attivato Włączone Ativado - Вкл. + Включено Activado 有効化 활성화 @@ -1043,6 +1068,8 @@ Vždy Zawsze Her Zaman + 总是 + 항상 Anywhere @@ -1058,6 +1085,7 @@ どこでも 어디서나 任何地方 + 任何地方 Herhangi bir yer @@ -1074,6 +1102,7 @@ ベーシック 기본 基礎 + 基础 Basit @@ -1090,6 +1119,7 @@ 医療車両のみ 의료차량 醫療載具 + 医疗载具 Medikal Araçlar @@ -1135,10 +1165,12 @@ Confirmar Confirmer 確認 + 确认 Conferma Potvrdit Potwierdź Onayla + 확인 Never @@ -1149,10 +1181,12 @@ Nunca Jamais 從不 + 从不 Mai Nikdy Nigdy Hiçbir zaman + 안함 Vehicles only @@ -1181,7 +1215,7 @@ Non forzare Ne pas forcer 強制しない - 강제하지 말것 + 강제하지 말 것 不要強行 不要强行 Zorlama @@ -1199,7 +1233,7 @@ ACE 装備 ACE 장비 ACE 裝備按鍵 - ACE 装备按键 + ACE 装备 ACE Ekipmanlar @@ -1215,7 +1249,7 @@ ACE 全般 ACE 일반 ACE 通用按鍵 - ACE 通用按键 + ACE 通用 ACE Common @@ -1231,7 +1265,7 @@ ACE 武器 ACE 무기 ACE 武器按鍵 - ACE 武器按键 + ACE 武器 ACE Silahlar @@ -1247,7 +1281,7 @@ ACE 移動 ACE 움직임 ACE 動作按鍵 - ACE 动作按键 + ACE 移动 ACE Hareket @@ -1263,7 +1297,7 @@ ACE スコープ調節 ACE 조준경 조정 ACE 瞄準鏡調節按鍵 - ACE 瞄准镜调节按键 + ACE 瞄准镜调节 ACE Vehicles @@ -1278,9 +1312,19 @@ ACE 車両 ACE 차량 ACE 載具按鍵 - ACE 载具按键 + ACE 载具 ACE Araçlar + + ACE Uncategorized + ACE 未分类 + ACE 무분류 + ACE Unkategorisiert + ACE Nieskategoryzowane + ACE 未区分 + ACE Без категории + ACE Sin categoría + No Room to unload Kein Platz zum Entladen @@ -1294,7 +1338,7 @@ 降ろすための空間がありません 沒有空間可卸載 没有空间可卸载 - 언로드 할 공간이 없습니다. + 내릴 공간이 없습니다. No inventory space @@ -1308,7 +1352,7 @@ Nincs több hely В инвентаре нет места インベントリに空きがない - 넣을 공간이 없음 + 넣을 공간이 없습니다 無可用空間 无可用空间 Envanter de alan yok @@ -1343,7 +1387,7 @@ Вес: 重量: 무게: - 重量: + 重量: 重量: Ağırlık: @@ -1368,7 +1412,7 @@ Erlaube ACE-Skripten, die Musik leiser zu stellen. ACE 스크립트가 음악을 끌 수 있습니다. 允許ACE腳本去控制音樂的音量 - 允许ACE脚本去控制音乐的音量。 + 允许 ACE 脚本去控制音乐的音量。 ACE スプリントへ音量低下を許可します。 Permetti agli script di ACEdi abbassare la musica. Zezwól skrypty ACE na przyciszanie muzyki. @@ -1384,17 +1428,27 @@ Epilepsiefreundlicher Modus けいれん回避モード Tryb dla epileptyków + Mode adapté à l'épilepsie + 癫痫病友好模式 + 광과민 친화적 모드 + Режим для эпилептиков + Modo adaptado para epilepsia Disables some flashing light effects to reduce seizure risk. Deaktiviert einige Lichtflackereffekte um das Risiko von Epilepsieanfällen zu reduzieren. 点滅する光エフェクトを無効化し、けいれんする恐れを低下させます。 Wyłącz część migających efektów w celu zredukowania ryzyka napadu epilepsji + Désactive certains effets de lumière clignotante afin de réduire les risques de crise d'épilepsie. + 禁用一些闪烁的灯光效果,以降低癫痫发作的风险。 + 반짝거리는 빛으로 인해 일어날 발작 상황을 줄여줍니다. + Отключает некоторые вспышки во избежание риска приступа. + Deshabilita algunos efectos de iluminación para reducir el riesgo de convulsiones. Flag (ACE - Black) Flagge (Ace - Schwarz) - 旗帜(ACE-黑色): + 旗帜(ACE-黑色): 旗幟(ACE-黑色) Bandiera (ACE - Nera) 旗 (ACE - 黒) @@ -1405,11 +1459,12 @@ Vlajka (ACE - Černá) Bayrak (ACE- Siyah) Bandera (ACE - Negra) + 깃발 (ACE 검정) Flag (ACE - White) Flagge (Ace - Weiß) - 旗帜(ACE-白色): + 旗帜(ACE-白色): 旗幟(ACE-白色) Bandiera (ACE - Bianca) 旗 (ACE - 白) @@ -1420,6 +1475,7 @@ Vlajka (ACE - Bílá) Bayrak (ACE - Beyaz) Bandera (ACE - Blanca) + 깃발 (ACE 하양) Players only @@ -1438,6 +1494,16 @@ 只限玩家 Sadece oyuncular + + AI only + Tylko dla AI + 인공지능만 + Nur KI + 仅 AI + AIのみ + Только ИИ + Sólo IA + Players and AI Игроков и ботов @@ -1449,9 +1515,9 @@ Joueurs et IA Játékosok és AI Giocatori ed IA - プレイヤーと AI + プレイヤーとAI 플레이어 및 인공지능 - 玩家与AI + 玩家与 AI 玩家與AI Oyuncular ve AI @@ -1459,6 +1525,7 @@ 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 セルフ インタラクションに動作を表示 @@ -1467,27 +1534,64 @@ Zobrazit akci v menu vlastních interakcí Показывать действие в меню взаимодействия с собой. Kendi etkileşimim menüsünde animasyonları göster + Zeigt die Aktion im Selbstinteraktionsmenü + 자기 상호작용 메뉴에서 행동을 보여줍니다 Both İkisi de 両方 + Les deux + Оба + Beide + Oba + 两方 + 둘 다 + Ambos Additional progress bar information プログレス バー詳細情報 + Infos supplémentaires de la barre de progression + Доп. информация индикатора процесса + Zusätzliche Informationen beim Fortschrittsbalken + Dodatkowe informacje na pasku postępu + 额外的进度条信息 + 추가 진행 막대 정보 + Barra adicional de información de progreso Controls extra information shown in progress bar. プログレス バーへ表示される情報量を決定します。 + Définit quelles informations supplémentaires sont affichées dans la barre de progression. + Устанавливает дополнительную информацию в индикаторе процесса. + Kontrolliert zusätzliche Informationen beim Fortschrittsbalkens + Kontroluje dodatkowe informacje na pasku postępu. + 控制进度条中显示的额外信息。 + 진행 막대에 추가적인 정보를 보여주는걸 결정합니다. + Controla la información extra mostrada en la barra de progreso. Percentage パーセンテージ + Pourcentage + Процент выполнения + Prozent + Procent + 百分比 + 백분율 + Porcentaje Time remaining 残り時間 + Temps restant + Времени осталось + Zeit verbleibend + Pozostały czas + 剩余时间 + 남은 시간 + Tiempo restante None @@ -1513,7 +1617,7 @@ Zmień nazwę 改名 Rinomina - 이름바꾸기 + 이름 바꾸기 重新命名 重新命名 Переименовать @@ -1524,6 +1628,13 @@ Time left: %1s 残り時間: %1 秒 + Temps restant : %1 s + Оставшееся время: %1s + Zeit übrig %1s + Pozostały czas: %1s + 剩余时间:%1秒 + 남은 시간: %1초 + Tiempo restante: %1s Locations Boost Training @@ -1537,9 +1648,35 @@ Места ускоренного обучения 衛生能力の上昇位置 교육 증가 지역 - 受所在位置影响提升医疗能力 + 位置提升能力 受所在位置影響提升醫療能力 Konumlar Tedaviyi Hızlandırır + + Unload Weapon + Wyładuj Broń + 武器からマガジンを抜く + 탄창 빼기 + 卸掉武器弹匣 + Разрядить оружие + Descargar arma + Waffe entladen + + + Load + Beladen + Załaduj + Carregar + Загрузить + Naložit + Cargar + Carica + Charger + 積み込む + 싣기 + 裝載 + 装载 + Yükle + diff --git a/addons/compat_csla/$PBOPREFIX$ b/addons/compat_csla/$PBOPREFIX$ new file mode 100644 index 0000000000..4d7b298fef --- /dev/null +++ b/addons/compat_csla/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_csla diff --git a/addons/compat_csla/CfgMagazines.hpp b/addons/compat_csla/CfgMagazines.hpp new file mode 100644 index 0000000000..f938272c8b --- /dev/null +++ b/addons/compat_csla/CfgMagazines.hpp @@ -0,0 +1,22 @@ +class CfgMagazines { + + class CSLA_UK59_50rnd_7_62vz59; + class CSLA_UK59_50rnd_7_62Sv59: CSLA_UK59_50rnd_7_62vz59 { + ace_isBelt = 1; + }; + + class US85_Magazine; + class US85_50Rnd_762x51: US85_Magazine { + ace_isBelt = 1; + }; + + class US85_20Rnd_762x51; + class US85_100Rnd_762x51: US85_20Rnd_762x51 { + ace_isBelt = 1; + }; + + class US85_30Rnd_556x45; + class US85_200Rnd_556x45: US85_30Rnd_556x45 { + ace_isBelt = 1; + }; +}; diff --git a/addons/compat_csla/CfgWeapons.hpp b/addons/compat_csla/CfgWeapons.hpp new file mode 100644 index 0000000000..dcfa6744cc --- /dev/null +++ b/addons/compat_csla/CfgWeapons.hpp @@ -0,0 +1,72 @@ +class CfgWeapons { + + class CSLA_LauncherBase; + class CSLA_Launcher_AT; + class CSLA_MachinegunBase_7_62; + + class CSLA_RPG7: CSLA_Launcher_AT { + EGVAR(reloadlaunchers,enabled) = 1; + }; + + // class CSLA_RPG75: CSLA_Launcher_AT {}; + + class CSLA_Strela: CSLA_LauncherBase { + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,damage) = 0.5; + EGVAR(overpressure,range) = 2; + }; + + class CSLA_UK59L: CSLA_MachinegunBase_7_62 { + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + + class US85_Launcher_AA; + class US85_Launcher_AT; + class US85_MachinegunBase_5_56; + class US85_MachinegunBase_7_62; + class US85_weaponBase; + + // class US85_M16_base: US85_weaponBase {}; + + class US85_M249: US85_MachinegunBase_5_56 { + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + + class US85_M60: US85_MachinegunBase_7_62 { + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + + class US85_FIM92: US85_Launcher_AA { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,damage) = 0.3; + EGVAR(overpressure,range) = 6; + }; + + class US85_LAW72: US85_Launcher_AT { + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.5; + EGVAR(overpressure,range) = 15; + }; + + class US85_M136: US85_Launcher_AT { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,damage) = 0.3; + EGVAR(overpressure,range) = 10; + }; + + class US85_MAAWS: US85_Launcher_AT { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 60; + EGVAR(overpressure,damage) = 0.7; + EGVAR(overpressure,priority) = 1; + EGVAR(overpressure,range) = 10; + }; + + class US85_SMAW: US85_Launcher_AT { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 45; + }; +}; diff --git a/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp b/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..b29f7e717d --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp @@ -0,0 +1,15 @@ +class CfgMagazines { + class US85_Magazine; + class US85_ATMine_mag: US85_Magazine { + EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_ATMine_mag"; + useAction = 0; + }; + class US85_M14Mine_mag: US85_Magazine { + EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_M14Mine"; + useAction = 0; + }; + class US85_SatchelCharge_Mag: US85_Magazine { + EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_SatchelCharge_Mag"; + useAction = 0; + }; +}; diff --git a/addons/compat_csla/compat_csla_explosives/CfgVehicles.hpp b/addons/compat_csla/compat_csla_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..02dd9367ea --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/CfgVehicles.hpp @@ -0,0 +1,18 @@ +class CfgVehicles { + + // ACE Explosives + class ACE_Explosives_Place; + + class ACE_Explosives_Place_US85_ATMine_mag: ACE_Explosives_Place { + model = "\a3\weapons_f\explosives\mine_at.p3d"; + }; + + class ACE_Explosives_Place_US85_M14Mine: ACE_Explosives_Place { + model = "\a3\weapons_f\explosives\mine_ap.p3d"; + }; + + class ACE_Explosives_Place_US85_SatchelCharge_Mag: ACE_Explosives_Place { + model = "\a3\weapons_f\explosives\satchel.p3d"; + }; + +}; diff --git a/addons/compat_csla/compat_csla_explosives/config.cpp b/addons/compat_csla/compat_csla_explosives/config.cpp new file mode 100644 index 0000000000..95f9534cca --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_explosives", "CSLA", "US85"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Dahlgren"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_csla/compat_csla_explosives/script_component.hpp b/addons/compat_csla/compat_csla_explosives/script_component.hpp new file mode 100644 index 0000000000..a697aad7f3 --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT explosives +#define SUBCOMPONENT_BEAUTIFIED Explosives +#include "..\script_component.hpp" diff --git a/addons/compat_csla/config.cpp b/addons/compat_csla/config.cpp new file mode 100644 index 0000000000..d0f99c092c --- /dev/null +++ b/addons/compat_csla/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common", "CSLA", "US85"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Dahlgren"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_csla/script_component.hpp b/addons/compat_csla/script_component.hpp new file mode 100644 index 0000000000..480a8cc4cc --- /dev/null +++ b/addons/compat_csla/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT compat_csla +#define COMPONENT_BEAUTIFIED CSLA Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_gm/$PBOPREFIX$ b/addons/compat_gm/$PBOPREFIX$ similarity index 100% rename from optionals/compat_gm/$PBOPREFIX$ rename to addons/compat_gm/$PBOPREFIX$ diff --git a/optionals/compat_rhs_usf3/CfgEventHandlers.hpp b/addons/compat_gm/CfgEventHandlers.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgEventHandlers.hpp rename to addons/compat_gm/CfgEventHandlers.hpp diff --git a/addons/compat_gm/CfgMagazines.hpp b/addons/compat_gm/CfgMagazines.hpp new file mode 100644 index 0000000000..ee5d017275 --- /dev/null +++ b/addons/compat_gm/CfgMagazines.hpp @@ -0,0 +1,28 @@ +class CfgMagazines { + // MG3 + class gm_120rnd_762x51mm_mg3_grn; + class gm_120Rnd_762x51mm_B_T_DM21_mg3_grn: gm_120rnd_762x51mm_mg3_grn { + ACE_isBelt = 1; + }; + class gm_120Rnd_762x51mm_B_T_DM21A1_mg3_grn: gm_120rnd_762x51mm_mg3_grn { + ACE_isBelt = 1; + }; + class gm_120Rnd_762x51mm_B_T_DM21A2_mg3_grn: gm_120rnd_762x51mm_mg3_grn { + ACE_isBelt = 1; + }; + + // PK + class gm_100rnd_762x54mmR_pk_grn; + class gm_100Rnd_762x54mm_API_b32_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; + class gm_100Rnd_762x54mm_B_T_t46_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; + class gm_100Rnd_762x54mmR_API_7bz3_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; + class gm_100Rnd_762x54mmR_B_T_7t2_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; +}; diff --git a/addons/compat_gm/CfgVehicles.hpp b/addons/compat_gm/CfgVehicles.hpp new file mode 100644 index 0000000000..6d03465cd7 --- /dev/null +++ b/addons/compat_gm/CfgVehicles.hpp @@ -0,0 +1,369 @@ +class CfgVehicles { + + // REPAIR, REFUEL, REARM + + class ReammoBox_F; + class gm_AmmoBox_base: ReammoBox_F { + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; + + EGVAR(dragging,canCarry) = 1; + EGVAR(dragging,carryPosition)[] = {0,1,1}; + EGVAR(dragging,carryDirection) = 0; + + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0,1.2,0}; + EGVAR(dragging,dragDirection) = 0; + }; + + class gm_jerrycan_base; + class gm_jerrycan: gm_jerrycan_base { + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; + + EGVAR(dragging,canCarry) = 1; + EGVAR(dragging,carryPosition)[] = {0,1,1}; + EGVAR(dragging,carryDirection) = 0; + + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0,1.2,0}; + EGVAR(dragging,dragDirection) = 0; + }; + + // STATIC + + class gm_ge_army_shelteraceII_repair_base; + class gm_ge_army_shelteraceII_repair: gm_ge_army_shelteraceII_repair_base { + EGVAR(repair,canRepair) = 1; + }; + + class gm_gc_army_shelterlakII_repair_base; + class gm_gc_army_shelterlakII_repair: gm_gc_army_shelterlakII_repair_base { + EGVAR(repair,canRepair) = 1; + }; + + + // W H E E L E D + + class gm_wheeled_base; + class gm_wheeled_truck_base; + class gm_wheeled_APC_base; + class gm_wheeled_motorcycle_base; + + // EAST + + class gm_wheeled_car_base: gm_wheeled_base { + EGVAR(cargo,hasCargo) = 1; + EGVAR(cargo,space) = 4; + EGVAR(refuel,canReceive) = 1; + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.03; + EGVAR(vehicle_damage,engineDetonationProb) = 0.03; + EGVAR(vehicle_damage,hullFireProb) = 0.6; + EGVAR(vehicle_damage,turretFireProb) = 0.1; + EGVAR(vehicle_damage,engineFireProb) = 0.2; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.2; + EGVAR(vehicle_damage,canHaveFireRing) = 0.1; + }; + + class gm_wheeled_bicycle_base: gm_wheeled_base { + EGVAR(cargo,hasCargo) = 0; + EGVAR(refuel,canReceive) = 0; + }; + + class gm_uaz469_base: gm_wheeled_car_base { + EGVAR(refuel,fuelCapacity) = 78; + }; + + class gm_p601_base: gm_wheeled_car_base { + EGVAR(refuel,fuelCapacity) = 26; + }; + + class gm_brdm2_base: gm_wheeled_APC_base { + EGVAR(refuel,fuelCapacity) = 290; + }; + + class gm_btr60_base: gm_wheeled_APC_base { + EGVAR(refuel,fuelCapacity) = 290; + EGVAR(cookoff,cookoffSelections)[] = {"commanderturret_hatch"}; + }; + + class gm_ural4320_base: gm_wheeled_truck_base { + EGVAR(refuel,fuelCapacity) = 360; + }; + + class gm_ural4320_reammo_base: gm_ural4320_base { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class gm_ural4320_refuel_base: gm_ural4320_base { + EGVAR(refuel,hooks)[] = {{-0.05,-3.6,-0.45}}; + EGVAR(refuel,fuelCargo) = 10000; + }; + + class gm_ural4320_medic_base: gm_ural4320_base { + EGVAR(medical,medicClass) = 1; + }; + + + // WEST + + class gm_k125_base: gm_wheeled_motorcycle_base { + EGVAR(refuel,fuelCapacity) = 14.5; + }; + + class gm_typ1_base: gm_wheeled_car_base { + EGVAR(refuel,fuelCapacity) = 47.3; + }; + + class gm_iltis_base: gm_wheeled_car_base { + EGVAR(refuel,fuelCapacity) = 83; + }; + + + class gm_u1300l_base: gm_wheeled_truck_base { + EGVAR(refuel,fuelCapacity) = 90; + }; + + class gm_u1300l_medic_base: gm_u1300l_base { + EGVAR(medical,medicClass) = 1; + }; + + class gm_kat1_base: gm_wheeled_truck_base { + EGVAR(refuel,fuelCapacity) = 270; + }; + + class gm_kat1_451_base; + class gm_kat1_451_refuel_base: gm_kat1_451_base { + gm_InsigniasDefaultHazardSign = "gm_insignia_hazard_fuelF54_wht"; + EGVAR(refuel,fuelCargo) = 4600; + EGVAR(refuel,hooks)[] = {{-0.60,-3.44,-0.919689},{0.60,-3.44,-0.919689}}; + }; + + class gm_kat1_454_base; + class gm_kat1_454_cargo_base: gm_kat1_454_base { + EGVAR(cargo,space) = 10; + }; + + class gm_fuchs_base: gm_wheeled_APC_base { + EGVAR(refuel,fuelCapacity) = 390; + }; + + class gm_luchs_base: gm_wheeled_APC_base { + EGVAR(refuel,fuelCapacity) = 500; + EGVAR(cookoff,cookoffSelections)[] = {"mainturret_hatch", "commanderturret_hatch"}; + }; + + + // T R A C K E D + + class Tank_F; + class gm_tracked_base: Tank_F { + EGVAR(cargo,hasCargo) = 1; + EGVAR(cargo,space) = 4; + EGVAR(refuel,canReceive) = 1; + }; + class gm_tracked_APC_base: gm_tracked_base { + EGVAR(vehicle_damage,hullDetonationProb) = 0.03; + EGVAR(vehicle_damage,turretDetonationProb) = 0.03; + EGVAR(vehicle_damage,engineDetonationProb) = 0.03; + EGVAR(vehicle_damage,hullFireProb) = 0.3; + EGVAR(vehicle_damage,turretFireProb) = 0.1; + EGVAR(vehicle_damage,engineFireProb) = 0.2; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.2; + EGVAR(vehicle_damage,canHaveFireRing) = 0.1; + }; + class gm_tracked_Tank_base: gm_tracked_base { + EGVAR(vehicle_damage,hullDetonationProb) = 0.01; + EGVAR(vehicle_damage,turretDetonationProb) = 0.01; + EGVAR(vehicle_damage,engineDetonationProb) = 0.01; + EGVAR(vehicle_damage,hullFireProb) = 0.2; + EGVAR(vehicle_damage,turretFireProb) = 0.1; + EGVAR(vehicle_damage,engineFireProb) = 0.2; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.2; + EGVAR(vehicle_damage,canHaveFireRing) = 0.1; + }; + + // EAST + class gm_bmp1_base: gm_tracked_APC_base { + EGVAR(map,vehicleLightColor)[] = {0,1,0,0.1}; + EGVAR(refuel,fuelCapacity) = 460; + EGVAR(cookoff,cookoffSelections)[] = {"mainturret_hatch","commanderturret_hatch"}; + }; + + class gm_pt76_base: gm_tracked_Tank_base { + EGVAR(refuel,fuelCapacity) = 250; + }; + + class gm_t55_base: gm_tracked_Tank_base { + EGVAR(refuel,fuelCapacity) = 900; // only with external tanks + EGVAR(cookoff,cookoffSelections)[] = {"machinegunturret_01_hatch","commanderturret_hatch"}; + }; + + class gm_zsu234_base: gm_tracked_Tank_base { + EGVAR(refuel,fuelCapacity) = 812; + }; + + // WEST + class gm_Leopard1_base; + class gm_Leopard1a0_base: gm_Leopard1_base { + EGVAR(refuel,fuelCapacity) = 955; + EGVAR(cookoff,cookoffSelections)[] = {"mainturret_hatch_1","commanderturret_hatch"}; + }; + + class gm_Gepard_base: gm_Leopard1_base { + EGVAR(refuel,fuelCapacity) = 985; + }; + + class gm_BPz2_base; + class gm_BPz2a0_base: gm_BPz2_base { + EGVAR(refuel,fuelCapacity) = 1160; + EGVAR(cookoff,cookoffSelections)[] = {"commanderturret_hatch"}; + }; + + class gm_marder1_base: gm_tracked_APC_base { + EGVAR(refuel,fuelCapacity) = 652; + EGVAR(cookoff,cookoffSelections)[] = {"observerturret_hatch", "commanderturret_hatch"}; + }; + + class gm_m113_base: gm_tracked_APC_base { + EGVAR(refuel,fuelCapacity) = 360; + }; + + class gm_m113a1g_base; + class gm_m113a1g_medic_base: gm_m113a1g_base { + EGVAR(medical,medicClass) = 1; + }; + + class gm_m113a1dk_base; + class gm_m113a1dk_medic_base: gm_m113a1dk_base { + EGVAR(medical,medicClass) = 1; + }; + + // If any hard edits are made, move to an appropriate subcomponent + // fastroping not needed unlike RHS as no hard edits are made here + // H E L I C O P T E R S + + class Helicopter_Base_F; + class Helicopter_Base_H: Helicopter_Base_F { + class EventHandlers; + }; + class gm_helicopter_base: Helicopter_Base_H {}; + + // WEST + + class gm_bo105_base: gm_helicopter_base { + EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; + EGVAR(refuel,fuelCapacity) = 3700; + EGVAR(fastroping,enabled) = 0; + + // TODO: stringtables + class UserActions { + class openDoor_L { + displayNameDefault = "Open left Door"; + displayName = "Open left Door"; + position = ""; + radius = 2.7; + onlyForPlayer = 1; + condition = QUOTE((this animationSourcePhase 'door_2_1_unhide' > 0.5) && (this doorPhase 'door_2_1_source' < 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + statement = "this animateDoor ['door_2_1_source',1]"; + }; + + class openDoor_R: openDoor_L { + displayNameDefault = "Open right Door"; + displayName = "Open right Door"; + condition = QUOTE((this animationSourcePhase 'door_2_2_unhide' > 0.5) && (this doorPhase 'door_2_2_source' < 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + statement = "this animateDoor ['door_2_2_source',1]"; + }; + + class closeDoor_L { + displayNameDefault = "Close left Door"; + displayName = "Close left Door"; + position = ""; + radius = 2.7; + onlyForPlayer = 1; + condition = QUOTE((this animationSourcePhase 'door_2_1_unhide' > 0.5) && (this doorPhase 'door_2_1_source' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + statement = "this animateDoor ['door_2_1_source',0]"; + }; + + class closeDoor_R: closeDoor_L { + displayNameDefault = "Close right Door"; + displayName = "Close right Door"; + condition = QUOTE((this animationSourcePhase 'door_2_2_unhide' > 0.5) && (this doorPhase 'door_2_2_source' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + statement = "this animateDoor ['door_2_2_source',0]"; + }; + }; + }; + class gm_bo105p1m_vbh_base; + class gm_bo105p1m_vbh_swooper_base: gm_bo105p1m_vbh_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.34,0.695,-0.0757732},{1.34,0.695,-0.0973468}}; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onCutRopes) = QFUNC(onCutRopes); + EGVAR(fastroping,onDeployRopes) = QFUNC(onDeployRopes); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + }; + + class gm_ch53_base: gm_helicopter_base { + EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{0.6, -5.2, -0.8},{-0.6, -5.2, -0.8}}; + EGVAR(refuel,fuelCapacity) = 3850; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + }; + + class gm_ch53g_base: gm_ch53_base { + EGVAR(refuel,fuelCapacity) = 8770; + }; + + // EAST + class gm_mi2_base: gm_helicopter_base { + EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.17969,0.0205078,-0.178533}}; + EGVAR(refuel,fuelCapacity) = 600; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + }; + + + class gm_mi2sr_base: gm_mi2_base { + EGVAR(refuel,fuelCapacity) = 1076; + }; + + class gm_mi2p_base: gm_mi2_base { + EGVAR(refuel,fuelCapacity) = 1076; + }; + + class gm_mi2ch_base: gm_mi2_base { + EGVAR(refuel,fuelCapacity) = 1076; + }; + + class gm_mi2platan_base: gm_mi2_base { + EGVAR(refuel,fuelCapacity) = 1076; + }; + + // P L A N E S + + class Plane_Base_F; + class gm_plane_base: Plane_Base_F { + EGVAR(refuel,canReceive) = 1; + EGVAR(cargo,hasCargo) = 1; + EGVAR(cargo,space) = 4; + }; + + // EAST + class gm_l410_base: gm_plane_base { + EGVAR(refuel,fuelCapacity) = 1300; + }; + + // WEST + class gm_do28d2_base: gm_plane_base { + EGVAR(refuel,fuelCapacity) = 894; // source mondkalb + }; + + class gm_do28d2_medevac_base: gm_do28d2_base { + EGVAR(medical,medicClass) = 1; + }; +}; diff --git a/addons/compat_gm/CfgWeapons.hpp b/addons/compat_gm/CfgWeapons.hpp new file mode 100644 index 0000000000..1c2adf8e52 --- /dev/null +++ b/addons/compat_gm/CfgWeapons.hpp @@ -0,0 +1,153 @@ +class CfgWeapons { + + // MACHINE GUNS + class gm_pk_base; + class gm_pkm_base: gm_pk_base { + EGVAR(overheating,mrbs) = 3000; + EGVAR(overheating,slowdownFactor) = 1; + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,dispersion) = 0.25; + }; + class gm_rifle_base; + class gm_machineGun_base: gm_rifle_base { + EGVAR(overheating,closedBolt) = 0; + }; + class gm_mg3_base: gm_machineGun_base { + EGVAR(overheating,mrbs) = 3000; + EGVAR(overheating,slowdownFactor) = 1; + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,dispersion) = 0.25; + }; + class gm_mg3_veh_base: gm_mg3_base { + EGVAR(overheating,allowSwapBarrel) = 0; + }; + class gm_launcher_base; + class gm_carlgustaf_m2_base: gm_launcher_base { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 60; + EGVAR(overpressure,damage) = 0.7; + EGVAR(overpressure,priority) = 1; + EGVAR(overpressure,range) = 10; + }; + + // SUB MACHINE GUNS + class gm_mp2_base: gm_rifle_base { + EGVAR(overheating,closedBolt) = 0; + }; + class gm_pm63_base: gm_rifle_base { + EGVAR(overheating,closedBolt) = 0; + }; + + // GRENADE LAUNCHERS + class gm_hk69a1_base: gm_rifle_base { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + class gm_pallad_d_base: gm_rifle_base { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + + // FLARE GUNS + class gm_pistol_base; + class gm_lp1_base: gm_pistol_base { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + class gm_p2a1_base: gm_pistol_base { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + + // HELMETS + #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; + + + class gm_ge_headgear_headset_crew_base; + class gm_ge_headgear_headset_crew_oli: gm_ge_headgear_headset_crew_base { + HEARING_PROTECTION_PELTOR + }; + + class gm_ge_headgear_sph4_base; + class gm_ge_headgear_sph4_oli: gm_ge_headgear_sph4_base { + HEARING_PROTECTION_PELTOR + }; + + class gm_pl_headgear_wz63_base; + class gm_pl_army_headgear_wz63_oli: gm_pl_headgear_wz63_base { + HEARING_PROTECTION_PELTOR + }; + class gm_pl_army_headgear_wz63_net_oli: gm_pl_headgear_wz63_base { + HEARING_PROTECTION_PELTOR + }; + + class gm_ge_headgear_crewhat_80_base; + class gm_ge_headgear_crewhat_80_blk: gm_ge_headgear_crewhat_80_base { + HEARING_PROTECTION_PELTOR + }; + + class gm_gc_headgear_crewhat_80_base; + class gm_gc_army_headgear_crewhat_80_blk: gm_gc_headgear_crewhat_80_base { + HEARING_PROTECTION_PELTOR + }; + + class gm_gc_headgear_zsh3_base; + class gm_gc_headgear_zsh3_wht: gm_gc_headgear_zsh3_base { + HEARING_PROTECTION_PELTOR + }; + class gm_gc_headgear_zsh3_blu: gm_gc_headgear_zsh3_base { + HEARING_PROTECTION_PELTOR + }; + class gm_gc_headgear_zsh3_orn: gm_gc_headgear_zsh3_base { + HEARING_PROTECTION_PELTOR + }; + + class gm_ge_headgear_beret_crew_bdx; + class gm_ge_headgear_beret_crew_blk; + class gm_ge_headgear_beret_crew_grn; + class gm_ge_headgear_beret_crew_red; + class gm_ge_headgear_beret_crew_red_antiair: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_blk_antitank: gm_ge_headgear_beret_crew_blk { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_blk_armor: gm_ge_headgear_beret_crew_blk { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_blk_armorrecon: gm_ge_headgear_beret_crew_blk { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_artillery: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_engineer: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_maintenance: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_grn_mechinf: gm_ge_headgear_beret_crew_grn { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_militarypolice: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_nbc: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_opcom: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_bdx_paratrooper: gm_ge_headgear_beret_crew_bdx { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_blk_recon: gm_ge_headgear_beret_crew_blk { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_supply: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; + class gm_ge_headgear_beret_crew_red_signals: gm_ge_headgear_beret_crew_red { + HEARING_PROTECTION_PELTOR + }; +}; diff --git a/optionals/compat_gm/XEH_PREP.hpp b/addons/compat_gm/XEH_PREP.hpp similarity index 100% rename from optionals/compat_gm/XEH_PREP.hpp rename to addons/compat_gm/XEH_PREP.hpp diff --git a/optionals/compat_rhs_afrf3/XEH_preStart.sqf b/addons/compat_gm/XEH_preStart.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_preStart.sqf rename to addons/compat_gm/XEH_preStart.sqf diff --git a/addons/compat_gm/XEH_preinit.sqf b/addons/compat_gm/XEH_preinit.sqf new file mode 100644 index 0000000000..d35e14fec5 --- /dev/null +++ b/addons/compat_gm/XEH_preinit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// handle GM uniform additional insignia +[QEGVAR(arsenal,displayClosed), { + EGVAR(arsenal,center) call gm_core_characters_fnc_updateUniformDetails; +}] call CBA_fnc_addEventHandler; + +ADDON = true; diff --git a/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp b/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..3da49f45ab --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp @@ -0,0 +1,25 @@ +class CfgAmmo { + class PipeBombBase; + class gm_explosive_petn_charge: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; + }; + class gm_explosive_plnp_charge: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; + }; + + class gm_mine_at_base; + class gm_mine_at_mn111: gm_mine_at_base { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; + }; + class gm_mine_at_dm21: gm_mine_at_base { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; + }; + class gm_mine_at_tm46: gm_mine_at_base { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; + }; + + class gm_mine_bounce_base; + class gm_mine_ap_dm31: gm_mine_bounce_base { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; + }; +}; diff --git a/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp b/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..17d51d3b45 --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp @@ -0,0 +1,87 @@ +class CfgMagazines { + // Explosives + class gm_explosive_petn_charge_base; + class gm_explosive_petn_charge: gm_explosive_petn_charge_base { + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_petn); + 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 gm_explosive_plnp_charge_base; + class gm_explosive_plnp_charge: gm_explosive_plnp_charge_base { + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_plnp); + 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 gm_mine_at_base; + class gm_mine_at_tm46: gm_mine_at_base { + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_mine_tm46); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; + }; + class gm_mine_at_dm21: gm_mine_at_base { + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm21); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; + }; + class gm_mine_at_mn111: gm_mine_at_base { + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_m111); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; + }; + + class gm_mine_ap_dm31: gm_mine_at_base { + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm31); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.125; + }; + }; + }; +}; diff --git a/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp b/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..bb279c82b9 --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp @@ -0,0 +1,67 @@ +class CfgVehicles { + + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + // CHARGE + class EGVAR(explosives,Place_gm_explosive_petn): EGVAR(explosives,Place) { + displayName = "PETN Charge"; + model = "gm\gm_weapons\gm_put\gm_explosive_charge_petn"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + class EGVAR(explosives,Place_gm_explosive_plnp): EGVAR(explosives,Place) { + displayName = "PLNP Charge"; + model = "gm\gm_weapons\gm_put\gm_explosive_charge_plnp"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + // AT MINE + class EGVAR(explosives,Place_gm_mine_tm46): EGVAR(explosives,Place) { + displayName = "AT Mine TM46"; + model = "gm\gm_weapons\gm_put\gm_mine_at_tm46"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + class EGVAR(explosives,Place_gm_explosive_dm21): EGVAR(explosives,Place) { + displayName = "AT Mine DM21"; + model = "gm\gm_weapons\gm_put\gm_mine_at_dm21"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + class EGVAR(explosives,Place_gm_explosive_m111): EGVAR(explosives,Place) { + displayName = "MN 111"; + model = "gm\gm_weapons\gm_launchers\gm_platan\gm_mine_at_mn111_disarmed"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + // AP + class EGVAR(explosives,Place_gm_explosive_dm31): EGVAR(explosives,Place) { + displayName = "AP Mine DM31"; + model = "gm\gm_weapons\gm_put\gm_mine_ap_dm31"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; +}; diff --git a/addons/compat_gm/compat_gm_explosives/config.cpp b/addons/compat_gm/compat_gm_explosives/config.cpp new file mode 100644 index 0000000000..e240c28389 --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "gm_core", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_gm/compat_gm_explosives/script_component.hpp b/addons/compat_gm/compat_gm_explosives/script_component.hpp new file mode 100644 index 0000000000..a697aad7f3 --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT explosives +#define SUBCOMPONENT_BEAUTIFIED Explosives +#include "..\script_component.hpp" diff --git a/addons/compat_gm/compat_gm_refuel/CfgEventHandlers.hpp b/addons/compat_gm/compat_gm_refuel/CfgEventHandlers.hpp new file mode 100644 index 0000000000..81ef39f88d --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/CfgEventHandlers.hpp @@ -0,0 +1,7 @@ +class Extended_InitPost_EventHandlers { + class gm_jerrycan { + class ADDON { + init = QUOTE(call EFUNC(refuel,makeJerryCan)); + }; + }; +}; diff --git a/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp b/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp new file mode 100644 index 0000000000..46a4deeefd --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp @@ -0,0 +1,6 @@ +class CfgVehicles { + class gm_ural4320_base; + class gm_ural4320_refuel_base: gm_ural4320_base { + transportFuel = 0; + }; +}; diff --git a/addons/compat_gm/compat_gm_refuel/config.cpp b/addons/compat_gm/compat_gm_refuel/config.cpp new file mode 100644 index 0000000000..6becabe70a --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "gm_core", + "ace_refuel" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_gm/compat_gm_refuel/script_component.hpp b/addons/compat_gm/compat_gm_refuel/script_component.hpp new file mode 100644 index 0000000000..b58db9432d --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT refuel +#define SUBCOMPONENT_BEAUTIFIED Refuel +#include "..\script_component.hpp" diff --git a/addons/compat_gm/config.cpp b/addons/compat_gm/config.cpp new file mode 100644 index 0000000000..63f43635d5 --- /dev/null +++ b/addons/compat_gm/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common", "gm_core"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"sancron", "nomisum"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_gm/functions/fnc_onCut.sqf b/addons/compat_gm/functions/fnc_onCut.sqf new file mode 100644 index 0000000000..458c5d8de8 --- /dev/null +++ b/addons/compat_gm/functions/fnc_onCut.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" +/* + * Author: nomisum + * Function for closing doors for GM helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before cutting ropes + * + * Example: + * [_vehicle] call ace_compat_gm_fnc_onCut + * + * Public: No + */ +params ["_vehicle"]; + +switch (true) do { + case (_vehicle isKindOf "gm_ge_army_bo105p1m_vbh_swooper"): { + _vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; + _vehicle animateDoor ["door_2_1_source", 0]; + _vehicle animateDoor ["door_2_2_source", 0]; + }; + case (_vehicle isKindOf "gm_ch53_base"): { + _vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; + _vehicle animateDoor ["cargoramp_source", 0]; + _vehicle animateSource ["slingloadlights_source", 0]; + }; + case (_vehicle isKindOf "gm_mi2_base"): { + _vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; + _vehicle animate ["door_2_1_anim", 0]; // animateSource/animateDoor didnt work + }; + default {}; +}; + +2 diff --git a/addons/compat_gm/functions/fnc_onCutRopes.sqf b/addons/compat_gm/functions/fnc_onCutRopes.sqf new file mode 100644 index 0000000000..a02b2fe90c --- /dev/null +++ b/addons/compat_gm/functions/fnc_onCutRopes.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" +/* + * Author: nomisum + * Function for animating ropes (first introduced for GM Bo 105). + * Original onCut runs when _stowing_ FRIES. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait for animation to finish + * + * Example: + * [_vehicle] call ace_compat_gm_fnc_onCutRopes + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle animateSource ["swooperRopes_unhide", 1, true]; + +0 diff --git a/addons/compat_gm/functions/fnc_onDeployRopes.sqf b/addons/compat_gm/functions/fnc_onDeployRopes.sqf new file mode 100644 index 0000000000..ea4c084b4c --- /dev/null +++ b/addons/compat_gm/functions/fnc_onDeployRopes.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" +/* + * Author: nomisum + * Function for animating ropes when actually dropping (first introduced for GM Bo 105). + * Original onPrepare already animates when preparing FRIES. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait for animation to finish + * + * Example: + * [_vehicle] call ace_compat_gm_fnc_onDeployRopes + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle animateSource ["swooperRopes_unhide", 0, true]; + +0 diff --git a/addons/compat_gm/functions/fnc_onPrepare.sqf b/addons/compat_gm/functions/fnc_onPrepare.sqf new file mode 100644 index 0000000000..df62ad36b1 --- /dev/null +++ b/addons/compat_gm/functions/fnc_onPrepare.sqf @@ -0,0 +1,38 @@ +#include "..\script_component.hpp" +/* + * Author: nomisum + * Function for opening doors for most GM helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before deploying ropes + * + * Example: + * [_vehicle] call ace_compat_gm_fnc_onPrepare + * + * Public: No + */ +params ["_vehicle"]; + +switch (true) do { + case (_vehicle isKindOf "gm_ge_army_bo105p1m_vbh_swooper"): { + _vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; + _vehicle animateDoor ["door_2_1_source", 1]; + _vehicle animateDoor ["door_2_2_source", 1]; + }; + case (_vehicle isKindOf "gm_ch53_base"): { + _vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; + _vehicle animateDoor ["cargoramp_source", 1]; + _vehicle animateSource ["slingloadlights_source", 1]; + }; + case (_vehicle isKindOf "gm_mi2_base"): { + _vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; + _vehicle animate ["door_2_1_anim", 1]; // animateSource/animateDoor didnt work + _vehicle animateSource ["winch_unhide", 1]; // just in case this wasnt already set + }; + default {}; +}; + +2 diff --git a/addons/compat_gm/script_component.hpp b/addons/compat_gm/script_component.hpp new file mode 100644 index 0000000000..6b044b1192 --- /dev/null +++ b/addons/compat_gm/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT compat_gm +#define COMPONENT_BEAUTIFIED GM Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_r3f/$PBOPREFIX$ b/addons/compat_r3f/$PBOPREFIX$ similarity index 100% rename from optionals/compat_r3f/$PBOPREFIX$ rename to addons/compat_r3f/$PBOPREFIX$ diff --git a/optionals/compat_r3f/CfgAmmo.hpp b/addons/compat_r3f/CfgAmmo.hpp similarity index 100% rename from optionals/compat_r3f/CfgAmmo.hpp rename to addons/compat_r3f/CfgAmmo.hpp diff --git a/optionals/compat_r3f/CfgMagazines.hpp b/addons/compat_r3f/CfgMagazines.hpp similarity index 100% rename from optionals/compat_r3f/CfgMagazines.hpp rename to addons/compat_r3f/CfgMagazines.hpp diff --git a/optionals/compat_r3f/CfgWeapons.hpp b/addons/compat_r3f/CfgWeapons.hpp similarity index 100% rename from optionals/compat_r3f/CfgWeapons.hpp rename to addons/compat_r3f/CfgWeapons.hpp diff --git a/addons/compat_r3f/config.cpp b/addons/compat_r3f/config.cpp new file mode 100644 index 0000000000..9f962372d0 --- /dev/null +++ b/addons/compat_r3f/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"r3f_armes_c", "r3f_acc", "R3F_G17_addons", "R3F_G_SCAR", "R3F_SCAR_H", "R3F_SCAR_L", "R3F_FN_MAG"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_r3f/script_component.hpp b/addons/compat_r3f/script_component.hpp similarity index 100% rename from optionals/compat_r3f/script_component.hpp rename to addons/compat_r3f/script_component.hpp diff --git a/optionals/compat_rh_acc/$PBOPREFIX$ b/addons/compat_rh_acc/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rh_acc/$PBOPREFIX$ rename to addons/compat_rh_acc/$PBOPREFIX$ diff --git a/optionals/compat_rh_acc/CfgWeapons.hpp b/addons/compat_rh_acc/CfgWeapons.hpp similarity index 100% rename from optionals/compat_rh_acc/CfgWeapons.hpp rename to addons/compat_rh_acc/CfgWeapons.hpp diff --git a/addons/compat_rh_acc/config.cpp b/addons/compat_rh_acc/config.cpp new file mode 100644 index 0000000000..41aee34292 --- /dev/null +++ b/addons/compat_rh_acc/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_scopes", "RH_acc"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rh_acc/script_component.hpp b/addons/compat_rh_acc/script_component.hpp similarity index 100% rename from optionals/compat_rh_acc/script_component.hpp rename to addons/compat_rh_acc/script_component.hpp diff --git a/optionals/compat_rh_de/$PBOPREFIX$ b/addons/compat_rh_de/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rh_de/$PBOPREFIX$ rename to addons/compat_rh_de/$PBOPREFIX$ diff --git a/optionals/compat_rh_de/CfgAmmo.hpp b/addons/compat_rh_de/CfgAmmo.hpp similarity index 100% rename from optionals/compat_rh_de/CfgAmmo.hpp rename to addons/compat_rh_de/CfgAmmo.hpp diff --git a/optionals/compat_rh_de/CfgWeapons.hpp b/addons/compat_rh_de/CfgWeapons.hpp similarity index 100% rename from optionals/compat_rh_de/CfgWeapons.hpp rename to addons/compat_rh_de/CfgWeapons.hpp diff --git a/addons/compat_rh_de/config.cpp b/addons/compat_rh_de/config.cpp new file mode 100644 index 0000000000..90a37e33fc --- /dev/null +++ b/addons/compat_rh_de/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RH_de_cfg"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rh_de/script_component.hpp b/addons/compat_rh_de/script_component.hpp similarity index 100% rename from optionals/compat_rh_de/script_component.hpp rename to addons/compat_rh_de/script_component.hpp diff --git a/optionals/compat_rh_m4/$PBOPREFIX$ b/addons/compat_rh_m4/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rh_m4/$PBOPREFIX$ rename to addons/compat_rh_m4/$PBOPREFIX$ diff --git a/addons/compat_rh_m4/CfgAmmo.hpp b/addons/compat_rh_m4/CfgAmmo.hpp new file mode 100644 index 0000000000..03b6098ad2 --- /dev/null +++ b/addons/compat_rh_m4/CfgAmmo.hpp @@ -0,0 +1,191 @@ +class CfgAmmo { + + class Default; + class BulletCore; + class BulletBase; + class B_9x21_Ball; + class B_556x45_Ball; + class B_65x39_Caseless; + class B_762x51_Ball; + + class RH_9x19_B_M822: BulletBase { + ACE_caliber=9.017; + ACE_bulletLength=15.494; + ACE_bulletMass=8.0352; + 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.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={101.6, 127.0, 228.6}; + }; + class RH_9x19_B_HP: BulletBase { + ACE_caliber=9.017; + ACE_bulletLength=15.494; + ACE_bulletMass=8.0352; + 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.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={101.6, 127.0, 228.6}; + }; + class RH_9x19_B_HPSB: BulletBase { + ACE_caliber=9.017; + ACE_bulletLength=15.316; + ACE_bulletMass=9.5256; + 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.212}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={295, 310, 330}; + ACE_barrelLengths[]={101.6, 127.0, 228.6}; + }; + class RH_556x45_B_M855A1: B_556x45_Ball { + ACE_caliber=5.69; + ACE_bulletLength=23.012; + ACE_bulletMass=4.0176; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; + }; + class RH_556x45_B_Mk318: B_556x45_Ball { + ACE_caliber=5.69; + ACE_bulletLength=23.012; + ACE_bulletMass=4.0176; + 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.307}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={780, 886, 950}; + ACE_barrelLengths[]={254.0, 393.7, 508.0}; + }; + class RH_556x45_B_Mk262: B_556x45_Ball { + ACE_caliber=5.69; + ACE_bulletLength=23.012; + ACE_bulletMass=4.9896; + 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.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={190.5, 368.3, 457.2, 508.0}; + }; + class RH_68x43_B_FMJ: B_65x39_Caseless { + ACE_caliber=7.036; + ACE_bulletLength=24.359; + ACE_bulletMass=7.452; + 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.162}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={713, 785, 810, 850}; + ACE_barrelLengths[]={304.8, 406.4, 508.0, 609.6}; + }; + class RH_68x43_B_Match: B_65x39_Caseless { + ACE_caliber=7.036; + ACE_bulletLength=31.75; + ACE_bulletMass=8.748; + 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.253}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 732, 750, 780}; + ACE_barrelLengths[]={304.8, 406.4, 508.0, 609.6}; + }; + class RH_762x35_B_FMJ: B_65x39_Caseless { + ACE_caliber=7.823; + ACE_bulletLength=28.397; + ACE_bulletMass=9.5256; + 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.398}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={559, 609, 625}; + ACE_barrelLengths[]={152.4, 406.4, 508.0}; + }; + class RH_762x35_B_Match: B_65x39_Caseless { + ACE_caliber=7.823; + ACE_bulletLength=29.286; + ACE_bulletMass=8.1; + 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.349, 0.338, 0.330, 0.310}; + ACE_velocityBoundaries[]={792, 610, 488}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={572, 676, 700}; + ACE_barrelLengths[]={152.4, 406.4, 508.0}; + }; + class RH_762x35_B_MSB: B_65x39_Caseless { + ACE_caliber=7.823; + ACE_bulletLength=37.821; + ACE_bulletMass=14.256; + 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.608}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={300, 320, 340}; + ACE_barrelLengths[]={228.6, 406.4, 508.0}; + }; + class RH_762x51_B_M80A1: B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=28.956; + ACE_bulletMass=9.4608; + 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.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; + }; + class RH_762x51_B_Mk316LR: B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=31.496; + ACE_bulletMass=11.34; + ACE_ammoTempMuzzleVelocityShifts[]={-5.3, -5.1, -4.6, -4.2, -3.4, -2.6, -1.4, -0.3, 1.4, 3.0, 5.2}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={775, 790, 805, 810}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; + class RH_762x51_B_Mk319: B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=31.496; + ACE_bulletMass=8.424; + 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.377}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={838, 892, 910}; + ACE_barrelLengths[]={330.2, 406.4, 508.0}; + }; + class RH_762x51_B_LFMJSB: B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=34.036; + ACE_bulletMass=12.96; + 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.235}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={305, 325, 335, 340}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; +}; diff --git a/optionals/compat_rh_m4/CfgWeapons.hpp b/addons/compat_rh_m4/CfgWeapons.hpp similarity index 100% rename from optionals/compat_rh_m4/CfgWeapons.hpp rename to addons/compat_rh_m4/CfgWeapons.hpp diff --git a/addons/compat_rh_m4/config.cpp b/addons/compat_rh_m4/config.cpp new file mode 100644 index 0000000000..48365df49c --- /dev/null +++ b/addons/compat_rh_m4/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RH_m4_cfg"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rh_m4/script_component.hpp b/addons/compat_rh_m4/script_component.hpp similarity index 100% rename from optionals/compat_rh_m4/script_component.hpp rename to addons/compat_rh_m4/script_component.hpp diff --git a/optionals/compat_rh_pdw/$PBOPREFIX$ b/addons/compat_rh_pdw/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rh_pdw/$PBOPREFIX$ rename to addons/compat_rh_pdw/$PBOPREFIX$ diff --git a/optionals/compat_rh_pdw/CfgAmmo.hpp b/addons/compat_rh_pdw/CfgAmmo.hpp similarity index 100% rename from optionals/compat_rh_pdw/CfgAmmo.hpp rename to addons/compat_rh_pdw/CfgAmmo.hpp diff --git a/optionals/compat_rh_pdw/CfgWeapons.hpp b/addons/compat_rh_pdw/CfgWeapons.hpp similarity index 100% rename from optionals/compat_rh_pdw/CfgWeapons.hpp rename to addons/compat_rh_pdw/CfgWeapons.hpp diff --git a/addons/compat_rh_pdw/config.cpp b/addons/compat_rh_pdw/config.cpp new file mode 100644 index 0000000000..433a8d111c --- /dev/null +++ b/addons/compat_rh_pdw/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RH_PDW"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rh_pdw/script_component.hpp b/addons/compat_rh_pdw/script_component.hpp similarity index 100% rename from optionals/compat_rh_pdw/script_component.hpp rename to addons/compat_rh_pdw/script_component.hpp diff --git a/optionals/compat_rhs_afrf3/$PBOPREFIX$ b/addons/compat_rhs_afrf3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_afrf3/$PBOPREFIX$ rename to addons/compat_rhs_afrf3/$PBOPREFIX$ diff --git a/addons/compat_rhs_afrf3/CfgAmmo.hpp b/addons/compat_rhs_afrf3/CfgAmmo.hpp new file mode 100644 index 0000000000..54ff3bd2c2 --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgAmmo.hpp @@ -0,0 +1,264 @@ +class CfgAmmo { + class BulletBase; + class B_556x45_Ball; + class rhs_B_545x39_Ball: B_556x45_Ball { + 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="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={254.0, 414.02, 508.0}; + }; + class rhs_B_545x39_Ball_Tracer_Green: rhs_B_545x39_Ball { + ACE_caliber=5.588; + ACE_bulletLength=21.59; + ACE_bulletMass=3.22704; + 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="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={254.0, 414.02, 508.0}; + }; + class B_762x51_Ball; + class rhs_B_762x54_Ball: B_762x51_Ball { + ACE_caliber=7.925; + ACE_bulletLength=28.956; + ACE_bulletMass=9.8496; + 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.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; + class rhs_B_762x54_Ball_Tracer_Green: rhs_B_762x54_Ball { + ACE_caliber=7.925; + ACE_bulletLength=28.956; + ACE_bulletMass=9.6552; + 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.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; + class rhs_B_762x54_7N1_Ball: rhs_B_762x54_Ball { + ACE_caliber=7.925; + ACE_bulletLength=28.956; + ACE_bulletMass=9.8496; + 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.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; + class rhs_B_762x39_Ball: B_762x51_Ball { + 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 rhs_B_762x39_Tracer: rhs_B_762x39_Ball { + ACE_caliber=7.823; + ACE_bulletLength=28.956; + ACE_bulletMass=7.5816; + 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_9x21_Ball; + class rhs_B_9x19_7N21: B_9x21_Ball { + ACE_caliber=9.017; + ACE_bulletLength=15.494; + ACE_bulletMass=5.19696; + 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.14}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={445, 460, 480}; + ACE_barrelLengths[]={101.6, 127.0, 228.6}; + }; + class rhs_B_9x18_57N181S: B_9x21_Ball { + ACE_caliber=9.271; + ACE_bulletLength=15.494; + ACE_bulletMass=6.00048; + 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.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={96.52, 127.0, 228.6}; + }; + class rhs_B_545x39_7U1_Ball: rhs_B_545x39_Ball { + ACE_caliber = 5.67; + ACE_bulletLength = 24.3; + ACE_bulletMass = 5.2; + ACE_ammoTempMuzzleVelocityShifts[] = {-8.85,-8.49,-7.61667,-6.70667,-5.66,-4.26667,-2.54667,-0.51,1.98667,5.05667,8.73}; + ACE_muzzleVelocities[] = {300, 320, 335}; + ACE_barrelLengths[] = {200, 300, 400}; + }; + class rhs_B_762x39_U_Ball: rhs_B_762x39_Ball { + ACE_caliber = 7.94; + ACE_bulletLength = 33.62; + ACE_bulletMass = 12.5; + ACE_ammoTempMuzzleVelocityShifts[] = {-8.85,-8.49,-7.61667,-6.70667,-5.66,-4.26667,-2.54667,-0.51,1.98667,5.05667,8.73}; //Just Scaled Down Normal? + ACE_muzzleVelocities[]= {270, 290, 320}; + ACE_barrelLengths[]= {254.0, 414.02, 508.0}; + }; + class rhs_B_9x39_SP5: rhs_B_762x39_Ball { + ACE_caliber = 9.246; + ACE_bulletLength = 31.496; + ACE_bulletMass = 16.1; + ACE_ammoTempMuzzleVelocityShifts[] = {-2.655,-2.547,-2.285,-2.012,-1.698,-1.28,-0.764,-0.153,0.596,1.517,2.619}; + ACE_ballisticCoefficients[] = {0.275}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_muzzleVelocities[] = {280, 300, 320}; + ACE_barrelLengths[] = {254.0, 414.02, 508.0}; + }; + class rhs_B_9x39_SP6: rhs_B_9x39_SP5 { + ACE_caliber = 9.26; + ACE_bulletMass = 16.2; + ACE_ballisticCoefficients[] = {0.225}; + ACE_muzzleVelocities[] = {290, 310, 335}; + ACE_barrelLengths[] = {254.0, 414.02, 508.0}; + }; + + class SubmunitionBase; + class rhs_ammo_127x108mm_x5: SubmunitionBase { + ACE_rearm_caliber=13; + }; + + class GrenadeHand; + class rhs_ammo_rgd5: GrenadeHand { + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 200; + EGVAR(frag,charge) = 110; + EGVAR(frag,gurney_c) = 2440; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_small_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; + }; + class rhs_ammo_rgn: rhs_ammo_rgd5 { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class rhs_ammo_fakel: GrenadeHand { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class rhs_ammo_fakels: rhs_ammo_fakel {}; + class rhs_ammo_zarya2: rhs_ammo_fakels {}; + class rhs_ammo_plamyam: rhs_ammo_fakels {}; + + class RocketBase; + class R_PG32V_F: RocketBase {}; + class rhs_rpg26_rocket: R_PG32V_F {}; + class rhs_rpg7v2_pg7vl: rhs_rpg26_rocket {}; + class rhs_rpg7v2_og7v: rhs_rpg7v2_pg7vl { + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 400; + EGVAR(frag,charge) = 210; + EGVAR(frag,gurney_c) = 2800; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + class rhs_rpg7v2_tbg7v: rhs_rpg7v2_pg7vl { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + EGVAR(vehicle_damage,incendiary) = 0.7; + }; + class rhs_rshg2_rocket: rhs_rpg7v2_tbg7v { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + + class G_40mm_HE; + class rhs_g_vog25: G_40mm_HE {}; + class rhs_g_vg40tb: rhs_g_vog25 { //Thermobaric + EGVAR(frag,force) = 0; + }; + class rhs_g_vg40sz: rhs_g_vog25 { //Flashbang + EGVAR(frag,force) = 0; + }; + class rhs_g_gdm40: rhs_g_vog25 { //Smoke + EGVAR(frag,force) = 0; + }; + class rhs_g_vg40md_white: rhs_g_vog25 { //Smoke + EGVAR(frag,force) = 0; + }; + + + class Sh_125mm_APFSDS; + class Sh_125mm_HE; + class rhs_ammo_bm_base: Sh_125mm_APFSDS { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + class rhs_ammo_bk_base: rhs_ammo_bm_base { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_3bm_base: rhs_ammo_bm_base {}; + class rhs_ammo_of_base: Sh_125mm_HE { + EGVAR(vehicle_damage,incendiary) = 0.30; + }; + class rhs_ammo_base_penetrator: rhs_ammo_3bm_base { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_ap_penetrator: Sh_125mm_APFSDS { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + + class M_Titan_AT; + class rhs_ammo_atgmCore_base: M_Titan_AT { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_atgmBase_base: M_Titan_AT { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + + class rhs_ammo_rpgShell_base; + class rhs_ammo_og9v: rhs_ammo_rpgShell_base { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + + class rhs_ammo_rpg15Shell_base; + class rhs_ammo_og15v: rhs_ammo_rpg15Shell_base { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + + class B_30mm_AP; + class rhs_ammo_30x165mm_base: B_30mm_AP { + EGVAR(vehicle_damage,incendiary) = 0.2; + }; +}; diff --git a/addons/compat_rhs_afrf3/CfgEventHandlers.hpp b/addons/compat_rhs_afrf3/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f6503c2479 --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/compat_rhs_afrf3/CfgMagazines.hpp b/addons/compat_rhs_afrf3/CfgMagazines.hpp new file mode 100644 index 0000000000..b554686f3d --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgMagazines.hpp @@ -0,0 +1,20 @@ +class cfgMagazines { + class VehicleMagazine; + class rhs_30Rnd_545x39_7N6_AK; + + class rhs_100Rnd_762x54mmR: rhs_30Rnd_545x39_7N6_AK { + ACE_isBelt = 1; + }; + class rhs_mag_127x108mm_50: VehicleMagazine { + ACE_isBelt = 1; + }; + class rhs_mag_127x108mm_150: rhs_mag_127x108mm_50 { + ACE_isBelt = 0; + }; + class rhs_mag_127x108mm_1470: rhs_mag_127x108mm_50 { + ACE_isBelt = 0; + }; + class RHS_mag_VOG30_30: VehicleMagazine { + ACE_isBelt = 1; + }; +}; diff --git a/addons/compat_rhs_afrf3/CfgVehicles.hpp b/addons/compat_rhs_afrf3/CfgVehicles.hpp new file mode 100644 index 0000000000..622d764ad2 --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgVehicles.hpp @@ -0,0 +1,594 @@ +class CfgVehicles { + class LandVehicle; + class Tank: LandVehicle { + class NewTurret; + }; + class Tank_F: Tank { + class Turrets { + class MainTurret: NewTurret { + class Turrets { + class CommanderOptics; + }; + }; + }; + }; + class Car: LandVehicle { + class ACE_Actions { + class ACE_MainActions {}; + }; + }; + class Car_F: Car { + class ViewPilot; + class NewTurret; + }; + class Wheeled_APC_F: Car_F { + class NewTurret; + class Turrets { + class MainTurret: NewTurret { + class ViewOptics; + }; + }; + class CommanderOptics; + }; + class Air; + class Helicopter: Air { + class Turrets; + }; + class Helicopter_Base_F: Helicopter { + class Turrets: Turrets { + class MainTurret; + }; + }; + + class rhs_tank_base: Tank_F { + EGVAR(refuel,fuelCapacity) = 1200; + EGVAR(vehicle_damage,hullDetonationProb) = 0.8; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0.2; + EGVAR(vehicle_damage,hullFireProb) = 0.8; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.5; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.2; + }; + class rhs_btr_base: Wheeled_APC_F { + EGVAR(map,vehicleLightColor)[] = {0,0,1,0.1}; + EGVAR(refuel,fuelCapacity) = 300; + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.7; + EGVAR(vehicle_damage,turretFireProb) = 0.7; + EGVAR(vehicle_damage,engineFireProb) = 0.7; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + + class rhs_infantry_msv_base; + class rhs_pilot_base: rhs_infantry_msv_base { + ace_gforcecoef = 0.55; + }; + + class O_Plane_CAS_02_F; + class RHS_su25_base: O_Plane_CAS_02_F { + EGVAR(refuel,fuelCapacity) = 3600; + }; + + class Helicopter_Base_H: Helicopter_Base_F { + class EventHandlers; + }; + class Heli_Light_02_base_F: Helicopter_Base_H {}; + class RHS_Mi8_base: Heli_Light_02_base_F { + EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; + EGVAR(refuel,fuelCapacity) = 3700; + }; + class Heli_Attack_02_base_F: Helicopter_Base_F {}; + class RHS_Ka52_base: Heli_Attack_02_base_F { + EGVAR(refuel,fuelCapacity) = 1870; + }; + + class RHS_Mi24_base: Heli_Attack_02_base_F { + EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; + EGVAR(refuel,fuelCapacity) = 1851; + }; + + class rhs_t80b: rhs_tank_base { + EGVAR(refuel,fuelCapacity) = 1100; + EGVAR(vehicle_damage,canHaveFireRing) = 1; + }; + class Truck_F: Car_F {}; + class RHS_Ural_BaseTurret: Truck_F { + EGVAR(refuel,fuelCapacity) = 360; + }; + + class RHS_Ural_Base: RHS_Ural_BaseTurret {}; + class RHS_Ural_MSV_Base: RHS_Ural_Base {}; + class RHS_Ural_Support_MSV_Base_01: RHS_Ural_MSV_Base {}; + class RHS_Ural_Fuel_MSV_01: RHS_Ural_Support_MSV_Base_01 { + EGVAR(refuel,hooks)[] = {{-0.05,-3.6,-0.45}}; + EGVAR(refuel,fuelCargo) = 10000; + }; + class RHS_Ural_Ammo_Base: RHS_Ural_Base { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class rhs_kraz255b1_base; + class rhs_kraz255b1_fuel_base: rhs_kraz255b1_base { + EGVAR(refuel,hooks)[] = {{-0.05,-3.6,-0.45}}; + EGVAR(refuel,fuelCargo) = 10000; + }; + + class rhs_truck: Truck_F { + EGVAR(refuel,fuelCapacity) = 210; + }; + + class rhs_gaz66_vmf; + class rhs_gaz66_ammo_base: rhs_gaz66_vmf { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class rhs_kamaz5350; + class rhs_kamaz5350_ammo_base: rhs_kamaz5350 { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class MRAP_02_base_F; + class rhs_tigr_base: MRAP_02_base_F { + EGVAR(refuel,fuelCapacity) = 138; + }; + + class Offroad_01_base_f; + class RHS_UAZ_Base: Offroad_01_base_f { + EGVAR(refuel,fuelCapacity) = 78; + }; + + class APC_Tracked_02_base_F: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret {}; + }; + }; + + class rhs_zsutank_base: APC_Tracked_02_base_F { + EGVAR(refuel,fuelCapacity) = 515; + EGVAR(vehicle_damage,hullDetonationProb) = 0; + EGVAR(vehicle_damage,turretDetonationProb) = 0; + EGVAR(vehicle_damage,engineDetonationProb) = 0.2; + EGVAR(vehicle_damage,hullFireProb) = 0.7; + EGVAR(vehicle_damage,turretFireProb) = 0.7; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.8; + EGVAR(vehicle_damage,canHaveFireRing) = 1; + }; + + class rhs_btr60_base: rhs_btr_base { + EGVAR(refuel,fuelCapacity) = 290; + }; + class rhs_btr70_vmf: rhs_btr_base { + EGVAR(refuel,fuelCapacity) = 350; + class ace_viewports { + class view_0 { + camLocation[] = {0.478394, -0.575, -0.145}; + camAttach = 90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_1 { + camLocation[] = {-1.38184, -0.575, -0.145}; + camAttach = -90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + }; + }; + + class rhs_btr70_msv: rhs_btr70_vmf {}; + class rhs_btr80_msv: rhs_btr70_msv { + EGVAR(refuel,fuelCapacity) = 300; + class ace_viewports { + class view_0 { + camLocation[] = {0.534424, -0.336914, 0.636819}; + camAttach = 45; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_1 { + camLocation[] = {0.760254, -0.459473, 0.526328}; + camAttach = 90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_2 { + camLocation[] = {0.770508, -1.21924, 0.526954}; + camAttach = 90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_3 { + camLocation[] = {-1.13, -1.2085, 0.490339}; + camAttach = -90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_4 { + camLocation[] = {-1.14124, -0.416992, 0.460611}; + camAttach = -90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_5 { + camLocation[] = {-0.932983, -0.326172, 0.647666}; + camAttach = -45; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + }; + }; + class rhs_btr80a_msv: rhs_btr80_msv { + class ace_viewports { + class view_0 { + camLocation[] = {0.589844, -0.314941, 0.449678}; + camAttach = 45; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_1 { + camLocation[] = {0.809082, -0.442871, 0.276865}; + camAttach = 90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_2 { + camLocation[] = {0.819092, -1.24414, 0.27857}; + camAttach = 90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_3 { + camLocation[] = {-1.1012, -1.22461, 0.341089}; + camAttach = -90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_4 { + camLocation[] = {-1.11597, -0.458984, 0.307256}; + camAttach = -90; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + class view_5 { + camLocation[] = {-0.869995, -0.304688, 0.461181}; + camAttach = -45; + compartments[]={"Compartment1"}; + roles[]={"cargo"}; + }; + }; + }; + + class rhs_2s3tank_base: Tank_F { + EGVAR(refuel,fuelCapacity) = 830; + }; + + class OTR21_Base: Truck_F { + EGVAR(refuel,fuelCapacity) = 500; + }; + + class rhs_bmd_base: Tank_F { + EGVAR(refuel,fuelCapacity) = 300; + EGVAR(vehicle_damage,hullDetonationProb) = 0; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.8; + EGVAR(vehicle_damage,turretFireProb) = 0.5; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + class rhs_bmp1tank_base: Tank_F { + EGVAR(map,vehicleLightColor)[] = {0,1,0,0.1}; + EGVAR(refuel,fuelCapacity) = 460; + }; + class rhs_bmp3tank_base: Tank_F { + EGVAR(refuel,fuelCapacity) = 460; + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.5; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + class ace_viewports { + class view_0 { + camLocation[] = {1.02881, -0.923828, -0.647231}; + screenLocation[] = {1.12881, -0.653828, -1.08223}; + camAttach = 50; + maxDistance = 0.5; + roles[]={"cargo"}; + }; + class view_1 { + camLocation[] = {1.01709, -1.55664, -0.647231}; + screenLocation[] = {1.10709, -1.42664, -1.14223}; + camAttach = 82; + maxDistance = 0.5; + roles[]={"cargo"}; + }; + class view_2 { + camLocation[] = {-0.871094, -1.55762, -0.647231}; + screenLocation[] = {-0.981094, -1.42762, -1.13223}; + camAttach = 285; + maxDistance = 0.5; + roles[]={"cargo"}; + }; + class view_3 { + camLocation[] = {-1.00879, -0.939941, -0.650259}; + screenLocation[] = {-0.97879, -0.689941, -1.09526}; + camAttach = 310; + maxDistance = 0.5; + roles[]={"cargo"}; + }; + }; + }; + class rhs_a3spruttank_base: Tank_F { + EGVAR(refuel,fuelCapacity) = 400; + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.5; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + class rhs_a3t72tank_base: Tank_F { + EGVAR(refuel,fuelCapacity) = 1200; + EGVAR(vehicle_damage,hullDetonationProb) = 0.8; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0.2; + EGVAR(vehicle_damage,hullFireProb) = 0.8; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.5; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.2; + }; + class rhs_bmp_base: rhs_bmp1tank_base { + EGVAR(vehicle_damage,hullDetonationProb) = 0; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.8; + EGVAR(vehicle_damage,turretFireProb) = 0.5; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + class rhs_t72bd_tv: rhs_a3t72tank_base { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", "era_7_hitpoint", + "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", + "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", + "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", + "era_29_hitpoint", "era_30_hitpoint", "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", + "era_36_hitpoint", "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", "era_41_hitpoint", "era_42_hitpoint", + "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint", "era_46_hitpoint", "era_47_hitpoint", "era_48_hitpoint", "era_49_hitpoint", + "era_50_hitpoint", "era_51_hitpoint", "era_52_hitpoint", "era_53_hitpoint", "era_51_hitpoint", "era_55_hitpoint", "era_56_hitpoint", + "era_57_hitpoint", "era_58_hitpoint", "era_59_hitpoint", "era_60_hitpoint", "era_61_hitpoint", "era_62_hitpoint", "era_63_hitpoint", + "era_64_hitpoint", "era_65_hitpoint", "era_66_hitpoint", "era_67_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { + "SLAT_68_hitpoint", "SLAT_69_hitpoint", "SLAT_70_hitpoint" + }; + }; + class rhs_t90_tv: rhs_t72bd_tv { + EGVAR(vehicle_damage,hullDetonationProb) = 0; + EGVAR(vehicle_damage,turretDetonationProb) = 0; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.2; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.5; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0; + }; + + class rhs_t14_base: Tank_F { + EGVAR(vehicle_damage,hullDetonationProb) = 0; + EGVAR(vehicle_damage,turretDetonationProb) = 0; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.2; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.5; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0; + // Dear LORD RHS loves their ERA + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint", + "era_37_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { + "SLAT_38_hitpoint", "SLAT_39_hitpoint", "SLAT_40_hitpoint", "SLAT_41_hitpoint" + }; + EGVAR(vehicle_damage,canHaveFireRing) = 1; + }; + + class rhs_t72bb_tv: rhs_a3t72tank_base { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint", + "era_37_hitpoint" + }; + }; + + class rhs_t72bc_tv: rhs_a3t72tank_base { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint" + }; + }; + + class rhs_t72be_tv: rhs_t72bd_tv { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { + "SLAT_51_hitpoint", "SLAT_52_hitpoint", "SLAT_53_hitpoint", + "SLAT_54_hitpoint", "SLAT_55_hitpoint", "SLAT_56_hitpoint", + "SLAT_57_hitpoint", "SLAT_68_hitpoint", "SLAT_69_hitpoint", + "SLAT_70_hitpoint" + }; + }; + + class rhs_t90a_tv: rhs_t90_tv {}; + class rhs_t90saa_tv: rhs_t90a_tv { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { + "SLAT_51_hitpoint", "SLAT_52_hitpoint", "SLAT_53_hitpoint", "SLAT_54_hitpoint" + }; + }; + class rhs_t90sab_tv: rhs_t90a_tv { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint", + "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", "era_41_hitpoint", "era_42_hitpoint", + "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint", "era_46_hitpoint", "era_47_hitpoint", "era_48_hitpoint", + "era_49_hitpoint", "era_50_hitpoint" + }; + }; + class rhs_t90am_tv: rhs_t90_tv { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint", + "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", "era_41_hitpoint", "era_42_hitpoint", + "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint", "era_46_hitpoint", "era_47_hitpoint", "era_48_hitpoint", + "era_49_hitpoint", "era_50_hitpoint", "era_51_hitpoint", "era_52_hitpoint", "era_53_hitpoint", "era_54_hitpoint", + "era_55_hitpoint", "era_56_hitpoint", "era_57_hitpoint", "era_58_hitpoint", "era_59_hitpoint", "era_60_hitpoint", + "era_51_hitpoint", "era_62_hitpoint", "era_63_hitpoint", "era_64_hitpoint", "era_65_hitpoint", "era_66_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { + "SLAT_18_hitpoint", "SLAT_19_hitpoint", "SLAT_20_hitpoint", "SLAT_21_hitpoint", + "SLAT_22_hitpoint", "SLAT_23_hitpoint", "SLAT_24_hitpoint", "SLAT_25_hitpoint", + "SLAT_51_hitpoint", "SLAT_52_hitpoint", "SLAT_53_hitpoint", "SLAT_54_hitpoint" + }; + }; + class rhs_t90sm_tv: rhs_t90am_tv { + EGVAR(vehicle_damage,slatHitpoints)[] = { + "SLAT_23_hitpoint", "SLAT_26_hitpoint", "SLAT_51_hitpoint", "SLAT_52_hitpoint", + "SLAT_53_hitpoint", "SLAT_54_hitpoint", "SLAT_55_hitpoint", "SLAT_56_hitpoint", + "SLAT_57_hitpoint" + }; + }; + + class rhs_t80bv: rhs_t80b { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint" + }; + }; + class rhs_t80a; + class rhs_t80u: rhs_t80a { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint" + }; + }; + class rhs_t80uk: rhs_t80u { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint" + }; + }; + class rhs_t80ue1: rhs_t80a { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", + "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", + "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", + "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", + "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint" + }; + }; + + // Wirecutter Backpacks + class rhs_assault_umbts; + class rhs_assault_umbts_engineer: rhs_assault_umbts { + EGVAR(logistics_wirecutter,hasWirecutter) = 1; + }; + + class rhs_rk_sht_30_emr; + class rhs_rk_sht_30_emr_engineer: rhs_rk_sht_30_emr { + EGVAR(logistics_wirecutter,hasWirecutter) = 1; + }; + + class rhs_rk_sht_30_olive; + class rhs_rk_sht_30_olive_engineer: rhs_rk_sht_30_olive { + EGVAR(logistics_wirecutter,hasWirecutter) = 1; + }; + + // Interaction positions for static weapons + // Not a fan of this style of inheritance but it's less of a headache in this case + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class StaticMGWeapon: StaticWeapon {}; + class AT_01_base_F: StaticMGWeapon {}; + class StaticMortar: StaticWeapon {}; + + class rhs_SPG9_base: AT_01_base_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + }; + }; + }; + class rhs_Kornet_Base: AT_01_base_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "tripod"; + }; + }; + }; + + class rhs_2b14_82mm_Base: StaticMortar { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = ""; // no good selections for this mortar + }; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/CfgWeapons.hpp b/addons/compat_rhs_afrf3/CfgWeapons.hpp new file mode 100644 index 0000000000..17aa535a79 --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgWeapons.hpp @@ -0,0 +1,170 @@ +class CfgWeapons { + class hgun_Rook40_F; + class rhs_weap_pya: hgun_Rook40_F { + ACE_barrelTwist = 254.0; + ACE_barrelLength = 111.76; + }; + class Pistol_Base_F; + class rhs_weap_makarov_pm: rhs_weap_pya { + ACE_barrelTwist = 240.03; + ACE_barrelLength = 93.472; + }; + class rhs_weap_ak74m_Base_F; + class rhs_weap_ak74m: rhs_weap_ak74m_Base_F { + ACE_RailHeightAboveBore = -0.456233; + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class rhs_weap_ak103_base; + class rhs_weap_ak104: rhs_weap_ak103_base { + ACE_barrelLength = 314.96; + }; + class rhs_weap_ak105: rhs_weap_ak74m { + ACE_barrelLength = 314.96; + }; + class rhs_weap_akm: rhs_weap_ak74m { + ACE_RailHeightAboveBore = -0.456233;//from rhs_weap_akmn and rhs_weap_ak74m + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class rhs_weap_aks74; + class rhs_weap_aks74u: rhs_weap_aks74 { + ACE_RailHeightAboveBore = -0.30262; + ACE_barrelTwist = 160.02; + ACE_barrelLength = 210.82; + }; + class rhs_weap_asval: rhs_weap_ak74m { + ACE_barrelTwist = 210.82; + ACE_barrelLength = 200.66; + }; + class rhs_weap_svd: rhs_weap_ak74m { + ACE_RailHeightAboveBore = -0.617396; + ACE_barrelTwist = 238.76; + ACE_barrelLength = 619.76; + }; + class rhs_weap_svdp; + class rhs_weap_svdp_npz: rhs_weap_svdp { + ACE_RailHeightAboveBore = 4.3348; + }; + class rhs_weap_svdp_wd: rhs_weap_svdp { + ACE_RailHeightAboveBore = -0.617396; + }; + class rhs_weap_svdp_wd_npz: rhs_weap_svdp_wd { + ACE_RailHeightAboveBore = 4.3348; + }; + class rhs_weap_svds: rhs_weap_svdp { + ACE_RailHeightAboveBore = -0.617396; + ACE_barrelTwist = 238.76; + ACE_barrelLength = 563.88; + }; + class rhs_weap_svds_npz: rhs_weap_svds { + ACE_RailHeightAboveBore = 4.3348; + }; + class rhs_weap_rpk_base; + class rhs_weap_rpk74_base: rhs_weap_rpk_base { + ACE_barrelLength = 590.00; + ACE_barrelTwist = 195.072; + }; + class rhs_pkp_base; + class rhs_weap_pkp: rhs_pkp_base { + ACE_barrelTwist = 240.03; + ACE_barrelLength = 657.86; + }; + class rhs_weap_pkm: rhs_weap_pkp { + EGVAR(overheating,allowSwapBarrel) = 1; + ACE_barrelTwist = 240.03; + ACE_barrelLength = 645.16; + }; + class rhs_weap_orsis_Base_F; + class rhs_weap_t5000: rhs_weap_orsis_Base_F { // http://en.orsis.com/production/catalog/19046/ + ACE_barrelTwist = 254.0; // 1:10" + ACE_barrelLength = 698.5; // 27.5" + ACE_RailHeightAboveBore = 2.12198; + }; + + class Launcher_Base_F; + class rhs_weap_rpg7: Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,offset) = 0.9; + }; + + class rhs_weap_rpg26: Launcher_Base_F { + EGVAR(overpressure,range) = 10; + EGVAR(overpressure,angle) = 50; + EGVAR(overpressure,offset) = 0.65; + }; + + class rhs_weap_rpg18: rhs_weap_rpg26 { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,offset) = 1; + }; + + class rhs_weap_strela; + class rhs_weap_igla: rhs_weap_strela { + EGVAR(overpressure,range) = 6; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.6; + EGVAR(overpressure,offset) = 1.65; + }; + + #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; + class H_HelmetB; + class rhs_tsh4: H_HelmetB { + HEARING_PROTECTION_VICCREW + }; + + class rhs_6b47_bare; + class rhs_6b48: rhs_6b47_bare { + HEARING_PROTECTION_VICCREW + }; + + 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 + }; + + class rhs_6b47; + class rhs_6b47_6m2: rhs_6b47 { + HEARING_PROTECTION_PELTOR + }; + class rhs_6b47_6m2_1: rhs_6b47 { + HEARING_PROTECTION_PELTOR + }; + + class rhs_6m2: H_HelmetB { + HEARING_PROTECTION_PELTOR + }; + + class rhs_weap_d81; + class rhs_weap_2a70: rhs_weap_d81 { // "Low pressure" 100mm cannon + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,damage) = 0.5; + }; + class cannon_120mm; + class rhs_weap_2a28_base: cannon_120mm { // "Low pressure" + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,damage) = 0.5; + }; + + class rhs_uniform_flora; + class rhs_uniform_df15: rhs_uniform_flora { + ACE_GForceCoef = 0.8; + }; +}; diff --git a/optionals/compat_rhs_afrf3/XEH_PREP.hpp b/addons/compat_rhs_afrf3/XEH_PREP.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_PREP.hpp rename to addons/compat_rhs_afrf3/XEH_PREP.hpp diff --git a/optionals/compat_rhs_afrf3/XEH_postInit.sqf b/addons/compat_rhs_afrf3/XEH_postInit.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_postInit.sqf rename to addons/compat_rhs_afrf3/XEH_postInit.sqf diff --git a/optionals/compat_rhs_afrf3/XEH_preInit.sqf b/addons/compat_rhs_afrf3/XEH_preInit.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_preInit.sqf rename to addons/compat_rhs_afrf3/XEH_preInit.sqf diff --git a/optionals/compat_rhs_usf3/XEH_preStart.sqf b/addons/compat_rhs_afrf3/XEH_preStart.sqf similarity index 100% rename from optionals/compat_rhs_usf3/XEH_preStart.sqf rename to addons/compat_rhs_afrf3/XEH_preStart.sqf diff --git a/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazineGroups.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp rename to addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazineGroups.hpp diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazines.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazines.hpp new file mode 100644 index 0000000000..d94f12326b --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazines.hpp @@ -0,0 +1,143 @@ +class CfgMagazines { + // RHS magazines for crew handled ammo + class rhs_mag_9M131M; + class GVAR(mag_9M131M): rhs_mag_9M131M { + scope = 2; + displayName = CSTRING(mag_9M131M_displayName); + 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; + displayName = CSTRING(mag_9M131F_displayName); + 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; + displayName = CSTRING(mag_9m133_displayName); + 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; + displayName = CSTRING(mag_9m133f_displayName); + 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; + displayName = CSTRING(mag_9m1331_displayName); + 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; + displayName = CSTRING(mag_9m133m2_displayName); + 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; + displayName = CSTRING(mag_PG9V_displayName); + 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; + displayName = CSTRING(mag_PG9N_displayName); + 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; + displayName = CSTRING(mag_PG9VNT_displayName); + 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; + displayName = CSTRING(mag_OG9VM_displayName); + 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; + displayName = CSTRING(mag_OG9V_displayName); + 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_VOG30_30; + class GVAR(mag_VOG30_30): RHS_mag_VOG30_30 { + scope = 2; + displayName = CSTRING(mag_VOG30_30_displayName); + 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_GPD30_30; + class GVAR(mag_GPD30_30): RHS_mag_GPD30_30 { + scope = 2; + displayName = CSTRING(mag_GPD30_30_displayName); + 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; + displayName = CSTRING(mag_VOG17m_30_displayName); + 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); + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp new file mode 100644 index 0000000000..fd889cd096 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp @@ -0,0 +1,114 @@ +class CfgVehicles { + class AT_01_base_F; + class StaticMortar; + class StaticMGWeapon; + class StaticGrenadeLauncher; + + class rhs_SPG9_base: AT_01_base_F { + // 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_SPG9M_base: rhs_SPG9_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleWeapon = QGVAR(spg9m_carry); + }; + }; + + class rhs_Kornet_Base: AT_01_base_F { + // 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_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; + }; + }; + + class rhs_2b14_82mm_Base: StaticMortar { + // 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 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; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp new file mode 100644 index 0000000000..1e8f4dbdfd --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp @@ -0,0 +1,191 @@ +class CfgWeapons { + 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 Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class GVAR(2b14_carry): Launcher_Base_F { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/config.cpp new file mode 100644 index 0000000000..4018785e82 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {QGVAR(2b14_carry), QGVAR(nsv_carry), QGVAR(kord_carry), QGVAR(ags30_carry), QGVAR(spg9_carry), QGVAR(spg9m_carry), QGVAR(metis_carry), QGVAR(kornet_carry)}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_csw" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgMagazineGroups.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/script_component.hpp new file mode 100644 index 0000000000..77a1b484cb --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT csw +#define SUBCOMPONENT_BEAUTIFIED Crew-Served Weapons +#include "..\script_component.hpp" + +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/stringtable.xml b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/stringtable.xml new file mode 100644 index 0000000000..ba168178d9 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/stringtable.xml @@ -0,0 +1,201 @@ + + + + + [CSW] VOG-17M + [CSW] VOG-17M + [CSW] VOG-17M + [CSW] VOG-17M + [CSW] VOG-17M + [CSW] WOG-17M + [CSW] VOG-17M + [CSW] ВОГ-17М + [CSW] VOG-17M + [CSW] VOG-17M + [CSW] VOG-17M + [班组] VOG-17M + + + [CSW] VOG-30 + [CSW] VOG-30 + [CSW] VOG-30 + [CSW] VOG-30 + [CSW] VOG-30 + [CSW] WOG-30 + [CSW] VOG-30 + [CSW] ВОГ-30 + [CSW] VOG-30 + [CSW] VOG-30 + [CSW] VOG-30 + [班组] VOG-30 + + + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] ГПД-30 + [CSW] GPD-30 + [CSW] GPD-30 + [CSW] GPD-30 + [班组] GPD-30 + + + [CSW] ATGM 9M131M + [CSW] ATGM 9M131M + [CSW] ATGM 9M131M + [CSW] ATGM 9M131M + [CSW] ATGM 9M131M + [CSW] ATGM 9M131M + [CSW] ATGM 9M131M + [CSW] ПТРК 9М131М + [CSW] ATGM 9M131M + [CSW] 9M131M 대전차미사일 + [CSW] ATGM 9M131M + [班组] 9M131M 反坦克导弹 + + + [CSW] ATGM 9M131F + [CSW] ATGM 9M131F + [CSW] ATGM 9M131F + [CSW] ATGM 9M131F + [CSW] ATGM 9M131F + [CSW] ATGM 9M131F + [CSW] ATGM 9M131F + [CSW] ПТРК 9М131Ф + [CSW] ATGM 9M131F + [CSW] 9M131F 대전차미사일 + [CSW] ATGM 9M131F + [班组] 9M131F 反坦克导弹 + + + [CSW] ATGM 9M133F + [CSW] ATGM 9M133F + [CSW] ATGM 9M133F + [CSW] ATGM 9M133F + [CSW] ATGM 9M133F + [CSW] ATGM 9M133F + [CSW] ATGM 9M133F + [CSW] ПТРК 9М133Ф + [CSW] ATGM 9M133F + [CSW] 9M133F 대전차미사일 + [CSW] ATGM 9M133F + [班组] 9M133F 反坦克导弹 + + + [CSW] ATGM 9M133 + [CSW] ATGM 9M133 + [CSW] ATGM 9M133 + [CSW] ATGM 9M133 + [CSW] ATGM 9M133 + [CSW] ATGM 9M133 + [CSW] ATGM 9M133 + [CSW] ПТРК 9М133 + [CSW] ATGM 9M133 + [CSW] 9M133 대전차미사일 + [CSW] ATGM 9M133 + [班组] 9M133 反坦克导弹 + + + [CSW] ATGM 9M133-1 + [CSW] ATGM 9M133-1 + [CSW] ATGM 9M133-1 + [CSW] ATGM 9M133-1 + [CSW] ATGM 9M133-1 + [CSW] ATGM 9M133-1 + [CSW] ATGM 9M133-1 + [CSW] ПТРК 9М133-1 + [CSW] ATGM 9M133-1 + [CSW] 9M133-1 대전차미사일 + [CSW] ATGM 9M133-1 + [班组] 9M133-1 反坦克导弹 + + + [CSW] ATGM 9M133M2 + [CSW] ATGM 9M133M2 + [CSW] ATGM 9M133M2 + [CSW] ATGM 9M133M2 + [CSW] ATGM 9M133M2 + [CSW] ATGM 9M133M2 + [CSW] ATGM 9M133M2 + [CSW] ПТРК 9М133M2 + [CSW] ATGM 9M133M2 + [CSW] 9M133M2 대전차미사일 + [CSW] ATGM 9M133M2 + [班组] 9M133M2 反坦克导弹 + + + [CSW] HEAT PG-9V + [CSW] HEAT PG-9V + [CSW] HEAT PG-9V + [CSW] AEAT PG-9V + [CSW] HEAT PG-9V + [CSW] HEAT PG-9V + [CSW] HEAT PG-9V + [CSW] ПГ-9В + [CSW] HEAT PG-9V + [CSW] PG-9V 대전차고폭탄 + [CSW] HEAT PG-9V + [班组] PG-9V 破甲弹 + + + [CSW] HEAT PG-9N + [CSW] HEAT PG-9N + [CSW] HEAT PG-9N + [CSW] AEAT PG-9N + [CSW] HEAT PG-9N + [CSW] HEAT PG-9N + [CSW] HEAT PG-9N + [CSW] ПГ-9Н + [CSW] HEAT PG-9N + [CSW] PG-9N 대전차고폭탄 + [CSW] HEAT PG-9N + [班组] PG-9N 破甲弹 + + + [CSW] HEAT PG-9VNT + [CSW] HEAT PG-9VNT + [CSW] HEAT PG-9VNT + [CSW] AEAT PG-9VNT + [CSW] HEAT PG-9VNT + [CSW] HEAT PG-9VNT + [CSW] HEAT PG-9VNT + [CSW] ПГ-9ВНТ + [CSW] HEAT PG-9VNT + [CSW] PG-9VNT 대전차고폭탄 + [CSW] HEAT PG-9VNT + [班组] PG-9VN 破甲弹 + + + [CSW] HE-FRAG OG-9V + [CSW] HE-FRAG OG-9V + [CSW] HE-FRAG OG-9V + [CSW] AE-FRAG OG-9V + [CSW] HE-FRAG OG-9V + [CSW] HE-FRAG OG-9V + [CSW] HE-FRAG OG-9V + [CSW] ОГ-9В + [CSW] HE-FRAG OG-9V + [CSW] OG-9V 고폭파편탄 + [CSW] HE-FRAG OG-9V + [班组] OG-9V 高爆破片弹 + + + [CSW] HE-FRAG OG-9VM + [CSW] HE-FRAG OG-9VM + [CSW] HE-FRAG OG-9VM + [CSW] AE-FRAG OG-9VM + [CSW] HE-FRAG OG-9VM + [CSW] HE-FRAG OG-9VM + [CSW] HE-FRAG OG-9VM + [CSW] ОГ-9ВМ + [CSW] HE-FRAG OG-9VM + [CSW] OG-9VM 고폭파편탄 + [CSW] HE-FRAG OG-9VM + [班组] OG-9VM 高爆破片弹 + + + diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgAmmo.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..fd994e3f99 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgAmmo.hpp @@ -0,0 +1,50 @@ +class CfgAmmo { + // ACE Explosives + class MineBase; + class rhs_mine_tm62m_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.005, 0.025, 0.06}; + }; + + class rhs_mine_pmn2_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.012}; + }; + + class ATMine_Range_Ammo; + class rhs_ammo_ptm1: ATMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.17, 0.02}; + }; + + class APERSMine_Range_Ammo; + class rhs_ammo_pfm1: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.015, -0.018, 0}; + }; + + class PipeBombBase; + class rhs_ec75_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.04, 0.02}; + }; + + class rhs_ec200_ammo: rhs_ec75_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.05, 0.008}; + }; + + class rhs_ec400_ammo: rhs_ec75_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.03, 0.02}; + }; + + class rhs_mine_msk40p_white_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.025, 0, 0.4}; + }; + + class rhs_mine_sm320_white_ammo: rhs_mine_msk40p_white_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.01, 0, 0.25}; + }; + + class rhs_mine_ozm72_a_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.125, 0.11}; + }; + + class rhs_mine_ozm72_c_ammo: rhs_mine_ozm72_a_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.015, 0.12}; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..4f8e808bd5 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp @@ -0,0 +1,147 @@ +class CfgMagazines { + // ACE Explosives + class ATMine_Range_Mag; + class rhs_mine_tm62m_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_tm62m); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.09; + }; + }; + }; + + class rhs_mine_pmn2_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pmn2); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; + }; + + class rhs_mag_mine_ptm1: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ptm1); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.04; + }; + }; + }; + + class rhs_mag_mine_pfm1: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pfm1); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; + }; + + class rhs_ec75_mag: ATMine_Range_Mag { + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,SetupObject) = QEGVAR(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 { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75_sand); + }; + + class rhs_ec200_mag: rhs_ec75_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200); + }; + + class rhs_ec200_sand_mag: rhs_ec200_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200_sand); + }; + + class rhs_ec400_mag: rhs_ec75_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400); + }; + + class rhs_ec400_sand_mag: rhs_ec400_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400_sand); + }; + + class rhs_mine_msk40p_white_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(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 { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_red); + }; + + class rhs_mine_msk40p_green_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_green); + }; + + class rhs_mine_msk40p_blue_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_blue); + }; + + class rhs_mine_sm320_white_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(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 { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_red); + }; + + class rhs_mine_sm320_green_mag: rhs_mine_sm320_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_green); + }; + + class rhs_mine_ozm72_a_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(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 { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_b); + }; + + class rhs_mine_ozm72_c_mag: rhs_mine_ozm72_a_mag { + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,SetupObject) = QEGVAR(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/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..8e874d8d11 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgVehicles.hpp @@ -0,0 +1,164 @@ +class CfgVehicles { + // ACE Explosives + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_tm62m): EGVAR(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 EGVAR(explosives,Place_rhs_mine_pmn2): EGVAR(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 EGVAR(explosives,Place_rhs_mine_ptm1): EGVAR(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 EGVAR(explosives,Place_rhs_mine_pfm1): EGVAR(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 EGVAR(explosives,Place_rhs_ec75): EGVAR(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 EGVAR(explosives,Place_rhs_ec75_sand): EGVAR(explosives,Place_rhs_ec75) { + displayName = "$STR_RHS_CFGMAGAZINES_EC75_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_sand_e"; + }; + + class EGVAR(explosives,Place_rhs_ec200): EGVAR(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 EGVAR(explosives,Place_rhs_ec200_sand): EGVAR(explosives,Place_rhs_ec200) { + displayName = "$STR_RHS_CFGMAGAZINES_EC200_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_sand_e"; + }; + + class EGVAR(explosives,Place_rhs_ec400): EGVAR(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 EGVAR(explosives,Place_rhs_ec400_sand): EGVAR(explosives,Place_rhs_ec400) { + displayName = "$STR_RHS_CFGMAGAZINES_EC400_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_sand_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_msk40p_white): EGVAR(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 EGVAR(explosives,Place_rhs_mine_msk40p_red): EGVAR(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 EGVAR(explosives,Place_rhs_mine_msk40p_green): EGVAR(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 EGVAR(explosives,Place_rhs_mine_msk40p_blue): EGVAR(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 EGVAR(explosives,Place_rhs_mine_sm320_white): EGVAR(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 EGVAR(explosives,Place_rhs_mine_sm320_red): EGVAR(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 EGVAR(explosives,Place_rhs_mine_sm320_green): EGVAR(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 EGVAR(explosives,Place_rhs_mine_ozm72_a): EGVAR(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 EGVAR(explosives,Place_rhs_mine_ozm72_b): EGVAR(explosives,Place_rhs_mine_ozm72_a) { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72B"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_b_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_ozm72_c): EGVAR(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/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/config.cpp new file mode 100644 index 0000000000..c0861a5872 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/script_component.hpp new file mode 100644 index 0000000000..a697aad7f3 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT explosives +#define SUBCOMPONENT_BEAUTIFIED Explosives +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/CfgVehicles.hpp new file mode 100644 index 0000000000..8b8e76f29c --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/CfgVehicles.hpp @@ -0,0 +1,65 @@ +class CfgVehicles { + class Air; + class Helicopter: Air {}; + class Helicopter_Base_F: Helicopter {}; + class Helicopter_Base_H: Helicopter_Base_F { + class EventHandlers; + }; + class Heli_Light_02_base_F: Helicopter_Base_H {}; + class RHS_Mi8_base: Heli_Light_02_base_F { + EGVAR(fastroping,enabled) = 0; + class EventHandlers: EventHandlers { + class RHS_EventHandlers; + }; + }; + + class RHS_Mi8amt_base: RHS_Mi8_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_arf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_arf3,onPrepare); + class UserActions { + class openDoor; + class closeDoor_L: openDoor { + condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + }; + }; + + class EventHandlers: EventHandlers { + class RHS_EventHandlers: RHS_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); + }; + }; + }; + + class RHS_Mi8_VVS_Base: RHS_Mi8_base {}; + class RHS_Mi8mt_vvs: RHS_Mi8_VVS_Base {}; + class RHS_Mi8mt_Cargo_vvs: RHS_Mi8mt_vvs { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_arf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_arf3,onPrepare); + + class UserActions { + class openDoor_L; + class closeDoor_L: openDoor_L { + condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + }; + }; + + class EventHandlers: EventHandlers { + class RHS_EventHandlers: RHS_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); + }; + }; + }; + + class Heli_Attack_02_base_F: Helicopter_Base_F {}; + class RHS_Ka52_base: Heli_Attack_02_base_F { + EGVAR(fastroping,enabled) = 0; + }; + + class RHS_Mi24_base: Heli_Attack_02_base_F { + EGVAR(fastroping,enabled) = 0; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/config.cpp new file mode 100644 index 0000000000..8809558aa6 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_fastroping" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/script_component.hpp new file mode 100644 index 0000000000..77632a2484 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT fastroping +#define SUBCOMPONENT_BEAUTIFIED Fastroping +#include "..\script_component.hpp" + +#include "\z\ace\addons\fastroping\script_macros.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/CfgWeapons.hpp new file mode 100644 index 0000000000..6720519685 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/CfgWeapons.hpp @@ -0,0 +1,8 @@ +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; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/config.cpp new file mode 100644 index 0000000000..4a349ababe --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_nightvision" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/script_component.hpp new file mode 100644 index 0000000000..14bc3772cc --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT nightvision +#define SUBCOMPONENT_BEUTIFIEID Night Vision +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/CfgVehicles.hpp new file mode 100644 index 0000000000..047e264c6e --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/CfgVehicles.hpp @@ -0,0 +1,10 @@ +class CfgVehicles { + class RHS_Ural_Support_MSV_Base_01; + class RHS_Ural_Fuel_MSV_01: RHS_Ural_Support_MSV_Base_01 { + transportFuel = 0; + }; + class rhs_kraz255b1_base; + class rhs_kraz255b1_fuel_base: rhs_kraz255b1_base { + transportFuel = 0; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/config.cpp new file mode 100644 index 0000000000..5101a383a3 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_refuel" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/script_component.hpp new file mode 100644 index 0000000000..b58db9432d --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT refuel +#define SUBCOMPONENT_BEAUTIFIED Refuel +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/CfgWeapons.hpp new file mode 100644 index 0000000000..c6666f0192 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/CfgWeapons.hpp @@ -0,0 +1,34 @@ +class CfgWeapons { + class rhs_acc_sniper_base; + class rhs_acc_pso1m2: rhs_acc_sniper_base { + ACE_ScopeHeightAboveRail = 4.41386; + ACE_ScopeAdjust_Vertical[] = {0, 0}; + ACE_ScopeAdjust_Horizontal[] = {-10, 10}; + ACE_ScopeAdjust_VerticalIncrement = 0.5; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + }; + class rhs_acc_pso1m21: rhs_acc_pso1m2 { + ACE_ScopeHeightAboveRail = 7.75566; + ACE_ScopeAdjust_Vertical[] = {0, 0}; + ACE_ScopeAdjust_Horizontal[] = {-10, 10}; + ACE_ScopeAdjust_VerticalIncrement = 0.5; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + }; + class ItemCore; + class InventoryOpticsItem_Base_F; + class rhs_acc_dh520x56: ItemCore { // http://nightvision.ru/catalog/4/item/35 + ACE_ScopeHeightAboveRail = 4.71476; + ACE_ScopeAdjust_Vertical[] = {0, 33}; + ACE_ScopeAdjust_Horizontal[] = {-9, 9}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class dedal_520 { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/config.cpp new file mode 100644 index 0000000000..6ca402478f --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_scopes" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/script_component.hpp new file mode 100644 index 0000000000..613b4322f9 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT scopes +#define SUBCOMPONENT_BEAUTIFIED Scopes +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_afrf3/config.cpp b/addons/compat_rhs_afrf3/config.cpp new file mode 100644 index 0000000000..3497a8e956 --- /dev/null +++ b/addons/compat_rhs_afrf3/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhs_main_loadorder"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/functions/fnc_onCut.sqf b/addons/compat_rhs_afrf3/functions/fnc_onCut.sqf new file mode 100644 index 0000000000..4acb91ae0a --- /dev/null +++ b/addons/compat_rhs_afrf3/functions/fnc_onCut.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Function for closing doors and retracting the hooks for RHS USF helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before cutting ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_afrf3_fnc_onCut + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; +_vehicle animateDoor ["LeftDoor", 0]; + +2 diff --git a/addons/compat_rhs_afrf3/functions/fnc_onPrepare.sqf b/addons/compat_rhs_afrf3/functions/fnc_onPrepare.sqf new file mode 100644 index 0000000000..2a11bbd779 --- /dev/null +++ b/addons/compat_rhs_afrf3/functions/fnc_onPrepare.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Function for opening doors and extending the hook for most vanilla helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before deploying ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_afrf3_fnc_onPrepare + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; +_vehicle animateDoor ["LeftDoor", 1]; + +2 diff --git a/addons/compat_rhs_afrf3/script_component.hpp b/addons/compat_rhs_afrf3/script_component.hpp new file mode 100644 index 0000000000..58681cf6a0 --- /dev/null +++ b/addons/compat_rhs_afrf3/script_component.hpp @@ -0,0 +1,10 @@ +#define COMPONENT compat_rhs_afrf3 +#define COMPONENT_BEAUTIFIED RHS AFRF Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" + +// Backwards compatibility +#undef GVAR +#define GVAR(var) TRIPLES(PREFIX,COMPONENT,var) diff --git a/optionals/compat_rhs_gref3/$PBOPREFIX$ b/addons/compat_rhs_gref3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_gref3/$PBOPREFIX$ rename to addons/compat_rhs_gref3/$PBOPREFIX$ diff --git a/addons/compat_rhs_gref3/CfgAmmo.hpp b/addons/compat_rhs_gref3/CfgAmmo.hpp new file mode 100644 index 0000000000..566f7c87fe --- /dev/null +++ b/addons/compat_rhs_gref3/CfgAmmo.hpp @@ -0,0 +1,44 @@ +class CfgAmmo { + class GrenadeHand; + class rhsgref_ammo_rkg3em: GrenadeHand { // Scripted shaped charge + ace_frag_force = 0; + }; + + class BulletBase; + class rhs_ammo_762x25_Ball: BulletBase { + ACE_caliber = 7.874; + ACE_bulletLength = 13.856; + ACE_bulletMass = 5.5728; + 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.17}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {360, 380, 400}; + ACE_barrelLengths[] = {101.6, 152.4, 228.6}; + }; + + class rhs_ammo_792x57_Ball: BulletBase { + ACE_caliber = 8.077; + ACE_bulletLength = 28.651; + ACE_bulletMass = 12.7008; + 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.315}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {785, 800, 815}; + ACE_barrelLengths[] = {508.0, 599.948, 660.4}; + }; + + class rhs_ammo_3bk12_penetrator; + class rhsgref_ammo_rkg3em_penetrator: rhs_ammo_3bk12_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_rpg75_penetrator: rhs_ammo_3bk12_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_panzerfaust60_penetrator: rhs_ammo_3bk12_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; +}; diff --git a/addons/compat_rhs_gref3/CfgEventHandlers.hpp b/addons/compat_rhs_gref3/CfgEventHandlers.hpp new file mode 100644 index 0000000000..865276cfba --- /dev/null +++ b/addons/compat_rhs_gref3/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/addons/compat_rhs_gref3/CfgMagazines.hpp b/addons/compat_rhs_gref3/CfgMagazines.hpp new file mode 100644 index 0000000000..f5e84fca6c --- /dev/null +++ b/addons/compat_rhs_gref3/CfgMagazines.hpp @@ -0,0 +1,9 @@ +class CfgMagazines { + class CA_Magazine; + class rhsgref_50Rnd_792x57_SmE_drum: CA_Magazine { // drum, but still just a belt + ACE_isBelt = 1; + }; + class rhsgref_296Rnd_792x57_SmE_belt: CA_Magazine { + ACE_isBelt = 1; + }; +}; diff --git a/addons/compat_rhs_gref3/CfgVehicles.hpp b/addons/compat_rhs_gref3/CfgVehicles.hpp new file mode 100644 index 0000000000..89692c8300 --- /dev/null +++ b/addons/compat_rhs_gref3/CfgVehicles.hpp @@ -0,0 +1,18 @@ +class CfgVehicles { + class Rubber_duck_base_F; + class rhsgref_canoe_base: Rubber_duck_base_F { + // Canoes are propelled by paddlers + EGVAR(refuel,canReceive) = 0; + }; + + class Wheeled_APC_F; + class rhsgref_BRDM2: Wheeled_APC_F { + GVAR(hullDetonationProb) = 0.2; + GVAR(turretDetonationProb) = 0.2; + GVAR(engineDetonationProb) = 0; + GVAR(hullFireProb) = 0.7; + GVAR(turretFireProb) = 0.7; + GVAR(engineFireProb) = 0.7; + GVAR(detonationDuringFireProb) = 0.5; + }; +}; diff --git a/addons/compat_rhs_gref3/CfgWeapons.hpp b/addons/compat_rhs_gref3/CfgWeapons.hpp new file mode 100644 index 0000000000..68c2c08d06 --- /dev/null +++ b/addons/compat_rhs_gref3/CfgWeapons.hpp @@ -0,0 +1,134 @@ +class CfgWeapons { + + // ACE Ballistics + class rhs_weap_kar98k_Base_F; + class rhs_weap_kar98k: rhs_weap_kar98k_Base_F { + 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; + }; + + class rhs_weap_m38_rail; + class rhs_weap_mosin_sbr: rhs_weap_m38_rail { + 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; + }; + + class rhs_weap_m92: rhs_weap_m70_base { + ACE_barrelTwist = 240; + ACE_barrelLength = 254; + }; + + class rhs_weap_m76: rhs_weap_m70_base { + ACE_barrelTwist = 250; + ACE_barrelLength = 200; + }; + + class rhs_weap_m21_base: rhs_weap_m70_base { + ACE_barrelLength = 460; + ACE_barrelTwist = 177.8; + }; + + class rhs_weap_m21s: rhs_weap_m21_base { + ACE_barrelLength = 375; + }; + + class rhs_weap_m21a_pr; + class rhs_weap_m21s_pr: rhs_weap_m21a_pr { + ACE_barrelLength = 375; + }; + + class Rifle_Base_F; + 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; + }; + + 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_vhs2_base { + ACE_barrelTwist = 177.8; + ACE_barrelLength = 500.0; + }; + class rhs_weap_vhsd2_bg: rhs_weap_vhs2_base { + 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 { + EGVAR(overheating,closedBolt) = 0; + EGVAR(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; + }; + + class rhs_weap_Izh18: Rifle_Base_F { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + + class rhs_weap_m79: Rifle_Base_F { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class rhs_weap_panzerfaust60: Launcher_Base_F { + EGVAR(overpressure,range) = 6; + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,damage) = 0.4; + }; + + class rhs_weap_rpg75: Launcher_Base_F { + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,offset) = 0.9; + }; +}; diff --git a/optionals/compat_rhs_usf3/XEH_PREP.hpp b/addons/compat_rhs_gref3/XEH_PREP.hpp similarity index 100% rename from optionals/compat_rhs_usf3/XEH_PREP.hpp rename to addons/compat_rhs_gref3/XEH_PREP.hpp diff --git a/optionals/compat_rhs_usf3/XEH_preInit.sqf b/addons/compat_rhs_gref3/XEH_preInit.sqf similarity index 100% rename from optionals/compat_rhs_usf3/XEH_preInit.sqf rename to addons/compat_rhs_gref3/XEH_preInit.sqf diff --git a/optionals/compat_sog/XEH_preStart.sqf b/addons/compat_rhs_gref3/XEH_preStart.sqf similarity index 100% rename from optionals/compat_sog/XEH_preStart.sqf rename to addons/compat_rhs_gref3/XEH_preStart.sqf diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp new file mode 100644 index 0000000000..220aec4c24 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp @@ -0,0 +1,22 @@ +class CfgVehicles { + 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); + }; + }; +}; diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp new file mode 100644 index 0000000000..15ff9488ca --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp @@ -0,0 +1,34 @@ +class CfgWeapons { + 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/addons/compat_rhs_gref3/compat_rhs_gref3_csw/config.cpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/config.cpp new file mode 100644 index 0000000000..2628bffcd5 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {QGVAR(dshkm_carry)}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsgref_main_loadorder", + "ace_csw" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/script_component.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/script_component.hpp new file mode 100644 index 0000000000..77a1b484cb --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT csw +#define SUBCOMPONENT_BEAUTIFIED Crew-Served Weapons +#include "..\script_component.hpp" + +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..0808c7ff1d --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp @@ -0,0 +1,83 @@ +class CfgAmmo { + 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/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..ce882e1825 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp @@ -0,0 +1,195 @@ +class CfgMagazines { + 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/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..9e68a4a524 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgVehicles.hpp @@ -0,0 +1,193 @@ +class CfgVehicles { + 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/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/config.cpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/config.cpp new file mode 100644 index 0000000000..e1e71ebbfa --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsgref_main_loadorder", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/script_component.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/script_component.hpp new file mode 100644 index 0000000000..a697aad7f3 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT explosives +#define SUBCOMPONENT_BEAUTIFIED Explosives +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/CfgVehicles.hpp new file mode 100644 index 0000000000..39bda1b8b6 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/CfgVehicles.hpp @@ -0,0 +1,59 @@ +class CfgVehicles { + class Helicopter_Base_H; + class rhs_uh1h_base: Helicopter_Base_H { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.95, -0.26}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_gref3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_gref3,onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + }; + + class rhs_uh1h_hidf: rhs_uh1h_base { + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class rhs_uh1h_hidf_unarmed: rhs_uh1h_hidf { + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; + class UserActions { + class Open_Side_Doors; + + class Close_Side_Doors: Open_Side_Doors { + condition = QUOTE([ARR_2(this,'close_cargo_doors')] call EFUNC(compat_rhs_gref3,canCloseDoor)); + }; + }; + + class Attributes: Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class rhs_uh1h_idap: rhs_uh1h_base { + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; + class UserActions { + class Open_Side_Doors; + + class Close_Side_Doors: Open_Side_Doors { + condition = QUOTE([ARR_2(this,'close_cargo_doors')] call EFUNC(compat_rhs_gref3,canCloseDoor)); + }; + }; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class rhs_uh1h_un: rhs_uh1h_base { + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; + class UserActions { + class Open_Side_Doors; + class Close_Side_Doors: Open_Side_Doors { + condition = QUOTE([ARR_2(this,'close_cargo_doors')] call EFUNC(compat_rhs_gref3,canCloseDoor)); + }; + }; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; +}; diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/config.cpp b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/config.cpp new file mode 100644 index 0000000000..b057aa1267 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsgref_main_loadorder", + "ace_fastroping" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/script_component.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/script_component.hpp new file mode 100644 index 0000000000..77632a2484 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT fastroping +#define SUBCOMPONENT_BEAUTIFIED Fastroping +#include "..\script_component.hpp" + +#include "\z\ace\addons\fastroping\script_macros.hpp" diff --git a/addons/compat_rhs_gref3/config.cpp b/addons/compat_rhs_gref3/config.cpp new file mode 100644 index 0000000000..f2e7aeacde --- /dev/null +++ b/addons/compat_rhs_gref3/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhsgref_main_loadorder"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror", "Ruthberg", "Anton"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf b/addons/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf new file mode 100644 index 0000000000..d874e1e23d --- /dev/null +++ b/addons/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Checks if the door can be closed. + * + * Arguments: + * 0: Helicopter + * 1: Door + * + * Return Value: + * Door can be closed + * + * Example: + * [_vehicle, "DoorLB"] call ace_compat_rhs_gref3_fnc_canCloseDoor + * + * Public: No + */ + +params ["_vehicle", "_door"]; + +(alive _vehicle) && +{!(_vehicle getVariable [QEGVAR(fastroping,doorsLocked),false])} && +{ + switch (true) do { + case (_vehicle isKindOf "rhs_uh1h_base"): { + ((_vehicle doorPhase _door) == 0) && + {ACE_player in _vehicle} + }; + default { + ((_vehicle doorPhase _door) > 0) && + {ACE_player in _vehicle} + }; + } +} diff --git a/addons/compat_rhs_gref3/functions/fnc_onCut.sqf b/addons/compat_rhs_gref3/functions/fnc_onCut.sqf new file mode 100644 index 0000000000..27b9559b11 --- /dev/null +++ b/addons/compat_rhs_gref3/functions/fnc_onCut.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Function for closing doors and retracting the hooks for RHS USF helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before cutting ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_gref3_fnc_onCut + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; + +private _fries = _vehicle getVariable [QEGVAR(fastroping,FRIES), objNull]; +if !(isNull _fries) then { + _fries animate ["extendHookRight", 0]; + _fries animate ["extendHookLeft", 0]; + [{ + _this animateDoor ["doorRB", 0]; + _this animateDoor ["doorLB", 0]; + _this animate ["doorHandler_R",0]; + _this animate ["doorHandler_L",0]; + _this animateDoor ["close_cargo_doors", 1]; + + }, _vehicle, 2] call CBA_fnc_waitAndExecute; + + 4 +} else { + _vehicle animateDoor ["ramp_anim", 0]; + _vehicle animate ["ramp_bottom",0]; + _vehicle animate ["ramp_top",0]; + + 2 +}; diff --git a/addons/compat_rhs_gref3/functions/fnc_onPrepare.sqf b/addons/compat_rhs_gref3/functions/fnc_onPrepare.sqf new file mode 100644 index 0000000000..da79074aac --- /dev/null +++ b/addons/compat_rhs_gref3/functions/fnc_onPrepare.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Function for opening doors and extending the hook for most vanilla helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before deploying ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_gref3_fnc_onPrepare + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; + +private _waitTime = 2; + +_vehicle animateDoor ["doorRB", 1]; +_vehicle animateDoor ["doorLB", 1]; +_vehicle animate ["doorHandler_R",1]; +_vehicle animate ["doorHandler_L",1]; +_vehicle animateDoor ["ramp_anim", 1]; +_vehicle animate ["ramp_bottom",0.56]; +_vehicle animate ["ramp_top",1]; +_vehicle animateDoor ["close_cargo_doors", 0]; + +private _fries = _vehicle getVariable [QEGVAR(fastroping,FRIES), objNull]; +if !(isNull _fries) then { + [{ + _this animate ["extendHookRight", 1]; + _this animate ["extendHookLeft", 1]; + }, _fries, 2] call CBA_fnc_waitAndExecute; + _waitTime = 4; +}; + +_waitTime diff --git a/addons/compat_rhs_gref3/script_component.hpp b/addons/compat_rhs_gref3/script_component.hpp new file mode 100644 index 0000000000..9ee2dcf965 --- /dev/null +++ b/addons/compat_rhs_gref3/script_component.hpp @@ -0,0 +1,10 @@ +#define COMPONENT compat_rhs_gref3 +#define COMPONENT_BEAUTIFIED RHS GREF Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" + +// Backwards compatibility +#undef GVAR +#define GVAR(var) TRIPLES(PREFIX,COMPONENT,var) diff --git a/optionals/compat_rhs_saf3/$PBOPREFIX$ b/addons/compat_rhs_saf3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_saf3/$PBOPREFIX$ rename to addons/compat_rhs_saf3/$PBOPREFIX$ diff --git a/addons/compat_rhs_saf3/CfgAmmo.hpp b/addons/compat_rhs_saf3/CfgAmmo.hpp new file mode 100644 index 0000000000..e194042490 --- /dev/null +++ b/addons/compat_rhs_saf3/CfgAmmo.hpp @@ -0,0 +1,25 @@ +class CfgAmmo { + // ACE Ballistics + class BulletBase; + class rhs_ammo_792x57_Ball: BulletBase { + ACE_caliber = 8.077; + ACE_bulletLength = 28.651; + ACE_bulletMass = 12.7008; + 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.315}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {785, 800, 815}; + ACE_barrelLengths[] = {508.0, 599.948, 660.4}; + }; + + class rhs_B_762x39_Ball; + class rhssaf_ammo_762x39_m82_api: rhs_B_762x39_Ball { + ACE_Caliber = 7.8994; + ACE_bulletMass = 7.6074; + ACE_bulletLength = 27.2796; + ACE_muzzleVelocities[] = {650, 700, 748}; + ACE_barrelLengths[] = {206.85, 329.62, 412.75}; + }; +}; diff --git a/addons/compat_rhs_saf3/CfgWeapons.hpp b/addons/compat_rhs_saf3/CfgWeapons.hpp new file mode 100644 index 0000000000..3293514e38 --- /dev/null +++ b/addons/compat_rhs_saf3/CfgWeapons.hpp @@ -0,0 +1,83 @@ +class CfgWeapons { + + // ACE Ballistics + class rhs_weap_g36_base; + class rhs_weap_g36c: rhs_weap_g36_base { + ACE_barrelLength = 228; + ACE_barrelTwist = 178; + }; + + class rhs_weap_g36kv: rhs_weap_g36_base { + ACE_barrelLength = 318; + ACE_barrelTwist = 178; + }; + + class rhs_weap_m21_base; + class rhs_weap_m21a: rhs_weap_m21_base { + ACE_barrelLength = 460; + ACE_barrelTwist = 177.8; + }; + + class rhs_weap_m21a_pr: rhs_weap_m21_base { + ACE_barrelLength = 460; + ACE_barrelTwist = 177.8; + }; + + class rhs_weap_m21a_pr_pbg40: rhs_weap_m21_base { + ACE_barrelLength = 460; + ACE_barrelTwist = 177.8; + }; + + class rhs_weap_m21s: rhs_weap_m21_base { + ACE_barrelLength = 375; + ACE_barrelTwist = 177.8; + }; + + class rhs_weap_m21s_pr: rhs_weap_m21a_pr { + ACE_barrelLength = 375; + ACE_barrelTwist = 177.8; + }; + + class Rifle_Base_F; + class rhs_weap_m70_base: Rifle_Base_F { + ACE_barrelLength = 415; + ACE_barrelTwist = 240; + }; + + class rhs_weap_m92: rhs_weap_m70_base { + ACE_barrelLength = 254; + }; + + class rhs_weap_m76: rhs_weap_m70_base { + ACE_barrelLength = 550; + }; + + class Rifle_Long_Base_F; + class rhs_weap_m84: Rifle_Long_Base_F { + ACE_barrelLength = 658; + ACE_barrelTwist = 240; + EGVAR(overheating,allowSwapBarrel) = 1; + }; + + class hgun_P07_F; + class rhs_weap_cz99: hgun_P07_F { + ACE_barrelLength = 108; + }; + + class Uniform_Base; + class rhssaf_uniform_mig29_pilot: Uniform_Base { + ACE_GForceCoef = 0.8; + }; + class rhssaf_uniform_heli_pilot: Uniform_Base { + ACE_GForceCoef = 0.8; + }; + + // Launchers + class Launcher_Base_F; + class rhs_weap_m80: Launcher_Base_F { + EGVAR(overpressure,range) = 8; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.7; + EGVAR(overpressure,offset) = 1.15; + }; +}; diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgAmmo.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..4730718639 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgAmmo.hpp @@ -0,0 +1,33 @@ +class CfgAmmo { + // ACE Explosives + class DirectionalBombBase; + class rhssaf_mine_mrud_a_ammo: DirectionalBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.034, 0, 0.202}; + }; + + class rhssaf_mine_mrud_d_ammo: rhssaf_mine_mrud_a_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.0325, 0, 0.18}; + }; + + class MineBase; + class rhssaf_mine_pma3_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.025}; + }; + + class rhssaf_mine_tma4_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.045}; + }; + + class PipeBombBase; + class rhssaf_tm100_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.055, 0, 0.014}; + }; + + class rhssaf_tm200_ammo: rhssaf_tm100_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {-0.055, 0, 0.018}; + }; + + class rhssaf_tm500_ammo: rhssaf_tm100_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {-0.056, 0, 0.032}; + }; +}; diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..c004f58446 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp @@ -0,0 +1,76 @@ +class CfgMagazines { + + // ACE Explosives + class ATMine_Range_Mag; + class rhssaf_mine_mrud_a_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_a); + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + }; + }; + + class rhssaf_mine_mrud_b_mag: rhssaf_mine_mrud_a_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_b); + }; + + class rhssaf_mine_mrud_c_mag: rhssaf_mine_mrud_a_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_c); + }; + + class rhssaf_mine_mrud_d_mag: rhssaf_mine_mrud_a_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_d); + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + }; + }; + + class rhssaf_mine_pma3_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_pma3); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.026; + }; + }; + }; + + class rhssaf_mine_tma4_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_tma4); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.05; + }; + }; + }; + + class CA_Magazine; + class rhssaf_tm100_mag: CA_Magazine { + useAction = 0; + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm100); + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter"}; + class Timer { + FuseTime = 0.5; + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + }; + }; + + class rhssaf_tm200_mag: rhssaf_tm100_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm200); + }; + + class rhssaf_tm500_mag: rhssaf_tm100_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm500); + }; +}; diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgVehicles.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..33771084b5 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgVehicles.hpp @@ -0,0 +1,90 @@ +class CfgVehicles { + + // ACE Explosives + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + class EGVAR(explosives,Place_rhssaf_mine_mrud_a): EGVAR(explosives,Place) { + displayName = "$STR_RHSSAF_MRUD_A_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_a_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.034, 0, 0.202]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhssaf_mine_mrud_b): EGVAR(explosives,Place_rhssaf_mine_mrud_a) { + displayName = "$STR_RHSSAF_MRUD_B_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_b_e"; + }; + + class EGVAR(explosives,Place_rhssaf_mine_mrud_c): EGVAR(explosives,Place_rhssaf_mine_mrud_a) { + displayName = "$STR_RHSSAF_MRUD_C_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_c_e"; + }; + + class EGVAR(explosives,Place_rhssaf_mine_mrud_d): EGVAR(explosives,Place_rhssaf_mine_mrud_a) { + displayName = "$STR_RHSSAF_MRUD_D_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_d_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.0325, 0, 0.18]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhssaf_mine_pma3): EGVAR(explosives,Place) { + displayName = "$STR_RHSSAF_PMA3_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\pma\rhssaf_pma3_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.02]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhssaf_mine_tma4): EGVAR(explosives,Place) { + displayName = "$STR_RHSSAF_TMA4_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\mines_at\tma4\rhssaf_tma4_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.024]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhssaf_tm100): EGVAR(explosives,Place) { + displayName = "$STR_RHSSAF_TM100_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\tm500\rhssaf_tm100_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.055, 0, 0.014]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhssaf_tm200): EGVAR(explosives,Place) { + displayName = "$STR_RHSSAF_TM200_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\tm500\rhssaf_tm200_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.055, 0, 0.018]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhssaf_tm500): EGVAR(explosives,Place) { + displayName = "$STR_RHSSAF_TM500_DISPLAYNAME"; + model = "\rhssaf\addons\rhssaf_m_explosives\tm500\rhssaf_tm500_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.056, 0, 0.028]"; + }; + }; + }; +}; diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/config.cpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/config.cpp new file mode 100644 index 0000000000..12cf2a9a55 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhssaf_main_loadorder", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/script_component.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/script_component.hpp new file mode 100644 index 0000000000..a697aad7f3 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT explosives +#define SUBCOMPONENT_BEAUTIFIED Explosives +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_saf3/config.cpp b/addons/compat_rhs_saf3/config.cpp new file mode 100644 index 0000000000..75ee4f5530 --- /dev/null +++ b/addons/compat_rhs_saf3/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhssaf_main_loadorder"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rhs_saf3/script_component.hpp b/addons/compat_rhs_saf3/script_component.hpp similarity index 100% rename from optionals/compat_rhs_saf3/script_component.hpp rename to addons/compat_rhs_saf3/script_component.hpp diff --git a/optionals/compat_rhs_usf3/$PBOPREFIX$ b/addons/compat_rhs_usf3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_usf3/$PBOPREFIX$ rename to addons/compat_rhs_usf3/$PBOPREFIX$ diff --git a/addons/compat_rhs_usf3/CfgAmmo.hpp b/addons/compat_rhs_usf3/CfgAmmo.hpp new file mode 100644 index 0000000000..6b885d7e04 --- /dev/null +++ b/addons/compat_rhs_usf3/CfgAmmo.hpp @@ -0,0 +1,392 @@ +class CfgAmmo { + class BulletBase; + class B_127x99_Ball; + class rhsusf_ammo_127x99_M33_Ball: B_127x99_Ball { // B_127x99_Ball (ballistics/CfgAmmo.hpp) + ACE_caliber = 12.954; + ACE_bulletLength = 58.674; + ACE_bulletMass = 41.9256; + ACE_muzzleVelocityVariationSD=0.35; + 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.670}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {900}; + ACE_barrelLengths[] = {736.6}; + }; + class rhsusf_ammo_127x99_mk211: rhsusf_ammo_127x99_M33_Ball { // ACE_127x99_API (ballistics/CfgAmmo.hpp) + ACE_caliber = 12.954; + ACE_bulletLength = 58.674; + ACE_bulletMass = 41.9904; + 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.670}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {900}; + ACE_barrelLengths[] = {736.6}; + EGVAR(vehicle_damage,incendiary) = 1.0; // Raufoss Mk 211 HEIAP (high-explosive, incendiary, armor-piercing) + }; + class B_762x54_Ball; + class rhsusf_B_300winmag: B_762x54_Ball { // ACE_762x67_Ball_Mk248_Mod_1 (ballistics/CfgAmmo.hpp) + ACE_caliber = 7.823; + ACE_bulletLength = 37.821; + ACE_bulletMass = 14.256; + ACE_muzzleVelocityVariationSD=0.3; + ACE_ammoTempMuzzleVelocityShifts[] = {-5.3, -5.1, -4.6, -4.2, -3.4, -2.6, -1.4, -0.3, 1.4, 3.0, 5.2}; + ACE_ballisticCoefficients[] = {0.310}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {847, 867, 877}; + ACE_barrelLengths[] = {508.0, 609.6, 660.4}; + }; + class B_556x45_Ball; + class rhs_ammo_556x45_M855_Ball: B_556x45_Ball { // B_556x45_Ball (ballistics/CfgAmmo.hpp) + ACE_caliber = 5.69; + ACE_bulletLength = 23.012; + ACE_bulletMass = 4.0176; + ACE_ammoTempMuzzleVelocityShifts[] = {-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[] = {0.151}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[] = {210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; + }; + class rhs_ammo_556x45_M855A1_Ball: B_556x45_Ball { // B_556x45_Ball (ballistics/CfgAmmo.hpp) + ACE_caliber = 5.69; + ACE_bulletLength = 23.012; + ACE_bulletMass = 4.0176; + ACE_ammoTempMuzzleVelocityShifts[] = {-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[] = {0.151}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[] = {210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; + }; + class rhs_ammo_556x45_M855A1_Ball_Red: rhs_ammo_556x45_M855A1_Ball {}; // B_556x45_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_556x45_M855A1_Ball_Green: rhs_ammo_556x45_M855A1_Ball_Red {}; // B_556x45_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_556x45_M855A1_Ball_Yellow: rhs_ammo_556x45_M855A1_Ball_Red {}; // B_556x45_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_556x45_M855A1_Ball_Orange: rhs_ammo_556x45_M855A1_Ball_Red {}; // B_556x45_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_556x45_Mk318_Ball: B_556x45_Ball { // ACE_556x45_Ball_Mk318 (ballistics/CfgAmmo.hpp) + ACE_caliber = 5.69; + ACE_bulletLength = 23.012; + ACE_bulletMass = 4.0176; + 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.307}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {780, 886, 950}; + ACE_barrelLengths[] = {254.0, 393.7, 508.0}; + }; + class rhs_ammo_556x45_Mk262_Ball: B_556x45_Ball { // ACE_556x45_Ball_Mk262 (ballistics/CfgAmmo.hpp) + ACE_caliber = 5.69; + ACE_bulletLength = 23.012; + ACE_bulletMass = 4.9896; + 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.361}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {624, 816, 832, 838}; + ACE_barrelLengths[] = {190.5, 368.3, 457.2, 508.0}; + }; + class rhs_ammo_762x51_M80_Ball: BulletBase { // B_762x51_Ball (ballistics/CfgAmmo.hpp) + ACE_caliber = 7.823; + ACE_bulletLength = 28.956; + ACE_bulletMass = 9.4608; + 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.2}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {700, 800, 820, 833, 845}; + ACE_barrelLengths[] = {254.0, 406.4, 508.0, 609.6, 660.4}; + }; + class rhs_ammo_762x51_M61_AP: rhs_ammo_762x51_M80_Ball {}; // B_762x51_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_762x51_M62_tracer: rhs_ammo_762x51_M80_Ball {}; // B_762x51_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_762x51_M80A1EPR_Ball: rhs_ammo_762x51_M80_Ball {}; // B_762x51_Ball (ballistics/CfgAmmo.hpp) + class rhs_ammo_762x51_M118_Special_Ball: rhs_ammo_762x51_M80_Ball { // ACE_762x51_Ball_M118LR (ballistics/CfgAmmo.hpp) + ACE_caliber = 7.823; + ACE_bulletLength = 31.496; + ACE_bulletMass = 11.34; + 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.243}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {750, 780, 790, 794}; + ACE_barrelLengths[] = {406.4, 508.0, 609.6, 660.4}; + }; + class rhs_ammo_762x51_M993_Ball: rhs_ammo_762x51_M80_Ball { // ACE_762x51_Ball_M993_AP (ballistics/CfgAmmo.hpp) + ACE_caliber = 7.823; + ACE_bulletLength = 31.496; + ACE_bulletMass = 8.22946157; + 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.359}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 1; + 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: 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.089}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + 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; + ACE_bulletLength = 17.4; + ACE_bulletMass = 2.0; + 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.112}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 1; + 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; + ACE_bulletLength = 20.3; + ACE_bulletMass = 2.0; + 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.141}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 1; + 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; + ACE_bulletLength = 17.272; + ACE_bulletMass = 14.904; + 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.195}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {230, 250, 285}; + ACE_barrelLengths[] = {101.6, 127.0, 228.6}; + }; + class rhs_ammo_9x19_FMJ: BulletBase { // ACE_9x19_Ball (ballistics/CfgAmmo.hpp) + ACE_caliber = 9.017; + ACE_bulletLength = 15.494; + ACE_bulletMass = 8.0352; + 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.165}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {340, 370, 400}; + ACE_barrelLengths[] = {101.6, 127.0, 228.6}; + }; + class rhs_ammo_9x19_JHP: BulletBase { // ACE_9x19_Ball (ballistics/CfgAmmo.hpp) + ACE_caliber = 9.017; + ACE_bulletLength = 15.494; + ACE_bulletMass = 8.0352; + 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.165}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {340, 370, 400}; + ACE_barrelLengths[] = {101.6, 127.0, 228.6}; + }; + class rhs_ammo_he_fragments: BulletBase { // Shrapnel, compatibility with medical_damage + ACE_damageType = "grenade"; + }; + class B_12Gauge_Slug; + class rhs_ammo_12g_FRAG: B_12Gauge_Slug { // Frag rounds, compatibility with medical_damage + ACE_damageType = "grenade"; + }; + + class Sh_125mm_APFSDS; + class rhsusf_ammo_basic_penetrator: Sh_125mm_APFSDS { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + + class rhs_ammo_ap_penetrator: Sh_125mm_APFSDS { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + + class Sh_120mm_APFSDS; + class rhs_ammo_M829: Sh_120mm_APFSDS { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + + class rhs_ammo_M830: Sh_120mm_APFSDS { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + + class B_30mm_HE; + class RHS_ammo_M792_HEI: B_30mm_HE { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhs_ammo_mk19m3_M384; + class rhs_ammo_mk19m3_M430I: rhs_ammo_mk19m3_M384 { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhsusf_ammo_reduced_penetrator; + class rhs_ammo_mk19m3_M430I_penetrator: rhsusf_ammo_reduced_penetrator { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class B_30mm_APFSDS_Tracer_Red; + class rhs_ammo_PGU14B_API: B_30mm_APFSDS_Tracer_Red { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class SubmunitionBase; + class rhs_ammo_30x173mm_GAU8_mixed: SubmunitionBase { + EGVAR(rearm,caliber) = 30; + }; + + class M_Titan_AT; + class rhs_ammo_TOW_AT: M_Titan_AT { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + + class rhs_ammo_127x99_Ball; + class rhs_ammo_127x99_Ball_AI: rhs_ammo_127x99_Ball { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhs_ammo_127x99_Ball_Tracer_Red; + class rhs_ammo_127x99_Ball_Tracer_Red_AI: rhs_ammo_127x99_Ball_Tracer_Red { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhs_ammo_127x99_SLAP; + class rhs_ammo_127x99_SLAP_AI: rhs_ammo_127x99_SLAP { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhs_ammo_127x99_SLAP_Tracer_Red; + class rhs_ammo_127x99_SLAP_Tracer_Red_AI: rhs_ammo_127x99_SLAP_Tracer_Red { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhs_ammo_12gHEAP_penetrator: BulletBase { + EGVAR(vehicle_damage,incendiary) = 0.1; + }; + class rhs_ammo_M136_rocket; + class rhs_ammo_M136_hp_rocket: rhs_ammo_M136_rocket { + EGVAR(vehicle_damage,incendiary) = 0.5; + }; + class rhsusf_40mm_HE; + class rhsusf_40mm_HEDP: rhsusf_40mm_HE { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class rhs_ammo_M136_penetrator: rhsusf_ammo_basic_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_M136_hp_penetrator: rhs_ammo_M136_penetrator { + EGVAR(vehicle_damage,incendiary) = 0.5; + }; + class rhs_ammo_M136_hedp_penetrator: rhs_ammo_M136_penetrator { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + class rhs_ammo_M_fgm148_AT_penetrator: rhsusf_ammo_basic_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_smaw_HEAA_penetrator: rhsusf_ammo_basic_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_maaws_HEAT_penetrator: rhsusf_ammo_basic_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class RocketBase; + class rhs_ammo_maaws_HEDP: RocketBase { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + class rhs_ammo_maaws_HEDP_penetrator: rhs_ammo_M136_penetrator { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + class rhs_ammo_maaws_HE: RocketBase { + EGVAR(vehicle_damage,incendiary) = 0.5; + }; + class rhs_ammo_maaws_SMOKE: RocketBase { + EGVAR(vehicle_damage,incendiary) = 0; + }; + class rhs_ammo_maaws_ILLUM: RocketBase { + EGVAR(vehicle_damage,incendiary) = 0; + }; + class rhs_ammo_40mmHEDP_penetrator: rhs_ammo_12gHEAP_penetrator { + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + + class GrenadeHand; + class rhs_ammo_mk3a2: GrenadeHand { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class rhs_ammo_m84: GrenadeHand { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class rhs_ammo_m7a3_cs: GrenadeHand { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class GrenadeHand_stone; + class rhs_ammo_m69: GrenadeHand_stone { + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class rhs_ammo_m67: GrenadeHand { + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 213; + EGVAR(frag,charge) = 185; + EGVAR(frag,gurney_c) = 2700; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; + }; + class rhs_ammo_M136_hedp_rocket: rhs_ammo_M136_rocket { + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 330; + EGVAR(frag,charge) = 280; + EGVAR(frag,gurney_c) = 2800; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; + EGVAR(vehicle_damage,incendiary) = 0.8; + }; + class rhs_ammo_m72a7_rocket: rhs_ammo_M136_hedp_rocket { + EGVAR(vehicle_damage,incendiary) = 1.0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; + }; + class rhs_ammo_smaw_SR: RocketBase { + ACE_caliber = 9; + }; +}; diff --git a/addons/compat_rhs_usf3/CfgEventHandlers.hpp b/addons/compat_rhs_usf3/CfgEventHandlers.hpp new file mode 100644 index 0000000000..865276cfba --- /dev/null +++ b/addons/compat_rhs_usf3/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgGlasses.hpp b/addons/compat_rhs_usf3/CfgGlasses.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgGlasses.hpp rename to addons/compat_rhs_usf3/CfgGlasses.hpp diff --git a/addons/compat_rhs_usf3/CfgJointRails.hpp b/addons/compat_rhs_usf3/CfgJointRails.hpp new file mode 100644 index 0000000000..0e0029857f --- /dev/null +++ b/addons/compat_rhs_usf3/CfgJointRails.hpp @@ -0,0 +1,11 @@ +// RHS specifically disables only the base vanilla 5.56 suppressor, the camo variants are untouched + +class asdg_MuzzleSlot; +class asdg_MuzzleSlot_556: asdg_MuzzleSlot { + class compatibleItems; +}; +class rhs_western_rifle_muzzle_slot: asdg_MuzzleSlot_556 { + class compatibleItems: compatibleItems { + muzzle_snds_M = 1; + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgMagazineWells.hpp b/addons/compat_rhs_usf3/CfgMagazineWells.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgMagazineWells.hpp rename to addons/compat_rhs_usf3/CfgMagazineWells.hpp diff --git a/addons/compat_rhs_usf3/CfgMagazines.hpp b/addons/compat_rhs_usf3/CfgMagazines.hpp new file mode 100644 index 0000000000..f11dad081c --- /dev/null +++ b/addons/compat_rhs_usf3/CfgMagazines.hpp @@ -0,0 +1,58 @@ +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 { + ACE_isBelt = 1; + }; + class rhsusf_50Rnd_762x51: CA_Magazine { + ACE_isBelt = 1; + }; + class rhs_mag_100rnd_127x99_mag: VehicleMagazine { + ACE_isBelt = 1; + }; + class RHS_48Rnd_40mm_MK19: VehicleMagazine { + ACE_isBelt = 1; + }; + + class CA_LauncherMagazine; + class rhs_mag_smaw_SR: CA_LauncherMagazine { + EGVAR(overpressure,priority) = 99; + EGVAR(overpressure,angle) = 0; + 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"; + }; +}; diff --git a/addons/compat_rhs_usf3/CfgVehicles.hpp b/addons/compat_rhs_usf3/CfgVehicles.hpp new file mode 100644 index 0000000000..52fccd808d --- /dev/null +++ b/addons/compat_rhs_usf3/CfgVehicles.hpp @@ -0,0 +1,270 @@ +class CfgVehicles { + class Heli_Light_03_base_F; + class RHS_UH1_Base: Heli_light_03_base_F { + EGVAR(refuel,fuelCapacity) = 1447; + }; + class Heli_Transport_01_base_F; + class RHS_UH60_Base: Heli_Transport_01_base_F { + EGVAR(refuel,fuelCapacity) = 1360; + }; + + class Heli_Transport_02_base_F; + class RHS_CH_47F_base: Heli_Transport_02_base_F { + EGVAR(refuel,fuelCapacity) = 3914; + }; + class Helicopter_Base_H; + class rhsusf_CH53E_USMC: Helicopter_Base_H { + EGVAR(interaction,bodyWidth) = 3.5; + EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; + }; + + class Heli_Attack_01_base_F; + class RHS_AH1Z_base: Heli_Attack_01_base_F { + EGVAR(refuel,fuelCapacity) = 1600; + EGVAR(hellfire,addLaserDesignator) = 1; + }; + + class RHS_AH64_base: Heli_Attack_01_base_F { + EGVAR(refuel,fuelCapacity) = 1420; + EGVAR(hellfire,addLaserDesignator) = 1; + }; + + class MBT_01_arty_base_F; + class rhsusf_m109tank_base: MBT_01_arty_base_F { + EGVAR(refuel,fuelCapacity) = 511; + }; + + class MRAP_01_base_F; + class rhsusf_hmmwe_base: MRAP_01_base_F { + EGVAR(refuel,fuelCapacity) = 95; + }; + + class rhsusf_rg33_base: MRAP_01_base_F { + EGVAR(refuel,fuelCapacity) = 302; + }; + + class Truck_F; + class Truck_01_base_F: Truck_F {}; + class rhsusf_fmtv_base: Truck_01_base_F { + EGVAR(refuel,fuelCapacity) = 219; + }; + class rhsusf_M1078A1P2_B_M2_fmtv_usarmy; + class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy { + EGVAR(rearm,defaultSupply) = 800; + EGVAR(refuel,hooks)[] = {{1.1,0.9,-1.2}}; + EGVAR(refuel,fuelCargo) = 900; // 45 jerrycans + }; + + class rhsusf_HEMTT_A4_base: Truck_01_base_F {}; + class rhsusf_M977A4_usarmy_wd: rhsusf_HEMTT_A4_base {}; + class rhsusf_M977A4_AMMO_usarmy_wd: rhsusf_M977A4_usarmy_wd { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class rhsusf_M977A4_BKIT_usarmy_wd; + class rhsusf_M977A4_AMMO_BKIT_usarmy_wd: rhsusf_M977A4_BKIT_usarmy_wd { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class rhsusf_M977A4_BKIT_M2_usarmy_wd; + class rhsusf_M977A4_AMMO_BKIT_M2_usarmy_wd: rhsusf_M977A4_BKIT_M2_usarmy_wd { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class rhsusf_M978A4_usarmy_wd: rhsusf_M977A4_usarmy_wd { + EGVAR(refuel,hooks)[] = {{-0.44,-4.87,0}, {0.5,-4.87,0}}; + EGVAR(refuel,fuelCargo) = 10000; + }; + + class rhsusf_M978A4_BKIT_usarmy_wd: rhsusf_M977A4_usarmy_wd { + EGVAR(refuel,hooks)[] = {{-0.44,-4.87,0}, {0.5,-4.87,0}}; + EGVAR(refuel,fuelCargo) = 10000; + }; + class Tank_F; + class APC_Tracked_02_base_F: Tank_F {}; + class rhsusf_m113tank_base: APC_Tracked_02_base_F { + EGVAR(map,vehicleLightColor)[] = {0,1,0,0.1}; + EGVAR(refuel,fuelCapacity) = 360; + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.7; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + + class rhsusf_m113_usarmy; + class rhsusf_m113_usarmy_supply: rhsusf_m113_usarmy { + EGVAR(rearm,defaultSupply) = 1200; + }; + + class Wheeled_APC_F; + class APC_Tracked_03_base_F; + class RHS_M2A2_Base: APC_Tracked_03_base_F { + EGVAR(refuel,fuelCapacity) = 746; + EGVAR(vehicle_damage,canHaveFireRing) = 1; + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.2; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + class rhsusf_M1117_base: Wheeled_APC_F { + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.7; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.8; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + class rhsusf_stryker_base: Wheeled_APC_F { + EGVAR(vehicle_damage,hullDetonationProb) = 0.2; + EGVAR(vehicle_damage,turretDetonationProb) = 0.2; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0.5; + EGVAR(vehicle_damage,turretFireProb) = 0.2; + EGVAR(vehicle_damage,engineFireProb) = 0.7; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; + }; + class MBT_01_base_F; + class rhsusf_m1a1tank_base: MBT_01_base_F { + EGVAR(refuel,fuelCapacity) = 1909; + EGVAR(vehicle_damage,hullDetonationProb) = 0; + EGVAR(vehicle_damage,turretDetonationProb) = 0; + EGVAR(vehicle_damage,engineDetonationProb) = 0; + EGVAR(vehicle_damage,hullFireProb) = 0; + EGVAR(vehicle_damage,turretFireProb) = 0; + EGVAR(vehicle_damage,engineFireProb) = 0.5; + EGVAR(vehicle_damage,detonationDuringFireProb) = 0; + EGVAR(vehicle_damage,hitpointAlias)[] = { { "hull", { "hitammohull", "hitammo" } } }; + }; + + class RHS_M2A2; + class RHS_M2A2_BUSKI: RHS_M2A2 { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", + "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", + "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", + "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", + "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", + "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", + "era_36_hitpoint", "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", + "era_41_hitpoint", "era_42_hitpoint", "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint" + }; + EGVAR(vehicle_damage,canHaveFireRing) = 1; + }; + class RHS_M2A3; + class RHS_M2A3_BUSKI: RHS_M2A3 { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", + "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", + "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", + "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", + "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", + "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", + "era_36_hitpoint", "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", + "era_41_hitpoint", "era_42_hitpoint", "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint" + }; + EGVAR(vehicle_damage,canHaveFireRing) = 1; + }; + class RHS_M2A3_BUSKIII: RHS_M2A3_BUSKI { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", + "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", + "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", + "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", + "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", + "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", + "era_36_hitpoint", "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", + "era_41_hitpoint", "era_42_hitpoint", "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint", + "era_46_hitpoint", "era_47_hitpoint", "era_48_hitpoint", "era_49_hitpoint", "era_50_hitpoint", + "era_51_hitpoint", "era_52_hitpoint", "era_53_hitpoint", "era_54_hitpoint", "era_55_hitpoint", + "era_56_hitpoint", "era_57_hitpoint", "era_58_hitpoint", "era_59_hitpoint" + }; + }; + class rhsusf_m1a1aim_tuski_wd: rhsusf_m1a1tank_base { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", + "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", + "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", + "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", + "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", + "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { "SLAT_1_hitpoint" }; + }; + class rhsusf_m1a2tank_base; + class rhsusf_m1a2sep1tuskid_usarmy: rhsusf_m1a2tank_base { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", + "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", + "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", + "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", + "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", + "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint" + }; + EGVAR(vehicle_damage,slatHitpoints)[] = { "SLAT_1_hitpoint" }; + }; + class rhsusf_m1a2sep1tuskiiwd_usarmy: rhsusf_m1a2sep1tuskid_usarmy { + EGVAR(vehicle_damage,eraHitpoints)[] = { + "era_1_hitpoint", "era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", + "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", + "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", + "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", + "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", + "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", + "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", + "era_36_hitpoint", "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", + "era_41_hitpoint", "era_42_hitpoint", "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint", + "era_46_hitpoint" + }; + }; + + class Plane_CAS_01_base_F; + class RHS_A10: Plane_CAS_01_base_F { + EGVAR(refuel,fuelCapacity) = 6223; + }; + + class Plane_Base_F; + class RHS_C130J_Base: Plane_Base_F { + EGVAR(refuel,fuelCapacity) = 25704; + EGVAR(cargo,space) = 4; + EGVAR(cargo,hasCargo) = 1; + }; + + class rhsusf_infantry_usmc_base; + class rhsusf_usmc_marpat_wd_helipilot: rhsusf_infantry_usmc_base { + ace_gforcecoef = 0.55; + }; + + class rhsusf_infantry_army_base; + class rhsusf_army_ocp_helipilot: rhsusf_infantry_army_base { + ace_gforcecoef = 0.55; + }; + + class rhsusf_usmc_marpat_wd_rifleman_m4; + class rhsusf_airforce_jetpilot: rhsusf_usmc_marpat_wd_rifleman_m4 { + ace_gforcecoef = 0.55; + }; + + class Items_base_F; + class rhsusf_props_JerryCan_Base: Items_base_F { + EGVAR(cargo,canLoad) = 1; + EGVAR(cargo,size) = 1; + EGVAR(dragging,canCarry) = 1; + }; + + class rhsusf_props_ScepterMWC_Base: rhsusf_props_JerryCan_Base { + EXGVAR(field_rations,waterSupply) = 20; + EXGVAR(field_rations,offset)[] = {-0.13, 0, 0.2}; + }; +}; diff --git a/addons/compat_rhs_usf3/CfgWeapons.hpp b/addons/compat_rhs_usf3/CfgWeapons.hpp new file mode 100644 index 0000000000..53234acf1b --- /dev/null +++ b/addons/compat_rhs_usf3/CfgWeapons.hpp @@ -0,0 +1,436 @@ +class CfgWeapons { + class Pistol_Base_F; + class Rifle_Base_F; + class rhs_weap_m14ebrri_base; + class GM6_base_F; + class rhs_weap_M107_Base_F: GM6_base_F { + ACE_barrelTwist = 381.0; + ACE_barrelLength = 736.6; + ACE_RailHeightAboveBore = 4.18639; + }; + class rhs_weap_XM2010_Base_F: Rifle_Base_F { + ACE_barrelTwist = 254.0; + ACE_barrelLength = 609.6; + EGVAR(overheating,dispersion) = 0.75; + ACE_RailHeightAboveBore = 3.1028; + }; + class rhs_weap_m24sws: rhs_weap_XM2010_Base_F { + ACE_barrelTwist = 285.75; + ACE_barrelLength = 609.6; + ACE_RailHeightAboveBore = 2.41891; + }; + class rhs_weap_m40a5: rhs_weap_XM2010_Base_F { + ACE_barrelTwist = 304.8; // 1:12" + ACE_barrelLength = 635.0; // 25" + ACE_RailHeightAboveBore = 2.46368; + }; + class arifle_MX_Base_F; + class rhs_weap_m4_Base: arifle_MX_Base_F { + ACE_RailHeightAboveBore = 2.56518; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 368.3; + }; + class rhs_weap_m4a1; + class rhs_weap_hk416d10: rhs_weap_m4a1 { + ACE_RailHeightAboveBore = 3.56139; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 254; + }; + class rhs_weap_hk416d145: rhs_weap_hk416d10 { + ACE_barrelTwist = 177.8; + ACE_barrelLength = 368.3; + }; + class rhs_weap_m27iar: rhs_weap_m4a1 { + ACE_RailHeightAboveBore = 3.56139; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 419.1; + }; + class rhs_weap_m4a1_blockII; + class rhs_weap_mk18: rhs_weap_m4a1_blockII { + ACE_RailHeightAboveBore = 2.6068; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 261.62; + }; + class rhs_weap_m16a4: rhs_weap_m4_Base { + ACE_RailHeightAboveBore = 2.59324; + ACE_barrelTwist = 177.8; + ACE_barrelLength = 508.0; + }; + class rhs_weap_saw_base: Rifle_Base_F { // Base class for all Minimi + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + class rhs_weap_lmg_minimi_railed; + class rhs_weap_m249_pip_S: rhs_weap_lmg_minimi_railed { + ACE_RailHeightAboveBore = 4.11044; + ACE_barrelLength = 348; + ACE_barrelTwist = 177.8; + }; + class rhs_weap_m249_pip_L: rhs_weap_lmg_minimi_railed { + ACE_RailHeightAboveBore = 4.34899; + ACE_barrelLength = 464.8; + ACE_barrelTwist = 177.8; + }; + 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; + }; + class rhs_weap_m14_base; + class rhs_weap_m14: rhs_weap_m14_base { + ACE_barrelTwist = 304.8; + ACE_barrelLength = 558.8; + EGVAR(overheating,dispersion) = 0.75; + }; + class rhs_weap_m14ebrri: rhs_weap_m14ebrri_base { + ACE_barrelTwist = 304.8; + ACE_barrelLength = 558.8; + EGVAR(overheating,dispersion) = 0.75; + ACE_RailHeightAboveBore = 3.08341; + }; + class rhs_weap_m14_socom_base: rhs_weap_m14_base { + ACE_barrelTwist = 304.8; + ACE_barrelLength = 413; //16.25 in (413 mm) + EGVAR(overheating,dispersion) = 0.75; + }; + class rhs_weap_sr25: rhs_weap_m14ebrri { + ACE_barrelTwist = 285.75; + ACE_barrelLength = 609.6; + ACE_RailHeightAboveBore = 3.13162; + }; + class rhs_weap_sr25_ec: rhs_weap_sr25 { + ACE_barrelLength = 508.0; + ACE_RailHeightAboveBore = 3.13689; + }; + class rhs_weap_sr25_d; + class rhs_weap_sr25_ec_d: rhs_weap_sr25_d { + ACE_barrelLength = 508.0; + ACE_RailHeightAboveBore = 3.13689; + }; + class rhs_weap_sr25_wd; + class rhs_weap_sr25_ec_wd: rhs_weap_sr25_wd { + 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_Base { + ACE_barrelTwist = 304.8; // 1:12" + ACE_barrelLength = 508.0; + }; + class rhs_weap_SCAR_H_STD_Base: rhs_weap_SCAR_H_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; + ACE_barrelLength = 469.9; + }; + class rhs_weap_M590_8RD: rhs_weap_M590_5RD { + ACE_barrelTwist = 0.0; + ACE_twistDirection = 0; + ACE_barrelLength = 508.0; + }; + class rhs_weap_m32_Base_F: Rifle_Base_F { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + 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; + }; + // RHS pistols + class hgun_ACPC2_F; + class rhsusf_weap_m1911a1: hgun_ACPC2_F { + ACE_barrelTwist = 406.4; + ACE_barrelLength = 127.0; + }; + class hgun_P07_F; + class rhsusf_weap_glock17g4: hgun_P07_F { + ACE_barrelTwist = 248.92; + ACE_barrelLength = 114.046; + }; + class rhsusf_weap_m9: rhsusf_weap_glock17g4 { + ACE_barrelTwist = 248.92; + ACE_barrelLength = 124.46; + }; + class rhs_weap_M320_Base_F: Pistol_Base_F { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; + }; + + // RHS launchers + class launch_O_Titan_F; + + class rhs_weap_fim92: launch_O_Titan_F { + EGVAR(overpressure,range) = 6; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.6; + EGVAR(overpressure,offset) = 1.45; + }; + + class Launcher_Base_F; + + class rhs_weap_smaw: Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,offset) = 1.3; + }; + + class rhs_weap_maaws: Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,angle) = 70; + EGVAR(overpressure,damage) = 0.75; + EGVAR(overpressure,offset) = 0.95; + }; + + class rhs_weap_M136: Launcher_Base_F { + EGVAR(overpressure,range) = 10; + EGVAR(overpressure,angle) = 50; + EGVAR(overpressure,offset) = 0.9; + }; + + #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 + }; + class rhsusf_opscore_aor1_pelt_nsw: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_bk_pelt: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_fg_pelt: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_fg_pelt_nsw: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_fg_pelt_cam: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_paint_pelt: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_paint_pelt_nsw: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_paint_pelt_nsw_cam: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_aor2_pelt: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_aor2_pelt_nsw: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_ut_pelt: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_ut_pelt_cam: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_ut_pelt_nsw_cam: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_mc_pelt: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_mc_pelt_nsw: rhsusf_opscore_01 { + 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 + }; + class rhsusf_opscore_mc_cover_pelt_cam: rhsusf_opscore_cover { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_rg_cover_pelt: rhsusf_opscore_cover { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_coy_cover_pelt: rhsusf_opscore_cover { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_mar_01; + class rhsusf_opscore_mar_ut_pelt: rhsusf_opscore_mar_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_mar_fg_pelt: rhsusf_opscore_mar_01 { + HEARING_PROTECTION_PELTOR + }; + + // ACH Helmets + class rhsusf_ach_helmet_ocp; + class rhsusf_ach_bare_des_headset: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_des_headset_ess: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_headset: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_headset_ess: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_semi_headset: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_semi_headset_ess: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_tan_headset: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_tan_headset_ess: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_wood_headset: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_bare_wood_headset_ess: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_helmet_headset_ocp: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_ach_helmet_headset_ess_ocp: rhsusf_ach_helmet_ocp { + HEARING_PROTECTION_PELTOR + }; + + // ACVC Helmets + class rhsusf_cvc_helmet: rhsusf_opscore_01 { + HEARING_PROTECTION_VICCREW + }; + + // MICH Helmets + class rhsusf_mich_bare; + class rhsusf_mich_bare_alt: rhsusf_mich_bare { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_mich_bare_norotos; + class rhsusf_mich_bare_norotos_alt: rhsusf_mich_bare_norotos { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_mich_bare_norotos_arc; + class rhsusf_mich_bare_norotos_arc_alt: rhsusf_mich_bare_norotos_arc { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_mich_bare_semi; + class rhsusf_mich_bare_alt_semi: rhsusf_mich_bare_semi { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_mich_bare_norotos_semi; + class rhsusf_mich_bare_norotos_alt_semi: rhsusf_mich_bare_norotos_semi { + HEARING_PROTECTION_PELTOR + }; + 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 + }; + class rhsusf_mich_bare_tan; + class rhsusf_mich_bare_alt_tan: rhsusf_mich_bare_tan { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_mich_bare_norotos_tan; + class rhsusf_mich_bare_norotos_alt_tan: rhsusf_mich_bare_norotos_tan { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_mich_bare_norotos_arc_tan; + class rhsusf_mich_bare_norotos_arc_alt_tan: rhsusf_mich_bare_norotos_arc_tan { + 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 + }; +}; diff --git a/addons/compat_rhs_usf3/XEH_PREP.hpp b/addons/compat_rhs_usf3/XEH_PREP.hpp new file mode 100644 index 0000000000..821ee657be --- /dev/null +++ b/addons/compat_rhs_usf3/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(canCloseDoor); +PREP(onCut); +PREP(onPrepare); diff --git a/optionals/compat_sog/XEH_preInit.sqf b/addons/compat_rhs_usf3/XEH_preInit.sqf similarity index 100% rename from optionals/compat_sog/XEH_preInit.sqf rename to addons/compat_rhs_usf3/XEH_preInit.sqf diff --git a/addons/compat_rhs_usf3/XEH_preStart.sqf b/addons/compat_rhs_usf3/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/compat_rhs_usf3/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazineGroups.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgMagazineGroups.hpp rename to addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazineGroups.hpp diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazines.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazines.hpp new file mode 100644 index 0000000000..8fb6b777b1 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazines.hpp @@ -0,0 +1,124 @@ +class CfgMagazines { + // RHS magazines for crew handled ammo + class rhs_mag_TOW; + class GVAR(mag_TOW): rhs_mag_TOW { + scope = 2; + displayName = CSTRING(mag_TOW_displayName); + 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; + displayName = CSTRING(mag_TOWB_displayName); + 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; + displayName = CSTRING(mag_ITOW_displayName); + 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; + displayName = CSTRING(mag_TOW2_displayName); + 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; + displayName = CSTRING(mag_TOW2A_displayName); + 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; + displayName = CSTRING(mag_TOW2b_displayName); + 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; + displayName = CSTRING(mag_TOW2b_aero_displayName); + 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; + displayName = CSTRING(mag_TOW2bb_displayName); + 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_48Rnd_40mm_MK19; + class GVAR(48Rnd_40mm_MK19): RHS_48Rnd_40mm_MK19 { + scope = 2; + displayName = CSTRING(48Rnd_40mm_MK19_displayName); + 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; + displayName = CSTRING(48Rnd_40mm_MK19_M430I_displayName); + 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; + displayName = CSTRING(48Rnd_40mm_MK19_M430A1_displayName); + 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; + displayName = CSTRING(48Rnd_40mm_MK19_M1001_displayName); + 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/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp new file mode 100644 index 0000000000..cbca20cce7 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp @@ -0,0 +1,77 @@ +class CfgVehicles { + class LandVehicle; + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class StaticMortar: StaticWeapon {}; + class RHS_M252_Base: StaticMortar { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "main_gun"; + }; + }; + + 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; + class rhs_m2staticmg_base: StaticMGWeapon { + 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; + class RHS_MK19_TriPod_base: StaticGrenadeLauncher { + 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; + class RHS_TOW_TriPod_base: StaticATWeapon { + 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; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp new file mode 100644 index 0000000000..d373e7fe67 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp @@ -0,0 +1,110 @@ +class CfgWeapons { + 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 Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class GVAR(m252_carry): Launcher_Base_F { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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 { + dlc = "ace"; + 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/addons/compat_rhs_usf3/compat_rhs_usf3_csw/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/config.cpp new file mode 100644 index 0000000000..9e4940dd67 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/config.cpp @@ -0,0 +1,26 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {QGVAR(m252_carry), QGVAR(m2_carry), QGVAR(mk19_carry), QGVAR(tow_carry)}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_csw" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgMagazineGroups.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/script_component.hpp new file mode 100644 index 0000000000..77a1b484cb --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT csw +#define SUBCOMPONENT_BEAUTIFIED Crew-Served Weapons +#include "..\script_component.hpp" + +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml new file mode 100644 index 0000000000..d79afe08c6 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml @@ -0,0 +1,101 @@ + + + + + [CSW] BGM-71A TOW + [CSW] BGM-71A TOW + [CSW] BGM-71A TOW + [班组] BGM-71A TOW + [CSW] BGM-71A TOW + [CSW] BGM-71A TOW + + + [CSW] BGM-71B TOW + [CSW] BGM-71B TOW + [CSW] BGM-71B TOW + [班组] BGM-71B TOW + [CSW] BGM-71B TOW + [CSW] BGM-71B TOW + + + [CSW] BGM-71C ITOW + [CSW] BGM-71C ITOW + [CSW] BGM-71C ITOW + [班组] BGM-71C ITOW + [CSW] BGM-71C ITOW + [CSW] BGM-71C ITOW + + + [CSW] BGM-71D TOW-2 + [CSW] BGM-71D TOW-2 + [CSW] BGM-71D TOW-2 + [班组] BGM-71D TOW-2 + [CSW] BGM-71D TOW-2 + [CSW] BGM-71D TOW-2 + + + [CSW] BGM-71E TOW-2A + [CSW] BGM-71E TOW-2A + [CSW] BGM-71E TOW-2A + [班组] BGM-71E TOW-2A + [CSW] BGM-71E TOW-2A + [CSW] BGM-71E TOW-2A + + + [CSW] BGM-71F TOW-2B + [CSW] BGM-71F TOW-2B + [CSW] BGM-71F TOW-2B + [班组] BGM-71F TOW-2B + [CSW] BGM-71F TOW-2B + [CSW] BGM-71F TOW-2B + + + [CSW] BGM-71F-3 TOW-2B AERO + [CSW] BGM-71F-3 TOW-2B AERO + [CSW] BGM-71F-3 TOW-2B AERO + [班组] BGM-71F-3 TOW-2B AERO + [CSW] BGM-71F-3 TOW-2B AERO + [CSW] BGM-71F-3 TOW-2B AERO + + + [CSW] BGM-71H Bunker Buster + [CSW] BGM-71H 벙커버스터 + [CSW] BGM-71H Bunker Buster + [班组] BGM-71H “碉堡克星” + [CSW] BGM-71H Bunker Buster + [CSW] BGM-71H Anti-Búnquer + + + [CSW] Mk. 19 40mm M384 HE + [CSW] Mk.19 40mm M384 HE + [CSW] Mk. 19 40mm M384 HE + [班组] Mk. 19 40mm M384 高爆 + [CSW] Mk. 19 40 мм M384 HE + [CSW] Mk. 19 40mm M384 HE + + + [CSW] Mk. 19 40mm M430I HEDP + [CSW] Mk.19 40mm M430I 이중목적고폭탄 + [CSW] Mk. 19 40mm M430I HEDP + [班组] Mk. 19 40mm M430I 两用高爆 + [CSW] Mk. 19 40 мм M430I HEDP + [CSW] Mk. 19 40mm M430I HEDP + + + [CSW] Mk. 19 40mm M430A1 HEDP + [CSW] Mk.19 40mm M430A1 이중목적고폭탄 + [CSW] Mk. 19 40mm M430A1 HEDP + [班组] Mk. 19 40mm M430A1 两用高爆 + [CSW] Mk. 19 40 мм M430A1 HEDP + [CSW] Mk. 19 40mm M430A1 HEDP + + + [CSW] Mk. 19 40mm M1001 Canister + [CSW] Mk.19 40mm M1001 산탄 + [CSW] Mk. 19 40mm M1001 キャニスター + [班组] Mk. 19 40mm M1001 霰弹 + [CSW] Mk. 19 40 мм M1001 Канистровый + [CSW] Mk. 19 40mm M1001 Bote de metralla + + + diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgAmmo.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..eea589b99b --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgAmmo.hpp @@ -0,0 +1,25 @@ +class CfgAmmo { + // ACE Explosives + class PipeBombBase; + class rhsusf_m112_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0.055, 0, 0.038}; + }; + + class rhsusf_m112x4_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0.055, -0.025, 0.102}; + }; + + class MineBase; + class rhsusf_mine_m19_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.02, 0.046}; + }; + + class rhsusf_mine_m14_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.02, -0.015, 0.02}; + }; + + class APERSMine_Range_Ammo; + class rhsusf_mine_m49a1_3m_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.016, 0.296}; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..552ef8628c --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp @@ -0,0 +1,63 @@ +class CfgMagazines { + class CA_Magazine; + class rhsusf_m112_mag: CA_Magazine { + EGVAR(explosives,delayTime) = 1; + EGVAR(explosives,placeable) = 1; + EGVAR(explosives,setupObject) = QEGVAR(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 { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_m112x4); + }; + + class ATMine_Range_Mag; + class rhs_mine_M19_mag: ATMine_Range_Mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_M19); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.075; + }; + }; + }; + + class rhsusf_mine_m14_mag: ATMine_Range_Mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m14); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; + }; + + class rhsusf_mine_m49a1_3m_mag: ATMine_Range_Mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m49a1_3m); + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.125; + }; + }; + }; + + class rhsusf_mine_m49a1_6m_mag: rhsusf_mine_m49a1_3m_mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m49a1_6m); + }; + + class rhsusf_mine_m49a1_10m_mag: rhsusf_mine_m49a1_3m_mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m49a1_10m); + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..668631b70d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgVehicles.hpp @@ -0,0 +1,69 @@ +class CfgVehicles { + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + // ACE Explosives + class EGVAR(explosives,Place_rhsusf_explosive_m112): EGVAR(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 EGVAR(explosives,Place_rhsusf_explosive_m112x4): EGVAR(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 EGVAR(explosives,Place_rhsusf_mine_M19): EGVAR(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 EGVAR(explosives,Place_rhsusf_mine_m14): EGVAR(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 EGVAR(explosives,Place_rhsusf_mine_m49a1_3m): EGVAR(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 EGVAR(explosives,Place_rhsusf_mine_m49a1_6m): EGVAR(explosives,Place_rhsusf_mine_m49a1_3m) { + displayName = "M49A1 (6m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_b_e"; + }; + + class EGVAR(explosives,Place_rhsusf_mine_m49a1_10m): EGVAR(explosives,Place_rhsusf_mine_m49a1_3m) { + displayName = "M49A1 (10m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_c_e"; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/config.cpp new file mode 100644 index 0000000000..9db8a0432d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/script_component.hpp new file mode 100644 index 0000000000..a697aad7f3 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT explosives +#define SUBCOMPONENT_BEAUTIFIED Explosives +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/CfgVehicles.hpp new file mode 100644 index 0000000000..2bda24364b --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/CfgVehicles.hpp @@ -0,0 +1,127 @@ +class CfgVehicles { + class Air; + class Helicopter: Air {}; + class Helicopter_Base_F: Helicopter { + class Eventhandlers; + }; + class Heli_Light_03_base_F: Helicopter_Base_F {}; + class RHS_UH1_Base: Heli_light_03_base_F {}; + class RHS_UH1Y_base: RHS_UH1_Base { + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + class RHS_UH1Y_US_base: RHS_UH1Y_base {}; + class RHS_UH1Y: RHS_UH1Y_US_base { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 2.38, -0.135}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + + class UserActions; + class EventHandlers: EventHandlers { + class RHSUSF_EventHandlers; + }; + }; + class RHS_UH1Y_FFAR: RHS_UH1Y { + class UserActions: UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorRB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + class CloseCargoLDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorLB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; + + class Helicopter_Base_H: Helicopter_Base_F { + class Eventhandlers; + }; + class Heli_Transport_01_base_F: Helicopter_Base_H {}; + + class RHS_MELB_base: Helicopter_Base_H {}; + class RHS_MELB_MH6M: RHS_MELB_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + }; + class RHS_UH60_Base: Heli_Transport_01_base_F {}; + class RHS_UH60M_base: RHS_UH60_Base { + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + class RHS_UH60M_US_base: RHS_UH60M_base {}; + class RHS_UH60M: RHS_UH60M_US_base { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.25, -0.65}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + + class UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorRB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + class CloseCargoLDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorLB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; + class RHS_UH60M2: RHS_UH60M {}; + class RHS_UH60M_ESSS: RHS_UH60M2 { + EGVAR(fastroping,enabled) = 0; + class Attributes: Attributes { + delete EGVAR(fastroping,equipFRIES); + }; + }; + + class RHS_UH60M_MEV: RHS_UH60M { + EGVAR(fastroping,enabled) = 0; + class Attributes: Attributes { + delete EGVAR(fastroping,equipFRIES); + }; + }; + + class RHS_UH60M_MEV2: RHS_UH60M_MEV { + EGVAR(fastroping,enabled) = 2; + class Attributes: Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class Heli_Transport_02_base_F; + class RHS_CH_47F_base: Heli_Transport_02_base_F { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{0.5, -7.15, -0.95}, {-0.5, -7.15, -0.95}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + + class UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'ramp_anim')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; + + class rhsusf_CH53E_USMC: Helicopter_Base_H { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{0,-9.5,2.6}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + + class UserActions { + class RampOpen; + class RampClose: RampOpen { + condition = QUOTE([ARR_2(this,'ramp_bottom')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/config.cpp new file mode 100644 index 0000000000..ad3c97d1c4 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_fastroping" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/script_component.hpp new file mode 100644 index 0000000000..77632a2484 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT fastroping +#define SUBCOMPONENT_BEAUTIFIED Fastroping +#include "..\script_component.hpp" + +#include "\z\ace\addons\fastroping\script_macros.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp new file mode 100644 index 0000000000..65ca880587 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp @@ -0,0 +1,39 @@ +class CfgAmmo { + class MissileBase; + class rhs_ammo_M_fgm148_AT: MissileBase { + irLock = 1; + laserLock = 0; + airLock = 0; + + // Begin ACE guidance Configs + class ace_missileguidance { + enabled = 1; + + minDeflection = 0.00005; // Minium flap deflection for guidance + maxDeflection = 0.025; // Maximum flap deflection for guidance + incDeflection = 0.00005; // The incrmeent in which deflection adjusts. + + canVanillaLock = 0; + + // Guidance type for munitions + defaultSeekerType = "Optic"; + seekerTypes[] = { "Optic" }; + + defaultSeekerLockMode = "LOBL"; + seekerLockModes[] = { "LOBL" }; + + seekerAngle = 180; // Angle in front of the missile which can be searched + seekerAccuracy = 1; // seeker accuracy multiplier + + seekerMinRange = 0; + seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + + seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos] + + // Attack profile type selection + defaultAttackProfile = "JAV_TOP"; + attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; + useModeForAttackProfile = 1; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgWeapons.hpp new file mode 100644 index 0000000000..678293925d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgWeapons.hpp @@ -0,0 +1,19 @@ +class CfgWeapons { + class launch_O_Titan_F; + class rhs_weap_fgm148: launch_O_Titan_F { + EGVAR(javelin,enabled) = 1; + EGVAR(overpressure,offset) = 1.1; + weaponInfoType = "ACE_RscOptics_javelin"; + modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; + 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"; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/config.cpp new file mode 100644 index 0000000000..de6f0491c6 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_javelin" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/script_component.hpp new file mode 100644 index 0000000000..d42e0f4f01 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT javelin +#define SUBCOMPONENT_BEAUTIFIED Javelin +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/CfgWeapons.hpp new file mode 100644 index 0000000000..006d332186 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/CfgWeapons.hpp @@ -0,0 +1,13 @@ +class CfgWeapons { + class NVGoggles; + class rhsusf_ANPVS_14: NVGoggles { // Monocular + modelOptics = ""; + EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); + EGVAR(nightvision,bluRadius) = 0.13; + }; + class rhsusf_ANPVS_15: rhsusf_ANPVS_14 { // Binocular (same as base) + modelOptics = ""; + EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa); + EGVAR(nightvision,bluRadius) = 0.15; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/config.cpp new file mode 100644 index 0000000000..54da457d4f --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_nightvision" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/script_component.hpp new file mode 100644 index 0000000000..85036e02b6 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT nightvision +#define SUBCOMPONENT_BEAUTIFIED Night Vision +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgEventHandlers.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgEventHandlers.hpp new file mode 100644 index 0000000000..9d5f334607 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgEventHandlers.hpp @@ -0,0 +1,7 @@ +class Extended_InitPost_EventHandlers { + class rhsusf_props_ScepterMFC_Base { + class ADDON { + init = QUOTE(call EFUNC(refuel,makeJerryCan)); + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp new file mode 100644 index 0000000000..5aaf6b4e22 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp @@ -0,0 +1,15 @@ +class CfgVehicles { + class rhsusf_M1078A1P2_B_M2_fmtv_usarmy; + class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy { + transportFuel = 0; + }; + + class rhsusf_M977A4_usarmy_wd; + class rhsusf_M978A4_usarmy_wd: rhsusf_M977A4_usarmy_wd { + transportFuel = 0; + }; + + class rhsusf_M978A4_BKIT_usarmy_wd: rhsusf_M977A4_usarmy_wd { + transportFuel = 0; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp new file mode 100644 index 0000000000..391e22d95e --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_refuel" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/script_component.hpp new file mode 100644 index 0000000000..b58db9432d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT refuel +#define SUBCOMPONENT_BEAUTIFIED Refuel +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/CfgWeapons.hpp new file mode 100644 index 0000000000..8e440c8c57 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/CfgWeapons.hpp @@ -0,0 +1,123 @@ +class CfgWeapons { + // RHS sniper scopes + class ItemCore; + class InventoryOpticsItem_Base_F; + class rhsusf_acc_sniper_base: ItemCore { + ACE_ScopeAdjust_Vertical[] = {-4, 30}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + // 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; + }; + class rhsusf_acc_LEUPOLDMK4_2: rhsusf_acc_sniper_base { + ACE_ScopeHeightAboveRail = 3.86377; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_premier: rhsusf_acc_LEUPOLDMK4_2 { + ACE_ScopeHeightAboveRail = 5.26066; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_premier_low: rhsusf_acc_premier { + ACE_ScopeHeightAboveRail = 3.90899; + }; + class rhsusf_acc_premier_anpvs27: rhsusf_acc_premier { + ACE_ScopeHeightAboveRail = 5.25066; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_nvg { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_M8541: rhsusf_acc_premier { // http://www.schmidtundbender.de/en/products/police-and-military-forces/3-12x50-pm-iilpmtc.html + ACE_ScopeHeightAboveRail = 4.2235; + ACE_ScopeAdjust_Vertical[] = {0, 22}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class Snip { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_M8541_low: rhsusf_acc_M8541 { + ACE_ScopeHeightAboveRail = 2.9789; + }; + class rhsusf_acc_nxs_3515x50_base: ItemCore { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 + ACE_ScopeAdjust_Vertical[] = {0, 30}; + ACE_ScopeAdjust_Horizontal[] = {-10.9, 10.9}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class nxs_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_nxs_3515x50f1_base: rhsusf_acc_sniper_base { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 + ACE_ScopeAdjust_Vertical[] = {0, 30}; + ACE_ScopeAdjust_Horizontal[] = {-10.9, 10.9}; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class nxs_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_nxs_5522x56_base: ItemCore { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 + ACE_ScopeAdjust_Vertical[] = {0, 27.3}; + ACE_ScopeAdjust_Horizontal[] = {-8.2, 8.2}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class nxs_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/config.cpp new file mode 100644 index 0000000000..62db11efe8 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_scopes" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/script_component.hpp new file mode 100644 index 0000000000..613b4322f9 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT scopes +#define SUBCOMPONENT_BEAUTIFIED Scopes +#include "..\script_component.hpp" diff --git a/addons/compat_rhs_usf3/config.cpp b/addons/compat_rhs_usf3/config.cpp new file mode 100644 index 0000000000..8eb2ef821a --- /dev/null +++ b/addons/compat_rhs_usf3/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhsusf_main_loadorder"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "Fyuran"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgMagazineWells.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" +#include "CfgGlasses.hpp" +#include "CfgJointRails.hpp" diff --git a/addons/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf b/addons/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf new file mode 100644 index 0000000000..8b7b9a392a --- /dev/null +++ b/addons/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf @@ -0,0 +1,38 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Checks if the door can be closed. + * + * Arguments: + * 0: Helicopter + * 1: Door + * + * Return Value: + * Door can be closed + * + * Example: + * [_vehicle, "DoorLB"] call ace_compat_rhs_usf3_fnc_canCloseDoor + * + * Public: No + */ + +params ["_vehicle", "_door"]; + +(alive _vehicle) && +{!(_vehicle getVariable [QEGVAR(fastroping,doorsLocked),false])} && +{ + switch (true) do { + case (_vehicle isKindOf "rhsusf_CH53E_USMC"): { + ((_vehicle animationPhase _door) > 0) && + {ACE_player == (driver _vehicle)} + }; + case (_vehicle isKindOf "RHS_CH_47F"): { + ((_vehicle animationSourcePhase _door) > 0) && + {ACE_player in [driver _vehicle, _vehicle turretUnit [3], _vehicle turretUnit [4]]} + }; + default { + ((_vehicle doorPhase _door) > 0) && + {ACE_player in _vehicle} + }; + } +} diff --git a/addons/compat_rhs_usf3/functions/fnc_onCut.sqf b/addons/compat_rhs_usf3/functions/fnc_onCut.sqf new file mode 100644 index 0000000000..840c2aa2a7 --- /dev/null +++ b/addons/compat_rhs_usf3/functions/fnc_onCut.sqf @@ -0,0 +1,39 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Function for closing doors and retracting the hooks for RHS USF helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before cutting ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_usf3_fnc_onCut + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; + +private _fries = _vehicle getVariable [QEGVAR(fastroping,FRIES), objNull]; +if !(isNull _fries) then { + _fries animate ["extendHookRight", 0]; + _fries animate ["extendHookLeft", 0]; + [{ + _this animateDoor ["doorRB", 0]; + _this animateDoor ["doorLB", 0]; + _this animate ["doorHandler_R",0]; + _this animate ["doorHandler_L",0]; + }, _vehicle, 2] call CBA_fnc_waitAndExecute; + + 4 +} else { + _vehicle animateDoor ["ramp_anim", 0]; + _vehicle animate ["ramp_bottom",0]; + _vehicle animate ["ramp_top",0]; + + 2 +}; diff --git a/addons/compat_rhs_usf3/functions/fnc_onPrepare.sqf b/addons/compat_rhs_usf3/functions/fnc_onPrepare.sqf new file mode 100644 index 0000000000..39821fb9bd --- /dev/null +++ b/addons/compat_rhs_usf3/functions/fnc_onPrepare.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Function for opening doors and extending the hook for most vanilla helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before deploying ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_usf3_fnc_onPrepare + * + * Public: No + */ +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; + +private _waitTime = 2; + +_vehicle animateDoor ["doorRB", 1]; +_vehicle animateDoor ["doorLB", 1]; +_vehicle animate ["doorHandler_R",1]; +_vehicle animate ["doorHandler_L",1]; +_vehicle animateDoor ["ramp_anim", 1]; +_vehicle animate ["ramp_bottom",0.56]; +_vehicle animate ["ramp_top",1]; + +private _fries = _vehicle getVariable [QEGVAR(fastroping,FRIES), objNull]; +if !(isNull _fries) then { + [{ + _this animate ["extendHookRight", 1]; + _this animate ["extendHookLeft", 1]; + }, _fries, 2] call CBA_fnc_waitAndExecute; + _waitTime = 4; +}; + +_waitTime diff --git a/addons/compat_rhs_usf3/script_component.hpp b/addons/compat_rhs_usf3/script_component.hpp new file mode 100644 index 0000000000..b84324ad8f --- /dev/null +++ b/addons/compat_rhs_usf3/script_component.hpp @@ -0,0 +1,10 @@ +#define COMPONENT compat_rhs_usf3 +#define COMPONENT_BEAUTIFIED RHS USAF Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" + +// Backwards compatibility +#undef GVAR +#define GVAR(var) TRIPLES(PREFIX,COMPONENT,var) diff --git a/optionals/compat_rksl_pm_ii/$PBOPREFIX$ b/addons/compat_rksl_pm_ii/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rksl_pm_ii/$PBOPREFIX$ rename to addons/compat_rksl_pm_ii/$PBOPREFIX$ diff --git a/optionals/compat_rksl_pm_ii/CfgWeapons.hpp b/addons/compat_rksl_pm_ii/CfgWeapons.hpp similarity index 100% rename from optionals/compat_rksl_pm_ii/CfgWeapons.hpp rename to addons/compat_rksl_pm_ii/CfgWeapons.hpp diff --git a/addons/compat_rksl_pm_ii/config.cpp b/addons/compat_rksl_pm_ii/config.cpp new file mode 100644 index 0000000000..e9f2abcbfa --- /dev/null +++ b/addons/compat_rksl_pm_ii/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_scopes", "RKSL_PMII", "RKSL_PMII_525"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "Dedmen"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rksl_pm_ii/script_component.hpp b/addons/compat_rksl_pm_ii/script_component.hpp similarity index 100% rename from optionals/compat_rksl_pm_ii/script_component.hpp rename to addons/compat_rksl_pm_ii/script_component.hpp diff --git a/optionals/compat_sma3_iansky/$PBOPREFIX$ b/addons/compat_sma3_iansky/$PBOPREFIX$ similarity index 100% rename from optionals/compat_sma3_iansky/$PBOPREFIX$ rename to addons/compat_sma3_iansky/$PBOPREFIX$ diff --git a/addons/compat_sma3_iansky/CfgWeapons.hpp b/addons/compat_sma3_iansky/CfgWeapons.hpp new file mode 100644 index 0000000000..e3d3e5a998 --- /dev/null +++ b/addons/compat_sma3_iansky/CfgWeapons.hpp @@ -0,0 +1,20 @@ + +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class iansky_nfbeast: ItemCore { + ACE_ScopeAdjust_Vertical[] = { -0.9, 34 }; + ACE_ScopeAdjust_Horizontal[] = { -11, 11 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class NF25_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/addons/compat_sma3_iansky/config.cpp b/addons/compat_sma3_iansky/config.cpp new file mode 100644 index 0000000000..71ff70755d --- /dev/null +++ b/addons/compat_sma3_iansky/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_scopes", "iansky_opt"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/compat_sma3_iansky/script_component.hpp b/addons/compat_sma3_iansky/script_component.hpp similarity index 100% rename from optionals/compat_sma3_iansky/script_component.hpp rename to addons/compat_sma3_iansky/script_component.hpp diff --git a/optionals/compat_sog/$PBOPREFIX$ b/addons/compat_sog/$PBOPREFIX$ similarity index 100% rename from optionals/compat_sog/$PBOPREFIX$ rename to addons/compat_sog/$PBOPREFIX$ diff --git a/addons/compat_sog/ACE_CSW_Groups.hpp b/addons/compat_sog/ACE_CSW_Groups.hpp new file mode 100644 index 0000000000..2bc81dbb65 --- /dev/null +++ b/addons/compat_sog/ACE_CSW_Groups.hpp @@ -0,0 +1,94 @@ +class ACE_CSW_Groups { + + // --- Gun Turrets ------------------------------------------------------------- + + class ace_csw_100Rnd_127x99_mag { + vn_m2_v_100_mag = 1; + }; + + class GVAR(tow_missile) { + vn_missile_tow_mag_x1 = 1; + }; + + class GVAR(m1919_250) { + vn_m1919_v_250_mag = 1; + }; + + class GVAR(m60_200) { + vn_m60_v_200_mag = 1; + }; + + class vn_m60_100_mag { + vn_m60_v_100_mag = 1; + }; + + class GVAR(dshkm_50) { + vn_dshkm_v_50_mag = 1; + }; + + class vn_rpd_100_mag { + vn_rpd_v_100_mag = 1; + }; + + class vn_pk_100_mag { + vn_pk_v_100_mag = 1; + }; + + class GVAR(mg42_250) { + vn_mg42_v_250_mag = 1; + }; + + class GVAR(sgm_250) { + vn_sgm_v_250_mag = 1; + }; + + class GVAR(mk18_24) { + vn_mk18_v_24_mag = 1; + }; + + class GVAR(mk18_48) { + vn_mk18_v_48_mag = 1; + }; + + // --- Mortars ----------------------------------------------------------------- + + class GVAR(81mm_he) { + vn_mortar_m29_mag_he_x8 = 1; + }; + + class GVAR(81mm_wp) { + vn_mortar_m29_mag_wp_x8 = 1; + }; + + class GVAR(81mm_chem) { + vn_mortar_m29_mag_chem_x8 = 1; + }; + + class GVAR(81mm_lume) { + vn_mortar_m29_mag_lume_x8 = 1; + }; + + class GVAR(60mm_he) { + vn_mortar_m2_mag_he_x8 = 1; + }; + + class GVAR(60mm_wp) { + vn_mortar_m2_mag_wp_x8 = 1; + }; + + class GVAR(60mm_lume) { + vn_mortar_m2_mag_lume_x8 = 1; + }; + + class GVAR(82mm_he) { + vn_mortar_type53_mag_he_x8 = 1; + }; + + class GVAR(82mm_wp) { + vn_mortar_type53_mag_wp_x8 = 1; + }; + + class GVAR(82mm_lume) { + vn_mortar_type53_mag_lume_x8 = 1; + }; +}; diff --git a/addons/compat_sog/ACE_Medical_Injuries.hpp b/addons/compat_sog/ACE_Medical_Injuries.hpp new file mode 100644 index 0000000000..62acb1401f --- /dev/null +++ b/addons/compat_sog/ACE_Medical_Injuries.hpp @@ -0,0 +1,15 @@ +class ACE_Medical_Injuries { + class damageTypes { + class woundHandlers; + + class explosive { + class woundHandlers: woundHandlers {}; + }; + class GVAR(explosive_incendiary): explosive { + class woundHandlers: woundHandlers { + // TODO use function name after bug with the woundHandlers config caching is fixed + ADDON = QUOTE({call FUNC(woundsHandlerIncendiary)}); + }; + }; + }; +}; diff --git a/addons/compat_sog/ACE_Triggers.hpp b/addons/compat_sog/ACE_Triggers.hpp new file mode 100644 index 0000000000..f7a804da13 --- /dev/null +++ b/addons/compat_sog/ACE_Triggers.hpp @@ -0,0 +1,11 @@ +class ACE_Triggers { + class Command; + class GVAR(Command): Command { + isAttachable = 0; + }; + + class MK16_Transmitter: Command {}; // define parent class to make this a soft depency on ACE Explosives + class GVAR(MK16_Transmitter): MK16_Transmitter { + isAttachable = 0; + }; +}; diff --git a/addons/compat_sog/CfgAmmo.hpp b/addons/compat_sog/CfgAmmo.hpp new file mode 100644 index 0000000000..0917727974 --- /dev/null +++ b/addons/compat_sog/CfgAmmo.hpp @@ -0,0 +1,6 @@ +class CfgAmmo { + #include "CfgAmmo\bombs.hpp" + #include "CfgAmmo\explosives.hpp" + #include "CfgAmmo\grenades.hpp" + #include "CfgAmmo\melee.hpp" +}; diff --git a/addons/compat_sog/CfgAmmo/bombs.hpp b/addons/compat_sog/CfgAmmo/bombs.hpp new file mode 100644 index 0000000000..0e35c7b6ec --- /dev/null +++ b/addons/compat_sog/CfgAmmo/bombs.hpp @@ -0,0 +1,15 @@ + +class BombCore; +class vn_bomb_base_he: BombCore { + ACE_damageType = "explosive"; +}; + +class Mo_cluster_AP; +class vn_napalm_cluster_bomb_01: Mo_cluster_AP { + ACE_damageType = QGVAR(explosive_incendiary); +}; + +class ShellBase; +class sticky_napalm_red_small: ShellBase { + ACE_damageType = QGVAR(explosive_incendiary); +}; diff --git a/addons/compat_sog/CfgAmmo/explosives.hpp b/addons/compat_sog/CfgAmmo/explosives.hpp new file mode 100644 index 0000000000..1c4e5ff65b --- /dev/null +++ b/addons/compat_sog/CfgAmmo/explosives.hpp @@ -0,0 +1,161 @@ +class DirectionalBombBase; +class vn_mine_m18_ammo: DirectionalBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.15}; + EGVAR(explosives,size) = 1; + EGVAR(explosives,explosive) = "vn_mine_m18_ammo_scripted"; +}; + +class vn_mine_m18_x3_ammo: vn_mine_m18_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.1}; + EGVAR(explosives,explosive) = "vn_mine_m18_x3_ammo_scripted"; +}; + +class vn_mine_m16_base; +class vn_mine_tripwire_m16_02_ammo: vn_mine_m16_base { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.01, 0.088}; +}; + +class APERSTripMine_Wire_Ammo; +class vn_mine_tripwire_f1_02_ammo: APERSTripMine_Wire_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.01, 0.18}; +}; + +class vn_mine_tripwire_arty_ammo: vn_mine_tripwire_f1_02_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.01, 0.126}; +}; + +class DemoCharge_Remote_Ammo; +class vn_mine_m112_remote_ammo: DemoCharge_Remote_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.22, 0.75}; +}; + +// Disable engine damage of punji traps, script damage manually +// This allows a tighter control of caused wounds and removes ear ringing +class APERSBoundingMine_Range_Ammo; +class vn_mine_punji_01_ammo: APERSBoundingMine_Range_Ammo { + EGVAR(minedetector,detectable) = 0; + + hit = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_punji_01_ammo' >> 'GVAR(hit)')); + GVAR(hit) = QUOTE([ARR_2(0,1)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); + + indirectHit = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_punji_01_ammo' >> 'GVAR(indirectHit)')); + GVAR(indirectHit) = QUOTE([ARR_2(0,10)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); + + class EventHandlers { + class ADDON { + AmmoHit = QUOTE(call FUNC(handlePunjiTrapTrigger)); + }; + }; +}; + +class vn_mine_punji_02_ammo: vn_mine_punji_01_ammo { + indirectHit = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_punji_02_ammo' >> 'GVAR(indirectHit)')); + GVAR(indirectHit) = QUOTE([ARR_2(0,5)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); +}; + +class vn_mine_punji_03_ammo: vn_mine_punji_01_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.25, 0.023, 0.035}; + + class EventHandlers { + class ADDON { + AmmoHit = QUOTE(call FUNC(handlePunjiTrapTrigger)); + }; + }; +}; + +class vn_mine_punji_04_ammo: APERSBoundingMine_Range_Ammo { + EGVAR(minedetector,detectable) = 0; + + hit = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_punji_01_ammo' >> 'GVAR(hit)')); + GVAR(hit) = QUOTE([ARR_2(0,1)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); + + indirectHit = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_punji_01_ammo' >> 'GVAR(indirectHit)')); + GVAR(indirectHit) = QUOTE([ARR_2(0,10)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); + + GVAR(spikesOffset)[] = {0, 0, 1.8}; + GVAR(spikesCheckSelection) = "head"; + GVAR(spikesCheckRadius) = 1; + + class EventHandlers { + class ADDON { + AmmoHit = QUOTE(call FUNC(handlePunjiTrapTrigger)); + }; + }; +}; + +class vn_mine_punji_05_ammo: vn_mine_punji_04_ammo { + GVAR(spikesOffset)[] = {0, 0, 0}; + GVAR(spikesCheckSelection) = ""; + + class EventHandlers { + class ADDON { + AmmoHit = QUOTE(call FUNC(handlePunjiTrapTrigger)); + }; + }; +}; + +class APERSMine_Range_Ammo; +class vn_mine_bike_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,explosive) = "vn_mine_bike_ammo_scripted"; +}; + +class vn_mine_cartridge_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,explosive) = "vn_mine_cartridge_ammo_scripted"; + + // bump range and damage slightly, default values do not work well with ACE Medical + indirectHit = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_cartridge_ammo' >> 'GVAR(indirectHit)')); + GVAR(indirectHit) = QUOTE([ARR_2(2,1)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); + + indirectHitRange = QUOTE(getNumber (configFile >> 'CfgAmmo' >> 'vn_mine_cartridge_ammo' >> 'GVAR(indirectHitRange)')); + GVAR(indirectHitRange) = QUOTE([ARR_2(0.7,0.3)] select isNull (configFile >> 'CfgPatches' >> 'ace_medical')); +}; + +class vn_mine_lighter_ammo: APERSMine_Range_Ammo { + ACE_damageType = QGVAR(explosive_incendiary); + + EGVAR(explosives,explosive) = "vn_mine_lighter_ammo_scripted"; +}; + +class vn_mine_jerrycan_ammo: APERSMine_Range_Ammo { + ACE_damageType = QGVAR(explosive_incendiary); + + EGVAR(explosives,explosive) = "vn_mine_jerrycan_ammo_scripted"; +}; + +class vn_mine_pot_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,explosive) = "vn_mine_pot_ammo_scripted"; +}; + +class vn_mine_mortar_range_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,explosive) = "vn_mine_mortar_range_ammo_scripted"; +}; + +class vn_mine_limpet_01_ammo: DemoCharge_Remote_Ammo { + EGVAR(explosives,explosive) = "vn_mine_limpet_01_ammo_scripted"; +}; + +class vn_mine_limpet_02_ammo: vn_mine_limpet_01_ammo { + EGVAR(explosives,explosive) = "vn_mine_limpet_02_ammo_scripted"; +}; + +class vn_mine_chicom_no8_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,explosive) = "vn_mine_chicom_no8_ammo_scripted"; +}; + +class vn_mine_dh10_ammo: DirectionalBombBase { + EGVAR(explosives,explosive) = "vn_mine_dh10_ammo_scripted"; +}; + +class PipeBombBase; +class vn_mine_gboard_range_ammo: PipeBombBase { + EGVAR(explosives,explosive) = "vn_mine_gboard_range_ammo_scripted"; +}; + +class SatchelCharge_Remote_Ammo; +class vn_mine_satchelcharge_02_ammo: SatchelCharge_Remote_Ammo { + EGVAR(explosives,explosive) = "vn_mine_satchelcharge_02_ammo_scripted"; +}; + +class vn_mine_bangalore_ammo: SatchelCharge_Remote_Ammo { + EGVAR(explosives,explosive) = "vn_mine_bangalore_ammo_scripted"; +}; diff --git a/addons/compat_sog/CfgAmmo/grenades.hpp b/addons/compat_sog/CfgAmmo/grenades.hpp new file mode 100644 index 0000000000..d280443b6e --- /dev/null +++ b/addons/compat_sog/CfgAmmo/grenades.hpp @@ -0,0 +1,10 @@ +class vn_grenadehand; +class vn_molotov_grenade_ammo: vn_grenadehand { + ACE_damageType = QGVAR(explosive_incendiary); + EGVAR(frag,enabled) = 0; +}; + +class SmokeShell; +class vn_m14_grenade_ammo: SmokeShell { + EGVAR(grenades,incendiary) = 1; +}; diff --git a/optionals/compat_sog/CfgAmmo/melee.hpp b/addons/compat_sog/CfgAmmo/melee.hpp similarity index 100% rename from optionals/compat_sog/CfgAmmo/melee.hpp rename to addons/compat_sog/CfgAmmo/melee.hpp diff --git a/addons/compat_sog/CfgEventHandlers.hpp b/addons/compat_sog/CfgEventHandlers.hpp new file mode 100644 index 0000000000..fc6d80fc5f --- /dev/null +++ b/addons/compat_sog/CfgEventHandlers.hpp @@ -0,0 +1,40 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; + +class Extended_InitPost_EventHandlers { + class GVAR(spiderhole_01_nogeo) { + class ADDON { + init = QUOTE((_this select 0) setMass 1e-12); + }; + }; + class GVAR(spiderhole_02_nogeo) { + class ADDON { + init = QUOTE((_this select 0) setMass 1e-12); + }; + }; + class GVAR(spiderhole_03_nogeo) { + class ADDON { + init = QUOTE((_this select 0) setMass 1e-12); + }; + }; + class vn_bicycle_base { + class ADDON { + init = QUOTE(call FUNC(disableCookoff)); + }; + }; +}; diff --git a/optionals/compat_sog/CfgGlasses.hpp b/addons/compat_sog/CfgGlasses.hpp similarity index 100% rename from optionals/compat_sog/CfgGlasses.hpp rename to addons/compat_sog/CfgGlasses.hpp diff --git a/addons/compat_sog/CfgMagazines.hpp b/addons/compat_sog/CfgMagazines.hpp new file mode 100644 index 0000000000..c67e12edbc --- /dev/null +++ b/addons/compat_sog/CfgMagazines.hpp @@ -0,0 +1,6 @@ +class CfgMagazines { + #include "CfgMagazines\belts.hpp" + #include "CfgMagazines\csw.hpp" + #include "CfgMagazines\explosives.hpp" + #include "CfgMagazines\food.hpp" +}; diff --git a/optionals/compat_sog/CfgMagazines/belts.hpp b/addons/compat_sog/CfgMagazines/belts.hpp similarity index 100% rename from optionals/compat_sog/CfgMagazines/belts.hpp rename to addons/compat_sog/CfgMagazines/belts.hpp diff --git a/addons/compat_sog/CfgMagazines/csw.hpp b/addons/compat_sog/CfgMagazines/csw.hpp new file mode 100644 index 0000000000..f1532c6513 --- /dev/null +++ b/addons/compat_sog/CfgMagazines/csw.hpp @@ -0,0 +1,215 @@ +class vn_missile_tow_mag_x1; +class GVAR(tow_missile): vn_missile_tow_mag_x1 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\tow\vn_static_tow_mag.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_tow_ca.paa); + mass = 220; // to Arma, weight and volume are all the same which makes real life values unusable +}; + +// --- Gun Turrets ------------------------------------------------------------- + +class vn_m1919_v_250_mag; +class GVAR(m1919_250): vn_m1919_v_250_mag { + scope = 2; + scopeArsenal = 2; + type = 256; + count = 250; + model = "\vn\objects_f_vietnam\supply\a2_ammo\macv\vn_us_30cal.p3d"; + picture = QPATHTOF(UI\ammo_250rnd_30cal_ca.paa); + ACE_isBelt = 1; + mass = 170; +}; + +class vn_m60_v_200_mag; +class GVAR(m60_200): vn_m60_v_200_mag { + scope = 2; + type = 256; + count = 200; + model = "\vn\objects_f_vietnam\supply\a2_ammo\macv\vn_us_can_30.p3d"; + picture = QPATHTOF(UI\ammo_200rnd_762mm_ca.paa); + ACE_isBelt = 1; + mass = 187; +}; + +class vn_dshkm_v_50_mag; +class GVAR(dshkm_50): vn_dshkm_v_50_mag { + scope = 2; + type = 256; + count = 50; + model = "\vn\objects_f_vietnam\supply\a2_ammo\pavn\vn_pavn_50_can.p3d"; + picture = QPATHTOF(UI\ammo_50rnd_127mm_ca.paa); + ACE_isBelt = 1; + mass = 170; +}; + +class vn_mg42_v_250_mag; +class GVAR(mg42_250): vn_mg42_v_250_mag { + scope = 2; + type = 256; + model = "\vn\objects_f_vietnam\supply\a2_ammo\pavn\vn_pavn_30_can.p3d"; + picture = "\vn\weapons_f_vietnam\ui\icon_vn_pk_100_mag_ca.paa"; + ACE_isBelt = 1; + mass = 160; +}; + +class vn_sgm_v_250_mag; +class GVAR(sgm_250): vn_sgm_v_250_mag { + scope = 2; + type = 256; + model = "\vn\objects_f_vietnam\supply\a2_ammo\pavn\vn_pavn_30_can.p3d"; + picture = "\vn\weapons_f_vietnam\ui\icon_vn_pk_100_mag_ca.paa"; + ACE_isBelt = 1; + mass = 160; +}; + +class vn_mk18_v_24_mag; +class GVAR(mk18_24): vn_mk18_v_24_mag { + scope = 2; + type = 256; + 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); + mass = 160; +}; + +class vn_mk18_v_48_mag; +class GVAR(mk18_48): vn_mk18_v_48_mag { + scope = 2; + type = 256; + 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); + mass = 220; +}; + +// --- Mortars ----------------------------------------------------------------- + +class vn_mortar_m29_mag_he_x8; +class GVAR(81mm_he): vn_mortar_m29_mag_he_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m29\vn_shell_81mm_m374_he_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_81mm_ca.paa); + mass = 91; + displayName = CSTRING(Magazine_81mm_HE); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_m29_mag_wp_x8; +class GVAR(81mm_wp): vn_mortar_m29_mag_wp_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m29\vn_shell_81mm_m374_he_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_81mm_ca.paa); + mass = 91; + displayName = CSTRING(Magazine_81mm_WP); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_m29_mag_chem_x8; +class GVAR(81mm_chem): vn_mortar_m29_mag_chem_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m29\vn_shell_81mm_m374_he_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_81mm_ca.paa); + mass = 91; + displayName = CSTRING(Magazine_81mm_Smoke); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_m29_mag_lume_x8; +class GVAR(81mm_lume): vn_mortar_m29_mag_lume_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m29\vn_shell_81mm_m374_he_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_81mm_ca.paa); + mass = 91; + displayName = CSTRING(Magazine_81mm_Lume); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_m2_mag_he_x8; +class GVAR(60mm_he): vn_mortar_m2_mag_he_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m2\vn_shell_60mm_m49a2_he_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_60mm_ca.paa); + mass = 37; + displayName = CSTRING(Magazine_60mm_HE); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_m2_mag_wp_x8; +class GVAR(60mm_wp): vn_mortar_m2_mag_wp_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m2\vn_shell_60mm_m302_wp_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_60mm_ca.paa); + mass = 37; + displayName = CSTRING(Magazine_60mm_WP); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_m2_mag_lume_x8; +class GVAR(60mm_lume): vn_mortar_m2_mag_lume_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_m2\vn_shell_60mm_m83_lume_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_60mm_ca.paa); + mass = 37; + displayName = CSTRING(Magazine_60mm_Lume); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_type53_mag_he_x8; +class GVAR(82mm_he): vn_mortar_type53_mag_he_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_type53\vn_shell_82mm_o832d_he_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_82mm_ca.paa); + mass = 70; + displayName = CSTRING(Magazine_82mm_HE); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_type53_mag_wp_x8; +class GVAR(82mm_wp): vn_mortar_type53_mag_wp_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_type53\vn_shell_82mm_d832_wp_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_82mm_ca.paa); + mass = 70; + displayName = CSTRING(Magazine_82mm_WP); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; + +class vn_mortar_type53_mag_lume_x8; +class GVAR(82mm_lume): vn_mortar_type53_mag_lume_x8 { + scope = 2; + type = 256; + count = 1; + model = "\vn\static_f_vietnam\mortar_type53\vn_shell_82mm_s832s_lume_ammo.p3d"; + picture = QPATHTOF(UI\ammo_1rnd_82mm_ca.paa); + mass = 70; + displayName = CSTRING(Magazine_82mm_Lume); + displayNameShort = ""; + descriptionShort = ECSTRING(mk6mortar,magazine_descriptionShort); +}; diff --git a/addons/compat_sog/CfgMagazines/explosives.hpp b/addons/compat_sog/CfgMagazines/explosives.hpp new file mode 100644 index 0000000000..8da412d6e2 --- /dev/null +++ b/addons/compat_sog/CfgMagazines/explosives.hpp @@ -0,0 +1,395 @@ +class vn_magazine; + +// Claymore (Remote) +class vn_mine_m18_mag: vn_magazine { + useAction = 0; + + displayNameShort = ""; // Every explosive inherits this and it breaks naming in the placing menu + + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m18); + + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + digDistance = -0.05; + fuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + }; +}; +// Claymore (Proximity) +class vn_mine_m18_range_mag: vn_mine_m18_mag { + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = -0.05; + }; + }; +}; + +// Claymore x3 (Remote) +class vn_mine_m18_x3_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m18_x3); + + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + digDistance = 0.02; + fuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + }; +}; +// Claymore x3 (Proximity) +class vn_mine_m18_x3_range_mag: vn_mine_m18_x3_mag { + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; +}; + +// Toe-Popper +class vn_mine_m14_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m14); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.001; + }; + }; +}; + +// Bounding Mine +class vn_mine_m16_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m16); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; +}; + +// Bounding Mine (Trip Wire 2m) +class vn_mine_tripwire_m16_02_mag: vn_mine_m16_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m16_tripwire_2m); + + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.02; + }; + }; +}; +// Bounding Mine (Trip Wire 4m) +class vn_mine_tripwire_m16_04_mag: vn_mine_tripwire_m16_02_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m16_tripwire_4m); + + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.02; + }; + }; +}; + +// F1 (Trip Wire 2m) +class vn_mine_tripwire_f1_02_mag: vn_mine_tripwire_m16_02_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(f1_tripwire_2m); +}; +// F1 (Trip Wire 4m) +class vn_mine_tripwire_f1_04_mag: vn_mine_tripwire_f1_02_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(f1_tripwire_4m); +}; + +// Arty Shell (Trip Wire 4m) +class vn_mine_tripwire_arty_mag: vn_mine_tripwire_m16_02_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(arty_tripwire_4m); +}; + +// Satchel Charge +class vn_mine_satchel_remote_02_mag: vn_mine_m18_mag { + useAction = 0; + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(satchel_remote_02); + + 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 {}; + }; +}; + +// TM57 Anti-Tank Mine +class vn_mine_tm57_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(tm57); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate {}; + }; +}; + +// M15 Anti-Tank Mine +class vn_mine_m15_mag: vn_mine_tm57_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m15); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; +}; + +// M112 Breaching charge +class vn_mine_m112_remote_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m112); + + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; + class Timer { + fuseTime = 0.5; + digDistance = 1; + }; + class Command { + fuseTime = 0.5; + digDistance = 1; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; +}; + +// Spiked ammo box +class vn_mine_ammobox_range_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(ammobox_range); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.01; + }; + }; +}; + +// Punji large +class vn_mine_punji_01_mag: vn_mine_m18_mag { + useAction = 0; + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_01); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + displayName = CSTRING(Action_DigIn); + }; + }; +}; + +// Punji small +class vn_mine_punji_02_mag: vn_mine_punji_01_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_02); +}; + +// Punji whip +class vn_mine_punji_03_mag: vn_mine_punji_01_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_03); +}; + +// Punji door-way +class vn_mine_punji_04_mag: vn_mine_m18_mag { + useAction = 0; + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_04); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + displayName = CSTRING(Action_DigIn); + digDistance = -2.14; + }; + }; +}; + +// Punji side whip +class vn_mine_punji_05_mag: vn_mine_punji_04_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_05); + + class ACE_Triggers: ACE_Triggers { + class PressurePlate: PressurePlate { + digDistance = 0; + }; + }; +}; + +// Bike mine (Remote) +class vn_mine_bike_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(bike); + + class ACE_Triggers { + SupportedTriggers[] = {QGVAR(Command), QGVAR(MK16_Transmitter)}; + class GVAR(Command) { + digDistance = 0; + fuseTime = 1; + }; + class GVAR(MK16_Transmitter): GVAR(Command) {}; + }; +}; +// Bike mine (Proximity) +class vn_mine_bike_range_mag: vn_mine_bike_mag { + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; +}; + +// Cartridge mine +class vn_mine_cartridge_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(cartridge); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; +}; + +// Lighter mine (Proximity) +class vn_mine_lighter_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(lighter); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; +}; + +// Pot mine (Remote) +class vn_mine_pot_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(pot); + + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + digDistance = 0; + fuseTime = 1; + }; + class MK16_Transmitter: Command {}; + }; +}; +// Pot mine (Proximity) +class vn_mine_pot_range_mag: vn_mine_pot_mag { + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; +}; + +// Jerrycan mine (Remote) +class vn_mine_jerrycan_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(jerrycan); + + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + digDistance = 0.02; + fuseTime = 1; + }; + class MK16_Transmitter: Command {}; + }; +}; +// Jerrycan mine (Proximity) +class vn_mine_jerrycan_range_mag: vn_mine_jerrycan_mag { + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; +}; + +// Mortar shell on a stick (Proximity) +class vn_mine_mortar_range_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(mortar_range); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.5; + }; + }; +}; + +// Limpet mine USA (Remote) +class vn_mine_limpet_01_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(limpet_01); +}; + +// Limpet mine RUS (Remote) +class vn_mine_limpet_02_mag: vn_mine_limpet_01_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(limpet_02); +}; + +// Chicom NO8 mine +class vn_mine_chicom_no8_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(chicom_no8); + + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; +}; + +// DH10 mine (Remote) +class vn_mine_dh10_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(dh10); +}; +// DH10 mine (Proximity) +class vn_mine_dh10_range_mag: vn_mine_dh10_mag { + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0; + }; + }; +}; + +// Grenade board mine (Tripwire 4m) +class vn_mine_gboard_range_mag: vn_mine_m18_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(gboard); + + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0; + }; + }; +}; + +// Satchel charge +class vn_mine_satchelcharge_02_mag: vn_mine_satchel_remote_02_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(satchelcharge_02); +}; + +// Bangalore mine +class vn_mine_bangalore_mag: vn_mine_satchel_remote_02_mag { + EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(bangalore); +}; diff --git a/addons/compat_sog/CfgMagazines/food.hpp b/addons/compat_sog/CfgMagazines/food.hpp new file mode 100644 index 0000000000..b8f2c956e2 --- /dev/null +++ b/addons/compat_sog/CfgMagazines/food.hpp @@ -0,0 +1,675 @@ +#define DRINKING_ANIMS \ + EXGVAR(field_rations,consumeAnims)[] = { \ + QEGVAR(field_rations,drinkStand), \ + QEGVAR(field_rations,drinkCrouch), \ + QEGVAR(field_rations,drinkProne) \ + } +#define DRINKING_SOUNDS \ + EXGVAR(field_rations,consumeSounds)[] = { \ + QEGVAR(field_rations,drink1), \ + QEGVAR(field_rations,drink1), \ + QEGVAR(field_rations,drink2) \ + } + +class vn_prop_base; + +// US Canteen 0.75l +class vn_prop_drink_01: vn_prop_base { + // assuming 250ml = 5% of thirst + EXGVAR(field_rations,thirstQuenched) = 15; + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// US Canteen 1.0l +class vn_prop_drink_02: vn_prop_drink_01 { + EXGVAR(field_rations,thirstQuenched) = 20; + EXGVAR(field_rations,replacementItem) = "ACE_Canteen_Empty"; +}; + +// NVA Canteen 0.76l +class vn_prop_drink_03: vn_prop_drink_01 { + EXGVAR(field_rations,thirstQuenched) = 16; +}; + +// NVA Canteen 1.1l +class vn_prop_drink_04: vn_prop_drink_01 { + EXGVAR(field_rations,thirstQuenched) = 22; + EXGVAR(field_rations,replacementItem) = "ACE_Canteen_Empty"; +}; + +// Bottle 0.5l +class vn_prop_drink_05: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = 10; + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Bottle 2.0l +class vn_prop_drink_06: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = 40; + + EXGVAR(field_rations,consumeTime) = 15; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Tilts Hot Sauce +class vn_prop_drink_07_01: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = -10; + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Hoangs Muoc Mam +class vn_prop_drink_07_02: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = -10; + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Napalm Sauce +class vn_prop_drink_07_03: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = -10; + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Savage Bia (Beer) +class vn_prop_drink_08_01: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = 10; + EXGVAR(field_rations,hungerSatiated) = 2; // beer is food too ;) + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Whiskey +class vn_prop_drink_09_01: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = 5; + + EXGVAR(field_rations,consumeTime) = 10; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Water pack 2.0l +class vn_prop_drink_10: vn_prop_base { + EXGVAR(field_rations,thirstQuenched) = 40; + + EXGVAR(field_rations,consumeTime) = 15; + DRINKING_ANIMS; + DRINKING_SOUNDS; +}; + +// Ration 0.75Kg +class vn_prop_food_meal_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 15; + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Fox Hole Dinner for Two. Chicken and Noodles + Turkey Loaf + Cheese Spread + Hot sauce +class vn_prop_food_meal_01_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Soup Du Jour. Ham and Lima Beans + Crackers + Hot sauce +class vn_prop_food_meal_01_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Breast of Chicken Under Bullets. Boned Chicken + Cheese Spread + White Bread + Hot sauce +class vn_prop_food_meal_01_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Battlefield Fufu. Boned Chicken + Peanut Butter + Milk + Hot sauce +class vn_prop_food_meal_01_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Ham with Spiced Apricots. Fried Ham + Apricots + Jam + Hot sauce +class vn_prop_food_meal_01_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Pork Mandarin. Pork-steak + Hot sauce +class vn_prop_food_meal_01_06: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Tin Can Casserole. Frank and Beans + Beefsteak + Crackers + Cheese Spread + Hot sauce +class vn_prop_food_meal_01_07: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Creamed Turkey on Toast. Turkey loaf + White Bread + Hot sauce +class vn_prop_food_meal_01_08: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Fish with Front line Stuffing. Crackers + Ham and Egg Chopped + Hot sauce +class vn_prop_food_meal_01_09: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Combat Zone Burgoo. Spiced Beef + Ham and Lima Beans + Crackers + Hot sauce +class vn_prop_food_meal_01_10: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Patrol Chicken Soup. Fresh Chicken + Crackers + Hot sauce +class vn_prop_food_meal_01_11: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Guard Relief Eggs Benedict. White Bread + Ham and Eggs Chopped + Cheese Spread + Hot sauce +class vn_prop_food_meal_01_12: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Beefsteak En Croute. White Bread + Beefsteak + Hot sauce +class vn_prop_food_meal_01_13: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Curried Meat Balls Over Rice. Meat Balls and Beans + Hot sauce +class vn_prop_food_meal_01_14: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Cease Fire Casserole. Beefsteak + Spiced Beef + Hot sauce +class vn_prop_food_meal_01_15: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Rice Paddy Shrimp. Fresh Shrimp + Cheese Spread + Hot sauce +class vn_prop_food_meal_01_16: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Battlefield Birthday Cake. Pound Cake + Chocolate Candy + Hot sauce +class vn_prop_food_meal_01_17: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Pecan Cake Roll with Peanut Butter Sauce. Pecan Cake Roll + Peanut Butter + Hot sauce +class vn_prop_food_meal_01_18: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,thirstQuenched) = -1; // hot! + + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Con ho. Rice + Tiger + Vegetables + Fish Sauce +class vn_prop_food_meal_02_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Con voi. Rice + Elephant + Vegetables + Fish Sauce +class vn_prop_food_meal_02_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Con ran. Rice + Snake + Vegetables + Fish Sauce +class vn_prop_food_meal_02_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Cha ca la vong. Rice + Fish + Vegetables + Fish Sauce +class vn_prop_food_meal_02_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Con tom. Rice + Shrimp + Vegetables + Fish sauce +class vn_prop_food_meal_02_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Pho ga. Rice + Chicken + Vegetables + Fish sauce +class vn_prop_food_meal_02_06: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// PIR Rations. Contains 1Kg of high energy food: PIR ration (Beef) +class vn_prop_food_pir_01_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// PIR Rations. Contains 1Kg of high energy food: PIR ration (Fish and Squid) +class vn_prop_food_pir_01_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// PIR Rations. Contains 1Kg of high energy food: PIR ration (Shrimp and Mushroom) +class vn_prop_food_pir_01_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// PIR Rations. Contains 1Kg of high energy food: PIR ration (Mutton) +class vn_prop_food_pir_01_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// PIR Rations. Contains 1Kg of high energy food: PIR ration (Sausage) +class vn_prop_food_pir_01_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 10Kg of food: Ration box (LRP Ration Box) +class vn_prop_food_box_01_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 100; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 10Kg of food: Ration box (PIR Ration Box) +class vn_prop_food_box_01_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 100; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 10Kg of food: Ration box (MCI Ration Box) +class vn_prop_food_box_01_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 100; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Ham and Eggs Chopped) +class vn_prop_food_box_02_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Ham Fried) +class vn_prop_food_box_02_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Beans w/ Frankfurter Chunks) +class vn_prop_food_box_02_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Spaghetti w/ Ground Meat) +class vn_prop_food_box_02_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Turkey Loaf) +class vn_prop_food_box_02_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Pork Steak) +class vn_prop_food_box_02_06: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Beef w/ Spiced Sauce) +class vn_prop_food_box_02_07: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Boxed Rations. Contains 2Kg of food: Ration box (Chicken Boned) +class vn_prop_food_box_02_08: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 50; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Beefsteak) +class vn_prop_food_can_01_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Spiced Sauce) +class vn_prop_food_can_01_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Turkey Loaf) +class vn_prop_food_can_01_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Ham, Fried) +class vn_prop_food_can_01_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Ham and Eggs Chopped) +class vn_prop_food_can_01_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Tuna) +class vn_prop_food_can_01_06: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Chicken and Noodles) +class vn_prop_food_can_01_07: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Chicken Boned) +class vn_prop_food_can_01_08: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Pork Slices with Juices) +class vn_prop_food_can_01_09: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (B-1A Unit Crackers and Candy) +class vn_prop_food_can_01_10: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (B-2 Unit Crackers and Cheese Spread) +class vn_prop_food_can_01_11: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Pound Cake) +class vn_prop_food_can_01_12: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Pecan Cake Roll) +class vn_prop_food_can_01_13: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Chocolate Nut Roll) +class vn_prop_food_can_01_14: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (Fruitcake) +class vn_prop_food_can_01_15: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.5Kg of food: Ration can (White Bread) +class vn_prop_food_can_01_16: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 25; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Beans w/ Meat Balls in Tomato Sauce) +class vn_prop_food_can_02_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Ham and Lima Beans) +class vn_prop_food_can_02_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Beans w/ Frankfurter Chunks in Tomato Sauce) +class vn_prop_food_can_02_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Spaghetti w/ Ground Meat) +class vn_prop_food_can_02_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (B-3 Unit Cookies, Jam and Cocoa Beverage Powder) +class vn_prop_food_can_02_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Apricots) +class vn_prop_food_can_02_06: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Peaches) +class vn_prop_food_can_02_07: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.75Kg of food: Ration can (Pears) +class vn_prop_food_can_02_08: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.3Kg of food: Ration can (Peanut Butter) +class vn_prop_food_can_03_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 15; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.3Kg of food: Ration can (Jam, Seedless Blackberry) +class vn_prop_food_can_03_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 15; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.3Kg of food: Ration can (Pineapple Jam) +class vn_prop_food_can_03_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 15; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Canned Rations. Contains 0.3Kg of food: Ration can (Cheese Spread) +class vn_prop_food_can_03_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 15; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Orange +class vn_prop_food_fresh_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 10; + EXGVAR(field_rations,thirstQuenched) = 10; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Pumpik 3Kg +class vn_prop_food_fresh_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,thirstQuenched) = 5; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Chicken 3Kg +class vn_prop_food_fresh_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 35; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Shrimp 3Kg +class vn_prop_food_fresh_04: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Fish 3Kg +class vn_prop_food_fresh_05: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Pork 3Kg +class vn_prop_food_fresh_06: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 35; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Snake 3Kg +class vn_prop_food_fresh_07: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Tiger 3Kg +class vn_prop_food_fresh_08: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Elephant 3Kg +class vn_prop_food_fresh_09: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 20; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// Rau Ma 3Kg +class vn_prop_food_fresh_10: vn_prop_food_fresh_03 { + EXGVAR(field_rations,hungerSatiated) = 30; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Beef Hash) +class vn_prop_food_lrrp_01_01: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Chili Con Carne) +class vn_prop_food_lrrp_01_02: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Spaghetti w/ Meat Sauce) +class vn_prop_food_lrrp_01_03: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Beef and Rice) +class vn_prop_food_lrrp_01_04: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Chicken Stew) +class vn_prop_food_lrrp_01_05: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Pork w/ Escalloped Potatoes) +class vn_prop_food_lrrp_01_06: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Beef Stew) +class vn_prop_food_lrrp_01_07: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; + +// LRRP Rations. Contains 1Kg of high energy food: LRRP ration (Chicken and Rice) +class vn_prop_food_lrrp_01_08: vn_prop_base { + EXGVAR(field_rations,hungerSatiated) = 90; + EXGVAR(field_rations,consumeTime) = 10; +}; diff --git a/addons/compat_sog/CfgVehicles.hpp b/addons/compat_sog/CfgVehicles.hpp new file mode 100644 index 0000000000..d96ae7b75c --- /dev/null +++ b/addons/compat_sog/CfgVehicles.hpp @@ -0,0 +1,14 @@ +class CfgVehicles { + #include "CfgVehicles\backpacks.hpp" + #include "CfgVehicles\boxes.hpp" + #include "CfgVehicles\explosives.hpp" + #include "CfgVehicles\helicopters.hpp" + #include "CfgVehicles\planes.hpp" + #include "CfgVehicles\tracked.hpp" + #include "CfgVehicles\turrets.hpp" + #include "CfgVehicles\units.hpp" + #include "CfgVehicles\wheeled.hpp" + #include "CfgVehicles\land.hpp" + #include "CfgVehicles\vn_boxes.hpp" + #include "CfgVehicles\boats.hpp" +}; diff --git a/addons/compat_sog/CfgVehicles/backpacks.hpp b/addons/compat_sog/CfgVehicles/backpacks.hpp new file mode 100644 index 0000000000..8feb83332c --- /dev/null +++ b/addons/compat_sog/CfgVehicles/backpacks.hpp @@ -0,0 +1,33 @@ + +class vn_b_pack_pfield_01; +class vn_b_pack_pfield_02: vn_b_pack_pfield_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; + +class vn_b_pack_p08_01; +class vn_b_pack_p08_02: vn_b_pack_p08_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; + +class vn_b_pack_p08_03: vn_b_pack_p08_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; + +class vn_b_pack_p44_01; +class vn_b_pack_p44_02: vn_b_pack_p44_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; + +class vn_b_pack_p44_03: vn_b_pack_p44_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; + +class vn_b_pack_01; +class vn_b_pack_prc77_01: vn_b_pack_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; + +class vn_b_pack_lw_01; +class vn_b_pack_lw_03: vn_b_pack_lw_01 { + EGVAR(trenches,entrenchingTool) = 1; +}; diff --git a/addons/compat_sog/CfgVehicles/boats.hpp b/addons/compat_sog/CfgVehicles/boats.hpp new file mode 100644 index 0000000000..52aaef6b85 --- /dev/null +++ b/addons/compat_sog/CfgVehicles/boats.hpp @@ -0,0 +1,20 @@ +// PTF Nasty https://www.ptfnasty.com/ptf17chap2.html (610 Gallons) +class vn_boat_armed_base; +class vn_boat_05_base: vn_boat_armed_base { + EGVAR(refuel,fuelCapacity) = 2773; +}; + +// PBR https://www.warboats.org/pbr.htm +class vn_boat_12_base: vn_boat_armed_base { + EGVAR(refuel,fuelCapacity) = 727; +}; + +// STAB https://www.powercatboat.com/STAB/STAB.html +class vn_boat_09_base: vn_boat_armed_base { + EGVAR(refuel,fuelCapacity) = 464; +}; + +// Type 55A Shantou Gunboat (Could find no info on this, so same as the similarly sized PTF for now) +class vn_boat_03_base: vn_boat_armed_base { + EGVAR(refuel,fuelCapacity) = 2773; +}; diff --git a/optionals/compat_sog/CfgVehicles/boxes.hpp b/addons/compat_sog/CfgVehicles/boxes.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/boxes.hpp rename to addons/compat_sog/CfgVehicles/boxes.hpp diff --git a/addons/compat_sog/CfgVehicles/explosives.hpp b/addons/compat_sog/CfgVehicles/explosives.hpp new file mode 100644 index 0000000000..0ff596451b --- /dev/null +++ b/addons/compat_sog/CfgVehicles/explosives.hpp @@ -0,0 +1,257 @@ +class Items_base_F; +class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + class EventHandlers; +}; + +// Claymore +class EXPLOSIVES_PLACE(m18): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_M18_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m18\vn_mine_m18"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.15]"; + }; + }; +}; + +// Claymore x3 +class EXPLOSIVES_PLACE(m18_x3): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_M18_X3_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m18\vn_mine_m18_x3"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.1]"; + }; + }; +}; + +// Toe-Popper +class EXPLOSIVES_PLACE(m14): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_M14_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m14\vn_mine_m14_mag"; +}; + +// Bounding Mine +class EXPLOSIVES_PLACE(m16): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_M16_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m16\vn_mine_m16_mag"; +}; + +// Bounding Mine (Trip Wire 2m) +class EXPLOSIVES_PLACE(m16_tripwire_2m): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_TRIPWIRE_M16_04_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m16\vn_mine_tripwire_m16_02"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.0093, 0.088]"; + }; + }; +}; +// Bounding Mine (Trip Wire 4m) +class EXPLOSIVES_PLACE(m16_tripwire_4m): EXPLOSIVES_PLACE(m16_tripwire_2m) { + displayName = "$STR_VN_MINE_TRIPWIRE_M16_04_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m16\vn_mine_tripwire_m16_04"; +}; + +// F1 (Trip Wire 2m) +class EXPLOSIVES_PLACE(f1_tripwire_2m): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_TRIPWIRE_F1_02_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\tripwire_f1\vn_mine_tripwire_f1_02"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.011, 0.18]"; + }; + }; +}; +// F1 (Trip Wire 4m) +class EXPLOSIVES_PLACE(f1_tripwire_4m): EXPLOSIVES_PLACE(f1_tripwire_2m) { + displayName = "$STR_VN_MINE_TRIPWIRE_F1_04_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\tripwire_f1\vn_mine_tripwire_f1_04"; +}; + +// Arty Shell (Trip Wire 4m) +class EXPLOSIVES_PLACE(arty_tripwire_4m): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_TRIPWIRE_ARTY_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\tripwire_arty\vn_mine_tripwire_arty"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.01, 0.126]"; + }; + }; +}; + +// Satchel Charge +class EXPLOSIVES_PLACE(satchel_remote_02): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_SATCHEL_REMOTE_02_MAG_DN"; + model = "\vn\characters_f_vietnam\OPFOR\vests\items\vn_mine_satchel_02.p3d"; +}; + +// TM57 Anti-Tank Mine +class EXPLOSIVES_PLACE(tm57): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_TM57_MAG_DN"; + model = "vn\weapons_f_vietnam\mines\tm57\vn_mine_tm57_mag"; +}; + +// M15 Anti-Tank Mine +class EXPLOSIVES_PLACE(m15): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_M15_MAG_DN"; + model = "vn\weapons_f_vietnam\mines\m15\vn_mine_m15_mag"; +}; + +// M112 Breaching charge +class EXPLOSIVES_PLACE(m112): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_M112_REMOTE_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\m112\vn_mine_m112_mag"; +}; + +// Spiked ammo box +class EXPLOSIVES_PLACE(ammobox_range): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_AMMOBOX_RANGE_MAG_DN"; + model = "\vn\objects_f_vietnam\supply\a2_ammo\pavn\vn_pavn_ammo"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.3]"; + }; + }; +}; + +// Punji large +class EXPLOSIVES_PLACE(punji_01): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_PUNJI_01_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\punji\vn_mine_punji_01_mag"; +}; + +// Punji small +class EXPLOSIVES_PLACE(punji_02): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_PUNJI_01_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\punji\vn_mine_punji_02_mag"; +}; + +// Punji whip +class EXPLOSIVES_PLACE(punji_03): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_PUNJI_01_MAG_DN"; + model = "\vn\weapons_f_vietnam\mines\punji\vn_mine_punji_03"; + + class EventHandlers: EventHandlers { + class ADDON { + init = QUOTE(_this call FUNC(handlePunjiTrapPlace)); + }; + }; +}; + +// Punji door-way +class EXPLOSIVES_PLACE(punji_04): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_PUNJI_04_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\punji_02\vn_mine_punji_04_mag"; +}; + +// Punji side whip +class EXPLOSIVES_PLACE(punji_05): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_PUNJI_05_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\punji_02\vn_mine_punji_05_mag"; +}; + +// Bike mine +class EXPLOSIVES_PLACE(bike): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_BIKE_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\bike\vn_mine_bike_mag"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.085, 0.185, 0.54]"; + }; + }; + + class EventHandlers: EventHandlers { + class ADDON { + init = QUOTE(_this call FUNC(handleBikeMinePlace)); + }; + }; +}; + +// Cartridge mine +class EXPLOSIVES_PLACE(cartridge): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_CARTRIDGE_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\cartridge\vn_mine_cartridge_mag"; +}; + +// Lighter mine +class EXPLOSIVES_PLACE(lighter): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_LIGHTER_MAG_DN"; + model = "\vn\characters_f_vietnam\BLUFOR\headgear\items\vn_b_item_lighter_01"; +}; + +// Pot mine +class EXPLOSIVES_PLACE(pot): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_POT_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\pot\vn_mine_pot_mag"; +}; + +// Jerrycan mine +class EXPLOSIVES_PLACE(jerrycan): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_JERRYCAN_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\jerrycan\vn_mine_jerrycan_mag"; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.15]"; + }; + }; +}; + +// Mortar shell on a stick +class EXPLOSIVES_PLACE(mortar_range): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_MORTAR_RANGE_MAG_DN"; + model = "vn\static_f_vietnam\mortar_type53\vn_shell_82mm_o832d_he_mag"; +}; + +// Limpet mine USA +class EXPLOSIVES_PLACE(limpet_01): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_LIMPET_01_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\limpet_01\vn_mine_limpet_01_mag"; +}; + +// Limpet mine RUS +class EXPLOSIVES_PLACE(limpet_02): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_LIMPET_02_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\limpet_02\vn_mine_limpet_02_mag"; +}; + +// Chicom NO8 mine +class EXPLOSIVES_PLACE(chicom_no8): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_CHICOM_NO8_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\no8\vn_mine_chicom_no8_mag"; +}; + +// Dh10 mine +class EXPLOSIVES_PLACE(dh10): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_DH10_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\dh10\vn_mine_dh10_mag"; +}; + +// Grenade board mine +class EXPLOSIVES_PLACE(gboard): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_TRIPWIRE_RGD5_04_DN"; + model = "vn\weapons_f_vietnam_03\mines\gboard\vn_mine_gboard_range_mag"; +}; + +// Satchel charge +class EXPLOSIVES_PLACE(satchelcharge_02): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_SATCHELCHARGE_02_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\satchelcharge_02\vn_mine_satchelcharge_02_mag"; +}; + +// Bangalore mine +class EXPLOSIVES_PLACE(bangalore): EGVAR(explosives,Place) { + displayName = "$STR_VN_MINE_BANGALORE_MAG_DN"; + model = "vn\weapons_f_vietnam_03\mines\bangalore\vn_mine_bangalore_mag"; +}; diff --git a/optionals/compat_sog/CfgVehicles/helicopters.hpp b/addons/compat_sog/CfgVehicles/helicopters.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/helicopters.hpp rename to addons/compat_sog/CfgVehicles/helicopters.hpp diff --git a/addons/compat_sog/CfgVehicles/land.hpp b/addons/compat_sog/CfgVehicles/land.hpp new file mode 100644 index 0000000000..c939026590 --- /dev/null +++ b/addons/compat_sog/CfgVehicles/land.hpp @@ -0,0 +1,32 @@ + +// fuel pumps +class Land_vn_commercial_base; +class Land_vn_fuelstation_01_pump_f: Land_vn_commercial_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{0, 0.4, -0.5}, {0, -0.4, -0.5}}; + EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL; +}; +class Land_vn_fuelstation_02_pump_f: Land_vn_commercial_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{0, 0.4, -0.5}, {0, -0.4, -0.5}}; + EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL; +}; +class Land_vn_fuelstation_feed_f: Land_vn_commercial_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{0, 0.4, -0.5}, {0, -0.4, -0.5}}; + EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL; +}; + +// fuel objects +class Land_vn_building_b_base; +class Land_vn_usaf_fueltank_75_01: Land_vn_building_b_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{0, -0.4, -0.5}}; + EGVAR(refuel,fuelCargo) = 2840; // 750 * 3.785 +}; +class Land_vn_object_b_base; +class Land_vn_b_prop_fueldrum_01: Land_vn_object_b_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{0, 0, 0.5}}; // reference is Land_FlexibleTank_01_F + EGVAR(refuel,fuelCargo) = 300; // reference is Land_FlexibleTank_01_F +}; diff --git a/addons/compat_sog/CfgVehicles/planes.hpp b/addons/compat_sog/CfgVehicles/planes.hpp new file mode 100644 index 0000000000..496065953a --- /dev/null +++ b/addons/compat_sog/CfgVehicles/planes.hpp @@ -0,0 +1,15 @@ +// F-4 - https://en.wikipedia.org/wiki/McDonnell_Douglas_F-4_Phantom_II +class Plane_Base_F; +class vn_air_f4_base: Plane_Base_F { + EGVAR(refuel,fuelCapacity) = 7548; +}; + +// F-100D https://www.supersabre.com/f-100specs.htm +class vn_air_f100d_base: Plane_Base_F { + EGVAR(refuel,fuelCapacity) = 4500; +}; + +// MIG-19S https://en.wikipedia.org/wiki/Mikoyan-Gurevich_MiG-19#cite_ref-60 +class vn_air_mig19_base: Plane_Base_F { + EGVAR(refuel,fuelCapacity) = 1800; +}; diff --git a/addons/compat_sog/CfgVehicles/tracked.hpp b/addons/compat_sog/CfgVehicles/tracked.hpp new file mode 100644 index 0000000000..e2832796a9 --- /dev/null +++ b/addons/compat_sog/CfgVehicles/tracked.hpp @@ -0,0 +1,26 @@ +// M41 +class vn_armor_tank_base; +class vn_armor_m41_base: vn_armor_tank_base { + EGVAR(refuel,fuelCapacity) = 530; +}; + +// Type 63 +class vn_armor_type63_base: vn_armor_tank_base { + EGVAR(refuel,fuelCapacity) = 545; +}; + +// M113A1 https://man.fas.org/dod-101/sys/land/m113.htm +class APC_Tracked_01_base_F; +class vn_armor_m113_base: APC_Tracked_01_base_F { + EGVAR(refuel,fuelCapacity) = 360; +}; + +// PT-76A https://en.wikipedia.org/wiki/PT-76 +class vn_armor_pt76_base: vn_armor_tank_base { + EGVAR(refuel,fuelCapacity) = 250; +}; + +// PT-76B (This variant increased the fuel size from 250 to 400 liters) +class vn_armor_pt76b_base: vn_armor_pt76_base { + EGVAR(refuel,fuelCapacity) = 400; +}; diff --git a/addons/compat_sog/CfgVehicles/turrets.hpp b/addons/compat_sog/CfgVehicles/turrets.hpp new file mode 100644 index 0000000000..6142a018e8 --- /dev/null +++ b/addons/compat_sog/CfgVehicles/turrets.hpp @@ -0,0 +1,508 @@ +class LandVehicle; +class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; +}; +class StaticCannon: StaticWeapon {}; +class StaticMGWeapon: StaticWeapon {}; + +// --- Gun Turrets ------------------------------------------------------------- + +// M2 Browning - High +class vn_static_m2_high_base: StaticMGWeapon { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "mg1_otochlaven"; + }; + }; + + class ACE_CSW { + enabled = 1; + proxyWeapon = "vn_m2_v_01"; + magazineLocation = "_target selectionPosition 'mg1_magazine'"; + disassembleWeapon = QGVAR(m2_carry); + disassembleTurret = QEGVAR(csw,m3Tripod); + ammoLoadTime = 4; + ammoUnloadTime = 8; + desiredAmmo = 100; + }; +}; + +// M2 Browning - Low +class vn_static_m2_low_base: vn_static_m2_high_base { + class ACE_CSW: ACE_CSW { + disassembleTurret = QEGVAR(csw,m3TripodLow); + }; +}; + +// M1919A6 - No tripod +class vn_static_m1919a6_base: vn_static_m2_low_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "mg1_otochlaven_recoil"; + }; + }; + + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = "vn_m1919_v_01"; + magazineLocation = "_target selectionPosition 'mg1_magazine' vectorAdd [-0.3, 0, 0]"; + disassembleWeapon = QGVAR(m1919A6_carry); + disassembleTurret = ""; + ammoLoadTime = 2; + ammoUnloadTime = 8; + desiredAmmo = 250; + }; +}; + +// M1919A4 - High +class vn_static_m1919a4_high_base: vn_static_m1919a6_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "mg1_otochlaven_recoil"; + }; + }; + + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = "vn_m1919_v_01"; + magazineLocation = "_target selectionPosition 'mg1_magazine'"; + disassembleWeapon = QGVAR(m1919A4_carry); + disassembleTurret = QEGVAR(csw,m3Tripod); + ammoLoadTime = 2; + ammoUnloadTime = 8; + desiredAmmo = 250; + }; +}; + +// M1919A4 - Low +class vn_static_m1919a4_low_base: vn_static_m1919a4_high_base { + class ACE_CSW: ACE_CSW { + disassembleTurret = QEGVAR(csw,m3TripodLow); + }; +}; + +// M60 - High +class vn_static_m60_high_base: vn_static_m2_low_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.15, 0.532, -1.06]"; + }; + }; + + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = "vn_m60_v_01"; + magazineLocation = "_target selectionPosition 'mg1_trigger'"; + disassembleWeapon = QGVAR(m60_carry); + disassembleTurret = QEGVAR(csw,m3Tripod); + ammoLoadTime = 3; + ammoUnloadTime = 8; + desiredAmmo = 250; + }; +}; + +// M60 - Low +class vn_static_m60_low_base: vn_static_m60_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.25, 0.15, -1.06]"; + }; + }; + + class ACE_CSW: ACE_CSW { + magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'"; + disassembleTurret = QEGVAR(csw,m3TripodLow); + }; +}; + +// TOW +class vn_static_at3_base: StaticMGWeapon {}; +class vn_static_tow_base: vn_static_at3_base { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,dragPosition)[] = {0.8, 1.3, 0}; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-1.04, 0.3, -0.5]"; + }; + }; + + class ACE_CSW { + enabled = 1; + proxyWeapon = "vn_missile_tow_launcher"; + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(tow_carry); + disassembleTurret = QEGVAR(csw,m220Tripod); + ammoLoadTime = 2; + ammoUnloadTime = 5; + desiredAmmo = 1; + }; +}; + +// DShKM - High +class vn_static_dp28_high_base: vn_static_m2_high_base { + class ACE_CSW: ACE_CSW { + enabled = 0; + }; +}; +class vn_static_dshkm_high_01_base: vn_static_dp28_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.15, 0.532, -1.06]"; + }; + }; + + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = "vn_dshkm_v_01"; + magazineLocation = "_target selectionPosition 'mg1_boxmag'"; + disassembleWeapon = QGVAR(dshkm_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + ammoLoadTime = 1; + ammoUnloadTime = 8; + desiredAmmo = 50; + }; +}; + +// DShKM - High, with AA sight +class vn_static_dshkm_high_02_base: vn_static_dshkm_high_01_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(dshkm_AA_carry); + }; +}; + +// DShKM - Low, with shield +class vn_static_dshkm_low_01_base: vn_static_dshkm_high_01_base { + EGVAR(dragging,canCarry) = 0; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.3, 0.75, -1]"; + }; + }; + + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(dshkm_shield_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; + +// DShKM - Low +class vn_static_dshkm_low_02_base: vn_static_dshkm_low_01_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(dshkm_carry); + }; +}; + +// RPD - High +class vn_static_rpd_high_base: vn_static_dp28_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.158, 0.745, -0.7]"; + }; + }; + + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = "vn_rpd_v_01"; + magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'"; + disassembleWeapon = QGVAR(rpd_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + ammoLoadTime = 10; + ammoUnloadTime = 8; + desiredAmmo = 100; + }; +}; + +// PK - High +class vn_static_pk_high_base: vn_static_rpd_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.156, 0.755, -1.05]"; + }; + }; + + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = "vn_pk_v_01"; + magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'"; + disassembleWeapon = QGVAR(pk_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + ammoLoadTime = 2; + ammoUnloadTime = 8; + desiredAmmo = 100; + }; +}; + +// PK - Low +class vn_static_pk_low_base: vn_static_pk_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.35, 0.43, -0.9]"; + }; + }; + + class ACE_CSW: ACE_CSW { + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; + +// MG42 - High +class vn_static_mg42_high_base: vn_static_rpd_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.18, 0.5, -0.3]"; + }; + }; + + class ACE_CSW { + enabled = 1; + proxyWeapon = "vn_mg42_v_01"; + magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'"; + disassembleWeapon = QGVAR(mg42_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + ammoLoadTime = 2; + ammoUnloadTime = 8; + desiredAmmo = 250; + }; +}; + +class vn_static_mg42_low_base: vn_static_mg42_high_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.1, 0.3, -0.9]"; + }; + }; + + class ACE_CSW: ACE_CSW { + disassembleTurret = ""; + }; +}; + +// SGM - High +class vn_static_sgm_base: StaticMGWeapon { + class ACE_Actions: ACE_Actions {}; +}; +class vn_static_sgm_high_base: vn_static_sgm_base { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "mg1_otocvez"; + }; + }; + + class ACE_CSW { + enabled = 1; + proxyWeapon = "vn_sgm_v_01"; + magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'"; + disassembleWeapon = QGVAR(sgm_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + ammoLoadTime = 2; + ammoUnloadTime = 8; + desiredAmmo = 250; + }; +}; + +// SGM - Low +class vn_static_sgm_low_base: vn_static_sgm_high_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(sgm_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; + +// SGM - Shield +class vn_o_pl_static_sgm_low_01: vn_static_sgm_low_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(sgm_shield_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; +class vn_o_nva_65_static_sgm_low_01: vn_static_sgm_low_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(sgm_shield_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; +class vn_o_nva_static_sgm_low_01: vn_static_sgm_low_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(sgm_shield_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; +class vn_o_nva_navy_static_sgm_low_01: vn_static_sgm_low_base { + class ACE_CSW: ACE_CSW { + disassembleWeapon = QGVAR(sgm_shield_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; +}; + +// Mk18 Grenade laucher +class vn_static_mk18_base: StaticCannon { + EGVAR(dragging,canCarry) = 1; + EGVAR(dragging,canDrag) = 1; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "mg1_otochlaven"; + }; + }; + + class ACE_CSW { + enabled = 1; + proxyWeapon = "vn_mk18_v_01"; + magazineLocation = "_target selectionPosition 'mg1_magazine'"; + disassembleWeapon = QGVAR(mk18_carry); + disassembleTurret = QEGVAR(csw,m3TripodLow); + ammoLoadTime = 1; + ammoUnloadTime = 8; + desiredAmmo = 24; + }; +}; + +// --- Mortars ----------------------------------------------------------------- + +// M29 Mortar +class StaticMortar: StaticWeapon {}; +class Mortar_01_base_F: StaticMortar {}; +class vn_static_mortar_m29_base: Mortar_01_base_F { + EGVAR(dragging,canCarry) = 0; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "otochlaven"; + }; + }; + + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(vn_mortar_m29); + magazineLocation = "_target selectionPosition 'pohon'"; + disassembleWeapon = QGVAR(mortar_m29_carry); + disassembleTurret = QEGVAR(csw,mortarBaseplate); + ammoLoadTime = 3; + ammoUnloadTime = 3; + desiredAmmo = 1; + }; +}; + +// M2 / Type 63 Mortar +class vn_static_mortar_m2_base: vn_static_mortar_m29_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(vn_mortar_m2); + magazineLocation = "_target selectionPosition 'pohon'"; + disassembleWeapon = QGVAR(mortar_m2_carry); + disassembleTurret = QEGVAR(csw,mortarBaseplate); + ammoLoadTime = 3; + ammoUnloadTime = 3; + desiredAmmo = 1; + }; +}; + +// Type 53 Mortar +class vn_static_mortar_type53_base: vn_static_mortar_m29_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(vn_mortar_type53); + magazineLocation = "_target selectionPosition 'pohon'"; + disassembleWeapon = QGVAR(mortar_type53_carry); + disassembleTurret = QEGVAR(csw,mortarBaseplate); + ammoLoadTime = 3; + ammoUnloadTime = 3; + desiredAmmo = 1; + }; +}; + +// H-12 MLRS +class vn_static_h12_base: Mortar_01_base_F { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0.4, 2.1, 0}; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "damagegun"; + }; + }; + + class ACE_CSW { + enabled = 0; + }; +}; + +// --- Non-CSW Static Weapons -------------------------------------------------- + +class vn_static_m45_base: vn_static_m2_high_base { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,canDrag) = 0; + + class ACE_CSW: ACE_CSW { + enabled = 0; + }; +}; + +class vn_static_zpu4_base: vn_static_m2_high_base { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,canDrag) = 0; + + class ACE_CSW: ACE_CSW { + enabled = 0; + }; +}; + +class vn_o_static_rsna75: StaticMGWeapon { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,canDrag) = 0; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "mainturret"; + }; + }; + + class ACE_CSW { + enabled = 0; + }; +}; + +class vn_sa2: StaticMGWeapon { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,canDrag) = 0; +}; + +class vn_static_m40a1rr_base: StaticCannon { + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {-0.3, 1.9, 0}; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "mg1_otochlaven"; + }; + }; +}; + +class vn_static_type56rr_base: StaticCannon { + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {-0.1, 0.5, 0}; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "mg1_otocvez"; + }; + }; +}; + +// --- Spiderholes ------------------------------------------------------------- + +class vn_o_vc_spiderhole_01: StaticWeapon { + EGVAR(dragging,canCarry) = 0; + EGVAR(dragging,canDrag) = 0; + + EGVAR(cargo,canLoad) = 0; +}; diff --git a/addons/compat_sog/CfgVehicles/units.hpp b/addons/compat_sog/CfgVehicles/units.hpp new file mode 100644 index 0000000000..e0d194227d --- /dev/null +++ b/addons/compat_sog/CfgVehicles/units.hpp @@ -0,0 +1,14 @@ +class vn_b_men_aircrew_base; +class vn_b_men_jetpilot_01: vn_b_men_aircrew_base { + ACE_GForceCoef = 0.55; +}; + +class vn_o_men_aircrew_01; +class vn_o_men_aircrew_05: vn_o_men_aircrew_01 { + ACE_GForceCoef = 0.55; +}; + +class vn_i_men_aircrew_base; +class vn_i_men_jetpilot_01: vn_i_men_aircrew_base { + ACE_GForceCoef = 0.55; +}; diff --git a/addons/compat_sog/CfgVehicles/vn_boxes.hpp b/addons/compat_sog/CfgVehicles/vn_boxes.hpp new file mode 100644 index 0000000000..085f7cc324 --- /dev/null +++ b/addons/compat_sog/CfgVehicles/vn_boxes.hpp @@ -0,0 +1,15 @@ + +// dragging carrying items +class ReammoBox_F; +class vn_ammobox_base: ReammoBox_F { + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; + + EGVAR(dragging,canCarry) = 1; + EGVAR(dragging,carryPosition)[] = {0,1,1}; + EGVAR(dragging,carryDirection) = 0; + + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0,1.2,0}; + EGVAR(dragging,dragDirection) = 0; +}; diff --git a/addons/compat_sog/CfgVehicles/wheeled.hpp b/addons/compat_sog/CfgVehicles/wheeled.hpp new file mode 100644 index 0000000000..3525328d3f --- /dev/null +++ b/addons/compat_sog/CfgVehicles/wheeled.hpp @@ -0,0 +1,40 @@ +// M39 / M54 / M49 +class vn_wheeled_truck_base; +class vn_wheeled_m54_base: vn_wheeled_truck_base { + EGVAR(refuel,fuelCapacity) = 189; +}; +class vn_wheeled_m54_cab_base; +class vn_wheeled_m54_fuel_base: vn_wheeled_m54_cab_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{-1.15, -2.3, 0.28}}; + EGVAR(refuel,fuelCargo) = 4542; +}; +class vn_wheeled_m54_01_base; +class vn_wheeled_m54_ammo_base: vn_wheeled_m54_01_base { + EGVAR(rearm,defaultSupply) = 1200; +}; + +// M151 +class vn_wheeled_car_base; +class vn_wheeled_m151_base: vn_wheeled_car_base { + EGVAR(refuel,fuelCapacity) = 65; +}; + +// ZIL-157 +class vn_wheeled_z157_base: vn_wheeled_truck_base { + EGVAR(refuel,fuelCapacity) = 150; +}; +class vn_wheeled_z157_fuel_base: vn_wheeled_z157_base { + transportFuel = 0; + EGVAR(refuel,hooks)[] = {{-1.36, -3.575, -0.4}}; + EGVAR(refuel,fuelCargo) = 4000; +}; +class vn_wheeled_z157_01_base; +class vn_wheeled_z157_ammo_base: vn_wheeled_z157_01_base { + EGVAR(rearm,defaultSupply) = 1200; +}; + +// BTR-40 +class vn_wheeled_btr40_base: vn_wheeled_car_base { + EGVAR(refuel,fuelCapacity) = 122; +}; diff --git a/addons/compat_sog/CfgWeapons.hpp b/addons/compat_sog/CfgWeapons.hpp new file mode 100644 index 0000000000..c0c0ee807b --- /dev/null +++ b/addons/compat_sog/CfgWeapons.hpp @@ -0,0 +1,9 @@ +class CfgWeapons { + #include "CfgWeapons\csw.hpp" + #include "CfgWeapons\helmets.hpp" + #include "CfgWeapons\launchers.hpp" + #include "CfgWeapons\pistols.hpp" + #include "CfgWeapons\uniforms.hpp" + #include "CfgWeapons\weapons.hpp" + #include "CfgWeapons\weapons_melee.hpp" +}; diff --git a/addons/compat_sog/CfgWeapons/csw.hpp b/addons/compat_sog/CfgWeapons/csw.hpp new file mode 100644 index 0000000000..87b1b16c5e --- /dev/null +++ b/addons/compat_sog/CfgWeapons/csw.hpp @@ -0,0 +1,476 @@ +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" + +CREATE_CSW_PROXY(vn_mortar_m29); +CREATE_CSW_PROXY(vn_mortar_m2); +CREATE_CSW_PROXY(vn_mortar_type53); + +class Launcher; +class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; +}; + +// --- Gun Turrets ------------------------------------------------------------- + +class GVAR(m2_carry): Launcher_Base_F { + dlc = "ace"; + displayName = ECSTRING(csw,m2_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_m2b_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,m3Tripod) = "vn_b_army_static_m2_high"; + EGVAR(csw,m3TripodLow) = "vn_b_army_static_m2_low"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 840; + }; +}; + +class GVAR(m1919a4_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_m1919a4); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_m1919a4_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,m3Tripod) = "vn_b_army_static_m1919a4_high"; + EGVAR(csw,m3TripodLow) = "vn_b_sf_static_m1919a4_low"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 310; + }; +}; + +class GVAR(m1919a6_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_m1919a6); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_m1919a6_ca.paa); + + class ACE_CSW { + type = "mount"; + deployTime = 2; + pickupTime = 2; + deploy = "vn_b_army_static_m1919a6"; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 320; + }; +}; + +class GVAR(m60_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_m60); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_m60_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,m3Tripod) = "vn_b_army_static_m60_high"; + EGVAR(csw,m3TripodLow) = "vn_b_army_static_m60_low"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 232; + }; +}; + +class GVAR(tow_carry): Launcher_Base_F { + dlc = "ace"; + displayName = ECSTRING(csw,tow_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_tow_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,m220Tripod) = "vn_b_army_static_tow"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 500; + }; +}; + +class GVAR(dshkm_carry): Launcher_Base_F { + dlc = "ace"; + displayName = ECSTRING(csw,dshk_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_dshkm_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripod) = "vn_o_nva_static_dshkm_high_01"; + EGVAR(csw,kordTripodLow) = "vn_o_nva_static_dshkm_low_02"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 750; + }; +}; + +class GVAR(dshkm_shield_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_dshkm_shield); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_dshkm_shield_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripodLow) = "vn_o_nva_static_dshkm_low_01"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 850; + }; +}; + +class GVAR(dshkm_AA_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_dshkm_aa); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_dshkm_aa_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripod) = "vn_o_nva_static_dshkm_high_02"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 750; + }; +}; + +class GVAR(rpd_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_rpd); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_rpd_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripod) = "vn_o_nva_static_rpd_high"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 163; + }; +}; + +class GVAR(pk_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_pk); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_pk_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripod) = "vn_o_nva_static_pk_high"; + EGVAR(csw,kordTripodLow) = "vn_o_nva_static_pk_low"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 198; + }; +}; + +class GVAR(mortar_m29_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_m29); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_m29_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + + class assembleTo { + EGVAR(csw,mortarBaseplate) = "vn_b_army_static_mortar_m29"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 730; + }; +}; + +class GVAR(mg42_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_mg42); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_mg42_ca.paa); + + class ACE_CSW { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = "vn_o_vc_static_mg42_low"; + + class assembleTo { + EGVAR(csw,kordTripod) = "vn_o_vc_static_mg42_high"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 310; + }; +}; + +class GVAR(sgm_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_sgm); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_sgm_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripod) = "vn_o_vc_static_sgm_high_01"; + EGVAR(csw,kordTripodLow) = "vn_o_vc_static_sgm_low_02"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 310; + }; +}; +class GVAR(sgm_shield_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_sgm_shield); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_sgm_shield_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,kordTripodLow) = "vn_o_vc_static_sgm_low_01"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 310; + }; +}; + +class GVAR(mk18_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_mk18); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_mk18_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + + class assembleTo { + EGVAR(csw,m3TripodLow) = "vn_b_army_static_mk18"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 310; + }; +}; + +// --- Mortars ----------------------------------------------------------------- + +class GVAR(mortar_m2_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_m2); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_m2_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + + class assembleTo { + EGVAR(csw,mortarBaseplate) = "vn_b_army_static_mortar_m2"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 300; + }; +}; + +class GVAR(mortar_type53_carry): Launcher_Base_F { + dlc = "ace"; + displayName = CSTRING(csw_type53); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(UI\csw_type53_ca.paa); + + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + + class assembleTo { + EGVAR(csw,mortarBaseplate) = "vn_o_nva_static_mortar_type53"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 860; + }; +}; diff --git a/addons/compat_sog/CfgWeapons/helmets.hpp b/addons/compat_sog/CfgWeapons/helmets.hpp new file mode 100644 index 0000000000..8edc6e2ac7 --- /dev/null +++ b/addons/compat_sog/CfgWeapons/helmets.hpp @@ -0,0 +1,44 @@ +#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 + +class vn_b_headgear_base; +class vn_b_helmet_aph6_01_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; +}; +class vn_b_helmet_aph6_02_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; + ACE_Protection = 1; +}; +class vn_b_helmet_sph4_01_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; +}; +class vn_b_helmet_sph4_02_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; + ACE_Protection = 1; +}; +class vn_b_helmet_t56_01_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; +}; +class vn_b_helmet_svh4_01_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; +}; +class vn_b_helmet_svh4_02_01: vn_b_headgear_base { + HEARING_PROTECTION_VICCREW; + ACE_Protection = 1; +}; + +class vn_o_headgear_base; +class vn_o_helmet_tsh3_01: vn_o_headgear_base { + HEARING_PROTECTION_VICCREW; +}; +class vn_o_helmet_zsh3_01: vn_o_headgear_base { + HEARING_PROTECTION_VICCREW; +}; +class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { + ACE_Protection = 1; +}; +class vn_o_helmet_shl61_01: vn_o_headgear_base { + HEARING_PROTECTION_VICCREW; +}; diff --git a/addons/compat_sog/CfgWeapons/launchers.hpp b/addons/compat_sog/CfgWeapons/launchers.hpp new file mode 100644 index 0000000000..3dfd4984e3 --- /dev/null +++ b/addons/compat_sog/CfgWeapons/launchers.hpp @@ -0,0 +1,24 @@ +class vn_Launcher_Base_F; +class vn_m127: vn_Launcher_Base_F { + EGVAR(overpressure,damage) = 0; +}; +class vn_rpg2: vn_Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,offset) = 0.9; +}; +class vn_rpg7: vn_Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,offset) = 0.9; +}; +class vn_sa7: vn_Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + + EGVAR(overpressure,range) = 6; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.6; + EGVAR(overpressure,offset) = 1.65; +}; diff --git a/addons/compat_sog/CfgWeapons/pistols.hpp b/addons/compat_sog/CfgWeapons/pistols.hpp new file mode 100644 index 0000000000..25eef4c56c --- /dev/null +++ b/addons/compat_sog/CfgWeapons/pistols.hpp @@ -0,0 +1,45 @@ +#define MX991_FLASHLIGHT_SIZE 1.75 + +class vn_pistol; +class vn_m79_p: vn_pistol { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; +}; +class vn_mk22; +class vn_m10: vn_mk22 { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; +}; +class vn_m1895: vn_mk22 { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; +}; + +class vn_pm; +class vn_fkb1_pm: vn_pm { + ACE_Flashlight_Colour = "white"; + ACE_Flashlight_Beam = QPATHTOEF(flashlights,UI\Flashlight_beam_white_ca.paa); + ACE_Flashlight_Size = MX991_FLASHLIGHT_SIZE; +}; +class vn_fkb1_pm_sd: vn_fkb1_pm { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Beam = QPATHTOEF(flashlights,UI\Flashlight_beam_red_ca.paa); +}; +class vn_fkb1; +class vn_fkb1_red: vn_fkb1 { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Beam = QPATHTOEF(flashlights,UI\Flashlight_beam_red_ca.paa); +}; + +class vn_m1911; +class vn_mx991_m1911: vn_m1911 { + ACE_Flashlight_Colour = "white"; + ACE_Flashlight_Beam = QPATHTOEF(flashlights,UI\Flashlight_beam_white_ca.paa); + ACE_Flashlight_Size = MX991_FLASHLIGHT_SIZE; +}; +class vn_mx991_m1911_sd: vn_mx991_m1911 { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Beam = QPATHTOEF(flashlights,UI\Flashlight_beam_red_ca.paa); +}; +class vn_mx991; +class vn_mx991_red: vn_mx991 { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Beam = QPATHTOEF(flashlights,UI\Flashlight_beam_red_ca.paa); +}; diff --git a/optionals/compat_sog/CfgWeapons/uniforms.hpp b/addons/compat_sog/CfgWeapons/uniforms.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/uniforms.hpp rename to addons/compat_sog/CfgWeapons/uniforms.hpp diff --git a/addons/compat_sog/CfgWeapons/weapons.hpp b/addons/compat_sog/CfgWeapons/weapons.hpp new file mode 100644 index 0000000000..a9aac4fa9b --- /dev/null +++ b/addons/compat_sog/CfgWeapons/weapons.hpp @@ -0,0 +1,33 @@ + +class vn_rifle; +class vn_m63a_lmg: vn_rifle { + EGVAR(overheating,closedBolt) = 0; + EGVAR(overheating,allowSwapBarrel) = 1; +}; +class vn_lmg: vn_rifle { + EGVAR(overheating,closedBolt) = 0; +}; +class vn_pk: vn_lmg { + EGVAR(overheating,allowSwapBarrel) = 1; +}; +class vn_m60: vn_lmg { + EGVAR(overheating,allowSwapBarrel) = 1; +}; + +class vn_smg: vn_rifle { + EGVAR(overheating,closedBolt) = 0; +}; +class vn_vz61: vn_smg { + EGVAR(overheating,closedBolt) = 1; +}; + +class vn_mk1_udg: vn_smg { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; +}; +class vn_m79: vn_rifle { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; +}; +class vn_shotgun; +class vn_izh54: vn_shotgun { + EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; +}; diff --git a/addons/compat_sog/CfgWeapons/weapons_melee.hpp b/addons/compat_sog/CfgWeapons/weapons_melee.hpp new file mode 100644 index 0000000000..077e57d38b --- /dev/null +++ b/addons/compat_sog/CfgWeapons/weapons_melee.hpp @@ -0,0 +1,63 @@ + +// always show melee weapons in the Arsenal, +// they were considered "janky" by BI and are hidden by default until "vn_arsenalShowMelee = 1;" is set in the mission config +class vn_hand_melee_base_dynamic_scope; +class vn_m_wrench_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_hammer: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_shovel_01: vn_hand_melee_base_dynamic_scope { + scope = 2; + EGVAR(trenches,entrenchingTool) = 1; +}; +class vn_m_axe_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_axe_fire: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_bayo_carbine: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_bayo_m14: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_bayo_m16: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_bayo_m1897: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_mk2_knife_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_bolo_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_machete_02: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_typeivaxe_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_m51_etool_01: vn_hand_melee_base_dynamic_scope { + scope = 2; + EGVAR(trenches,entrenchingTool) = 1; +}; +class vn_m_bayo_m4956: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_fighting_knife_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_vc_knife_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_machete_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; +class vn_m_fishing_rod_01: vn_hand_melee_base_dynamic_scope { + scope = 2; +}; diff --git a/optionals/compat_sog/EMM_mainMenu_CfgMenus.hpp b/addons/compat_sog/EMM_mainMenu_CfgMenus.hpp similarity index 100% rename from optionals/compat_sog/EMM_mainMenu_CfgMenus.hpp rename to addons/compat_sog/EMM_mainMenu_CfgMenus.hpp diff --git a/optionals/compat_sog/UI/ammo_1rnd_60mm_ca.paa b/addons/compat_sog/UI/ammo_1rnd_60mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_60mm_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_60mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_1rnd_81mm_ca.paa b/addons/compat_sog/UI/ammo_1rnd_81mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_81mm_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_81mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_1rnd_82mm_ca.paa b/addons/compat_sog/UI/ammo_1rnd_82mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_82mm_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_82mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_1rnd_TOW_ca.paa b/addons/compat_sog/UI/ammo_1rnd_TOW_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_TOW_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_TOW_ca.paa diff --git a/optionals/compat_sog/UI/ammo_200rnd_762mm_ca.paa b/addons/compat_sog/UI/ammo_200rnd_762mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_200rnd_762mm_ca.paa rename to addons/compat_sog/UI/ammo_200rnd_762mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_250rnd_30cal_ca.paa b/addons/compat_sog/UI/ammo_250rnd_30cal_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_250rnd_30cal_ca.paa rename to addons/compat_sog/UI/ammo_250rnd_30cal_ca.paa diff --git a/optionals/compat_sog/UI/ammo_50rnd_127mm_ca.paa b/addons/compat_sog/UI/ammo_50rnd_127mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_50rnd_127mm_ca.paa rename to addons/compat_sog/UI/ammo_50rnd_127mm_ca.paa diff --git a/optionals/compat_sog/UI/csw_dshkm_aa_ca.paa b/addons/compat_sog/UI/csw_dshkm_aa_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_dshkm_aa_ca.paa rename to addons/compat_sog/UI/csw_dshkm_aa_ca.paa diff --git a/optionals/compat_sog/UI/csw_dshkm_ca.paa b/addons/compat_sog/UI/csw_dshkm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_dshkm_ca.paa rename to addons/compat_sog/UI/csw_dshkm_ca.paa diff --git a/optionals/compat_sog/UI/csw_dshkm_shield_ca.paa b/addons/compat_sog/UI/csw_dshkm_shield_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_dshkm_shield_ca.paa rename to addons/compat_sog/UI/csw_dshkm_shield_ca.paa diff --git a/optionals/compat_sog/UI/csw_m1919a4_ca.paa b/addons/compat_sog/UI/csw_m1919a4_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m1919a4_ca.paa rename to addons/compat_sog/UI/csw_m1919a4_ca.paa diff --git a/optionals/compat_sog/UI/csw_m1919a6_ca.paa b/addons/compat_sog/UI/csw_m1919a6_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m1919a6_ca.paa rename to addons/compat_sog/UI/csw_m1919a6_ca.paa diff --git a/optionals/compat_sog/UI/csw_m29_ca.paa b/addons/compat_sog/UI/csw_m29_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m29_ca.paa rename to addons/compat_sog/UI/csw_m29_ca.paa diff --git a/optionals/compat_sog/UI/csw_m2_ca.paa b/addons/compat_sog/UI/csw_m2_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m2_ca.paa rename to addons/compat_sog/UI/csw_m2_ca.paa diff --git a/optionals/compat_sog/UI/csw_m2b_ca.paa b/addons/compat_sog/UI/csw_m2b_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m2b_ca.paa rename to addons/compat_sog/UI/csw_m2b_ca.paa diff --git a/optionals/compat_sog/UI/csw_m60_ca.paa b/addons/compat_sog/UI/csw_m60_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m60_ca.paa rename to addons/compat_sog/UI/csw_m60_ca.paa diff --git a/addons/compat_sog/UI/csw_mg42_ca.paa b/addons/compat_sog/UI/csw_mg42_ca.paa new file mode 100644 index 0000000000..a921dd5f1e Binary files /dev/null and b/addons/compat_sog/UI/csw_mg42_ca.paa differ diff --git a/addons/compat_sog/UI/csw_mk18_ca.paa b/addons/compat_sog/UI/csw_mk18_ca.paa new file mode 100644 index 0000000000..bd03dea3d1 Binary files /dev/null and b/addons/compat_sog/UI/csw_mk18_ca.paa differ diff --git a/optionals/compat_sog/UI/csw_pk_ca.paa b/addons/compat_sog/UI/csw_pk_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_pk_ca.paa rename to addons/compat_sog/UI/csw_pk_ca.paa diff --git a/optionals/compat_sog/UI/csw_rpd_ca.paa b/addons/compat_sog/UI/csw_rpd_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_rpd_ca.paa rename to addons/compat_sog/UI/csw_rpd_ca.paa diff --git a/addons/compat_sog/UI/csw_sgm_ca.paa b/addons/compat_sog/UI/csw_sgm_ca.paa new file mode 100644 index 0000000000..8ab2d8e98f Binary files /dev/null and b/addons/compat_sog/UI/csw_sgm_ca.paa differ diff --git a/addons/compat_sog/UI/csw_sgm_shield_ca.paa b/addons/compat_sog/UI/csw_sgm_shield_ca.paa new file mode 100644 index 0000000000..3e17a9b143 Binary files /dev/null and b/addons/compat_sog/UI/csw_sgm_shield_ca.paa differ diff --git a/optionals/compat_sog/UI/csw_tow_ca.paa b/addons/compat_sog/UI/csw_tow_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_tow_ca.paa rename to addons/compat_sog/UI/csw_tow_ca.paa diff --git a/optionals/compat_sog/UI/csw_type53_ca.paa b/addons/compat_sog/UI/csw_type53_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_type53_ca.paa rename to addons/compat_sog/UI/csw_type53_ca.paa diff --git a/addons/compat_sog/XEH_PREP.hpp b/addons/compat_sog/XEH_PREP.hpp new file mode 100644 index 0000000000..b9f7907afe --- /dev/null +++ b/addons/compat_sog/XEH_PREP.hpp @@ -0,0 +1,6 @@ +PREP(disableCookoff); +PREP(handleBikeMinePlace); +PREP(handlePunjiTrapDamage); +PREP(handlePunjiTrapPlace); +PREP(handlePunjiTrapTrigger); +PREP(woundsHandlerIncendiary); diff --git a/addons/compat_sog/XEH_postInit.sqf b/addons/compat_sog/XEH_postInit.sqf new file mode 100644 index 0000000000..99d1ed65ab --- /dev/null +++ b/addons/compat_sog/XEH_postInit.sqf @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +[QGVAR(handlePunjiTrapDamage), LINKFUNC(handlePunjiTrapDamage)] call CBA_fnc_addEventHandler; + +if (isServer) then { + [QEGVAR(trenches,placed), { + params ["", "_trench"]; + if (_trench isKindOf "vn_o_vc_spiderhole_01") then { + _trench enableSimulationGlobal false; + }; + }] call CBA_fnc_addEventHandler; + + [QEGVAR(trenches,finished), { + params ["", "_trench"]; + if (_trench isKindOf "vn_o_vc_spiderhole_01") then { + _trench enableSimulationGlobal true; + }; + }] call CBA_fnc_addEventHandler; +}; diff --git a/optionals/compat_gm/XEH_preinit.sqf b/addons/compat_sog/XEH_preInit.sqf similarity index 100% rename from optionals/compat_gm/XEH_preinit.sqf rename to addons/compat_sog/XEH_preInit.sqf diff --git a/addons/compat_sog/XEH_preStart.sqf b/addons/compat_sog/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/compat_sog/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp b/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp new file mode 100644 index 0000000000..3c2ba22410 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp @@ -0,0 +1,63 @@ +class CfgVehicles { + // Trench Actions + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class EGVAR(trenches,digEnvelopeSmall); + class EGVAR(compat_sog,digSpiderhole): EGVAR(trenches,digEnvelopeSmall) { + displayName = ECSTRING(compat_sog,Action_DigSpiderhole); + statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_01')])] call CBA_fnc_execNextFrame); + }; + class EGVAR(compat_sog,digSpiderholeAngled): EGVAR(trenches,digEnvelopeSmall) { + displayName = ECSTRING(compat_sog,Action_DigSpiderholeAngled); + statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_02')])] call CBA_fnc_execNextFrame); + }; + class EGVAR(compat_sog,digSpiderholeDual): EGVAR(trenches,digEnvelopeSmall) { + displayName = ECSTRING(compat_sog,Action_DigSpiderholeDual); + statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_03')])] call CBA_fnc_execNextFrame); + }; + }; + }; + }; + + // Spiderholes + class LandVehicle; + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class vn_o_vc_spiderhole_01: StaticWeapon { + EGVAR(trenches,diggingDuration) = QEGVAR(trenches,smallEnvelopeDigDuration); + EGVAR(trenches,removalDuration) = QEGVAR(trenches,smallEnvelopeRemoveDuration); + EGVAR(trenches,noGeoClass) = QEGVAR(compat_sog,spiderhole_01_nogeo); + EGVAR(trenches,placementData)[] = {1.5, 1.5, 0.1}; + EGVAR(trenches,grassCuttingPoints)[] = {}; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class ACE_ContinueDiggingTrench { + displayName = ECSTRING(trenches,ContinueDiggingTrench); + condition = QUOTE([ARR_2(_target,_player)] call EFUNC(trenches,canContinueDiggingTrench)); + statement = QUOTE([ARR_2(_target,_player)] call EFUNC(trenches,continueDiggingTrench);); + }; + }; + }; + }; + class vn_o_vc_spiderhole_02: vn_o_vc_spiderhole_01 { + EGVAR(trenches,noGeoClass) = QEGVAR(compat_sog,spiderhole_02_nogeo); + }; + class vn_o_vc_spiderhole_03: vn_o_vc_spiderhole_01 { + EGVAR(trenches,noGeoClass) = QEGVAR(compat_sog,spiderhole_03_nogeo); + EGVAR(trenches,placementData)[] = {1.5, 2.5, 0.1}; + }; + class EGVAR(compat_sog,spiderhole_01_nogeo): vn_o_vc_spiderhole_01 { + scope = 1; + }; + class EGVAR(compat_sog,spiderhole_02_nogeo): vn_o_vc_spiderhole_02 { + scope = 1; + }; + class EGVAR(compat_sog,spiderhole_03_nogeo): vn_o_vc_spiderhole_03 { + scope = 1; + }; +}; diff --git a/addons/compat_sog/compat_sog_trenches/config.cpp b/addons/compat_sog/compat_sog_trenches/config.cpp new file mode 100644 index 0000000000..68fccc2fa3 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"loadorder_f_vietnam", "ace_trenches"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut", "veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_sog/compat_sog_trenches/script_component.hpp b/addons/compat_sog/compat_sog_trenches/script_component.hpp new file mode 100644 index 0000000000..10b90eb71e --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT trenches +#define SUBCOMPONENT_BEAUTIFIED Trenches +#include "..\script_component.hpp" diff --git a/addons/compat_sog/compat_sog_trenches_grad/CfgVehicles.hpp b/addons/compat_sog/compat_sog_trenches_grad/CfgVehicles.hpp new file mode 100644 index 0000000000..a9c8873ceb --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches_grad/CfgVehicles.hpp @@ -0,0 +1,20 @@ +class CfgVehicles { + // Trench Actions + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + // delete in reverse order + delete EGVAR(compat_sog,digSpiderholeDual); + delete EGVAR(compat_sog,digSpiderholeAngled); + delete EGVAR(compat_sog,digSpiderhole); + delete EGVAR(trenches,digEnvelopeSmall); + }; + }; + }; + + // Spiderholes + delete EGVAR(compat_sog,spiderhole_01_nogeo); + delete EGVAR(compat_sog,spiderhole_02_nogeo); + delete EGVAR(compat_sog,spiderhole_03_nogeo); +}; diff --git a/addons/compat_sog/compat_sog_trenches_grad/config.cpp b/addons/compat_sog/compat_sog_trenches_grad/config.cpp new file mode 100644 index 0000000000..06d670fb9a --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches_grad/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"loadorder_f_vietnam", "ace_compat_sog_trenches", "grad_trenches_main"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut", "veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_sog/compat_sog_trenches_grad/script_component.hpp b/addons/compat_sog/compat_sog_trenches_grad/script_component.hpp new file mode 100644 index 0000000000..55f4feb1f4 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches_grad/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT trenches_grad +#define SUBCOMPONENT_BEAUTIFIED Trenches GRAD +#include "..\script_component.hpp" diff --git a/addons/compat_sog/config.cpp b/addons/compat_sog/config.cpp new file mode 100644 index 0000000000..8a6ed30148 --- /dev/null +++ b/addons/compat_sog/config.cpp @@ -0,0 +1,56 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = { + QGVAR(box_81mm_he), + QGVAR(box_81mm_wp), + QGVAR(box_81mm_chem), + QGVAR(box_81mm_lume), + QGVAR(box_60mm_he), + QGVAR(box_60mm_wp), + QGVAR(box_60mm_lume), + QGVAR(box_82mm_he), + QGVAR(box_82mm_wp), + QGVAR(box_82mm_lume) + }; + weapons[] = { + QGVAR(m2_carry), + QGVAR(m1919a4_carry), + QGVAR(m1919a6_carry), + QGVAR(m60_carry), + QGVAR(tow_carry), + QGVAR(dshkm_carry), + QGVAR(dshkm_shield_carry), + QGVAR(dshkm_AA_carry), + QGVAR(rpd_carry), + QGVAR(pk_carry), + QGVAR(mg42_carry), + QGVAR(sgm_carry), + QGVAR(sgm_shield_carry), + QGVAR(mk18_carry), + QGVAR(mortar_m29_carry), + QGVAR(mortar_m2_carry), + QGVAR(mortar_type53_carry) + }; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common", "loadorder_f_vietnam"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut", "veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_CSW_Groups.hpp" +#include "ACE_Medical_Injuries.hpp" +#include "ACE_Triggers.hpp" +#include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgGlasses.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "EMM_mainMenu_CfgMenus.hpp" diff --git a/addons/compat_sog/functions/fnc_disableCookoff.sqf b/addons/compat_sog/functions/fnc_disableCookoff.sqf new file mode 100644 index 0000000000..07c36567a6 --- /dev/null +++ b/addons/compat_sog/functions/fnc_disableCookoff.sqf @@ -0,0 +1,21 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Disables cookoff for bicycles. + * + * Arguments: + * 0: Bicycle + * + * Return Value: + * None + * + * Example: + * [bicycle] call ace_compat_sog_fnc_disableCookoff + * + * Public: No + */ + +params ["_bicycle"]; + +_bicycle setVariable [QEGVAR(cookoff,enable), false]; +_bicycle setVariable [QEGVAR(cookoff,enableAmmoCookoff), false]; diff --git a/addons/compat_sog/functions/fnc_handleBikeMinePlace.sqf b/addons/compat_sog/functions/fnc_handleBikeMinePlace.sqf new file mode 100644 index 0000000000..83314e4b64 --- /dev/null +++ b/addons/compat_sog/functions/fnc_handleBikeMinePlace.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" +/* + * Author: veteran29 + * Handle placement of bike mine object. + * + * Arguments: + * 0: Bike mine + * + * Return Value: + * None + * + * Example: + * [bikeMine] call ace_compat_sog_fnc_handleBikeMinePlace + * + * Public: No + */ + +params ["_mine"]; + +if (!local _mine) exitWith {}; + +// change COM to have the bike upright like the placed mine +_mine setCenterOfMass [0,0, -0.5]; + +// prevent the object from swinging left and right +[{isTouchingGround _this}, { + _this setVelocity [0,0,0] +}, _mine, 3] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf b/addons/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf new file mode 100644 index 0000000000..4799f6207a --- /dev/null +++ b/addons/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf @@ -0,0 +1,57 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Manually triggers punji trap damage. + * + * Arguments: + * 0: Punji trap + * 1: Affected units + * + * Return Value: + * None + * + * Example: + * [trap] call ace_compat_sog_fnc_handlePunjiTrapDamage + * + * Public: No + */ +params ["_trap", "_affectedUnits"]; + +(getShotParents _trap) params ["", "_instigator"]; + +private _bodyParts = []; +private _stabCount = 0; + +switch (typeOf _trap select [0, 16]) do { + // Large trap + case "vn_mine_punji_01": { + _bodyParts = ["LeftLeg", "RightLeg", "Body"]; + _stabCount = random [7, 10, 13]; + }; + // Small trap + case "vn_mine_punji_02": { + _bodyParts = ["LeftLeg", "RightLeg"]; + _stabCount = random [3, 5, 7]; + }; + // Whip trap + case "vn_mine_punji_03": { + _bodyParts = ["LeftLeg", "RightLeg", "Body"]; + _stabCount = random [3, 5, 7]; + }; + // Door way trap + case "vn_mine_punji_04": { + _bodyParts = ["Head", "Body"]; + _stabCount = random [3, 5, 7]; + }; + // Side whip trap + case "vn_mine_punji_05": { + _bodyParts = ["LeftLeg", "RightLeg"]; + _stabCount = random [3, 5, 7]; + }; +}; + +{ + for "_i" from 0 to _stabCount do { + [_x, random [1, 2, 3], selectRandom _bodyParts, "stab", _instigator] call EFUNC(medical,addDamageToUnit); + }; +} forEach (_affectedUnits select {isDamageAllowed _x}); // isDamageAllowed already does local check diff --git a/addons/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf b/addons/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf new file mode 100644 index 0000000000..315e1cbe90 --- /dev/null +++ b/addons/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" +/* + * Author: veteran29 + * Handle placement of punji trap object. + * + * Arguments: + * 0: Punji trap + * + * Return Value: + * None + * + * Example: + * [trap] call ace_compat_sog_fnc_handlePunjiTrapPlace + * + * Public: No + */ + +params ["_trap"]; + +if (isServer && {_trap isKindOf QEXPLOSIVES_PLACE(punji_03)}) exitWith { + + private _spikes = createSimpleObject ["vn\weapons_f_vietnam\mines\punji\vn_mine_punji_03_ammo", [0,0,0]]; + _spikes animateSource ["mine_trigger_source", 0.1]; + + private _offset = [0.0655, -0.0357, 0.0906]; + _spikes attachTo [_trap, _offset]; + _trap setVariable [QGVAR(spikes), _spikes]; + + _trap addEventHandler ["Deleted", { + params ["_trap"]; + deleteVehicle (_trap getVariable [QGVAR(spikes), objNull]); + }]; +}; diff --git a/addons/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf b/addons/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf new file mode 100644 index 0000000000..17ed92a172 --- /dev/null +++ b/addons/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" +/* + * Author: GhostIsSpooky, veteran29 + * Handler for 'detonation' of a local punji trap. Workaround for local-only ammo hit event. + * + * Arguments: + * 0: Punji trap + * + * Return Value: + * None + * + * Example: + * [trap] call ace_compat_sog_fnc_handlePunjiTrapTrigger + * + * Public: No + */ +params ["_trap"]; +if (!(["ACE_Medical"] call EFUNC(common,isModLoaded))) exitWith {}; + +private _radius = getNumber (configOf _trap >> "indirectHitRange"); +private _affectedUnits = _trap nearEntities ["CAManBase", _radius]; + +private _spikesOffset = [configOf _trap >> QGVAR(spikesOffset), "ARRAY", [0,0,0]] call CBA_fnc_getConfigEntry; +if (_spikesOffset isNotEqualTo [0,0,0]) then { + private _spikesPos = _trap modelToWorld _spikesOffset; + private _spikesCheckSelection = getText (configOf _trap >> QGVAR(spikesCheckSelection)); + private _spikesCheckRadius = getNumber (configOf _trap >> QGVAR(spikesCheckRadius)); + + TRACE_3("Using spikes offset for affected units",_spikesOffset,_spikesCheckSelection,_spikesCheckRadius); + + _affectedUnits = _affectedUnits select { + private _distance = _spikesPos distance (_x modelToWorld (_x selectionPosition _spikesCheckSelection)); + + _distance <= _spikesCheckRadius // return + }; +}; + +if (_affectedUnits isEqualTo []) exitWith {}; + +[QGVAR(handlePunjiTrapDamage), [_trap, _affectedUnits], _affectedUnits] call CBA_fnc_targetEvent; diff --git a/addons/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf b/addons/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf new file mode 100644 index 0000000000..75ee243f08 --- /dev/null +++ b/addons/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" +/* + * Author: veteran29 + * Custom wound handler for SOG: PF explosive incendiary ammunition. + * Determines if the unit should be ignited and passes the damage to other wound handlers. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * Input + * + * Example: + * [player, [[0.5, "Body", 5]]] call ace_compat_sog_fnc_woundsHandlerIncendiary + * + * Public: No + */ + +#define BURN_THRESHOLD 1 + +params ["_unit", "_damages"]; +TRACE_2("woundsHandlerIncendiary",_unit,_damages); + +private _fireDamage = 0; +{ + _x params ["", "", "_damage"]; + _fireDamage = _fireDamage + _damage; +} forEach _damages; + +private _intensity = linearConversion [0, 20, _fireDamage, 0, 10, true]; +TRACE_2("",_intensity,_fireDamage); + +if (_intensity > BURN_THRESHOLD) then { + TRACE_2("Setting unit ablaze",_intensity,BURN_THRESHOLD); + ["ace_fire_burn", [_unit, _intensity]] call CBA_fnc_globalEvent; +}; + +_this // return diff --git a/addons/compat_sog/script_component.hpp b/addons/compat_sog/script_component.hpp new file mode 100644 index 0000000000..616cc49dc7 --- /dev/null +++ b/addons/compat_sog/script_component.hpp @@ -0,0 +1,14 @@ +#define COMPONENT compat_sog +#define COMPONENT_BEAUTIFIED S.O.G. Prairie Fire Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE + +#include "\z\ace\addons\main\script_macros.hpp" + +#include "\z\ace\addons\refuel\defines.hpp" + +#define EXPLOSIVES_PLACE(CLASS) EGVAR(explosives,DOUBLES(Place,CLASS)) +#define QEXPLOSIVES_PLACE(CLASS) QUOTE(EXPLOSIVES_PLACE(CLASS)) diff --git a/addons/compat_sog/stringtable.xml b/addons/compat_sog/stringtable.xml new file mode 100644 index 0000000000..57e4106b78 --- /dev/null +++ b/addons/compat_sog/stringtable.xml @@ -0,0 +1,385 @@ + + + + + Dig in + Zakop + Eingraben + 掘る + 땅파기 + 挖掘 + Закопать + Enterrarse + + + M49A2 60mm HE + M49A2 60mm HE + M49A2 60mm りゅう弾 + M49A2 60mm HE + M49A2 60mm 고폭 + M49A2 60 mm 高爆弹 + M49A2 60 мм ОФ + M49A2 60mm HE + + + M302 60mm WP + M302 60mm Weißer Phosphor + M302 60mm 白リン弾 + M302 60mm WP + M302 60mm 백린 + M302 60 mm 白磷弹 + M302 60 мм Фосфорная + M302 60mm WP + + + M83 60mm Lume + M83 60mm Leuchtpatrone + M83 60mm 照明弾 + M83 60mm ILUM + M83 60mm 조명 + M83 60 mm 照明弹 + M83 60 мм Осветительная + M83 60mm Iluminación + + + M374 81mm HE + M374 81mm HE + M374 81mm りゅう弾 + M374 81mm HE + M374 81mm 고폭 + M374 81 mm 高爆弹 + M374 81 мм ОФ + M374 81mm HE + + + M375 81mm WP + M375 81mm Weißer Phosphor + M375 81mm 白リン弾 + M375 81mm WP + M375 81mm 백린 + M375 81 mm 白磷弹 + M375 81 мм Фосфорная + M375 81mm WP + + + M301A3 81mm Lume + M301A3 81mm Leuchtpatrone + M301A3 81mm 照明弾 + M301A3 81mm ILUM + M301A3 81mm 조명 + M301A3 81 mm 照明弹 + M301A3 81 мм Осветительная + M301A3 81mm Iluminación + + + M57 81mm Smoke + M57 81mm Nebelpatrone + M57 81mm 発煙弾 + M57 81mm Dymny + M57 81mm 연막 + M57 81 mm 烟雾弹 + M57 81 мм Дымовая + M57 81mm Smoke + + + O-832D 82mm HE + O-832D 82mm HE + O-832D 82mm りゅう弾 + O-832D 82mm HE + O-832D 82mm 고폭 + O-832D 82 mm 高爆弹 + О-832Д 82 мм ОФ + O-832D 82mm HE + + + D-832 82mm WP + D-832 82mm Weißer Phosphor + D-832 82mm 白リン弾 + D-832 82mm WP + D-832 82mm 백린 + D-832 82 mm 白磷弹 + Д-832 82 мм Фосфорная + D-832 82mm WP + + + S-832S 82mm Lume + S-832S 82mm Leuchtpatrone + S-832S 82mm 照明弾 + S-832S 82mm ILUM + S-832S 82mm 조명 + S-832S 82 mm 照明弹 + С-832С 82 мм Осветительная + S-832S 82mm Iluminación + + + [ACE] M49A2 60mm HE Box + [ACE] M49A2 60mm HE Box + [ACE] M49A2 60mm りゅう弾入り弾薬箱 + [ACE] Skrzynia M49A2 60mm HE + [ACE] M49A2 60mm 고폭 상자 + [ACE] M49A2 60 mm 高爆弹弹药箱 + [ACE] Коробка M49A2 60 мм ОФ + [ACE] M49A2 60mm Caja de HE + + + [ACE] M302 60mm WP Box + [ACE] M302 60mm Weißer Phosphor Box + [ACE] M302 60mm 白リン弾入り弾薬箱 + [ACE] Skrzynia M302 60mm WP + [ACE] M302 60mm 백린 상자 + [ACE] M302 60 mm 白磷弹弹药箱 + [ACE] Коробка M302 60 мм Фосфорных + [ACE] M302 60mm Caja de WP + + + [ACE] M83 60mm Lume Box + [ACE] M83 60mm Leuchtpatrone Box + [ACE] M83 60mm 照明弾弾入り弾薬箱 + [ACE] Skrzynia ILUM M83 60mm + [ACE] M83 60mm 조명 상자 + [ACE] M83 60 mm 照明弹弹药箱 + [ACE] Коробка M83 60 мм Осветительных + [ACE] M83 60mm Caja de Iluminación + + + [ACE] M374 81mm HE Box + [ACE] M374 81mm HE Box + [ACE] M374 81mm りゅう弾入り弾薬箱 + [ACE] Skrzynia M374 81mm HE + [ACE] M374 81mm 고폭 상자 + [ACE] M374 81 mm 高爆弹弹药箱 + [ACE] Коробка M374 81 мм ОФ + [ACE] M374 81mm Caja de HE + + + [ACE] M375 81mm WP Box + [ACE] M375 81mm Weißer Phosphor Box + [ACE] M375 81mm 白リン弾入り弾薬箱 + [ACE] Skrzynia M375 81mm WP + [ACE] M375 81mm 백린 상자 + [ACE] M375 81 mm 白磷弹弹药箱 + [ACE] Коробка M375 81 мм Фосфорных + [ACE] M375 81mm Caja de WP + + + [ACE] M301A3 81mm Lume Box + [ACE] M301A3 81mm Leuchtpatrone Box + [ACE] M301A1 81mm 照明弾入り弾薬箱 + [ACE] Skrzynia M301A3 81mm ILUM + [ACE] M301A3 81mm 조명 상자 + [ACE] M301A3 81 mm 照明弹弹药箱 + [ACE] Коробка M301A3 81 мм Осветительных + [ACE] M301A3 81mm Caja de Iluminación + + + [ACE] M57 81mm Smoke Box + [ACE] M57 81mm Nebelpatrone Box + [ACE] M57 81mm 煙幕弾入り弾薬箱 + [ACE] Skrzynia M57 81mm Dymny + [ACE] M57 81mm 연막 상자 + [ACE] M57 81 mm 烟雾弹弹药箱 + [ACE] Коробка M57 81 мм Дымовых + [ACE] M57 81mm Caja de Humo + + + [ACE] O-832D 82mm HE Box + [ACE] O-832D 82mm HE Box + [ACE] O-832D 82mm りゅう弾入り弾薬箱 + [ACE] Skrzynia O-832D 82mm HE + [ACE] O-832D 82mm 고폭 상자 + [ACE] O-832D 82 mm 高爆弹弹药箱 + [ACE] Коробка О-832Д 82 мм ОФ + [ACE] O-832D 82mm Caja de HE + + + [ACE] D-832 82mm WP Box + [ACE] D-832 82mm Weißer Phosphor Box + [ACE] D-832 82mm 白リン弾入り弾薬箱 + [ACE] Skrzynia D-832 82mm WP + [ACE] D-832 82mm 백린 상자 + [ACE] D-832 82 mm 白磷弹弹药箱 + [ACE] Коробка Д-832 82 мм Фосфорных + [ACE] D-832 82mm Caja de WP + + + [ACE] S-832S 82mm Lume Box + [ACE] S-832S 82mm Leuchtpatrone Box + [ACE] S-832S 82mm 照明弾入り弾薬箱 + [ACE] Skrzynia S-832S 82mm ILUM + [ACE] S-832S 82mm 조명 상자 + [ACE] S-832S 82 mm 照明弹弹药箱 + [ACE] Коробка С-832С 82 мм Осветительных + [ACE] S-832S 82mm Caja de Iluminación + + + Dig Spiderhole + Schützenloch graben + 蛸壺壕を掘る + Wykop Lisią Norę + 개인호 파기 + 挖掘散兵坑 + Выкопать паучью дыру + Excavar Agujero de araña + + + Dig Spiderhole (Angled Cover) + Schützenloch graben (Abgeschrägte Abdeckung) + 蛸壺壕 (屋根) を掘る + Wykop Lisią Norę (z dachem) + 개인호 파기 (각진 엄폐) + 挖掘带斜盖散兵坑 + Выкопать крытую паучью дыру + Excavar Agujero de araña (Cubierta inclinada) + + + Dig Spiderhole (Dual) + Großes Schützenloch graben + 蛸壺壕 (2人用) を掘る + Wykop Lisią Norę (podwójną) + 개인호 파기 (2인용) + 挖掘双人散兵坑 + Выкопать двойную паучью дыру + Excavar Agujero de araña (Doble) + + + [CSW] M1919A4 Gun Bag + [CSW] M1919A4 Waffentasche + [CSW] M1919A4 ガン バッグ + [CSW] Torba na M1919A4 + [CSW] M1919A4 총가방 + [班组] M1919A4 枪袋 + [CSW] Сумка с M1919A4 + [CSW] M1919A4 Bolsa para arma + + + [CSW] M1919A6 Gun Bag + [CSW] M1919A6 Waffentasche + [CSW] M1919A6 ガン バッグ + [CSW] Torba na M1919A6 + [CSW] M1919A6 총가방 + [班组] M1919A6 枪袋 + [CSW] Сумка с M1919A6 + [CSW] M1919A6 Bolsa para arma + + + [CSW] M60 Gun Bag + [CSW] M60 Waffentasche + [CSW] M60 ガン バッグ + [CSW] Torba na M60 + [CSW] M60 총가방 + [班组] M60 枪袋 + [CSW] Сумка с M60 + [CSW] M60 Bolsa para arma + + + [CSW] DShK (Shield) Gun Bag + [CSW] DShK (Schutzschild) Waffentasche + [CSW] DShK (防盾) ガン バッグ + [CSW] Torba na DShK (z tarczą) + [CSW] DShK (방패) 총가방 + [班组] DShK(防盾)枪袋 + [CSW] Сумка с ДШК (со щитом) + [CSW] DShK (Apantallada) Bolsa para arma + + + [CSW] DShK (AA) Gun Bag + [CSW] DShK (AA) Waffentasche + [CSW] DShK (対空) ガン バッグ + [CSW] Torba na DShK (AA) + [CSW] DShK (대공) 총가방 + [班组] DShK(高)枪袋 + [CSW] Сумка с ДШК (зенитный) + [CSW] DShK (AA) Bolsa para arma + + + [CSW] RPD Gun Bag + [CSW] RPD Waffentasche + [CSW] RPD ガン バッグ + [CSW] Torba na RPD + [CSW] RPD 총가방 + [班组] RPD 枪袋 + [CSW] Сумка с РПД + [CSW] RPD Bolsa para arma + + + [CSW] PK Gun Bag + [CSW] PK Waffentasche + [CSW] PK ガン バッグ + [CSW] Torba na PK + [CSW] PK 총가방 + [班组] PK 枪袋 + [CSW] Сумка с ПК + [CSW] PK Bolsa para arma + + + [CSW] MG42 Gun Bag + [CSW] MG42 Waffentasche + [CSW] MG42 ガン バッグ + [CSW] Torba na MG42 + [CSW] MG42 총가방 + [班组] MG42 枪袋 + [CSW] Сумка с MG42 + [CSW] MG42 Bolsa para arma + + + [CSW] SGM Gun Bag + [CSW] SGM Waffentasche + [CSW] SGM ガン バッグ + [CSW] Torba na SGM + [CSW] SGM 총가방 + [班组] SGM 枪袋 + [CSW] Сумка с СГМ + [CSW] SGM Bolsa para arma + + + [CSW] SGM (Shield) Gun Bag + [CSW] SGM (Schutzschild) Waffentasche + [CSW] SGM (防盾) ガン バッグ + [CSW] Torba na SGM (z tarczą) + [CSW] SGM (방패) 총가방 + [班组] SGM(防盾)枪袋 + [CSW] Сумка с СГМ (со щитом) + [CSW] SGM (Apantallada) Bolsa para arma + + + [CSW] Mk18 Gun Bag + [CSW] Mk18 Waffentasche + [CSW] Mk18 ガン バッグ + [CSW] Torba na Mk18 + [CSW] Mk18 총가방 + [班组] Mk18 枪袋 + [CSW] Сумка с Mk18 + [CSW] Mk18 Bolsa para arma + + + [CSW] M29 Mortar Tube + [CSW] M29 Mörserrohr + [CSW] M29 発射筒 + [CSW] M29 Rura od moździerza + [CSW] M29 박격포 포신 + [班组] M29 迫击炮炮管 + [CSW] Сумка с миномётом M29 + [CSW] M29 Tubo de Mortero + + + [CSW] M2 Mortar Tube + [CSW] M2 Mörserrohr + [CSW] M2 底盤 + [CSW] M2 Rura od moździerza + [CSW] M2 박격포 포신 + [班组] M2 迫击炮炮管 + [CSW] Сумка с миномётом M2 + [CSW] M2 Tubo de mortero + + + [CSW] Type 53 Mortar Tube + [CSW] Typ 53 Mörserrohr + [CSW] 53 式 発射筒 + [CSW] Type 53 Rura od moździerza + [CSW] 53식 박격포 포신 + [班组] 53式迫击炮炮管 + [CSW] Сумка с миномётом Type 53 + [CSW] Type 53 Tubo de mortero + + + diff --git a/addons/compat_ws/$PBOPREFIX$ b/addons/compat_ws/$PBOPREFIX$ new file mode 100644 index 0000000000..a025a8275e --- /dev/null +++ b/addons/compat_ws/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_ws diff --git a/addons/compat_ws/CfgWeapons.hpp b/addons/compat_ws/CfgWeapons.hpp new file mode 100644 index 0000000000..10e4b68eb2 --- /dev/null +++ b/addons/compat_ws/CfgWeapons.hpp @@ -0,0 +1,79 @@ +class CfgWeapons { + // AA40 + class Rifle_Base_F; + class sgun_aa40_base_lxWS: Rifle_Base_F { + ACE_barrelLength = 457; + ACE_barrelTwist = 0.0; + ACE_twistDirection = 0; + }; + + // Galat Arm + class arifle_Galat_base_lxWS: Rifle_Base_F { + ACE_barrelLength = 535; + ACE_barrelTwist = 304.8; + ACE_twistDirection = 1; + }; + + // SA-77 + class Rifle_Long_Base_F; + class LMG_S77_base_lxWS: Rifle_Long_Base_F { + ACE_barrelLength = 550; + ACE_barrelTwist = 304.8; + ACE_twistDirection = 1; + }; + class LMG_S77_Compact_base_lxWS: LMG_S77_base_lxWS { + ACE_barrelLength = 500; + ACE_barrelTwist = 304.8; + ACE_twistDirection = 1; + }; + + // SLR + class DMR_06_base_F; + class arifle_SLR_lxWS: DMR_06_base_F { + ACE_barrelLength = 533; + ACE_barrelTwist = 279.4; + ACE_twistDirection = 1; + }; + + // Velko R4/R5 + class arifle_Velko_base_lxWS: arifle_Galat_base_lxWS { + ACE_barrelLength = 460; + ACE_barrelTwist = 304.8; + ACE_twistDirection = 1; + }; + class arifle_VelkoR5_lxWS: arifle_Velko_base_lxWS { + ACE_barrelLength = 332; + ACE_barrelTwist = 304.8; + ACE_twistDirection = 1; + }; + + // XMS - Weird off-shoot from the XM8 rifles so there is no data for barrel lengths or twists. Used the vanilla CTAR as a baseline for the values. + class arifle_SPAR_01_base_F; + class arifle_XMS_Base_lxWS: arifle_SPAR_01_base_F { + ACE_barrelLength = 406.4; + ACE_barrelTwist = 178.0; + ACE_twistDirection = 1; + }; + + // Headgear + // ION Cap (Headphones) + class lxWS_H_CapB_rvs_blk; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { + ace_hearing_protection = 0.75; + ace_hearing_lowerVolume = 0.2; + }; + + // Tank helmet + class HelmetBase; + class lxWS_H_Tank_tan_F: HelmetBase { + ace_hearing_protection = 0.85; + ace_hearing_lowerVolume = 0.6; + }; + + // Headphones, inherited hearing protection + class H_Cap_headphones; + class lxWS_H_Headset: H_Cap_headphones { + ace_hearing_protection = 0; + ace_hearing_lowerVolume = 0; + }; +}; diff --git a/addons/compat_ws/compat_ws_nouniformrestrictions/CfgVehicles.hpp b/addons/compat_ws/compat_ws_nouniformrestrictions/CfgVehicles.hpp new file mode 100644 index 0000000000..8158db66cd --- /dev/null +++ b/addons/compat_ws/compat_ws_nouniformrestrictions/CfgVehicles.hpp @@ -0,0 +1,167 @@ +// Generated using ace_nouniformrestrictions_fnc_exportConfig +class CfgVehicles { + class I_SFIA_soldier_lxWS; + class I_SFIA_Soldier_universal_lxWS; + class I_SFIA_Soldier_TL_lxWS; + class I_SFIA_Soldier_GL_lxWS; + class I_SFIA_Soldier_AR_lxWS; + class I_SFIA_officer_lxWS; + class I_SFIA_sharpshooter_lxWS; + class I_SFIA_crew_lxWS; + class I_SFIA_pilot_lxWS; + class I_SFIA_soldier_at_lxWS; + class I_SFIA_soldier_aa_lxWS; + class I_SFIA_medic_lxWS; + class I_SFIA_exp_lxWS; + class I_SFIA_repair_lxWS; + class I_SFIA_soldier_unarmed_lxWS; + class I_SFIA_survivor_lxWS; + class I_SFIA_Soldier_AAT_lxWS; + class I_SFIA_Soldier_AAA_lxWS; + class I_C_Soldier_Bandit_5_F; + class I_C_Soldier_Bandit_4_F; + class I_C_Soldier_Para_2_F; + class I_C_Soldier_Bandit_2_F; + class I_C_Soldier_Bandit_1_F; + class I_Tura_HeavyGunner_lxWS; + class B_D_Soldier_universal_lxWS; + + class O_SFIA_soldier_lxWS: I_SFIA_soldier_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_Soldier_universal_lxWS: I_SFIA_Soldier_universal_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_Soldier_TL_lxWS: I_SFIA_Soldier_TL_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_Soldier_GL_lxWS: I_SFIA_Soldier_GL_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_Soldier_AR_lxWS: I_SFIA_Soldier_AR_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_officer_lxWS: I_SFIA_officer_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_sharpshooter_lxWS: I_SFIA_sharpshooter_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_crew_lxWS: I_SFIA_crew_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_pilot_lxWS: I_SFIA_pilot_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_soldier_at_lxWS: I_SFIA_soldier_at_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_soldier_aa_lxWS: I_SFIA_soldier_aa_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_medic_lxWS: I_SFIA_medic_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_exp_lxWS: I_SFIA_exp_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_repair_lxWS: I_SFIA_repair_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_soldier_unarmed_lxWS: I_SFIA_soldier_unarmed_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_survivor_lxWS: I_SFIA_survivor_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_Soldier_AAT_lxWS: I_SFIA_Soldier_AAT_lxWS { + modelSides[] = {6}; + }; + class O_SFIA_Soldier_AAA_lxWS: I_SFIA_Soldier_AAA_lxWS { + modelSides[] = {6}; + }; + class I_SFIA_scout_lxWS: I_C_Soldier_Bandit_5_F { + modelSides[] = {6}; + }; + class I_SFIA_watcher_lxWS: I_C_Soldier_Bandit_4_F { + modelSides[] = {6}; + }; + class I_SFIA_enforcer_lxWS: I_C_Soldier_Para_2_F { + modelSides[] = {6}; + }; + class I_SFIA_hireling_lxWS: I_C_Soldier_Bandit_2_F { + modelSides[] = {6}; + }; + class I_SFIA_medic2_lxWS: I_C_Soldier_Bandit_1_F { + modelSides[] = {6}; + }; + class I_SFIA_thug_lxWS: I_SFIA_scout_lxWS { + modelSides[] = {6}; + }; + class I_SFIA_deserter_lxWS: I_SFIA_soldier_lxWS { + modelSides[] = {6}; + }; + class I_Tura_deserter_lxWS: I_SFIA_deserter_lxWS { + modelSides[] = {6}; + }; + class I_SFIA_defector_lxWS: I_SFIA_soldier_lxWS { + modelSides[] = {6}; + }; + class O_Tura_scout_lxWS: I_SFIA_scout_lxWS { + modelSides[] = {6}; + }; + class O_Tura_watcher_lxWS: I_SFIA_watcher_lxWS { + modelSides[] = {6}; + }; + class O_Tura_enforcer_lxWS: I_SFIA_enforcer_lxWS { + modelSides[] = {6}; + }; + class O_Tura_hireling_lxWS: I_SFIA_hireling_lxWS { + modelSides[] = {6}; + }; + class O_Tura_medic2_lxWS: I_SFIA_medic2_lxWS { + modelSides[] = {6}; + }; + class O_Tura_thug_lxWS: I_SFIA_thug_lxWS { + modelSides[] = {6}; + }; + class O_Tura_deserter_lxWS: I_SFIA_deserter_lxWS { + modelSides[] = {6}; + }; + class O_Tura_defector_lxWS: I_SFIA_defector_lxWS { + modelSides[] = {6}; + }; + class B_Tura_scout_lxWS: I_SFIA_scout_lxWS { + modelSides[] = {6}; + }; + class B_Tura_watcher_lxWS: I_SFIA_watcher_lxWS { + modelSides[] = {6}; + }; + class B_Tura_enforcer_lxWS: I_SFIA_enforcer_lxWS { + modelSides[] = {6}; + }; + class B_Tura_hireling_lxWS: I_SFIA_hireling_lxWS { + modelSides[] = {6}; + }; + class B_Tura_medic2_lxWS: I_SFIA_medic2_lxWS { + modelSides[] = {6}; + }; + class B_Tura_thug_lxWS: I_SFIA_thug_lxWS { + modelSides[] = {6}; + }; + class B_Tura_deserter_lxWS: I_SFIA_deserter_lxWS { + modelSides[] = {6}; + }; + class B_Tura_defector_lxWS: I_SFIA_defector_lxWS { + modelSides[] = {6}; + }; + class B_Tura_HeavyGunner_lxWS: I_Tura_HeavyGunner_lxWS { + modelSides[] = {6}; + }; + class O_Tura_HeavyGunner_lxWS: I_Tura_HeavyGunner_lxWS { + modelSides[] = {6}; + }; + class B_ALC_Soldier_universal_lxWS: B_D_Soldier_universal_lxWS { + modelSides[] = {6}; + }; +}; diff --git a/addons/compat_ws/compat_ws_nouniformrestrictions/config.cpp b/addons/compat_ws/compat_ws_nouniformrestrictions/config.cpp new file mode 100644 index 0000000000..899c7f74af --- /dev/null +++ b/addons/compat_ws/compat_ws_nouniformrestrictions/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "data_f_lxWS_Loadorder", + "ace_nouniformrestrictions" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Mike"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_ws/compat_ws_nouniformrestrictions/script_component.hpp b/addons/compat_ws/compat_ws_nouniformrestrictions/script_component.hpp new file mode 100644 index 0000000000..0b98185fa0 --- /dev/null +++ b/addons/compat_ws/compat_ws_nouniformrestrictions/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT nouniformrestrictions +#define SUBCOMPONENT_BEAUTIFIED No Uniform Restrictions +#include "..\script_component.hpp" diff --git a/addons/compat_ws/config.cpp b/addons/compat_ws/config.cpp new file mode 100644 index 0000000000..32a3f6f73c --- /dev/null +++ b/addons/compat_ws/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"data_f_lxWS_Loadorder"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Mike"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_ws/script_component.hpp b/addons/compat_ws/script_component.hpp new file mode 100644 index 0000000000..7607cd056b --- /dev/null +++ b/addons/compat_ws/script_component.hpp @@ -0,0 +1,6 @@ +#define COMPONENT compat_ws +#define COMPONENT_BEAUTIFIED Western Sahara Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/concertina_wire/CfgVehicles.hpp b/addons/concertina_wire/CfgVehicles.hpp index d8c80f68a9..8f22f42b4a 100644 --- a/addons/concertina_wire/CfgVehicles.hpp +++ b/addons/concertina_wire/CfgVehicles.hpp @@ -75,6 +75,7 @@ class CfgVehicles { class ACE_ConcertinaWire: ACE_ConcertinaWireNoGeo { scope = 2; displayName = CSTRING(DisplayName); + editorPreview = QPATHTOF(data\preview_concertina_wire.jpg); model = QPATHTOF(data\ACE_ConcertinaWire.p3d); EGVAR(logistics_wirecutter,isFence) = 1; class ACE_Actions { @@ -104,7 +105,9 @@ class CfgVehicles { scope = 2; displayName = CSTRING(Coil_DisplayName); + editorPreview = QPATHTOF(data\preview_concertina_wire_coil.jpg); model = QPATHTOF(data\ACE_ConcertinaWireCoil.p3d); + icon = "iconObject_circle"; mapsize = 0.5; animated = 0; nameSound = "fence"; diff --git a/addons/concertina_wire/data/preview_concertina_wire.jpg b/addons/concertina_wire/data/preview_concertina_wire.jpg new file mode 100644 index 0000000000..82780eabf0 Binary files /dev/null and b/addons/concertina_wire/data/preview_concertina_wire.jpg differ diff --git a/addons/concertina_wire/data/preview_concertina_wire_coil.jpg b/addons/concertina_wire/data/preview_concertina_wire_coil.jpg new file mode 100644 index 0000000000..30b2b66ef7 Binary files /dev/null and b/addons/concertina_wire/data/preview_concertina_wire_coil.jpg differ diff --git a/addons/concertina_wire/functions/fnc_deploy.sqf b/addons/concertina_wire/functions/fnc_deploy.sqf index 85f78c65f9..579bc73f97 100644 --- a/addons/concertina_wire/functions/fnc_deploy.sqf +++ b/addons/concertina_wire/functions/fnc_deploy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * diff --git a/addons/concertina_wire/functions/fnc_dismount.sqf b/addons/concertina_wire/functions/fnc_dismount.sqf index 58f04379fd..b73deb6cf5 100644 --- a/addons/concertina_wire/functions/fnc_dismount.sqf +++ b/addons/concertina_wire/functions/fnc_dismount.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/concertina_wire/functions/fnc_dismountSuccess.sqf b/addons/concertina_wire/functions/fnc_dismountSuccess.sqf index 4611aea0f3..3a90b62a91 100644 --- a/addons/concertina_wire/functions/fnc_dismountSuccess.sqf +++ b/addons/concertina_wire/functions/fnc_dismountSuccess.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * diff --git a/addons/concertina_wire/functions/fnc_handleDamage.sqf b/addons/concertina_wire/functions/fnc_handleDamage.sqf index 958354250b..02092044ef 100644 --- a/addons/concertina_wire/functions/fnc_handleDamage.sqf +++ b/addons/concertina_wire/functions/fnc_handleDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * diff --git a/addons/concertina_wire/functions/fnc_handleInit.sqf b/addons/concertina_wire/functions/fnc_handleInit.sqf index a602281af1..444fdcf54a 100644 --- a/addons/concertina_wire/functions/fnc_handleInit.sqf +++ b/addons/concertina_wire/functions/fnc_handleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko * Handles wire Init diff --git a/addons/concertina_wire/functions/fnc_handleKilled.sqf b/addons/concertina_wire/functions/fnc_handleKilled.sqf index 33f00ebe13..507deb7a4c 100644 --- a/addons/concertina_wire/functions/fnc_handleKilled.sqf +++ b/addons/concertina_wire/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko * diff --git a/addons/concertina_wire/functions/fnc_vehicleDamage.sqf b/addons/concertina_wire/functions/fnc_vehicleDamage.sqf index baaa8efe06..b3ebb7f77c 100644 --- a/addons/concertina_wire/functions/fnc_vehicleDamage.sqf +++ b/addons/concertina_wire/functions/fnc_vehicleDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko * Handles vehicle damage from hitting wire diff --git a/addons/concertina_wire/functions/script_component.hpp b/addons/concertina_wire/functions/script_component.hpp deleted file mode 100644 index 5ec20093ef..0000000000 --- a/addons/concertina_wire/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\concertina_wire\script_component.hpp" \ No newline at end of file diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml index d427cf8541..069c74ffa5 100644 --- a/addons/concertina_wire/stringtable.xml +++ b/addons/concertina_wire/stringtable.xml @@ -66,7 +66,7 @@ 鉄条網を置く 철조망 배치 佈署鐵絲網 - 布署铁丝网 + 部署铁丝网 Bıçaklı Telleri Yerleştir diff --git a/addons/cookoff/CfgVehicles.hpp b/addons/cookoff/CfgVehicles.hpp index d2da771b01..78cbd0c623 100644 --- a/addons/cookoff/CfgVehicles.hpp +++ b/addons/cookoff/CfgVehicles.hpp @@ -35,13 +35,6 @@ class CfgVehicles { explosionEffect = "FuelExplosionBig"; }; - class APC_Wheeled_02_base_F: Wheeled_APC_F { // Otokar ARMA - RCWS Turret - GVAR(ignoreTurret) = 1; - }; - class APC_Tracked_01_base_F: Tank_F { // Namera, Nemmera - RCWS Turret - GVAR(ignoreTurret) = 1; - }; - class MRAP_01_base_F: Car_F { GVAR(engineSmokeOffset)[] = {0,-2,0}; diff --git a/addons/cookoff/XEH_PREP.hpp b/addons/cookoff/XEH_PREP.hpp index b9708b7c58..2cd87efaa7 100644 --- a/addons/cookoff/XEH_PREP.hpp +++ b/addons/cookoff/XEH_PREP.hpp @@ -7,4 +7,4 @@ PREP(cookOffEffect); PREP(cookOffBox); PREP(detonateAmmunition); PREP(getVehicleAmmo); - +PREP(isMagazineFlare); diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index 889e252d90..b9c8101595 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -11,16 +11,30 @@ [QGVAR(smoke), FUNC(smoke)] call CBA_fnc_addEventHandler; [QGVAR(cookOffBox), FUNC(cookOffBox)] call CBA_fnc_addEventHandler; -[QGVAR(cleanupEffects), { - params ["_vehicle", ["_effects", []]]; +// handle cleaning up effects when vehicle is deleted mid-cookoff +[QGVAR(addCleanupHandlers), { + params ["_vehicle"]; - _effects = _effects + (_vehicle getVariable [QGVAR(effects), []]); - if !(_effects isEqualTo []) then { - { deleteVehicle _x } count _effects; + // Don't add a new EH if cookoff is run multiple times + if ((_vehicle getVariable [QGVAR(deletedEH), -1]) == -1) then { + private _deletedEH = _vehicle addEventHandler ["Deleted", { + params ["_vehicle"]; + + [QGVAR(cleanupEffects), [_vehicle]] call CBA_fnc_localEvent; + }]; + + _vehicle setVariable [QGVAR(deletedEH), _deletedEH]; }; }] call CBA_fnc_addEventHandler; -GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; +[QGVAR(cleanupEffects), { + params ["_vehicle", ["_effects", []]]; + + _effects = _effects + (_vehicle getVariable [QGVAR(effects), []]); + if (_effects isNotEqualTo []) then { + { deleteVehicle _x } count _effects; + }; +}] call CBA_fnc_addEventHandler; ["ReammoBox_F", "init", { (_this select 0) addEventHandler ["HandleDamage", { @@ -39,6 +53,8 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; ) then { if (GVAR(ammoCookoffDuration) == 0) exitWith {}; ([_vehicle] call FUNC(getVehicleAmmo)) params ["_mags", "_total"]; - [_vehicle, _mags, _total] call FUNC(detonateAmmunition); + + private _delay = (random MAX_AMMO_DETONATION_START_DELAY) max MIN_AMMO_DETONATION_START_DELAY; + [FUNC(detonateAmmunition), [_vehicle, _mags, _total], _delay] call CBA_fnc_waitAndExecute; }; }, nil, ["Man","StaticWeapon"]] call CBA_fnc_addClassEventHandler; diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index 6c8ace548a..1d598cdb96 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Start a cook-off in the given vehicle. * * Arguments: @@ -16,18 +16,28 @@ * Public: No */ -params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true]]; +params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true], ["_maxIntensity", MAX_COOKOFF_INTENSITY, [0]], ["_canJet", true, [true]]]; if (GVAR(enable) == 0) exitWith {}; if !(GVAR(enableFire)) exitWith {}; +if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith {}; +// exit if cook-off enabled only for players and no players in vehicle crew found +if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1}) exitWith {}; -TRACE_8("cooking off",_vehicle,_intensity,_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing); + +TRACE_2("cooking off",_vehicle,_intensity); +TRACE_8("",_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing,_maxIntensity,_canJet); if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {}; _vehicle setVariable [QGVAR(isCookingOff), true, true]; +[QGVAR(addCleanupHandlers), [_vehicle]] call CBA_fnc_globalEvent; + +// limit maximum value of intensity to prevent very long cook-off times +_intensity = _intensity min _maxIntensity; + private _config = _vehicle call CBA_fnc_getObjectConfig; -private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {!((_vehicle selectionPosition _x) isEqualTo [0,0,0])}; +private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {(_vehicle selectionPosition _x) isNotEqualTo [0,0,0]}; if (_positions isEqualTo []) then { WARNING_1("no valid selection for cookoff found. %1",typeOf _vehicle); @@ -36,7 +46,7 @@ if (_positions isEqualTo []) then { if (_pos isEqualTo [0, 0, 0]) exitWith {}; _positions pushBack _x; } forEach DEFAULT_COMMANDER_HATCHES; - + if (_positions isEqualTo []) then { _positions pushBack "#noselection"; }; @@ -49,27 +59,27 @@ if (_smokeDelayEnabled) then { [QGVAR(smoke), [_vehicle, _positions]] call CBA_fnc_globalEvent; [{ - params ["_vehicle", "_positions", "_intensity", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing"]; + params ["_vehicle", "_positions", "_intensity", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_canJet"]; _vehicle setVariable [QGVAR(intensity), _intensity]; private _smokeEffects = _vehicle getVariable [QGVAR(effects), []]; [{ params ["_args", "_pfh"]; - _args params ["_vehicle", "_positions", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_smokeEffects"]; + _args params ["_vehicle", "_positions", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_canJet", "_smokeEffects"]; private _intensity = _vehicle getVariable [QGVAR(intensity), 0]; if (isNull _vehicle || {_intensity <= 1}) exitWith { [QGVAR(cleanupEffects), [_vehicle, _smokeEffects]] call CBA_fnc_globalEvent; _vehicle setVariable [QGVAR(isCookingOff), false, true]; [_pfh] call CBA_fnc_removePerFrameHandler; - - if (_detonateAfterCookoff) then { - _vehicle setDamage 1; + + if (GVAR(destroyVehicleAfterCookoff) || _detonateAfterCookoff) then { + _vehicle setDamage [1, true]; }; }; - + private _lastFlameTime = _vehicle getVariable [QGVAR(lastFlame), 0]; private _nextFlameTime = _vehicle getVariable [QGVAR(nextFlame), 0]; - + // Wait until we are ready for the next flame // dt = Tcurrent - Tlast // dt >= Tnext @@ -78,42 +88,42 @@ if (_smokeDelayEnabled) then { if (!_ring && _intensity >= 2) then { _ring = (0.7 > random 1); }; - + if !(_canRing) then { _ring = false; }; - + private _time = linearConversion [0, 10, _intensity, 3, 20] + random COOKOFF_TIME; - + if (_fireSource isEqualTo "") then { _fireSource = selectRandom _positions; }; - - [QGVAR(cookOffEffect), [_vehicle, true, _ring, _time, _fireSource]] call CBA_fnc_globalEvent; - + + [QGVAR(cookOffEffect), [_vehicle, _canJet, _ring, _time, _fireSource, _intensity]] call CBA_fnc_globalEvent; + _intensity = _intensity - (0.5 max random 1); _vehicle setVariable [QGVAR(intensity), _intensity]; _vehicle setVariable [QGVAR(lastFlame), CBA_missionTime]; _vehicle setVariable [QGVAR(nextFlame), _time + (MIN_TIME_BETWEEN_FLAMES max random MAX_TIME_BETWEEN_FLAMES)]; - + { [QEGVAR(fire,burn), [_x, _intensity * 1.5, _instigator]] call CBA_fnc_globalEvent; } forEach crew _vehicle }; - + if (_ammoDetonationChance > random 1) then { private _lastExplosiveDetonationTime = _vehicle getVariable [QGVAR(lastExplosiveDetonation), 0]; private _nextExplosiveDetonation = _vehicle getVariable [QGVAR(nextExplosiveDetonation), 0]; - + if ((CBA_missionTime - _lastExplosiveDetonationTime) > _nextExplosiveDetonation) then { if (_fireSource isEqualTo "") then { _fireSource = selectRandom _positions; }; createVehicle ["ACE_ammoExplosionLarge", (_vehicle modelToWorld (_vehicle selectionPosition _fireSource)), [], 0 , "CAN_COLLIDE"]; - + _vehicle setVariable [QGVAR(lastExplosiveDetonation), CBA_missionTime]; _vehicle setVariable [QGVAR(nextExplosiveDetonation), random 60]; }; }; - }, 0.25, [_vehicle, _positions, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _smokeEffects]] call CBA_fnc_addPerFrameHandler -}, [_vehicle, _positions, _intensity, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing], _delay] call CBA_fnc_waitAndExecute; + }, 0.25, [_vehicle, _positions, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _canJet, _smokeEffects]] call CBA_fnc_addPerFrameHandler +}, [_vehicle, _positions, _intensity, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _canJet], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/cookoff/functions/fnc_cookOffBox.sqf b/addons/cookoff/functions/fnc_cookOffBox.sqf index 28e3a91108..8b8e60891c 100644 --- a/addons/cookoff/functions/fnc_cookOffBox.sqf +++ b/addons/cookoff/functions/fnc_cookOffBox.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: KoffeinFlummi, commy2, SilentSpike + * Author: KoffeinFlummi, commy2, kymckay * Start a cook-off in the given ammo box. * * Arguments: diff --git a/addons/cookoff/functions/fnc_cookOffEffect.sqf b/addons/cookoff/functions/fnc_cookOffEffect.sqf index 4c32c8713d..a907f67606 100644 --- a/addons/cookoff/functions/fnc_cookOffEffect.sqf +++ b/addons/cookoff/functions/fnc_cookOffEffect.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Spawn cook-off effects * * Arguments: @@ -9,6 +9,7 @@ * 2: Spawn fire ring * 3: How long effect will last (Max 20 seconds) * 4: What selection will fire originate from + * 5: Cookoff intensity value * * Return Value: * None @@ -19,7 +20,7 @@ * Public: No */ -params ["_obj", "_jet", "_ring", "_time", "_fireSelection"]; +params ["_obj", "_jet", "_ring", "_time", "_fireSelection", "_intensity"]; private _light = "#lightpoint" createVehicleLocal [0,0,0]; _light setLightBrightness 5; _light setLightAmbient [0.8, 0.6, 0.2]; @@ -31,9 +32,11 @@ private _sound = objNull; if (isServer) then { // ironically biggest performance hit is this. Creating a new sound source takes up aprox 400 milliseconds. // I dont think there is an alternative that takes into effect distance and whatever, but if you find one please fix! - private _soundName = selectRandomWeighted [QGVAR(Sound_low), 0.1, QGVAR(Sound_mid), 0.25, QGVAR(Sound_high), 0.65]; - _sound = createSoundSource [_soundName, position _obj, [], 0]; - + if (_jet || _ring) then { + private _soundName = selectRandomWeighted [QGVAR(Sound_low), 0.1, QGVAR(Sound_mid), 0.25, QGVAR(Sound_high), 0.65]; + _sound = createSoundSource [_soundName, position _obj, [], 0]; + }; + if (_ring) then { private _intensity = 6; private _radius = 1.5 * ((boundingBoxReal _obj) select 2); @@ -43,40 +46,42 @@ if (isServer) then { [{ params ["_args", "_pfh"]; - _args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound"]; + _args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound", "_intensity"]; private _elapsedTime = CBA_missionTime - _startTime; if (_elapsedTime >= _time) exitWith { deleteVehicle _light; deleteVehicle _sound; - [QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_globalEvent; + if (isServer) then { + [QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_localEvent; + }; [_pfh] call CBA_fnc_removePerFrameHandler; }; private _factor = (1 + (_elapsedTime / 2) min 2); private _flameSize = 1.5; - + if (_elapsedTime > (_time * (3 / 4))) then { _factor = _factor * linearConversion [_time * (3 / 4), _time, _elapsedTime, 1, 0.5]; }; - + _light setLightBrightness 5 * (_factor / 5); - + if (_jet) then { private _particlePosition = (_obj selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, 0]; - + drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], "", "Billboard", 1, - (0.1 + (random 0.2)) * _factor, + (0.1 + (random 0.2)) * _factor, _particlePosition, - [0, 0, 15 * (_factor / 2)], + [0, 0, 15 * (_factor / 2)], 0, 10, 7.9, - 0.075, - [1.25 * _factor, 2.5 * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + 0.075, + [1.25 * _factor, 2.5 * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, @@ -84,104 +89,113 @@ if (isServer) then { "", _obj ]; - + // make flame push object into ground to make effect seem more "alive" if (!isGamePaused && { local _obj }) then { private _force = [0, 0, _factor * -(0.5 min random 1.5) * (0.3 min random 1)] vectorMultiply getMass _obj; _obj addForce [_force, vectorUpVisual _obj]; }; }; - + if (_ring) then { private _ringOrigin = (_obj selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, -1]; drop [ ["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [0, 20 * (_factor / 2), 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [0, 20 * (_factor / 2), 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [0, -20 * (_factor / 2), 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [0, -20 * (_factor / 2), 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [20 * (_factor / 2), 0, 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [20 * (_factor / 2), 0, 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, [-0.1 + random 0.2, -0.1 + random 0.2, -1], - [-20 * (_factor / 2), 0, 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [-20 * (_factor / 2), 0, 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; private _dir = 20 * (_factor / 2); drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [_dir, _dir, 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [_dir, _dir, 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; - + _dir = -20 * (_factor / 2); drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [_dir, _dir, 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [_dir, _dir, 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; - + _dir = 20 * (_factor / 2); drop [ ["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [_dir, -_dir, 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [_dir, -_dir, 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; - + _dir = 20 * (_factor / 2); drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32], - "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, + "", "Billboard", 1, (0.1 + (random 0.2)) * _factor, _ringOrigin, - [-_dir, _dir, 0], - 0, 10, 7.9, 0.075, - [1.25 * _factor, _flameSize * _factor], - [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], + [-_dir, _dir, 0], + 0, 10, 7.9, 0.075, + [1.25 * _factor, _flameSize * _factor], + [[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]], [2 + random 1], 1, 0, "", "", _obj ]; }; -}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound]] call cba_fnc_addPerFrameHandler; + + (getVehicleTIPars _obj) params ["_tiEngine", "_tiWheels", "_tiWeapon"]; + _obj setVehicleTIPars [ + // formula is designed to have the temperature ramp up quickly and then level out + (_tiEngine + (_intensity * 0.01))/1.005, + (_tiWheels + (_intensity * 0.004))/1.002, // wheels//tracks are further away from burning parts + (_tiWeapon + (_intensity * 0.01))/1.005 + ]; + +}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound, _intensity]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index 9cbe1c9f17..b4d48f3120 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Detonates ammunition from a vehicle until no ammo left @@ -6,8 +6,8 @@ * Arguments: * 0: vehicle * 1: Ammo Array - * 0: Magazine Classname - * 1: Ammo Count + * - 0: Magazine Classname + * - 1: Ammo Count * 2: Total Ammo Count * * Return Value: diff --git a/addons/cookoff/functions/fnc_engineFire.sqf b/addons/cookoff/functions/fnc_engineFire.sqf index 67c932d4bc..118537b30a 100644 --- a/addons/cookoff/functions/fnc_engineFire.sqf +++ b/addons/cookoff/functions/fnc_engineFire.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Start fire in engine block of a car. diff --git a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf index 62015cadae..f6be84c1f9 100644 --- a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf +++ b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets all magazines inside of a vehicle. @@ -8,8 +8,8 @@ * * Return Value: * 0: Ammo Array - * 0: Magazine Classname - * 1: Ammo Count + * - 0: Magazine Classname + * - 1: Ammo Count * 1: Total Ammo Count * * Example: @@ -24,26 +24,25 @@ TRACE_1("getVehicleAmmo",_vehicle); private _ammoToDetonate = []; private _totalAmmo = 0; -// from ace_common, tweaked becasue command is busted -private _ffvTurrets = fullCrew [_vehicle, "", true] select {_x select 4} apply {_x select 3}; - // Get ammo from turrets { _x params ["_mag", "_turret", "_count"]; // if the turret is an FFV seat, it takes magazines from the soldier - if (!(_turret in _ffvTurrets) && {_count > 0}) then { + if (_count > 0) then { + if (_mag call FUNC(isMagazineFlare)) then {continue}; private _ammo = getText (configFile >> "CfgMagazines" >> _mag >> "ammo"); private _model = getText (configFile >> "CfgAmmo" >> _ammo >> "model"); if (_model == "\A3\weapons_f\empty") exitWith {TRACE_3("skipping",_mag,_ammo,_model);}; _ammoToDetonate pushBack [_mag, _count]; _totalAmmo = _totalAmmo + _count; }; -} forEach (magazinesAllTurrets _vehicle); +} forEach (magazinesAllTurrets [_vehicle, true]); // Get ammo from cargo space { _x params ["_mag", "_count"]; if (_count > 0) then { + if (_mag call FUNC(isMagazineFlare)) then {continue}; _ammoToDetonate pushBack [_mag, _count]; _totalAmmo = _totalAmmo + _count; }; diff --git a/addons/cookoff/functions/fnc_handleDamageBox.sqf b/addons/cookoff/functions/fnc_handleDamageBox.sqf index 2bbb6f4b6b..dfc5cb7267 100644 --- a/addons/cookoff/functions/fnc_handleDamageBox.sqf +++ b/addons/cookoff/functions/fnc_handleDamageBox.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Handles all incoming damage for boxi diff --git a/addons/cookoff/functions/fnc_isMagazineFlare.sqf b/addons/cookoff/functions/fnc_isMagazineFlare.sqf new file mode 100644 index 0000000000..b6c8a604be --- /dev/null +++ b/addons/cookoff/functions/fnc_isMagazineFlare.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Cyruz + * Checks if the magazine has ammo which is a flare + * + * Arguments: + * 0: Magazine + * + * Return Value: + * 0: If magazine is type of flare + * + * Example: + * ["3Rnd_UGL_FlareWhite_F"] call ace_cookoff_fnc_isMagazineFlare + * + * Public: No + */ + +params ["_magazine"]; + +private _ammo = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo"); +private _intensity = getNumber (configFile >> "CfgAmmo" >> _ammo >> "intensity"); +private _flare = getNumber (configFile >> "CfgAmmo" >> _ammo >> QEGVAR(grenades,flare)); + +_intensity != 0 || _flare == 1 diff --git a/addons/cookoff/functions/fnc_smoke.sqf b/addons/cookoff/functions/fnc_smoke.sqf index 93a9b9a0cb..ce50043413 100644 --- a/addons/cookoff/functions/fnc_smoke.sqf +++ b/addons/cookoff/functions/fnc_smoke.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Starts vehicle barrel smoke effect. * * Arguments: @@ -11,13 +11,13 @@ * None * * Example: - * [vehicle player, ["commander_turret"]] call ace_cookoff_fnc_barrelSmoke + * [vehicle player, ["commander_turret"]] call ace_cookoff_fnc_smoke * * Public: No */ params ["_vehicle", ["_positions", []]]; - + private _turretConfig = [_vehicle, [0]] call CBA_fnc_getTurret; private _positionBarrelEnd = getText (_turretConfig >> "gunBeg"); @@ -31,7 +31,7 @@ private _effects = [_smokeBarrel]; { private _position = [0, -2, 0]; - if !(_x isEqualTo "#noselection") then { + if (_x isNotEqualTo "#noselection") then { _position = _vehicle selectionPosition _x; }; diff --git a/addons/cookoff/functions/script_component.hpp b/addons/cookoff/functions/script_component.hpp deleted file mode 100644 index d72f77978f..0000000000 --- a/addons/cookoff/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\cookoff\script_component.hpp" diff --git a/addons/cookoff/initSettings.sqf b/addons/cookoff/initSettings.sqf index 54eb89be54..8912636fd6 100644 --- a/addons/cookoff/initSettings.sqf +++ b/addons/cookoff/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_cookoff]: - [ QGVAR(enable), "LIST", [LSTRING(enable_hd_name), LSTRING(enable_hd_tooltip)], @@ -20,6 +18,16 @@ false // Needs mission restart ] call CBA_fnc_addSetting; +[ + QGVAR(destroyVehicleAfterCookoff), "CHECKBOX", + [LSTRING(destroyVehicleAfterCookoff_name), LSTRING(destroyVehicleAfterCookoff_tooltip)], + LSTRING(category_displayName), + false, // default value + true, // isGlobal + {[QGVAR(destroyVehicleAfterCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // Needs mission restart +] call CBA_fnc_addSetting; + [ QGVAR(enableAmmoCookoff), "CHECKBOX", [LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)], diff --git a/addons/cookoff/script_component.hpp b/addons/cookoff/script_component.hpp index 1bf61761b4..03b3e5c5f5 100644 --- a/addons/cookoff/script_component.hpp +++ b/addons/cookoff/script_component.hpp @@ -27,6 +27,10 @@ #define MIN_TIME_BETWEEN_FLAMES 5 #define MAX_TIME_BETWEEN_FLAMES 15 #define MAX_TIME_BETWEEN_AMMO_DET 25 +#define MAX_COOKOFF_INTENSITY 10 + +#define MIN_AMMO_DETONATION_START_DELAY 1 // Min time to wait before a vehicle's ammo starts to cookoff +#define MAX_AMMO_DETONATION_START_DELAY 6 // Max time to wait before a vehicle's ammo starts to cookoff // Delay between flame effect for players in a cooking off vehicle #define FLAME_EFFECT_DELAY 0.4 diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 5979373f83..eff7d4ddbe 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -12,7 +12,7 @@ ACE Durchzündung ACE Auto-inflammation ACE Samozapłon - ACE Возгорание + ACE Детонация ACE Cook off ACE Vznícení munice @@ -25,9 +25,11 @@ 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 + 피해량 조절 및 터렛에 효과 부여 Changes damage handling for cook off and turret explosion effects @@ -38,9 +40,11 @@ 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 + 쿡오프로 인해 피해량의 변화와 터렛 터짐현상을 결정합니다. Enable ammo box cook off @@ -53,7 +57,7 @@ Abilita esplosione cassa munizioni 開啟彈藥箱殉爆效果 开启弹药箱殉爆效果 - Разрешить возгорание ящиков с боеприпасами + Разрешить детонацию ящиков с боеприпасами Permitir cozinhar caixas de munição Povolit vynícení munice v krabicích @@ -68,7 +72,7 @@ Abilita l'esplosione della cassa di munizioni. 開啟彈藥箱殉爆效果 开启弹药箱殉爆效果 - Активирует возгорание ящиков с боеприпасами + Активирует детонацию ящиков с боеприпасами Permitir que caixas de munição cozinhem. Zapíná vznícení munice v krabicích. @@ -96,9 +100,9 @@ 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. @@ -113,7 +117,7 @@ 彈藥殉爆效果持續時間 弹药殉爆效果持续时间 쿡오프 지속 시간 - Длительность возгорания боеприпасов + Длительность детонации боеприпасов Duração do cozinhamento de munição Doba trvání vznícení munice @@ -128,7 +132,7 @@ 設定彈藥殉爆效果會持續多久時間 [輸入0來關閉殉爆效果] 设定弹药殉爆效果会持续多久时间 [输入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] @@ -142,9 +146,10 @@ 殉爆发生机率系数 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 @@ -156,17 +161,48 @@ 调整殉爆发生机率系数。值越高代表越容易发生殉爆。 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. + 쿡오프가 일어날 확률에 계수를 곱합니다. 더 큰 숫자는 더 높은 확률의 쿡오프를 일으킵니다. + + + Destroy Vehicles After Cook-off + 쿡오프 후 차량 파괴 + 殉爆发生后摧毁载具 + Уничтожать технику после детонации + Destruir vehículos tras la detonación inducida por calor + 誘爆後に車両を破壊する + Zniszcz Pojazdy po Zakończeniu Samozapłonu + Zerstöre Fahrzeuge nach der Durchzündung + + + Controls whether vehicles will always be destroyed after cooking off. + 誘爆後に車両を破壊するかどうかを設定する。 + Kontroluje, czy pojazdy będą zawsze niszczone po samozapłonie. + Steuert, ob Fahrzeuge nach dem Durchzünden immer zerstört werden. Enable Cook-Off Vehicle Fire 誘爆火災を有効化 + Véhicules - Feu durant l'auto-inflammation + Вкл. горение техники от детонации + Aktiviert das in Brand setzen des Fahrzeugs während des Durchzündens der Munition + Włącz pożar pojazdu podczas samozapłonu + 启用殉爆载具火灾 + 차량 쿡오프 화재 활성화 + Habilitar incendio a causa de la detonación inducida por calor Whether or not vehicles will catch on fire during cook-off 誘爆により車両が炎上するかどうかを設定します。 + Définit si les véhicules prennent feu durant l'auto-inflammation de leurs munitions. + Будет ли техника гореть при детонации боеприпасов + Ob Fahrzeuge in Brand gesetzt werden, während deren Munition durchzündet. + Określa, czy pojazdy zapalą się podczas samozapłonu ich amunicji. + 车辆在殉爆过程中是否会起火 + 쿡오프가 일어나면 차량에 불이 붙습니다. + Define si los vehículos salen ardiendo despues de una detonación inducida por calor. diff --git a/addons/csw/CfgMagazineGroups.hpp b/addons/csw/CfgMagazineGroups.hpp index 2093253d04..b3995210a2 100644 --- a/addons/csw/CfgMagazineGroups.hpp +++ b/addons/csw/CfgMagazineGroups.hpp @@ -74,7 +74,7 @@ class GVAR(groups) { 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; diff --git a/addons/csw/CfgMagazines.hpp b/addons/csw/CfgMagazines.hpp index dc972a5a92..86ad73c58f 100644 --- a/addons/csw/CfgMagazines.hpp +++ b/addons/csw/CfgMagazines.hpp @@ -53,7 +53,7 @@ class CfgMagazines { mass = 50; ACE_isBelt = 1; }; - + class 40Rnd_20mm_G_belt; class GVAR(20Rnd_20mm_G_belt): 40Rnd_20mm_G_belt { author = ECSTRING(common,ACETeam); diff --git a/addons/csw/CfgVehicles.hpp b/addons/csw/CfgVehicles.hpp index 4a1d63eb0c..dd5537f645 100644 --- a/addons/csw/CfgVehicles.hpp +++ b/addons/csw/CfgVehicles.hpp @@ -272,5 +272,15 @@ class CfgVehicles { ammoUnloadTime = 3; }; }; + // Ammo holder for returning ammo + class ReammoBox_F; + class GVAR(ammo_holder): ReammoBox_F { + EGVAR(cargo,canLoad) = 0; + EGVAR(cargo,noRename) = 1; + EGVAR(dragging,canCarry) = 1; // Allow this to be moved alongside the weapon + EGVAR(dragging,canDrag) = 1; + scope = 1; + maximumLoad = 0; // don't allow anything to be placed inside, only removed + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + }; }; - diff --git a/addons/csw/XEH_PREP.hpp b/addons/csw/XEH_PREP.hpp index 7bde8c3c0f..5966578aca 100644 --- a/addons/csw/XEH_PREP.hpp +++ b/addons/csw/XEH_PREP.hpp @@ -3,6 +3,8 @@ TRACE_1("",QUOTE(ADDON)); PREP(aceRearmGetCarryMagazines); PREP(ai_handleFired); +PREP(ai_handleGetIn); +PREP(ai_reload); PREP(assemble_canDeployTripod); PREP(assemble_canDeployWeapon); @@ -17,6 +19,7 @@ PREP(assemble_pickupWeapon); PREP(canGetIn); PREP(getIn); +PREP(getCarryMagazine); PREP(proxyWeapon); PREP(reload_actionsLoad); diff --git a/addons/csw/XEH_postInit.sqf b/addons/csw/XEH_postInit.sqf index d2dda6b0d1..a1aa348659 100644 --- a/addons/csw/XEH_postInit.sqf +++ b/addons/csw/XEH_postInit.sqf @@ -1,10 +1,13 @@ #include "script_component.hpp" -GVAR(vehicleMagCache) = call CBA_fnc_createNamespace; +GVAR(vehicleMagCache) = createHashMap; ["CBA_settingsInitialized", { TRACE_3("settingsInit",GVAR(defaultAssemblyMode),GVAR(handleExtraMagazines),GVAR(ammoHandling)); - ["StaticWeapon", "init", LINKFUNC(staticWeaponInit), true, [], true] call CBA_fnc_addClassEventHandler; + ["StaticWeapon", "Init", { + // needs a small delay for network syncing, or we end up with duplicate mags with ammo handling + [LINKFUNC(staticWeaponInit), _this, 1] call CBA_fnc_waitAndExecute; + }, true, [], true] call CBA_fnc_addClassEventHandler; }] call CBA_fnc_addEventHandler; diff --git a/addons/csw/dev/checkStaticWeapons.sqf b/addons/csw/dev/checkStaticWeapons.sqf index 0406cb7034..59e712cb70 100644 --- a/addons/csw/dev/checkStaticWeapons.sqf +++ b/addons/csw/dev/checkStaticWeapons.sqf @@ -1,5 +1,5 @@ #define DEBUG_MODE_FULL -#include "\z\ace\addons\csw\script_component.hpp" +#include "..\script_component.hpp" // Dev only function to search for weapons used by static weapons // and check if their magazinese are compatible diff --git a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf index 09ea4be8f8..5230fccf52 100644 --- a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf +++ b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Helper function for ace_rearm; Gets magazines that should be loaded by csw @@ -18,33 +18,33 @@ 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 _return = [[], []]; + +if !(_vehicle isKindOf "StaticWeapon") exitWith {_return}; // 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 {_return}; + +private _turretMagsCSW = _return select 0; +private _allCarryMags = _return select 1; + +private _turrets = allTurrets _vehicle; +if (_targetTurret isNotEqualTo true) then { + _turrets = _turrets select {_x isEqualTo _targetTurret}; +}; -private _turretMagsCSW = []; -private _allCarryMags = []; { private _turretPath = _x; - if ((_targetTurret isEqualTo true) || {_turretPath isEqualTo _targetTurret}) then { + { + private _weapon = _x; { - 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); + private _xMag = _x; + private _carryMag = _xMag call FUNC(getCarryMagazine); + if (_carryMag != "") then { + _turretMagsCSW pushBackUnique _xMag; + _allCarryMags pushBackUnique _carryMag; + }; + } forEach (compatibleMagazines _weapon); + } forEach (_vehicle weaponsTurret _turretPath); +} forEach _turrets; -[_turretMagsCSW, _allCarryMags] +_return diff --git a/addons/csw/functions/fnc_ai_handleFired.sqf b/addons/csw/functions/fnc_ai_handleFired.sqf index eb41ed3831..e6d76f13dc 100644 --- a/addons/csw/functions/fnc_ai_handleFired.sqf +++ b/addons/csw/functions/fnc_ai_handleFired.sqf @@ -1,92 +1,23 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror - * Initializes weapon to disable weapon disassembling + * Handles AI Fired EH * * Arguments: - * 0: Weapon + * Fired EH * * 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); +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 nearSupplies 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 -[_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); - -private _timeToLoad = 1; -if (!isNull(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime")) then { - _timeToLoad = getNumber(configOf _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; +[_staticWeapon, _gunner, _weapon, _magazine] call FUNC(ai_reload); diff --git a/addons/csw/functions/fnc_ai_handleGetIn.sqf b/addons/csw/functions/fnc_ai_handleGetIn.sqf new file mode 100644 index 0000000000..26a94b58e3 --- /dev/null +++ b/addons/csw/functions/fnc_ai_handleGetIn.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" +/* + * Author: Grim + * Handles AI GetIn on an empty weapon + * + * Arguments: + * GetIn EH + * + * Return Value: + * None + * + * Public: No + */ +params ["_staticWeapon", "_role", "_gunner"]; +TRACE_3("getInEH:",_staticWeapon,_role,_gunner); + +if ((!local _gunner) || {[_gunner] call EFUNC(common,isPlayer)}) exitWith {}; +if (someAmmo _staticWeapon) exitWith {}; + +TRACE_2("need ammo",someAmmo _staticWeapon,magazinesAllTurrets _staticWeapon); + +[_staticWeapon, _gunner, currentWeapon _staticWeapon] call FUNC(ai_reload); diff --git a/addons/csw/functions/fnc_ai_reload.sqf b/addons/csw/functions/fnc_ai_reload.sqf new file mode 100644 index 0000000000..31d41b0588 --- /dev/null +++ b/addons/csw/functions/fnc_ai_reload.sqf @@ -0,0 +1,95 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror, modified by Grim + * Handles AI reloading + * + * Arguments: + * 0: Static Weapon + * 1: Gunner + * 2: Weapon + * 3: Magazine (default: "") + * + * Return Value: + * None + * + * Public: No + */ +params ["_staticWeapon", "_gunner", "_weapon", ["_magazine", ""]]; + +private _turretPath = [_gunner] call EFUNC(common,getTurretIndex); +private _reloadSource = objNull; +private _reloadMag = ""; +private _reloadNeededAmmo = -1; + +private _cfgMagGroups = configFile >> QGVAR(groups); + +private _nearSupplies = [_gunner] + ((_staticWeapon nearSupplies 10) select { + isNull (group _x) || + {!([_x] call EFUNC(common,isPlayer)) && {[side group _gunner, side group _x] call BIS_fnc_sideIsFriendly}} +}); + +// Find if there is anything we can reload with +{ + scopeName "findSource"; + private _xSource = _x; + + private _cswMagazines = []; + { + _cswMagazines pushBackUnique _x; + } forEach ((magazineCargo _xSource) select {isClass (_cfgMagGroups >> _x)}); + TRACE_2("",_xSource,_cswMagazines); + + private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; + if (_magazine != "") then { + _compatibleMags insert [0, [_magazine]]; + }; + + { + private _xWeaponMag = _x; + { + if ((getNumber (_cfgMagGroups >> _x >> _xWeaponMag)) == 1) then { + private _loadInfo = [_staticWeapon, _turretPath, _x, _xSource] 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 _nearSupplies; +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 +[_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); + +private _timeToLoad = 1; +if (!isNull(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime")) then { + _timeToLoad = getNumber(configOf _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 index 0701d049b2..82412b5556 100644 --- a/addons/csw/functions/fnc_assemble_canDeployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Checks if the player can deploy the tripod. * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf index b0659e2f01..897ee6acd0 100644 --- a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Checks if you can deploy a weapon on the tripod * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf index a5cd0d5c0c..8a7656db83 100644 --- a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Checks if the player can pick-up the tripod. * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf index ef40e03b3c..9665311d9d 100644 --- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * If the CSW is mounted or in use this will not allow you to dismount the weapon * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf index d1392f5bac..b2ba0e4ea5 100644 --- a/addons/csw/functions/fnc_assemble_deployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Deploys the tripod * * Arguments: @@ -21,12 +21,14 @@ // Remove the tripod from the launcher slot private _secondaryWeaponClassname = secondaryWeapon _player; + // handle loaded launchers which can become csw like CUP Metis + private _secondaryWeaponMagazine = secondaryWeaponMagazine _player param [0, ""]; _player removeWeaponGlobal (secondaryWeapon _player); private _onFinish = { params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname"]; - TRACE_2("deployTripod finish",_player,_secondaryWeaponClassname); + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; + TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy"); @@ -34,6 +36,9 @@ 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 (_secondaryWeaponMagazine isNotEqualTo "") then { + _cswTripod setVariable [QGVAR(secondaryWeaponMagazine), _secondaryWeaponMagazine]; + }; 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; @@ -61,12 +66,15 @@ private _onFailure = { params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname"]; - TRACE_2("deployTripod failure",_player,_secondaryWeaponClassname); + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; + TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); _player addWeaponGlobal _secondaryWeaponClassname; + if (_secondaryWeaponMagazine isNotEqualTo "") then { + _player addWeaponItem [_secondaryWeaponClassname, _secondaryWeaponMagazine, true]; + }; }; private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); - [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); + [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponMagazine], _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 index 12091b81ba..f646047da2 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Deploys the current CSW * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf b/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf index b1b89d8f09..85b1346415 100644 --- a/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Modifies interaction for deploying weapon diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf index 4f06b6e406..449a445dc2 100644 --- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Picks up the tripod and adds it to the player launcher slot * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index 4763f646ad..99d0229566 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Dismounts the weapon from the tripod and drops its backpack beside * * Arguments: @@ -37,16 +37,18 @@ _weaponPos set [2, (_weaponPos select 2) + 0.1]; private _weaponDir = getDir _staticWeapon; + private _carryWeaponMag = ""; + private _carryWeaponMags = getArray (configFile >> "CfgWeapons" >> _carryWeaponClassname >> "magazines") apply {toLower _x}; LOG("remove ammo"); { _x params ["_xMag", "", "_xAmmo"]; + if (_xAmmo == 0) then {continue}; - 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); + private _carryMag = _xMag call FUNC(getCarryMagazine); + if (_carryWeaponMag isEqualTo "" && {toLower _carryMag in _carryWeaponMags}) then { + TRACE_3("Adding mag to secondary weapon",_xMag,_xAmmo,_carryMag); + _carryWeaponMag = _carryMag; + DEC(_xAmmo); }; if ((_xAmmo > 0) && {_carryMag != ""}) then { TRACE_2("Removing ammo",_xMag,_carryMag); @@ -68,16 +70,23 @@ }; [{ - params ["_player", "_weaponPos", "_carryWeaponClassname"]; + params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag"]; if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { _player addWeapon _carryWeaponClassname; + if (_carryWeaponMag isNotEqualTo "") then { + _player addWeaponItem [_carryWeaponClassname, _carryWeaponMag, true]; + }; }; 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; + if (_carryWeaponMag isEqualTo "") then { + _weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1]; + } else { + _weaponHolder addWeaponWithAttachmentsCargoGlobal [[_carryWeaponClassname, "", "", "", [_carryWeaponMag, 1], [], ""], 1]; + }; + }, [_player, _weaponPos, _carryWeaponClassname, _carryWeaponMag]] call CBA_fnc_execNextFrame; LOG("delete weapon"); deleteVehicle _staticWeapon; @@ -93,4 +102,3 @@ [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 index 92b05b1c2c..16ffe29a77 100644 --- a/addons/csw/functions/fnc_canGetIn.sqf +++ b/addons/csw/functions/fnc_canGetIn.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Checks if the player can get in the weapon * * Arguments: diff --git a/addons/csw/functions/fnc_getCarryMagazine.sqf b/addons/csw/functions/fnc_getCarryMagazine.sqf new file mode 100644 index 0000000000..81e07c6f10 --- /dev/null +++ b/addons/csw/functions/fnc_getCarryMagazine.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror, Dystopian + * Gets magazine that the player can carry, suitable to vehicle magazine + * + * Arguments: + * 0: Vehicle Magazine + * + * Return Value: + * Carry Magazine + * + * Example: + * "1Rnd_GAT_missiles" call ace_csw_fnc_getCarryMagazine + * + * Public: No + */ + +params ["_vehicleMag"]; + +private _carryMag = GVAR(vehicleMagCache) get _vehicleMag; +if (isNil "_carryMag") then { + private _groups = "getNumber (_x >> _vehicleMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + _carryMag = configName (_groups param [0, configNull]); + GVAR(vehicleMagCache) set [_vehicleMag, _carryMag]; + TRACE_2("setting cache",_vehicleMag,_carryMag); +}; + +_carryMag diff --git a/addons/csw/functions/fnc_getIn.sqf b/addons/csw/functions/fnc_getIn.sqf index 338d17e03e..61ca962d06 100644 --- a/addons/csw/functions/fnc_getIn.sqf +++ b/addons/csw/functions/fnc_getIn.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * 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. diff --git a/addons/csw/functions/fnc_proxyWeapon.sqf b/addons/csw/functions/fnc_proxyWeapon.sqf index 3e47fddadd..40ab4b1e4c 100644 --- a/addons/csw/functions/fnc_proxyWeapon.sqf +++ b/addons/csw/functions/fnc_proxyWeapon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM), PabstMirror + * Author: tcvm, PabstMirror * Handles the use of proxy weapons to fix engine-reload times * * Arguments: @@ -23,10 +23,9 @@ 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"); +private _proxyWeapon = getText (configOf _staticWeapon >> "ace_csw" >> "proxyWeapon"); -TRACE_2("",_typeOf,_proxyWeapon); +TRACE_2("",typeOf _staticWeapon,_proxyWeapon); if (_proxyWeapon == "") exitWith {}; private _currentWeapon = (_staticWeapon weaponsTurret [0]) param [0, "#none"]; @@ -38,6 +37,9 @@ if ((missionNamespace getVariable [_proxyWeapon, objNull]) isEqualType {}) then }; if (!_needed) exitWith { TRACE_2("not needed",_needed,_proxyWeapon); }; +// Rearm compatibility, prevent reloading entire static and breaking CSW +_staticWeapon setVariable [QEGVAR(rearm,scriptedLoadout), true, true]; + TRACE_2("swapping to proxy weapon",_currentWeapon,_proxyWeapon); _staticWeapon removeWeaponTurret [_currentWeapon, _turret]; _staticWeapon addWeaponTurret [_proxyWeapon, _turret]; diff --git a/addons/csw/functions/fnc_reload_actionsLoad.sqf b/addons/csw/functions/fnc_reload_actionsLoad.sqf index c5e7a3b574..557811d440 100644 --- a/addons/csw/functions/fnc_reload_actionsLoad.sqf +++ b/addons/csw/functions/fnc_reload_actionsLoad.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets sub actions for what the player can load into the static weapon @@ -23,24 +23,26 @@ private _loadableMagazines = [_vehicle, _player] call FUNC(reload_getLoadableMag private _statement = { params ["_target", "_player", "_params"]; - _params params ["_carryMag", "_turretPath"]; + _params params ["_carryMag", "_turretPath", "", "_magSource"]; - [_target, _turretPath, _carryMag, _player] call FUNC(reload_loadMagazine); + [_target, _turretPath, _carryMag, _magSource, _player] call FUNC(reload_loadMagazine); }; private _condition = { params ["_target", "_player", "_params"]; - _params params ["_carryMag", "_turretPath"]; + _params params ["_carryMag", "_turretPath", "", "_magSource"]; - ([_target, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine)) select 0 + ([_target, _turretPath, _carryMag, _magSource] call FUNC(reload_canLoadMagazine)) select 0 }; +private _cfgMagazines = configFile >> "CfgMagazines"; // micro-optimization + { - _x params ["_carryMag", "_turretPath", "_loadInfo"]; + _x params ["_carryMag", "", "_loadInfo"]; _loadInfo params ["", "", "", "_isBeltLinking"]; - private _displayName = getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName"); - private _picture = getText (configFile >> "CfgMagazines" >> _carryMag >> "picture"); + private _displayName = getText (_cfgMagazines >> _carryMag >> "displayName"); + private _picture = getText (_cfgMagazines >> _carryMag >> "picture"); private _text = if (_isBeltLinking) then { format [localize LSTRING(actionLink), _displayName]; } else { @@ -53,4 +55,3 @@ private _condition = { TRACE_1("loadActions",count _actions); _actions - diff --git a/addons/csw/functions/fnc_reload_actionsUnload.sqf b/addons/csw/functions/fnc_reload_actionsUnload.sqf index 24e60b1a38..5ef40ace70 100644 --- a/addons/csw/functions/fnc_reload_actionsUnload.sqf +++ b/addons/csw/functions/fnc_reload_actionsUnload.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror - * Gets sub actions for what the player can load into the static weapon + * Gets sub actions for what the player can unload from the static weapon * * Arguments: * 0: Target @@ -52,25 +52,20 @@ private _condition = { private _actions = []; private _handeledMagTypes = []; +private _cfgMagazines = configFile >> "CfgMagazines"; + // 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); - }; + private _carryMag = _xMag call FUNC(getCarryMagazine); if (_carryMag == "") exitWith {}; - private _displayName = getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName"); + private _displayName = getText (_cfgMagazines >> _carryMag >> "displayName"); private _text = format [LLSTRING(unloadX), _displayName]; - private _picture = getText (configFile >> "CfgMagazines" >> _carryMag >> "picture"); + private _picture = getText (_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]; }; @@ -78,4 +73,3 @@ private _handeledMagTypes = []; TRACE_1("unloadActions",count _actions); _actions - diff --git a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf index 69f8e6c93a..70c673299a 100644 --- a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: PabstMirror & TCVM + * 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 + * 3: Supplier * * Return Value: * [CanLoad, LoadedMag, AmmoNeeded, IsBeltLinking] @@ -18,17 +18,31 @@ * Public: No */ -params ["_vehicle", "_turret", "_carryMag", ["_unit", objNull]]; -// TRACE_4("reload_canLoadMagazine",_vehicle,_turret,_carryMag,_unit); +params ["_vehicle", "_turret", "_carryMag", ["_magSource", objNull]]; +// TRACE_4("reload_canLoadMagazine",_vehicle,_turret,_carryMag,_magSource); + +private _return = [false, "", -2, false]; // 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] }; +if (!alive _vehicle) exitWith { _return }; +// Verify holder has carry magazine +if ( + (!isNull _magSource) && + {!((_magSource isKindOf "Bag_Base") || {_magSource isKindOf "ContainerSupply"})} && // hacky workaround for magazines within dropped backpacks + { + ((_vehicle distance _magSource) > 10) || + {((magazineCargo _magSource) findIf {_x == _carryMag}) == -1} + } +) exitWith { _return }; + +// solve config lookups +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgMagazinesCarryMag = _cfgMagazines >> _carryMag; +private _cfgGroupsCarryMag = configFile >> QGVAR(groups) >> _carryMag; private _desiredAmmo = getNumber (configOf _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 _ammoNeeded = _desiredAmmo min getNumber (_cfgMagazinesCarryMag >> "count"); // assume it needs full carry mag private _loadedMag = ""; private _isBeltLinking = false; @@ -40,13 +54,13 @@ scopeName "main"; _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 { + if (getNumber (_cfgGroupsCarryMag >> _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 { + if (getNumber (_cfgMagazinesCarryMag >> "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"); + private _maxMagazineAmmo = _desiredAmmo min getNumber (_cfgMagazines >> _xMag >> "count"); if (_xAmmo >= _maxMagazineAmmo) exitWith { [false, _loadedMag, -6, false] breakOut "main"; // Already at capicity }; diff --git a/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf b/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf index 2ce6b6e591..4e03625a29 100644 --- a/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Tests if unit can unload a magazine from a static weapon. diff --git a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf index 8e6f3ce500..933625fb89 100644 --- a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf +++ b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets magazines that the player is carrying that can be loaded into the static weapon @@ -9,7 +9,7 @@ * * Return Value: * Mags - * [Carry Magazine , Turret Path , Ammo Needed ] + * [Carry Magazine , Turret Path , Load Info , Magazine Source ] * * Example: * [cursorObject, player] call ace_csw_fnc_reload_getLoadableMagazines @@ -19,15 +19,37 @@ params ["_vehicle", "_player"]; -private _carriedMagazines = []; +private _magGroupsConfig = configFile >> QGVAR(groups); // so we don't solve in loop every time +private _availableMagazines = createHashMap; // slower than array, still needed for setting source of magazine + +// filter enemy & player units while allowing pulling from friendly AI, crates, etc +private _nearSupplies = ((_vehicle nearSupplies 10) select { + isNull (group _x) || + {!([_x] call EFUNC(common,isPlayer)) && {[side group _player, side group _x] call BIS_fnc_sideIsFriendly}} +}); + +// backpacks/uniforms/etc need to be added manually. +// array can't be modified while iterating, use copy +{ + { + _x params ["_classname", "_container"]; + _nearSupplies pushBack _container; + } forEach (everyContainer _x); +} forEach ((+_nearSupplies) select {(everyContainer _x) isNotEqualTo []}); + +// add caller to list of sources +_nearSupplies = [_player] + _nearSupplies; { - if (isClass (configFile >> QGVAR(groups) >> _x)) then { - _carriedMagazines pushBackUnique _x; - }; -} forEach (magazines _player); + private _xSource = _x; + private _mags = magazineCargo _xSource; -if (_carriedMagazines isEqualTo []) exitWith { [] }; // fast exit if no carry mags + { + _availableMagazines set [_x, _xSource]; + } forEach (_mags select {isClass (_magGroupsConfig >> _x)}); +} forEach _nearSupplies; + +if (_availableMagazines isEqualTo createHashMap) exitWith { [] }; // fast exit if no available mags private _loadInfo = []; private _return = []; @@ -37,14 +59,19 @@ private _return = []; { private _weapon = _x; { + //IGNORE_PRIVATE_WARNING ["_x", "_y"]; private _carryMag = _x; - private _carryGroup = configFile >> QGVAR(groups) >> _carryMag; + private _magSource = _y; + private _carryGroup = _magGroupsConfig >> _carryMag; { - if (((getNumber (_carryGroup >> _x)) == 1) && {_loadInfo = [_vehicle, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine); _loadInfo select 0}) exitWith { - _return pushBack [_carryMag, _turretPath, _loadInfo]; + if ( + ((getNumber (_carryGroup >> _x)) == 1) && + {_loadInfo = [_vehicle, _turretPath, _carryMag, _magSource] call FUNC(reload_canLoadMagazine); _loadInfo select 0} + ) exitWith { + _return pushBack [_carryMag, _turretPath, _loadInfo, _magSource]; }; } forEach ([_weapon] call CBA_fnc_compatibleMagazines); - } forEach _carriedMagazines; + } forEach _availableMagazines; } forEach (_vehicle weaponsTurret _turretPath); } forEach (allTurrets _vehicle); // Note: these nested forEach's looks terrible, but most only have one element diff --git a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf index 2b28535f0a..6b5b77efee 100644 --- a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf +++ b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf @@ -1,11 +1,12 @@ -#include "script_component.hpp" +#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 + * 0: Vehicle + * 1: Turret + * 2: Magazine that is carryable * * Return Value: * Vehicle Magazine diff --git a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf index 841192864a..9a2eae2bd4 100644 --- a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf @@ -1,15 +1,16 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM, PabstMirror + * 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 + * 2: Source of magazine * 3: Vehicle Magazine * 4: Ammo in magazine + * 5: Unit or object to return ammo to * * Return Value: * None @@ -20,8 +21,8 @@ * Public: No */ -params ["_vehicle", "_turret", "_unit", "_carryMag" ,"_ammoRecieved"]; -TRACE_5("reload_handleAddTurretMag",_vehicle,_turret,_unit,_carryMag,_ammoRecieved); +params ["_vehicle", "_turret", "_magSource", "_carryMag", "_ammoReceived", ["_returnTo", _magSource]]; +TRACE_6("reload_handleAddTurretMag",_vehicle,_turret,_magSource,_carryMag,_ammoReceived,_returnTo); TRACE_2("",local _vehicle, _vehicle turretLocal _turret); if (!(_vehicle turretLocal _turret)) exitWith {}; @@ -29,9 +30,9 @@ 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; +private _ammoRemaining = _ammoReceived; if (_canAdd) then { - private _ammoUsed = _neededAmmo min _ammoRecieved; + private _ammoUsed = _neededAmmo min _ammoReceived; _ammoRemaining = _ammoRemaining - _ammoUsed; if (_isBeltLinking) then { @@ -46,7 +47,6 @@ if (_canAdd) then { _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); @@ -60,7 +60,6 @@ if (_canAdd) then { }; if (_ammoRemaining > 0) then { - TRACE_3("Returning ammo",_unit,_carryMag,_ammoRemaining); - [QGVAR(returnAmmo), [_unit, _carryMag, _ammoRemaining], _unit] call CBA_fnc_targetEvent; + TRACE_3("Returning ammo",_returnTo,_carryMag,_ammoRemaining); + [QGVAR(returnAmmo), [_returnTo, _carryMag, _ammoRemaining], _returnTo] call CBA_fnc_targetEvent; }; - diff --git a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf index 313e65dc9b..d53d35a0d8 100644 --- a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM + * Author:tcvm * Handles removing ammo from a turret * Called from a global event but only runs where turret is local * @@ -9,7 +9,7 @@ * 1: Turret Path * 2: Magainze Unit Can Carry * 3: Magazine To Remove From Static - * 4: Unit to unload to + * 4: Unit or container to unload to * * Return Value: * None @@ -20,10 +20,10 @@ * Public: No */ -params ["_vehicle", "_turretPath", "_carryMag", "_vehMag", "_unit"]; -TRACE_5("removeTurretMag EH",_vehicle,_turretPath,_carryMag,_vehMag,_unit); +params ["_vehicle", "_turretPath", "_carryMag", "_vehMag", "_unloadTo"]; +TRACE_5("removeTurretMag EH",_vehicle,_turretPath,_carryMag,_vehMag,_unloadTo); -TRACE_3("",local _vehicle, _vehicle turretLocal _turretPath,local _unit); +TRACE_3("",local _vehicle, _vehicle turretLocal _turretPath,local _unloadTo); if (!(_vehicle turretLocal _turretPath)) exitWith {}; private _magsInWeapon = []; // Check how much ammo it has now: @@ -75,5 +75,5 @@ if ((_magsInWeapon isEqualTo []) && {_ammoInFirstMag > _ammoRemoved}) then { } forEach _magsInWeapon; }; -TRACE_3("Returning ammo",_unit,_carryMag,_ammoRemoved); -[QGVAR(returnAmmo), [_unit, _carryMag, _ammoRemoved], _unit] call CBA_fnc_targetEvent; +TRACE_3("Returning ammo",_unloadTo,_carryMag,_ammoRemoved); +[QGVAR(returnAmmo), [_unloadTo, _carryMag, _ammoRemoved], _unloadTo] call CBA_fnc_targetEvent; diff --git a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf index 464a7fc65d..da8383b608 100644 --- a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf +++ b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: TCVM and PabstMirror + * Author: tcvm and PabstMirror * Handles returned ammo (either from unloading or leftovers from linking) * * Arguments: @@ -39,18 +39,17 @@ 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 ((_container distance _unloadTo) > 10) then { _container = objNull; }; if (isNull _container) then { - _container = (nearestObjects [_unloadTo, ["groundWeaponHolder"], 4]) param [0, objNull]; + _container = (nearestObjects [_unloadTo, [QGVAR(ammo_holder), "GroundWeaponHolder"], 10]) param [0, objNull]; }; if (isNull _container) then { - // Create ground weapon holder container + // Create ammo storage 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?? + _container = createVehicle [["GroundWeaponHolder", QGVAR(ammo_holder)] select GVAR(handleExtraMagazinesType), [0, 0, 0], [], 0, "NONE"]; _unloadTo setVariable [QGVAR(container), _container, true]; _container setDir random [0, 180, 360]; _container setPosATL _weaponRelPos; diff --git a/addons/csw/functions/fnc_reload_loadMagazine.sqf b/addons/csw/functions/fnc_reload_loadMagazine.sqf index 2b34d38a24..42508daf1d 100644 --- a/addons/csw/functions/fnc_reload_loadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_loadMagazine.sqf @@ -1,25 +1,26 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror - * Loads a magazine into a static weapon from a magazine carried by the player. + * Loads a magazine into a static weapon from a magazine carried by or next to the player. * * Arguments: * 0: Vehicle * 1: Turret * 2: Unit Carried Magazine - * 3: Player + * 3: Magazine source + * 4: Unit doing the action * * Return Value: * None * * Example: - * [cursorTarget, [0], "ACE_csw_100Rnd_127x99_mag_red", player] call ace_csw_fnc_reload_loadMagazine + * [cursorTarget, [0], "ACE_csw_100Rnd_127x99_mag_red", player, player] call ace_csw_fnc_reload_loadMagazine * * Public: No */ -params ["_vehicle", "_turret", "_carryMag", "_unit"]; -TRACE_4("loadMagazine",_vehicle,_turret,_carryMag,_unit); +params ["_vehicle", "_turret", "_carryMag", "_magSource", "_unit"]; +TRACE_5("loadMagazine",_vehicle,_turret,_carryMag,_magSource,_unit); private _timeToLoad = 1; if (!isNull(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime")) then { @@ -29,10 +30,10 @@ if (!isNull(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime")) then { 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); + (_this select 0) params ["_vehicle", "_turret", "_carryMag", "_magSource", "_unit"]; + TRACE_5("load progressBar finish",_vehicle,_turret,_carryMag,_magSource,_unit); - ([_vehicle, _turret, _carryMag, _unit] call FUNC(reload_canLoadMagazine)) params ["", "", "_neededAmmo", ""]; + ([_vehicle, _turret, _carryMag, _magSource] 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 @@ -44,23 +45,23 @@ private _onFinish = { _bestAmmoToSend = _xAmmo; }; }; - } forEach (magazinesAmmo _unit); + } forEach (if (_magSource isKindOf "CAManBase") then {magazinesAmmo _magSource} else {magazinesAmmoCargo _magSource}); if (_bestAmmoToSend == -1) exitWith {ERROR_2("No ammo [%1 - %2]?",_xMag,_bestAmmoToSend);}; - [_unit, _carryMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); + [_magSource, _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; + TRACE_6("calling addTurretMag event",_vehicle,_turret,_magSource,_carryMag,_bestAmmoToSend, _unit); + [QGVAR(addTurretMag), [_vehicle, _turret, _magSource, _carryMag, _bestAmmoToSend, _unit]] 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"] + TIME_PROGRESSBAR(_timeToLoad), + [_vehicle, _turret, _carryMag, _magSource], + _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 index 4ce86f3c49..3b1d7ef66e 100644 --- a/addons/csw/functions/fnc_staticWeaponInit.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Initializes weapon to disable weapon disassembling * * Arguments: @@ -17,13 +17,15 @@ 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")) != ""}; +private _configOf = configOf _staticWeapon; +private _configEnabled = (getNumber (_configOf >> "ace_csw" >> "enabled")) == 1; +private _assemblyConfig = _configEnabled && {(getText (_configOf >> "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)]; + _staticWeapon addEventHandler ["GetIn", LINKFUNC(ai_handleGetIn)]; // handle AI getting inside weapon with no ammo }; TRACE_2("",local _staticWeapon,_staticWeapon turretLocal [0]); @@ -65,7 +67,7 @@ if (hasInterface && {!(_typeOf in GVAR(initializedStaticTypes))}) then { private _ammoActionPath = []; - private _magazineLocation = getText (configFile >> "CfgVehicles" >> _typeOf >> QUOTE(ADDON) >> "magazineLocation"); + private _magazineLocation = getText (_configOf >> 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 }; diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf index e1cba376f4..23155ead0b 100644 --- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM), PabstMirror + * Author: tcvm, PabstMirror * Dumps ammo to container * * Arguments: @@ -36,13 +36,7 @@ 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); - }; + private _carryMag = _xMag call FUNC(getCarryMagazine); if (_carryMag != "") then { if ((_desiredAmmo > 0) && {_loadedMagazineInfo isEqualTo []}) then { private _loadedMagAmmo = _desiredAmmo min _xAmmo; @@ -74,6 +68,15 @@ TRACE_1("Remove all loaded magazines",_magsToRemove); }; } forEach _magsToRemove; +if (_staticWeapon getVariable [QGVAR(secondaryWeaponMagazine), ""] isNotEqualTo "") then { + private _secondaryWeaponMagazine = _staticWeapon getVariable QGVAR(secondaryWeaponMagazine); + private _turret = allTurrets _staticWeapon param [0, []]; + private _vehicleMag = [_staticWeapon, _turret, _secondaryWeaponMagazine] call FUNC(reload_getVehicleMagazine); + TRACE_3("Re-add previous mag",_secondaryWeaponMagazine,_turret,_vehicleMag); + if (!isClass (configFile >> "CfgMagazines" >> _vehicleMag)) exitWith {}; + _staticWeapon addMagazineTurret [_vehicleMag, _turret, 1]; + _staticWeapon setVariable [QGVAR(secondaryWeaponMagazine), nil]; +}; if (_storeExtraMagazines) then { TRACE_1("saving extra mags to container",_containerMagazineCount); diff --git a/addons/csw/functions/script_component.hpp b/addons/csw/functions/script_component.hpp deleted file mode 100644 index 7e8eaa8954..0000000000 --- a/addons/csw/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\csw\script_component.hpp" diff --git a/addons/csw/initSettings.sqf b/addons/csw/initSettings.sqf index 10030b68da..de3976896b 100644 --- a/addons/csw/initSettings.sqf +++ b/addons/csw/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_csw]: - private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; [ @@ -22,6 +20,16 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; true // Needs mission restart ] call CBA_fnc_addSetting; +[ + QGVAR(handleExtraMagazinesType), "LIST", + [LSTRING(handleExtraMagazinesType_displayName), LSTRING(handleExtraMagazinesType_description)], + _categoryArray, + [[0, 1], [LSTRING(handleExtraMagazinesType_weaponHolder), LSTRING(handleExtraMagazinesType_ammoBox)], 0], + true, // isGlobal + {[QGVAR(handleExtraMagazinesType), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_fnc_addSetting; + [ QGVAR(ammoHandling), "LIST", [LSTRING(ammoHandling_displayName), LSTRING(ammoHandling_description)], diff --git a/addons/csw/stringtable.xml b/addons/csw/stringtable.xml index 8df7684b82..2782bad850 100644 --- a/addons/csw/stringtable.xml +++ b/addons/csw/stringtable.xml @@ -8,11 +8,13 @@ Armes statiques 共用火器 (CSW) 班組支援武器 + 班组支援武器 Armi servite dall'equipaggio Posádkou obsluhované zbraně (CSW) Broń ciężka (CSW) Armas provistas por la tripulación Групповое вооружение (CSW) + 공용화기(CSW) Place Tripod @@ -21,12 +23,14 @@ Placer le trépied 三脚を設置 設置三腳架 + 安放三脚架 Piazza treppiede Položit trojnožku Rozłóż Trójnóg Colocar trípode Üçayağı Yerleştir Разложить треногу + 삼각대 설치하기 Disassemble @@ -40,7 +44,9 @@ Desmonta 解体 拆解 + 拆解 Sök + 분해하기 Get In @@ -54,7 +60,9 @@ Entrar 乗る 進入 + 进入 Bin + 탑승하기 Load %1 @@ -69,7 +77,9 @@ Carregar %1 %1 を装填 裝填 %1 + 装填 %1 Yükle %1 + %1 싣는중 Unload %1 @@ -84,7 +94,9 @@ Descarregar %1 %1 を除去 卸載 %1 + 卸载 %1 Boşalt %1 + %1 내리는중 Link %1 @@ -93,50 +105,58 @@ Connecter %1 %1 を接続 聯結至 %1 + 连接 %1 Collega %1 Spojit %1 Połącz %1 Conectar %1 Соединить %1 + %1 연결 - Advanced assembly + 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. + 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來組裝/拆解固定型武器。上膛的限制為單個彈匣。 + 使用 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 для сборки/разборки поддерживаемого статического оружия. Заряженные боеприпасы будут сокращены в единственный магазин. + ACE의 조립/분해 기능을 사용하여 공용화기를 다룹니다. 장전된 탄은 한 탄창으로 제한됩니다. - Save extra ammo + 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 @@ -145,11 +165,53 @@ 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 Storage + Munitionslager + 탄약 보관 + Magazyn amunicji + 弾薬の格納 + 弹药存储 + Хранилище боеприпасов + Almacenamiento de munición + + + Determines whether extra magazines are stored on the ground or inside an ammo box + Legt fest, ob zusätzliche Magazine auf dem Boden oder in einer Munitionskiste aufbewahrt werden + 여분의 탄약을 지면 또는 탄약 상자에 넣을지 결정합니다. + Decyduje, czy dodatkowe magazynki przechowywane są na ziemi, czy w skrzynce z amunicją. + 追加のマガジンを地面に設置するか、弾薬箱の中に保管するかを決定します + 设置多余的弹夹是存放在地面上还是弹药箱内 + Определяет будут ли дополнительные магазины лежать на земле или внутри хранилища + Determina si los cargadores extra son almacenados en el suelo o en una caja de munición + + + Ground + Boden + 지면 + Ziemia + 地面 + 地面 + Земля + Suelo + + + Ammo Box + Munitionskiste + 탄약 상자 + Skrzynka amunicyjna + 弾薬箱 + 弹药箱 + Коробка с боеприпасами + Caja de munición Ammo handling @@ -158,11 +220,13 @@ Manipulation des munitions 弾薬の処理 彈藥處理 + 弹药处置 Gestione delle munizioni Manipulace s municí Obsługa amunicji Manejo de munición Обслуживание боеприпасов + 탄약 취급 Allow loading and unloading magazines @@ -171,11 +235,13 @@ 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 @@ -184,11 +250,13 @@ 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 @@ -197,24 +265,28 @@ 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 + 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 @@ -223,11 +295,13 @@ 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 @@ -236,11 +310,13 @@ Récupérer le trépied 三脚を拾う 撿起三腳架 + 捡起三脚架 Recupero treppiede Složit trojnožku Podnieś Trójnóg Recoger trípode Подобрать треногу + 삼각대 줍기 Mount Weapon @@ -249,11 +325,13 @@ Monter l'arme 火器を乗せる 裝載武器 + 装载武器 Montare l'arma Připevnit zbraň Zamontuj Broń Montar arma Установить оружие + 무기 거치하기 Disassembling Gun... @@ -262,11 +340,13 @@ Désassemblage de l'arme... 火器を解体中です・・・ 拆裝武器中... + 正在拆卸武器... Smontaggio arma... Rozkládám zbraň... Rozkładanie Broni... Desensamblando arma... Разборка оружия... + 공용화기 분해 중... Assembling Gun... @@ -275,11 +355,13 @@ Assemblage de l'arme... 火器を設置中です・・・ 組裝武器中... + 正在组装武器... Montaggio arma... Skládám zbraň... Składanie Broni... Ensamblando arma... Сборка оружия... + 공용화기 조립 중... Picking Up Tripod... @@ -288,11 +370,13 @@ Récupération du trépied... 三脚を取得中です・・・ 撿起三腳架... + 捡起三脚架... Recupero treppiede... Zvedám trojnožku... Podnoszenie Trójnogu... Recogiendo trípode... Поднятие треноги... + 삼각대 줍는 중... Placing Tripod... @@ -301,11 +385,13 @@ Installation du trépied... 三脚を設置中です・・・ 部署三腳架... + 部署三脚架... Piazzare treppiede... Pokládám trojnožku... Rozmieszczanie Trójnogu... Ubicando trípode... Размещение треноги... + 삼각대 설치 중... Enable CSW @@ -314,11 +400,13 @@ 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 @@ -327,11 +415,13 @@ 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 @@ -340,11 +430,13 @@ 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 @@ -357,8 +449,10 @@ Tripé 三脚 三腳架 + 三脚架 Trojnožka Тренога + 삼각대 [CSW] Static Mini-Spike Launcher (AT) @@ -368,11 +462,13 @@ [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] Станковый Mini-Spike (ПТРК) + [CSW] 거치형 Mini-Spike 발사기 (대전차) [CSW] Static Mini-Spike Launcher (AA) @@ -382,11 +478,13 @@ [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] Станковый Mini-Spike (ЗРК) + [CSW] 거치형 Mini-Spike 발사기 (대공) [CSW] Static XM312 Gun @@ -396,11 +494,13 @@ [CSW] Mitrailleuse statique XM312 [CSW] 設置型 XM312 [CSW] 固定型 XM312重機槍 + [班组] 固定式 XM312 重机枪 [CSW] Static XM312 Gun [CSW] Statická zbraň XM312 [CSW] Static XM312 Gun [CSW] Statyczny karabin maszynowy XM312 [CSW] Станковый XM312 пулемёт + [CSW] 거치형 XM312 [CSW] Static M2 w/ Shield @@ -410,6 +510,9 @@ [CSW] Statyczny karabin maszynowy M2 z tarczą [CSW] Станковый M2 со щитом [CSW] 設置型 防盾付き M2 + [CSW] Statisches M2 mit Schild + [班组] 固定式防盾型 M2 重机枪 + [CSW] 거치형 M2 (방패) [CSW] Static XM312 Gun (Autonomous) @@ -419,11 +522,13 @@ [CSW] Mitrailleuse statique XM312 (Autonome) [CSW] 設置型 XM312 (自律型) [CSW] 固定型 XM312重機槍(自主型) + [班组] 固定式 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] 거치형 XM312 (자동화) [CSW] Static XM307 Gun @@ -433,11 +538,13 @@ [CSW] Lance-grenades statique XM307 [CSW] 設置型 XM307 [CSW] 固定型XM307榴彈機槍 + [班组] 固定式 XM307 榴弹发射器 [CSW] Static XM307 Gun [CSW] Statická zbraň XM307 [CSW] Static XM307 Gun [CSW] Statyczny granatnik automatyczny XM307 [CSW] Станковый XM307 гранатомёт + [CSW] 거치형 XM307 [CSW] Static XM307 Gun (Autonomous) @@ -447,11 +554,13 @@ [CSW] Lance-grenades statique XM307 (Autonome) [CSW] 設置型 XM307 (自律型) [CSW] 固定型 XM307榴彈機槍(自主型) + [班组] 固定式 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] 거치형 XM307 (자동화) [CSW] 12.7x108mm HMG Belt @@ -461,11 +570,13 @@ [CSW] Bande 12,7x108 mm HMG [CSW] 12.7x108 mm HMG ベルト [CSW]12.7x108毫米 重機槍彈鏈 + [班组] 12.7x108 mm 重机枪弹链 [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.7x108mm 중기관총 탄띠 [CSW] 12.7x99mm HMG Belt @@ -475,11 +586,13 @@ [CSW] Bande 12,7x99 mm HMG [CSW] 12.7x99 mm HMG ベルト [CSW]12.7x99毫米 重機槍彈鏈 + [班组] 12.7x99 mm 重机枪弹链 [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 중기관총 탄띠 [CSW] 12.7x99mm Tracer HMG Belt (Red) @@ -489,11 +602,13 @@ [CSW] Bande 12,7x99 mm HMG traçantes (Rouges) [CSW] 12.7x99 mm HMG 曳光弾ベルト (赤) [CSW] 12.7x99毫米 重機槍曳光彈鏈(紅色) + [班组] 12.7x99 mm 重机枪弹链(曳光,红) [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.7x99 мм трасс. пулемётная лента (красные) + [CSW] 12.7x99mm 예광탄 중기관총 탄띠 (빨강) [CSW] 12.7x99mm Tracer HMG Belt (Green) @@ -503,11 +618,13 @@ [CSW] Bande 12,7x99 mm HMG traçantes (Vertes) [CSW] 12.7x99 mm HMG 曳光弾ベルト (緑) [CSW] 12.7x99毫米 重機槍曳光彈鏈(綠色) + [班组] 12.7x99 mm 重机枪弹链(曳光,绿) [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.7x99 мм трасс. пулемётная лента (зелёные) + [CSW] 12.7x99mm 예광탄 중기관총 탄띠 (초록) [CSW] 12.7x99mm Tracer HMG Belt (Yellow) @@ -517,11 +634,13 @@ [CSW] Bande 12,7x99 mm HMG traçantes (Jaunes) [CSW] 12.7x99 mm HMG 曳光弾ベルト (黄) [CSW] 12.7x99毫米 重機槍曳光彈鏈(黃色) + [班组] 12.7x99 mm 重机枪弹链(曳光,黄) [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] 12.7x99 мм трасс. пулемётная лента (жёлтые) + [CSW] 12.7x99mm 예광탄 중기관총 탄띠 (노랑) [CSW] 20mm Grenade GMG Belt @@ -531,25 +650,29 @@ [CSW] Bande grenades 20 mm GMG [CSW] 20 mm てき弾 GMG ベルト [CSW]20毫米 榴彈 榴彈機槍彈鏈 + [班组] 20 mm 榴弹发射器弹链 [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-мм гранат для ст. гранатомёта + [CSW] 20mm 고속유탄발사기 탄띠 M3 Tripod Trípode M3 M3 Dreibein - M3 Tripé + Tripé M3 Trépied M3 M3 三脚 M3 三腳架 + M3 三脚架 M3 Tripod M3 trojnožka M3 Tripod Trójnóg M3 Станок M3 + M3 삼각대 [CSW] 6P57 Deployable Tripod @@ -559,11 +682,13 @@ [CSW] 6P57 Trépied déployable [CSW] 6P57 設置型三脚 [CSW] 6P57 部署型三腳架 + [班组] 6P57 部署型三脚架 [CSW] 6P57 Deployable Tripod [CSW] 6P57 trojnožka [CSW] 6P57 Deployable Tripod [CSW] Trójnóg Rozkładany 6P57 [CSW] 6P67 Развертываемая тренога + [CSW] 6P57 배치형 삼각대 [CSW] 6P57 Deployable Tripod (Low) @@ -573,11 +698,13 @@ [CSW] 6P57 Trépied déployable (Bas) [CSW] 6P57 設置型三脚 (低座) [CSW] 6P57 部署型(低位) + [班组] 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] 6P67 Развертываемая тренога (низкая) + [CSW] 6P57 배치형 삼각대 (낮음) [CSW] M220 Deployable Tripod @@ -587,11 +714,13 @@ [CSW] M220 Trépied déployable [CSW] M220 設置型三脚 [CSW] M220 部署型三腳架 + [班组] M220 部署型三脚架 [CSW] M220 Deployable Tripod [CSW] M220 trojnožka [CSW] M220 Deployable Tripod [CSW] Trójnóg Rozkładany M220 [CSW] M220 Развертываемая тренога + [CSW] M220 배치형 삼각대 [CSW] SAG-30 Deployable Tripod @@ -601,11 +730,13 @@ [CSW] SAG-30 Trépied déployable [CSW] SAG-30 設置型三脚 [CSW] SAG-30 部署型三腳架 + [班组] 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 Развертываемая тренога + [CSW] SAG-30 배치형 삼각대 6P57 Tripod @@ -615,11 +746,13 @@ Trépied 6P57 6P57 三脚 6P57 三腳架 + 6P57 三脚架 6P57 Tripod 6P57 trojnožka 6P57 Tripod Trójnóg 6P57 6P67 Тренога + 6P57 삼각대 SAG-30 Tripod @@ -629,11 +762,13 @@ Trépied SAG-30 SAG-30 三脚 SAG-30 三腳架 + SAG-30 三脚架 SAG-30 Tripod SAG-30 trojnožka SAG-30 Tripod Trójnóg SAG-30 SAG-30 Тренога + SAG-30 삼각대 M220 Tripod @@ -643,25 +778,29 @@ Trépied M220 M220 三脚 M220 三腳架 + M220 三脚架 M220 Tripod M220 trojnožka M220 Tripod Trójnóg M220 M220 Тренога + M220 삼각대 [CSW] M3 Deployable Tripod [CSW] Trípode desplegable M3 [CSW] M3 aufstellbares Dreibein - [CSW] M3 Tripe Ajustável + [CSW] Tripe Ajustável M3 [CSW] M3 Trépied déployable [CSW] M3 設置型三脚 [CSW] M3 部屬型三腳架 + [班组] M3 部属型三脚架 [CSW] M3 Deployable Tripod [CSW] M3 trojnožka [CSW] M3 Deployable Tripod [CSW] Trójnóg Rozkładany M3 [CSW] M3 Развертываемая тренога + [CSW] M3 배치형 삼각대 [CSW] M3 Deployable Tripod (Low) @@ -671,11 +810,13 @@ [CSW] M3 Trépied déployable (Bas) [CSW] M3 設置型三脚 (低座) [CSW] M3 部署型三腳架(低位) + [班组] 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] M3 Развертываемая тренога (низкая) + [CSW] M3 배치형 삼각대 (낮음) [CSW] Mortar Baseplate @@ -685,11 +826,13 @@ [CSW] Plaque de base pour mortier [CSW] 迫撃砲基盤 [CSW] 迫擊炮基座 + [班组] 迫击炮底座 [CSW] Mortar Baseplate [CSW] Podstavec pro minomet [CSW] Mortar Baseplate [CSW] Podstawa Moździerza [CSW] Миномётная плита + [CSW] 포판 Mortar Baseplate @@ -699,11 +842,13 @@ Plaque de base pour mortier 迫撃砲基盤 迫擊炮基座 + 迫击炮底座 Mortar Baseplate Podstavec pro minomet Mortar Baseplate Podstawa Moździerza Миномётная плита + 포판 [CSW] Mk6 Mortar Tube @@ -713,11 +858,13 @@ [CSW] Tube mortier Mk6 [CSW] Mk6 迫撃砲発射筒 [CSW] Mk6 迫擊炮炮管 + [班组] Mk6 迫击炮管 [CSW] Mk6 Mortar Tube [CSW] Minomet Mk6 hlaveň [CSW] Mk6 Mortar Tube [CSW] Rura Moździerza Mk6 [CSW] Сумка с Mk6 трубой + [CSW] Mk6 박격포 포신 [CSW] M252 Tube Bag @@ -727,11 +874,13 @@ [CSW] Sac tube M252 [CSW] M252 発射筒バッグ [CSW] M252 炮管袋 + [班组] M252 炮管包 [CSW] M252 Tube Bag [CSW] M252 minometná hlaveň v pouzdře [CSW] M252 Tube Bag [CSW] Torba na M252 [CSW] Сумка с M252 орудием + [CSW] M252 박격포 포신 [CSW] M2 Gun Bag @@ -741,11 +890,13 @@ [CSW] Sac M2 [CSW] M2 ガン バッグ [CSW] M2槍械袋 + [班组] M2 枪械包 [CSW] M2 Gun Bag [CSW] M2 zbraň v pouzdře [CSW] M2 Gun Bag [CSW] Torba na M2 [CSW] Сумка с M2 орудием + [CSW] M2 총가방 [CSW] MK19 Gun Bag @@ -755,11 +906,13 @@ [CSW] Sac MK19 [CSW] Mk19 ガン バッグ [CSW] Mk19槍械袋 + [班组] Mk19 枪械包 [CSW] MK19 Gun Bag [CSW] MK19 zbraň v pouzdře [CSW] MK19 Gun Bag [CSW] Torba na MK19 [CSW] Сумка с MK19 орудием + [CSW] MK19 총가방 [CSW] BGM-71 TOW Launcher Bag @@ -769,11 +922,13 @@ [CSW] Sac lanceur BGM-71 TOW [CSW] BGM-71 TOW ランチャー バッグ [CSW] BGM-71 拖式飛彈發射器袋 + [班组] 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] BGM-71 토우 발사기 가방 [CSW] DSHK Gun Bag @@ -783,11 +938,13 @@ [CSW] Sac DSHK [CSW] DShK ガン バッグ [CSW]DShK 槍械袋 + [班组] DShK 枪械包 [CSW] DSHK Gun Bag [CSW] DSHK zbraň v pouzdře [CSW] DSHK Gun Bag [CSW] Torba na DSzK [CSW] Сумка с ДШК орудием + [CSW] DSHK 총가방 [CSW] 2B14 Tube Bag @@ -797,11 +954,13 @@ [CSW] Sac tube 2B14 [CSW] 2B14 発射筒バッグ [CSW] 2B14 炮管袋 + [班组] 2B14 炮管包 [CSW] 2B14 Tube Bag [CSW] 2B14 minometná hlaveň v pouzdře [CSW] 2B14 Tube Bag [CSW] Torba na 2B14 [CSW] Сумка с 2Б14 трубой + [CSW] 2B14 박격포 가방 [CSW] NSV Gun Bag @@ -811,11 +970,13 @@ [CSW] Sac NSV [CSW] NSV ガン バッグ [CSW] NSV 槍械袋 + [班组] NSV 枪械包 [CSW] NSV Gun Bag [CSW] NSV zbraň v pouzdře [CSW] NSV Gun Bag [CSW] Torba na NSV [CSW] Сумка с НСВ орудием + [CSW] NSV 총가방 [CSW] KORD Gun Bag @@ -825,11 +986,13 @@ [CSW] Sac KORD [CSW] KORD ガン バッグ [CSW] KORD 槍械袋 + [班组] KORD 枪械包 [CSW] KORD Gun Bag [CSW] KORD zbraň v pouzdře [CSW] KORD Gun Bag [CSW] Torba na KORD [CSW] Сумка с Корд орудием + [CSW] KORD 총가방 [CSW] AGS-30 Gun Bag @@ -839,11 +1002,13 @@ [CSW] Sac AGS-30 [CSW] AGS-30 バッグ [CSW] AGS-30 槍械袋 + [班组] 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] AGS-30 총가방 [CSW] 9K115 Metis Launcher Bag @@ -853,11 +1018,13 @@ [CSW] Sac lanceur 9K115 Metis [CSW] 9K115 メティス ランチャー バッグ [CSW] 9K115 麥士蒂索人發射器袋 + [班组] 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] 9K115 메티스 발사기 가방 [CSW] 9M113 Kornet Launcher @@ -867,11 +1034,13 @@ [CSW] Sac lanceur 9M113 Kornet [CSW] 9M113 コルネット ランチャー バッグ [CSW] 9M113 短號發射器 + [班组] 9M113 短号发射器 [CSW] 9M113 Kornet Launcher [CSW] 9M113 Kornet raketomet [CSW] Wyrzutnia 9M113 Kornet [CSW] 9m113 Kornet Launcher [CSW] Сумка с 9К135 Корнет установкой + [CSW] 9M113 코넷 발사기 가방 SPG-9 Tripod @@ -881,11 +1050,13 @@ Trépied SPG-9 SPG-9 三脚 SPG-9 三腳架 + SPG-9 三脚架 SPG-9 Tripod SPG-9 trojnožka SPG-9 Tripod Trójnóg SPG-9 СПГ-9 Тренога + SPG-9 삼각대 [CSW] SPG-9 Deployable Tripod @@ -895,11 +1066,13 @@ [CSW] SPG-9 Trépied déployable [CSW] SPG-9 設置型三脚 [CSW] SPG-9 部署型三腳架 + [班组] 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 배치형 삼각대 [CSW] SPG-9 Launcher Bag @@ -909,11 +1082,13 @@ [CSW] Sac lanceur SPG-9 [CSW] SPG-9 ランチャー バッグ [CSW] SPG-9 發射器袋 + [班组] 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-9 발사기 가방 [CSW] SPG-9M Launcher Bag @@ -923,11 +1098,13 @@ [CSW] Sac lanceur SPG-9M [CSW] SPG-9M ランチャー バッグ [CSW] SPG-9M 發射器袋 + [班组] 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М орудием + [CSW] SPG-9M 발사기 가방 diff --git a/addons/dagr/CfgEventHandlers.hpp b/addons/dagr/CfgEventHandlers.hpp index 0612f3abed..851e58197c 100644 --- a/addons/dagr/CfgEventHandlers.hpp +++ b/addons/dagr/CfgEventHandlers.hpp @@ -15,4 +15,4 @@ class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); }; -}; \ No newline at end of file +}; diff --git a/addons/dagr/CfgWeapons.hpp b/addons/dagr/CfgWeapons.hpp index 55692e7f9a..d114fa448c 100644 --- a/addons/dagr/CfgWeapons.hpp +++ b/addons/dagr/CfgWeapons.hpp @@ -12,6 +12,7 @@ class CfgWeapons { picture = QPATHTOF(UI\DAGR_Icon.paa); icon = "iconObject_circle"; mapSize = 0.034; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; diff --git a/addons/dagr/functions/fnc_handleRangeFinderData.sqf b/addons/dagr/functions/fnc_handleRangeFinderData.sqf index 4d9447240b..19f6dd9171 100644 --- a/addons/dagr/functions/fnc_handleRangeFinderData.sqf +++ b/addons/dagr/functions/fnc_handleRangeFinderData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rosuto, Ruthberg * Handles incoming data packets from the Vectronix Vector LRF diff --git a/addons/dagr/functions/fnc_menuInit.sqf b/addons/dagr/functions/fnc_menuInit.sqf index 498d6614d4..a7c78dcc65 100644 --- a/addons/dagr/functions/fnc_menuInit.sqf +++ b/addons/dagr/functions/fnc_menuInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rosuto, Ruthberg * Creates the DAGR menu dialog diff --git a/addons/dagr/functions/fnc_outputData.sqf b/addons/dagr/functions/fnc_outputData.sqf index a5816e472d..21e19ff023 100644 --- a/addons/dagr/functions/fnc_outputData.sqf +++ b/addons/dagr/functions/fnc_outputData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rosuto * DAGR data output loop diff --git a/addons/dagr/functions/fnc_outputVector.sqf b/addons/dagr/functions/fnc_outputVector.sqf index ce2ca2a04c..5eb1b9bffa 100644 --- a/addons/dagr/functions/fnc_outputVector.sqf +++ b/addons/dagr/functions/fnc_outputVector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rosuto * DAGR vector output loop diff --git a/addons/dagr/functions/fnc_outputWP.sqf b/addons/dagr/functions/fnc_outputWP.sqf index 41518a0560..2e0588ccc4 100644 --- a/addons/dagr/functions/fnc_outputWP.sqf +++ b/addons/dagr/functions/fnc_outputWP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rosuto * DAGR waypoint output loop diff --git a/addons/dagr/functions/fnc_toggleOverlay.sqf b/addons/dagr/functions/fnc_toggleOverlay.sqf index c0e229d745..cc875f9a70 100644 --- a/addons/dagr/functions/fnc_toggleOverlay.sqf +++ b/addons/dagr/functions/fnc_toggleOverlay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rosuto, Ruthberg * Toggles the DAGR overlay diff --git a/addons/dagr/functions/script_component.hpp b/addons/dagr/functions/script_component.hpp deleted file mode 100644 index 18b02deaee..0000000000 --- a/addons/dagr/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\dagr\script_component.hpp" \ No newline at end of file diff --git a/addons/dagr/stringtable.xml b/addons/dagr/stringtable.xml index d062e2ffaa..38dfd89254 100644 --- a/addons/dagr/stringtable.xml +++ b/addons/dagr/stringtable.xml @@ -14,7 +14,7 @@ DAGR DAGR 軍用GPS接收器 - 军用GPS接收器 + 军用 GPS 接收器 DAGR @@ -30,7 +30,7 @@ DAGR を設定 DAGR 설정 設定軍用GPS接收器 - 设定军用GPS接收器 + 设定军用 GPS 接收器 DAGR'ı yapılandır @@ -38,7 +38,7 @@ DAGR umschalten Przełącz DAGR Mostrar DAGR - Вкл./выкл. DAGR + Переключить DAGR Mostrar DAGR Přepnout DAGR Apri DAGR @@ -46,7 +46,7 @@ DAGR を常に表示 DAGR 토글 切換軍用GPS接收器 - 切换军用GPS接收器 + 切换军用 GPS 接收器 DAGR'yi aç / kapat @@ -62,7 +62,7 @@ アドバンスド DAGR の受信を定義します 국방 고급위성항법시스템 수신기 軍用高級防禦GPS接收器 - 军用高级防御GPS接收器 + 军用高级防御 GPS 接收器 Gelişmiş Savunma GPS Alıcısı diff --git a/addons/disarming/functions/fnc_canBeDisarmed.sqf b/addons/disarming/functions/fnc_canBeDisarmed.sqf index ab41729f6a..25d072f1e5 100644 --- a/addons/disarming/functions/fnc_canBeDisarmed.sqf +++ b/addons/disarming/functions/fnc_canBeDisarmed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf b/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf index 2468e454fd..989dd7f4df 100644 --- a/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf +++ b/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index 8f358e8b43..d43d3542f7 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_eventCallerFinish.sqf b/addons/disarming/functions/fnc_eventCallerFinish.sqf index 60629b221f..bc9033fee5 100644 --- a/addons/disarming/functions/fnc_eventCallerFinish.sqf +++ b/addons/disarming/functions/fnc_eventCallerFinish.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_eventTargetFinish.sqf b/addons/disarming/functions/fnc_eventTargetFinish.sqf index b750fd51b1..792a41d06d 100644 --- a/addons/disarming/functions/fnc_eventTargetFinish.sqf +++ b/addons/disarming/functions/fnc_eventTargetFinish.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_eventTargetStart.sqf b/addons/disarming/functions/fnc_eventTargetStart.sqf index e63289cf20..7173f66a76 100644 --- a/addons/disarming/functions/fnc_eventTargetStart.sqf +++ b/addons/disarming/functions/fnc_eventTargetStart.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_getAllGearContainer.sqf b/addons/disarming/functions/fnc_getAllGearContainer.sqf index be46d66e5e..ea954a39d5 100644 --- a/addons/disarming/functions/fnc_getAllGearContainer.sqf +++ b/addons/disarming/functions/fnc_getAllGearContainer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_getAllGearUnit.sqf b/addons/disarming/functions/fnc_getAllGearUnit.sqf index db066ad5d8..b47d2aca70 100644 --- a/addons/disarming/functions/fnc_getAllGearUnit.sqf +++ b/addons/disarming/functions/fnc_getAllGearUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_openDisarmDialog.sqf b/addons/disarming/functions/fnc_openDisarmDialog.sqf index 16d73d25a2..a3762aec9f 100644 --- a/addons/disarming/functions/fnc_openDisarmDialog.sqf +++ b/addons/disarming/functions/fnc_openDisarmDialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/fnc_showItemsInListbox.sqf b/addons/disarming/functions/fnc_showItemsInListbox.sqf index fadbb2d914..e05e27c87e 100644 --- a/addons/disarming/functions/fnc_showItemsInListbox.sqf +++ b/addons/disarming/functions/fnc_showItemsInListbox.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * @@ -51,7 +51,7 @@ params ["_listBoxCtrl", "_itemsCountArray"]; _picture = getText (_configPath >> _classname >> "picture"); }; default { - ERROR(format ["[%1] - bad classname", _classname]); + ERROR_1("[%1] - bad classname",_classname); }; }; diff --git a/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf b/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf index 60d851b973..68da57dcda 100644 --- a/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf +++ b/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * diff --git a/addons/disarming/functions/script_component.hpp b/addons/disarming/functions/script_component.hpp deleted file mode 100644 index 38e082ee0e..0000000000 --- a/addons/disarming/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\disarming\script_component.hpp" \ No newline at end of file diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index 9cc9dca680..0ae879fd60 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -15,7 +15,7 @@ インベントリを開く 소지품 열기 開啟裝備 - 开启装备 + 开启物品栏 Envanteri Aç diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index b0148a47a6..8c5fe9f095 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -13,7 +13,7 @@ Lanciatore usato Tubo utilizado 使用済み - 사용함 + 사용한 발사관 使用過的火箭筒 使用过的火箭筒 Kullanılmış Tüp @@ -47,7 +47,7 @@ Missile inerte precaricato Míssel inerte pré-carregado 仮置きのミサイルをあらかじめ装填 - 임시로 미사일을 미리 장전 + 더미 미사일을 미리 장전하기 預裝訓練導彈 预装训练导弹 diff --git a/addons/dogtags/CfgUIGrids.hpp b/addons/dogtags/CfgUIGrids.hpp index f9216ac2ea..78944ccaad 100644 --- a/addons/dogtags/CfgUIGrids.hpp +++ b/addons/dogtags/CfgUIGrids.hpp @@ -5,13 +5,13 @@ class CfgUIGrids { class Variables { GVAR(grid)[] = { { - (safeZoneX + safeZoneW) - 12.9 * GUI_GRID_W, - safeZoneY + 0.175 * safeZoneH, - 8 * GUI_GRID_W, - 8 * GUI_GRID_H + QUOTE((safeZoneX + safeZoneW) - 12.9 * GUI_GRID_W), + QUOTE(safeZoneY + 0.175 * safeZoneH), + QUOTE(8 * GUI_GRID_W), + QUOTE(8 * GUI_GRID_H) }, - GUI_GRID_W, - GUI_GRID_H + QUOTE(GUI_GRID_W), + QUOTE(GUI_GRID_H) }; }; }; diff --git a/addons/dogtags/RscTitles.hpp b/addons/dogtags/RscTitles.hpp index 97549c856e..5bcd318205 100644 --- a/addons/dogtags/RscTitles.hpp +++ b/addons/dogtags/RscTitles.hpp @@ -13,23 +13,23 @@ class RscTitles { class controls { class background: RscPicture { idc = 1000; - x = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),X)', (safeZoneX + safeZoneW) - 12.9 * GUI_GRID_W]; - y = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),Y)', safeZoneY + 0.175 * safeZoneH]; - w = 8 * GUI_GRID_W; - h = 8 * GUI_GRID_H; + x = QUOTE(profileNamespace getVariable [ARR_2('TRIPLES(IGUI,GVAR(grid),X)', (safeZoneX + safeZoneW) - 12.9 * GUI_GRID_W)]); + y = QUOTE(profileNamespace getVariable [ARR_2('TRIPLES(IGUI,GVAR(grid),Y)', safeZoneY + 0.175 * safeZoneH)]); + w = QUOTE(8 * GUI_GRID_W); + h = QUOTE(8 * GUI_GRID_H); text = QPATHTOF(data\dogtagSingle.paa); colorText[] = {1, 1, 1, 1}; }; class nickname: RscStructuredText { idc = 1001; text = ""; - sizeEx = GUI_GRID_H; + sizeEx = QUOTE(GUI_GRID_H); colorText[] = {1, 1, 1, 1}; colorBackground[] = {0, 0, 0, 0}; - x = 1.6 * GUI_GRID_W + (profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),X)', (safeZoneX + safeZoneW) - 12.9 * GUI_GRID_W]); - y = 0.065 * safeZoneH + (profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),Y)', safeZoneY + 0.175 * safeZoneH]); - w = 5.9 * GUI_GRID_W; - h = 3 * GUI_GRID_H; + x = QUOTE(1.6 * GUI_GRID_W + (profileNamespace getVariable [ARR_2('TRIPLES(IGUI,GVAR(grid),X)', (safeZoneX + safeZoneW) - 12.9 * GUI_GRID_W)])); + y = QUOTE(0.065 * safeZoneH + (profileNamespace getVariable [ARR_2('TRIPLES(IGUI,GVAR(grid),Y)', safeZoneY + 0.175 * safeZoneH)])); + w = QUOTE(5.9 * GUI_GRID_W); + h = QUOTE(3 * GUI_GRID_H); font = "RobotoCondensed"; class Attributes { font = "RobotoCondensed"; diff --git a/addons/dogtags/XEH_postInit.sqf b/addons/dogtags/XEH_postInit.sqf index 02d2db862b..d7476345c9 100644 --- a/addons/dogtags/XEH_postInit.sqf +++ b/addons/dogtags/XEH_postInit.sqf @@ -5,8 +5,7 @@ [QGVAR(getDogtagItem), DFUNC(getDogtagItem)] call CBA_fnc_addEventHandler; [QGVAR(addDogtagItem), DFUNC(addDogtagItem)] call CBA_fnc_addEventHandler; - -//Add actions and event handlers only if ace_medical is loaded +// Add actions and event handlers only if ace_medical is loaded // - Adding actions via config would create a dependency if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { if (hasInterface) then { @@ -46,35 +45,33 @@ if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { }; }; +// If the arsenal is loaded, show the custom names for dog tags when in the arsenal if (["ACE_Arsenal"] call EFUNC(common,isModLoaded)) then { [QEGVAR(arsenal,rightPanelFilled), { - params ["_display", "_leftPanelIDC", "_rightPanelIDC"]; if (_leftPanelIDC in [2010, 2012, 2014] && {_rightPanelIDC == 38}) then { LOG("passed"); private _rightPanel = _display displayCtrl 15; - (lnbSize _rightPanel) params ["_rows", "_columns"]; + private _allDogtags = missionNamespace getVariable [QGVAR(allDogtags), []]; + private _allDogtagsData = missionNamespace getVariable [QGVAR(allDogtagDatas), []]; + private _cfgWeapons = configFile >> "CfgWeapons"; + private _item = ""; + private _dogtagData = []; - private _allDogtags = missionNameSpace getVariable [QGVAR(allDogtags), []]; - private _allDogtagDatas = missionNameSpace getVariable [QGVAR(allDogtagDatas), []]; + for "_i" from 0 to (lnbSize _rightPanel select 0) - 1 do { + _item = _rightPanel lnbData [_i, 0]; - for "_r" from 0 to (_rows - 1) do { - private _data = _rightPanel lnbData [_r, 0]; + if (_item isKindOf ["ACE_dogtag", _cfgWeapons]) then { + _dogtagData = _allDogtagsData param [_allDogtags find _item, []]; - if (_data isKindOf ["ACE_dogtag", (configFile >> "CfgWeapons")]) then { - - private _dogtagData = []; - private _index = _allDogtags find _data; - _dogtagData = _allDogtagDatas select _index; - private _dogtagString = [localize LSTRING(itemName), ": ", (_dogtagData select 0)] joinString ""; - - _rightPanel lnbSetText [[_r, 1], _dogtagString]; + // If data doesn't exist, put name as "unknown" + _rightPanel lnbSetText [[_i, 1], [LLSTRING(itemName), ": ", _dogtagData param [0, LELSTRING(common,unknown)]] joinString ""]; }; }; }; }] call CBA_fnc_addEventHandler; }; -// disable dogtags for civilians +// Disable dogtags for civilians "CIV_F" call FUNC(disableFactionDogtags); diff --git a/addons/dogtags/XEH_preInit.sqf b/addons/dogtags/XEH_preInit.sqf index a7a080b91e..5ad43b0229 100644 --- a/addons/dogtags/XEH_preInit.sqf +++ b/addons/dogtags/XEH_preInit.sqf @@ -7,5 +7,5 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; GVAR(disabledFactions) = [] call CBA_fnc_createNamespace; - + ADDON = true; diff --git a/addons/dogtags/functions/fnc_addDogtagActions.sqf b/addons/dogtags/functions/fnc_addDogtagActions.sqf index 2911b27a92..7c7a2e5e8f 100644 --- a/addons/dogtags/functions/fnc_addDogtagActions.sqf +++ b/addons/dogtags/functions/fnc_addDogtagActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL, mharis001 * Returns children actions for checking dogtags in player's inventory. diff --git a/addons/dogtags/functions/fnc_addDogtagItem.sqf b/addons/dogtags/functions/fnc_addDogtagItem.sqf index acecd6b252..970bb1926e 100644 --- a/addons/dogtags/functions/fnc_addDogtagItem.sqf +++ b/addons/dogtags/functions/fnc_addDogtagItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Adds dogtag item to unit (triggered by server). diff --git a/addons/dogtags/functions/fnc_bloodType.sqf b/addons/dogtags/functions/fnc_bloodType.sqf index 46e75ee7f9..5e03c586fa 100644 --- a/addons/dogtags/functions/fnc_bloodType.sqf +++ b/addons/dogtags/functions/fnc_bloodType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Reports a blood type depending on the units name. diff --git a/addons/dogtags/functions/fnc_canCheckDogtag.sqf b/addons/dogtags/functions/fnc_canCheckDogtag.sqf index 8abbf8858d..399ad5db25 100644 --- a/addons/dogtags/functions/fnc_canCheckDogtag.sqf +++ b/addons/dogtags/functions/fnc_canCheckDogtag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Checks if dogtag can be checked. diff --git a/addons/dogtags/functions/fnc_canTakeDogtag.sqf b/addons/dogtags/functions/fnc_canTakeDogtag.sqf index 8bcad4a73d..7ae38f7c41 100644 --- a/addons/dogtags/functions/fnc_canTakeDogtag.sqf +++ b/addons/dogtags/functions/fnc_canTakeDogtag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Checks if dogtag can be taken. diff --git a/addons/dogtags/functions/fnc_checkDogtag.sqf b/addons/dogtags/functions/fnc_checkDogtag.sqf index 52b08e1947..dcceb8c2c0 100644 --- a/addons/dogtags/functions/fnc_checkDogtag.sqf +++ b/addons/dogtags/functions/fnc_checkDogtag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Checks unit dogtag. diff --git a/addons/dogtags/functions/fnc_checkDogtagItem.sqf b/addons/dogtags/functions/fnc_checkDogtagItem.sqf index 8ce7864774..09526d83ed 100644 --- a/addons/dogtags/functions/fnc_checkDogtagItem.sqf +++ b/addons/dogtags/functions/fnc_checkDogtagItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Check dogtag self menu action. diff --git a/addons/dogtags/functions/fnc_disableFactionDogtags.sqf b/addons/dogtags/functions/fnc_disableFactionDogtags.sqf index c299af3a7d..f1ea5f5c06 100644 --- a/addons/dogtags/functions/fnc_disableFactionDogtags.sqf +++ b/addons/dogtags/functions/fnc_disableFactionDogtags.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Disable this faction from using dogtags. diff --git a/addons/dogtags/functions/fnc_getDogtagData.sqf b/addons/dogtags/functions/fnc_getDogtagData.sqf index d566daf64b..6a850543fc 100644 --- a/addons/dogtags/functions/fnc_getDogtagData.sqf +++ b/addons/dogtags/functions/fnc_getDogtagData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Get unit dogtag data. diff --git a/addons/dogtags/functions/fnc_getDogtagItem.sqf b/addons/dogtags/functions/fnc_getDogtagItem.sqf index 22a0561937..04112bcc94 100644 --- a/addons/dogtags/functions/fnc_getDogtagItem.sqf +++ b/addons/dogtags/functions/fnc_getDogtagItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Server: creates new dogtag item and send it to client. diff --git a/addons/dogtags/functions/fnc_sendDogtagData.sqf b/addons/dogtags/functions/fnc_sendDogtagData.sqf index c43cf04dab..2351e61166 100644 --- a/addons/dogtags/functions/fnc_sendDogtagData.sqf +++ b/addons/dogtags/functions/fnc_sendDogtagData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Server: returns to client data on given dogtag. diff --git a/addons/dogtags/functions/fnc_showDogtag.sqf b/addons/dogtags/functions/fnc_showDogtag.sqf index 8e7bec620c..4865ff7de2 100644 --- a/addons/dogtags/functions/fnc_showDogtag.sqf +++ b/addons/dogtags/functions/fnc_showDogtag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Shows dogtag. diff --git a/addons/dogtags/functions/fnc_ssn.sqf b/addons/dogtags/functions/fnc_ssn.sqf index 3da972ecd8..0ba3499c0b 100644 --- a/addons/dogtags/functions/fnc_ssn.sqf +++ b/addons/dogtags/functions/fnc_ssn.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Reports a social security number generated from the units name. * * Arguments: diff --git a/addons/dogtags/functions/fnc_takeDogtag.sqf b/addons/dogtags/functions/fnc_takeDogtag.sqf index 4538115633..1972c91ee0 100644 --- a/addons/dogtags/functions/fnc_takeDogtag.sqf +++ b/addons/dogtags/functions/fnc_takeDogtag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * If dogtag is not already taken triggers event on server. diff --git a/addons/dogtags/functions/script_component.hpp b/addons/dogtags/functions/script_component.hpp deleted file mode 100644 index 583e76df33..0000000000 --- a/addons/dogtags/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\dogtags\script_component.hpp" diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index c2fc066b3d..ac9dc939f5 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -70,9 +70,9 @@ Zabrałeś nieśmiertelnik %1... Жетон снят с %1... Sebral jsem známku od %1... - %1からドッグ タグを取っています・・・ + %1 からドッグ タグを取っています・・・ Erkennungsmarke von %1 genommen... - %1로부터 군번줄을 회수했습니다... + %1(으)로부터 군번줄을 회수했습니다... Plaque d'identification prise sur %1... Piastrina presa da %1... 從%1身上拿取兵籍牌... @@ -101,6 +101,7 @@ 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 @@ -110,6 +111,7 @@ 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 d1f8a87636..94ebf2cda6 100644 --- a/addons/dragging/CfgEventHandlers.hpp +++ b/addons/dragging/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); @@ -20,29 +19,34 @@ class Extended_PostInit_EventHandlers { class Extended_Init_EventHandlers { class CAManBase { class ADDON { - init = QUOTE(_this call DFUNC(initPerson)); + init = QUOTE(_this call FUNC(initPerson)); exclude[] = {"VirtualMan_F"}; }; }; class StaticWeapon { class ADDON { - init = QUOTE(_this call DFUNC(initObject)); + init = QUOTE(_this call FUNC(initObject)); }; }; class Thing { class ADDON { - init = QUOTE(_this call DFUNC(initObject)); + init = QUOTE(_this call FUNC(initObject)); exclude[] = {"ModuleEmpty_F", "ThingEffect", "Wreck"}; }; }; class NonStrategic { class ADDON { - init = QUOTE(_this call DFUNC(initObject)); + init = QUOTE(_this call FUNC(initObject)); + }; + }; + class WeaponHolder { + class ADDON { + init = QUOTE(_this call FUNC(initObject)); }; }; class Land_Camping_Light_F { class ADDON { - init = QUOTE(_this call DFUNC(initObject)); + init = QUOTE(_this call FUNC(initObject)); }; }; }; @@ -50,7 +54,7 @@ class Extended_Init_EventHandlers { class Extended_Killed_EventHandlers { class CAManBase { class ADDON { - killed = QUOTE(_this call DFUNC(handleKilled)); + killed = QUOTE(_this call FUNC(handleKilled)); }; }; }; diff --git a/addons/dragging/CfgMovesBasic.hpp b/addons/dragging/CfgMovesBasic.hpp index 6b55e82c2d..cfaa9b7ad0 100644 --- a/addons/dragging/CfgMovesBasic.hpp +++ b/addons/dragging/CfgMovesBasic.hpp @@ -3,13 +3,16 @@ class CfgMovesBasic { ACE_dragWithPistol = "ace_dragging"; ACE_dragWithRifle = "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_2"; }; - + class Actions { class MoveWithInjuredManDragger; class MoveWithInjuredManDraggerRfl: MoveWithInjuredManDragger { + LimpB = "ace_dragging_rifle_limpB"; + LimpLB = "ace_dragging_rifle_limpB"; + LimpRB = "ace_dragging_rifle_limpB"; Up = "amovpercmstpsraswrfldnon"; }; - + class MoveWithInjuredManDraggerPst; class ACE_MoveWithInjuredManDraggerPst: MoveWithInjuredManDraggerPst { Default = "ace_dragging_static"; @@ -19,6 +22,9 @@ class CfgMovesBasic { grabDrag = "ace_dragging_static"; grabCarry = "Helper_SwitchToCarrynon_pst"; HandGunOn = "ace_dragging_static"; + LimpB = "ace_dragging_limpB"; + LimpLB = "ace_dragging_limpB"; + LimpRB = "ace_dragging_limpB"; PlayerSlowB = "ace_dragging"; PlayerSlowLB = "ace_dragging"; PlayerSlowRB = "ace_dragging"; diff --git a/addons/dragging/CfgMovesMaleSdr.hpp b/addons/dragging/CfgMovesMaleSdr.hpp index d19d210f49..fb965dd713 100644 --- a/addons/dragging/CfgMovesMaleSdr.hpp +++ b/addons/dragging/CfgMovesMaleSdr.hpp @@ -2,8 +2,6 @@ class CfgMovesMaleSdr: CfgMovesBasic { class InjuredMovedBase; class AgonyBaseRfl; class StandBase; - class AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1; - class DraggerBase; class States { class AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon: InjuredMovedBase { @@ -14,59 +12,71 @@ class CfgMovesMaleSdr: CfgMovesBasic { speed = -10; // 1/10 }; - class AmovPercMstpSrasWpstDnon: StandBase { - ConnectTo[] = { - "AmovPercMstpSrasWpstDnon", - 0.02, - "AovrPercMstpSrasWpstDf", - 0.025, - "AmovPercMstpSrasWpstDnon_AidlPercMstpSlowWpstDnon", - 0.0099999998, - "PistolMagazineReloadStand", - 0.1, - "AmovPercMstpSrasWpstDnon_AmovPercMstpSlowWpstDnon", - 0.02, - "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWrflDnon", - 0.02, - "AmovPercMstpSrasWpstDnon_AwopPercMstpSoptWbinDnon", - 0.02, - "AmovPercMstpSrasWpstDnon_AmovPercMstpSnonWnonDnon", - 0.02, - "AmovPercMstpSrasWpstDnon_SaluteIn", - 0.02, - "AwopPercMstpSgthWpstDnon_Part1", - 0.1, - "AmovPercMstpSrasWpstDnon_AinvPknlMstpSnonWnonDnon", - 0.02, - "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWlnrDnon", - 0.02, - "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDup", - 0.02, - "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDdown", - 0.02, - "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDleft", - 0.02, - "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDright", - 0.02, - "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWpstDnon_gear", - 0.02, - "Acts_starterPistol_in", - 0.001, - "Acts_PistolRaisedStand_Default", - 1, - "ace_dragging", + // For dragging with rifles + class AmovPercMstpSlowWrflDnon; + class AmovPercMstpSrasWrflDnon: AmovPercMstpSlowWrflDnon { + ConnectTo[] += { + "ace_dragging_rifle_limpB", 0.1 }; }; + class AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1; class AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_2: AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1 { aiming = "aimingDefault"; aimingBody = "aimingUpDefault"; aimPrecision = 5; // default: 1 + ConnectTo[] += { + "ace_dragging_rifle_limpB", + 0.1 + }; + InterpolateTo[] += { + "ace_dragging_rifle_limpB", + 0.1 + }; }; + class AcinPknlMstpSrasWrflDnon: AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1 { + ConnectTo[] += { + "ace_dragging_rifle_limpB", + 0.1 + }; + InterpolateTo[] += { + "ace_dragging_rifle_limpB", + 0.1 + }; + }; + + class AcinPknlMwlkSrasWrflDb: AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1 { + ConnectTo[] += { + "ace_dragging_rifle_limpB", + 0.1 + }; + InterpolateTo[] += { + "ace_dragging_rifle_limpB", + 0.1 + }; + }; + + class ace_dragging_rifle_limpB: AcinPknlMwlkSrasWrflDb { + speed = 0.5; + }; + + // For dragging with pistols + class AmovPercMstpSrasWpstDnon: StandBase { + ConnectTo[] += { + "ace_dragging", + 0.1, + "ace_dragging_limpB", + 0.1, + "ace_dragging_static", + 0.1 + }; + }; + + class DraggerBase; class ace_dragging: DraggerBase { - actions = "ace_MoveWithInjuredManDraggerPst"; + actions = "ACE_MoveWithInjuredManDraggerPst"; aiming = "aimingPistol"; aimingBody = "aimingPistol"; aimPrecision = 2; // default: 1 @@ -75,14 +85,24 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = { "ace_dragging", 0.1, + "ace_dragging_limpB", + 0.1, "ace_dragging_drop", - 0.2 + 0.2, + "ace_dragging_static", + 0.1 }; disableWeapons = 0; duty = 0.6; enableBinocular = 0; file = QPATHTO_T(anim\ace_dragging.rtm); InterpolateTo[] = { + "ace_dragging", + 0.1, + "ace_dragging_limpB", + 0.1, + "ace_dragging_drop", + 0.2, "ace_dragging_static", 0.1 }; @@ -93,20 +113,11 @@ class CfgMovesMaleSdr: CfgMovesBasic { turnSpeed = 0.5; }; + class ace_dragging_limpB: ace_dragging { + speed = 0.5; + }; + class ace_dragging_static: ace_dragging { - ConnectTo[] = { - "ace_dragging", - 0.1, - "ace_dragging_drop", - 0.2 - }; - InterpolateTo[] = { - "ace_dragging", - 0.1, - "ace_dragging_drop", - 0.2 - }; - looped = 1; speed = 0; }; diff --git a/addons/dragging/CfgVehicles.hpp b/addons/dragging/CfgVehicles.hpp index 076c5fb640..395133e946 100644 --- a/addons/dragging/CfgVehicles.hpp +++ b/addons/dragging/CfgVehicles.hpp @@ -18,6 +18,12 @@ class CfgVehicles { GVAR(canDrag) = 0; }; + // Invisible Target Soldier + class TargetSoldierBase: StaticWeapon { + GVAR(canCarry) = 0; + GVAR(canDrag) = 0; + }; + class StaticMortar; class Mortar_01_base_F: StaticMortar { GVAR(canCarry) = 1; @@ -66,7 +72,7 @@ class CfgVehicles { GVAR(canDrag) = 0; }; - // ammo boxes + // Ammo boxes class ThingX; class Items_base_F; class ReammoBox_F: ThingX { @@ -80,7 +86,7 @@ class CfgVehicles { GVAR(canCarry) = 0; GVAR(canDrag) = 0; }; - //remove actions from Taru Pods + // Remove actions from Taru Pods class Pod_Heli_Transport_04_base_F: Slingload_base_F { GVAR(canCarry) = 0; GVAR(canDrag) = 0; @@ -154,7 +160,7 @@ class CfgVehicles { GVAR(canDrag) = 0; }; - //Plastic and metal case + // Plastic and metal case class PlasticCase_01_base_F: Items_base_F { GVAR(canCarry) = 1; GVAR(carryDirection) = 270; @@ -220,6 +226,32 @@ class CfgVehicles { GVAR(canCarry) = 1; }; + // Weapons dropped from dead body + class WeaponHolderSimulated: ThingX { + GVAR(canCarry) = 1; + GVAR(carryPosition[]) = {0,0.5,1.3}; + GVAR(carryDirection) = 0; + + // z-position floats from -1.2 to > 0 + // It's OK for carrying but odd for dragging + // Needs workaround to drag correctly. Disabled ATM + GVAR(canDrag) = 0; + GVAR(dragPosition[]) = {0,1,0}; + GVAR(dragDirection) = 0; + }; + + class ReammoBox; + // Dropped weapons/gear + class WeaponHolder: ReammoBox { + GVAR(canCarry) = 1; + GVAR(carryPosition[]) = {0,0.5,1}; + GVAR(carryDirection) = 0; + + GVAR(canDrag) = 1; + GVAR(dragPosition[]) = {0,1,0}; + GVAR(dragDirection) = 0; + }; + class Lamps_base_F; class Land_PortableLight_single_F: Lamps_base_F { GVAR(canCarry) = 1; @@ -233,7 +265,7 @@ class CfgVehicles { class FloatingStructure_F; class Land_Camping_Light_F: FloatingStructure_F { GVAR(canCarry) = 1; - // if y < 0.9 player gets damage + // If y < 0.9 player gets damaged GVAR(carryPosition)[] = {0,0.9,1}; GVAR(canDrag) = 1; @@ -247,8 +279,16 @@ class CfgVehicles { GVAR(dragPosition)[] = {0,0.7,0}; }; - // some terrain objects + // Flexible Fuel tanks, 300L + class FlexibleTank_base_F: ThingX { + GVAR(canCarry) = 1; + GVAR(carryPosition)[] = {0,0.65,0}; + GVAR(canDrag) = 1; + GVAR(dragPosition)[] = {0,1,0}; + }; + + // Some terrain objects class Land_CampingTable_F: ThingX { EGVAR(interaction,replaceTerrainObject) = 1; GVAR(canCarry) = 1; @@ -359,8 +399,8 @@ class CfgVehicles { GVAR(canDrag) = 1; }; - // static classes need XEH + // Static classes need XEH class NonStrategic; class Land_Pallets_F: NonStrategic { XEH_INHERITED; diff --git a/addons/dragging/XEH_PREP.hpp b/addons/dragging/XEH_PREP.hpp index b04c15e7ec..37b9722e8e 100644 --- a/addons/dragging/XEH_PREP.hpp +++ b/addons/dragging/XEH_PREP.hpp @@ -1,8 +1,8 @@ - PREP(canCarry); PREP(canDrag); PREP(canDrop); PREP(canDrop_carry); +PREP(canRun_carry); PREP(carryObject); PREP(carryObjectPFH); PREP(dragObject); @@ -19,6 +19,10 @@ PREP(handleUnconscious); PREP(initObject); PREP(initPerson); PREP(isObjectOnObject); +PREP(pauseCarry); +PREP(pauseDrag); +PREP(resumeCarry); +PREP(resumeDrag); PREP(setCarryable); PREP(setDraggable); PREP(startCarry); diff --git a/addons/dragging/XEH_postInit.sqf b/addons/dragging/XEH_postInit.sqf index dd782eddb2..32b7d72faa 100644 --- a/addons/dragging/XEH_postInit.sqf +++ b/addons/dragging/XEH_postInit.sqf @@ -2,8 +2,18 @@ #include "script_component.hpp" if (isServer) then { - // release object on hard disconnection. Function is identical to killed - addMissionEventHandler ["HandleDisconnect", {_this call FUNC(handleKilled)}]; + // Release object on disconnection. Function is identical to killed + addMissionEventHandler ["HandleDisconnect", LINKFUNC(handleKilled)]; + + // Handle surrending and handcuffing + ["ace_captiveStatusChanged", { + params ["_unit", "_state"]; + + // If surrended or handcuffed, drop dragged/carried object + if (_state) then { + _unit call FUNC(handleKilled); + }; + }] call CBA_fnc_addEventHandler; }; if (!hasInterface) exitWith {}; @@ -16,63 +26,82 @@ if (isNil "ACE_maxWeightCarry") then { ACE_maxWeightCarry = 600; }; +if (isNil QGVAR(maxWeightCarryRun)) then { + GVAR(maxWeightCarryRun) = 50; +}; + ["isNotDragging", {!((_this select 0) getVariable [QGVAR(isDragging), false])}] call EFUNC(common,addCanInteractWithCondition); ["isNotCarrying", {!((_this select 0) getVariable [QGVAR(isCarrying), false])}] call EFUNC(common,addCanInteractWithCondition); -// release object on player change. This does work when returning to lobby, but not when hard disconnecting. -["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler; +// Release object on player change. This does work when returning to lobby, but not when hard disconnecting. +["unit", LINKFUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler; ["vehicle", {[ACE_player, objNull] call FUNC(handlePlayerChanged)}] call CBA_fnc_addPlayerEventHandler; -["weapon", FUNC(handlePlayerWeaponChanged)] call CBA_fnc_addPlayerEventHandler; +["weapon", LINKFUNC(handlePlayerWeaponChanged)] call CBA_fnc_addPlayerEventHandler; -// handle waking up dragged unit and falling unconscious while dragging -["ace_unconscious", {_this call FUNC(handleUnconscious)}] call CBA_fnc_addEventHandler; +// Handle waking up dragged unit and falling unconscious while dragging +["ace_unconscious", LINKFUNC(handleUnconscious)] call CBA_fnc_addEventHandler; -// display event handler -["MouseZChanged", {_this select 1 call FUNC(handleScrollWheel)}] call CBA_fnc_addDisplayHandler; +// Display event handler +["MouseZChanged", {(_this select 1) call FUNC(handleScrollWheel)}] call CBA_fnc_addDisplayHandler; -//@todo Captivity? +[QGVAR(carryingContainerClosed), { + params ["_container", "_owner"]; + TRACE_2("carryingContainerClosed EH",_container,_owner); + if !(_owner getVariable [QGVAR(isCarrying), false]) exitWith { ERROR_1("not carrying - %1",_this) }; -//Add Keybind: -["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); - false - }; - if (ACE_player getVariable [QGVAR(isCarrying), false]) exitWith { - [ACE_player, ACE_player getVariable [QGVAR(carriedObject), objNull]] call FUNC(dropObject_carry); - false + private _weight = 0; + if !(_container getVariable [QGVAR(ignoreWeightCarry), false]) then { + _weight = [_container] call FUNC(getWeight); }; - private _cursor = cursorObject; - if ((isNull _cursor) || {(_cursor distance ACE_player) > 2.6}) exitWith {false}; - if (!([ACE_player, _cursor] call FUNC(canDrag))) exitWith {false}; - - [ACE_player, _cursor] call FUNC(startDrag); - false -}, {}, [-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 + // Drop the object if overweight + if (_weight > ACE_maxWeightCarry) exitWith { + [_owner, _container] call FUNC(dropObject_carry); }; - if (ACE_player getVariable [QGVAR(isCarrying), false]) exitWith { - [ACE_player, ACE_player getVariable [QGVAR(carriedObject), objNull]] call FUNC(dropObject_carry); - false + private _canRun = [_weight] call FUNC(canRun_carry); + + // Force walking based on weight + [_owner, "forceWalk", QUOTE(ADDON), !_canRun] call EFUNC(common,statusEffect_set); + [_owner, "blockSprint", QUOTE(ADDON), _canRun] call EFUNC(common,statusEffect_set); +}] call CBA_fnc_addEventHandler; + +[QGVAR(draggingContainerClosed), { + params ["_container", "_owner"]; + TRACE_2("draggingContainerClosed EH",_container,_owner); + if !(_owner getVariable [QGVAR(isDragging), false]) exitWith { ERROR_1("not dragging - %1",_this) }; + + private _weight = 0; + if !(_container getVariable [QGVAR(ignoreWeightDrag), false]) then { + _weight = [_container] call FUNC(getWeight); }; - private _cursor = cursorObject; - if ((isNull _cursor) || {(_cursor distance ACE_player) > 2.6}) exitWith {false}; - if (!([ACE_player, _cursor] call FUNC(canCarry))) exitWith {false}; + // Drop the object if overweight + if (_weight > ACE_maxWeightDrag) exitWith { + [_owner, _container] call FUNC(dropObject); + }; +}] call CBA_fnc_addEventHandler; - [ACE_player, _cursor] call FUNC(startCarry); - false -}, {}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND +// When changing cameras, drop carried and dragged objects +["featureCamera", { + params ["_unit", "_camera"]; + + // Unit can either drag or carry, functions themselves handle which ones are executed + switch (_camera) do { + // Default camera + case "": { + _unit call FUNC(resumeDrag); + _unit call FUNC(resumeCarry); + }; + // Arsenals make the unit change animations, which makes the unit drop dragged/carried objects regardless + case "arsenal"; + case "ace_arsenal": { + _unit call FUNC(handleKilled); + }; + default { + _unit call FUNC(pauseDrag); + _unit call FUNC(pauseCarry); + }; + }; +}] call CBA_fnc_addPlayerEventHandler; + +#include "initKeybinds.sqf" diff --git a/addons/dragging/anim/zDummy.rtm b/addons/dragging/anim/zDummy.rtm new file mode 100644 index 0000000000..dfeb7b7fcc Binary files /dev/null and b/addons/dragging/anim/zDummy.rtm differ diff --git a/addons/dragging/functions/fnc_canCarry.sqf b/addons/dragging/functions/fnc_canCarry.sqf index 2483903eef..dce4440a8e 100644 --- a/addons/dragging/functions/fnc_canCarry.sqf +++ b/addons/dragging/functions/fnc_canCarry.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 - * Check if unit can carry the object. Doesn't check weight. + * Author: commy2, Dystopian + * Checks if unit can carry the object. Doesn't check weight. * * Arguments: * 0: Unit that should do the carrying @@ -11,20 +11,36 @@ * Can the unit carry the object? * * Example: - * [player, cursorTarget] call ace_dragging_fnc_canCarry; + * [player, cursorTarget] call ace_dragging_fnc_canCarry * * Public: No */ params ["_unit", "_target"]; +if !(alive _target && {_target getVariable [QGVAR(canCarry), false]} && {isNull objectParent _target}) exitWith {false}; + if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; -//#2644 - Units with injured legs cannot bear the extra weight of carrying an object -//The fireman carry animation does not slow down for injured legs, so you could carry and run +// #2644 - Units with injured legs cannot bear the extra weight of carrying an object +// The fireman carry animation does not slow down for injured legs, so you could carry and run 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 (configOf _x >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; +// Static weapons need to be empty for carrying (ignore UAV AI) +if (_target isKindOf "StaticWeapon") exitWith { + (crew _target) findIf {getText (configOf _x >> "simulation") != "UAVPilot"} == -1 +}; -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})} +// Units need to be unconscious or limping; Units also need to not be in ragdoll, as that causes desync issues +if (_target isKindOf "CAManBase") exitWith { + !(alive _target != isAwake _target) && + {lifeState _target == "INCAPACITATED" || + {_target getHitPointDamage "HitLegs" >= 0.5}} +}; + +// Check max items for WeaponHolders +if (["WeaponHolder", "WeaponHolderSimulated"] findIf {_target isKindOf _x} != -1) exitWith { + (count (weaponCargo _target + magazineCargo _target + itemCargo _target)) <= MAX_DRAGGED_ITEMS +}; + +true // return diff --git a/addons/dragging/functions/fnc_canDrag.sqf b/addons/dragging/functions/fnc_canDrag.sqf index afc679e375..7083eec76b 100644 --- a/addons/dragging/functions/fnc_canDrag.sqf +++ b/addons/dragging/functions/fnc_canDrag.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 - * Check if unit can drag the object. Doesn't check weight. + * Author: commy2, Dystopian + * Checks if unit can drag the object. Doesn't check weight. * * Arguments: * 0: Unit that should do the dragging @@ -11,16 +11,32 @@ * Can the unit drag the object? * * Example: - * [player, cursorTarget] call ace_dragging_fnc_canDrag; + * [player, cursorTarget] call ace_dragging_fnc_canDrag * * Public: No */ params ["_unit", "_target"]; +if !(alive _target && {_target getVariable [QGVAR(canDrag), false]} && {isNull objectParent _target}) exitWith {false}; + if !([_unit, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; -// a static weapon has to be empty for dragging (ignore UAV AI) -if ((typeOf _target) isKindOf "StaticWeapon" && {{(getText (configOf _x >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; +// Static weapons need to be empty for dragging (ignore UAV AI) +if (_target isKindOf "StaticWeapon") exitWith { + (crew _target) findIf {getText (configOf _x >> "simulation") != "UAVPilot"} == -1 +}; -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})} +// Units need to be unconscious or limping; Units also need to not be in ragdoll, as that causes desync issues +if (_target isKindOf "CAManBase") exitWith { + !(alive _target != isAwake _target) && + {lifeState _target == "INCAPACITATED" || + {_target getHitPointDamage "HitLegs" >= 0.5}} +}; + +// Check max items for WeaponHolders +if (["WeaponHolder", "WeaponHolderSimulated"] findIf {_target isKindOf _x} != -1) exitWith { + (count (weaponCargo _target + magazineCargo _target + itemCargo _target)) <= MAX_DRAGGED_ITEMS +}; + +true // return diff --git a/addons/dragging/functions/fnc_canDrop.sqf b/addons/dragging/functions/fnc_canDrop.sqf index 2d42ae6244..9fa5a5b3e5 100644 --- a/addons/dragging/functions/fnc_canDrop.sqf +++ b/addons/dragging/functions/fnc_canDrop.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Check if unit can drop the object. + * Checks if unit can drop the dragged object. * * Arguments: - * 0: Unit that currently drags a object - * 1: Object that is dragged + * 0: Unit that is currently dragging an object + * 1: Object being dragged * * Return Value: * Can the unit drop the object? diff --git a/addons/dragging/functions/fnc_canDrop_carry.sqf b/addons/dragging/functions/fnc_canDrop_carry.sqf index 89be866ea6..8dd2ed528e 100644 --- a/addons/dragging/functions/fnc_canDrop_carry.sqf +++ b/addons/dragging/functions/fnc_canDrop_carry.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Check if unit can drop the carried object. + * Checks if unit can drop the carried object. * * Arguments: - * 0: Unit that currently carries a object - * 1: Object that is carried + * 0: Unit that is currently carrying an object + * 1: Object being carried * * Return Value: * Can the unit drop the object? diff --git a/addons/dragging/functions/fnc_canRun_carry.sqf b/addons/dragging/functions/fnc_canRun_carry.sqf new file mode 100644 index 0000000000..50fd9eb25d --- /dev/null +++ b/addons/dragging/functions/fnc_canRun_carry.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Check if weight can be carried while running + * + * Arguments: + * 0: Weight + * + * Return Value: + * Can the weight be carried while running? + * + * Example: + * [500] call ace_dragging_fnc_canRun_carry + * + * Public: No + */ + +params ["_weight"]; + +GVAR(allowRunWithLightweight) && {_weight <= GVAR(maxWeightCarryRun)} diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf index c819f20347..d1c5294144 100644 --- a/addons/dragging/functions/fnc_carryObject.sqf +++ b/addons/dragging/functions/fnc_carryObject.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Carry an object. + * Handles attaching and setting up a carried object. Called from ace_dragging_fnc_startCarryPFH. * * Arguments: * 0: Unit that should do the carrying @@ -19,63 +19,55 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// get attachTo offset and direction. - +// Get attachTo offset and direction private _position = _target getVariable [QGVAR(carryPosition), [0, 0, 0]]; private _direction = _target getVariable [QGVAR(carryDirection), 0]; -// handle objects vs persons +// Handle objects vs. persons if (_target isKindOf "CAManBase") then { - [_unit, "AcinPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); [_target, "AinjPfalMstpSnonWnonDf_carried_dead", 2] call EFUNC(common,doAnimation); - // attach person + // Attach person _target attachTo [_unit, _position, "LeftShoulder"]; - } else { - - // add height offset of model - private _offset = (_target modelToWorldVisual [0, 0, 0] select 2) - (_unit modelToWorldVisual [0, 0, 0] select 2); + // Add height offset of model + private _offset = ((_target modelToWorldVisual [0, 0, 0]) select 2) - ((_unit modelToWorldVisual [0, 0, 0]) select 2); _position = _position vectorAdd [0, 0, _offset]; - // attach object + // Attach object _target attachTo [_unit, _position]; - }; + [QEGVAR(common,setDir), [_target, _direction], _target] call CBA_fnc_targetEvent; _unit setVariable [QGVAR(isCarrying), true, true]; _unit setVariable [QGVAR(carriedObject), _target, true]; -// add drop action -_unit setVariable [QGVAR(ReleaseActionID), [ +// Add drop action +_unit setVariable [QGVAR(releaseActionID), [ _unit, "DefaultAction", {!isNull ((_this select 0) getVariable [QGVAR(carriedObject), objNull])}, - {[_this select 0, (_this select 0) getVariable [QGVAR(carriedObject), objNull]] call FUNC(dropObject_carry)} + {[_this select 0, (_this select 0) getVariable [QGVAR(carriedObject), objNull], true] call FUNC(dropObject_carry)} ] call EFUNC(common,addActionEventHandler)]; -// add anim changed EH +// Add anim changed EH [_unit, "AnimChanged", FUNC(handleAnimChanged), [_unit]] call CBA_fnc_addBISEventHandler; -// show mouse hint -if (_target isKindOf "CAManBase") then { - [localize LSTRING(Drop), "", ""] call EFUNC(interaction,showMouseHint); -} else { - [localize LSTRING(Drop), "", localize LSTRING(RaiseLowerRotate)] call EFUNC(interaction,showMouseHint); -}; - -// check everything +// Check everything [FUNC(carryObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; -// reset current dragging height. +// Reset current dragging height GVAR(currentHeightChange) = 0; -// prevent UAVs from firing +// Prevent UAVs from firing private _UAVCrew = _target call EFUNC(common,getVehicleUAVCrew); if (_UAVCrew isNotEqualTo []) then { - {_target deleteVehicleCrew _x} count _UAVCrew; + { + _target deleteVehicleCrew _x; + } forEach _UAVCrew; + _target setVariable [QGVAR(isUAV), true, true]; }; diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index 6204bbae62..932e30cf71 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -1,20 +1,20 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * PFH for Carry Object + * PFH for carrying an object. * * Arguments: - * 0: ARGS - * 0: Unit - * 1: Target - * 2: Start time + * 0: Arguments + * - 0: Unit + * - 1: Target + * - 2: Start time * 1: PFEH Id * * Return Value: * None * * Example: - * [[player, target], 20] call ace_dragging_fnc_carryObjectPFH; + * [[player, cursorTarget, CBA_missionTime], _idPFH] call ace_dragging_fnc_carryObjectPFH; * * Public: No */ @@ -28,17 +28,65 @@ _args params ["_unit", "_target", "_startTime"]; if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { TRACE_2("carry false",_unit,_target); - [_idPFH] call CBA_fnc_removePerFrameHandler; + + _unit setVariable [QGVAR(hint), nil]; + call EFUNC(interaction,hideMouseHint); + + _idPFH call CBA_fnc_removePerFrameHandler; }; -// drop if the crate is destroyed OR (target moved away from carrier (weapon disasembled)) -if (!alive _target || {_unit distance _target > 10}) then { +// Drop if the crate is destroyed OR target moved away from carrier (weapon disassembled) OR carrier starts limping +if !(alive _target && {_unit distance _target <= 10} && {_unit getHitPointDamage "HitLegs" < 0.5}) exitWith { 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 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) + // 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); }; + [_unit, _target] call FUNC(dropObject_carry); - [_idPFH] call CBA_fnc_removePerFrameHandler; + + _unit setVariable [QGVAR(hint), nil]; + call EFUNC(interaction,hideMouseHint); + + _idPFH call CBA_fnc_removePerFrameHandler; +}; + +private _previousHint = _unit getVariable [QGVAR(hint), []]; + +// If paused, don't show mouse button hints +if (_previousHint isEqualType "") exitWith {}; + +// Mouse hint +private _hintLMB = LLSTRING(Drop); +getCursorObjectParams params ["_cursorObject", "", "_distance"]; + +if ( + !isNull _cursorObject && + {_distance < MAX_LOAD_DISTANCE} && + {[_unit, _cursorObject, ["isNotCarrying"]] call EFUNC(common,canInteractWith)} && + { + if (_target isKindOf "CAManBase") then { + [_cursorObject, 0, true] call EFUNC(common,nearestVehiclesFreeSeat) isNotEqualTo [] + } else { + ["ace_cargo"] call EFUNC(common,isModLoaded) && + {[_target, _cursorObject] call EFUNC(cargo,canLoadItemIn)} + } + } +) then { + _hintLMB = LELSTRING(common,loadObject); +}; + +private _hintMMB = LLSTRING(RaiseLowerRotate); + +if (_target isKindOf "CAManBase") then { + _hintMMB = ""; +}; + +private _hint = [_hintLMB, "", _hintMMB]; + +if (_hint isNotEqualTo _previousHint) then { + _unit setVariable [QGVAR(hint), _hint]; + _hint call EFUNC(interaction,showMouseHint); }; diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf index 499bcc8b36..e6def58c34 100644 --- a/addons/dragging/functions/fnc_dragObject.sqf +++ b/addons/dragging/functions/fnc_dragObject.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Malbryn - * Drag an object. Called from ace_dragging_fnc_startDrag + * Handles attaching and setting up a dragged object. Called from ace_dragging_fnc_startDragPFH. * * Arguments: * 0: Unit that should do the dragging @@ -19,20 +19,24 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// get attachTo offset and direction. +// Get attachTo offset and direction. private _position = _target getVariable [QGVAR(dragPosition), [0, 0, 0]]; private _direction = _target getVariable [QGVAR(dragDirection), 0]; -// add height offset of model -private _offset = (_target modelToWorldVisual [0, 0, 0] select 2) - (_unit modelToWorldVisual [0, 0, 0] select 2); +// Add height offset of model +private _offset = ((_target modelToWorldVisual [0, 0, 0]) select 2) - ((_unit modelToWorldVisual [0, 0, 0]) select 2); + if (_target isKindOf "CAManBase") then { _offset = 0; }; + _position = _position vectorAdd [0, 0, _offset]; -// attach object +// Attach object TRACE_3("attaching",_position,_offset,_direction); + _target attachTo [_unit, _position]; + [QEGVAR(common,setDir), [_target, _direction], _target] call CBA_fnc_targetEvent; if (_target isKindOf "CAManBase") then { @@ -42,17 +46,17 @@ if (_target isKindOf "CAManBase") then { _unit setVariable [QGVAR(isDragging), true, true]; _unit setVariable [QGVAR(draggedObject), _target, true]; -// add drop action +// Add drop action GVAR(unit) = _unit; GVAR(releaseActionID) = [0xF1, [false, false, false], { [GVAR(unit), GVAR(unit) getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); }, "keydown", "", false, 0] call CBA_fnc_addKeyHandler; -// show mouse hint -["", localize LSTRING(Drop)] call EFUNC(interaction,showMouseHint); +// Show mouse hint +["", LLSTRING(Drop)] call EFUNC(interaction,showMouseHint); -// block firing +// Block firing if !(GVAR(dragAndFire)) then { _unit setVariable [QGVAR(blockFire), [ _unit, "DefaultAction", @@ -61,22 +65,25 @@ if !(GVAR(dragAndFire)) then { ] call EFUNC(common,addActionEventHandler)]; }; -// add anim changed EH +// Add anim changed EH [_unit, "AnimChanged", FUNC(handleAnimChanged), [_unit]] call CBA_fnc_addBISEventHandler; -// check everything +// Check everything [FUNC(dragObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; -// reset current dragging height. +// Reset current dragging height. GVAR(currentHeightChange) = 0; -// prevent UAVs from firing +// 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); +// Fixes not being able to move when in combat pace +[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); if (_UAVCrew isNotEqualTo []) then { - {_target deleteVehicleCrew _x} count _UAVCrew; + { + _target deleteVehicleCrew _x; + } forEach _UAVCrew; + _target setVariable [QGVAR(isUAV), true, true]; }; diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index a45a26ae89..4162f570ff 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -1,20 +1,20 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * PFH for Drag Object + * PFH for dragging an object. * * Arguments: - * 0: ARGS - * 0: Unit - * 1: Target - * 2: Start time + * 0: Arguments + * - 0: Unit + * - 1: Target + * - 2: Start time * 1: PFEH Id * * Return Value: * None * * Example: - * [[player, target], 20] call ace_dragging_fnc_dragObjectPFH; + * [[player, cursorTarget, CBA_missionTime], _idPFH] call ace_dragging_fnc_dragObjectPFH; * * Public: No */ @@ -28,17 +28,20 @@ _args params ["_unit", "_target", "_startTime"]; if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { TRACE_2("drag false",_unit,_target); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; }; -// drop if the crate is destroyed OR (target moved away from carrier (weapon disasembled)) +// Drop if the crate is destroyed OR (target moved away from carrier (weapon disasembled)) 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 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) + // 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); }; + [_unit, _target] call FUNC(dropObject); - [_idPFH] call CBA_fnc_removePerFrameHandler; + + _idPFH call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index 175c2bc4e8..59a3cf9eeb 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Malbryn - * Drop a dragged object. + * Drops a dragged object. * * Arguments: * 0: Unit that drags the other object @@ -19,26 +19,29 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// remove drop action -[GVAR(releaseActionID), "keydown"] call CBA_fnc_removeKeyHandler; +// Remove drop action +if (!isNil QGVAR(releaseActionID)) then { + [GVAR(releaseActionID), "keydown"] call CBA_fnc_removeKeyHandler; + GVAR(releaseActionID) = nil; +}; -// stop blocking +// Stop blocking if !(GVAR(dragAndFire)) then { [_unit, "DefaultAction", _unit getVariable [QGVAR(blockFire), -1]] call EFUNC(common,removeActionEventHandler); }; -private _inBuilding = [_unit] call FUNC(isObjectOnObject); +private _inBuilding = _unit call FUNC(isObjectOnObject); +// Play release animation if !(_unit getVariable ["ACE_isUnconscious", false]) then { - // play release animation [_unit, "released"] call EFUNC(common,doGesture); }; -// prevent collision damage +// Prevent collision damage [QEGVAR(common,fixCollision), _unit] call CBA_fnc_localEvent; [QEGVAR(common,fixCollision), _target, _target] call CBA_fnc_targetEvent; -// release object +// Release object detach _target; if (_target isKindOf "CAManBase") then { @@ -51,21 +54,21 @@ if (_target isKindOf "CAManBase") then { _unit removeWeapon "ACE_FakePrimaryWeapon"; -[_unit, "blockThrow", "ACE_dragging", false] call EFUNC(common,statusEffect_set); +[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); -// prevent object from flipping inside buildings +// Prevent object from flipping inside buildings if (_inBuilding) then { _target setPosASL (getPosASL _target vectorAdd [0, 0, 0.05]); TRACE_2("setPos",getPosASL _unit,getPosASL _target); }; -// hide mouse hint -[] call EFUNC(interaction,hideMouseHint); +// Hide mouse hint +call EFUNC(interaction,hideMouseHint); _unit setVariable [QGVAR(isDragging), false, true]; _unit setVariable [QGVAR(draggedObject), objNull, true]; -// make object accessible for other units +// Make object accessible for other units [objNull, _target, true] call EFUNC(common,claim); if !(_target isKindOf "CAManBase") then { @@ -77,17 +80,17 @@ if (_unit getVariable ["ACE_isUnconscious", false]) then { [_unit, "unconscious", 2] call EFUNC(common,doAnimation); }; -// recreate UAV crew +// Recreate UAV crew 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); +// Fixes not being able to move when in combat pace +[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); -// reset mass +// Reset mass private _mass = _target getVariable [QGVAR(originalMass), 0]; if (_mass != 0) then { - [QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // force global sync + [QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // Force global sync }; diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf index e0f4f4308b..b6033ed2b5 100644 --- a/addons/dragging/functions/fnc_dropObject_carry.sqf +++ b/addons/dragging/functions/fnc_dropObject_carry.sqf @@ -1,11 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Drop a carried object. + * Drops a carried object. * * Arguments: * 0: Unit that carries the other object * 1: Carried object to drop + * 2: Try loading object into vehicle (default: false) * * Return Value: * None @@ -16,22 +17,23 @@ * Public: No */ -params ["_unit", "_target"]; +params ["_unit", "_target", ["_tryLoad", false]]; TRACE_1("params",_this); -// remove drop action -[_unit, "DefaultAction", _unit getVariable [QGVAR(ReleaseActionID), -1]] call EFUNC(common,removeActionEventHandler); +// Remove drop action +[_unit, "DefaultAction", _unit getVariable [QGVAR(releaseActionID), -1]] call EFUNC(common,removeActionEventHandler); +_unit setVariable [QGVAR(releaseActionID), nil]; -private _inBuilding = [_unit] call FUNC(isObjectOnObject); +private _inBuilding = _unit call FUNC(isObjectOnObject); -// prevent collision damage +// Prevent collision damage [QEGVAR(common,fixCollision), _unit] call CBA_fnc_localEvent; [QEGVAR(common,fixCollision), _target, _target] call CBA_fnc_targetEvent; -// release object +// Release object detach _target; -// fix anim when aborting carrying persons +// Fix anim when aborting carrying persons if (_target isKindOf "CAManBase" || {animationState _unit in CARRY_ANIMATIONS}) then { if (vehicle _unit == _unit && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { [_unit, "", 2] call EFUNC(common,doAnimation); @@ -44,27 +46,30 @@ if (_target isKindOf "CAManBase" || {animationState _unit in CARRY_ANIMATIONS}) }; }; -// properly remove fake weapon +// Properly remove fake weapon _unit removeWeapon "ACE_FakePrimaryWeapon"; -// reselect weapon and re-enable sprint -_unit selectWeapon primaryWeapon _unit; +// Reselect weapon and re-enable sprint +private _previousWeaponIndex = _unit getVariable [QGVAR(previousWeapon), -1]; +_unit setVariable [QGVAR(previousWeapon), nil, true]; -[_unit, "forceWalk", "ACE_dragging", false] call EFUNC(common,statusEffect_set); -[_unit, "blockThrow", "ACE_dragging", false] call EFUNC(common,statusEffect_set); +if (_previousWeaponIndex != -1) then { + _unit action ["SwitchWeapon", _unit, _unit, _previousWeaponIndex]; +}; -// prevent object from flipping inside buildings +[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); +[_unit, "blockSprint", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); +[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); + +// Prevent object from flipping inside buildings if (_inBuilding) then { _target setPosASL (getPosASL _target vectorAdd [0, 0, 0.05]); }; -// hide mouse hint -[] call EFUNC(interaction,hideMouseHint); - _unit setVariable [QGVAR(isCarrying), false, true]; _unit setVariable [QGVAR(carriedObject), objNull, true]; -// make object accesable for other units +// Make object accessible for other units [objNull, _target, true] call EFUNC(common,claim); if !(_target isKindOf "CAManBase") then { @@ -72,17 +77,41 @@ if !(_target isKindOf "CAManBase") then { [QEGVAR(common,fixFloating), _target, _target] call CBA_fnc_targetEvent; }; -// recreate UAV crew +// Recreate UAV crew if (_target getVariable [QGVAR(isUAV), false]) then { createVehicleCrew _target; }; -// reset mass +// Reset mass private _mass = _target getVariable [QGVAR(originalMass), 0]; if (_mass != 0) then { - [QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // force global sync + [QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // Force global sync }; -// reset temp direction +// Reset temp direction _target setVariable [QGVAR(carryDirection_temp), nil]; + +private _cursorObject = cursorObject; + +// Try loading into vehicle +if (_tryLoad && {!isNull _cursorObject} && {[_unit, _cursorObject, ["isNotCarrying"]] call EFUNC(common,canInteractWith)}) then { + if (_target isKindOf "CAManBase") then { + private _vehicles = [_cursorObject, 0, true] call EFUNC(common,nearestVehiclesFreeSeat); + + if ([_cursorObject] isEqualTo _vehicles) then { + if (["ace_medical"] call EFUNC(common,isModLoaded)) then { + [_unit, _target, _cursorObject] call EFUNC(medical_treatment,loadUnit); + } else { + [_unit, _target, _cursorObject] call EFUNC(common,loadPerson); + }; + }; + } else { + if ( + ["ace_cargo"] call EFUNC(common,isModLoaded) && + {[_target, _cursorObject] call EFUNC(cargo,canLoadItemIn)} + ) then { + [_unit, _target, _cursorObject] call EFUNC(cargo,startLoadIn); + }; + }; +}; diff --git a/addons/dragging/functions/fnc_getWeight.sqf b/addons/dragging/functions/fnc_getWeight.sqf index c9d978cf7d..76346148c4 100644 --- a/addons/dragging/functions/fnc_getWeight.sqf +++ b/addons/dragging/functions/fnc_getWeight.sqf @@ -1,8 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * 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. + * Weight is calculated from the object's mass, its current inventory, and PhysX mass if applicable. * * Arguments: * 0: Object @@ -11,85 +11,29 @@ * Weight * * Example: - * [_object] call ace_dragging_fnc_getWeight + * [cursorTarget] call ace_dragging_fnc_getWeight * * Public: No */ params ["_object"]; -private _weight = 0; -private _cfgWeapons = configFile >> "CfgWeapons"; -private _cfgGlasses = configFile >> "CfgGlasses"; -private _cfgVehicles = configFile >> "CfgVehicles"; -private _cfgMagazines = configFile >> "CfgMagazines"; +private _weight = loadAbs _object; -// Add the masses of "regular" items in the object's inventory -// Handle separating CfgGlasses items from this cargo array -getItemCargo _object params ["_itemTypes", "_itemCounts"]; +if !(GVAR(skipContainerWeight)) then { + // Add the mass of the object itself + // getMass handles PhysX mass, this should be 0 for SupplyX containers and WeaponHolders + // Use originalMass in case we're checking weight for a carried object + _weight = _weight + ((_object getVariable [QGVAR(originalMass), getMass _object])); +}; +// Contents of backpacks get counted twice (https://github.com/acemod/ACE3/pull/8457#issuecomment-1062522447 and https://feedback.bistudio.com/T167469) +// This is a workaround until that is fixed on BI's end { - 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"]; - -{ - _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 - { - _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"); + _x params ["", "_container"]; + _weight = _weight - (loadAbs _container); +} forEach (everyContainer _object); // 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 +_weight * 0.5 // return diff --git a/addons/dragging/functions/fnc_handleAnimChanged.sqf b/addons/dragging/functions/fnc_handleAnimChanged.sqf index 7fa242ae16..24b8f58205 100644 --- a/addons/dragging/functions/fnc_handleAnimChanged.sqf +++ b/addons/dragging/functions/fnc_handleAnimChanged.sqf @@ -1,23 +1,21 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Handle the animaion for a Unit for Dragging Module + * Handle the animation for a unit for the dragging module. * * Arguments: * 0: Unit - * 1: animaion + * 1: Animaion * * Return Value: * None * * Example: - * [_unit, "amovpercmstpsnonwnondnon"] call ace_dragging_fnc_handleAnimChanged; + * [player, "amovpercmstpsnonwnondnon"] call ace_dragging_fnc_handleAnimChanged; * * Public: No */ -//IGNORE_PRIVATE_WARNING ["_thisArgs", "_thisID"]; // From CBA_fnc_addBISEventHandler; - params ["_unit", "_anim"]; _thisArgs params ["_realUnit"]; TRACE_4("params",_unit,_anim,_realUnit,_thisID); @@ -28,8 +26,7 @@ if (_unit != _realUnit) exitWith { }; if (_unit getVariable [QGVAR(isDragging), false]) then { - - // drop dragged object when not in valid animation + // Drop dragged object when not in valid animation if (!(_anim in DRAG_ANIMATIONS) && {!(_unit call EFUNC(common,isSwimming))}) then { private _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; @@ -39,10 +36,8 @@ if (_unit getVariable [QGVAR(isDragging), false]) then { }; }; } else { - if (_unit getVariable [QGVAR(isCarrying), false]) then { - - // drop carried object when not standing; also some exceptions when picking up crate + // Drop carried object when not standing; also some exceptions when picking up crate if (stance _unit != "STAND" && {_anim != "amovpercmstpsnonwnondnon"}) then { private _carriedObject = _unit getVariable [QGVAR(carriedObject), objNull]; diff --git a/addons/dragging/functions/fnc_handleKilled.sqf b/addons/dragging/functions/fnc_handleKilled.sqf index 672869d3c9..c38ed7dfbe 100644 --- a/addons/dragging/functions/fnc_handleKilled.sqf +++ b/addons/dragging/functions/fnc_handleKilled.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Handle death of the dragger + * Handle death of the dragger/carrier. * * Arguments: * 0: Unit @@ -10,7 +10,7 @@ * None * * Example: - * [_unit] call ace_dragging_fnc_handleKilled; + * [player] call ace_dragging_fnc_handleKilled; * * Public: No */ diff --git a/addons/dragging/functions/fnc_handlePlayerChanged.sqf b/addons/dragging/functions/fnc_handlePlayerChanged.sqf index a404660106..75370d36fe 100644 --- a/addons/dragging/functions/fnc_handlePlayerChanged.sqf +++ b/addons/dragging/functions/fnc_handlePlayerChanged.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Handle player changes. + * Handles player changes. * * Arguments: * 0: New Player Unit diff --git a/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf b/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf index beaed397e7..17b876f8f6 100644 --- a/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf +++ b/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Handle the Weapon Changed Event + * Handles the weapon changed event. * * Arguments: * 0: Unit @@ -11,7 +11,7 @@ * None * * Example: - * [_unit, "gun"] call ace_dragging_fnc_handlePlayerWeaponChanged; + * [player, primaryWeapon player] call ace_dragging_fnc_handlePlayerWeaponChanged; * * Public: No */ @@ -20,32 +20,25 @@ params ["_unit", "_weapon"]; TRACE_2("params",_unit,_weapon); if (_unit getVariable [QGVAR(isDragging), false]) then { - - // drop dragged object when changing weapon + // Drop dragged object when changing weapon if (_weapon != _unit getVariable [QGVAR(currentWeapon), ""]) then { private _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; [_unit, _draggedObject] call FUNC(dropObject); }; - }; if (_unit getVariable [QGVAR(isCarrying), false]) then { - private _carriedObject = _unit getVariable [QGVAR(carriedObject), objNull]; if (_carriedObject isKindOf "CAManBase") then { - if (_weapon != primaryWeapon _unit) then { [_unit, _carriedObject] call FUNC(dropObject_carry); }; - } else { - - // drop carried object when selecting any weapon + // Drop carried object when selecting any weapon if (_weapon != "") then { [_unit, _carriedObject] call FUNC(dropObject_carry); }; - }; }; diff --git a/addons/dragging/functions/fnc_handleScrollWheel.sqf b/addons/dragging/functions/fnc_handleScrollWheel.sqf index 04c2542b2f..8b522e34bc 100644 --- a/addons/dragging/functions/fnc_handleScrollWheel.sqf +++ b/addons/dragging/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: L-H, commy2 * Handles raising and lowering the dragged weapon to be able to place it on top of objects. @@ -24,13 +24,12 @@ if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith {false}; private _carriedItem = _unit getVariable [QGVAR(carriedObject), objNull]; -//disabled for persons +// Disabled for persons if (_carriedItem isKindOf "CAManBase") exitWith {false}; -if !(cba_events_control) then { - // raise/lower - - // move carried item 15 cm per scroll interval +if !(CBA_events_control) then { + // Raise/lower + // Move carried item 15 cm per scroll interval _scrollAmount = _scrollAmount * 0.15; private _position = getPosASL _carriedItem; @@ -38,7 +37,7 @@ if !(cba_events_control) then { _position set [2, ((_position select 2) + _scrollAmount min (_maxHeight + 1.5)) max _maxHeight]; - // move up/down object and reattach at current position + // Move up/down object and reattach at current position detach _carriedItem; // Uses this method of selecting position because setPosATL did not have immediate effect @@ -47,15 +46,15 @@ if !(cba_events_control) then { _selectionPosition = _selectionPosition vectorAdd _positionChange; _carriedItem attachTo [_unit, _selectionPosition]; - //reset the carry direction + // 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 - + // Rotate 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]; }; diff --git a/addons/dragging/functions/fnc_handleUnconscious.sqf b/addons/dragging/functions/fnc_handleUnconscious.sqf index fd3f95f95d..f79f7327ff 100644 --- a/addons/dragging/functions/fnc_handleUnconscious.sqf +++ b/addons/dragging/functions/fnc_handleUnconscious.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Handle the Unconscious of a Unit while Dragging + * Handles consciousness change of a unit while dragging / carrying. * * Arguments: * 0: Unit @@ -10,7 +10,7 @@ * None * * Example: - * [_unit] call ace_dragging_fnc_handleUnconscious; + * [player] call ace_dragging_fnc_handleUnconscious; * * Public: No */ @@ -20,30 +20,28 @@ params ["_unit"]; private _player = ACE_player; if (_player getVariable [QGVAR(isDragging), false]) then { - private _draggedObject = _player getVariable [QGVAR(draggedObject), objNull]; - // handle falling unconscious + // Handle falling unconscious if (_unit == _player) then { [_unit, _draggedObject] call FUNC(dropObject); }; - // handle waking up dragged unit + // Handle waking up dragged unit if (_unit == _draggedObject) then { [_player, _draggedObject] call FUNC(dropObject); }; }; if (_player getVariable [QGVAR(isCarrying), false]) then { - private _carriedObject = _player getVariable [QGVAR(carriedObject), objNull]; - // handle falling unconscious + // Handle falling unconscious if (_unit == _player) then { [_unit, _carriedObject] call FUNC(dropObject_carry); }; - // handle waking up dragged unit + // Handle waking up dragged unit if (_unit == _carriedObject) then { [_player, _carriedObject] call FUNC(dropObject_carry); }; diff --git a/addons/dragging/functions/fnc_initObject.sqf b/addons/dragging/functions/fnc_initObject.sqf index 054f016a67..a21a602634 100644 --- a/addons/dragging/functions/fnc_initObject.sqf +++ b/addons/dragging/functions/fnc_initObject.sqf @@ -1,16 +1,16 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Initialize variables for drag or carryable objects. Called from init EH. + * Initializes variables for draggable / carryable objects. Called from init EH. * * Arguments: - * 0: Any object + * 0: Object * * Return Value: * None * * Example: - * [box] call ace_dragging_fnc_initObject; + * [cursorTarget] call ace_dragging_fnc_initObject; * * Public: No */ @@ -22,13 +22,15 @@ private _config = configOf _object; if (getNumber (_config >> QGVAR(canDrag)) == 1) then { private _position = [_config >> QGVAR(dragPosition), "ARRAY", [0, 1.5, 0]] call CBA_fnc_getConfigEntry; private _direction = getNumber (_config >> QGVAR(dragDirection)); + private _ignoreWeight = getNumber (_config >> QGVAR(ignoreWeight)); - [_object, true, _position, _direction] call FUNC(setDraggable); + [_object, true, _position, _direction, _ignoreWeight > 0] call FUNC(setDraggable); }; if (getNumber (_config >> QGVAR(canCarry)) == 1) then { private _position = [_config >> QGVAR(carryPosition), "ARRAY", [0, 1, 1]] call CBA_fnc_getConfigEntry; private _direction = getNumber (_config >> QGVAR(carryDirection)); + private _ignoreWeight = getNumber (_config >> QGVAR(ignoreWeightCarry)); - [_object, true, _position, _direction] call FUNC(setCarryable); + [_object, true, _position, _direction, _ignoreWeight > 0] call FUNC(setCarryable); }; diff --git a/addons/dragging/functions/fnc_initPerson.sqf b/addons/dragging/functions/fnc_initPerson.sqf index c9365710dd..fd166cfab9 100644 --- a/addons/dragging/functions/fnc_initPerson.sqf +++ b/addons/dragging/functions/fnc_initPerson.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Initialize variables for drag or carryable persons. Called from init EH. + * Initialize variables for draggable / carryable persons. Called from init EH. * * Arguments: * 0: Unit @@ -17,5 +17,5 @@ params ["_unit"]; -[_unit, true, [0,1.1,0.092], 180] call FUNC(setDraggable); -[_unit, true, [0.4,-0.1,-1.25], 195] call FUNC(setCarryable); // hard-coded selection: "LeftShoulder" +[_unit, true, [0, 1.1, 0.092], 180] call FUNC(setDraggable); +[_unit, true, [0.4, -0.1, -1.25], 195] call FUNC(setCarryable); // Hard-coded selection: "LeftShoulder" diff --git a/addons/dragging/functions/fnc_isObjectOnObject.sqf b/addons/dragging/functions/fnc_isObjectOnObject.sqf index 00c2823e4a..16f169b8fe 100644 --- a/addons/dragging/functions/fnc_isObjectOnObject.sqf +++ b/addons/dragging/functions/fnc_isObjectOnObject.sqf @@ -1,15 +1,15 @@ /* * Author: commy2 - * Check if Object is Overlapping + * Checks if an object is overlapping another object. * * Arguments: * 0: Object * * Return Value: - * Boolean + * If object is overlapping another * * Example: - * [player] call ace_dragging_fnc_isObjectOnObject + * [player] call ace_dragging_fnc_isObjectOnObject; * * Public: No */ diff --git a/addons/dragging/functions/fnc_pauseCarry.sqf b/addons/dragging/functions/fnc_pauseCarry.sqf new file mode 100644 index 0000000000..bfe27420f6 --- /dev/null +++ b/addons/dragging/functions/fnc_pauseCarry.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Removes user input affecting dragging. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * player call ace_dragging_fnc_pauseCarry; + * + * Public: No + */ + +params ["_unit"]; + +// If not carrying, don't do anything +if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith {}; + +private _actionID = _unit getVariable QGVAR(releaseActionID); + +// If action has already been removed, don't remove it again +if (isNil "_actionID") exitWith {}; + +// Remove drop action +[_unit, "DefaultAction", _actionID] call EFUNC(common,removeActionEventHandler); +_unit setVariable [QGVAR(releaseActionID), nil]; + +// Hide mouse hint +_unit setVariable [QGVAR(hint), "paused"]; +call EFUNC(interaction,hideMouseHint); diff --git a/addons/dragging/functions/fnc_pauseDrag.sqf b/addons/dragging/functions/fnc_pauseDrag.sqf new file mode 100644 index 0000000000..a06153bf44 --- /dev/null +++ b/addons/dragging/functions/fnc_pauseDrag.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Removes user input affecting dragging. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * player call ace_dragging_fnc_pauseDrag; + * + * Public: No + */ + +params ["_unit"]; + +// If not dragging, don't do anything +if !(_unit getVariable [QGVAR(isDragging), false]) exitWith {}; + +// If action has already been removed, don't remove it again +if (isNil QGVAR(releaseActionID)) exitWith {}; + +// Remove drop action +[GVAR(releaseActionID), "keydown"] call CBA_fnc_removeKeyHandler; +GVAR(releaseActionID) = nil; + +// Hide mouse hint +call EFUNC(interaction,hideMouseHint); diff --git a/addons/dragging/functions/fnc_resumeCarry.sqf b/addons/dragging/functions/fnc_resumeCarry.sqf new file mode 100644 index 0000000000..233d60e298 --- /dev/null +++ b/addons/dragging/functions/fnc_resumeCarry.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Adds user input affecting carrying back. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * player call ace_dragging_fnc_resumeCarry; + * + * Public: No + */ + +params ["_unit"]; + +// If not dragging, don't do anything +if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith {}; + +// If action is already present, don't add it again +if (!isNil {_unit getVariable QGVAR(releaseActionID)}) exitWith {}; + +// Remove drop action +_unit setVariable [QGVAR(releaseActionID), [ + _unit, "DefaultAction", + {!isNull ((_this select 0) getVariable [QGVAR(carriedObject), objNull])}, + {[_this select 0, (_this select 0) getVariable [QGVAR(carriedObject), objNull], true] call FUNC(dropObject_carry)} +] call EFUNC(common,addActionEventHandler)]; + +// Show mouse hint (done in FUNC(carryObjectPFH)) +_unit setVariable [QGVAR(hint), nil]; diff --git a/addons/dragging/functions/fnc_resumeDrag.sqf b/addons/dragging/functions/fnc_resumeDrag.sqf new file mode 100644 index 0000000000..d0fea988fb --- /dev/null +++ b/addons/dragging/functions/fnc_resumeDrag.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" +/* + * Author: johnb43 + * Adds user input affecting dragging back. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * player call ace_dragging_fnc_resumeDrag; + * + * Public: No + */ + +params ["_unit"]; + +// If not dragging, don't do anything +if !(_unit getVariable [QGVAR(isDragging), false]) exitWith {}; + +// If action is already present, don't add it again +if (!isNil QGVAR(releaseActionID)) exitWith {}; + +// Add drop action +GVAR(releaseActionID) = [0xF1, [false, false, false], { + [GVAR(unit), GVAR(unit) getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); +}, "keydown", "", false, 0] call CBA_fnc_addKeyHandler; + +// Show mouse hint +["", LLSTRING(Drop)] call EFUNC(interaction,showMouseHint); diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf index 6ec0abb466..0348bd0483 100644 --- a/addons/dragging/functions/fnc_setCarryable.sqf +++ b/addons/dragging/functions/fnc_setCarryable.sqf @@ -1,55 +1,63 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, PiZZADOX - * Enable the object to be carried. + * Enables the object to be carried. * * Arguments: - * 0: Any object - * 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) + * 0: Object + * 1: True to enable carrying, false to disable + * 2: Position offset for attachTo command (default: [0, 1, 1]) + * 3: Direction in degrees to rotate the object after attachTo (default: 0) + * 4: Override weight limit (default: false) * * Return Value: * None * * Example: - * [object, true, [0,1,1], 0, false] call ace_dragging_fnc_setCarryable; + * [cursorTarget, true, [0, 1, 1], 0, false] call ace_dragging_fnc_setCarryable; * * Public: Yes */ -//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]]; + _position = _object getVariable [QGVAR(carryPosition), [0, 1, 1]]; }; if (isNil "_direction") then { _direction = _object getVariable [QGVAR(carryDirection), 0]; }; -// update variables +// Update variables _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 +// Add action to class if it is not already present private _type = typeOf _object; private _initializedClasses = GETGVAR(initializedClasses_carry,[]); -// do nothing if the class is already initialized +// Do nothing if the class is already initialized if (_type in _initializedClasses) exitWith {}; _initializedClasses pushBack _type; GVAR(initializedClasses_carry) = _initializedClasses; +[_type, "ContainerClosed", { + params ["_object"]; + private _owner = _object getVariable [QEGVAR(common,owner), objNull]; + TRACE_2("ContainerClosed-carry",_object,_owner); + if (isNull _owner) exitWith {}; + if (_object isNotEqualTo (_owner getVariable [QGVAR(carriedObject), objNull])) exitWith {}; + [QGVAR(carryingContainerClosed), [_object, _owner], _owner] call CBA_fnc_targetEvent; +}, false] call CBA_fnc_addClassEventHandler; + private _icon = [QUOTE(PATHTOF(UI\icons\box_carry.paa)), QUOTE(PATHTOF(UI\icons\person_carry.paa))] select (_object isKindOf "Man"); -private _carryAction = [QGVAR(carry), localize LSTRING(Carry), _icon, {[_player, _target] call FUNC(startCarry)}, {[_player, _target] call FUNC(canCarry)}] call EFUNC(interact_menu,createAction); -private _dropAction = [QGVAR(drop_carry), localize LSTRING(Drop), "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}] call EFUNC(interact_menu,createAction); +private _carryAction = [QGVAR(carry), LLSTRING(Carry), _icon, {[_player, _target] call FUNC(startCarry)}, {[_player, _target] call FUNC(canCarry)}] call EFUNC(interact_menu,createAction); +private _dropAction = [QGVAR(drop_carry), LLSTRING(Drop), "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}] call EFUNC(interact_menu,createAction); [_type, 0, ["ACE_MainActions"], _carryAction] call EFUNC(interact_menu,addActionToClass); [_type, 0, [], _dropAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf index 99729ebd63..d2adba1a61 100644 --- a/addons/dragging/functions/fnc_setDraggable.sqf +++ b/addons/dragging/functions/fnc_setDraggable.sqf @@ -1,25 +1,24 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, PiZZADOX - * Enable the object to be dragged. + * Enables the object to be dragged. * * Arguments: - * 0: Any object - * 1: true to enable dragging, false to disable + * 0: Object + * 1: True to enable dragging, false to disable * 2: Position offset for attachTo command (optional; default: [0, 1.5, 0]) - * 3: Direction in degree to rotate the object after attachTo (optional; default: 0) - * 4: Override weight limit (optional; default: false) + * 3: Direction in degrees to rotate the object after attachTo (optional; default: 0) + * 4: Override weight limit (default: false) * * Return Value: * None * * Example: - * [object, true, [0,0,0], 0, false] call ace_dragging_fnc_setDraggable; + * [cursorTarget, true, [0, 0, 0], 0, false] call ace_dragging_fnc_setDraggable; * * Public: Yes */ -//IGNORE_PRIVATE_WARNING ["_player", "_target"]; params ["_object", "_enableDrag", "_position", "_direction", ["_ignoreWeightDrag", false, [false]]]; if (isNil "_position") then { @@ -30,26 +29,36 @@ if (isNil "_direction") then { _direction = _object getVariable [QGVAR(dragDirection), 0]; }; -// update variables +// Update variables _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 +// Add action to class if it is not already present private _type = typeOf _object; private _initializedClasses = GETGVAR(initializedClasses,[]); -// do nothing if the class is already initialized +// Do nothing if the class is already initialized if (_type in _initializedClasses) exitWith {}; _initializedClasses pushBack _type; GVAR(initializedClasses) = _initializedClasses; +[_type, "ContainerClosed", { + params ["_object"]; + private _owner = _object getVariable [QEGVAR(common,owner), objNull]; + TRACE_2("ContainerClosed-drag",_object,_owner); + if (isNull _owner) exitWith {}; + if (_object isNotEqualTo (_owner getVariable [QGVAR(draggedObject), objNull])) exitWith {}; + [QGVAR(draggingContainerClosed), [_object, _owner], _owner] call CBA_fnc_targetEvent; +}, false] call CBA_fnc_addClassEventHandler; + + private _icon = [QUOTE(PATHTOF(UI\icons\box_drag.paa)), QUOTE(PATHTOF(UI\icons\person_drag.paa))] select (_object isKindOf "Man"); -private _dragAction = [QGVAR(drag), localize LSTRING(Drag), _icon, {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}] call EFUNC(interact_menu,createAction); -private _dropAction = [QGVAR(drop), localize LSTRING(Drop), "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}] call EFUNC(interact_menu,createAction); +private _dragAction = [QGVAR(drag), LLSTRING(Drag), _icon, {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}] call EFUNC(interact_menu,createAction); +private _dropAction = [QGVAR(drop), LLSTRING(Drop), "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}] call EFUNC(interact_menu,createAction); [_type, 0, ["ACE_MainActions"], _dragAction] call EFUNC(interact_menu,addActionToClass); [_type, 0, [], _dropAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf index 335e421bb2..040b701f71 100644 --- a/addons/dragging/functions/fnc_startCarry.sqf +++ b/addons/dragging/functions/fnc_startCarry.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, PiZZADOX - * Start the carrying process. + * Starts the carrying process. * * Arguments: * 0: Unit that should do the carrying @@ -19,65 +19,74 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// 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); +// Exempt from weight check if object has override variable set +private _weight = 0; + +if !(_target getVariable [QGVAR(ignoreWeightCarry), false]) then { + _weight = _target call FUNC(getWeight); +}; + +// Exit if object weight is over global var value +if (_weight > GETMVAR(ACE_maxWeightCarry,1E11)) exitWith { + [LLSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; private _timer = CBA_missionTime + 5; -// handle objects vs persons +// Handle objects vs. persons if (_target isKindOf "CAManBase") then { + private _primaryWeapon = primaryWeapon _unit; - // add a primary weapon if the unit has none. - if (primaryWeapon _unit isEqualto "") then { + // Add a primary weapon if the unit has none + if (_primaryWeapon == "") then { _unit addWeapon "ACE_FakePrimaryWeapon"; + _primaryWeapon = "ACE_FakePrimaryWeapon"; }; - // select primary, otherwise the drag animation actions don't work. - _unit selectWeapon primaryWeapon _unit; + // Select primary, otherwise the drag animation actions don't work + _unit selectWeapon _primaryWeapon; - // move a bit closer and adjust direction when trying to pick up a person - _target setDir (getDir _unit + 180); + // Move a bit closer and adjust direction when trying to pick up a person + [QEGVAR(common,setDir), [_target, getDir _unit + 180], _target] call CBA_fnc_targetEvent; _target setPosASL (getPosASL _unit vectorAdd (vectorDir _unit)); [_unit, "AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon", 2] call EFUNC(common,doAnimation); [_target, "AinjPfalMstpSnonWrflDnon_carried_Up", 2] call EFUNC(common,doAnimation); _timer = CBA_missionTime + 10; - } else { + // Select no weapon and stop sprinting + private _previousWeaponIndex = [_unit] call EFUNC(common,getFiremodeIndex); + _unit setVariable [QGVAR(previousWeapon), _previousWeaponIndex, true]; - // select no weapon and stop sprinting _unit action ["SwitchWeapon", _unit, _unit, 299]; + [_unit, "AmovPercMstpSnonWnonDnon", 0] call EFUNC(common,doAnimation); - [_unit, "forceWalk", "ACE_dragging", true] call EFUNC(common,statusEffect_set); + private _canRun = _weight call FUNC(canRun_carry); + // Only force walking if we're overweight + [_unit, "forceWalk", QUOTE(ADDON), !_canRun] call EFUNC(common,statusEffect_set); + [_unit, "blockSprint", QUOTE(ADDON), _canRun] call EFUNC(common,statusEffect_set); }; -[_unit, "blockThrow", "ACE_dragging", true] call EFUNC(common,statusEffect_set); +[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); -// prevent multiple players from accessing the same object +// Prevent multiple players from accessing the same object [_unit, _target, true] call EFUNC(common,claim); - -// prevents draging and carrying at the same time +// Prevents dragging and carrying at the same time _unit setVariable [QGVAR(isCarrying), true, true]; -// required for aborting animation +// Required for aborting animation _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 +// 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]] call CBA_fnc_globalEvent; // force global sync + [QEGVAR(common,setMass), [_target, 1e-12]] call CBA_fnc_globalEvent; // Force global sync }; diff --git a/addons/dragging/functions/fnc_startCarryPFH.sqf b/addons/dragging/functions/fnc_startCarryPFH.sqf index f2c5cfb5d2..ca34275a2c 100644 --- a/addons/dragging/functions/fnc_startCarryPFH.sqf +++ b/addons/dragging/functions/fnc_startCarryPFH.sqf @@ -1,20 +1,20 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Carry PFH + * Checks for carrying conditions. If these are met, the unit will start carrying. Called from ace_dragging_fnc_startCarry. * * Arguments: - * 0: ARGS - * 0: Unit - * 1: Target - * 2: Timeout + * 0: Arguments + * - 0: Unit + * - 1: Target + * - 2: Timeout * 1: PFEH Id * * Return Value: * None * * Example: - * [[player, target, 100], 20] call ace_dragging_fnc_startCarryPFH; + * [[player, cursorTarget, 10], _idPFH] call ace_dragging_fnc_startCarryPFH; * * Public: No */ @@ -26,42 +26,44 @@ params ["_args", "_idPFH"]; _args params ["_unit", "_target", "_timeOut"]; -// handle aborting carry +// Handle aborting carry if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { TRACE_4("carry false",_unit,_target,_timeOut,CBA_missionTime); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; }; -// same as dragObjectPFH, checks if object is deleted or dead OR (target moved away from carrier (weapon disasembled)) +// 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_carry); - [_idPFH] call CBA_fnc_removePerFrameHandler; + + _idPFH call CBA_fnc_removePerFrameHandler; }; -// handle persons vs objects +// Handle persons vs. objects if (_target isKindOf "CAManBase") then { + // Drop if in timeout if (CBA_missionTime > _timeOut) exitWith { TRACE_4("Start carry person",_unit,_target,_timeOut,CBA_missionTime); [_unit, _target] call FUNC(carryObject); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; }; } else { + // Drop if in timeout if (CBA_missionTime > _timeOut) exitWith { TRACE_4("timeout",_unit,_target,_timeOut,CBA_missionTime); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; - // drop if in timeout private _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; [_unit, _draggedObject] call FUNC(dropObject_carry); }; - // wait for the unit to stand up - if (stance _unit isEqualto "STAND") exitWith { + // Wait for the unit to stand up + if (stance _unit == "STAND") exitWith { TRACE_4("Start carry object",_unit,_target,_timeOut,CBA_missionTime); [_unit, _target] call FUNC(carryObject); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; }; }; diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index 31159a2b62..cd298804e6 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, PiZZADOX, Malbryn - * Start the dragging process. + * Starts the dragging process. * * Arguments: * 0: Unit that should do the dragging @@ -19,36 +19,43 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); -// 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); +// Exempt from weight check if object has override variable set +private _weight = 0; + +if !(_target getVariable [QGVAR(ignoreWeightDrag), false]) then { + _weight = _target call FUNC(getWeight); }; +// Exit if object weight is over global var value +if (_weight > GETMVAR(ACE_maxWeightDrag,1E11)) exitWith { + [LLSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); +}; + +private _primaryWeapon = primaryWeapon _unit; + // Add a primary weapon if the unit has none if !(GVAR(dragAndFire)) then { - if (primaryWeapon _unit isEqualto "") then { + if (_primaryWeapon == "") then { _unit addWeapon "ACE_FakePrimaryWeapon"; - _unit selectWeapon primaryWeapon _unit; - } else { - _unit selectWeapon primaryWeapon _unit; + _primaryWeapon = "ACE_FakePrimaryWeapon"; }; + + _unit selectWeapon _primaryWeapon; } else { // Making sure the unit is holding a primary weapon or handgun - if !(currentWeapon _unit in [primaryWeapon _unit, handgunWeapon _unit]) then { - if (primaryWeapon _unit != "") then { + private _handgunWeapon = handgunWeapon _unit; + + if !(currentWeapon _unit in [_primaryWeapon, _handgunWeapon]) then { + if (_primaryWeapon != "") then { // Use primary if possible - _unit selectWeapon primaryWeapon _unit; + _unit selectWeapon _primaryWeapon; } else { - if (handgunWeapon _unit != "") then { + if (_handgunWeapon != "") then { // Use pistol if unit has no primary - _unit selectWeapon handgunWeapon _unit; + _unit selectWeapon _handgunWeapon; } else { // Add fake weapon if no weapons besides launcher are available _unit addWeapon "ACE_FakePrimaryWeapon"; - _unit selectWeapon primaryWeapon _unit; + _unit selectWeapon "ACE_FakePrimaryWeapon"; }; }; }; @@ -57,12 +64,12 @@ if !(GVAR(dragAndFire)) then { // Save the weapon so we can monitor if it changes _unit setVariable [QGVAR(currentWeapon), currentWeapon _unit]; -[_unit, "blockThrow", "ACE_dragging", true] call EFUNC(common,statusEffect_set); +[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); -// prevent multiple players from accessing the same object +// Prevent multiple players from accessing the same object [_unit, _target, true] call EFUNC(common,claim); -// can't play action that depends on weapon if it was added the same frame +// Can't play action that depends on weapon if it was added the same frame if !(_unit call EFUNC(common,isSwimming)) then { [{ private _unitWeapon = _this getVariable [QGVAR(currentWeapon), ""]; @@ -75,23 +82,23 @@ if !(_unit call EFUNC(common,isSwimming)) then { }, _unit] call CBA_fnc_execNextFrame; }; -// move a bit closer and adjust direction when trying to pick up a person +// Move a bit closer and adjust direction when trying to pick up a person if (_target isKindOf "CAManBase") then { - _target setDir (getDir _unit + 180); + [QEGVAR(common,setDir), [_target, getDir _unit + 180], _target] call CBA_fnc_targetEvent; _target setPosASL (getPosASL _unit vectorAdd (vectorDir _unit vectorMultiply 1.5)); [_target, "AinjPpneMrunSnonWnonDb_grab", 2] call EFUNC(common,doAnimation); }; -// prevents draging and carrying at the same time +// Prevents dragging and carrying at the same time _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 +// 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]] call CBA_fnc_globalEvent; // force global sync + [QEGVAR(common,setMass), [_target, 1e-12]] call CBA_fnc_globalEvent; // Force global sync }; diff --git a/addons/dragging/functions/fnc_startDragPFH.sqf b/addons/dragging/functions/fnc_startDragPFH.sqf index 614b6a8741..07dfe2064f 100644 --- a/addons/dragging/functions/fnc_startDragPFH.sqf +++ b/addons/dragging/functions/fnc_startDragPFH.sqf @@ -1,20 +1,20 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Drag PFH + * Checks for dragging conditions. If these are met, the unit will start dragging. Called from ace_dragging_fnc_startDrag. * * Arguments: - * 0: ARGS - * 0: Unit - * 1: Target - * 2: Timeout + * 0: Arguments + * - 0: Unit + * - 1: Target + * - 2: Timeout * 1: PFEH Id * * Return Value: * None * * Example: - * [[player, target, 100], 20] call ace_dragging_fnc_startDragPFH; + * [[player, cursorTarget, 10], _idPFH] call ace_dragging_fnc_startDragPFH; * * Public: No */ @@ -26,33 +26,34 @@ params ["_args", "_idPFH"]; _args params ["_unit", "_target", "_timeOut"]; -// handle aborting drag +// Handle aborting drag if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { TRACE_4("drag false",_unit,_target,_timeOut,CBA_missionTime); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; }; -// same as dragObjectPFH, checks if object is deleted or dead OR (target moved away from carrier (weapon disasembled)) +// Same as dragObjectPFH, checks if object is deleted, dead or target moved away from carrier (e.g. weapon disassembled) if (!alive _target || {_unit distance _target > 10}) then { TRACE_4("dead/distance",_unit,_target,_timeOut,CBA_missionTime); [_unit, _target] call FUNC(dropObject); - [_idPFH] call CBA_fnc_removePerFrameHandler; + + _idPFH call CBA_fnc_removePerFrameHandler; }; -// timeout. Do nothing. Quit. CBA_missionTime, because anim length is linked to ingame time. +// Timeout: Do nothing, quit. CBA_missionTime, because anim length is linked to ingame time if (CBA_missionTime > _timeOut) exitWith { TRACE_4("timeout",_unit,_target,_timeOut,CBA_missionTime); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; - // drop if in timeout + // Drop if in timeout private _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; [_unit, _draggedObject] call FUNC(dropObject); }; -// unit is ready to start dragging +// Unit is ready to start dragging if (animationState _unit in DRAG_ANIMATIONS || {_unit call EFUNC(common,isSwimming)}) exitWith { TRACE_4("Start Dragging",_unit,_target,_timeOut,CBA_missionTime); [_unit, _target] call FUNC(dragObject); - [_idPFH] call CBA_fnc_removePerFrameHandler; + _idPFH call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/dragging/functions/script_component.hpp b/addons/dragging/functions/script_component.hpp deleted file mode 100644 index 9d257a69d3..0000000000 --- a/addons/dragging/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\dragging\script_component.hpp" \ No newline at end of file diff --git a/addons/dragging/initKeybinds.sqf b/addons/dragging/initKeybinds.sqf new file mode 100644 index 0000000000..8ee36d0283 --- /dev/null +++ b/addons/dragging/initKeybinds.sqf @@ -0,0 +1,58 @@ +// Add Keybinds +["ACE3 Common", QGVAR(drag), LLSTRING(DragKeybind), { + private _player = ACE_player; + + if (!alive _player) exitWith {false}; + if !([_player, objNull, ["isNotDragging", "isNotCarrying", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; + + // If we are drag/carrying something right now then just drop it: + if (_player getVariable [QGVAR(isDragging), false]) exitWith { + [_player, _player getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); + + false + }; + + if (_player getVariable [QGVAR(isCarrying), false]) exitWith { + [_player, _player getVariable [QGVAR(carriedObject), objNull]] call FUNC(dropObject_carry); + + false + }; + + private _cursorObject = cursorObject; + + if (isNull _cursorObject || {(_cursorObject distance _player) > 2.6}) exitWith {false}; + if !([_player, _cursorObject] call FUNC(canDrag)) exitWith {false}; + + [_player, _cursorObject] call FUNC(startDrag); + + false +}, {}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND + +["ACE3 Common", QGVAR(carry), LLSTRING(CarryKeybind), { + private _player = ACE_player; + + if (!alive _player) exitWith {false}; + if !([_player, objNull, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith {false}; + + // If we are drag/carrying something right now then just drop it: + if (_player getVariable [QGVAR(isDragging), false]) exitWith { + [_player, _player getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); + + false + }; + + if (_player getVariable [QGVAR(isCarrying), false]) exitWith { + [_player, _player getVariable [QGVAR(carriedObject), objNull], true] call FUNC(dropObject_carry); + + false + }; + + private _cursorObject = cursorObject; + + if (isNull _cursorObject || {(_cursorObject distance _player) > 2.6}) exitWith {false}; + if !([_player, _cursorObject] call FUNC(canCarry)) exitWith {false}; + + [_player, _cursorObject] call FUNC(startCarry); + + false +}, {}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND diff --git a/addons/dragging/initSettings.sqf b/addons/dragging/initSettings.sqf index b33dbab3f7..a3e444e29c 100644 --- a/addons/dragging/initSettings.sqf +++ b/addons/dragging/initSettings.sqf @@ -2,7 +2,24 @@ QGVAR(dragAndFire), "CHECKBOX", [LSTRING(DragAndFire_DisplayName), LSTRING(DragAndFire_Description)], + LLSTRING(SettingsName), + true +] call CBA_fnc_addSetting; + +[ + QGVAR(allowRunWithLightweight), + "CHECKBOX", + [LSTRING(allowRunWithLightweight_DisplayName), LSTRING(allowRunWithLightweight_Description)], localize LSTRING(SettingsName), true, - false + true +] call CBA_fnc_addSetting; + +[ + QGVAR(skipContainerWeight), + "CHECKBOX", + [LSTRING(skipContainerWeight_DisplayName), LSTRING(skipContainerWeight_Description)], + localize LSTRING(SettingsName), + false, + true ] call CBA_fnc_addSetting; diff --git a/addons/dragging/script_component.hpp b/addons/dragging/script_component.hpp index 12ed8efff3..195edabe3a 100644 --- a/addons/dragging/script_component.hpp +++ b/addons/dragging/script_component.hpp @@ -16,5 +16,9 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define DRAG_ANIMATIONS ["amovpercmstpslowwrfldnon_acinpknlmwlkslowwrfldb_2", "amovpercmstpsraswpstdnon_acinpknlmwlksnonwpstdb_2", "amovpercmstpsnonwnondnon_acinpknlmwlksnonwnondb_2", "acinpknlmstpsraswrfldnon", "acinpknlmstpsnonwpstdnon", "acinpknlmstpsnonwnondnon", "acinpknlmwlksraswrfldb", "acinpknlmwlksnonwnondb", "ace_dragging", "ace_dragging_static", "ace_dragging_drop"] +#define MAX_LOAD_DISTANCE 5 + +#define DRAG_ANIMATIONS ["amovpercmstpslowwrfldnon_acinpknlmwlkslowwrfldb_2", "amovpercmstpsraswpstdnon_acinpknlmwlksnonwpstdb_2", "amovpercmstpsnonwnondnon_acinpknlmwlksnonwnondb_2", "acinpknlmstpsraswrfldnon", "acinpknlmstpsnonwpstdnon", "acinpknlmstpsnonwnondnon", "acinpknlmwlksraswrfldb", "acinpknlmwlksnonwnondb", "ace_dragging_rifle_limpb", "ace_dragging", "ace_dragging_limpb", "ace_dragging_static", "ace_dragging_drop"] #define CARRY_ANIMATIONS ["acinpercmstpsnonwnondnon", "acinpknlmstpsnonwnondnon_acinpercmrunsnonwnondnon"] + +#define MAX_DRAGGED_ITEMS 3 diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index dccc758a5d..5c54e87288 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -15,7 +15,7 @@ 引きずる 끌기 拖拉 - 拖拉 + 拖动 Sürükle @@ -37,7 +37,7 @@ Drag/Release Object - Тащить/Отпустить Объект + Тащить/отпустить объект Arrastrar/Soltar Objeto Ciągnij/Puść Obiekt Táhnout/Položit Objekt @@ -49,17 +49,20 @@ オブジェクトを引きずる/離す 물건 끌기/놓기 拖拉/放開物品 - 拖拉/放开物品 + 拖动/放开物品 Objeyi Sürükle/Bırak Carry/Release Object Porter/Lâcher un objet - Нести/Отпустить Объект + Нести/отпустить объект Nieś/Puść objekt オブジェクトを運ぶ/離す Objeyi Taşı/Bırak Arrastrar/Soltar Objeto + Objekt tragen/loslassen + 背负/释放物体 + 물건 업기/놓기 Item too heavy @@ -101,10 +104,12 @@ Lever/Baisser | (Ctrl + Scroll) Rotation 上げる/下げる | (Ctrl + スクロール) 回転 Zvednout/Snížit | (Ctrl + Kolečko myši) Otáčet - Поднять/Опустить | (Ctrl + Скролл) Крутить + Поднять/опустить | (Ctrl + Скролл) Крутить Wyżej/niżej | (Ctrl + Kółko myszy) obracanie Yükselt/Alçalt | (Ctrl + Tekerlek) Döndür Subir/Bajar | (Ctrl + Scroll) Rotar + 抬起/放低 |(Ctrl + 鼠标滚轮)旋转 + 높이기/내리기 | (컨트롤 + 스크롤) 회전 ACE Dragging @@ -115,6 +120,8 @@ ACE Arrastrar ACE Przeciąganie ACE ドラッグ + ACE 拖曳 + ACE 끌기 Allow firing while dragging @@ -125,6 +132,8 @@ Permitir disparar mientras se arrastra Pozwól na strzelanie podczas przeciągania 搬送中に射撃許可 + 允许在拖动时开火 + 사격 중 끌기 가능하게 하기 Allow the player to fire their gun while dragging. @@ -135,6 +144,32 @@ Permite al jugador disparar mientras está arrastrando. Pozwala graczom strzelać z broni podczas przeciągania obiektów. プレイヤーが引きずっている最中でも射撃できるようにします。 + 允许玩家在拖动时开火。 + 플레이어가 무기를 끄는 동안에 무기를 사용할 수 있게합니다. + + + Allow Running with Lightweight Objects + 軽量物を持って走れるようにする + Zezwól na Bieganie z Lekkimi Obiektami + Erlauben das Sprinten mit leichten Gegenständen + + + Allow the player to run when carrying lightweight objects. + プレイヤーが軽量オブジェクトを持ち運んでいるときに走れるようにする。 + Zezwalaj graczowi na bieganie podczas przenoszenia lekkich przedmiotów. + Erlauben Sie dem Spieler, zu rennen, wenn er leichte Gegenstände trägt. + + + Skip Object Weight + オブジェクトの重量を無視 + Pomiń Wagę Obiektu + Objektgewicht überspringen + + + Determines whether object's weight is added onto weight calculations. + 重量計算にオブジェクトの重量を追加するかどうかを決定します。 + Określa, czy waga obiektu jest dodawana do obliczeń ciężaru. + Legt fest, ob das Gewicht des Objekts zu den Gewichtsberechnungen hinzugefügt wird. diff --git a/addons/dragon/CfgAmmo.hpp b/addons/dragon/CfgAmmo.hpp index 09858b4fff..f736e8451b 100644 --- a/addons/dragon/CfgAmmo.hpp +++ b/addons/dragon/CfgAmmo.hpp @@ -34,7 +34,7 @@ class CfgAmmo { cost = 500; simulationStep = 0.005; maxControlRange = 1500; - + EGVAR(vehicle_damage,incendiary) = 1.0; class ace_missileguidance { diff --git a/addons/dragon/anim/M47.rtm b/addons/dragon/anim/M47.rtm deleted file mode 100644 index 48f3dfc3c4..0000000000 Binary files a/addons/dragon/anim/M47.rtm and /dev/null differ diff --git a/addons/dragon/anim/model.cfg b/addons/dragon/anim/model.cfg deleted file mode 100644 index 6be7f511b5..0000000000 --- a/addons/dragon/anim/model.cfg +++ /dev/null @@ -1,119 +0,0 @@ -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 index 9d329f6be7..2acf1e6c70 100644 --- a/addons/dragon/config.cpp +++ b/addons/dragon/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_hot","ace_csw"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf index f8420fa114..58e3844c88 100644 --- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf +++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) (Code inspired by NouberNou's Dragon Guidance) + * Author: tcvm (Code inspired by NouberNou's Dragon Guidance) * Attack profile: Dragon Guidance * * Arguments: diff --git a/addons/dragon/functions/fnc_canPickupTripod.sqf b/addons/dragon/functions/fnc_canPickupTripod.sqf index c328c66bd6..3d556385e5 100644 --- a/addons/dragon/functions/fnc_canPickupTripod.sqf +++ b/addons/dragon/functions/fnc_canPickupTripod.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: 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: diff --git a/addons/dragon/functions/fnc_onFired.sqf b/addons/dragon/functions/fnc_onFired.sqf index 1fa24c1925..4228f5dff0 100644 --- a/addons/dragon/functions/fnc_onFired.sqf +++ b/addons/dragon/functions/fnc_onFired.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Runs when Dragon is fired * * Arguments: diff --git a/addons/dragon/functions/fnc_sightAttach.sqf b/addons/dragon/functions/fnc_sightAttach.sqf index 6ad5df2077..76ad9c3356 100644 --- a/addons/dragon/functions/fnc_sightAttach.sqf +++ b/addons/dragon/functions/fnc_sightAttach.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Attaches the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightCanAttach.sqf b/addons/dragon/functions/fnc_sightCanAttach.sqf index 9ec742d19b..cce96022b9 100644 --- a/addons/dragon/functions/fnc_sightCanAttach.sqf +++ b/addons/dragon/functions/fnc_sightCanAttach.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Determines if you can attach the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightCanDetach.sqf b/addons/dragon/functions/fnc_sightCanDetach.sqf index 92c4a9a913..14659230ed 100644 --- a/addons/dragon/functions/fnc_sightCanDetach.sqf +++ b/addons/dragon/functions/fnc_sightCanDetach.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Determines if you can attach the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightDetach.sqf b/addons/dragon/functions/fnc_sightDetach.sqf index 161a13ba64..c9d03e22e6 100644 --- a/addons/dragon/functions/fnc_sightDetach.sqf +++ b/addons/dragon/functions/fnc_sightDetach.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Attaches the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/script_component.hpp b/addons/dragon/functions/script_component.hpp deleted file mode 100644 index 386679ecf6..0000000000 --- a/addons/dragon/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\dragon\script_component.hpp" \ No newline at end of file diff --git a/addons/dragon/stringtable.xml b/addons/dragon/stringtable.xml index a99e3fb49c..4170974dc5 100644 --- a/addons/dragon/stringtable.xml +++ b/addons/dragon/stringtable.xml @@ -8,12 +8,14 @@ [CSW] M47 Super-Dragon [CSW] M47 スーパー ドラゴン [CSW] M47龍式 + [班组] M47 龙式反坦克导弹 [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon + [CSW] M47 슈퍼 드래곤 M47 Super-Dragon @@ -22,12 +24,14 @@ M47 Super-Dragon M47 スーパー ドラゴン M47 龍式 + M47 龙式反坦克导弹 M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon + M47 슈퍼 드래곤 Attach Sight @@ -36,11 +40,13 @@ Monter le viseur 照準器を取り付ける 裝上瞄具 + 装上瞄具 Monta mirino Připojit puškohled Dołącz Optykę Прикрепить прицел Acoplar visor + 조준경 부착 Detach Sight @@ -49,11 +55,13 @@ Démonter le viseur 照準器を外す 拆下瞄具 + 卸下瞄具 Smonta mirino Odpojit puškohled Odczep Optykę Открепить прицел Desacoplar visor + 조준경 분리 SU-36/P Daysight @@ -62,12 +70,14 @@ SU-36/P Daysight SU-36/P デイサイト 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 Дневной Visor diurno SU-36/P + SU-36/P 주간조준기 A light, cheap sight used for daytime operations. Contains the guidance computer for the whole system @@ -76,11 +86,13 @@ 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 - Легкий дешёвый прицел, используемый для дневных операций. Содержит компьютер для всей системы + Лёгкий дешёвый прицел, используемый для дневных операций. Содержит компьютер для всей системы Un visor ligero y barato utilizado en operaciones diurnas. Contiene el ordenador de guiado para todo el sistema. + 싸고 가벼운 주간조준기입니다. 사격을 하기 위한 통제컴퓨터가 포함되있습니다. A Wire-Guided SACLOS missile with a unique flight characteristic @@ -89,11 +101,13 @@ 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 с проводным наведением с уникальной характеристикой полета Misil SACLOS guiado por hilo con una característica de vuelo única. + 특이한 비행 성질을 가진 반자동 가시선지령 유도미사일입니다. diff --git a/addons/explosives/ACE_Triggers.hpp b/addons/explosives/ACE_Triggers.hpp index e9c717504e..aab36121a0 100644 --- a/addons/explosives/ACE_Triggers.hpp +++ b/addons/explosives/ACE_Triggers.hpp @@ -56,7 +56,7 @@ class ACE_Triggers { isAttachable = 1; displayName = CSTRING(timerName); picture = QPATHTOF(data\UI\Timer.paa); - onPlace = QUOTE([ARR_2(_this select 1, _this select 3 select 0)] call FUNC(startTimer); false); + onPlace = QUOTE([ARR_4(_this select 1, _this select 3 select 0, nil, _this select 0)] call FUNC(startTimer); false); onSetup = QUOTE(_this call FUNC(openTimerUI)); }; class Tripwire { diff --git a/addons/explosives/CfgWeapons.hpp b/addons/explosives/CfgWeapons.hpp index d45b484c59..30e1fb95cb 100644 --- a/addons/explosives/CfgWeapons.hpp +++ b/addons/explosives/CfgWeapons.hpp @@ -26,6 +26,7 @@ class CfgWeapons { GVAR(Range) = 250; GVAR(Detonator) = 1; GVAR(triggerType) = "Command"; + ACE_isTool = 1; class ItemInfo: ACE_ExplosiveItem { mass = 3; @@ -46,6 +47,8 @@ class CfgWeapons { descriptionShort = CSTRING(DefusalKit_description); picture = QPATHTOF(Data\UI\Pliers.paa); model = "\A3\Structures_F\Items\Tools\Pliers_F.p3d"; + ACE_isTool = 1; + GVAR(defusalKit) = 1; class ItemInfo: ACE_ExplosiveItem { mass = 5; @@ -62,6 +65,7 @@ class CfgWeapons { GVAR(Range) = 100; GVAR(Detonator) = 1; GVAR(triggerType) = "DeadManSwitch"; + ACE_isTool = 1; class ItemInfo: ACE_ExplosiveItem { mass = 2; @@ -78,6 +82,7 @@ class CfgWeapons { GVAR(Range) = 15000; GVAR(Detonator) = 1; GVAR(triggerType) = "Cellphone"; + ACE_isTool = 1; class ItemInfo: ACE_ExplosiveItem { mass = 2; diff --git a/addons/explosives/Data/ace_m57.rvmat b/addons/explosives/Data/ace_m57.rvmat index 628e9bfe55..565bd53e79 100644 --- a/addons/explosives/Data/ace_m57.rvmat +++ b/addons/explosives/Data/ace_m57.rvmat @@ -6,7 +6,7 @@ diffuse[] = {1,1,1,1}; forcedDiffuse[] = {0,0,0,0}; emmisive[] = {0,0,0,1}; specular[] = {0.3,0.3,0.3,1}; -specularPower = 3b0; +specularPower = 3; PixelShaderID = "Super"; VertexShaderID = "Super"; class Stage1 { diff --git a/addons/explosives/ExplosivesUI.hpp b/addons/explosives/ExplosivesUI.hpp index cd06abff5b..75f29afbfe 100644 --- a/addons/explosives/ExplosivesUI.hpp +++ b/addons/explosives/ExplosivesUI.hpp @@ -13,9 +13,9 @@ class Rsc_ACE_CallScreen_Edit: RscEdit { style = "0x00 + 0x40 + 0x200"; shadow = 1; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) * 1)"; - x = 0.288594 * safezoneW + safezoneX; - w = 0.0825 * safezoneW; - h = 0.044 * safezoneH; + x = "0.288594 * safezoneW + safezoneX"; + w = "0.0825 * safezoneW"; + h = "0.044 * safezoneH"; }; class Rsc_ACE_HiddenButton: RscButton { colorText[] = {0, 0, 0, 0}; @@ -40,175 +40,175 @@ class Rsc_ACE_PhoneInterface { class RscPicture_1200: RscPicture { idc = 1200; text = QPATHTOF(Data\UI\Cellphone_Background.paa); - x = 0.231875 * safezoneW + safezoneX; - y = 0.104 * safezoneH + safezoneY; - w = 0.195937 * safezoneW; - h = 0.704 * safezoneH; + x = "0.231875 * safezoneW + safezoneX"; + y = "0.104 * safezoneH + safezoneY"; + w = "0.195937 * safezoneW"; + h = "0.704 * safezoneH"; }; class numkey_1: Rsc_ACE_NumKeyButton { idc = 1600; - x = 0.278281 * safezoneW + safezoneX; - y = 0.533 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.278281 * safezoneW + safezoneX"; + y = "0.533 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "1"; action = "ctrlSetText [1400,((ctrlText 1400) + '1')];"; }; class numkey_2: Rsc_ACE_NumKeyButton { idc = 1601; - x = 0.314375 * safezoneW + safezoneX; - y = 0.533 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.314375 * safezoneW + safezoneX"; + y = "0.533 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "2"; action = "ctrlSetText [1400,((ctrlText 1400) + '2')];"; }; class numkey_3: Rsc_ACE_NumKeyButton { idc = 1602; - x = 0.350469 * safezoneW + safezoneX; - y = 0.533 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.350469 * safezoneW + safezoneX"; + y = "0.533 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "3"; action = "ctrlSetText [1400,((ctrlText 1400) + '3')];"; }; class numkey_4: Rsc_ACE_NumKeyButton { idc = 1603; - x = 0.278281 * safezoneW + safezoneX; - y = 0.577 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.278281 * safezoneW + safezoneX"; + y = "0.577 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "4"; action = "ctrlSetText [1400,((ctrlText 1400) + '4')];"; }; class numkey_5: Rsc_ACE_NumKeyButton { idc = 1604; - x = 0.314375 * safezoneW + safezoneX; - y = 0.577 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.314375 * safezoneW + safezoneX"; + y = "0.577 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "5"; action = "ctrlSetText [1400,((ctrlText 1400) + '5')];"; }; class numkey_6: Rsc_ACE_NumKeyButton { idc = 1605; - x = 0.350469 * safezoneW + safezoneX; - y = 0.577 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.350469 * safezoneW + safezoneX"; + y = "0.577 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "6"; action = "ctrlSetText [1400,((ctrlText 1400) + '6')];"; }; class numkey_7: Rsc_ACE_NumKeyButton { idc = 1606; - x = 0.278281 * safezoneW + safezoneX; - y = 0.621 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.278281 * safezoneW + safezoneX"; + y = "0.621 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "7"; action = "ctrlSetText [1400,((ctrlText 1400) + '7')];"; }; class numkey_8: Rsc_ACE_NumKeyButton { idc = 1607; - x = 0.314375 * safezoneW + safezoneX; - y = 0.621 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.314375 * safezoneW + safezoneX"; + y = "0.621 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "8"; action = "ctrlSetText [1400,((ctrlText 1400) + '8')];"; }; class numkey_9: Rsc_ACE_NumKeyButton { idc = 1608; - x = 0.350469 * safezoneW + safezoneX; - y = 0.621 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.350469 * safezoneW + safezoneX"; + y = "0.621 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "9"; action = "ctrlSetText [1400,((ctrlText 1400) + '9')];"; }; class numkey_0: Rsc_ACE_NumKeyButton { idc = 1609; - x = 0.314375 * safezoneW + safezoneX; - y = 0.676 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.314375 * safezoneW + safezoneX"; + y = "0.676 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = "0"; action = "ctrlSetText [1400,((ctrlText 1400) + '0')];"; }; class speedDialAdd: Rsc_ACE_NumKeyButton { idc = 1610; - x = 0.278281 * safezoneW + safezoneX; - y = 0.676 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.033 * safezoneH; + x = "0.278281 * safezoneW + safezoneX"; + y = "0.676 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = CSTRING(Phone_AddToSpeedDial); action = QUOTE([ARR_2(ctrlText 1401,ctrlText 1400)] call FUNC(addToSpeedDial);); }; class clear: Rsc_ACE_HiddenButton { idc = 1610; - x = 0.278281 * safezoneW + safezoneX; - y = 0.445 * safezoneH + safezoneY; - w = 0.020625 * safezoneW; - h = 0.033 * safezoneH; + x = "0.278281 * safezoneW + safezoneX"; + y = "0.445 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = CSTRING(Clear); action = QUOTE(ctrlSetText [ARR_2(1400,'')];[ctrlText 1401] call FUNC(removeFromSpeedDial);ctrlSetText [ARR_2(1401,'')];); }; class dial: Rsc_ACE_HiddenButton { idc = 1611; - x = 0.309219 * safezoneW + safezoneX; - y = 0.445 * safezoneH + safezoneY; - w = 0.04125 * safezoneW; - h = 0.033 * safezoneH; + x = "0.309219 * safezoneW + safezoneX"; + y = "0.445 * safezoneH + safezoneY"; + w = "0.04125 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = CSTRING(Phone_Dial); action = QUOTE([ARR_2(ace_player,ctrlText 1400)] call FUNC(dialPhone);); }; class up: Rsc_ACE_HiddenButton { idc = 1612; - x = 0.360781 * safezoneW + safezoneX; - y = 0.445 * safezoneH + safezoneY; - w = 0.020625 * safezoneW; - h = 0.033 * safezoneH; + x = "0.360781 * safezoneW + safezoneX"; + y = "0.445 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = CSTRING(Phone_Up); action = QUOTE([true] call FUNC(setSpeedDial)); }; class down: Rsc_ACE_HiddenButton { idc = 1613; - x = 0.345312 * safezoneW + safezoneX; - y = 0.485 * safezoneH + safezoneY; - w = 0.020625 * safezoneW; - h = 0.033 * safezoneH; + x = "0.345312 * safezoneW + safezoneX"; + y = "0.485 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.033 * safezoneH"; tooltip = CSTRING(Phone_Down); action = QUOTE([false] call FUNC(setSpeedDial)); }; class speedDial_Text: RscText { idc = 1405; - y = 0.302 * safezoneH + safezoneY; + y = "0.302 * safezoneH + safezoneY"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)"; - x = 0.288594 * safezoneW + safezoneX; - w = 0.0825 * safezoneW; - h = 0.044 * safezoneH; + x = "0.288594 * safezoneW + safezoneX"; + w = "0.0825 * safezoneW"; + h = "0.044 * safezoneH"; text = "Name"; }; class speedDial_edit: Rsc_ACE_CallScreen_Edit { idc = 1401; - y = 0.302 * safezoneH + safezoneY; - x = 0.318 * safezoneW + safezoneX; - w = 0.1; + y = "0.302 * safezoneH + safezoneY"; + x = "0.318 * safezoneW + safezoneX"; + w = "0.1"; }; class numberEdit_Text: RscText { idc = 1406; - y = 0.348 * safezoneH + safezoneY; + y = "0.348 * safezoneH + safezoneY"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)"; - x = 0.288594 * safezoneW + safezoneX; - w = 0.0825 * safezoneW; - h = 0.044 * safezoneH; + x = "0.288594 * safezoneW + safezoneX"; + w = "0.0825 * safezoneW"; + h = "0.044 * safezoneH"; text = "#"; }; class number_edit: Rsc_ACE_CallScreen_Edit { canModify = 0; idc = 1400; - y = 0.348 * safezoneH + safezoneY; - x = 0.3 * safezoneW + safezoneX; + y = "0.348 * safezoneH + safezoneY"; + x = "0.3 * safezoneW + safezoneX"; }; }; }; diff --git a/addons/explosives/TimerDialog.hpp b/addons/explosives/TimerDialog.hpp index a3ab96af06..50ee0086bc 100644 --- a/addons/explosives/TimerDialog.hpp +++ b/addons/explosives/TimerDialog.hpp @@ -7,19 +7,19 @@ class GVAR(timerUI) { class Header: RscText { idc = -1; text = CSTRING(ExplosiveTimer); - x = 13.5 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 5 * GUI_GRID_H + GUI_GRID_CENTER_Y; - w = 13 * GUI_GRID_W; - h = GUI_GRID_H; + x = QUOTE(13.5 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(5 * GUI_GRID_H + GUI_GRID_CENTER_Y); + w = QUOTE(13 * GUI_GRID_W); + h = QUOTE(GUI_GRID_H); colorBackground[] = GUI_BCG_COLOR; moving = 1; }; class Background: RscText { idd = -1; - x = 13.5 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 6.1 * GUI_GRID_H + GUI_GRID_CENTER_Y; - w = 13 * GUI_GRID_W; - h = 6.5 * GUI_GRID_H; + x = QUOTE(13.5 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(6.1 * GUI_GRID_H + GUI_GRID_CENTER_Y); + w = QUOTE(13 * GUI_GRID_W); + h = QUOTE(6.5 * GUI_GRID_H); colorBackground[] = {0, 0, 0, 0.8}; }; }; @@ -27,24 +27,24 @@ class GVAR(timerUI) { class DigitBackground_1: RscPicture { idc = -1; text = QPATHTOF(UI\seven_segment_8.paa); - x = 14 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 6.6 * GUI_GRID_H + GUI_GRID_CENTER_Y; - w = 4 * GUI_GRID_W; - h = 4 * GUI_GRID_H; + x = QUOTE(14 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(6.6 * GUI_GRID_H + GUI_GRID_CENTER_Y); + w = QUOTE(4 * GUI_GRID_W); + h = QUOTE(4 * GUI_GRID_H); colorText[] = {0.3, 0.3, 0.3, 0.5}; }; class DigitBackground_2: DigitBackground_1 { - x = 16.4 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(16.4 * GUI_GRID_W + GUI_GRID_CENTER_X); }; class DigitBackground_3: DigitBackground_1 { - x = 19.7 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(19.7 * GUI_GRID_W + GUI_GRID_CENTER_X); }; class DigitBackground_4: DigitBackground_1 { - x = 22.1 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(22.1 * GUI_GRID_W + GUI_GRID_CENTER_X); }; class DigitSeparator: DigitBackground_1 { text = QPATHTOF(UI\seven_segment_separator.paa); - x = 18.025 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(18.025 * GUI_GRID_W + GUI_GRID_CENTER_X); colorText[] = {1, 0.05, 0.05, 1}; }; class Digit_1: DigitBackground_1 { @@ -54,22 +54,22 @@ class GVAR(timerUI) { }; class Digit_2: Digit_1 { idc = IDC_TIMER_DIGIT_2; - x = 16.4 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(16.4 * GUI_GRID_W + GUI_GRID_CENTER_X); }; class Digit_3: Digit_1 { idc = IDC_TIMER_DIGIT_3; - x = 19.7 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(19.7 * GUI_GRID_W + GUI_GRID_CENTER_X); }; class Digit_4: Digit_1 { idc = IDC_TIMER_DIGIT_4; - x = 22.1 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(22.1 * GUI_GRID_W + GUI_GRID_CENTER_X); }; class Slider: ctrlXSliderH { idc = IDC_TIMER_SLIDER; - x = 14 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 11.1 * GUI_GRID_H + GUI_GRID_CENTER_Y; - w = 12 * GUI_GRID_W; - h = GUI_GRID_H; + x = QUOTE(14 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(11.1 * GUI_GRID_H + GUI_GRID_CENTER_Y); + w = QUOTE(12 * GUI_GRID_W); + h = QUOTE(GUI_GRID_H); color[] = {0.3, 0.3, 0.3, 0.7}; colorActive[] = {0.3, 0.3, 0.3, 0.7}; sliderRange[] = {TIMER_VALUE_MIN, TIMER_VALUE_MAX}; @@ -79,10 +79,10 @@ class GVAR(timerUI) { idc = -1; text = CSTRING(Cancel); onButtonClick = QUOTE(closeDialog 0); - x = 13.5 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 12.7 * GUI_GRID_H + GUI_GRID_CENTER_Y; - w = 5 * GUI_GRID_W; - h = GUI_GRID_H; + x = QUOTE(13.5 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(12.7 * GUI_GRID_H + GUI_GRID_CENTER_Y); + w = QUOTE(5 * GUI_GRID_W); + h = QUOTE(GUI_GRID_H); colorActive[] = {0, 0, 0, 1}; colorBackground[] = {0, 0, 0, 0.8}; colorFocused[] = {0, 0, 0, 0.8}; @@ -91,7 +91,7 @@ class GVAR(timerUI) { idc = IDC_TIMER_CONFIRM; text = CSTRING(SetTime); onButtonClick = ""; - x = 21.5 * GUI_GRID_W + GUI_GRID_CENTER_X; + x = QUOTE(21.5 * GUI_GRID_W + GUI_GRID_CENTER_X); }; }; }; diff --git a/addons/explosives/XEH_PREP.hpp b/addons/explosives/XEH_PREP.hpp index d549118623..319bd2fec2 100644 --- a/addons/explosives/XEH_PREP.hpp +++ b/addons/explosives/XEH_PREP.hpp @@ -39,3 +39,4 @@ PREP(startTimer); PREP(triggerType); PREP(allowDefuse); PREP(isAllowedDefuse); +PREP(checkDetonateHandlers); diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index d5bf418235..bee84c5b0f 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -16,7 +16,17 @@ */ //Event for setting explosive placement angle/pitch: -[QGVAR(place), {_this call FUNC(setPosition)}] call CBA_fnc_addEventHandler; +[QGVAR(place), { + params ["_explosive", "", "", "_unit"]; + + _this call FUNC(setPosition); + + if (isServer) then { + if (missionNamespace getVariable [QGVAR(setShotParents), true]) then { + _explosive setShotParents [_unit, _unit]; + }; + }; +}] call CBA_fnc_addEventHandler; [QGVAR(startDefuse), FUNC(startDefuse)] call CBA_fnc_addEventHandler; //When getting knocked out in medical, trigger deadman explosives: @@ -25,7 +35,9 @@ if (isServer) then { [QGVAR(detonate), { params ["_unit", "_explosive", "_delay"]; TRACE_3("server detonate EH",_unit,_explosive,_delay); - _explosive setShotParents [_unit, _unit]; + if (missionNamespace getVariable [QGVAR(setShotParents), true]) then { + _explosive setShotParents [_unit, _unit]; + }; [{ params ["_explosive"]; TRACE_1("exploding",_explosive); @@ -46,7 +58,6 @@ if (isServer) then { if (!hasInterface) exitWith {}; GVAR(PlacedCount) = 0; -GVAR(excludedMines) = []; GVAR(Setup) = objNull; GVAR(pfeh_running) = false; GVAR(CurrentSpeedDial) = 0; diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index 3ca414f051..ff908106a7 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -11,5 +11,8 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" GVAR(detonationHandlers) = []; +GVAR(excludedMines) = []; + +GVAR(defusalKits) = call (uiNamespace getVariable QGVAR(defusalKits)); ADDON = true; diff --git a/addons/explosives/XEH_preStart.sqf b/addons/explosives/XEH_preStart.sqf index 022888575e..c62a1e1d3c 100644 --- a/addons/explosives/XEH_preStart.sqf +++ b/addons/explosives/XEH_preStart.sqf @@ -1,3 +1,6 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _defusalKits = (QUOTE(getNumber (_x >> QQGVAR(defusalKit)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x}); +uiNamespace setVariable [QGVAR(defusalKits), compileFinal str _defusalKits]; diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index d9ae19892c..2ac69b73ae 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Adds an IED to the cellphone list diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf index 6b48980d54..2292bfcb79 100644 --- a/addons/explosives/functions/fnc_addClacker.sqf +++ b/addons/explosives/functions/fnc_addClacker.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Adds an explosive as a clacker item to the passed unit if the unit has the required item. diff --git a/addons/explosives/functions/fnc_addDetonateActions.sqf b/addons/explosives/functions/fnc_addDetonateActions.sqf index f1dff4fc9f..c353f973c3 100644 --- a/addons/explosives/functions/fnc_addDetonateActions.sqf +++ b/addons/explosives/functions/fnc_addDetonateActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Opens the UI for explosive detonation selection diff --git a/addons/explosives/functions/fnc_addDetonateHandler.sqf b/addons/explosives/functions/fnc_addDetonateHandler.sqf index b227b96d07..5ca0d924b5 100644 --- a/addons/explosives/functions/fnc_addDetonateHandler.sqf +++ b/addons/explosives/functions/fnc_addDetonateHandler.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Add a explosive detonation handler. * Should be called on all machines. * Code needs to return BOOL: true(allowed) / false(blocked) - * See https://ace3mod.com/wiki/framework/explosives-framework.html for an example. + * See https://ace3.acemod.org/wiki/framework/explosives-framework.html for an example. * * Arguments: * 0: Code diff --git a/addons/explosives/functions/fnc_addExplosiveActions.sqf b/addons/explosives/functions/fnc_addExplosiveActions.sqf index 281aebf048..480ecd2701 100644 --- a/addons/explosives/functions/fnc_addExplosiveActions.sqf +++ b/addons/explosives/functions/fnc_addExplosiveActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, CAA-Picard, mharis001 * Returns children actions for explosive magazines in the player's inventory. diff --git a/addons/explosives/functions/fnc_addToSpeedDial.sqf b/addons/explosives/functions/fnc_addToSpeedDial.sqf index 5b7d828d53..4ccc23696e 100644 --- a/addons/explosives/functions/fnc_addToSpeedDial.sqf +++ b/addons/explosives/functions/fnc_addToSpeedDial.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Sets the speed dial for the UI. diff --git a/addons/explosives/functions/fnc_addTransmitterActions.sqf b/addons/explosives/functions/fnc_addTransmitterActions.sqf index d39b9fd731..043c9db661 100644 --- a/addons/explosives/functions/fnc_addTransmitterActions.sqf +++ b/addons/explosives/functions/fnc_addTransmitterActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Opens the UI for selecting the transmitter diff --git a/addons/explosives/functions/fnc_addTriggerActions.sqf b/addons/explosives/functions/fnc_addTriggerActions.sqf index 6e534a19ae..d3632d5bb7 100644 --- a/addons/explosives/functions/fnc_addTriggerActions.sqf +++ b/addons/explosives/functions/fnc_addTriggerActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Opens the UI for explosive trigger selection diff --git a/addons/explosives/functions/fnc_allowDefuse.sqf b/addons/explosives/functions/fnc_allowDefuse.sqf index 15042e4ca5..1a7a399d13 100644 --- a/addons/explosives/functions/fnc_allowDefuse.sqf +++ b/addons/explosives/functions/fnc_allowDefuse.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Walthzer * Sets if a dynamic defuse action is allowed to be added to a mine. diff --git a/addons/explosives/functions/fnc_canDefuse.sqf b/addons/explosives/functions/fnc_canDefuse.sqf index f42764ee38..0edb98cff5 100644 --- a/addons/explosives/functions/fnc_canDefuse.sqf +++ b/addons/explosives/functions/fnc_canDefuse.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Whether a unit can perform the defuse action * * Arguments: * 0: Unit - * 0: Target (ACE_DefuseObject) + * 1: Target (ACE_DefuseObject) * * Return Value: * Able to defuse @@ -24,7 +24,7 @@ if (isNull _explosive) exitWith { deleteVehicle _target; false }; -if (vehicle _unit != _unit || {!("ACE_DefusalKit" in (_unit call EFUNC(common,uniqueItems)))}) exitWith {false}; +if (vehicle _unit != _unit || {(_unit call EFUNC(common,uniqueItems)) findAny GVAR(defusalKits) == -1}) exitWith {false}; if (GVAR(RequireSpecialist) && {!([_unit] call EFUNC(Common,isEOD))}) exitWith {false}; diff --git a/addons/explosives/functions/fnc_canDetonate.sqf b/addons/explosives/functions/fnc_canDetonate.sqf index a81103ce13..7c1112a69f 100644 --- a/addons/explosives/functions/fnc_canDetonate.sqf +++ b/addons/explosives/functions/fnc_canDetonate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Whether the unit is able to detonate explosives diff --git a/addons/explosives/functions/fnc_cancelPlacement.sqf b/addons/explosives/functions/fnc_cancelPlacement.sqf index eaefcfcc07..99ce808615 100644 --- a/addons/explosives/functions/fnc_cancelPlacement.sqf +++ b/addons/explosives/functions/fnc_cancelPlacement.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Cancels explosives placement. diff --git a/addons/explosives/functions/fnc_checkDetonateHandlers.sqf b/addons/explosives/functions/fnc_checkDetonateHandlers.sqf new file mode 100644 index 0000000000..f056db7800 --- /dev/null +++ b/addons/explosives/functions/fnc_checkDetonateHandlers.sqf @@ -0,0 +1,38 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror, Whigital + * Check if there is a handler blocking detonation + * + * Arguments: + * 0: Unit + * 1: Max range (-1 to ignore) + * 2: Explosive + * 3: Fuse time + * 4: Trigger Item Classname + * + * Return Value: + * Detonation Allowed + * + * Example: + * [player, -1, Explosive, 1, "ACE_Cellphone"] call ACE_Explosives_fnc_checkDetonateHandlers; + * + * Public: No + */ + +params ["_unit", "_range", "_explosive", "_fuseTime", ["_triggerClassname", "#unknown", [""]]]; +TRACE_5("checkDetonateHandlers",_unit,_range,_explosive,_fuseTime,_triggerClassname); + +private _detonationAllowed = true; + +{ + // Pass [Unit, MaxRange , Explosive , FuzeTime , TriggerItem ] + private _handlerResult = [_unit, _range, _explosive, _fuseTime, _triggerClassname] call _x; + + if (_handlerResult isEqualTo false) then { + TRACE_1("Handler Blocking",_forEachIndex); + _detonationAllowed = false; + break; + }; +} forEach GVAR(detonationHandlers); + +_detonationAllowed diff --git a/addons/explosives/functions/fnc_connectExplosive.sqf b/addons/explosives/functions/fnc_connectExplosive.sqf index 964966f224..df52ee8fad 100644 --- a/addons/explosives/functions/fnc_connectExplosive.sqf +++ b/addons/explosives/functions/fnc_connectExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Add preplaced explosives to a unit's detonator. diff --git a/addons/explosives/functions/fnc_defuseExplosive.sqf b/addons/explosives/functions/fnc_defuseExplosive.sqf index 24f74a580e..049fff8846 100644 --- a/addons/explosives/functions/fnc_defuseExplosive.sqf +++ b/addons/explosives/functions/fnc_defuseExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Causes the unit to defuse the passed explosive. diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf index 8edc83f0ff..5e276745b5 100644 --- a/addons/explosives/functions/fnc_detonateExplosive.sqf +++ b/addons/explosives/functions/fnc_detonateExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Causes the unit to detonate the passed explosive. @@ -7,8 +7,8 @@ * 0: Unit * 1: Max range (-1 to ignore) * 2: Explosive - * 0: Explosive - * 1: Fuse time + * - 0: Explosive + * - 1: Fuse time * 3: Trigger Item Classname * * Return Value: @@ -28,12 +28,8 @@ private _ignoreRange = (_range == -1); if (!_ignoreRange && {(_unit distance (_item select 0)) > _range}) exitWith {TRACE_1("out of range",_range); false}; private _result = true; -{ - // Pass [Unit, MaxRange , Explosive , FuzeTime , TriggerItem ] - private _handlerResult = [_unit, _range, _item select 0, _item select 1, _triggerClassname] call _x; - if (_handlerResult isEqualTo false) then {TRACE_1("Handler Failed",_forEachIndex); _result = false}; -} forEach GVAR(detonationHandlers); -if (!_result) exitWith {false}; + +if !([_unit, _range, _item select 0, _item select 1, _triggerClassname] call FUNC(checkDetonateHandlers)) exitWith {false}; if (getNumber (ConfigFile >> "CfgAmmo" >> typeOf (_item select 0) >> "TriggerWhenDestroyed") == 0) then { private _previousExp = _item select 0; diff --git a/addons/explosives/functions/fnc_detonateExplosiveAll.sqf b/addons/explosives/functions/fnc_detonateExplosiveAll.sqf index ec1f1e661a..356d4c4e6e 100644 --- a/addons/explosives/functions/fnc_detonateExplosiveAll.sqf +++ b/addons/explosives/functions/fnc_detonateExplosiveAll.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Causes the unit to detonate all passed explosives. @@ -7,8 +7,8 @@ * 0: Unit * 1: Range (-1 to ignore) * 2: Explosives to detonate - * 0: Explosive - * 1: Fuse time + * - 0: Explosive + * - 1: Fuse time * 3: Trigger Item Classname * * Return Value: diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index c7b5848e52..860f7ddfde 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Dials the number passed and detonates the explosive. @@ -35,9 +35,15 @@ if (_unit == ace_player) then { private _explosive = [_code] call FUNC(getSpeedDialExplosive); if ((count _explosive) > 0) then { [{ - playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; - (_this select 0) setVariable [QGVAR(Dialing), false, true]; - }, [_unit,_explosive select 0], 0.25 * (count _arr - 4)] call CBA_fnc_waitAndExecute; - [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2), "ACE_Cellphone"] call FUNC(startTimer); + params ["_unit", "_item"]; + + if ([_unit, -1, (_item # 0), (_item # 2), "ACE_Cellphone"] call FUNC(checkDetonateHandlers)) then { + playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)), objNull, false, (getPosASL (_item # 0)), 3.16228, 1, 75]; + }; + + _unit setVariable [QGVAR(Dialing), false, true]; + }, [_unit, _explosive], 0.25 * (count _arr - 4)] call CBA_fnc_waitAndExecute; + + [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2), "ACE_Cellphone", _unit] call FUNC(startTimer); }; }; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index 0a30a298bb..1ac0679959 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Performs the dial tones and detonation of explosive. @@ -39,9 +39,14 @@ if (_i >= (count _arr + 2)) then { ctrlSetText [1400,"Call Ended!"]; }; }; + if (_i == (count _arr)) then { - if ((count _explosive) > 0) then { - playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; + if ( + ((count _explosive) > 0) && + {[_unit, -1, (_explosive # 0), (_explosive # 2), "ACE_Cellphone"] call FUNC(checkDetonateHandlers)} + ) then { + playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)), objNull, false, (getPosASL (_explosive # 0)), 3.16228, 1, 75]; }; }; + _args set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_getDetonators.sqf b/addons/explosives/functions/fnc_getDetonators.sqf index 3c4d3085ce..de1f711e86 100644 --- a/addons/explosives/functions/fnc_getDetonators.sqf +++ b/addons/explosives/functions/fnc_getDetonators.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, mharis001 * Returns all detonators the given unit has. diff --git a/addons/explosives/functions/fnc_getPlacedExplosives.sqf b/addons/explosives/functions/fnc_getPlacedExplosives.sqf index 8b1135717d..867bae2275 100644 --- a/addons/explosives/functions/fnc_getPlacedExplosives.sqf +++ b/addons/explosives/functions/fnc_getPlacedExplosives.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Gets all placed explosives by unit, optionally filtered by specific trigger type. diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf index 84e2ab6ad8..8490eab452 100644 --- a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Gets the explosive from the speed dial entry. diff --git a/addons/explosives/functions/fnc_handleScrollWheel.sqf b/addons/explosives/functions/fnc_handleScrollWheel.sqf index 674769a496..019fb3c962 100644 --- a/addons/explosives/functions/fnc_handleScrollWheel.sqf +++ b/addons/explosives/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Handles rotating of Explosives diff --git a/addons/explosives/functions/fnc_hasExplosives.sqf b/addons/explosives/functions/fnc_hasExplosives.sqf index 0c824a87b2..0121eb515d 100644 --- a/addons/explosives/functions/fnc_hasExplosives.sqf +++ b/addons/explosives/functions/fnc_hasExplosives.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, mharis001 * Checks if given unit has any placeable explosives on them. diff --git a/addons/explosives/functions/fnc_hasPlacedExplosives.sqf b/addons/explosives/functions/fnc_hasPlacedExplosives.sqf index 3bb3f03340..c697afb371 100644 --- a/addons/explosives/functions/fnc_hasPlacedExplosives.sqf +++ b/addons/explosives/functions/fnc_hasPlacedExplosives.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Whether the passed unit has placed any explosives or has a clacker that was used when explosives were placed. diff --git a/addons/explosives/functions/fnc_interactEH.sqf b/addons/explosives/functions/fnc_interactEH.sqf index da7215bb81..194dc7414b 100644 --- a/addons/explosives/functions/fnc_interactEH.sqf +++ b/addons/explosives/functions/fnc_interactEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Dynamically adds "Defuse" actions to nearby mines when interact_menu is opened. @@ -25,7 +25,7 @@ TRACE_1("Explosives interactEH",_interactionType); if ( _interactionType != 0 || {vehicle ACE_player != ACE_player} - || {!("ACE_DefusalKit" in (ACE_player call EFUNC(common,uniqueItems)))} + || {(ACE_player call EFUNC(common,uniqueItems)) findAny GVAR(defusalKits) == -1} ) exitWith {}; [{ diff --git a/addons/explosives/functions/fnc_isAllowedDefuse.sqf b/addons/explosives/functions/fnc_isAllowedDefuse.sqf index 2d2846d27c..7fa24cf077 100644 --- a/addons/explosives/functions/fnc_isAllowedDefuse.sqf +++ b/addons/explosives/functions/fnc_isAllowedDefuse.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Walthzer * Check if a mine is allowed to recieve a dynamic defuse action. diff --git a/addons/explosives/functions/fnc_module.sqf b/addons/explosives/functions/fnc_module.sqf index 6fa61b401a..c1a9273e61 100644 --- a/addons/explosives/functions/fnc_module.sqf +++ b/addons/explosives/functions/fnc_module.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Initialises the explosives module diff --git a/addons/explosives/functions/fnc_onIncapacitated.sqf b/addons/explosives/functions/fnc_onIncapacitated.sqf index 74d99d2faa..09d1d7b21f 100644 --- a/addons/explosives/functions/fnc_onIncapacitated.sqf +++ b/addons/explosives/functions/fnc_onIncapacitated.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Detonates all attached deadman's switched triggered explosives. diff --git a/addons/explosives/functions/fnc_onInventoryChanged.sqf b/addons/explosives/functions/fnc_onInventoryChanged.sqf index 874ae3394f..7cf01c2a14 100644 --- a/addons/explosives/functions/fnc_onInventoryChanged.sqf +++ b/addons/explosives/functions/fnc_onInventoryChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * When a take/put event handler fires and a detonator is changed hands. diff --git a/addons/explosives/functions/fnc_openTimerUI.sqf b/addons/explosives/functions/fnc_openTimerUI.sqf index 7844f6da04..0a490a096d 100644 --- a/addons/explosives/functions/fnc_openTimerUI.sqf +++ b/addons/explosives/functions/fnc_openTimerUI.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Opens the Explosive Timer UI for given explosive. diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index df8f3ab89c..ec19a6f6fd 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Places an explosive at the requested position. diff --git a/addons/explosives/functions/fnc_removeFromSpeedDial.sqf b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf index 998bc492d0..39319bc3c5 100644 --- a/addons/explosives/functions/fnc_removeFromSpeedDial.sqf +++ b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Removes the specified speed dial from unit's speed dial. diff --git a/addons/explosives/functions/fnc_scriptedExplosive.sqf b/addons/explosives/functions/fnc_scriptedExplosive.sqf index 6b4aedd6a3..d070517079 100644 --- a/addons/explosives/functions/fnc_scriptedExplosive.sqf +++ b/addons/explosives/functions/fnc_scriptedExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Detonate explosives via script, for use in triggers or mission scripts to detonate editor-placed explosives. diff --git a/addons/explosives/functions/fnc_selectTrigger.sqf b/addons/explosives/functions/fnc_selectTrigger.sqf index 549754aab2..ef9b686d25 100644 --- a/addons/explosives/functions/fnc_selectTrigger.sqf +++ b/addons/explosives/functions/fnc_selectTrigger.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Selects a trigger for an explosive. diff --git a/addons/explosives/functions/fnc_setPosition.sqf b/addons/explosives/functions/fnc_setPosition.sqf index 7d4235b8d2..a97eb9f462 100644 --- a/addons/explosives/functions/fnc_setPosition.sqf +++ b/addons/explosives/functions/fnc_setPosition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Sets the Dir and pitch of passed object diff --git a/addons/explosives/functions/fnc_setSpeedDial.sqf b/addons/explosives/functions/fnc_setSpeedDial.sqf index 7d836015a4..be50753b09 100644 --- a/addons/explosives/functions/fnc_setSpeedDial.sqf +++ b/addons/explosives/functions/fnc_setSpeedDial.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Sets the speed dial for the UI. diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index 2961c8d101..423e8932c3 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Starts the setup process for the passed explosive. Player only. @@ -24,7 +24,7 @@ params ["_vehicle", "_unit", "_magClassname"]; TRACE_3("params",_vehicle,_unit,_magClassname); //Get setup object vehicle and model: -private _setupObjectClass = getText(ConfigFile >> "CfgMagazines" >> _magClassname >> QGVAR(SetupObject)); +private _setupObjectClass = getText (configFile >> "CfgMagazines" >> _magClassname >> QGVAR(SetupObject)); if (!isClass (configFile >> "CfgVehicles" >> _setupObjectClass)) exitWith {ERROR("Bad Vehicle");}; private _p3dModel = getText (configFile >> "CfgVehicles" >> _setupObjectClass >> "model"); if (_p3dModel == "") exitWith {ERROR("No Model");}; //"" - will crash game! @@ -187,6 +187,7 @@ GVAR(TweakedAngle) = 0; _unit setVariable [QGVAR(PlantingExplosive), true]; [{_this setVariable [QGVAR(PlantingExplosive), false]}, _unit, 1.5] call CBA_fnc_waitAndExecute; + [QGVAR(setup), [_expSetupVehicle, _magClassname, _unit]] call CBA_fnc_globalEvent; }; } else { private _screenPos = worldToScreen (_virtualPosASL call EFUNC(common,ASLToPosition)); diff --git a/addons/explosives/functions/fnc_spawnFlare.sqf b/addons/explosives/functions/fnc_spawnFlare.sqf index 5c6038c2e2..7730ed39a9 100644 --- a/addons/explosives/functions/fnc_spawnFlare.sqf +++ b/addons/explosives/functions/fnc_spawnFlare.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Spawns a flare on the ground for tripflare trigger diff --git a/addons/explosives/functions/fnc_startDefuse.sqf b/addons/explosives/functions/fnc_startDefuse.sqf index 96b3b3eac2..e023592547 100644 --- a/addons/explosives/functions/fnc_startDefuse.sqf +++ b/addons/explosives/functions/fnc_startDefuse.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Starts defusing an explosive diff --git a/addons/explosives/functions/fnc_startTimer.sqf b/addons/explosives/functions/fnc_startTimer.sqf index 484171ec6e..a4829a0ebd 100644 --- a/addons/explosives/functions/fnc_startTimer.sqf +++ b/addons/explosives/functions/fnc_startTimer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Starts a timer for an explosive. @@ -7,6 +7,7 @@ * 0: Explosive * 1: Time till detonate * 2: Trigger classname (default: "#timer") + * 3: Unit * * Return Value: * None @@ -17,13 +18,13 @@ * Public: Yes */ -params ["_explosive", "_delay", ["_trigger", "#timer", [""]]]; -TRACE_3("Starting timer",_explosive,_delay,_trigger); +params ["_explosive", "_delay", ["_trigger", "#timer", [""]], ["_unit", objNull, [objNull]]]; +TRACE_4("Starting timer",_explosive,_delay,_trigger,_unit); [{ - params ["_explosive", "_trigger"]; + params ["_explosive", "_trigger", "_unit"]; TRACE_1("Explosive detonating from timer",_explosive); if (!isNull _explosive) then { - [_explosive, -1, [_explosive, 0], _trigger] call FUNC(detonateExplosive); + [_unit, -1, [_explosive, 0], _trigger] call FUNC(detonateExplosive); }; -}, [_explosive, _trigger], _delay] call CBA_fnc_waitAndExecute; +}, [_explosive, _trigger, _unit], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/explosives/functions/fnc_triggerType.sqf b/addons/explosives/functions/fnc_triggerType.sqf index 6bcbf775d3..0fba459491 100644 --- a/addons/explosives/functions/fnc_triggerType.sqf +++ b/addons/explosives/functions/fnc_triggerType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Gets the types of triggers associated with the explosive diff --git a/addons/explosives/functions/script_component.hpp b/addons/explosives/functions/script_component.hpp deleted file mode 100644 index 438330c587..0000000000 --- a/addons/explosives/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\explosives\script_component.hpp" diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index f9c684d303..c38c226d17 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -81,7 +81,7 @@ Codice esplosivo: %1 爆破コード: %1 폭파 코드: %1 - 炸药代码: %1 + 炸药代码:%1 炸藥代號: %1 Patlayıcı Kodu: %1 @@ -233,7 +233,7 @@ Используется для удаленной детонации СВУ 爆発物を遠隔で起爆させるのに使います 원격으로 폭발물을 폭파시킬때 씁니다. - 用于远端引爆炸药 + 用于远程引爆炸药 用於遠端引爆炸藥 Bombaları uzaktan patlatmak için kullanılır @@ -267,7 +267,7 @@ Используется для удаленной детонации зарядов 爆発物を遠隔で起爆させるのに使います 원격으로 폭발물을 폭파시킬때 씁니다. - 用于远端引爆炸药 + 用于远程引爆炸药 用於遠端引爆炸藥 Patlayıcıları uzaktan tetiklemek için kullanılır @@ -301,7 +301,7 @@ M152 RAMS M152 RAMS M152 RAMS - M152 远端炸药引爆系统 + M152 远程炸药引爆系统 M152 遠端炸藥引爆系統 M152 RAMS @@ -335,7 +335,7 @@ Позволяет обезвреживать взрывчатку 爆発物を無力化できます 폭발물을 해체할 수 있게 해줍니다 - 可以用来拆除炸弹 + 可以用来拆除爆炸物 可以用來拆除炸彈 Patlayıcıların etkisiz hale gelmesini sağlar. @@ -454,7 +454,7 @@ Меню подрыва 点火メニュー 폭파 메뉴 - 引爆选单 + 引爆菜单 引爆選單 Patlatma Menüsü @@ -471,7 +471,7 @@ Меню установки 設置メニュー 설치 메뉴 - 放置选单 + 放置菜单 放置選單 Yerleştirme Menüsü @@ -505,7 +505,7 @@ Обезвреживание... 爆発物を無力化しています・・・ 폭발물 해체중... - 正在拆除炸弹... + 正在拆除爆炸物... 炸彈拆除中... Patlayıcı Imha Ediliyor... @@ -539,7 +539,7 @@ Время: %1m %2c 設定時間: %1分 %2秒 시간: %1분 %2초 - 时间: %1分%2秒 + 时间:%1分%2秒 時間: %1分%2秒 Süre: %1m %2s @@ -675,7 +675,7 @@ ИК сенсор (детонация вбок) 赤外線感知式 (側面攻撃) 적외선 센서 (측면 공격) - 红外线感应器 (侧边攻击) + 红外线感应器(侧边攻击) 紅外線感應器 (側邊攻擊) @@ -691,7 +691,7 @@ Магнитный сенсор (детонация вверх) 磁気感知式 (底面攻撃) 자기장 감지센서 (바닥 공격) - 磁性感应器 (底部攻击) + 磁性感应器(底部攻击) 磁性感應器 (底部攻擊) @@ -724,7 +724,7 @@ Detonatore a rilascio 自爆装置 자폭 장치 - 自杀炸弹客引爆器 + 自杀炸弹手引爆器 自殺炸彈客引爆器 @@ -740,7 +740,7 @@ Usato per attivare a distanza esplosivi al momento del rilascio 点火装置から遠隔から起爆したい時に使います。 압력이 해제될때 원격으로 폭발시킵니다. - 当放开按钮时, 将会引爆炸弹. + 当放开按钮时,将会引爆炸弹。 當放開按鈕時, 將會引爆炸彈. Patlayıcıları serbest bırakıldığında uzaktan tetiklemek için kullanılır. @@ -791,7 +791,7 @@ Richiedi specialisti? 特技兵を必須 전문가가 필요합니까? - 需要专家? + 需要专家? 需要專家? Uzmanlara ihtiyaç var mı? @@ -804,11 +804,11 @@ Requer especialista em explosivos para desativar explosivos? Padrão: Não 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 爆発物を無効化するには特技兵である必要かどうかを設定できます。標準: 無効化 폭발물을 해제하기 위해서는 전문가가 필요합니까? 기본설정: 아니요 - 需要炸弹专家才能拆除炸弹? 预设: 否 + 需要爆破专业兵才能拆除爆炸物? 预设:否 需要炸彈專家才能拆除炸彈? 預設: 否 Patlayıcı uzmanlarının patlayıcıları etkisiz hale getirmesini ister misiniz? Varsayılan: Hayır @@ -824,8 +824,8 @@ Штраф не-специалистам? Punisci non-specialisti? 非特技兵へ足かせ - 비-전문가에 불이익을 줍니까? - 折磨非专业人员? + 비전문가에게 불이익을 줍니까? + 惩罚非专业人士? 折磨非專業人員? @@ -837,11 +837,11 @@ Aumentar o tempo necessário para completar ações por não especialistas? Padrão: Sim 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 非特技兵は動作完了までの時間を増加させますか? 標準: 有効化 - 비-전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예 - 增加非专业人员相关操作的时间? 预设: 是 + 비전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예 + 增加非专业人员相关操作的时间? 预设:是 增加非專業人員相關操作的時間? 預設: 是 @@ -853,11 +853,11 @@ Explotar al desactivar? Explosion au désamorçage Robbanás hatástalanításkor? - Взрыв при разминир.? + Взрыв при разминировании? Fai esplodere quando disarmato? 解除中に爆発 - 해제시 폭발합니까? - 拆除时引爆? + 해제 시 폭발합니까? + 拆除时引爆? 拆除時引爆? @@ -869,11 +869,11 @@ ¿Habilitar ciertos explosivos para estallar al desactivar? Por defecto: Sí 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 特定の爆発物を解除中に爆発させるかどうかを設定できます。? 標準: 有効化 - 특정 폭발물이 해제시 폭발하게 합니까? 기본설정: 예 - 启用后, 某些炸弹会在拆除时引爆? 预设: 是 + 특정 폭발물이 해제 시 폭발하게 합니까? 기본설정: 예 + 启用后,某些爆炸物会在拆除时引爆? 预设:是 啟用後, 某些炸彈會在拆除時引爆? 預設: 是 @@ -904,7 +904,7 @@ Мина M6 SLAM (направлена вверх) M6 SLAM 地雷 (底面攻撃) M6 SLAM 지뢰 (바닥 공격) - M6指向性反装甲地雷 (底部攻击) + M6指向性反装甲地雷(底部攻击) M6指向性反裝甲地雷 (底部攻擊) @@ -919,7 +919,7 @@ Мина M6 SLAM (направлена вбок) M6 SLAM 地雷 (側面攻撃) M6 SLAM 지뢰 (측면 공격) - M6指向性反装甲地雷 (侧边攻击) + M6指向性反装甲地雷(侧边攻击) M6指向性反裝甲地雷 (側邊攻擊) @@ -934,7 +934,7 @@ Большое СВУ (городское, нажимного действия) 大きな IED (市街地用、圧力感知) 대형 급조폭발물 (시가지, 압력식) - 大型简易爆炸装置 (地表上, 压力盘) + 大型 IED(地表上,压力盘) 大型簡易爆炸裝置 (地表上, 壓力盤) @@ -949,7 +949,7 @@ Большое СВУ (закопанное, нажимного действия) 大きな IED (埋め込み型、圧力感知) 대형 급조폭발물 (묻힘, 압력식) - 大型简易爆炸装置 (地表下, 压力盘) + 大型 IED(地表下,压力盘) 大型簡易爆炸裝置 (地表下, 壓力盤) @@ -964,7 +964,7 @@ Малое СВУ (городское, нажимного действия) 小さな IED (市街地用、圧力感知) 소형 급조폭발물 (시가지, 압력식) - 小型简易爆炸装置 (地表上, 压力盘) + 小型 IED(地表上,压力盘) 小型簡易爆炸裝置 (地表上, 壓力盤) @@ -979,7 +979,7 @@ Малое СВУ (закопанное, нажимного действия) 小さな IED (埋め込み型、圧力感知) 소형 급조폭발물 (묻힘, 압력식) - 小型简易爆炸装置 (地表下, 压力盘) + 小型 IED(地表下,压力盘) 小型簡易爆炸裝置 (地表下, 壓力盤) @@ -1008,7 +1008,7 @@ 조명지뢰 Fusée éclairante avec fil piège Cavo d'innesco - 绊线闪光地雷 + 绊线信号弹 絆線閃光地雷 Tripwire (Sinalizador) Světlice na nástražném drátu @@ -1023,7 +1023,7 @@ 종류: 조명지뢰 - 작동시 무해한 조명을 사출합니다.<br />장탄수: 1<br />사용처: 지면 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 />使用于:地面 類型: 絆線閃光地雷 - 觸發後產生非致命性的強光.<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 @@ -1043,6 +1043,7 @@ Dosah exploze Patlayıcı menzili Alcance explosivo + 폭발 범위 Explosive Timer @@ -1054,9 +1055,11 @@ Timer de explosão Minuteur pour explosifs 引爆倒數 + 定时爆炸 Časovač exploze Patlayıcı Zamanlayıcı Temporizador de explosivo + 폭발 타이머 Is EOD @@ -1064,11 +1067,13 @@ EOD に Spécialiste en explosifs 是EOD + 爆破专家 è EOD Je specilista na výbušniny (EOD) Jest EOD Сапёр ¿Es EOD? + 폭발물 처리반 Controls whether the unit is an explosive specialist. @@ -1076,27 +1081,35 @@ ユニットが何であれ爆発物専門家にします。 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. Определяет, является ли юнит сапёром. Controla si la unidad es un especialista en explosivos + 유닛이 폭발물 처리반인지 결정합니다 Minimum Time - Минимальное время + Мин. время Durée minimale 最短時間 Tiempo mínimo Minimalny czas + Minimale Zeit + 最短时间 + 최소 시간 Maximum Time - Максимальное время + Макс. время Durée maximale 最長時間 Tiempo máximo Maksymalny czas + Maximale Zeit + 最长时间 + 최대 시간 Default Time @@ -1105,6 +1118,9 @@ 標準時間 Tiempo por defecto Domyślny czas + Standardmäßige Zeit + 默认时间 + 기본 시간 Minimum time value (in seconds) for the explosive timer. @@ -1113,6 +1129,9 @@ 起爆タイマーの最低時間 (秒) を設定します。 Tiempo mínimo (en segundos) para el temporizador del explosivo. Minimalna wartość czasomierza dla ładunku (w sekundach). + Minimale Zeit (in Sekunden) für den Zeitzünder. + 定时爆炸的最短时间(单位:秒) + 초 단위로, 폭발 타이머의 최소 시간을 정합니다 Maximum time value (in seconds) for the explosive timer. @@ -1121,6 +1140,9 @@ 起爆タイマーの最長時間 (秒) を設定します。 Tiempo máximo (en segundos) para el temporizador del explosivo. Maksymalna wartość czasomierza dla ładunku (w sekundach). + Maximale Zeit (in Sekunden) für den Zeitzünder. + 定时爆炸的最长时间(单位:秒) + 초 단위로, 폭발 타이머의 최대 시간을 정합니다 Default time value (in seconds) for the explosive timer. @@ -1129,6 +1151,9 @@ 起爆タイマーの標準時間 (秒) を設定します。 Tiempo por defecto (en segundos) para el temporizador del explosivo. Domyślna wartość czasomierza dla ładunku (w sekundach). + Standardmäßige Zeit (in Sekunden) für den Zeitzünder. + 定时爆炸的默认时间(单位:秒) + 초 단위로, 기본 폭발 타이머 시간을 정합니다 diff --git a/addons/fastroping/CfgSounds.hpp b/addons/fastroping/CfgSounds.hpp index 97479ecafb..a93c4ba032 100644 --- a/addons/fastroping/CfgSounds.hpp +++ b/addons/fastroping/CfgSounds.hpp @@ -9,4 +9,4 @@ class CfgSounds { sound[] = {QUOTE(PATHTOF(data\sounds\fastroping_thud.ogg)), 10, 1.0}; titles[] = {}; }; -}; \ No newline at end of file +}; diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp index fc4aed6ae4..710f70f94e 100644 --- a/addons/fastroping/CfgVehicles.hpp +++ b/addons/fastroping/CfgVehicles.hpp @@ -1,16 +1,3 @@ -#define EQUIP_FRIES_ATTRIBUTE class Attributes { \ - class GVAR(equipFRIES) { \ - property = QGVAR(equipFRIES); \ - control = "Checkbox"; \ - displayName = CSTRING(Eden_equipFRIES); \ - tooltip = CSTRING(Eden_equipFRIES_Tooltip); \ - expression = QUOTE(if (_value) then {[_this] call FUNC(equipFRIES)}); \ - typeName = "BOOL"; \ - condition = "objectVehicle"; \ - defaultValue = "(false)"; \ - }; \ -} - class CfgVehicles { class Logic; class Module_F: Logic { @@ -96,8 +83,8 @@ class CfgVehicles { }; class ACE_fastRope { displayName = CSTRING(Interaction_fastRope); - condition = [_player, _target] call FUNC(canFastRope); - statement = [_player, _target] call FUNC(fastRope); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFastRope)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(fastRope)); }; }; }; @@ -190,6 +177,7 @@ class CfgVehicles { author = "KoffeinFlummi"; scope = 1; model = QPATHTOF(data\helper.p3d); + destrType = "DestructNo"; class ACE_Actions {}; class Turrets {}; class TransportItems {}; @@ -221,7 +209,9 @@ class CfgVehicles { GVAR(friesAttachmentPoint)[] = {0.035, 2.2, -0.15}; GVAR(onPrepare) = QFUNC(onPrepareCommon); GVAR(onCut) = QFUNC(onCutCommon); - EQUIP_FRIES_ATTRIBUTE; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; }; class Heli_Transport_02_base_F: Helicopter_Base_H { GVAR(enabled) = 1; @@ -254,14 +244,19 @@ class CfgVehicles { GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(friesType) = "ACE_friesGantryReverse"; GVAR(friesAttachmentPoint)[] = {-1.04, 2.5, -0.34}; - EQUIP_FRIES_ATTRIBUTE; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; }; class Heli_light_03_unarmed_base_F: Heli_light_03_base_F { GVAR(enabled) = 2; GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(friesType) = "ACE_friesGantry"; GVAR(friesAttachmentPoint)[] = {1.07, 2.5, -0.5}; - EQUIP_FRIES_ATTRIBUTE; + + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; }; class Heli_Transport_04_base_F: Helicopter_Base_H { class UserActions; diff --git a/addons/fastroping/XEH_postInit.sqf b/addons/fastroping/XEH_postInit.sqf index 43e5de24f9..27d3ca4008 100644 --- a/addons/fastroping/XEH_postInit.sqf +++ b/addons/fastroping/XEH_postInit.sqf @@ -32,6 +32,17 @@ }, {false}] call CBA_fnc_addKeybind; +if (isServer) then { + ["Helicopter", "init", { + if (!GVAR(autoAddFRIES)) exitWith {}; + params ["_vehicle"]; + if (isNumber (configOf _vehicle >> QGVAR(enabled)) && {isNil {_vehicle getVariable [QGVAR(FRIES), nil]}}) then { + [_vehicle] call FUNC(equipFRIES); + }; + }, true, ["ACE_friesBase"], true] call CBA_fnc_addClassEventHandler; +}; + + #ifdef DRAW_FASTROPE_INFO addMissionEventHandler ["Draw3D", { if (!(cursorObject isKindOf "Helicopter")) exitWith {}; diff --git a/addons/fastroping/config.cpp b/addons/fastroping/config.cpp index be8f70a482..dbf1f35e6a 100644 --- a/addons/fastroping/config.cpp +++ b/addons/fastroping/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction","ace_logistics_rope"}; author = ECSTRING(common,ACETeam); - authors[] = {"KoffeinFlummi", "BaerMitUmlaut", "Pokertour"}; + authors[] = {"KoffeinFlummi", "BaerMitUmlaut", "Pokertour", "veteran29"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/fastroping/functions/fnc_canCloseRamp.sqf b/addons/fastroping/functions/fnc_canCloseRamp.sqf index 969d719796..9416bb51ea 100644 --- a/addons/fastroping/functions/fnc_canCloseRamp.sqf +++ b/addons/fastroping/functions/fnc_canCloseRamp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the player can close the ramp of the given helo. diff --git a/addons/fastroping/functions/fnc_canCutRopes.sqf b/addons/fastroping/functions/fnc_canCutRopes.sqf index f65f2ef89a..922cafbaa6 100644 --- a/addons/fastroping/functions/fnc_canCutRopes.sqf +++ b/addons/fastroping/functions/fnc_canCutRopes.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the unit can cut deployed ropes. diff --git a/addons/fastroping/functions/fnc_canDeployRopes.sqf b/addons/fastroping/functions/fnc_canDeployRopes.sqf index 4338ac0130..a27db7f1b3 100644 --- a/addons/fastroping/functions/fnc_canDeployRopes.sqf +++ b/addons/fastroping/functions/fnc_canDeployRopes.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the unit can deploy ropes from the helicopter. diff --git a/addons/fastroping/functions/fnc_canFastRope.sqf b/addons/fastroping/functions/fnc_canFastRope.sqf index a071160821..e5e4513d46 100644 --- a/addons/fastroping/functions/fnc_canFastRope.sqf +++ b/addons/fastroping/functions/fnc_canFastRope.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the unit can fast rope from the helicopter. diff --git a/addons/fastroping/functions/fnc_canPrepareFRIES.sqf b/addons/fastroping/functions/fnc_canPrepareFRIES.sqf index b6068f5341..c5ac466729 100644 --- a/addons/fastroping/functions/fnc_canPrepareFRIES.sqf +++ b/addons/fastroping/functions/fnc_canPrepareFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the unit can prepare the helicopters FRIES. diff --git a/addons/fastroping/functions/fnc_canStowFRIES.sqf b/addons/fastroping/functions/fnc_canStowFRIES.sqf index 462799eb01..7036d142c8 100644 --- a/addons/fastroping/functions/fnc_canStowFRIES.sqf +++ b/addons/fastroping/functions/fnc_canStowFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the unit can stow the helicopters FRIES. diff --git a/addons/fastroping/functions/fnc_cutRopes.sqf b/addons/fastroping/functions/fnc_cutRopes.sqf index f17d08dc18..cbd01b5661 100644 --- a/addons/fastroping/functions/fnc_cutRopes.sqf +++ b/addons/fastroping/functions/fnc_cutRopes.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Cut deployed ropes. diff --git a/addons/fastroping/functions/fnc_deployAI.sqf b/addons/fastroping/functions/fnc_deployAI.sqf index d1546aad63..01aa363afb 100644 --- a/addons/fastroping/functions/fnc_deployAI.sqf +++ b/addons/fastroping/functions/fnc_deployAI.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Auomatically deploy a helicopter filled with AI units. diff --git a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf index 273d148329..83bd8a34cf 100644 --- a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf +++ b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Waypoint function for the fast rope waypoint. @@ -24,7 +24,7 @@ private _speedMode = speedMode _group; // - Approach ----------------------------------------------------------------- if (_vehicle distance2D _position > 50) then { _group setSpeedMode "LIMITED"; - _vehicle flyInHeight 20; + _vehicle flyInHeight [20, true]; _commander doMove _position; waitUntil {_vehicle distance2D _position < 50}; waitUntil {vectorMagnitude (velocity _vehicle) < 3}; diff --git a/addons/fastroping/functions/fnc_deployRopes.sqf b/addons/fastroping/functions/fnc_deployRopes.sqf index d6f3afbf98..71cfbbbc21 100644 --- a/addons/fastroping/functions/fnc_deployRopes.sqf +++ b/addons/fastroping/functions/fnc_deployRopes.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Deploy ropes from the helicopter. diff --git a/addons/fastroping/functions/fnc_equipFRIES.sqf b/addons/fastroping/functions/fnc_equipFRIES.sqf index 6dcb29e3e7..615840cb75 100644 --- a/addons/fastroping/functions/fnc_equipFRIES.sqf +++ b/addons/fastroping/functions/fnc_equipFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Equips the given helicopter with a FRIES. @@ -15,15 +15,20 @@ * Public: Yes */ -params ["_vehicle"]; +[{ + params ["_vehicle"]; -private _config = configOf _vehicle; -if !(isNumber (_config >> QGVAR(enabled))) then { - ["%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))]; - _vehicle setVariable [QGVAR(FRIES), _fries, true]; + if (!alive _vehicle) exitWith { WARNING_1("bad vehicle %1",_this); }; + if (alive (_vehicle getVariable [QGVAR(FRIES),objNull])) exitWith { WARNING_1("already equiped %1",_this); }; + + private _config = configOf _vehicle; + if !(isNumber (_config >> QGVAR(enabled))) then { + ["%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))]; + _vehicle setVariable [QGVAR(FRIES), _fries, true]; + }; }; -}; +}, _this] call CBA_fnc_execNextFrame; diff --git a/addons/fastroping/functions/fnc_fastRope.sqf b/addons/fastroping/functions/fnc_fastRope.sqf index 39f7cc38c9..80be870553 100644 --- a/addons/fastroping/functions/fnc_fastRope.sqf +++ b/addons/fastroping/functions/fnc_fastRope.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Lets the unit fast rope. diff --git a/addons/fastroping/functions/fnc_fastRopeLocalPFH.sqf b/addons/fastroping/functions/fnc_fastRopeLocalPFH.sqf index c46e919bc5..92d23715b0 100644 --- a/addons/fastroping/functions/fnc_fastRopeLocalPFH.sqf +++ b/addons/fastroping/functions/fnc_fastRopeLocalPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Local PerFrameHandler during fast roping. diff --git a/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf b/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf index 9eb3ae4e4e..c3b7fe1ea4 100644 --- a/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf +++ b/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Server PerFrameHandler during fast roping. diff --git a/addons/fastroping/functions/fnc_moduleEquipFRIES.sqf b/addons/fastroping/functions/fnc_moduleEquipFRIES.sqf index 33975168a6..970194ab63 100644 --- a/addons/fastroping/functions/fnc_moduleEquipFRIES.sqf +++ b/addons/fastroping/functions/fnc_moduleEquipFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Equips synched helicopters with a FRIES. diff --git a/addons/fastroping/functions/fnc_onCutCommon.sqf b/addons/fastroping/functions/fnc_onCutCommon.sqf index c6daaa7c35..e9209e4fa1 100644 --- a/addons/fastroping/functions/fnc_onCutCommon.sqf +++ b/addons/fastroping/functions/fnc_onCutCommon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Function for closing doors and retracting the hook for most vanilla and older Arma helos. diff --git a/addons/fastroping/functions/fnc_onPrepareCommon.sqf b/addons/fastroping/functions/fnc_onPrepareCommon.sqf index 362d04c120..93501ccf40 100644 --- a/addons/fastroping/functions/fnc_onPrepareCommon.sqf +++ b/addons/fastroping/functions/fnc_onPrepareCommon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Function for opening doors and extending the hook for most vanilla and older Arma helos. diff --git a/addons/fastroping/functions/fnc_onRopeBreak.sqf b/addons/fastroping/functions/fnc_onRopeBreak.sqf index 9c089f5c91..de9c49b6b8 100644 --- a/addons/fastroping/functions/fnc_onRopeBreak.sqf +++ b/addons/fastroping/functions/fnc_onRopeBreak.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles ropes breaking when deployed. diff --git a/addons/fastroping/functions/fnc_prepareFRIES.sqf b/addons/fastroping/functions/fnc_prepareFRIES.sqf index 9f1c1b941a..0eb4bffcf8 100644 --- a/addons/fastroping/functions/fnc_prepareFRIES.sqf +++ b/addons/fastroping/functions/fnc_prepareFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Prepares the helicopters FRIES. diff --git a/addons/fastroping/functions/fnc_stowFRIES.sqf b/addons/fastroping/functions/fnc_stowFRIES.sqf index 297cb925d1..9ad54796bd 100644 --- a/addons/fastroping/functions/fnc_stowFRIES.sqf +++ b/addons/fastroping/functions/fnc_stowFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Stows the helicopters FRIES. diff --git a/addons/fastroping/functions/fnc_unequipFRIES.sqf b/addons/fastroping/functions/fnc_unequipFRIES.sqf index 540ebb2f3f..8483322cef 100644 --- a/addons/fastroping/functions/fnc_unequipFRIES.sqf +++ b/addons/fastroping/functions/fnc_unequipFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Removes FRIES from helicopter. diff --git a/addons/fastroping/functions/script_component.hpp b/addons/fastroping/functions/script_component.hpp deleted file mode 100644 index 00e1b5bb76..0000000000 --- a/addons/fastroping/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\fastroping\script_component.hpp" diff --git a/addons/fastroping/initSettings.sqf b/addons/fastroping/initSettings.sqf index 5888f49aa2..844de927a2 100644 --- a/addons/fastroping/initSettings.sqf +++ b/addons/fastroping/initSettings.sqf @@ -1,6 +1,4 @@ -// CBA Settings [ADDON: ace_fastroping]: - -private _category = ["ACE Uncategorized", LLSTRING(setting_categoryMenu_displayName)]; +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(setting_categoryMenu_displayName)]; [ QGVAR(requireRopeItems), "CHECKBOX", @@ -11,3 +9,11 @@ private _category = ["ACE Uncategorized", LLSTRING(setting_categoryMenu_displayN {[QGVAR(requireRopeItems), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // needRestart ] call CBA_fnc_addSetting; + +[ + QGVAR(autoAddFRIES), "CHECKBOX", + [LSTRING(setting_autoAddFRIES_displayName), LSTRING(setting_autoAddFRIES_description)], + _category, + false, // default value + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/fastroping/script_component.hpp b/addons/fastroping/script_component.hpp index 5bd19a1db2..a9a07e2f02 100644 --- a/addons/fastroping/script_component.hpp +++ b/addons/fastroping/script_component.hpp @@ -16,6 +16,7 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" +#include "script_macros.hpp" #define DEFAULT_ROPE_LENGTH 34.5 diff --git a/addons/fastroping/script_macros.hpp b/addons/fastroping/script_macros.hpp new file mode 100644 index 0000000000..baaa10c338 --- /dev/null +++ b/addons/fastroping/script_macros.hpp @@ -0,0 +1,10 @@ +#define EQUIP_FRIES_ATTRIBUTE class EGVAR(fastroping,equipFRIES) { \ + property = QEGVAR(fastroping,equipFRIES); \ + control = "Checkbox"; \ + displayName = ECSTRING(fastroping,Eden_equipFRIES); \ + tooltip = ECSTRING(fastroping,Eden_equipFRIES_Tooltip); \ + expression = QUOTE(if (_value) then {[_this] call EFUNC(fastroping,equipFRIES)}); \ + typeName = "BOOL"; \ + condition = "objectVehicle"; \ + defaultValue = "false"; \ +} diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml index dc349d6778..a155f67664 100644 --- a/addons/fastroping/stringtable.xml +++ b/addons/fastroping/stringtable.xml @@ -12,7 +12,7 @@ Equipar FRIES Десантирование по канатам FRIES を装備 - FRIES 장착 + 패스트로프 시스템 장착 启用快速绳降及撤离系统 啟用快速繩降及撤離系統 @@ -54,7 +54,7 @@ ファスト ロープのシステムを収容 收起快速繩降系統 收起快速绳降系统 - 패스트 로프 시스템 보관 + 패스트로프 시스템 보관 Schowaj system zjazdu na linach Спрятать систему спуска Recolher o sistema de descida rápida @@ -74,7 +74,7 @@ Jogar cordas Зацепить канаты ロープを展開 - 줄 배치 + 줄 내리기 部属绳索 部屬繩索 Halatları sal @@ -90,7 +90,7 @@ Descida rápida Спуститься по канату ファスト ロープをする - 강하하기 + 패스트로프 快速绳降 快速繩降 Halatla in @@ -122,7 +122,7 @@ Equipar helicóptero com FRIES Снарядить вертолет канатами для спуска ヘリコプターへ FRIES を装備 - 헬리콥터에 FRIES 장착 + 헬리콥터에 패스트로프 시스템 장착 启用快速绳降及撤离系统给指定的直升机 啟用快速繩降及撤離系統給指定的直升機 @@ -152,7 +152,7 @@ ZJAZD NA LINACH 让单位快速绳降 讓單位快速繩降 - 패스트 로프를 놓음 + 유닛 패스트로프 시키기 UMOŽNIT JEDNOTKÁM SLAŇOVAT INDICAR A LAS UNIDADES DESCENDER POR LA CUERDA @@ -168,6 +168,9 @@ 3m halat sal Desplegar cuerdas de 3m 3m ロープを展開 + 部屬3公尺長之繩索 + 部署3米长的绳索 + 3m 줄 내리기 Deploy 6m ropes @@ -181,6 +184,9 @@ 6m halat sal Desplegar cuerdas de 6m 6m ロープを展開 + 部屬6公尺長之繩索 + 部署6米长的绳索 + 6m 줄 내리기 Deploy 12m ropes @@ -191,10 +197,12 @@ Выпустить 12 м канат Jogar cordar (12m) 部屬12公尺長之繩索 + 部署12米长的绳索 Dispiegamento corde 12m Připravit 12m lana 12m halat sal Desplegar cuerdas de 12m + 12m 줄 내리기 Deploy 15m ropes @@ -205,10 +213,12 @@ Выпустить 15 м канат Jogar cordar (15m) 部屬15公尺長之繩索 + 部署15米长的绳索 Dispiegamento corde 15m Připravit 15m lana 15m halat sal Desplegar cuerdas de 15m + 15m 줄 내리기 Deploy 18m ropes @@ -219,10 +229,12 @@ Выпустить 18 м канат Jogar cordar (18m) 部屬18公尺長之繩索 + 部署18米长的绳索 Dispiegamento corde 18m Připravit 18m lana 18m halat sal Desplegar cuerdas de 18m + 18m 줄 내리기 Deploy 27m ropes @@ -233,10 +245,12 @@ Выпустить 27 м канат Jogar cordar (27m) 部屬27公尺長之繩索 + 部署27米长的绳索 Dispiegamento corde 27m Připravit 27m lana 27m halat sal Desplegar cuerdas de 27m + 27m 줄 내리기 Deploy 36m ropes @@ -247,10 +261,12 @@ Выпустить 36 м канат Jogar cordar (36m) 部屬36公尺長之繩索 + 部署36米长的绳索 Dispiegamento corde 36m Připravit 36m lana 36m halat sal Desplegar cuerdas de 36m + 36m 줄 내리기 [ACE] Ropes Supply crate @@ -261,21 +277,26 @@ [ACE] Ящик с канатами [ACE] Suprimento de cordas [ACE] 繩索補充箱 + [ACE] 绳索补给箱 [ACE] Cassa Corde [ACE] Bedna s lany [ACE] Halat Sandığı [ACE] Caja de suministros - cuerdas + [ACE] 하강줄 보급 상자 Fast-roping Hélicordage 快速繩降 + 快速索降 ファスト ロープ Cuerdas rápidas Zjazd na linach Halatla Kayma Slaňování Спуск по канату + Schnelles-Abseilen + 패스트로프 Require rope item to deploy @@ -286,10 +307,24 @@ Требуется канат 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 + 줄이 필요합니다 + + + Auto-Equip FRIES + Automatycznie Zamontuj FRIES + FRIESの自動装備 + FRIES automatisch ausrüsten + + + Automatically add FRIES to helicopters that support them. + Automatycznie dodawaj FRIES do śmigłowców które je wspierają. + FRIESをサポートするヘリコプターに自動的にFRIESを追加します。 + FRIES automatisch Helikoptern hinzufügen, die es unterstützen diff --git a/addons/fcs/functions/fnc_adjustRange.sqf b/addons/fcs/functions/fnc_adjustRange.sqf index 30f9c86305..96cfa35364 100644 --- a/addons/fcs/functions/fnc_adjustRange.sqf +++ b/addons/fcs/functions/fnc_adjustRange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Adjusts the currently zeroed distance. diff --git a/addons/fcs/functions/fnc_calculateSolution.sqf b/addons/fcs/functions/fnc_calculateSolution.sqf index 478b34f502..5800068e4b 100644 --- a/addons/fcs/functions/fnc_calculateSolution.sqf +++ b/addons/fcs/functions/fnc_calculateSolution.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: VKing * Calculate FCS solution diff --git a/addons/fcs/functions/fnc_canResetFCS.sqf b/addons/fcs/functions/fnc_canResetFCS.sqf index 21811d9fd3..95e6d09a7f 100644 --- a/addons/fcs/functions/fnc_canResetFCS.sqf +++ b/addons/fcs/functions/fnc_canResetFCS.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Called from config. Can player reset FCS? diff --git a/addons/fcs/functions/fnc_canUseFCS.sqf b/addons/fcs/functions/fnc_canUseFCS.sqf index a5a1543de9..4ebe28f3be 100644 --- a/addons/fcs/functions/fnc_canUseFCS.sqf +++ b/addons/fcs/functions/fnc_canUseFCS.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called from config. Returns true if the player is a gunner and the players current vehicle has a FCS. diff --git a/addons/fcs/functions/fnc_canUseRangefinder.sqf b/addons/fcs/functions/fnc_canUseRangefinder.sqf index b558240363..ea9d65556e 100644 --- a/addons/fcs/functions/fnc_canUseRangefinder.sqf +++ b/addons/fcs/functions/fnc_canUseRangefinder.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns true if the laser distance measurement can be read from the engine. diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index e432944855..dedef1c74e 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Adjusts the direction of a shell. Called from the unified fired EH only if the gunner is a player. diff --git a/addons/fcs/functions/fnc_getAngle.sqf b/addons/fcs/functions/fnc_getAngle.sqf index 05add960fb..9a856d46c9 100644 --- a/addons/fcs/functions/fnc_getAngle.sqf +++ b/addons/fcs/functions/fnc_getAngle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Calculates the angle offset necessary to hit the current target. diff --git a/addons/fcs/functions/fnc_getRange.sqf b/addons/fcs/functions/fnc_getRange.sqf index 0512359d1e..7b24e61445 100644 --- a/addons/fcs/functions/fnc_getRange.sqf +++ b/addons/fcs/functions/fnc_getRange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Read laser distance measurement from engine. diff --git a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf index 9c8ef4c0a7..f90231b371 100644 --- a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf +++ b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle Air burst ammunition. Called from per frame handler. diff --git a/addons/fcs/functions/fnc_keyDown.sqf b/addons/fcs/functions/fnc_keyDown.sqf index 2e40b64a84..9137100b84 100644 --- a/addons/fcs/functions/fnc_keyDown.sqf +++ b/addons/fcs/functions/fnc_keyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Starts watching the target for sideways correction. diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index d96b6d5307..f7b9d88c8f 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Calculates the offsets for all weapons needed to hit the current target. diff --git a/addons/fcs/functions/fnc_onForceUpdate.sqf b/addons/fcs/functions/fnc_onForceUpdate.sqf index ddf426d293..b1e3f0c4bd 100644 --- a/addons/fcs/functions/fnc_onForceUpdate.sqf +++ b/addons/fcs/functions/fnc_onForceUpdate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/fcs/functions/fnc_reset.sqf b/addons/fcs/functions/fnc_reset.sqf index 4cbc4ee7b2..437d5577d3 100644 --- a/addons/fcs/functions/fnc_reset.sqf +++ b/addons/fcs/functions/fnc_reset.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Resets the FCS to default. diff --git a/addons/fcs/functions/fnc_updateRangeHUD.sqf b/addons/fcs/functions/fnc_updateRangeHUD.sqf index a00de5fc67..29e23ee05c 100644 --- a/addons/fcs/functions/fnc_updateRangeHUD.sqf +++ b/addons/fcs/functions/fnc_updateRangeHUD.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Update compatible info elements. diff --git a/addons/fcs/functions/fnc_vehicleInit.sqf b/addons/fcs/functions/fnc_vehicleInit.sqf index b6e8eff316..f2d9d8192a 100644 --- a/addons/fcs/functions/fnc_vehicleInit.sqf +++ b/addons/fcs/functions/fnc_vehicleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Checks if a vehicle is equipped with an FCS and if so, adds the fired event handler. Execute on server. diff --git a/addons/fcs/functions/script_component.hpp b/addons/fcs/functions/script_component.hpp deleted file mode 100644 index 179c66c15e..0000000000 --- a/addons/fcs/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\fcs\script_component.hpp" \ No newline at end of file diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index 6fff1a45c6..91c180545a 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -14,7 +14,7 @@ Marcar com laser / Medir Distância レーザー ターゲット / 計測距離 목표까지 거리를 레이저로 취득 - 雷射指示目标 / 测量距离 + 激光照射目标/测量距离 雷射指示目標 / 測量距離 @@ -30,7 +30,7 @@ Azzeramento a 次にゼロイン 영점 조절 - 归零到 + 已归零到 歸零到 @@ -43,10 +43,10 @@ FCS tartomány állítása (Fel) Ajustar distância do FCS (Acima) Aumentare la distanza dell'FCS - Диапазон СУО (Выше) + Диапазон СУО (выше) FCS による距離を調節 (上げ) 사통장치 거리 조정 (위로) - 调整火控系统距离 (上) + 调整火控系统距离(上调) 調整火控系統距離 (上) @@ -59,10 +59,10 @@ FCS tartomány állítása (Le) Ajustar distância do FCS (Abaixo) Ridurre la distanza dell'FCS - Диапазон СУО (Ниже) + Диапазон СУО (ниже) FCS による距離を調節 (下げ) 사통장치 거리 조정 (아래로) - 调整火控系统距离 (下) + 调整火控系统距离(下调) 調整火控系統距離 (下) diff --git a/addons/field_rations/CfgMoves.hpp b/addons/field_rations/CfgMoves.hpp index 7fc9ebf3ec..dd0a23b829 100644 --- a/addons/field_rations/CfgMoves.hpp +++ b/addons/field_rations/CfgMoves.hpp @@ -33,19 +33,19 @@ class CfgMovesMaleSdr: CfgMovesBasic { }; class GVAR(drinkStandCan): GVAR(drinkStand) { file = QPATHTOF(anim\drink_stand_can.rtm); - speed = 1/9; + speed = "1/9"; }; class GVAR(drinkCrouchCan): GVAR(drinkCrouch) { file = QPATHTOF(anim\drink_crouch_can.rtm); - speed = 1/9; + speed = "1/9"; }; class GVAR(drinkProneCan): GVAR(drinkProne) { file = QPATHTOF(anim\drink_prone_can.rtm); - speed = 1/9; + speed = "1/9"; }; class GVAR(drinkFromSource): GVAR(drinkStand) { file = QPATHTOF(anim\drink_source.rtm); - speed = 1/8; + speed = "1/8"; }; class GVAR(drinkFromSourceHigh): GVAR(drinkFromSource) { file = QPATHTOF(anim\drink_source_high.rtm); diff --git a/addons/field_rations/CfgUIGrids.hpp b/addons/field_rations/CfgUIGrids.hpp index ce5d3d6440..9c02c00945 100644 --- a/addons/field_rations/CfgUIGrids.hpp +++ b/addons/field_rations/CfgUIGrids.hpp @@ -5,13 +5,13 @@ class CfgUIGrids { class Variables { XGVAR(grid)[] = { { - safeZoneX + safeZoneW - 4.2 * GUI_GRID_W, - safeZoneY + safeZoneH - 2.2 * GUI_GRID_H, - 4 * GUI_GRID_W, - 2 * GUI_GRID_H + QUOTE(safeZoneX + safeZoneW - 4.2 * GUI_GRID_W), + QUOTE(safeZoneY + safeZoneH - 2.2 * GUI_GRID_H), + QUOTE(4 * GUI_GRID_W), + QUOTE(2 * GUI_GRID_H) }, - GUI_GRID_W, - GUI_GRID_H + QUOTE(GUI_GRID_W), + QUOTE(GUI_GRID_H) }; }; }; diff --git a/addons/field_rations/CfgVehicles.hpp b/addons/field_rations/CfgVehicles.hpp index 0b0d3828cc..680a55afbc 100644 --- a/addons/field_rations/CfgVehicles.hpp +++ b/addons/field_rations/CfgVehicles.hpp @@ -79,7 +79,11 @@ class CfgVehicles { XGVAR(waterSupply) = REFILL_WATER_INFINITE; XGVAR(offset)[] = {0, -0.12, -0.25}; }; - + class House_Small_F; + class Land_ConcreteWell_02_F: House_Small_F { + XGVAR(waterSupply) = REFILL_WATER_INFINITE; + XGVAR(offset)[] = {0, 0, -0.25}; + }; class Land_WaterPump_01_F; class WaterPump_01_forest_F: Land_WaterPump_01_F { XGVAR(waterSupply) = REFILL_WATER_INFINITE; @@ -277,4 +281,14 @@ class CfgVehicles { MACRO_ADDITEM(ACE_Humanitarian_Ration,1); }; }; + class ACE_Sunflower_Seeds_Item: Item_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + scopeCurator = 2; + displayName = CSTRING(SunflowerSeeds_DisplayName); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_Sunflower_Seeds,1); + }; + }; }; diff --git a/addons/field_rations/CfgWeapons.hpp b/addons/field_rations/CfgWeapons.hpp index 5e397760ed..b100ba4e90 100644 --- a/addons/field_rations/CfgWeapons.hpp +++ b/addons/field_rations/CfgWeapons.hpp @@ -40,6 +40,7 @@ class CfgWeapons { XGVAR(replacementItem) = "ACE_WaterBottle_Half"; XGVAR(consumeAnims)[] = {QGVAR(drinkStand), QGVAR(drinkCrouch), QGVAR(drinkProne)}; XGVAR(consumeSounds)[] = {QGVAR(drink1), QGVAR(drink1), QGVAR(drink2)}; + ACE_isFieldRationItem = 1; }; class ACE_WaterBottle_Half: ACE_WaterBottle { @@ -87,6 +88,7 @@ class CfgWeapons { XGVAR(replacementItem) = "ACE_Canteen_Half"; XGVAR(consumeAnims)[] = {QGVAR(drinkStand), QGVAR(drinkCrouch), QGVAR(drinkProne)}; XGVAR(consumeSounds)[] = {QGVAR(drink1), QGVAR(drink1), QGVAR(drink2)}; + ACE_isFieldRationItem = 1; }; class ACE_Canteen_Half: ACE_Canteen { @@ -132,6 +134,7 @@ class CfgWeapons { XGVAR(consumeText) = CSTRING(DrinkingX); XGVAR(consumeAnims)[] = {QGVAR(drinkStandCan), QGVAR(drinkCrouchCan), QGVAR(drinkProneCan)}; XGVAR(consumeSounds)[] = {QGVAR(drinkCan1), QGVAR(drinkCan1), QGVAR(drinkCan2)}; + ACE_isFieldRationItem = 1; }; class ACE_Can_Franta: ACE_Can_Spirit { @@ -164,6 +167,7 @@ class CfgWeapons { XGVAR(consumeTime) = 10; XGVAR(hungerSatiated) = 20; XGVAR(consumeText) = CSTRING(EatingX); + ACE_isFieldRationItem = 1; }; class ACE_MRE_BeefStew: ACE_MRE_LambCurry { @@ -225,4 +229,21 @@ class CfgWeapons { model = QPATHTOF(data\mre_human.p3d); picture = QPATHTOF(ui\item_mre_human_co.paa); }; + + // - Misc Food ------------------------------------------------------------ + class ACE_Sunflower_Seeds: ACE_ItemCore { + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(SunflowerSeeds_DisplayName); + descriptionShort = CSTRING(SunflowerSeeds_Description); + model = QPATHTOF(data\sunflower_seeds.p3d); + picture = QPATHTOF(ui\item_sunflowerseeds_co.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 3; + }; + XGVAR(consumeTime) = 10; + XGVAR(hungerSatiated) = 10; + XGVAR(consumeText) = CSTRING(EatingX); + ACE_isFieldRationItem = 1; + }; }; diff --git a/addons/field_rations/RscTitles.hpp b/addons/field_rations/RscTitles.hpp index d578b16653..241b5b0e1f 100644 --- a/addons/field_rations/RscTitles.hpp +++ b/addons/field_rations/RscTitles.hpp @@ -12,15 +12,15 @@ class RscTitles { class controls { class Thirst: RscPicture { idc = IDC_COLORED_HUD_THIRST; - x = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),X)), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W]; - y = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),Y)), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H]; - w = 2 * GUI_GRID_W; - h = 2 * GUI_GRID_H; + x = QUOTE(profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),X))), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W)]); + y = QUOTE(profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),Y))), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H)]); + w = QUOTE(2 * GUI_GRID_W); + h = QUOTE(2 * GUI_GRID_H); text = QPATHTOF(ui\icon_hud_thirststatus.paa); }; class Hunger: Thirst { idc = IDC_COLORED_HUD_HUNGER; - x = 2 * GUI_GRID_W + (profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),X)), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W]); + x = QUOTE(2 * GUI_GRID_W + (profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),X))), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W)])); text = QPATHTOF(ui\icon_hud_hungerstatus.paa); }; }; @@ -35,39 +35,39 @@ class RscTitles { class controlsBackground { class Thirst: RscPicture { idc = -1; - x = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),X)), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W]; - y = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),Y)), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H]; - w = 2 * GUI_GRID_W; - h = 2 * GUI_GRID_H; + x = QUOTE(profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),X))), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W)]); + y = QUOTE(profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),Y))), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H)]); + w = QUOTE(2 * GUI_GRID_W); + h = QUOTE(2 * GUI_GRID_H); text = QPATHTOF(ui\icon_hud_thirststatus.paa); colorText[] = {1, 1, 1, 0.2}; }; class Hunger: Thirst { - x = 2 * GUI_GRID_W + (profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),X)), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W]); + x = QUOTE(2 * GUI_GRID_W + (profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),X))), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W)])); text = QPATHTOF(ui\icon_hud_hungerstatus.paa); }; }; class controls { class ThirstGroup: RscControlsGroupNoScrollbars { idc = IDC_DRAINING_HUD_THIRST_GROUP; - x = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),X)), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W]; - y = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),Y)), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H]; - w = 2 * GUI_GRID_W; - h = 2 * GUI_GRID_H; + x = QUOTE(profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),X))), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W)]); + y = QUOTE(profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),Y))), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H)]); + w = QUOTE(2 * GUI_GRID_W); + h = QUOTE(2 * GUI_GRID_H); class controls { class Icon: RscPicture { idc = IDC_DRAINING_HUD_THIRST_ICON; x = 0; y = 0; - w = 2 * GUI_GRID_W; - h = 2 * GUI_GRID_H; + w = QUOTE(2 * GUI_GRID_W); + h = QUOTE(2 * GUI_GRID_H); text = QPATHTOF(ui\icon_hud_thirststatus.paa); }; }; }; class HungerGroup: ThirstGroup { idc = IDC_DRAINING_HUD_HUNGER_GROUP; - x = 2 * GUI_GRID_W + (profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),X)), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W]); + x = QUOTE(2 * GUI_GRID_W + (profileNamespace getVariable [ARR_2(QUOTE(QUOTE(TRIPLES(IGUI,XGVAR(grid),X))), safeZoneX + safeZoneW - 4.2 * GUI_GRID_W)])); class controls: controls { class Icon: Icon { idc = IDC_DRAINING_HUD_HUNGER_ICON; diff --git a/addons/field_rations/XEH_PREP.hpp b/addons/field_rations/XEH_PREP.hpp index 68833a495b..2035345f47 100644 --- a/addons/field_rations/XEH_PREP.hpp +++ b/addons/field_rations/XEH_PREP.hpp @@ -14,5 +14,6 @@ ACEX_PREP(handleEffects); ACEX_PREP(handleHUD); ACEX_PREP(handleRespawn); ACEX_PREP(refillItem); +ACEX_PREP(scanFieldRations); ACEX_PREP(setRemainingWater); ACEX_PREP(update); diff --git a/addons/field_rations/XEH_postInit.sqf b/addons/field_rations/XEH_postInit.sqf index be81985bc4..1ee235ca4f 100644 --- a/addons/field_rations/XEH_postInit.sqf +++ b/addons/field_rations/XEH_postInit.sqf @@ -89,7 +89,8 @@ if !(hasInterface) exitWith {}; ], { params ["_unit", "", "_item"]; - [objNull, _unit, _item] call FUNC(consumeItem); + private _itemConfig = configFile >> "CfgWeapons" >> _item; + [objNull, _unit, [_item, _itemConfig, false]] call FUNC(consumeItem); false } ] call CBA_fnc_addItemContextMenuOption; diff --git a/addons/field_rations/XEH_preInit.sqf b/addons/field_rations/XEH_preInit.sqf index c4efb567ed..a54da0834a 100644 --- a/addons/field_rations/XEH_preInit.sqf +++ b/addons/field_rations/XEH_preInit.sqf @@ -8,6 +8,8 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +#define ARSENAL_CATEGORY_ICON QPATHTOF(ui\icon_survival.paa) + // Init arrays of status modifiers GVAR(thirstModifiers) = []; GVAR(hungerModifiers) = []; @@ -18,4 +20,9 @@ GVAR(waterSourceP3Ds) = _cache select 0; // List of refill action offsets corresponding to the p3ds in the array above GVAR(waterSourceOffsets) = _cache select 1; +// Custom Arsenal Tab +if (["ace_arsenal"] call EFUNC(common,isModLoaded)) then { + [keys FIELD_RATIONS_ITEMS, LLSTRING(DisplayName), ARSENAL_CATEGORY_ICON, -1, true] call EFUNC(arsenal,addRightPanelButton); +}; + ADDON = true; diff --git a/addons/field_rations/XEH_preStart.sqf b/addons/field_rations/XEH_preStart.sqf index eec59ff8f7..88109cf9ee 100644 --- a/addons/field_rations/XEH_preStart.sqf +++ b/addons/field_rations/XEH_preStart.sqf @@ -30,3 +30,5 @@ private _waterSourceOffsets = [ uiNamespace setVariable [QGVAR(cacheP3Ds), compileFinal str [_waterSourceP3Ds, _waterSourceOffsets]]; TRACE_1("compiled",count _waterSourceP3Ds); + +call FUNC(scanFieldRations); diff --git a/addons/field_rations/anim/zDummy.rtm b/addons/field_rations/anim/zDummy.rtm new file mode 100644 index 0000000000..dfeb7b7fcc Binary files /dev/null and b/addons/field_rations/anim/zDummy.rtm differ diff --git a/addons/field_rations/config.cpp b/addons/field_rations/config.cpp index d7acbb66b1..d4d8674b80 100644 --- a/addons/field_rations/config.cpp +++ b/addons/field_rations/config.cpp @@ -21,7 +21,8 @@ class CfgPatches { "ACE_MRE_SteakVegetables_Item", "ACE_MRE_MeatballsPasta_Item", "ACE_MRE_ChickenHerbDumplings_Item", - "ACE_Humanitarian_Ration_Item" + "ACE_Humanitarian_Ration_Item", + "ACE_Sunflower_Seeds_Item" }; weapons[] = { "ACE_WaterBottle", @@ -41,7 +42,8 @@ class CfgPatches { "ACE_MRE_SteakVegetables", "ACE_MRE_MeatballsPasta", "ACE_MRE_ChickenHerbDumplings", - "ACE_Humanitarian_Ration" + "ACE_Humanitarian_Ration", + "ACE_Sunflower_Seeds" }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interact_menu"}; diff --git a/addons/field_rations/data/sunflower_seeds.p3d b/addons/field_rations/data/sunflower_seeds.p3d new file mode 100644 index 0000000000..9febd9bba1 Binary files /dev/null and b/addons/field_rations/data/sunflower_seeds.p3d differ diff --git a/addons/field_rations/data/sunflower_seeds_co.paa b/addons/field_rations/data/sunflower_seeds_co.paa new file mode 100644 index 0000000000..d0d1c0421e Binary files /dev/null and b/addons/field_rations/data/sunflower_seeds_co.paa differ diff --git a/addons/field_rations/functions/fnc_addStatusModifier.sqf b/addons/field_rations/functions/fnc_addStatusModifier.sqf index adeaadd07b..39d2388680 100644 --- a/addons/field_rations/functions/fnc_addStatusModifier.sqf +++ b/addons/field_rations/functions/fnc_addStatusModifier.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Adds a status modifier. Should be called on all machines. diff --git a/addons/field_rations/functions/fnc_addWaterSourceInteractions.sqf b/addons/field_rations/functions/fnc_addWaterSourceInteractions.sqf index 0d320b0610..d45ea877ca 100644 --- a/addons/field_rations/functions/fnc_addWaterSourceInteractions.sqf +++ b/addons/field_rations/functions/fnc_addWaterSourceInteractions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Dynamically adds actions to nearby water sources when interact_menu is opened. diff --git a/addons/field_rations/functions/fnc_canDrinkFromSource.sqf b/addons/field_rations/functions/fnc_canDrinkFromSource.sqf index 7ef256f4be..78b08fb231 100644 --- a/addons/field_rations/functions/fnc_canDrinkFromSource.sqf +++ b/addons/field_rations/functions/fnc_canDrinkFromSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Checks if the player can drink directly from the given water source. diff --git a/addons/field_rations/functions/fnc_canRefillItem.sqf b/addons/field_rations/functions/fnc_canRefillItem.sqf index 13a859337f..3b7ac1e7f4 100644 --- a/addons/field_rations/functions/fnc_canRefillItem.sqf +++ b/addons/field_rations/functions/fnc_canRefillItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Checks whether the player can refill an item from given water source. @@ -6,23 +6,30 @@ * Arguments: * 0: Water source * 1: Player - * 2: Item classname + * 2: Item data + * 0: Item classname + * 1: Item config + * 2: Is item magazine * * Return Value: * Can refill item * * Example: - * [_source, _player, "ACE_WaterBottle_Empty"] call ace_field_rations_fnc_canRefillItem + * [_source, _player, ["ACE_WaterBottle_Empty", configFile >> "CfgWeapons" >> "ACE_WaterBottle_Empty", false]] call ace_field_rations_fnc_canRefillItem * * Public: No */ -params ["_source", "_player", "_item"]; +params ["_source", "_player", "_itemData"]; +_itemData params ["_item", "_itemConfig", "_isMagazine"]; alive _source && {XGVAR(waterSourceActions) != 0} -&& {_item in (_player call EFUNC(common,uniqueItems))} +&& { + (_isMagazine && {_item in magazines _player}) + || {_item in (_player call EFUNC(common,uniqueItems))} +} && { private _water = _source call FUNC(getRemainingWater); - _water == REFILL_WATER_INFINITE || {_water >= getNumber (configFile >> "CfgWeapons" >> _item >> QXGVAR(refillAmount))} + _water == REFILL_WATER_INFINITE || {_water >= getNumber (_itemConfig >> QXGVAR(refillAmount))} } diff --git a/addons/field_rations/functions/fnc_checkWater.sqf b/addons/field_rations/functions/fnc_checkWater.sqf index 97ffade604..32167e6114 100644 --- a/addons/field_rations/functions/fnc_checkWater.sqf +++ b/addons/field_rations/functions/fnc_checkWater.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Displays the remaining water in the given water source. diff --git a/addons/field_rations/functions/fnc_consumeItem.sqf b/addons/field_rations/functions/fnc_consumeItem.sqf index 8e727e75a2..2c3b6f815a 100644 --- a/addons/field_rations/functions/fnc_consumeItem.sqf +++ b/addons/field_rations/functions/fnc_consumeItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Consumes an item. Creates a progress bar and handles relevant thirst/hunger values. @@ -6,21 +6,23 @@ * Arguments: * 0: Target (not used) * 1: Player - * 2: Item classname + * 2: Item data + * 0: Item classname + * 1: Item config + * 2: Is item magazine * * Return Value: * None * * Example: - * [objNull, ACE_player, "ACE_WaterBottle"] call ace_field_rations_fnc_consumeItem + * [objNull, ACE_player, "["ACE_WaterBottle_Empty", configFile >> "CfgWeapons" >> "ACE_WaterBottle_Empty", false]] call ace_field_rations_fnc_consumeItem * * Public: No */ -params ["", "_player", "_consumeItem"]; -TRACE_2("Consume item started",_player,_consumeItem); - -private _config = configFile >> "CfgWeapons" >> _consumeItem; +params ["", "_player", "_consumeData"]; +_consumeData params ["_consumeItem", "_config", "_isMagazine"]; +TRACE_3("Consume item started",_player,_consumeItem,_config); // Get consume time for item private _consumeTime = getNumber (_config >> QXGVAR(consumeTime)); @@ -70,11 +72,15 @@ private _soundPlayed = if (_consumeAnim != "" && {vehicle _player == _player && private _fnc_onSuccess = { params ["_args"]; - _args params ["_player", "_consumeItem", "_replacementItem", "_thirstQuenched", "_hungerSatiated"]; + _args params ["_player", "_consumeItem", "_replacementItem", "_thirstQuenched", "_hungerSatiated", "", "", "", "_isMagazine"]; TRACE_1("Consume item successful",_args); // Remove consumed item - _player removeItem _consumeItem; + if (_isMagazine) then { + _player removeMagazineGlobal _consumeItem; + } else { + _player removeItem _consumeItem; + }; // Add replacement item if needed if (_replacementItem != "") then { @@ -92,7 +98,7 @@ private _fnc_onSuccess = { _player setVariable [QXGVAR(hunger), (_hunger - _hungerSatiated) max 0]; }; - ["acex_rationConsumed", [_player, _consumeItem, _replacementItem, _thirstQuenched, _hungerSatiated]] call CBA_fnc_localEvent; + ["acex_rationConsumed", [_player, _consumeItem, _replacementItem, _thirstQuenched, _hungerSatiated, _isMagazine]] call CBA_fnc_localEvent; _player setVariable [QGVAR(previousAnim), nil]; }; @@ -115,7 +121,7 @@ private _fnc_onFailure = { private _fnc_condition = { params ["_args"]; - _args params ["_player", "_consumeItem", "", "", "", "_consumeAnim", "_consumeSound", "_soundPlayed"]; + _args params ["_player", "_consumeItem", "", "", "", "_consumeAnim", "_consumeSound", "_soundPlayed", "_isMagazine"]; // Attempt to sync sound with animation start if (!_soundPlayed && {_consumeSound != "" && {_consumeAnim == "" || {animationState _player == _consumeAnim}}}) then { @@ -123,7 +129,10 @@ private _fnc_condition = { _args set [7, true]; }; - _consumeItem in (_player call EFUNC(common,uniqueItems)) + if (_isMagazine) exitWith { + _consumeItem in magazines _player // return + }; + _consumeItem in (_player call EFUNC(common,uniqueItems)) // return }; [ @@ -136,7 +145,8 @@ private _fnc_condition = { _hungerSatiated, _consumeAnim, _consumeSound, - _soundPlayed + _soundPlayed, + _isMagazine ], _fnc_onSuccess, _fnc_onFailure, diff --git a/addons/field_rations/functions/fnc_drinkFromSource.sqf b/addons/field_rations/functions/fnc_drinkFromSource.sqf index e4a2c3ff67..3d76d4ff62 100644 --- a/addons/field_rations/functions/fnc_drinkFromSource.sqf +++ b/addons/field_rations/functions/fnc_drinkFromSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Makes the player drink directly from the given water source. @@ -63,11 +63,11 @@ private _fnc_condition = { [_player, _source] call FUNC(canDrinkFromSource) }; -private _sourceType = typeOf _source; -private _progressText = if (_sourceType == "") then { +private _sourceConfig = configOf _source; +private _progressText = if (isNull _sourceConfig) then { LLSTRING(DrinkingFromSource) } else { - format [LLSTRING(DrinkingFromX), getText (configFile >> "CfgVehicles" >> _sourceType >> "displayName")] + format [LLSTRING(DrinkingFromX), getText (_sourceConfig >> "displayName")] }; [ diff --git a/addons/field_rations/functions/fnc_getActionOffset.sqf b/addons/field_rations/functions/fnc_getActionOffset.sqf index f8cc392660..dd7658dfda 100644 --- a/addons/field_rations/functions/fnc_getActionOffset.sqf +++ b/addons/field_rations/functions/fnc_getActionOffset.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Returns the refill action offset for given object. @@ -17,10 +17,10 @@ params ["_object"]; -private _typeOf = typeOf _object; -if (_typeOf != "") then { +private _configOf = configOf _object; +if !(isNull _configOf) then { // Check for offset in config since we have valid typeOf - private _offset = getArray (configFile >> "CfgVehicles" >> _typeOf >> QXGVAR(offset)); + private _offset = getArray (_configOf >> QXGVAR(offset)); if (_offset isEqualTo []) then {[0, 0, 0]} else {_offset}; } else { // Check for offset corresponding to p3d list diff --git a/addons/field_rations/functions/fnc_getConsumableChildren.sqf b/addons/field_rations/functions/fnc_getConsumableChildren.sqf index 9d9dc8d62a..9fe422109c 100644 --- a/addons/field_rations/functions/fnc_getConsumableChildren.sqf +++ b/addons/field_rations/functions/fnc_getConsumableChildren.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Returns children actions for consumable items in player's inventory. @@ -22,18 +22,26 @@ private _fnc_getActions = { private _actions = []; private _cfgWeapons = configFile >> "CfgWeapons"; + private _cfgMagazines = configFile >> "CfgMagazines"; { - private _config = _cfgWeapons >> _x; - if (getNumber (_config >> QXGVAR(thirstQuenched)) > 0 || {getNumber (_config >> QXGVAR(hungerSatiated)) > 0}) then { - private _displayName = getText (_config >> "displayName"); - private _picture = getText (_config >> "picture"); + _x params ["_config", "_items"]; + private _isMagazine = _config == _cfgMagazines; + { + private _itemConfig = _config >> _x; + if (getNumber (_itemConfig >> QXGVAR(thirstQuenched)) > 0 || {getNumber (_itemConfig >> QXGVAR(hungerSatiated)) > 0}) then { + private _displayName = getText (_itemConfig >> "displayName"); + private _picture = getText (_itemConfig >> "picture"); - // Exec next frame so closing interaction menu doesn't block progressBar - private _action = [_x, _displayName, _picture, {[FUNC(consumeItem), _this] call CBA_fnc_execNextFrame}, {true}, {}, _x] call EFUNC(interact_menu,createAction); - _actions pushBack [_action, [], _player]; - }; - } forEach (_player call EFUNC(common,uniqueItems)); + // Exec next frame so closing interaction menu doesn't block progressBar + private _action = [_x, _displayName, _picture, {[FUNC(consumeItem), _this] call CBA_fnc_execNextFrame}, {true}, {}, [_x, _itemConfig, _isMagazine]] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, [], _player]; + }; + } forEach _items; + } forEach [ + [_cfgWeapons, _player call EFUNC(common,uniqueItems)], + [_cfgMagazines, [magazines _player] call EFUNC(common,uniqueElements)] + ]; _actions }; diff --git a/addons/field_rations/functions/fnc_getDrinkAnimation.sqf b/addons/field_rations/functions/fnc_getDrinkAnimation.sqf index ae1befb7c6..2b4ce41bd3 100644 --- a/addons/field_rations/functions/fnc_getDrinkAnimation.sqf +++ b/addons/field_rations/functions/fnc_getDrinkAnimation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Returns an appropriate animation for drinking directly from the given water source. diff --git a/addons/field_rations/functions/fnc_getRefillChildren.sqf b/addons/field_rations/functions/fnc_getRefillChildren.sqf index 58d94637ac..cb4a607df3 100644 --- a/addons/field_rations/functions/fnc_getRefillChildren.sqf +++ b/addons/field_rations/functions/fnc_getRefillChildren.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Returns children actions for refillable items in player's inventory for given water source. @@ -24,15 +24,23 @@ if (_water == 0 || {_water == REFILL_WATER_DISABLED}) exitWith {[]}; private _actions = []; private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; { - private _config = _cfgWeapons >> _x; - if (getText (_config >> QXGVAR(refillItem)) != "" && {_water == REFILL_WATER_INFINITE || {getNumber (_config >> QXGVAR(refillAmount)) <= _water}}) then { - private _displayName = format ["%1: %2", LLSTRING(Refill), getText (_config >> "displayName")]; - private _picture = getText (_config >> "picture"); - private _action = [_x, _displayName, _picture, FUNC(refillItem), FUNC(canRefillItem), {}, _x] call EFUNC(interact_menu,createAction); - _actions pushBack [_action, [], _source]; - }; -} forEach (_player call EFUNC(common,uniqueItems)); + _x params ["_config", "_items"]; + private _isMagazine = _config == _cfgMagazines; + { + private _itemConfig = _config >> _x; + if (getText (_itemConfig >> QXGVAR(refillItem)) != "" && {_water == REFILL_WATER_INFINITE || {getNumber (_itemConfig >> QXGVAR(refillAmount)) <= _water}}) then { + private _displayName = format ["%1: %2", LLSTRING(Refill), getText (_itemConfig >> "displayName")]; + private _picture = getText (_itemConfig >> "picture"); + private _action = [_x, _displayName, _picture, FUNC(refillItem), FUNC(canRefillItem), {}, [_x, _itemConfig, _isMagazine]] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, [], _source]; + }; + } forEach _items; +} forEach [ + [_cfgWeapons, _player call EFUNC(common,uniqueItems)], + [_cfgMagazines, [magazines _player] call EFUNC(common,uniqueElements)] +]; _actions diff --git a/addons/field_rations/functions/fnc_getRemainingWater.sqf b/addons/field_rations/functions/fnc_getRemainingWater.sqf index e2b2d56ed5..253fd62285 100644 --- a/addons/field_rations/functions/fnc_getRemainingWater.sqf +++ b/addons/field_rations/functions/fnc_getRemainingWater.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, PabstMirror * Returns the remaining water in a source. @@ -22,10 +22,10 @@ if (!alive _source) exitWith {0}; private _water = _source getVariable QGVAR(currentWaterSupply); if (isNil "_water") then { - private _typeOf = typeOf _source; - if (_typeOf != "") then { + private _configOf = configOf _source; + if !(isNull _configOf) then { // Check for waterSupply entry since we have valid typeOf - _water = getNumber (configFile >> "CfgVehicles" >> _typeOf >> QXGVAR(waterSupply)); + _water = getNumber (_configOf >> QXGVAR(waterSupply)); if (_water == 0) then {_water = REFILL_WATER_DISABLED}; if (_water != REFILL_WATER_DISABLED) then { diff --git a/addons/field_rations/functions/fnc_handleEffects.sqf b/addons/field_rations/functions/fnc_handleEffects.sqf index 881414da48..1981cc5f99 100644 --- a/addons/field_rations/functions/fnc_handleEffects.sqf +++ b/addons/field_rations/functions/fnc_handleEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Handles the effects/consequences of high thirst/hunger. diff --git a/addons/field_rations/functions/fnc_handleHUD.sqf b/addons/field_rations/functions/fnc_handleHUD.sqf index 2412d35432..7bf505e8c8 100644 --- a/addons/field_rations/functions/fnc_handleHUD.sqf +++ b/addons/field_rations/functions/fnc_handleHUD.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles creating and updating the visuals of the HUD. @@ -55,7 +55,7 @@ if (XGVAR(hudType) == 0) then { ]; } else { // Reposition controls group and icon to create draining effect - private _defaultY = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,GVAR(grid),Y)), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H]; + private _defaultY = profileNamespace getVariable [QUOTE(TRIPLES(IGUI,XGVAR(grid),Y)), safeZoneY + safeZoneH - 2.2 * GUI_GRID_H]; { _x params ["_status", "_groupIDC", "_iconIDC"]; diff --git a/addons/field_rations/functions/fnc_handleRespawn.sqf b/addons/field_rations/functions/fnc_handleRespawn.sqf index 9b9e3c374a..70baf23a1b 100644 --- a/addons/field_rations/functions/fnc_handleRespawn.sqf +++ b/addons/field_rations/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Handles the respawning of a unit by resetting necessary variables. diff --git a/addons/field_rations/functions/fnc_refillItem.sqf b/addons/field_rations/functions/fnc_refillItem.sqf index cea91f4e96..91542e60b4 100644 --- a/addons/field_rations/functions/fnc_refillItem.sqf +++ b/addons/field_rations/functions/fnc_refillItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Refills an item from given water source. @@ -6,22 +6,24 @@ * Arguments: * 0: Water source * 1: Player - * 2: Item classname + * 2: Item data + * 0: Item classname + * 1: Item config + * 2: Is item magazine * * Return Value: * None * * Example: - * [_source, _player, "ACE_WaterBottle_Empty"] call ace_field_rations_fnc_refillItem + * [_source, _player, ["ACE_WaterBottle_Empty", configFile >> "CfgWeapons" >> "ACE_WaterBottle_Empty", false]] call ace_field_rations_fnc_refillItem * * Public: No */ -params ["_source", "_player", "_item"]; +params ["_source", "_player", "_itemData"]; +_itemData params ["_item", "_config", "_isMagazine"]; TRACE_3("Item refill started",_source,_player,_item); -private _config = configFile >> "CfgWeapons" >> _item; - // Get config values for refill private _refillItem = getText (_config >> QXGVAR(refillItem)); private _refillAmount = getNumber (_config >> QXGVAR(refillAmount)); @@ -29,11 +31,16 @@ private _refillTime = getNumber (_config >> QXGVAR(refillTime)); private _fnc_onSuccess = { params ["_args"]; - _args params ["_source", "_player", "_item", "_refillItem", "_refillAmount"]; + _args params ["_source", "_player", "_itemData", "_refillItem", "_refillAmount", "_itemData"]; + _itemData params ["_item", "", "_isMagazine"]; TRACE_1("Refill item successful",_args); // Replace item with refilled one - _player removeItem _item; + if (_isMagazine) then { + _player removeMagazineGlobal _item; + } else { + _player removeItem _item; + }; [_player, _refillItem] call EFUNC(common,addToInventory); // Update remaining water in source @@ -43,7 +50,7 @@ private _fnc_onSuccess = { [_source, _waterInSource] call FUNC(setRemainingWater); }; - ["acex_rationRefilled", [_source, _player, _item, _refillItem, _refillAmount]] call CBA_fnc_localEvent; + ["acex_rationRefilled", [_source, _player, _item, _refillItem, _refillAmount, _isMagazine]] call CBA_fnc_localEvent; // Show refilled item hint private _picture = getText (configFile >> "CfgWeapons" >> _refillItem >> "picture"); @@ -64,7 +71,7 @@ private _fnc_condition = { [ _source, _player, - _item, + _itemData, _refillItem, _refillAmount ], diff --git a/addons/field_rations/functions/fnc_scanFieldRations.sqf b/addons/field_rations/functions/fnc_scanFieldRations.sqf new file mode 100644 index 0000000000..96c64bb4cd --- /dev/null +++ b/addons/field_rations/functions/fnc_scanFieldRations.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Caches all item classnames used as field rations + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call acex_field_rations_fnc_scanFieldRations + * + * Public: No + */ + +private _list = createHashMap; +private _cfgWeapons = configFile >> "CfgWeapons"; +private _cfgMagazines = configFile >> "CfgMagazines"; + +private _fnc_isFieldRationItem = toString { + (getNumber (_x >> "ACE_isFieldRationItem") isEqualTo 1) || {(getNumber (_x >> QXGVAR(thirstQuenched))) > 0} || {(getNumber (_x >> QXGVAR(hungerSatiated))) > 0} || {(getText (_x >> QXGVAR(refillItem))) isNotEqualTo ""} +}; + +{ + _list set [configName _x, ""]; +} forEach (_fnc_isFieldRationItem configClasses _cfgWeapons); + +{ + _list set [configName _x, ""]; +} forEach (_fnc_isFieldRationItem configClasses _cfgMagazines); + +uiNamespace setVariable [QXGVAR(fieldRationItems), compileFinal str _list]; diff --git a/addons/field_rations/functions/fnc_setRemainingWater.sqf b/addons/field_rations/functions/fnc_setRemainingWater.sqf index 728a73c1e3..6e8fbc4b04 100644 --- a/addons/field_rations/functions/fnc_setRemainingWater.sqf +++ b/addons/field_rations/functions/fnc_setRemainingWater.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, PabstMirror * Sets the remaining water supply for given water source. diff --git a/addons/field_rations/functions/fnc_update.sqf b/addons/field_rations/functions/fnc_update.sqf index 8b289b12f7..82b87bcfb6 100644 --- a/addons/field_rations/functions/fnc_update.sqf +++ b/addons/field_rations/functions/fnc_update.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Main looping function that updates thirst/hunger status. diff --git a/addons/field_rations/functions/script_component.hpp b/addons/field_rations/functions/script_component.hpp deleted file mode 100644 index 3469a67426..0000000000 --- a/addons/field_rations/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\field_rations\script_component.hpp" diff --git a/addons/field_rations/script_component.hpp b/addons/field_rations/script_component.hpp index 9811493029..bcde75fe9c 100644 --- a/addons/field_rations/script_component.hpp +++ b/addons/field_rations/script_component.hpp @@ -33,3 +33,5 @@ #define IDC_DRAINING_HUD_THIRST_ICON 7750 #define IDC_DRAINING_HUD_HUNGER_GROUP 7840 #define IDC_DRAINING_HUD_HUNGER_ICON 7850 + +#define FIELD_RATIONS_ITEMS (createHashMapFromArray (call (uiNamespace getVariable [QXGVAR(fieldRationItems), {createHashMap}]))) diff --git a/addons/field_rations/stringtable.xml b/addons/field_rations/stringtable.xml index 33f487a99f..34c7fa2240 100644 --- a/addons/field_rations/stringtable.xml +++ b/addons/field_rations/stringtable.xml @@ -4,14 +4,14 @@ ACE Field Rations ACE 戰地口糧 - ACE 干粮 + ACE 野战军粮 ACE Poměrové pole ACE Rations sur le terrain ACE Feld Rationen ACE Terepi adagok ACE Razioni di campo ACE フィールド レーション - ACE 필드 식량 + ACE 전투식량 ACE Racje polowe ACE Rações de campo ACE Полевые рационы @@ -22,22 +22,25 @@ ACE Field Rations HUD ACE Feldrationen HUD ACE 戰地口糧界面 + ACE 野战军粮界面 ACE フィールド レーション HUD ACE HUD Racji Polowych Индикаторы жажды и голода ACE Gıda Göstergesi + ACE 전투식량 HUD + ACE HUD de Raciones de campo Indicates current hunger and thirst status. 顯示目前的飲食需求程度。 - 指示当前的饥饿和渴望状态。 + 显示当前的饮食需求状态。 Označuje aktuální stav hladovění a žízní. Indique l'état actuel de la faim et de la soif. Zeigt den aktuellen Hunger- und Durststatus an. Jelzi az éhínség és a szomjúság állapotát. Indica lo stato attuale di fame e sete. 現在の空腹感と渇きの状態を示します。 - 현재의 굶주림과 갈증 상태를 나타냅니다. + 굶주림과 갈증 정도를 표시합니다. Wskazuje bieżący status głodu i pragnienia. Indica o status atual de fome e sede. Указывают на текущий статус жажды и голода. @@ -54,7 +57,7 @@ Túlélés Sopravvivenza サバイバル - 활착 + 생존 Przetrwanie Sobrevivência Выживание @@ -68,18 +71,21 @@ Есть/Пить Yeme / Içme 食べる/飲む + 吃/喝 + 먹기/마시기 + Comer/Beber Enable/Disable Field Rations 啟用/禁用戰地口糧。 - 启用/禁用字段口粮 + 启用/禁用野战军粮 Povolit / zakázat příděly v polích Activer / désactiver les rations de champ Feldrationen aktivieren / deaktivieren Terepi adagok engedélyezése / letiltása Abilita / disabilita le razioni di campo フィールド レーションを有効/無効化します - 필드 배급량 활성화 / 비활성화 + 전투식량 활성화/비활성화 Włącz / wyłącz racje polowe Ativar / Desativar rações de campo Включение/отключение жажды и голода @@ -89,14 +95,14 @@ Time Without Water 水份需時 - 没有水的时候 + 脱水时间 Czas bez wody Temps sans eau Zeit ohne Wasser Víz nélküli idő Tempo senza acqua 水なしの時間 - 물없는 시간 + 물 없이 생존 가능 시간 Czas bez wody Tempo sem água Время без воды @@ -106,14 +112,14 @@ How long should a person be able to go without water (hours). 一個單位脫水之前能支撐多久(單位為小時)。 - 一个单位能够没有水的时间多少(小时) + 一个单位在脱水的情况下能够支撑多久(小时) Jak dlouho by měla jednotka jít bez vody (hodiny) Combien de temps une unité devrait-elle pouvoir se passer d'eau (heures)? Wie lange sollte eine Einheit ohne Wasser auskommen (Stunden)? Mennyi ideig kell egy egység víz nélkül (óra) Mennyi ideig kell egy egység víz nélkül (óra) ユニットが水なしでどれくらい時間を過ごすことができるか (一時間単位) - 한 유닛이 물없이 얼마나 오래 갈 수 있어야 하는가? (시간) + 물을 안 마시고 얼마나 생존할 수 있는지 정합니다 (시간) Jak długo jednostka powinna przetrwać bez wody (godziny) Quanto tempo uma unidade pode passar sem água (horas) Как долго персонаж может обходиться без воды (часы) @@ -123,14 +129,14 @@ Time Without Food 飢餓需時 - 没有食物的时间 + 饥饿时间 Čas bez jídla Temps sans nourriture Zeit ohne Essen Élelmiszer nélkül Tempo senza cibo 食べ物なしの時間 - 음식없는 시간 + 밥 없이 생존 가능 시간 Czas bez jedzenia Tempo sem comida Время без еды @@ -140,14 +146,14 @@ How long should a person be able to go without food (hours). 一個單位挨餓之前能支撐多久(單位為小時)。 - 一个单位能够没有食物的时间多少(小时) + 一个单位挨饿的情况下能够支撑多久(小时) Jak dlouho by měla jednotka jít bez jídla (hodiny) Combien de temps une unité doit-elle pouvoir se passer de nourriture (heures)? Wie lange sollte eine Einheit ohne Essen gehen können (Stunden)? Mennyi ideig kell egy egység élni nélkül (óra) Per quanto tempo un'unità dovrebbe essere in grado di andare senza cibo (ore) ユニットが食糧なしでどれくらい時間を過ごすことができるか (一時間単位) - 한 음식물이 음식 없이도 갈 수있는 시간 (시간) + 밥을 안 먹고 얼마나 생존할 수 있는지 정합니다 (시간) Jak długo jednostka powinna przetrwać bez jedzenia (godziny) Quanto tempo uma unidade pode ir sem alimentos (horas) Как долго персонаж может обходиться без пищи (часы) @@ -158,37 +164,49 @@ Thirst Quenched Durst gestillt 止渴程度 + 解渴程度 乾きの満たし Утоление жажды Pragnienie zaspokojone Susuzluk Giderme Katsayısı + 갈증 해소 + Sed saciada Coefficient for the amount of thirst quenched from drinking. Koeffizient für die Menge des Dursts, der durch Trinken gestillt wird. 從飲用中能夠攝取多少水份。 + 通过喝水能够补充多少水份。 飲むことによって得られる乾きの満たし量の係数を設定します Коэффициент утоления жажды от питья Współczynnik ilości zaspokojnego pragnienia od picia Bir şey içince, susuzluğunun ne kadar giderileceğini belirler. + 마심으로써 갈증이 얼마나 해소되는지를 정합니다 + Coeficiente del saciamiento de sed por beber. Hunger Satiated Hunger gesättigt 飽足感 + 饱腹感 満腹感 Утоление голода Głód Zaspokojony Açlık Giderme Katsayısı + 배부름 + Hambre saciada Coefficient for the amount of hunger satiated from eating. Koeffizient für die Menge des Hungers, der durch essen gesättigt wird. 從飲食中獲取多少飽食感。 + 通过饮食能够补充多少能量。 食べることによって得られる満腹感の量の係数を設定します Коэффициент утоления голода от принятия пищи Współczynnik ilosci zaspokojnego głodu od jedzenia Bir şey yiyince, açlığın ne kadar giderileceğini belirler. + 밥을 먹어서 배고픔이 얼마나 해결되는지를 정합니다 + Coeficiente del saciamiento del hambre por comer. Water Source Actions @@ -196,6 +214,10 @@ Akcje przy źrodle wody Su Içme Animasyonu 水源動作 + Wasserquellen-Aktionen + 水源动作 + 물 근처 행동 + Acciones para suministros de agua Controls what actions are available on water sources. @@ -203,6 +225,10 @@ Kontroluje jakie akcje są dostępne przy źrodle wody. Su içerken hangi animasyonu yapacağını belirler 水源で可能な動作を設定します。 + Bestimmt, welche Aktionen an Wasserquellen verfügbar sind. + 控制对水源可用的动作。 + 물가에서 어떤 행동을 취할지 정합니다 + Controla qué acciones están disponibles para los suministros de agua. Refill Only @@ -210,6 +236,10 @@ Tylko napełnij Sadece içeceği iç 汲むだけ + Nur Befüllen + 仅限取水 + 다시 채우기만 가능 + Sólo rellenar Terrain Object Actions @@ -217,6 +247,10 @@ Akcje Objektu terenu Varsayılan Nesne Animasyonu マップ オブジェクト動作 + Geländeobjekt-Aktionen + 地形物体动作 + 지형 물체 상호작용 + Acciones sobre objetos del terreno Enables water source actions for terrain objects. @@ -224,78 +258,106 @@ Umożliwia akcje przy źrodle wody na obiektach terenu. Varsayılan nesneler için animasyonu etkinleştir マップに存在するオブジェクトを水源として動作するよう設定できます。 + Aktiviert Wasserquellen-Aktionen für Geländeobjekte. + 为地形物体启用水源动作。 + 지형 물체에서 물을 얻는 게 가능해집니다. + Habilitar acciones de suministros de agua para los objetos en el suelo. Affect Advanced Fatigue Beeinflusst die erweiterte Ausdauer 與進階疲勞聯動 + 与进阶疲劳联动 アドバンスド ファティーグへの影響 Влияние на продвинутую усталость Wpływ na zaawansowane zmęczenie Gelişmiş Yorgunluk + 고급 피로도에 영향을 끼침 + Afecta a la Fatiga Avanzada Controls if thirst and hunger should affect ACE Advanced Fatigue. Bestimmt, ob Durst und Hunger ACE Erweiterte Ausdauer beeinflussen sollen. 是否讓飲食影響到ACE的進階疲勞。 + 是否让饮食影响到 ACE 的进阶疲劳。 喉の渇きと空腹感が ACE アドバンスド ファティーグへ与える影響を決定します Определяет, будет ли жажда и голод влиять на продвинутую усталость ACE. Kontroluje czy pragnienie i głód mają wpływ na zaawansowane zmęczenie ACE. Acıkınca veya susayınca kişinin yorulup yorulmayacağını belirler. + 배고픔과 목마름이 고급 피로도에 영향을 끼칠지를 정합니다 + Controla si la sed y el hambre afectan a la Fatiga Avanzada de ACE HUD Type HUD Typ 界面類型 + 界面类型 HUD タイプ Typ HUD Тип индикаторов HUD Tipi + HUD 종류 + Tipo de HUD Selects which HUD style will be used. Wählt, welcher HUD Stil benutzt wird. 選擇妳想使用的界面類型。 + 选择你想使用的界面类型。 使用する HUD のタイプを選択できます Wybierz który styl HUD będzie używany Выберите какой стиль индикаторов будет использован. Hangi HUD sitilini kullanılacağını seçer. + 사용될 HUD 스타일을 고르십시오. + Selecciona qué estilo de HUD será utilizado. Colored Icons Farbige Icons 顏色化圖示 + 彩色图标 色付きアイコン Kolorowe ikony Цветные иконки Renkli Ikonlar + 색깔 아이콘 + Iconos coloreados Draining Icons Farblose Icons 增減化圖示 + 渐化图标 ドレイン アイコン Ubywające ikony Исчезающие иконки Içi Boşalan Ikonlar + 빠지는 아이콘 + Iconos de drenado HUD Show Level HUD zeigen Level 界面顯示程度 + 界面显示程度 HUD 表示レベル Widok HUD Уровень для отображения иконок HUD Gösterilme Seviyesi + HUD 표시 + Mostrar nivel en HUD Automatically show the HUD when either thirst or hunger are above this level. Zeigt automatisch das HUD an, sobald Durst oder Hunger über diesem Level sind. 在飲食低於多少程度時顯示界面。 + 在饮食能量低于多少程度时显示界面。 この値以上に空腹感か乾きを感じると自動的に HUD を表示します Automatycznie pokaż HUD kiedy pragnienie albo głód przekroczy ten poziom Автоматически отображает иконки при достижении определенных уровней голода и жажды. Susuzluk veya açlık belli bir seviyenin altına inince otomatik olarak HUD u göster. + 정한 퍼센트 이하로 내려가면 HUD가 나타나게 합니다. + Mostrar automáticamente el HUD cuando la sed o el hambre están por encima de este nivel. Always @@ -318,19 +380,25 @@ Colored Icons - Transparency Farbige Icons - Transparenz 顏色化圖示 - 透明度 + 彩色图标—透明度 色付きアイコン - 透明度 Kolorowe ikony - transparentność Прозрачность цветных иконок Renkli Ikonlar - Şeffaflaşan + 색깔 아이콘 - 투명도 + Iconos coloreados - Transparencia Controls the transparency of the Colored Icons HUD. Dynamic setting makes the HUD less transparent as thirst or hunger increase. Bestimmt die Tranzparenz der farbigen HUD Icons. Die Dynamische Einstellung macht das HUD weniger transparent, wenn Hunger oder Durst steigen. 控制顏色化圖示的透明度。設定為動態使其界面透明度與飲食需求一樣,越透明越需要。 + 控制彩色图标 HUD 的透明度。动态设置使 HUD 的透明度随着口渴或饥饿的增加而减弱。 Kontroluje transparentność kolorowych ikon HUD. Dynamiczne ustawienie zmniejsza przejrzystość wraz z zwiększeniem głodu czy pragnienia. 色付きアイコンの透明度を決定できます。動的に設定されると、喉の渇きや空腹感が増すにつれて、アイコンの透明度を下げます。 Настраивает прозрачность цветных иконок. «Динамическая» делает иконки менее прозрачными при увеличении жажды и голода. Renkli Simgeler Gösterge Paneli'nin şeffaflığını kontrol eder. Dinamik ayar, susuzluk veya açlık arttıkça HUD'yi daha az şeffaf hale getirir. + 색깔 아이콘의 투명도를 조절합니다. 동적 설정의 경우 배고픔이나 목마름이 해결되면 덜 투명하게 바뀝니다. + Controla la transparencia de los Iconos coloreados en el HUD. La opción dinámica muestra el HUD menos transparente cuando la sed o el hambre aumentan. Dynamic @@ -353,62 +421,83 @@ Water Supply Wasservorrat 飲用水補給 + 饮用水补给 水資源 Водные ресурсы Źródło wody + 식수 보급량 + Suministro de agua The amount of water available for ACE Field Rations water source actions (-1 disabled, -10 infinite) Die Menge des für ACE Feldrationen Wasserquellenaktionen verfügbaren Wassers (-1 ausgeschaltet, -10 unendlich) 水源可供補充飲用水的次數(-1為關閉,-10為無限次)。 + 水源可供取水的次数(-1为关闭,-10为无限次)。 ACE フィールド レーションで利用できる水源の量を設定できます。(-1で無効化、-10で無限) Количество воды, доступной для использования в ACE Полевые рационы. (-1 - отключено, -10 - бесконечно) Ilość wody dostępnej dla Akcji ACE Źródła wody (-1 wyłączone, -10 nieskończone) + ACE 전투식량 물 근처 행동에서 얼마나 물을 얻어 갈 수 있는지를 정합니다 (-1은 비활성화, -10은 무한대) + La cantidad de agua disponible para las acciones de suministro de agua de las Raciones de Combate de ACE (-1 deshabilitado, -10 infinito) Water Source Wasserquelle 水源 + 水源 水源 Źródło wody Источник воды Matara + 수원지 + Suministro de agua Check Remaining Water Überprüfe verbleibendes Wasser 檢查剩餘飲用水 + 检查剩余饮用水 残っている水を確認 Sprawdź ilość wody Проверить остаток воды Kalan Suyu Kontrol Et + 남은 물 확인 + Comprobar agua restante Checking remaining water... Überprüfe verbleibendes Wasser... 檢查剩下的飲用水... + 检查剩余饮用水中... 残っている水量を確認中です・・・ Sprawdzanie ilości wody Проверяется остаток воды... Kalan Su Kontrol Ediliyor... + 남은 물 확인 중... + Comprobando agua restante... There are %1 litres left. Es sind %1 Liter übrig. 那還有 %1 公升 + 还剩下 %1 升 残り %1 リットル残っています。 Pozostało %1 litrów. Осталось %1 л воды %1 Litre kaldı. + %1 리터의 물이 남아있습니다. + Quedan %1 litros. There is no water left. Es ist kein Wasser mehr übrig. 水已經用完了 + 水已经喝完了。 水はもうありません。 Nie ma wody Воды больше не осталось Hiç su kalmadı. + 물이 한 방울도 없습니다. + No queda agua. Drink From Source @@ -417,18 +506,21 @@ Pij z źródła wody Mataradan Iç 水源から飲む + 从水源处喝水 + 수원에서 물 마시기 + Beber desde el suministro Refill 重新補充 - 笔芯 + 重新取水 Doplňte Recharge Nachfüllung Utántöltés Ricarica 汲む - 다시 채우다 + 다시 채우기 Uzupełnij Recarga Наполнить ёмкость @@ -438,14 +530,14 @@ Refilling... 補充中... - 加... + 取水中... Doplňování... Remplissage ... Nachfüllen... Utántöltés ... Ricarica ... 汲んでいます・・・ - 리필 중 ... + 채우는 중... Uzupełnianie ... Recarga ... Наполнение... @@ -455,14 +547,14 @@ Item Refilled 物品重新補充 - 项目重新填充 + 物品已重新补充 Položka je vyplněna Article rechargé Artikel nachgefüllt Újratöltött tétel Articolo riempito 中身がいっぱいになりました - 리필 품목 + 아이템 채워짐 Przedmiot uzupełniony Item Recarregado Ёмкость наполнена @@ -473,28 +565,37 @@ Eating %1... Esse %1... 食用 %1... - %1を食べています・・・ + 食用 %1... + %1 を食べています・・・ Jedzenie %1... Поедание %1... %1 Yeniyor... + %1 먹는 중... + Comiendo %1... Drinking %1... Trinke %1... 飲用自 %1... - %1を飲んでいます・・・ + 饮用 %1... + %1 を飲んでいます・・・ Picie %1... Выпивание %1... %1 Içiliyor... + %1 마시는 중... + Bebiendo %1... Drinking from %1... Trinke von %1... 飲用%1的水中... - %1から飲んでいます・・・ + 从%1饮用中... + %1 から飲んでいます・・・ Picie z %1... Выпивание из %1... %1 den içiliyor... + %1 으로 부터 마시는 중... + Bebiendo desde %1... Drinking from source... @@ -502,18 +603,22 @@ Picie z źródła Mataradan Içiliyor... 水源から飲んでいます・・・ + Trinke von Quelle... + 从水源处喝水中... + 수원에서 마시는 중... + Bebiendo desde el suministro... Water Bottle 飲用水 - 水瓶 + 矿泉水 Láhev na vodu Bouteille d'eau Wasserflasche Vizesüveg Bottiglia d'acqua ウォーターボトル - 물 병 + 물병 Butelka wody Garrafa de agua Бутылка воды (полная) @@ -523,7 +628,7 @@ A water bottle 一罐裝滿水的寶特瓶 - 一个水瓶 + 一罐装满水的矿泉水瓶 Láhev s vodou Une bouteille d'eau Eine Wasserflasche @@ -540,14 +645,14 @@ Water Bottle (Half) 飲用水(半罐) - 水瓶(一半) + 矿泉水(半瓶) Vodní láhev (poloviční) Bouteille d'eau (la moitié) Wasserflasche (Hälfte) Vízpalack (fél) Bottiglia d'acqua (metà) ウォーター ボトル (半分) - Garrafa de água (meio) + 물병 (절반) Butelka wody (połowa) Garrafa de água (meio) Бутылка воды (половина) @@ -557,14 +662,14 @@ A half full water bottle 一罐裝滿半罐水的寶特瓶 - 半满水瓶 + 半瓶矿泉水 Polní plná láhev s vodou Une bouteille d'eau à moitié pleine Eine halbvolle Wasserflasche Fél-teljes vizes palack Una mezza bottiglia piena d'acqua 半分入っているウォーター ボトル - 반만 물병 + 절반만 차 있는 물병입니다. Pół butelki z wodą Uma garrafa de água meia cheia Половина бутылки с водой @@ -574,7 +679,7 @@ Water Bottle (Empty) 空寶特瓶 - 水瓶(空) + 矿泉水(空) Láhev s vodou (prázdné) Bouteille d'eau (vide) Wasserflasche (leer) @@ -591,14 +696,14 @@ An empty water bottle 一個空寶特瓶 - 一个空的水瓶 + 一个空的矿泉水瓶 Prázdná láhev s vodou Une bouteille d'eau vide Eine leere Wasserflasche Egy üres palack Una bottiglia d'acqua vuota 空のウォーター ボトル - 빈 물병 + 빈 물병입니다 Pusta butelka wody Uma garrafa de água vazia Пустая бутылка @@ -608,14 +713,14 @@ Canteen 水壺 - 食堂 + 水壶 Jídelna Cantine Feldflasche Kantin Mensa 水筒 - 반합 + 수통 Manierka Cantina Фляга (полная) @@ -625,14 +730,14 @@ A canteen filled with water 一個裝滿水的水壺 - 一个装满水的食堂 + 一个装满水的水壶 Jídelna naplněná vodou Une cantine remplie d'eau Eine Feldflasche mit Wasser gefüllt Vízzel töltött kantin Una mensa piena d'acqua 水で一杯の水筒 - 물이 채워진 식당 + 물이 가득찬 수통입니다 Manierka wypełniona wodą Uma cantina cheia de água Фляга с водой @@ -642,14 +747,14 @@ Canteen (Half) 水壺(半罐) - 食堂(一半) + 水壶(半壶) Jídelna (poloviční) Cantine (Demi) Feldflasche (halb) Étkezés (fél) Mensa (metà) 水筒 (半分) - 캔틴 (하프) + 수통 (절반) Manierka (połowa) Cantina (meio) Фляга (половина) @@ -659,14 +764,14 @@ A canteen half filled with water 剩下一半水的水壺 - 食堂一半装满了水 + 剩一半水的水壶 Jídelna naplněná vodou Une cantine à moitié remplie d'eau Eine Feldflasche zur Hälfte mit Wasser gefüllt A vízzel töltött kantin Una mensa riempita per metà di acqua 半分入っている水筒 - 물이 담긴 식당 절반 + 반이 차 있는 수통입니다 Manierka w połowie wypełniona wodą Uma meia cantina cheia de água Наполовину заполненая водой фляга @@ -676,14 +781,14 @@ Canteen (Empty) 水壺(空) - 食堂(空) + 水壶(空) Jídelna (prázdné) Cantine (Vide) Feldflasche (leer) Étkezde (üres) Mensa (vuota) 水筒 (空) - 캔틴 (비어 있음) + 수통 (비어 있음) Manierka (pusta) Cantina (vazia) Фляга (пустая) @@ -693,14 +798,14 @@ An empty canteen 一個空的水壺 - 一个空的食堂 + 一个空的水壶 Prázdná jídelna Une cantine vide Eine leere Feldflasche Egy üres kantin Una mensa vuota 空の水筒 - 빈 수통 + 빈 수통입니다 Pusta manierka Uma cantina vazia Пустая фляга @@ -711,39 +816,48 @@ Refreshing lemon and lime flavored soft drink Ein erfrischender Softdrink mit Zitronen- und Limettengeschmack. 清新檸檬以及有著酸橙味的汽水 - 新鮮なレモンとライムの風味を味わえるソフト ドリンク + 清爽的柠檬和青柠味汽水 + 新鮮なレモンとライムの風味を味わえるソフトドリンク Odświeżający napój cytronowo-limonkowy Освежающий напиток со вкусом лимона и лайма Limon Ve Yeşil Limondan Yapılmış Gazlı Bir Içecek + 상쾌한 레몬라임향의 탄산음료 + Bebida refrescante de sabor lima y limón Orange flavored soft drink with a tingly, fruity taste Ein nach Orange schmeckender Softdrink mit einem prickelndem und fruchtigem Geschmack 有著微微的橘子水果味的汽水 - 口いっぱいに果物を感じるオレンジ風味のソフト ドリンク + 橙子味汽水,有刺鼻的水果味 + 口いっぱいに果物を感じるオレンジ風味のソフトドリンク Napój pomarańczowy Напиток с апельсиновым вкусом Gazlı Portakallı Bir Içecek + 오렌지 향의 톡쏘는 탄산음료 + Bebida refrescante de sabor naranja, con un chispeante y afrutado sabor. Red Gull gives you wings Red Gull verleiht Flügel 紅鷹讓你猛虎添翼 - レッドガルは翼をさずける + 红鹰让你猛虎添翼 + レッドガル 翼をさずける Red Gull doda ci skrzydeł Рэд Гулл окрыляет! Red Gull kanatlandırrrrr + 레드굴은 날개를 달아줘요 + Red Gull te da alas MRE Lamb Curry 軍糧 羊肉咖哩 - MRE羊肉咖喱 + 军粮羊肉咖喱饭 MRE jehněčí kari MRE Curry d'agneau EPA Lamm Curry MRE bárány Curry MRE Curry di agnello - MRE 羊カレー + MRE ラムカレー MRE 양고기 카레 MRE jagnięcina Curry MRE cordeiro ao Curry @@ -754,48 +868,54 @@ An MRE containing Lamb Curry. Heat for best effect 含有羊肉咖哩的軍用口糧。加熱以達到最佳效果 - 含有羊肉咖喱的MRE。加热以达到最佳效果 + 含有羊肉咖喱饭的军粮。加热以达到最佳效果 MRE obsahující Lamb Curry. Teplo pro nejlepší efekt Un MRE contenant du Curry d'agneau. Chaleur pour le meilleur effet Eine EPA mit Lamm Curry. Für den besten Geschmack erhitzen. Egy MRE, amely Lamb Curry-t tartalmaz. Hő a legjobb hatás érdekében Un MRE contenente Lamb Curry. Calore per il miglior effetto - 羊カレーの MRE。温めるとなお美味しい - 램 카레가 들어있는 MRE. 효과를 극대화하기위한 열기 + ラム(羊肉)カレーの MRE。温めるとなお美味しい + 양고기 카레가 들어있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające jagnięcine Curry. Podgrzej dla najlepszego efektu Um MRE contendo Lamb Curry. Calor para melhor efeito Сухой паёк, содержащий ягнятину карри. Перед употреблением рекомендуется разогреть - Un MRE que contiene cordero al curry. Calor para el mejor efecto + Un MRE que contiene cordero al curry. Calentar para mejor efecto. Kuzu Köri içeren bir MRE. MRE Beef Stew EPA Rindereintopf 軍糧 牛肉燉湯 - MRE ビーフ シチュー + 军粮炖牛肉汤 + MRE ビーフシチュー MRE Gulasz wołowy ИРП Тушеная говядина MRE Dana Yahni + MRE 비프스튜 + MRE Estofado de ternera An MRE containing Beef Stew. Heat for best effect Eine EPA, welche Rindereintopf beeinhaltet. Für den besten Geschmack erhitzen. 含有牛肉燉湯的軍用口糧。加熱以達到最佳效果 + 含有牛肉炖汤的军粮。加热以达到最佳效果 ビーフ シチューの MRE。温めるとなお美味しい MRE zawierające gulasz wołowy. Podgrzej dla najlepszego efektu Сухой паёк, содержащий тушеную говядину. Перед употреблением рекомендуется разогреть Sığır Yahni içeren bir MRE. + 비프스튜가 들어있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 + Un MRE que contiene estofado de ternera. Calentar para mejor efecto. MRE Cream Tomato Soup 軍糧 奶油番茄湯 - MRE奶油西红柿汤 + 军粮奶油西红柿汤 MRE krémová rajská polévka MRE Soupe de tomate crème EPA Cremige Tomatensuppe MRE krémes paradicsomleves MRE Crema di pomodoro - MRE クリーム トマト スープ + MRE クリームトマトスープ MRE 크림 토마토 수프 MRE Kremowa Zupa Pomidorowa MRE Sopa de creme de tomate @@ -806,14 +926,14 @@ An MRE containing Cream Tomato Soup. Mix with water and heat for best effect 含有奶油番茄湯的軍用口糧。 用水和熱混合以獲得最佳效果 - 含有奶油番茄汤的MRE。 用水和热混合以获得最佳效果 + 含有奶油番茄汤的军粮。添水加热以获得最佳效果 MRE obsahující krémovou rajčatovou polévku. Směs s vodou a teplem pro nejlepší efekt Un MRE contenant de la soupe à la tomate et à la crème. Mélanger avec de l'eau et chauffer pour obtenir le meilleur effet Eine EPA mit Creme Tomatensuppe. Für beste Wirkung mit Wasser und Hitze mischen. Egy krémes paradicsomleveset tartalmazó MRE. Keverjük össze vízzel és hővel a legjobb hatás érdekében Un MRE contenente zuppa di pomodoro crema. Mescolare con acqua e calore per ottenere il massimo effetto - クリーム トマト スープの MRE。水と混ぜて温めるとなお美味しい - 크림 토마토 수프가 들어있는 MRE. 최상의 효과를 위해 물과 열을 함께 섞으십시오. + クリームトマトスープの MRE。水と混ぜて温めるとなお美味しい + 크림 토마토 수프가 들어 있는 MRE입니다. 물과 섞어 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające śmietanową zupę pomidorową. Wymieszaj z wodą i podgrzej, aby uzyskać najlepszy efekt Uma MRE contendo Cream Tomato Soup. Misture com água e calor para melhor efeito Сухой паёк, содержащий сублимированный томатный крем-суп. Перед употреблением растворить в воде и разогреть @@ -823,14 +943,14 @@ MRE Cream Chicken Soup 軍糧 奶油雞湯 - MRE奶油鸡汤 + 军粮奶油鸡汤 MRE krémová kuřecí polévka MRE Soupe à la crème au poulet EPA Cream Hühnersuppe MRE krémes csirke leves MRE Zuppa di pollo crema - MRE クリーム チキン スープ - MRE 크림 치킨 스프 + MRE クリームチキンスープ + MRE 크림 치킨 수프 MRE Kremowy Rosół MRE Sopa de creme de galinha ИРП Куриный крем-суп @@ -840,14 +960,14 @@ An MRE containing Chicken Soup. Mix with water and heat for best effect 含有雞湯的軍用口糧。 用水和熱混合以獲得最佳效果 - 含有鸡汤的MRE。 用水和热混合以获得最佳效果 + 含有鸡汤的军粮。添水加热以获得最佳效果 MRE obsahující kuřecí polévku. Směs s vodou a teplem pro nejlepší efekt Un MRE contenant une soupe au poulet. Mélanger avec de l'eau et chauffer pour obtenir le meilleur effet Eine EPA mit Hühnersuppe. Für beste Wirkung mit Wasser und Hitze mischen. A csirke leves tartalmú MRE. Keverjük össze vízzel és hővel a legjobb hatás érdekében Un MRE contenente zuppa di pollo. Mescolare con acqua e calore per ottenere il massimo effetto - チキン スープの MRE。水と混ぜて温めるとなお美味しい - 치킨 수프를 포함한 MRE. 최상의 효과를 위해 물과 열을 섞으십시오. + クリームチキンスープの MRE。水と混ぜて温めるとなお美味しい + 치킨 수프가 들어 있는 MRE입니다. 물과 섞어 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające rosół. Wymieszaj z wodą i podgrzej, aby uzyskać najlepszy efekt Um MRE contendo Sopa de Frango. Misture com água e calor para melhor efeito Сухой паёк, содержащий сублимированный куриный крем-суп. Перед употреблением растворить в воде и разогреть @@ -857,14 +977,14 @@ MRE Chicken Tikka Masala 軍糧 瑪撒拉雞 - MRE鸡蒂卡Masala + 军粮鸡蒂卡 Masala MRE Kuře Tikka Masala MRE Poulet Tikka Masala EPA Huhn Tikka Masala MRE csirke Tikka Masala MRE pollo Tikka Masala MRE チキン ティッカ マサラ - MRE 치킨 티카 마샬 라 + MRE 치킨 티카 마살라 MRE kurczak Tikka Masala MRE frango Tikka Masala ИРП Курица Тикка Масала @@ -874,14 +994,14 @@ An MRE with Chicken Tikka Masala. Heat for best effect 含有瑪撒拉雞的軍用口糧。 用水和熱混合以獲得最佳效果 - 与鸡Tikka马萨拉MRE。 加热以达到最佳效果 + 与鸡 Tikka 马萨拉军粮。加热以达到最佳效果 MRE s kuřecím masem Tikka Masala. Teplo pro nejlepší efekt Un MRE avec du poulet Tikka Masala. Chaleur pour le meilleur effet Eine EPA mit Hühnchen Tikka Masala. Für den besten Geschmack erhitzen. Egy MRE csirkével Tikka Masala. Hő a legjobb hatás érdekében Un MRE con pollo Tikka Masala. Calore per effetto migliore チキン ティッカ マサラの MRE。温めるとなお美味しい - 치킨 티 카 Masala와 MRE입니다. 최고의 효과 대 한 열 + 치킨 티카 마살라 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE z kurczakiem Tikka Masala. Podgrzej dla najlepszego efektu Um MRE com Frango Tikka Masala. Calor para melhor efeito Сухой паёк, содержащий Курицу Тикка Масала. Перед употреблением рекомендуется разогреть @@ -891,7 +1011,7 @@ MRE Steak Vegetables 軍糧 牛排蔬菜 - MRE牛排蔬菜 + 军粮牛排蔬菜 MRE Steak zelenina MRE Steak légumes EPA Steak Gemüse @@ -908,14 +1028,14 @@ An MRE containing Steak and Vegetables. Heat for best effect 包含牛排和蔬菜的軍用口糧。 加熱以達到最佳效果 - 包含牛排和蔬菜的MRE。 加热以达到最佳效果 + 包含牛排和蔬菜的军粮。加热以达到最佳效果 MRE obsahující steak a zeleninu. Teplo pro nejlepší efekt Un MRE contenant du bifteck et des légumes. Chaleur pour le meilleur effet Eine EPA mit Steak und Gemüse. Für den besten Geschmack erhitzen. Egy MRE, amely Steak és Zöldségeket tartalmaz. Hő a legjobb hatás érdekében Un MRE contenente bistecche e verdure. Calore per il miglior effetto 野菜とステーキの MRE。温めるとなお美味しい - 스테이크와 채소가 들어있는 MRE. 효과를 극대화하기위한 열기 + 스테이크와 채소가 들어 있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE zawierający stek i warzywa. Podgrzej dla najlepszego efektu Um MRE contendo Bife e Legumes. Calor para melhor efeito Сухой паёк, содержащий стейк с овощами. Перед употреблением рекомендуется разогреть @@ -925,14 +1045,14 @@ MRE Meatballs and Pasta 軍糧 肉丸和意大利麵 - MRE肉丸和意大利面 + 军粮肉丸和意大利面 MRE karbanátky a těstoviny MRE Pâtes aux boulettes de viande EPA Frikadellen und Pasta MRE húsgombóc és tészta MRE Pasta e polpette MRE ミートボールとパスタ - MRE 미트볼과 파스타 + MRE 미트볼 파스타 MRE Klopsiki i makaron MRE Macarrão com almôndegas ИРП Макароны с фрикадельками @@ -942,14 +1062,14 @@ An MRE containing Meatballs and Pasta. Heat for best effect 含有肉丸和意大利麵的軍用口糧。 加熱以達到最佳效果 - 含有肉丸和意大利面的MRE。 加热以达到最佳效果 + 含有肉丸和意大利面的军粮。加热以达到最佳效果 MRE obsahující maso a těstoviny. Teplo pro nejlepší efekt Un MRE contenant des boulettes de viande et des pâtes. Chaleur pour le meilleur effet Eine EPA mit Fleischbällchen und Pasta. Für den besten Geschmack erhitzen. Húsgombócokat és tésztát tartalmazó MRE. Hő a legjobb hatás érdekében Un MRE contenente polpette e pasta. Calore per il miglior effetto ミートボールとパスタの MRE。温めるとなお美味しい - 미트볼과 파스타를 포함한 MRE. 효과를 극대화하기위한 열기 + 미트볼과 파스타가 들어 있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające klopsiki i makaron. Podgrzej dla najlepszego efektu Um MRE contendo Meatballs e Pasta. Calor para melhor efeito Сухой паёк, содержащий макароны с фрикадельками. Перед употреблением рекомендуется разогреть @@ -959,14 +1079,14 @@ MRE Chicken with Herb Dumplings 軍糧 雞肉香草餃子 - MRE鸡肉香草饺子 + 军粮鸡肉香草饺子 MRE kuře s bylinkovým knedlíkem MRE de poulet avec des boulettes aux herbes EPA Huhn mit Kraut Knödel MRE csirke Herb galuskával MRE pollo con gnocchi alle erbe - MRE 鶏肉団子 - MRE 치킨 약초만 두 + MRE チキンとハーブ団子 + MRE 허브 치킨 만두 MRE kurczak z pierogami ziołowymi. MRE Frango com Dumplings de ervas ИРП Курица с клёцками @@ -976,14 +1096,14 @@ An MRE containing Chicken with Herb Dumplings. Heat for best effect 含有雞肉和香草餃子的軍用口糧。 加熱以達到最佳效果 - 含有鸡肉和香草饺子的MRE。 加热以达到最佳效果 + 含有鸡肉和香草饺子的军粮。加热以达到最佳效果 MRE obsahující kuře s bylinkovými knedlíky. Teplo pro nejlepší efekt Un MRE contenant du poulet et des dumplings aux fines herbes. Chaleur pour le meilleur effet Eine EPA mit Hühnchen mit Kräuterknödeln. Für den besten Geschmack erhitzen. Egy MRE, amely csirkét és fűszeres gombócokat tartalmaz. Hő a legjobb hatás érdekében Un MRE contenente pollo con gnocchi alle erbe. Calore per il miglior effetto - 鶏肉を団子で包んだ MRE。温めるとなお美味しい - 치킨과 허브 만두가 포함 된 MRE. 효과를 극대화하기위한 열기 + チキンとハーブ団子のMRE。温めるとなお美味しい + 허브 치킨 만두 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE z kurczakiem i pierogamii ziołowymi. Podgrzej dla najlepszego efektu Uma MRE que contém Bolinhos De Frango Com Erva. Calor para melhor efeito Сухой паёк, содержащий курицу с клёцками. Перед употреблением рекомендуется разогреть @@ -993,14 +1113,14 @@ Humanitarian Ration 人道主義口糧 - 人道主义配给 + 人道主义口粮 Humanitární poměr Ration humanitaire Humanitäre Ration Humanitárius értelemben Razione umanitaria 人道支援配給レーション - 인도주의 배급 + 난민배급식량 Racja humanitarna Ração Humanitária Гуманитарный сухой паёк @@ -1009,18 +1129,38 @@ A Humanitarian Ration intended to serve as a person's food supply during crises 人道主義口糧意圖在危機期間充當人的食物供應 - 人道主义配额意图在危机期间充当人的食物供应 + 用于危机期间个人食物供应的人道主义口粮。 Humanitární rada, která má sloužit jako zásobování potravinami během krizí Une ration humanitaire destinée à servir d'approvisionnement alimentaire en cas de crise Eine humanitäre Ration, die dazu bestimmt ist, in Krisenzeiten als Nahrung für eine Person zu dienen Humanitárius eloszlás, amelynek célja az ember élelmezési ellátottsága a válság idején Una razione umanitaria destinata a servire come riserva di cibo di una persona durante le crisi 人道危機を救う為に配布された食料品 - 위기 상황에서 식량 공급을위한 인도 주의적 식량 배급 + 재난 상황에 식량으로 쓸 수 있는 인도주의 차원의 배급식량입니다 Racja humanitarna, która ma służyć jako żywność dla danej osoby podczas kryzysów Uma Ração Humanitária destinada a servir como alimento alimentar de uma pessoa durante as crises Суточный рацион питания для обеспечения населения районов, охваченных гуманитарной катастрофой или стоящих на ее грани Una ración humanitaria destinada a servir como el suministro de alimentos de una persona durante las crisis + + Sunflower Seeds + Sonnenblumenkerne + 해바라기씨 + Nasiona Słonecznika + ヒマワリの種 + 葵花籽 + Семечки подсолнуха + Pipas de girasol + + + Roasted And Salted + Geröstet und Gesalzen + 굽고 간을 했습니다 + Pieczone i Solone + 炒って塩で味付け済 + 焙烤盐焗 + Поджаренные и солёные + Tostadas y saladas + diff --git a/addons/field_rations/ui/item_sunflowerseeds_co.paa b/addons/field_rations/ui/item_sunflowerseeds_co.paa new file mode 100644 index 0000000000..178cea9964 Binary files /dev/null and b/addons/field_rations/ui/item_sunflowerseeds_co.paa differ diff --git a/addons/finger/functions/fnc_incomingFinger.sqf b/addons/finger/functions/fnc_incomingFinger.sqf index 24afac3c34..fb65d8eac9 100644 --- a/addons/finger/functions/fnc_incomingFinger.sqf +++ b/addons/finger/functions/fnc_incomingFinger.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: TheDrill, PabstMirror * Recieve an finger event, adds to the array (or updates if already present) and starts PFEH if not already running @@ -27,7 +27,7 @@ private _fingerPos = if (_sourceUnit == ACE_player) then { TRACE_3("incoming finger:", _sourceUnit, _fingerPosPrecise, _fingerPos); -private _data = [diag_tickTime, _fingerPos, ([_sourceUnit, false, true] call EFUNC(common,getName))]; +private _data = [diag_tickTime, _fingerPos, ([_sourceUnit, false, true] call EFUNC(common,getName)), _sourceUnit]; GVAR(fingersHash) set [hashValue _sourceUnit, _data]; if (GVAR(pfeh_id) == -1) then { diff --git a/addons/finger/functions/fnc_keyPress.sqf b/addons/finger/functions/fnc_keyPress.sqf index 4278bec2cb..59405b57a5 100644 --- a/addons/finger/functions/fnc_keyPress.sqf +++ b/addons/finger/functions/fnc_keyPress.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: TheDrill, PabstMirror * On keypress, point and send position to nearby players diff --git a/addons/finger/functions/fnc_moduleSettings.sqf b/addons/finger/functions/fnc_moduleSettings.sqf index 7dd93ee7ae..be6821768d 100644 --- a/addons/finger/functions/fnc_moduleSettings.sqf +++ b/addons/finger/functions/fnc_moduleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Module for fingering settings diff --git a/addons/finger/functions/fnc_perFrameEH.sqf b/addons/finger/functions/fnc_perFrameEH.sqf index e6056393b0..e499ff8808 100644 --- a/addons/finger/functions/fnc_perFrameEH.sqf +++ b/addons/finger/functions/fnc_perFrameEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: TheDrill, PabstMirror * The perFrameEventHandler to draw the icons @@ -21,11 +21,11 @@ if !([ACE_player, ACE_player, ["isNotInside", "isNotSwimming"]] call EFUNC(commo // Make sure player is dismounted or in a static weapon: if ((ACE_player != vehicle ACE_player) && {!((vehicle ACE_player) isKindOf "StaticWeapon")}) then {GVAR(fingersHash) = createHashMap}; -private _iconSize = BASE_SIZE * 0.10713 * (call EFUNC(common,getZoom)); +private _iconBaseSize = GVAR(sizeCoef) * BASE_SIZE * 0.10713 * (call EFUNC(common,getZoom)); { //IGNORE_PRIVATE_WARNING ["_x", "_y"]; - _y params ["_lastTime", "_pos", "_name"]; + _y params ["_lastTime", "_pos", "_name", "_sourceUnit"]; private _timeLeftToShow = _lastTime + FP_TIMEOUT - diag_tickTime; if (_timeLeftToShow <= 0) then { GVAR(fingersHash) deleteAt _x; @@ -34,6 +34,11 @@ private _iconSize = BASE_SIZE * 0.10713 * (call EFUNC(common,getZoom)); // Fade out: _drawColor set [3, ((_drawColor select 3) * ((_timeLeftToShow min 0.5) / 0.5))]; + private _iconSize = _iconBaseSize; + if (GVAR(proximityScaling)) then { + _iconSize = _iconSize * linearConversion [0, GVAR(maxRange), (getPosASL ACE_player) vectorDistance (getPosASL _sourceUnit), 0.25, 2, true]; + }; + drawIcon3D [QPATHTOF(UI\fp_icon2.paa), _drawColor, ASLtoAGL _pos, _iconSize, _iconSize, 0, _name, 1, 0.03, "RobotoCondensed"]; }; } forEach GVAR(fingersHash); diff --git a/addons/finger/functions/script_component.hpp b/addons/finger/functions/script_component.hpp deleted file mode 100644 index 4d3625f072..0000000000 --- a/addons/finger/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\finger\script_component.hpp" \ No newline at end of file diff --git a/addons/finger/initSettings.sqf b/addons/finger/initSettings.sqf index 592b045629..79c129bc46 100644 --- a/addons/finger/initSettings.sqf +++ b/addons/finger/initSettings.sqf @@ -16,6 +16,22 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)]; 1 ] call CBA_fnc_addSetting; +[ + QGVAR(sizeCoef), "SLIDER", + [LSTRING(sizeCoef_displayName), LSTRING(sizeCoef_description)], + _category, + [0.1, 5, 1, 2], + 1 +] call CBA_fnc_addSetting; + +[ + QGVAR(proximityScaling), "CHECKBOX", + [LSTRING(proximityScaling_displayName), LSTRING(proximityScaling_description)], + _category, + false, + 1 +] call CBA_fnc_addSetting; + [ QGVAR(indicatorForSelf), "CHECKBOX", [LSTRING(indicatorForSelf_name), LSTRING(indicatorForSelf_description)], diff --git a/addons/finger/stringtable.xml b/addons/finger/stringtable.xml index e6e99803cc..e7b670f242 100644 --- a/addons/finger/stringtable.xml +++ b/addons/finger/stringtable.xml @@ -6,7 +6,7 @@ Fingerzeig Puntamento 指向指示器 - 指向标记器 + 指向标记 指差し 가리키기 Pointage du doigt @@ -29,7 +29,7 @@ Puntamento abilitato 指差しを有効 가리키기 활성화 - 指向系统启动 + 启用指向系统 指向系統啟動 Señalado permitido Işaretleme Etkin @@ -38,7 +38,7 @@ 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. + Wskazuje a także wyświetla wirtualny znacznik - 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. Показывает пальцем и рисует виртуальный маркер в направлении взгляда ближайшим игрокам. Можно удерживать. @@ -46,7 +46,7 @@ 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. @@ -75,16 +75,56 @@ 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 метра] + Максимальная дальность между игроками для отображения индикатора указания пальцем [по умолчанию: 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米] 設定指向指示器最大顯示距離。[預設: 4公尺] Hangi uzaklıktakilerin sanal daireyi görmesini seçin. [Varsayılan : 4 metre] + + Visual Marker Size Coefficient + Visueller Markergrößenkoeffizient + 보이는 마커 크기 계수 + Współczynnik wielkości wirtualnego znacznika + 指さし表記大きさ係数 + 屏幕标记大小系数 + Коэф. размера маркера + Coeficiente del tamaño del marcador visual + + + Adjusts the size of the visual marker. + Passt die Größe der visuellen Markierung an. + 눈에 보이는 마커의 크기를 조정합니다. + Dostosowuje rozmiar wirtualnego znacznika. + 指さし表記の大きさを調整します。 + 调整屏幕上显示的标记大小 + Настраивает размер визуального маркера + Ajusta el tamaño del marcador visual. + + + Proximity Scaling + Näherungsskalierung + 근접 스케일링 + Skalowanie odległościowe + 近接性スケーリング + 根据距离缩放 + Масштабирование от дальности + Escalado de cercanía + + + Scales the size of the visual marker based on the distance between the player observing and the player pointing. + Skaliert die Größe der visuellen Markierung basierend auf der Entfernung zwischen dem beobachtenden Spieler und dem zeigenden Spieler. + 관찰하는 플레이어와 가리키는 플레이어 사이의 거리에 따라 보이는 마커의 크기를 조정합니다. + Skaluje rozmiar wirtualnego znacznika, na podstawie odległości między graczem obserwującym a graczem wskazującym. + 見ているプレーヤーと指さししたプレーヤーの距離に基づいて、指さし表記の大きさを調整します。 + 根据观察的玩家和在指出方向的的玩家之间的距离调整视觉标记的大小。 + Масштабирует размер визуального маркера в зависимости от дальности от игрока до точки указания. + Escala el tamaño del marcador visual dependiendo de la distancia entre el jugador observador y el jugador que señala. + Show pointing indicator to self Zeigersymbol einem selbst anzeigen @@ -165,7 +205,7 @@ Akce "ukázat prstem na" Azione "punta il dito a" "指差し"キー - "손가락으로 가리키기"행동 + "손가락으로 가리키기" 행동 使"手指指向在" 使"手指指向在" Animasyon "Parmakla Gösterme" @@ -182,7 +222,7 @@ 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. diff --git a/addons/fire/CfgSounds.hpp b/addons/fire/CfgSounds.hpp index c4b821144a..b83ce9b91a 100644 --- a/addons/fire/CfgSounds.hpp +++ b/addons/fire/CfgSounds.hpp @@ -3,10 +3,10 @@ #define CREATE_SCREAM(no)\ class GVAR(DOUBLES(scream,no)) { \ name = QUOTE(GVAR(CONCAT(scream,no)));\ - sound[] = {QUOTE(PATHTOF(CONCAT(sounds\scream,no).ogg)), db + 8, 1};\ + sound[] = {QUOTE(PATHTOF(CONCAT(sounds\scream,no).ogg)), QUOTE(db+8), 1};\ titles[] = {}; \ } - + class CfgSounds { CREATE_SCREAM(1); CREATE_SCREAM(2); diff --git a/addons/fire/RscTitles.hpp b/addons/fire/RscTitles.hpp index 3ccb8c349f..02ecd250e4 100644 --- a/addons/fire/RscTitles.hpp +++ b/addons/fire/RscTitles.hpp @@ -8,7 +8,7 @@ class RscTitles { fadeout = 0.75; name = QGVAR(onFire1); onload = QUOTE(with uiNamespace do {GVAR(onFireIndicator1) = _this select 0}); - + class controls { class GVAR(indicator): RscPicture { idc = -1; @@ -22,19 +22,19 @@ class RscTitles { y = "SafeZoneY"; w = "SafeZoneW + 0.05"; h = "SafeZoneH + 0.05"; - text = PATHTOF(data\overlay_burn_1.paa); + text = QPATHTOF(data\overlay_burn_1.paa); }; }; }; - + class GVAR(onFire2): GVAR(onFire1) { idd = -1; name = QGVAR(onFire2); onload = QUOTE(with uiNamespace do {GVAR(onFireIndicator2) = _this select 0}); - + class controls: controls { class GVAR(indicator): GVAR(indicator) { - text = PATHTOF(data\overlay_burn_2.paa); + text = QPATHTOF(data\overlay_burn_2.paa); }; }; }; diff --git a/addons/fire/XEH_PREP.hpp b/addons/fire/XEH_PREP.hpp index 511c9c0bb6..d9eacfdee0 100644 --- a/addons/fire/XEH_PREP.hpp +++ b/addons/fire/XEH_PREP.hpp @@ -2,6 +2,7 @@ PREP(burn); PREP(isBurning); PREP(isPlant); PREP(burnIndicator); +PREP(burnReaction); PREP(fireManagerPFH); PREP(medical_progress); diff --git a/addons/fire/XEH_postInit.sqf b/addons/fire/XEH_postInit.sqf index f89a062eff..125cb59140 100644 --- a/addons/fire/XEH_postInit.sqf +++ b/addons/fire/XEH_postInit.sqf @@ -3,7 +3,10 @@ [QGVAR(burn), FUNC(burn)] call CBA_fnc_addEventHandler; [QGVAR(playScream), { params ["_scream", "_source"]; - _source say3D _scream; + // only play sound if enabled in settings + if (GVAR(enableScreams)) then { + _source say3D _scream; + }; }] call CBA_fnc_addEventHandler; ["ace_settingsInitialized", { @@ -22,7 +25,7 @@ [GVAR(fireSources), _key, [_fireLogic, _radius, _intensity, _condition, _conditionArgs]] call CBA_fnc_hashSet; }] call CBA_fnc_addEventHandler; - + [QGVAR(removeFireSource), { params ["_key"]; [GVAR(fireSources), _key] call CBA_fnc_hashRem; @@ -32,3 +35,4 @@ GVAR(fireSources) = [[], nil] call CBA_fnc_hashCreate; }; }] call CBA_fnc_addEventHandler; + diff --git a/addons/fire/addon.toml b/addons/fire/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/fire/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/fire/config.cpp b/addons/fire/config.cpp index ad67f9beab..ac9f7009ec 100644 --- a/addons/fire/config.cpp +++ b/addons/fire/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -8,7 +15,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_medical_engine"}; author = ECSTRING(common,ACETeam); - authors[] = {"commy2", "Brandon (TCVM)"}; + authors[] = {"commy2", "tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -18,3 +25,5 @@ class CfgPatches { #include "CfgSounds.hpp" #include "ACE_Medical_Treatment_Actions.hpp" #include "RscTitles.hpp" + +#endif diff --git a/addons/fire/functions/fnc_burn.sqf b/addons/fire/functions/fnc_burn.sqf index e520880966..08d52bd05c 100644 --- a/addons/fire/functions/fnc_burn.sqf +++ b/addons/fire/functions/fnc_burn.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Makes object catch fire. Only call from events. Local effects only. * Arbitrary values to ignite people. Assumed maximum is "10". * @@ -23,8 +23,6 @@ #define BURN_PROPOGATE_UPDATE 1 #define BURN_PROPOGATE_DISTANCE 2 #define BURN_PROPOGATE_COUNTER_MAX 5 -#define MAX_INTENSITY 10 -#define MIN_INTENSITY 1 params ["_unit", "_intensity", ["_instigator", objNull]]; @@ -37,14 +35,14 @@ if (_isBurning) exitWith {}; // looped function (_this getVariable "params") params ["_unit", "", "_instigator"]; private _unitPos = getPosASL _unit; - + _intensity = _unit getVariable [QGVAR(intensity), 0]; - + if (surfaceIsWater _unitPos && {(_unitPos#2) < 1}) then { _intensity = 0; }; - - _fireParticle setDropInterval (0.01 max linearConversion [MAX_INTENSITY, MIN_INTENSITY, _intensity, 0.03, 0.1, false]); + + _fireParticle setDropInterval (0.01 max linearConversion [BURN_MAX_INTENSITY, BURN_MIN_INTENSITY, _intensity, 0.03, 0.1, false]); _fireParticle setParticleParams [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 10, 32], // sprite sheet values "", // animation name @@ -86,7 +84,7 @@ if (_isBurning) exitWith {}; 0, // random direction period 0 // random direction intensity ]; - + _smokeParticle setParticleCircle [0, [0, 0, 0]]; _smokeParticle setParticleRandom [ 0, // life time @@ -124,20 +122,20 @@ if (_isBurning) exitWith {}; _unit // particle source ]; _smokeParticle setDropInterval 0.15; - + _fireLight setLightBrightness ((_intensity * 3) / 10); _lightFlare setLightBrightness (_intensity / 30); - + private _distanceToUnit = (_unit distance ace_player); _fireLight setLightAttenuation [1, 10 max (5 min (10 - _intensity)), 0, 15]; _lightFlare setLightFlareSize (_intensity * (3 / 4)) * FLARE_SIZE_MODIFIER; - + if (!GVAR(enableFlare)) then { _lightFlare setLightFlareSize 0; }; - + // always keep flare visible to perceiving unit as long as it isnt the player - if !(_unit isEqualTo ace_player) then { + if (_unit isNotEqualTo ace_player) then { private _relativeAttachPoint = [0, 0, 0.3]; if (_distanceToUnit > 1.5) then { _relativeAttachPoint = (vectorNormalized (_unit worldToModelVisual (getPos ace_player))) vectorMultiply linearConversion [5, 30, _distanceToUnit, 0.5, 1.5]; @@ -145,14 +143,14 @@ if (_isBurning) exitWith {}; }; _lightFlare attachTo [_unit, _relativeAttachPoint]; }; - + if (!isGamePaused) then { // If the unit goes to spectator alive _unit == true and they will be on fire and still take damage // Only workaround I could think of, kinda clunky if (_isThisUnitAlive) then { _isThisUnitAlive = (alive _unit) && { getNumber ((configOf _unit) >> "isPlayableLogic") != 1 }; }; - + // propagate fire if ((CBA_missionTime - _lastPropogateUpdate) >= BURN_PROPOGATE_UPDATE) then { _lastPropogateUpdate = CBA_missionTime; @@ -162,8 +160,8 @@ if (_isBurning) exitWith {}; [QGVAR(burn), [ace_player, _intensity * (7 / 8), _instigator]] call CBA_fnc_globalEvent; }; } else { - if ((ace_player isKindOf "Man") && { !(_unit isEqualTo ace_player) }) then { - private _burnCounter = ace_player getVariable [QGVAR(burnCounter), 0]; + if ((ace_player isKindOf "Man") && {_unit isNotEqualTo ace_player} && {isDamageAllowed ace_player && {ace_player getVariable [QEGVAR(medical,allowDamage), true]}}) then { + private _burnCounter = _unit getVariable [QGVAR(burnCounter), 0]; if (_distanceToUnit < BURN_PROPOGATE_DISTANCE) then { if (_burnCounter < BURN_PROPOGATE_COUNTER_MAX) then { _burnCounter = _burnCounter + 1; @@ -173,12 +171,12 @@ if (_isBurning) exitWith {}; } else { _burnCounter = 0; }; - ace_player setVariable [QGVAR(burnCounter), _burnCounter]; + _unit setVariable [QGVAR(burnCounter), _burnCounter]; }; }; }; }; - + // update intensity/fire reactions if ((CBA_missionTime - _lastIntensityUpdate) >= INTENSITY_UPDATE) then { _lastIntensityUpdate = CBA_missionTime; @@ -203,7 +201,7 @@ if (_isBurning) exitWith {}; } else { private _group = (group _unit); private _vehicle = vehicle _unit; - + if (_vehicle != _unit) then { TRACE_1("Ejecting", _unit); _unit leaveVehicle _vehicle; @@ -223,33 +221,27 @@ if (_isBurning) exitWith {}; }; } else { if ((animationState _unit) in PRONE_ROLLING_ANIMS) then { - // decrease intensity of burn, but if its too high this wont do anything substantial - _intensity = _intensity - (1 / _intensity); + // decrease intensity of burn + _intensity = _intensity * INTENSITY_DECREASE_MULT_ROLLING; }; }; - - if ((_unit isEqualTo vehicle _unit) && { !(currentWeapon _unit isEqualTo "") }) then { - [_unit] call EFUNC(hitreactions,throwWeapon); - }; - - private _soundID = floor (1 + random 15); - private _sound = format [QGVAR(scream_%1), _soundID]; - [QGVAR(playScream), [_sound, _unit]] call CBA_fnc_globalEvent; + + [_unit] call FUNC(burnReaction); }; - + // Common burn areas are the hands and face https://www.ncbi.nlm.nih.gov/pubmed/16899341/ private _woundSelection = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] selectRandomWeighted [0.77, 0.5, 0.8, 0.8, 0.3, 0.3]; if (GET_PAIN_PERCEIVED(_unit) < (PAIN_UNCONSCIOUS + random 0.2)) then { // keep pain around unconciousness limit to allow for more fun interactions - [_unit, _intensity / MAX_INTENSITY, _woundSelection, "burn", _instigator] call EFUNC(medical,addDamageToUnit); + [_unit, _intensity / BURN_MAX_INTENSITY, _woundSelection, "burn", _instigator] call EFUNC(medical,addDamageToUnit); } else { - [_unit, 0.15, _woundSelection, "unknown", _instigator] call EFUNC(medical,addDamageToUnit); + [_unit, 0.15, _woundSelection, "burn", _instigator] call EFUNC(medical,addDamageToUnit); }; }; _unit setVariable [QGVAR(intensity), _intensity, true]; // globally sync intensity across all clients to make sure simulation is deterministic }; }; - + private _burnIndicatorPFH = _unit getVariable [QGVAR(burnUIPFH), -1]; if (_unit isEqualTo ace_player && { _isThisUnitAlive } && { _burnIndicatorPFH < 0 }) then { _burnIndicatorPFH = [FUNC(burnIndicator), 1, _unit] call CBA_fnc_addPerFrameHandler; @@ -261,61 +253,59 @@ if (_isBurning) exitWith {}; // init function private _params = _this getVariable "params"; _params params ["_unit", "_startingIntensity"]; - + _intensity = _startingIntensity; private _unitPos = getPos _unit; - + _fireParticle = "#particlesource" createVehicleLocal _unitPos; _fireParticle attachTo [_unit, [0, 0, 0]]; _fireParticle setDropInterval 0.03; - + _smokeParticle = "#particlesource" createVehicleLocal _unitPos; - + _fireLight = "#lightpoint" createVehicleLocal _unitPos; _fireLight setLightIntensity 0; _fireLight setLightAmbient [0.8, 0.6, 0.2]; _fireLight setLightColor [1, 0.5, 0.4]; _fireLight attachTo [_unit, [0, 0, 0]]; _fireLight setLightDayLight false; - + _lightFlare = "#lightpoint" createVehicleLocal _unitPos; _lightFlare setLightIntensity 0; _lightFlare setLightColor [1, 0.8, 0.8]; _lightFlare setLightUseFlare true; _lightFlare setLightFlareMaxDistance 100; _lightFlare setLightFlareSize 0; - - if !(_unit isEqualTo ace_player) then { + + if (_unit isNotEqualTo ace_player) then { private _relativeAttachPoint = (vectorNormalized (_unit worldToModelVisual (getPos ace_player))) vectorMultiply 1; _relativeAttachPoint set [2, 0.5]; _lightFlare attachTo [_unit, _relativeAttachPoint]; } else { _lightFlare attachTo [_unit, [0, 0, 0.3]]; }; - + if (isServer) then { _fireSound = createSoundSource ["Sound_Fire", _unitPos, [], 0]; - _fireSound attachTo [_unit, [0, 0, 0], "destructionEffect1"]; + _fireSound attachTo [_unit, [0, 0, 0], "Head"]; }; - + _unit setVariable [QGVAR(burning), true]; _unit setVariable [QGVAR(intensity), _intensity]; _unit setVariable [QGVAR(burnUIPFH), -1]; - + if (local _unit) then { if (_unit isEqualTo ace_player) then { private _burnIndicatorPFH = [FUNC(burnIndicator), 1, _unit] call CBA_fnc_addPerFrameHandler; _unit setVariable [QGVAR(burnUIPFH), _burnIndicatorPFH]; }; - - private _soundID = floor (1 + random 15); - private _sound = format [QGVAR(scream_%1), _soundID]; - [QGVAR(playScream), [_sound, _unit]] call CBA_fnc_globalEvent; + + [_unit, false] call FUNC(burnReaction); }; - + _lastIntensityUpdate = 0; _lastPropogateUpdate = 0; - + _isThisUnitAlive = true; }, { (_this getVariable "params") params ["_unit"]; @@ -326,7 +316,7 @@ if (_isBurning) exitWith {}; deleteVehicle _fireLight; deleteVehicle _lightFlare; deleteVehicle _fireSound; - + if (local _unit) then { if (!isPlayer _unit) then { _unit setUnitPos "AUTO"; @@ -334,15 +324,16 @@ if (_isBurning) exitWith {}; }; }; _unit setVariable [QGVAR(burning), false]; + _unit setVariable [QGVAR(burnCounter), 0]; }, { // run condition true }, { // exit condition (_this getVariable "params") params ["_unit"]; - + private _unitAlive = (alive _unit) && { getNumber ((configOf _unit) >> "isPlayableLogic") != 1 }; private _unitIsUnit = { (_unit != vehicle _unit) && { isNull vehicle _unit } }; - - !_unitAlive || _unitIsUnit || { _intensity <= MIN_INTENSITY } || { !([_unit] call FUNC(isBurning)) } + + !_unitAlive || _unitIsUnit || { _intensity <= BURN_MIN_INTENSITY } || { !([_unit] call FUNC(isBurning)) } }, ["_intensity", "_fireParticle", "_smokeParticle", "_fireLight", "_fireSound", "_lightFlare", "_lastIntensityUpdate", "_lastPropogateUpdate", "_isThisUnitAlive"]] call CBA_fnc_createPerFrameHandlerObject; diff --git a/addons/fire/functions/fnc_burnIndicator.sqf b/addons/fire/functions/fnc_burnIndicator.sqf index d5c9de25f3..13db8862c9 100644 --- a/addons/fire/functions/fnc_burnIndicator.sqf +++ b/addons/fire/functions/fnc_burnIndicator.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Run once per second in a PFH. Update screen effects with burn indicator. * * Arguments: diff --git a/addons/fire/functions/fnc_burnReaction.sqf b/addons/fire/functions/fnc_burnReaction.sqf new file mode 100644 index 0000000000..748fbbd60e --- /dev/null +++ b/addons/fire/functions/fnc_burnReaction.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" +/* + * Author: tcvm, veteran29 + * Handles burning reactions of an unit, like screaming or throwing the weapons away due to pain. + * + * Arguments: + * 0: Unit + * 1: Should unit throw its current weapon + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", ["_throwWeapon", true]]; + +if ( + _throwWeapon + && {GVAR(dropWeapon) > 0} + && {_unit in _unit && {(currentWeapon _unit) isNotEqualTo ""}} + && {!isPlayer _unit || GVAR(dropWeapon) >= 2} +) then { + [_unit] call EFUNC(common,throwWeapon); +}; + +if (_unit isKindOf "CAManBase") then { + private _soundID = floor (1 + random 15); + private _sound = format [QGVAR(scream_%1), _soundID]; + [QGVAR(playScream), [_sound, _unit]] call CBA_fnc_globalEvent; +}; diff --git a/addons/fire/functions/fnc_fireManagerPFH.sqf b/addons/fire/functions/fnc_fireManagerPFH.sqf index 8f75091190..29de18d28c 100644 --- a/addons/fire/functions/fnc_fireManagerPFH.sqf +++ b/addons/fire/functions/fnc_fireManagerPFH.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Handles various fire objects and determines if local units deserves to get burned. * Used to handle external burning objects, not used internally because internal methods are more performant. * @@ -28,10 +28,10 @@ params ["_args", "_handle"]; _value params ["_source", "_radius", "_intensity"]; private _attachedObject = attachedTo _source; private _sourcePos = getPosATL _source; - if !(_attachedObject isEqualTo objNull) then { + if (_attachedObject isNotEqualTo objNull) then { _sourcePos = getPosATL _attachedObject; }; - + private _nearEntities = _sourcePos nearEntities ["Man", _radius]; { private _burning = [_x] call FUNC(isBurning); diff --git a/addons/fire/functions/fnc_isBurning.sqf b/addons/fire/functions/fnc_isBurning.sqf index 1e62f39309..3bdbe560be 100644 --- a/addons/fire/functions/fnc_isBurning.sqf +++ b/addons/fire/functions/fnc_isBurning.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if object is burning. diff --git a/addons/fire/functions/fnc_isPlant.sqf b/addons/fire/functions/fnc_isPlant.sqf index 4fd982a7ce..f132fc72be 100644 --- a/addons/fire/functions/fnc_isPlant.sqf +++ b/addons/fire/functions/fnc_isPlant.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if object is a map placed bush or tree. diff --git a/addons/fire/functions/fnc_medical_canPatDown.sqf b/addons/fire/functions/fnc_medical_canPatDown.sqf index 3bf959330f..b7efc262b2 100644 --- a/addons/fire/functions/fnc_medical_canPatDown.sqf +++ b/addons/fire/functions/fnc_medical_canPatDown.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Returns if unit can pat down fire or not. * * Arguments: diff --git a/addons/fire/functions/fnc_medical_progress.sqf b/addons/fire/functions/fnc_medical_progress.sqf index fc78befea0..07d99958d6 100644 --- a/addons/fire/functions/fnc_medical_progress.sqf +++ b/addons/fire/functions/fnc_medical_progress.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Checks if patient is still burning for medical progress to continue. * * Arguments: diff --git a/addons/fire/functions/fnc_medical_success.sqf b/addons/fire/functions/fnc_medical_success.sqf index 8a37ebd76d..78e119a8fa 100644 --- a/addons/fire/functions/fnc_medical_success.sqf +++ b/addons/fire/functions/fnc_medical_success.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Decreases burning intensity on successful medical action. * * Arguments: @@ -16,8 +16,21 @@ * Public: No */ -params ["_medic", "_patient"]; +params ["_medic", "_patient", "_bodyPart", "_classname"]; private _intensity = _patient getVariable [QGVAR(intensity), 0]; -_intensity = _intensity * (4/5); +_intensity = _intensity * INTENSITY_DECREASE_MULT_PAT_DOWN; _patient setVariable [QGVAR(intensity), _intensity, true]; + +if (_intensity > BURN_MIN_INTENSITY) then { + TRACE_1("patient still burning, looping",_this); + + if (EGVAR(medical_gui,pendingReopen)) then { + LOG("temporarily blocking medical menu reopen"); + + EGVAR(medical_gui,pendingReopen) = false; + [{EGVAR(medical_gui,pendingReopen) = true}] call CBA_fnc_execNextFrame; + }; + + [_medic, _patient, _bodyPart, _classname] call EFUNC(medical_treatment,treatment); +}; diff --git a/addons/fire/functions/script_component.hpp b/addons/fire/functions/script_component.hpp deleted file mode 100644 index 782fabed76..0000000000 --- a/addons/fire/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\fire\script_component.hpp" diff --git a/addons/fire/initSettings.sqf b/addons/fire/initSettings.sqf index 6919c35f10..97963f3e32 100644 --- a/addons/fire/initSettings.sqf +++ b/addons/fire/initSettings.sqf @@ -1,19 +1,40 @@ [ QGVAR(enabled), "CHECKBOX", - ["STR_A3_OPTIONS_ENABLED", LSTRING(setting_description)], - LSTRING(category_displayName), + [ELSTRING(common,Enabled), LSTRING(Setting_Description)], + LSTRING(Category_DisplayName), true, // default value true, // isGlobal {[QGVAR(fireEnabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableFlare), "CHECKBOX", - [LSTRING(setting_flareEnable), LSTRING(setting_flareDescription)], - LSTRING(category_displayName), + [LSTRING(Setting_FlareEnable), LSTRING(Setting_FlareDescription)], + LSTRING(Category_DisplayName), false, // default value true, // isGlobal {[QGVAR(flareEnabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; + +[ + QGVAR(dropWeapon), "LIST", + [LSTRING(Setting_DropWeapon), LSTRING(Setting_DropWeapon_Description)], + LSTRING(Category_DisplayName), + [ + [0,1,2], + [localize "STR_A3_OPTIONS_DISABLED", ELSTRING(common,aiOnly), ELSTRING(common,playersAndAI)], + 1 + ], + true // isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(enableScreams), "CHECKBOX", + [LSTRING(Setting_EnableScreams), LSTRING(Setting_EnableScreams_Description)], + LSTRING(Category_DisplayName), + true, + false // isGlobal +] call CBA_fnc_addSetting; + diff --git a/addons/fire/script_component.hpp b/addons/fire/script_component.hpp index 289e3d13f1..86ef159aae 100644 --- a/addons/fire/script_component.hpp +++ b/addons/fire/script_component.hpp @@ -30,3 +30,10 @@ "amovppnemstpsoptwbindnon_amovppnemevasoptwbindl",\ "amovppnemstpsoptwbindnon_amovppnemevasoptwbindr"\ ] + + +#define BURN_MAX_INTENSITY 10 +#define BURN_MIN_INTENSITY 1 + +#define INTENSITY_DECREASE_MULT_PAT_DOWN 0.8 +#define INTENSITY_DECREASE_MULT_ROLLING INTENSITY_DECREASE_MULT_PAT_DOWN diff --git a/addons/fire/stringtable.xml b/addons/fire/stringtable.xml index 7292b1fe40..5dbd372e9b 100644 --- a/addons/fire/stringtable.xml +++ b/addons/fire/stringtable.xml @@ -1,29 +1,111 @@ - + ACE Fire ACE 火災 + ACE Feu + ACE Возгорание + ACE Feuer + ACE Ogień + ACE Fuego + ACE 火 + ACE 불 Pat Down Fire 火を叩き消す + Éteindre le feu + Потушить + Feuer löschen + Zgaś ogień + Extingir el fuego + 灭火 + 불 끄기 - Patting Down Fire - 火を叩き消しています + Patting down fire... + 火を叩き消しています・・・ + Feu en cours d'extinction... + Тушение... + Feuer wird gelöscht... + Gaszenie ognia... + Extinguiendo el fuego... + 正在灭火... + 불 끄는 중... - + Allow units to catch fire ユニットへ着火を許可 + Définit si les unités peuvent prendre feu ou non. + Включает возгорание + Erlaubt, dass Einheiten Feuer fangen können + Zezwól jednostkom na zapalenie się + Permitir que las unidades se incendien + 允许单位着火 + 유닛이 불에 붙게합니다 - + Enable fire-flare at night 夜間にフレア効果を有効化 + Halo lumineux la nuit + Включает сверкание пламени + Aktiviert Feuerschein bei Nacht. + Włącza efekt flary od ognia w nocy + Habilitar bengalas de fuego por la noche + 在夜间启用耀斑效果 + 밤에 불로 인한 조명 활성화 - + Uses a flare effect to increase fire intensity at night 夜間に火災の強さを上昇させるフレア効果を有効化します。 + Ajoute un effet de halo lumineux afin d'accroitre l'intensité du feu durant la nuit. + Включает ореол пламени для большей интенсивности ночью + Benutzt einen Feuerschein-Effekt um die Intensität des Feuers bei Nacht zu verstärken. + Używa efektu flary, aby zwiększyć jasność w nocy + Utiliza un efecto de bengala para aumentar la intensidad del fuego por la noche + 启用耀斑效果,增加夜间火焰的强度。 + 야간에 불로 인한 조명을 극대화 시킵니다 + + + Enable screams by units on fire + Habilitar los gritos de las unidades en llamas + 启用着火单位发出惨叫声 + 불 붙은 유닛 비명 + Schreie von brennenden Einheiten aktivieren + Włącz krzyki podpalonych jednostek + 炎上中の悲鳴を有効 + Вкл. крики от горения + + + Enables if units on fire will play the screaming sound + Habilita si las unidades en llamas reproducirán el sonido de los gritos + 启用着火的单位是否会发出惨叫声。 + 불이 붙은 유닛이 소리를 지르게 합니다 + Aktiviert, ob brennende Einheiten den Schrei-Ton abspielen + Włącza, czy płonące jednostki będą odtwarzać dźwięk krzyku + 有効化すると炎上しているユニットが悲鳴を上げます + Включает воспроизведение криков когда юнит загорается + + + Drop Weapons When on Fire + Soltar armas cuando esté en llamas + Włącz wyrzucanie broni podczas płonięcia + 着火时扔掉武器 + 불 붙을 경우 무기 내려놓음 + Waffen fallen lassen, wenn in Brand geraten. + 炎上時に武器を落とす + Бросать оружие из-за горения + + + Controls whether units drop their weapons when on fire. + Controla si las unidades dejan caer sus armas cuando están en llamas + Powoduje że jednostki wyrzucają swoją broń gdy płoną. + 控制单位在着火时是否丢掉武器。 + 유닛이 불에 붙이면 무기를 떨굴지를 결정합니다. + Steuert, ob Einheiten ihre Waffen fallen lassen, wenn sie brennen. + ユニットが炎上時に武器を落とすかどうかを定義します。 + Должны ли юниты выбрасывать оружие когда загораются. diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index 1ebc9a5a58..f939f84bb7 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -72,6 +72,7 @@ class CfgWeapons { descriptionShort = CSTRING(MX991_Description); model = QPATHTOF(data\mx_991.p3d); picture = QPATHTOF(UI\mx_991_ca.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 4; @@ -91,6 +92,7 @@ class CfgWeapons { descriptionShort = CSTRING(KSF1_Description); model = QPATHTOF(data\ksf_1.p3d); picture = QPATHTOF(UI\ksf_1_ca.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 4; @@ -110,6 +112,7 @@ class CfgWeapons { descriptionShort = CSTRING(XL50_Description); model = QPATHTOF(data\maglite_xl50.p3d); picture = QPATHTOF(UI\maglite_xl50_ca.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 3; diff --git a/addons/flashlights/XEH_postInitClient.sqf b/addons/flashlights/XEH_postInitClient.sqf index 53e7d041a8..15cd1372b4 100644 --- a/addons/flashlights/XEH_postInitClient.sqf +++ b/addons/flashlights/XEH_postInitClient.sqf @@ -5,4 +5,4 @@ if (!hasInterface) exitWith {}; LOG(MSG_INIT); -//todo: make flashlights attachable to players \ No newline at end of file +//todo: make flashlights attachable to players diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml index 16aaea33e4..8ca985cf34 100644 --- a/addons/flashlights/stringtable.xml +++ b/addons/flashlights/stringtable.xml @@ -12,8 +12,8 @@ Fulton MX-991 Fulton MX-991 フルトン MX-991 - Fulton MX-991 - Fulton MX-991手电筒 + 풀턴 MX-991 + Fulton MX-991 手电筒 Fulton MX-991 Fulton MX-991 @@ -28,7 +28,7 @@ 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. @@ -44,8 +44,8 @@ Maglite XL50 Maglite XL50 マグライト XL50 - Maglite XL50 - Maglite XL50手电筒 + 매그라이트 XL50 + Maglite XL50 手电筒 Maglite XL50 Maglite XL50 @@ -60,7 +60,7 @@ 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. @@ -77,7 +77,7 @@ KSF-1 KSF-1 KSF-1 - KSF-1手电筒 + KSF-1 手电筒 KSF-1 KSF-1 @@ -92,7 +92,7 @@ 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. @@ -102,7 +102,7 @@ Farbe des Kartenlichts Couleur de la lampe sur carte 光の色 - 地图上手电的颜色 + 手电在地图上光的颜色 地圖上使用手電筒的顏色 Colore della luce sulla mappa Kolor światła na mapie @@ -111,12 +111,14 @@ 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 Maglite ML300L @@ -124,12 +126,14 @@ Maglite ML300L Maglite ML300L Maglite ML300L + 매그라이트 ML300L Powerful LED flashlight. Leistungsstarke LED-Taschenlampe. Mocna latarka LED. 強大的LED手電筒 + 强光 LED 手电筒。 Torcia a LED ad alta potenza Silná LED svítilna. Puissante lampe torche à LED. @@ -137,6 +141,7 @@ Güçlü LED el feneri Linterna LED potente Мощный светодиодный фонарь. + 고휘도 LED 손전등. diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml index 03b30aeeba..51db6008f2 100644 --- a/addons/flashsuppressors/stringtable.xml +++ b/addons/flashsuppressors/stringtable.xml @@ -13,9 +13,9 @@ Пламегаситель (6,5 мм) Bocacha (6,5 mm) 消炎器 (6.5 mm) - 소염기 (6.5 mm) - 消光器 (6.5 mm) - 消光器 (6.5 毫米) + 소염기 (6.5mm) + 消焰器(6.5 mm) + 消光器 (6.5 mm) Flash Suppressor (6.5 mm) @@ -30,8 +30,8 @@ Пламегаситель (7,62 мм) Bocacha (7,62 mm) 消炎器 (7.62 mm) - 소염기 (7.62 mm) - 消光器 (7.62 mm) + 소염기 (7.62mm) + 消焰器(7.62 mm) 消光器 (7.62 毫米) Flash Suppressor (7.62 mm) @@ -47,9 +47,9 @@ Пламегаситель (5,56 мм) Bocacha (5,56 mm) 消炎器 (5.56 mm) - 소염기 (5.56 mm) - 消光器 (5.56 mm) - 消光器 (5.56 毫米) + 소염기 (5.56mm) + 消焰器(5.56 mm) + 消光器 (5.56 mm) Flash Suppressor (5.56 mm) @@ -65,7 +65,7 @@ Bocacha (.45 ACP) 消炎器 (.45 ACP) 소염기 (.45 ACP) - 消光器 (.45 ACP) + 消焰器(.45 ACP) 消光器 (.45 ACP) Flash Suppressor (.45 ACP) @@ -81,8 +81,8 @@ Пламегаситель (9 мм) Bocacha (9 mm) 消炎器 (9 mm) - 소염기 (9 mm) - 消光器 (9 mm) + 소염기 (9mm) + 消焰器(9 mm) 消光器 (9 毫米) Flash Suppressor (9 mm) @@ -99,7 +99,7 @@ Bocacha (.338) 消炎器 (.338) 소염기 (.338) - 消光器 (.338) + 消焰器(.338) 消光器 (.338) Flash Suppressor (.338) @@ -115,8 +115,8 @@ Пламегаситель (9,3 мм) Bocacha (9,3 mm) 消炎器 (9.3 mm) - 소염기 (9.3 mm) - 消光器 (9.3 mm) + 소염기 (9.3mm) + 消焰器(9.3 mm) 消光器 (9.3 毫米) Flash Suppressor (9.3 mm) diff --git a/addons/fonts/CfgFontFamilies.hpp b/addons/fonts/CfgFontFamilies.hpp index 9ec341c83d..6d7825a8ea 100644 --- a/addons/fonts/CfgFontFamilies.hpp +++ b/addons/fonts/CfgFontFamilies.hpp @@ -34,4 +34,9 @@ class CfgFontFamilies { spaceWidth = 0.5; spacing = 0.065; }; + class ACE_Stencil { + fonts[] = { + QPATHTOF(SairaStencilOne\ace_stencil64) + }; + }; }; diff --git a/addons/fonts/SairaStencilOne/ace_stencil64-01.paa b/addons/fonts/SairaStencilOne/ace_stencil64-01.paa new file mode 100644 index 0000000000..8445f780a9 Binary files /dev/null and b/addons/fonts/SairaStencilOne/ace_stencil64-01.paa differ diff --git a/addons/fonts/SairaStencilOne/ace_stencil64.fxy b/addons/fonts/SairaStencilOne/ace_stencil64.fxy new file mode 100644 index 0000000000..d701a65c67 Binary files /dev/null and b/addons/fonts/SairaStencilOne/ace_stencil64.fxy differ diff --git a/addons/fortify/ACEX_Fortify_Presets.hpp b/addons/fortify/ACEX_Fortify_Presets.hpp index 889939bb1c..edf12465ea 100644 --- a/addons/fortify/ACEX_Fortify_Presets.hpp +++ b/addons/fortify/ACEX_Fortify_Presets.hpp @@ -64,4 +64,26 @@ class ACEX_Fortify_Presets { {"Land_BagFence_01_long_green_F", 10} }; }; + class bigCombo { + displayName = CSTRING(bigCombo); + objects[] = { + {"Land_BagBunker_Tower_F", 50, "big"}, + {"Land_BagBunker_Large_F", 100, "big"}, + {"Land_BagBunker_Small_F", 25, "big"}, + {"Land_Cargo_Patrol_V1_F", 100, "big"}, + {"Land_BagFence_Round_F", 5, "big"}, + {"Land_BagFence_Short_F", 5, "big"}, + {"Land_BagFence_Long_F", 10, "big"}, + {"Land_PillboxBunker_01_big_F", 100, "bigGreen"}, + {"Land_PillboxWall_01_3m_F", 10, "bigGreen"}, + {"Land_PillboxWall_01_6m_F", 15, "bigGreen"}, + {"Land_PillboxBunker_01_hex_F", 50, "bigGreen"}, + {"Land_PillboxBunker_01_rectangle_F", 50, "bigGreen"}, + {"Land_Plank_01_8m_F", 10, "bigGreen"}, + {"Land_Plank_01_4m_F", 5, "bigGreen"}, + {"Land_BagFence_01_round_green_F", 5, "bigGreen"}, + {"Land_BagFence_01_short_green_F", 5, "bigGreen"}, + {"Land_BagFence_01_long_green_F", 10, "bigGreen"} + }; + }; }; diff --git a/addons/fortify/CfgVehicles.hpp b/addons/fortify/CfgVehicles.hpp index db739c4dbb..671652e974 100644 --- a/addons/fortify/CfgVehicles.hpp +++ b/addons/fortify/CfgVehicles.hpp @@ -28,7 +28,7 @@ class CfgVehicles { class ACE_Module: Module_F {}; class XGVAR(setupModule): ACE_Module { author = ECSTRING(common,ACETeam); - category = "ACEX"; + category = "ACE"; displayName = CSTRING(Fortify); function = QFUNC(setupModule); scope = 2; @@ -86,7 +86,7 @@ class CfgVehicles { class XGVAR(buildLocationModule): ACE_Module { author = ECSTRING(common,ACETeam); - category = "ACEX"; + category = "ACE"; displayName = CSTRING(buildLocationModule); scope = 2; isGlobal = 1; diff --git a/addons/fortify/CfgWeapons.hpp b/addons/fortify/CfgWeapons.hpp index 4c2bb9eaa7..66ff7f52d8 100644 --- a/addons/fortify/CfgWeapons.hpp +++ b/addons/fortify/CfgWeapons.hpp @@ -9,6 +9,7 @@ class CfgWeapons { model = "\A3\Structures_F\Items\Tools\Hammer_F.p3d"; picture = QPATHTOF(UI\hammer_ca.paa); scope = 2; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 0; }; diff --git a/addons/fortify/XEH_PREP.hpp b/addons/fortify/XEH_PREP.hpp index b2feda35fa..785ba0a49f 100644 --- a/addons/fortify/XEH_PREP.hpp +++ b/addons/fortify/XEH_PREP.hpp @@ -15,3 +15,4 @@ ACEX_PREP(getPlaceableSet); ACEX_PREP(modifyAction); ACEX_PREP(setupModule); ACEX_PREP(buildLocationModule); +ACEX_PREP(createObjectMarker); diff --git a/addons/fortify/XEH_postInit.sqf b/addons/fortify/XEH_postInit.sqf index f14c4cb8f7..ed13a116c7 100644 --- a/addons/fortify/XEH_postInit.sqf +++ b/addons/fortify/XEH_postInit.sqf @@ -7,6 +7,15 @@ if (isServer) then { TRACE_3("objectPlaced",_unit,_side,_object); private _jipID = [QGVAR(addActionToObject), [_side, _object]] call CBA_fnc_globalEventJIP; [_jipID, _object] call CBA_fnc_removeGlobalEventJIP; // idealy this function should be called on the server + + if (GVAR(markObjectsOnMap) isNotEqualTo 0 && {_object isKindOf "Static"}) then { + // Wait ensures correct marker pos/rot as object is moved into position after creation + [ + FUNC(createObjectMarker), + [_unit, _object], + 1 + ] call CBA_fnc_waitAndExecute; + }; }] call CBA_fnc_addEventHandler; }; @@ -63,3 +72,35 @@ GVAR(objectRotationZ) = 0; [_object, 0, ["ACE_MainActions"], _removeAction] call EFUNC(interact_menu,addActionToObject); }; }] call CBA_fnc_addEventHandler; + +// Place object event handler +[QGVAR(deployFinished), { + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_unit", "_side", "_typeOf", "_posASL", "_vectorDir", "_vectorUp", "_cost"]; + + private _newObject = _typeOf createVehicle _posASL; + _newObject setPosASL _posASL; + _newObject setVectorDirAndUp [_vectorDir, _vectorUp]; + + // Server will use this event to run the jip compatible QGVAR(addActionToObject) event and create the related map marker + [QXGVAR(objectPlaced), [_unit, _side, _newObject]] call CBA_fnc_globalEvent; + + if (cba_events_control) then { + // Re-run if ctrl key held + [_unit, _unit, [_side, _typeOf, [GVAR(objectRotationX), GVAR(objectRotationY), GVAR(objectRotationZ)]]] call FUNC(deployObject); + }; + + // Reset animation + [_unit, "", 1] call EFUNC(common,doAnimation); +}] call CBA_fnc_addEventHandler; + +[QGVAR(deployCanceled), { + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_unit", "_side", "_typeOf", "_posASL", "_vectorDir", "_vectorUp", "_cost"]; + + // Refund if deploy was canceled + [_side, _cost] call FUNC(updateBudget); + + // Reset animation + [_unit, "", 1] call EFUNC(common,doAnimation); +}] call CBA_fnc_addEventHandler; diff --git a/addons/fortify/functions/fnc_addActions.sqf b/addons/fortify/functions/fnc_addActions.sqf index 312e37e8fe..4802effa01 100644 --- a/addons/fortify/functions/fnc_addActions.sqf +++ b/addons/fortify/functions/fnc_addActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Adds the child actions. @@ -21,9 +21,10 @@ private _side = side group _player; private _objects = missionNamespace getVariable [format [QGVAR(Objects_%1), _side], []]; private _actions = []; private _infiniteBudget = ([side group _player] call FUNC(getBudget)) == -1; +private _subActions = createHashmap; { - _x params ["_classname", "_cost"]; + _x params ["_classname", "_cost", ["_category", ""]]; private _displayName = getText (configFile >> "CfgVehicles" >> _classname >> "displayName"); @@ -43,7 +44,24 @@ private _infiniteBudget = ([side group _player] call FUNC(getBudget)) == -1; [_side, _classname] ] call EFUNC(interact_menu,createAction); - _actions pushBack [_action, [], _player]; + if (_category == "") then { + _actions pushBack [_action, [], _player]; + } else { + private _categoryActions = _subActions getOrDefault [_category, [], true]; + _categoryActions pushBack [_action, [], _player]; + }; } forEach _objects; +{ + private _displayName = if (isLocalized _x) then { + localize _x + } else { + if (isText (configFile >> "ACEX_Fortify_Presets" >> _x >> "displayName")) exitWith { getText (configFile >> "ACEX_Fortify_Presets" >> _x >> "displayName") }; + if (isText (missionConfigFile >> "ACEX_Fortify_Presets" >> _x >> "displayName")) exitWith { getText (missionConfigFile >> "ACEX_Fortify_Presets" >> _x >> "displayName") }; + _x + }; + private _action = [_x, _displayName, "", {}, {true}] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, _y, _player]; +} forEach _subActions; + _actions diff --git a/addons/fortify/functions/fnc_addDeployHandler.sqf b/addons/fortify/functions/fnc_addDeployHandler.sqf index 176579e661..4eef1ad0ae 100644 --- a/addons/fortify/functions/fnc_addDeployHandler.sqf +++ b/addons/fortify/functions/fnc_addDeployHandler.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Cuel, mharis001 * Adds a custom deploy handler. diff --git a/addons/fortify/functions/fnc_axisLengths.sqf b/addons/fortify/functions/fnc_axisLengths.sqf index 90cc5d7c2b..f68939bfa7 100644 --- a/addons/fortify/functions/fnc_axisLengths.sqf +++ b/addons/fortify/functions/fnc_axisLengths.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Gets the longest axis of the bounding box of the given object. diff --git a/addons/fortify/functions/fnc_buildLocationModule.sqf b/addons/fortify/functions/fnc_buildLocationModule.sqf index c141ae44c0..c777b80d4e 100644 --- a/addons/fortify/functions/fnc_buildLocationModule.sqf +++ b/addons/fortify/functions/fnc_buildLocationModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles build location module diff --git a/addons/fortify/functions/fnc_canFortify.sqf b/addons/fortify/functions/fnc_canFortify.sqf index eb19eb6139..3a382bc98c 100644 --- a/addons/fortify/functions/fnc_canFortify.sqf +++ b/addons/fortify/functions/fnc_canFortify.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Checks whether the given player can fortify. diff --git a/addons/fortify/functions/fnc_createObjectMarker.sqf b/addons/fortify/functions/fnc_createObjectMarker.sqf new file mode 100644 index 0000000000..185ae640eb --- /dev/null +++ b/addons/fortify/functions/fnc_createObjectMarker.sqf @@ -0,0 +1,48 @@ +#include "..\script_component.hpp" +/* + * Author: Seb + * Creates a map marker for a created static object but only for sides friendly to the creator side. + * + * Arguments: + * 0: Unit placing + * 1: Created fortify object + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_fortify_fnc_createObjectMarker + * + * Public: No + */ + +params ["_unit", "_object"]; +TRACE_2("createObjectMarker",_unit,_object); + +// Get Object size and direction +private _bbr = 0 boundingBoxReal _object; +private _p1 = _bbr select 0; +private _p2 = _bbr select 1; +private _maxWidth = abs ((_p2 select 0) - (_p1 select 0)); +private _maxLength = abs ((_p2 select 1) - (_p1 select 1)); +private _direction = getDir _object; + +// Marker name unique to this object +private _markerNameStr = format [QGVAR(marker_%1), hashValue _object]; +private _channel = if (GVAR(markObjectsOnMap) == 2) then { 0 } else { 1 }; + +private _marker = createMarkerLocal [_markerNameStr, _object, _channel, _unit]; +TRACE_2("created",_marker,_channel); +_marker setMarkerShapeLocal "RECTANGLE"; +_marker setMarkerBrushLocal "SolidFull"; +_marker setMarkerSizeLocal [(_maxWidth / 2),(_maxLength / 2)]; +_marker setMarkerDirLocal _direction; +_marker setMarkerColor "ColorGrey"; +_object setVariable [QGVAR(mapMarker), _marker, false]; + +_object addEventHandler ["Deleted", { + params ["_object"]; + private _marker = _object getVariable QGVAR(mapMarker); + TRACE_2("cleaning up marker",_object,_marker); + deleteMarker _marker +}]; diff --git a/addons/fortify/functions/fnc_deployConfirm.sqf b/addons/fortify/functions/fnc_deployConfirm.sqf index d04124fd93..37e0d4fb9d 100644 --- a/addons/fortify/functions/fnc_deployConfirm.sqf +++ b/addons/fortify/functions/fnc_deployConfirm.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Confirms the deployment. @@ -20,24 +20,39 @@ params ["_unit", "_object"]; TRACE_2("deployConfirm",_unit,_object); private _side = side group _unit; -private _cost = [_side, typeOf _object] call FUNC(getCost); +private _typeOf = typeOf _object; +private _cost = [_side, _typeOf] call FUNC(getCost); [_side, -_cost] call FUNC(updateBudget); -private _typeOf = typeOf _object; private _posASL = getPosASL _object; private _vectorUp = vectorUp _object; private _vectorDir = vectorDir _object; deleteVehicle _object; -private _newObject = _typeOf createVehicle _posASL; -_newObject setPosASL _posASL; -_newObject setVectorDirAndUp [_vectorDir, _vectorUp]; +// Create progress bar to place object +private _totalTime = _cost * GVAR(timeCostCoefficient) + GVAR(timeMin); // time = Ax + b -// Server will use this event to run the jip compatible QGVAR(addActionToObject) event -[QXGVAR(objectPlaced), [_unit, _side, _newObject]] call CBA_fnc_globalEvent; +private _perframeCheck = { + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_unit", "_side", "_typeOf", "_posASL", "_vectorDir", "_vectorUp", "_cost"]; -if (cba_events_control) then { - // Re-run if ctrl key held - [_unit, _unit, [_side, _typeOf, [GVAR(objectRotationX), GVAR(objectRotationY), GVAR(objectRotationZ)]]] call FUNC(deployObject); + // Animation loop (required for longer constructions) + if (animationState _unit isNotEqualTo "AinvPknlMstpSnonWnonDnon_medic4") then { + // Perform animation + [_unit, "AinvPknlMstpSnonWnonDnon_medic4"] call EFUNC(common,doAnimation); + }; + + // Return true always + true }; + +[ + _totalTime, + [_unit, _side, _typeOf, _posASL, _vectorDir, _vectorUp, _cost], + QGVAR(deployFinished), + QGVAR(deployCanceled), + LLSTRING(progressBarTitle), + _perframeCheck +] call EFUNC(common,progressBar); + diff --git a/addons/fortify/functions/fnc_deployObject.sqf b/addons/fortify/functions/fnc_deployObject.sqf index cff46df6d9..4895b261bc 100644 --- a/addons/fortify/functions/fnc_deployObject.sqf +++ b/addons/fortify/functions/fnc_deployObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Deploys the object to the player for them to move it around. diff --git a/addons/fortify/functions/fnc_getBudget.sqf b/addons/fortify/functions/fnc_getBudget.sqf index 2e7e73dca4..44b254eae9 100644 --- a/addons/fortify/functions/fnc_getBudget.sqf +++ b/addons/fortify/functions/fnc_getBudget.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Gets the budget for the given side. diff --git a/addons/fortify/functions/fnc_getCost.sqf b/addons/fortify/functions/fnc_getCost.sqf index d0a3abc6a7..a55e39f299 100644 --- a/addons/fortify/functions/fnc_getCost.sqf +++ b/addons/fortify/functions/fnc_getCost.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Gets the cost for the given side and classname. diff --git a/addons/fortify/functions/fnc_getPlaceableSet.sqf b/addons/fortify/functions/fnc_getPlaceableSet.sqf index df0e1b24c5..9643d54190 100644 --- a/addons/fortify/functions/fnc_getPlaceableSet.sqf +++ b/addons/fortify/functions/fnc_getPlaceableSet.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Gets placeable object classnames and values. @@ -30,14 +30,15 @@ if (!isClass _config) exitWith { private _objects = getArray (_config >> "objects"); -// Attemp to filter bad input +// Attempt to filter bad input _objects = _objects select { - if ((_x isEqualTypeParams ["", 0])) then { + if ((_x isEqualTypeParams ["", 0]) || {_x isEqualTypeParams ["", 0, ""]}) then { _x params [["_classname", "#", [""]], ["_cost", -1, [0]]]; if (isClass (configFile >> "CfgVehicles" >> _classname)) then { true } else { ERROR_2("Preset [%1] - Classname does not exist",_preset,_classname); + false }; } else { ERROR_2("Preset [%1] - Bad data in objects array %2",_preset,_x); diff --git a/addons/fortify/functions/fnc_handleChatCommand.sqf b/addons/fortify/functions/fnc_handleChatCommand.sqf index 48759ef608..46bdc3cb0b 100644 --- a/addons/fortify/functions/fnc_handleChatCommand.sqf +++ b/addons/fortify/functions/fnc_handleChatCommand.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Handles the chat command usage by admin. diff --git a/addons/fortify/functions/fnc_handleScrollWheel.sqf b/addons/fortify/functions/fnc_handleScrollWheel.sqf index e8e7ec6189..fa5007cd51 100644 --- a/addons/fortify/functions/fnc_handleScrollWheel.sqf +++ b/addons/fortify/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Handles the object direction. diff --git a/addons/fortify/functions/fnc_modifyAction.sqf b/addons/fortify/functions/fnc_modifyAction.sqf index 4587840396..08da255a46 100644 --- a/addons/fortify/functions/fnc_modifyAction.sqf +++ b/addons/fortify/functions/fnc_modifyAction.sqf @@ -1,5 +1,5 @@ -#include "script_component.hpp" - /* +#include "..\script_component.hpp" +/* * Author: PabstMirror * Modifies the fortify action, shows current budget. * diff --git a/addons/fortify/functions/fnc_parseSide.sqf b/addons/fortify/functions/fnc_parseSide.sqf index 32d408cc19..3e9ca5d78d 100644 --- a/addons/fortify/functions/fnc_parseSide.sqf +++ b/addons/fortify/functions/fnc_parseSide.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Parses the given text and returns a side. diff --git a/addons/fortify/functions/fnc_registerObjects.sqf b/addons/fortify/functions/fnc_registerObjects.sqf index 92d5772b5f..b8e7abd171 100644 --- a/addons/fortify/functions/fnc_registerObjects.sqf +++ b/addons/fortify/functions/fnc_registerObjects.sqf @@ -1,9 +1,9 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Registers the given objects in the given side's player interaction menu. * Players on that side must have the pickaxe item in their inventory to access the menu. - * Classnames must be in the format [, ] + * Classnames must be in the format [, , ] * MUST BE CALLED ON SERVER! * * Arguments: @@ -16,6 +16,7 @@ * * Example: * [west, 5000, [["Land_BagFence_Long_F", 5], ["Land_BagBunker_Small_F", 50]]] call ace_fortify_fnc_registerObjects + * [west, 5000, [["Land_BagFence_Long_F", 5, "tan"], ["Land_BagFence_01_long_green_F", 5, "green"]]] call ace_fortify_fnc_registerObjects * * Public: Yes */ @@ -29,6 +30,9 @@ if (_side isEqualTo sideUnknown) exitWith {ERROR_1("Bad Side %1",_this);}; _objects select { private _isValid = _x params [["_xClassname", "", [""]], ["_xCost", 0, [0]]]; + private _category = toLower (_x param [2, "", [""]]); + if (_category != "") then { _x set [2, _category]; }; + if (_isValid) then { _isValid = isClass (configFile >> "CfgVehicles" >> _xClassname); if (!_isValid) then {WARNING_1("Classname does not exist in CfgVehicles %1",_x);}; diff --git a/addons/fortify/functions/fnc_setupModule.sqf b/addons/fortify/functions/fnc_setupModule.sqf index a57d202588..f032d98ebe 100644 --- a/addons/fortify/functions/fnc_setupModule.sqf +++ b/addons/fortify/functions/fnc_setupModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles setup module. diff --git a/addons/fortify/functions/fnc_updateBudget.sqf b/addons/fortify/functions/fnc_updateBudget.sqf index c75073af0b..fe6d89dca2 100644 --- a/addons/fortify/functions/fnc_updateBudget.sqf +++ b/addons/fortify/functions/fnc_updateBudget.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Updates the given sides budget. diff --git a/addons/fortify/functions/script_component.hpp b/addons/fortify/functions/script_component.hpp deleted file mode 100644 index d69a852d6e..0000000000 --- a/addons/fortify/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\fortify\script_component.hpp" diff --git a/addons/fortify/initSettings.sqf b/addons/fortify/initSettings.sqf index 6ecb47444a..aa8d62f5c4 100644 --- a/addons/fortify/initSettings.sqf +++ b/addons/fortify/initSettings.sqf @@ -9,3 +9,36 @@ 2 ] ] call CBA_fnc_addSetting; + +[ + QGVAR(timeCostCoefficient), + "SLIDER", + [LLSTRING(settingHint_timeCostCoefficient), LLSTRING(settingHintDesc_timeCostCoefficient)], + LLSTRING(settingsCategory), + [0, 10, 1, 2], // Min, Max, Default, Trailing Decimals, is Percentage + true //isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(timeMin), + "SLIDER", + [LLSTRING(settingHint_timeMin), LLSTRING(settingHintDesc_timeMin)], + LLSTRING(settingsCategory), + [0, 25, 1.5, 2], // Min, Max, Default, Trailing Decimals, is Percentage + true //isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(markObjectsOnMap), + "LIST", + [LLSTRING(markObjectsOnMap), LLSTRING(markObjectsOnMapDesc)], + LLSTRING(settingsCategory), + [ + [0, 1, 2], + [LLSTRING(markObjectsOnMapNone), LLSTRING(markObjectsOnMapFriendly), LLSTRING(markObjectsOnMapEveryone)], + 1 + ], + true, + {}, + true +] call CBA_fnc_addSetting; diff --git a/addons/fortify/stringtable.xml b/addons/fortify/stringtable.xml index 514af4a683..0cd34e518e 100644 --- a/addons/fortify/stringtable.xml +++ b/addons/fortify/stringtable.xml @@ -7,10 +7,11 @@ 要塞 요새화 要塞 - 要塞 + 设防 Fortyfikowanie Фортификация Inşa Etme + Fortificar Fortify Tool @@ -18,10 +19,11 @@ 要塞ツール 요새화 도구 要塞工具 - 要塞工具 + 设防工具 Narzędzie do fortyfikowania Инструмент строителя Inşa Etme Aleti + Herramienta de Fortificar Budget @@ -33,17 +35,19 @@ Budżet Бюджет Bütçe + Presupuesto Auto add fortify item Füge das Bauwerkzeug automatisch hinzu 自動的に要塞ツールを追加 - 자동 추가 요새 항목 + 요새화 도구 자동으로 추가 自動增加要塞物品 - 自动增加要塞物品 + 自动增加设防物品 Automatycznie dodaj narzędzie do fortyfikowania Автоматически добавлять Инструмент строителя Otomatik olarak inşa etme aletini ekle + Añadir objeto de Fortificar automáticamente Initializes the Fortify system, with some basic parameters.<br/>Presets are pulled from configFile and missionConfigFile, see wiki for format. @@ -51,6 +55,10 @@ Инициализирует систему фортификации с некоторыми базовыми параметрами.<br/>Предустановки взяты из configFile и missionConfigFile, формат смотри на wiki. Inşa etme sistemini bazı temel parametrelerle başlatır. <br/> Ön ayarlar configFile ve missionConfigFile'dan alınır, format için wiki'ye bakın. 要塞システムを初期設定に戻します。<br/>プリセットは configfile と missionConfigFile から参照されます。詳細は wiki を参照してください。 + Initialisiert das Verstärken-System, mit grundlegenden Einstellungen <br/>Vorseinstellungen werden aus der configFile und der missionConfigFile gezogen, für mehr Informationen: siehe das ACE Wiki. + 使用一些基本参数初始化设防系统。<br/>预设从 configFile 和 missionConfigFile 中提取,参见 wiki 的格式。 + 기본 파라미터와 함께 요새화 시스템을 활성화합니다<br/>configFile 과 missionConfigFile에서 프리셋을 뽑아옵니다, 포맷은 위키를 참조하십시오. + Inicializa el sistema deFortificación con los parámetros básicos. .<br/>Los presets son importados de configFile y de missionConfigFile, consultar la wiki para ver el formato. Rotate @@ -82,7 +90,7 @@ Confirmar implantação ここで作る 설치 확인 - 确认布署 + 确认部署 確認佈署 Yerleştirmeyi Onayla @@ -91,20 +99,24 @@ Verstärken: Beschränke Baubereich 要塞: 構築制限エリア 要塞: 限制建造區 - 要塞: 限制建造区 + 设防:限制建造区 Fortyfikowanie: Limituj strefe budowania - Фортификация: ограничить зону постройки + Фортификация: Ограничить зону постройки Inşa Etme : Bölgede Inşa Etmeyi Limitle + 요새화: 건설 영역 제한 + Fortificar: Limitar área de construcción ACE Fortify ACE Verstärken ACE 要塞 - ACE 要塞 + ACE 设防 ACE 要塞 ACE Fortyfikowanie ACE Фортификация ACE Inşa Etme + ACE 요새화 + ACE Fortificar Show budget updates @@ -115,6 +127,8 @@ Pokaż aktualizacje budżetu Показывать обновления бюджета Bütçe güncellenmelerini göster + 비용 업데이트 표시 + Mostrar actualizaciones de presupuesto Controls when budget update hints are shown @@ -125,6 +139,8 @@ Kontroluje kiedy aktualizacje budżetu są wyświetlane Настраивает сообщения об обновлении бюджета Bütçe güncellenince bilgi verilip verilmeyeceğini kontrol eder. + 어떤 행동을 취할 때 비용이 표시되는지를 결정합니다 + Controla cuándo los avisos de actualizaciones de presupuesto se muestran Never show @@ -135,16 +151,20 @@ Nigdy Не показывать никогда Asla Gösterme + 안 보여줌 + No mostrar nunca Has fortify tool Hat Bauewerkzeug 有要塞工具 - 有要塞工具 + 有设防工具 要塞ツール所持の時 Posiada narzędzie do fortyfikowania - Если имеется Инструмент + Если имеется инструмент Insa Etme Aleti Olanlara Göster + 요새화 도구를 들고 있을 때 + Tiene herramienta de Fortificar Always show @@ -155,6 +175,120 @@ Zawsze Показывать всегда Her Zaman Göster + 항상 보여줌 + Mostrar siempre + + + Time-Cost Coefficient + 时间—成本系数 + 시간-가격 계수 + Zeit-Kosten-Koeffizient + 時間コスト係数 + Współczynnik Czas-Koszt + Коэф. время-цена + Coeficiente Tiempo-Coste + + + Coefficient used to determine time to build structure.\nA in Ax + b where x is cost of object + 用于确定建造建筑所需时间的系数。\nA是 Ax+b中的一个参数,其中x是物体的成本 + 건축물을 지을 때 걸리는 시간을 계수를 적용하여 계산합니다. + Koeffizient zur Bestimmung der Bauzeit \nA in Ax + b, wobei x die Kosten des Objekts sind. + 建造する時間を決定するために使用される係数。\n計算式はAx + bです。この係数はAであり、xは建造物のコストです。 + Współczynnik używany do określenia czasu budowy konstrukcji.\nA w Ax + b gdzie x jest kosztem obiektu + Коэффициент используемый для указания времени необходимого для возведения постройки.\nA в формуле Ax + b, где x - это цена объекта + Coeficiente usado para determinar el tiempo de construcción de una estructura.\nA en Ax + b donde x es el coste del objeto + + + Minimum Build Time + 最短建造时间 + 최소 건축 시간 + Minimale Bauzeit + 建造に掛かる最小の時間 + Minimalny czas budowy + Мин. время возведения + Tiempo mínimo de construcción + + + Minimum time to build any structure.\nb in Ax + b where x is cost of object + 建造任何建筑的最短时间。\nb是 Ax+b中的一个参数,其中x是物体的成本 + 건축물을 지을 때 걸리는 최소 시간을 계수를 적용하여 계산합니다. + Mindestzeit für den Bau eines beliebigen Bauwerks.\nb in Ax + b, wobei x die Kosten des Objekts sind. + 建造に掛かる最小の時間。\n計算式はAx + bです。この時間はbであり、xは建造物のコストです。 + Minimalny czas do zbudowania dowolenj konstrukcji.\nb w Ax + b gdzie x jest kosztem obiektu + Минимальное время для возведения любой постройки.\nb в формуле Ax + b, где x - это цена объекта + Tiempo mínimo para construir una estructura.\nb en Ax + b donde x es el coste del objeto + + + Building + 建造 + 건설 중 + Bauwerk + 建造 + Budowanie + Возведение + Construyendo + + + Create map markers + 创建地图标记 + 지도에 마커 생성 + Kartenmarkierungen erstellen + マップマーカーを生成する + Twórz znaczniki na mapie + Создавать маркера на карте + Crear marcadores de mapa + + + Create map markers that look like terrain buildings when static fortifications are placed + 在放置静态防御工事时,创建看起来像地形建筑的地图标记 + 건축물을 건설하고 나서 지도에 마커를 생성합니다 + Erstellen von Kartenmarkierungen, die wie Gebäude im Gelände aussehen, wenn statische Befestigungen platziert werden + 静的な建築物が配置されたときに地形の建物のように見えるマップマーカーを生成します + Utwórz znaczniki mapy, które wyglądają jak obiekty terenu, gdy umieszczane są statyczne fortyfikacje + Создавать маркера от статических фортификаций как от зданий на карте + Crear marcadores de mapa que tienen la apariencia de edificios del terreno cuando las fortificaciones estáticas son colocadas + + + Never + Nikdy + Nie + Никогда + Nigdy + Mai + Nunca + Jamais + 永不 + なし + 안 함 + Nunca + 永不 + Asla + + + For units friendly to the placer + 对放置者友军单位 + 아군 유닛이 지은 건물만 + Für, zum Erbauer, verbündete Einheiten. + 設置者の友軍に + Dla jednostek sojuszniczych wobec stawiającego + Для союзников + Para unidades aliadas de quien coloca la fortificación + + + For everyone + 所有人 + Pour tous + Para todos + Per tutti + Dla wszystkich + Для всех + Für alle + Pro všechny + Para todos + 모든 사람 + 针对每一个人 + 全員に + Herkes için Small @@ -162,13 +296,21 @@ Малый Küçük 小型 + Klein + 小型 + 소형 + Pequeña Small (Green) - Малый (Зеленый) + Малый (зелёный) Małe (Zielone) Küçük (Yeşil) 小型 (グリーン) + Klein (Grün) + 小型(绿色) + 소형 (초목) + Pequeña (Verde) Medium @@ -176,13 +318,21 @@ Средний Orta 中型 + Mittel + 中型 + 중형 + Mediana Medium (Green) - Средний (Зеленый) + Средний (зелёный) Średnie (Zielone) Orta (Yeşil) 中型 (グリーン) + Mittel (Grün) + 中型(绿色) + 중형 (초목) + Mediana (Verde) Big @@ -190,13 +340,32 @@ Большой Büyük 大型 + Groß + 大型 + 대형 + Grande Big (Green) Duże (Zielone) - Большой (Зеленый) + Большой (зелёный) Büyük (Yeşil) 大型 (グリーン) + Groß (Grün) + 大型(绿色) + 대형 (초목) + Grande (Verde) + + + Big (Both) + Duże (Oba) + Большой (Оба) + Büyük (İkisi de) + 大型 (両方) + Groß (Beide) + 大型(两方) + 대형 (둘 다) + Grande (Ambos) diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 2c42e805ec..7a124833b3 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -13,7 +13,7 @@ class CfgAmmo { GVAR(metal) = 140000; GVAR(charge) = 87000; GVAR(gurney_c) = 2320; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class Bomb_04_F: ammo_Bomb_LaserGuidedBase { GVAR(enabled) = 1; @@ -22,7 +22,7 @@ class CfgAmmo { GVAR(metal) = 140000; GVAR(charge) = 87000; GVAR(gurney_c) = 2320; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class BombCore; class Bo_Mk82: BombCore { @@ -32,7 +32,7 @@ class CfgAmmo { GVAR(metal) = 140000; GVAR(charge) = 87000; GVAR(gurney_c) = 2320; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; // ~~~~ Grenades: @@ -52,7 +52,7 @@ class CfgAmmo { GVAR(metal) = 210; // metal in grams GVAR(charge) = 185; // explosive in grams GVAR(gurney_c) = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations - GVAR(gurney_k) = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations + GVAR(gurney_k) = "3/5"; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations }; class GrenadeHand_stone: GrenadeHand { GVAR(skip) = 1; @@ -69,7 +69,7 @@ class CfgAmmo { GVAR(metal) = 200; GVAR(charge) = 32; GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class G_40mm_HEDP: G_40mm_HE { // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M433 @@ -79,7 +79,7 @@ class CfgAmmo { GVAR(metal) = 200; GVAR(charge) = 45; GVAR(gurney_c) = 2830; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class ACE_G_40mm_HEDP: G_40mm_HEDP {}; @@ -130,7 +130,7 @@ class CfgAmmo { GVAR(metal) = 2300; GVAR(charge) = 590; GVAR(gurney_c) = 2800; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; GVAR(classes)[] = {"ACE_frag_small"}; }; @@ -145,7 +145,7 @@ class CfgAmmo { GVAR(metal) = 3850; GVAR(charge) = 1040; GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class RocketBase; class R_80mm_HE: RocketBase { @@ -159,7 +159,7 @@ class CfgAmmo { GVAR(metal) = 56250; GVAR(charge) = 39000; GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class Rocket_04_HE_F: MissileBase { // Shrieker (Hydra 70) GVAR(enabled) = 1; @@ -167,7 +167,7 @@ class CfgAmmo { GVAR(metal) = 3850; GVAR(charge) = 1040; GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class M_Scalpel_AT: MissileBase { // 9K121 Vikhr GVAR(enabled) = 1; @@ -175,7 +175,7 @@ class CfgAmmo { GVAR(metal) = 10000; GVAR(charge) = 3000; GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class ACE_Hellfire_AGM114K: M_Scalpel_AT { // Source: http://www.designation-systems.net/dusrm/m-114.html @@ -185,7 +185,7 @@ class CfgAmmo { GVAR(metal) = 8000; GVAR(charge) = 2400; GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class M_Air_AA: MissileBase { GVAR(skip) = 1; @@ -205,7 +205,7 @@ class CfgAmmo { GVAR(metal) = 36000; GVAR(charge) = 9979; GVAR(gurney_c) = 2440; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class Sh_82mm_AMOS: Sh_155mm_AMOS { // Source: http://www.arsenal-bg.com/defense_police/mortar_bombs_82mm.htm @@ -215,7 +215,7 @@ class CfgAmmo { GVAR(metal) = 3200; GVAR(charge) = 420; GVAR(gurney_c) = 2440; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class ModuleOrdnanceMortar_F_Ammo: Sh_82mm_AMOS { GVAR(enabled) = 1; @@ -224,7 +224,7 @@ class CfgAmmo { GVAR(metal) = 800; GVAR(charge) = 4200; GVAR(gurney_c) = 2320; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class Sh_105mm_HEAT_MP: Sh_125mm_HEAT { GVAR(enabled) = 1; @@ -233,7 +233,7 @@ class CfgAmmo { GVAR(metal) = 11400; GVAR(charge) = 7100; GVAR(gurney_c) = 2800; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class Sh_120mm_HE: ShellBase { GVAR(enabled) = 1; @@ -242,7 +242,7 @@ class CfgAmmo { GVAR(metal) = 23000; GVAR(charge) = 3148; GVAR(gurney_c) = 2830; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class Sh_125mm_HE: Sh_120mm_HE { GVAR(enabled) = 1; @@ -251,7 +251,7 @@ class CfgAmmo { GVAR(metal) = 16000; GVAR(charge) = 3200; GVAR(gurney_c) = 2440; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class ModuleOrdnanceHowitzer_F_ammo: Sh_155mm_AMOS { GVAR(enabled) = 1; @@ -260,12 +260,13 @@ class CfgAmmo { GVAR(metal) = 1950; GVAR(charge) = 15800; GVAR(gurney_c) = 2320; - GVAR(gurney_k) = 1/2; + GVAR(gurney_k) = "1/2"; }; class B_65x39_Caseless; class GVAR(base): B_65x39_Caseless { + ACE_damageType = "grenade"; // compatibility with medical_damage, shrapnel should produce grenade wounds timeToLive = 12; typicalSpeed = 1500; deflecting = 65; @@ -279,29 +280,29 @@ class CfgAmmo { class GVAR(tiny_HD): GVAR(base) { hit = 6; - airFriction = BASE_DRAG_HD; + airFriction = QUOTE(BASE_DRAG_HD); caliber = 0.75; }; class GVAR(small): GVAR(base) { hit = 12; - airFriction = BASE_DRAG*0.9; + airFriction = QUOTE(BASE_DRAG*0.9); }; class GVAR(small_HD): GVAR(base) { hit = 12; - airFriction = BASE_DRAG_HD*0.9; + airFriction = QUOTE(BASE_DRAG_HD*0.9); }; class GVAR(medium): GVAR(base) { hit = 14; - airFriction = BASE_DRAG*0.75; + airFriction = QUOTE(BASE_DRAG*0.75); caliber = 1.2; }; class GVAR(medium_HD): GVAR(base) { hit = 14; - airFriction = BASE_DRAG_HD*0.75; + airFriction = QUOTE(BASE_DRAG_HD*0.75); caliber = 1.2; }; @@ -309,7 +310,7 @@ class CfgAmmo { hit = 28; indirectHit = 2; indirectHitRange = 0.25; - airFriction = BASE_DRAG*0.65; + airFriction = QUOTE(BASE_DRAG*0.65); caliber = 2; explosive = 0; @@ -319,7 +320,7 @@ class CfgAmmo { hit = 28; indirectHit = 2; indirectHitRange = 0.25; - airFriction = BASE_DRAG_HD*0.65; + airFriction = QUOTE(BASE_DRAG_HD*0.65); caliber = 2; }; @@ -327,7 +328,7 @@ class CfgAmmo { hit = 40; indirectHit = 4; indirectHitRange = 0.5; - airFriction = BASE_DRAG*0.5; + airFriction = QUOTE(BASE_DRAG*0.5); caliber = 2.8; }; @@ -335,7 +336,7 @@ class CfgAmmo { hit = 40; indirectHit = 4; indirectHitRange = 0.5; - airFriction = BASE_DRAG_HD*0.5; + airFriction = QUOTE(BASE_DRAG_HD*0.5); caliber = 2.8; }; diff --git a/addons/frag/CfgAmmoReflections.hpp b/addons/frag/CfgAmmoReflections.hpp index 41bd0d5c31..a6183eaa7b 100644 --- a/addons/frag/CfgAmmoReflections.hpp +++ b/addons/frag/CfgAmmoReflections.hpp @@ -2,8 +2,8 @@ class ace_explosion_reflection_##range##_##hit: ace_explosion_reflection_base {\ indirectHitRange = range;\ indirectHit = hit;\ - dangerRadiusHit = range*3;\ - suppressionRadiusHit = range*2;\ + dangerRadiusHit = QUOTE(range*3);\ + suppressionRadiusHit = QUOTE(range*2);\ } #define ACE_EXPLOSION_RANGE(range)\ diff --git a/addons/frag/functions/fnc_addBlackList.sqf b/addons/frag/functions/fnc_addBlackList.sqf index 71452b9814..d0cc127d05 100644 --- a/addons/frag/functions/fnc_addBlackList.sqf +++ b/addons/frag/functions/fnc_addBlackList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jaynus, NouberNou * Adds a round to the blacklist (will be ignored). diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf index 35b927e687..7c2b5d1681 100644 --- a/addons/frag/functions/fnc_addPfhRound.sqf +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jaynus, NouberNou * Starts tracking a round that will frag. @@ -60,7 +60,7 @@ if (alive _round) then { private _spallTrackID = []; private _args = [ - _round, getPosASL _round, velocity _round, _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, + _round, getPosASL _round, velocity _round, _type, diag_frameno, getPosASL _round, _doSpall, _spallTrack, _spallTrackID, getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)), getNumber (configFile >> "CfgAmmo" >> _type >> "explosive"), getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"), diff --git a/addons/frag/functions/fnc_dev_addTrack.sqf b/addons/frag/functions/fnc_dev_addTrack.sqf index ce459008f6..db32be0d5f 100644 --- a/addons/frag/functions/fnc_dev_addTrack.sqf +++ b/addons/frag/functions/fnc_dev_addTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/frag/functions/fnc_dev_debugAmmo.sqf b/addons/frag/functions/fnc_dev_debugAmmo.sqf index 42debf3d61..42a4aa6314 100644 --- a/addons/frag/functions/fnc_dev_debugAmmo.sqf +++ b/addons/frag/functions/fnc_dev_debugAmmo.sqf @@ -1,5 +1,5 @@ #define DEBUG_MODE_FULL -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/frag/functions/fnc_dev_drawTraces.sqf b/addons/frag/functions/fnc_dev_drawTraces.sqf index 76e729ed7f..b05f8c2c9d 100644 --- a/addons/frag/functions/fnc_dev_drawTraces.sqf +++ b/addons/frag/functions/fnc_dev_drawTraces.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/frag/functions/fnc_dev_startTracing.sqf b/addons/frag/functions/fnc_dev_startTracing.sqf index d709255a73..897dde3011 100644 --- a/addons/frag/functions/fnc_dev_startTracing.sqf +++ b/addons/frag/functions/fnc_dev_startTracing.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/frag/functions/fnc_dev_stopTracing.sqf b/addons/frag/functions/fnc_dev_stopTracing.sqf index 75cf38b6d9..f9b29ab8a8 100644 --- a/addons/frag/functions/fnc_dev_stopTracing.sqf +++ b/addons/frag/functions/fnc_dev_stopTracing.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Dev things diff --git a/addons/frag/functions/fnc_dev_trackTrace.sqf b/addons/frag/functions/fnc_dev_trackTrace.sqf index 5d8ee3dee0..6c010bdb63 100644 --- a/addons/frag/functions/fnc_dev_trackTrace.sqf +++ b/addons/frag/functions/fnc_dev_trackTrace.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Dev things diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf index 1f5c37597a..a5a687aa53 100644 --- a/addons/frag/functions/fnc_doExplosions.sqf +++ b/addons/frag/functions/fnc_doExplosions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/frag/functions/fnc_doReflections.sqf b/addons/frag/functions/fnc_doReflections.sqf index 7b16385d75..023a283e81 100644 --- a/addons/frag/functions/fnc_doReflections.sqf +++ b/addons/frag/functions/fnc_doReflections.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Dev things diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index eb97875570..8b5a06d812 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Dev things diff --git a/addons/frag/functions/fnc_findReflections.sqf b/addons/frag/functions/fnc_findReflections.sqf index af7155984d..b0ae161597 100644 --- a/addons/frag/functions/fnc_findReflections.sqf +++ b/addons/frag/functions/fnc_findReflections.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf index a61a2d14c7..355da901c6 100644 --- a/addons/frag/functions/fnc_fired.sqf +++ b/addons/frag/functions/fnc_fired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: nou, jaynus, PabstMirror * Called from the unified fired EH for all. diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index a2744d60fd..f2700654c3 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jaynus, NouberNou * Server func to create the fragmentation for a round. diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf index 06baaad17f..6e75e80951 100644 --- a/addons/frag/functions/fnc_masterPFH.sqf +++ b/addons/frag/functions/fnc_masterPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Master single PFH abstraction for all rounds being tracked by frag/spall. diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf index 4d5e9b2e99..bd5a229f0e 100644 --- a/addons/frag/functions/fnc_pfhRound.sqf +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * @@ -15,7 +15,7 @@ * Public: No */ -params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_gun", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_firedPos", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; if (_round in GVAR(blackList)) exitWith { false @@ -26,13 +26,10 @@ if (!alive _round) exitWith { if (_skip == 0) then { if ((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1}) then { // shotbullet, shotShell don't seem to explode when touching water, so don't create frags - if (((_lastPos select 2) < 0) && {(toLower getText (configFile >> "CfgAmmo" >> _shellType >> "simulation")) in ["shotbullet", "shotshell"]}) exitWith {}; - private _isArmed = true; - if (!isNil "_gun") then { - private _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); - _isArmed = ((getPosASL _gun) distance _lastPos > _fuseDist); - TRACE_2("",_fuseDist,_isArmed); - }; + if ((surfaceIsWater _lastPos) && {(toLower getText (configFile >> "CfgAmmo" >> _shellType >> "simulation")) in ["shotbullet", "shotshell"]}) exitWith {}; + private _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); + private _isArmed = _firedPos vectorDistance _lastPos >= _fuseDist; // rounds explode at exactly fuseDistance, so check inclusive + TRACE_2("",_fuseDist,_isArmed); if (!_isArmed) exitWith {TRACE_1("round not armed",_this);}; TRACE_3("Sending frag event to server",_lastPos,_lastVel,_shellType); [QGVAR(frag_eh), [_lastPos,_lastVel,_shellType]] call CBA_fnc_serverEvent; diff --git a/addons/frag/functions/fnc_spallHP.sqf b/addons/frag/functions/fnc_spallHP.sqf index 9a1e144f44..367bea7644 100644 --- a/addons/frag/functions/fnc_spallHP.sqf +++ b/addons/frag/functions/fnc_spallHP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Handles the HitPart event diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index 5d08dcc718..43dae8afcb 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Add HitPart EventHandler to objects in the projectile's path diff --git a/addons/frag/functions/script_component.hpp b/addons/frag/functions/script_component.hpp deleted file mode 100644 index 0903b3ba1e..0000000000 --- a/addons/frag/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\frag\script_component.hpp" diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 34a755f87e..1ece6a973e 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -13,8 +13,8 @@ Симуляция осколков Simulazione Frammentazione 破片シミュレーション - 조각 시뮬레이션 - 模拟碎片 + 파편화 시뮬레이션 + 破片模拟 模擬碎片 @@ -29,8 +29,8 @@ Симуляция осколков Simulazione Frammentazione 破片シミュレーション - 조각 시뮬레이션 - 模拟碎片 + 파편화 시뮬레이션 + 破片模拟 模擬碎片 @@ -45,8 +45,8 @@ Включить симуляцию осколков ACE Abilita la Simulazione Frammentazione di ACE ACE 破片シミュレーションを有効化 - ACE 조각 시뮬레이션을 적용합니다. - 启用ACE模拟碎片 + ACE 파편화 시뮬레이션을 적용합니다. + 启用 ACE 破片模拟 啟用ACE模擬碎片 @@ -61,7 +61,7 @@ Симуляция обломков Simulazione Spalling 剥離シミュレーション - 파편 시뮬레이션 + 탄환파편 시뮬레이션 模拟剥落 模擬剝落 @@ -77,8 +77,8 @@ Включить симуляцию обломков ACE Abilita la Simulazione Spalling di ACE ACE 剥離シミュレーションを有効化 - ACE 파편 시뮬레이션을 적용합니다. - 启用ACE模拟剥落 + ACE 탄환파편 시뮬레이션을 적용합니다. + 启用 ACE 模拟剥落 啟用ACE模擬剝落 @@ -107,7 +107,7 @@ Включить симуляцию отражения взрывов ACE 爆発による飛翔シミュレーションを有効化 ACE 폭발 반사 시뮬레이션을 적용합니다. - 启用ACE模拟爆炸反射 + 启用 ACE 模拟爆炸反射 啟用ACE模擬爆炸反射 Povolit ACE simulaci odrazu exploze @@ -124,7 +124,7 @@ Numero massimo di Proiettili Tracciati 最大弾頭追跡数 최대 발사체 추적수 - 最大碎片粒子追踪数量 + 最大破片粒子追踪数量 最大碎片/剝落粒子追蹤數量 @@ -139,8 +139,8 @@ Эта настройка контролирует максимальное количество снарядов, которок отслеживает система осколков и обломков в каждый момент времени. Снаряды, выстреленные сверх этого числа, отслеживаться не будут. Уменьшите это значение, если вы не хотите падения 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) 時間が許すかぎり、破片と剥離システムの最大数を設定できます。設定数以上の弾丸が発射された場合、それは対象になりません。もし多い弾数による FPS の低下を望まない場合は、低い数へ設定にします。( &gt;一度に空中内で200発) - 이 설정은 조각 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하) - 设定在指定时间内,系统最大可追踪的碎片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( >一次200颗粒子) + 이 설정은 탄환파편 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올 경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하) + 设定在指定时间内,系统最大可追踪的破片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( >一次200颗粒子) 設定在指定時間內,系統最大可追蹤的碎片/剝落粒子數量。如有更多的碎片在這之後產生,這些粒子將不會被追蹤。如果你想要維持好的幀數,此設定勿調的過高。( >一次200顆粒子) @@ -155,8 +155,8 @@ Макс. количество снарядов за кадр Numero massimo di proiettili per Frame フレームごとの最大弾頭数 - 프레임당 최대 발사체 수 - 每一帧数(FPS)最大碎片粒子数量 + 프레임 당 최대 발사체 수 + 每帧最大破片粒子数量 每一幀數(FPS)最大碎片/剝落粒子數量 @@ -172,7 +172,7 @@ 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. 与えられたフレームごとに追跡する剥離の数を決定します。FPS に影響をあたえないよう、剥離を複数のフレームで追跡し、分散させています。 가능한 프레임마다 파편을 추적 및 계산합니다. 여러 프레임에 걸쳐 파편난 발사체를 추적하여 FPS에 도움을 줍니다. 이를 제한함으로써 더욱 큰 효과를 볼 수 있습니다. - 设定在每一帧数内,系统最大可追踪的碎片粒子数量。此设定可有效帮助系统减低计算压力。 + 设定在每一帧数内,系统最大可追踪的破片粒子数量。此设定可有效帮助系统减低计算压力。 設定在每一幀數內,系統最大可追蹤的碎片/剝落粒子數量。此設定可有效幫助系統減低計算壓力 @@ -187,8 +187,8 @@ (Только для одиночной игры) Отслеживаение/отладка осколков (Solo SP) Debug Tracciamento Frag/Spall (SP のみ) 破片/剥離のデバッグ用表示 - (싱글플레이 전용) 조각/파편 디버그 추적화 - (仅在单人模式) 追踪显示碎片粒子 + (싱글플레이 전용) 탄환파편/파편 디버그 추적화 + (仅单人)追踪显示破片粒子 (僅在單人模式) 碎片/剝落除錯追蹤 @@ -203,9 +203,9 @@ (Только для одиночной игры) Требует перезапуска миссии/редактора. Включает визуальные следы от осколков и обломков в режиме одиночной игры. (Solo SP) Richiede un restart editor/missione. Abilita il tracciamento visivo di schegge da frammentazione/spalling in modalità Giocatore Singolo. (SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の弾頭が見えるようになります。 - (仅在单人模式) 激活后,只有在单人模式下才可观察到碎片粒子的移动轨迹。 + (仅单人)激活后,只有在单人模式下才可观察到破片粒子的移动轨迹。 (僅在單人模式) 讓你在單人模式下可觀察到碎片/剝落粒子的移動軌跡 - (SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 조각화 및 스 폴링 라운드의 시각적 추적을 가능하게합니다. + (SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 파편화 및 탄환파편의 시각적 추적을 가능하게 합니다. diff --git a/addons/gestures/anim/zDummy.rtm b/addons/gestures/anim/zDummy.rtm new file mode 100644 index 0000000000..dfeb7b7fcc Binary files /dev/null and b/addons/gestures/anim/zDummy.rtm differ diff --git a/addons/gestures/functions/fnc_playSignal.sqf b/addons/gestures/functions/fnc_playSignal.sqf index 3dcae0d2e3..b6d9f9602a 100644 --- a/addons/gestures/functions/fnc_playSignal.sqf +++ b/addons/gestures/functions/fnc_playSignal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas, Emperias, Zigomarvin * Detect if the player and play the Gesture Animation diff --git a/addons/gestures/functions/script_component.hpp b/addons/gestures/functions/script_component.hpp deleted file mode 100644 index 53f6849ebc..0000000000 --- a/addons/gestures/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\gestures\script_component.hpp" diff --git a/addons/gestures/stringtable.xml b/addons/gestures/stringtable.xml index a9db468cdb..8d77e28a83 100644 --- a/addons/gestures/stringtable.xml +++ b/addons/gestures/stringtable.xml @@ -98,7 +98,7 @@ Seguir Seguire ついて来い - 따라올것 + 따라와 跟进 跟進 Takip Et @@ -230,7 +230,7 @@ Ingaggiare Atacar 交戦しろ - 교전할것 + 교전 交战 交戰 Tut @@ -295,7 +295,7 @@ Показать жесты в меню взаимодействия インタラクション メニュー上でジェスチャー表示 수신호를 상호작용 메뉴에서 보여줍니다 - 显示手势互动选单 + 显示手势互动菜单 顯示手勢互動選單 Hareketleri Etkileşim Menüsünde Göster @@ -311,7 +311,7 @@ Показать жесты в меню взамиодейтсвия с собой или только использовать горячие клавиши, или полностью отключить キー操作や同時使用を無効化している場合はセルフ インタラクション メニュ上でジェスチャーを表示します 수신호를 상호작용 메뉴에서 보여주거나 혹은 단축키를 지정하거나 아니면 아예 사용하지 않습니다. - 显示手势选项在自己的互动选单上,或只利用键盘来使用手势,或完全禁用 + 显示手势选项在自己的互动菜单上,或只利用键盘来使用手势,或完全禁用 顯示手勢選項在自己的互動選單上,或只利用鍵盤來使用手勢,或完全禁用 Kendi kendine etkileşim menüsünde hareketleri göster veya sadece tuş atamaları kullan veya tamamen devre dışı bırak. @@ -342,8 +342,8 @@ Atalhos + Menu de Interação Клавиши + Меню взаимодействия キー操作とインタラクション メニュ - 단축키및 상호작용 메뉴 - 键盘 + 互动选单 + 단축키 및 상호작용 메뉴 + 键盘 + 互动菜单 鍵盤 + 互動選單 Tuş Atamaları + Etkileşim Menüsü diff --git a/addons/gforces/ACE_Arsenal_Stats.hpp b/addons/gforces/ACE_Arsenal_Stats.hpp index 4148ba5fe2..372f5af782 100644 --- a/addons/gforces/ACE_Arsenal_Stats.hpp +++ b/addons/gforces/ACE_Arsenal_Stats.hpp @@ -2,7 +2,7 @@ class EGVAR(arsenal,stats) { class statBase; class ACE_gReduction: statBase { scope = 2; - priority = 1; + priority = 1.7; stats[] = {"ACE_GForceCoef"}; displayName = CSTRING(statGReduction); showBar = 1; diff --git a/addons/gforces/CfgWeapons.hpp b/addons/gforces/CfgWeapons.hpp index 94dbc71c0e..35b0ec9792 100644 --- a/addons/gforces/CfgWeapons.hpp +++ b/addons/gforces/CfgWeapons.hpp @@ -22,4 +22,4 @@ class CfgWeapons { class U_I_E_Uniform_01_coveralls_F: Uniform_Base { ACE_GForceCoef = 0.8; }; -}; \ No newline at end of file +}; diff --git a/addons/gforces/functions/fnc_addPFEH.sqf b/addons/gforces/functions/fnc_addPFEH.sqf index 55dd8dcd12..b93bb0ab6d 100644 --- a/addons/gforces/functions/fnc_addPFEH.sqf +++ b/addons/gforces/functions/fnc_addPFEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi and esteldunedain * Adds the PFEH diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index 77f144e2f7..13d08f833b 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi and esteldunedain * Calculates average g-forces and triggers g-effects @@ -61,7 +61,7 @@ if (_count > 0) then { }; private _classCoef = (ACE_player getVariable ["ACE_GForceCoef", - getNumber (configFile >> "CfgVehicles" >> (typeOf ACE_player) >> "ACE_GForceCoef")]) max 0.001; + getNumber ((configOf ACE_player) >> "ACE_GForceCoef")]) max 0.001; private _suitCoef = if ((uniform ACE_player) != "") then { (getNumber (configFile >> "CfgWeapons" >> (uniform ACE_player) >> "ACE_GForceCoef")) max 0.001 } else { @@ -71,7 +71,7 @@ private _suitCoef = if ((uniform ACE_player) != "") then { private _gBlackOut = MAXVIRTUALG / _classCoef + MAXVIRTUALG / _suitCoef - MAXVIRTUALG; // Unconsciousness -if ((_average > _gBlackOut) and {isClass (configFile >> "CfgPatches" >> "ACE_Medical") and {!(ACE_player getVariable ["ACE_isUnconscious", false])}}) then { +if ((_average > _gBlackOut) && {["ACE_Medical"] call EFUNC(common,isModLoaded) && {!(ACE_player getVariable ["ACE_isUnconscious", false])}}) then { [ACE_player, true, (10 + floor(random 5)), true] call EFUNC(medical,setUnconscious); }; diff --git a/addons/gforces/functions/script_component.hpp b/addons/gforces/functions/script_component.hpp deleted file mode 100644 index 4d0ee63e05..0000000000 --- a/addons/gforces/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\gforces\script_component.hpp" \ No newline at end of file diff --git a/addons/gforces/stringtable.xml b/addons/gforces/stringtable.xml index b2344067de..524e456899 100644 --- a/addons/gforces/stringtable.xml +++ b/addons/gforces/stringtable.xml @@ -9,6 +9,9 @@ ACE G フォース ACE G-Kuvveti ACE Fuerza G + ACE G-Kräfte + ACE G力 + ACE 중력가속도 Gforces Effects @@ -33,12 +36,12 @@ Pouze letadla Somente Aeronave Avions seulement - Только для летательных аппаратов + Только авиация 航空機のみ Tylko samoloty 비행기에만 적용 Solo Aerei - 只有战斗机 + 仅飞行器 只有戰鬥機 Sadece Uçaklar @@ -56,15 +59,19 @@ Redukce G Force Reducción de fuerzas G G-Kuvvetinde azalma + 중력가속도 감소 G-Force Coefficient Współczynnk przeciążenia Coefficient de force gravitationnelle - Коэффициент перегрузки + Коэф. перегрузки G 効果係数 G-Kuvvet Katsayısı Coeficiente de Fuerza G + G-Kräfte-Koeffizient + G力系数 + 중력가속도 계수 Controls strength of G-Force affecting players. @@ -74,6 +81,9 @@ G 効果がプレイヤーに与える影響量を設定できます。 Oyuncuları etkileyen G-Force'un gücünü kontrol eder. Controla la intensidad de fuerza G que afecta a los jugadores. + Bestimmt, wie stark G-Kräfte Spieler beeinflussen. + 控制影响玩家的G力的强度。 + 플레이어에게 영향을 끼칠 중력가속도의 계수를 조절합니다. diff --git a/addons/goggles/anim/zDummy.rtm b/addons/goggles/anim/zDummy.rtm new file mode 100644 index 0000000000..dfeb7b7fcc Binary files /dev/null and b/addons/goggles/anim/zDummy.rtm differ diff --git a/addons/goggles/config.cpp b/addons/goggles/config.cpp index 4718662e62..f39ab4d458 100644 --- a/addons/goggles/config.cpp +++ b/addons/goggles/config.cpp @@ -58,13 +58,13 @@ class CfgGlasses { }; class G_Lowprofile: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 2; ACE_Protection = 1; }; class G_Shades_Black: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; }; @@ -92,7 +92,7 @@ class CfgGlasses { }; class G_Spectacles_Tinted: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; }; @@ -109,22 +109,22 @@ class CfgGlasses { }; class G_Sport_Blackyellow: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; }; class G_Sport_Checkered: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; }; class G_Sport_Greenblack: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; }; class G_Sport_Red: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Color[] = {0,0,0}; ACE_Resistance = 1; }; @@ -170,7 +170,7 @@ class CfgGlasses { }; class G_Lady_Dark: None { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; }; @@ -186,7 +186,7 @@ class CfgGlasses { }; class G_Balaclava_lowprofile: G_Balaclava_blk { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 2; ACE_Protection = 1; }; @@ -203,7 +203,7 @@ class CfgGlasses { class G_Bandanna_blk; class G_Bandanna_shades: G_Bandanna_blk { - ACE_TintAmount=COLOUR*2; + ACE_TintAmount=QUOTE(COLOUR*2); ACE_Resistance = 1; ACE_Protection = 1; }; @@ -235,12 +235,15 @@ class CfgGlasses { ACE_OverlayCracked = ""; ACE_Resistance = 2; ACE_Protection = 1; + ACE_Overlay_Angle = 180; }; class G_AirPurifyingRespirator_02_base_F: G_AirPurifyingRespirator_01_base_F { ACE_Overlay = "a3\ui_f_enoch\data\objects\data\optics_APR_02_CA.paa"; }; class G_RegulatorMask_base_F: None { ACE_Overlay = "a3\ui_f_enoch\data\objects\data\optics_regulator_ca.paa"; + ACE_OverlayCracked = ""; + ACE_Overlay_Angle = 180; }; }; diff --git a/addons/goggles/define.hpp b/addons/goggles/define.hpp index 38271ccc67..81d3fcb689 100644 --- a/addons/goggles/define.hpp +++ b/addons/goggles/define.hpp @@ -18,8 +18,8 @@ class RscPicture { fixedWidth = 0; shadow = 0; text = ""; - x = safezoneX; - y = safezoneY; - w = safezoneW; - h = safezoneH; + x = "safezoneX"; + y = "safezoneY"; + w = "safezoneW"; + h = "safezoneH"; }; diff --git a/addons/goggles/functions/fnc_applyDirtEffect.sqf b/addons/goggles/functions/fnc_applyDirtEffect.sqf index df73bd5bec..94a119f946 100644 --- a/addons/goggles/functions/fnc_applyDirtEffect.sqf +++ b/addons/goggles/functions/fnc_applyDirtEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Adds dirt effect to the glasses. diff --git a/addons/goggles/functions/fnc_applyDustEffect.sqf b/addons/goggles/functions/fnc_applyDustEffect.sqf index d8c6e1c07a..3766c664e5 100644 --- a/addons/goggles/functions/fnc_applyDustEffect.sqf +++ b/addons/goggles/functions/fnc_applyDustEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Applies dust to screen. diff --git a/addons/goggles/functions/fnc_applyGlassesEffect.sqf b/addons/goggles/functions/fnc_applyGlassesEffect.sqf index 4c0b8dd1df..9cc1c830c6 100644 --- a/addons/goggles/functions/fnc_applyGlassesEffect.sqf +++ b/addons/goggles/functions/fnc_applyGlassesEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Sets screen tint for glasses. @@ -44,10 +44,16 @@ if (_postProcessTintAmount != 0 && {GVAR(UsePP)} && GVAR(effects) in [1, 2]) the }; private _imagePath = getText (_config >> ["ACE_Overlay", "ACE_OverlayCracked"] select GETBROKEN); +private _angle = getNumber (_config >> "ACE_Overlay_Angle"); if (_imagePath != "") then { GVAR(GogglesLayer) cutRsc ["RscACE_Goggles", "PLAIN", 1, false]; - (GLASSDISPLAY displayCtrl 10650) ctrlSetText _imagePath; + private _overlay = (GLASSDISPLAY displayCtrl 10650); + _overlay ctrlSetText _imagePath; + + if ((_angle != 0) && {((ctrlAngle _overlay) # 0) != _angle}) then { + _overlay ctrlSetAngle [_angle, 0.5, 0.5, true]; + }; }; if (GVAR(effects) in [2, 3]) then { diff --git a/addons/goggles/functions/fnc_applyRainEffect.sqf b/addons/goggles/functions/fnc_applyRainEffect.sqf index 845490f95f..3332db536a 100644 --- a/addons/goggles/functions/fnc_applyRainEffect.sqf +++ b/addons/goggles/functions/fnc_applyRainEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Handles rain effects being created on glasses. diff --git a/addons/goggles/functions/fnc_applyRotorWashEffect.sqf b/addons/goggles/functions/fnc_applyRotorWashEffect.sqf index ab71f01d51..3513eb191a 100644 --- a/addons/goggles/functions/fnc_applyRotorWashEffect.sqf +++ b/addons/goggles/functions/fnc_applyRotorWashEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, commy2 * Handles the rotor wash effects. diff --git a/addons/goggles/functions/fnc_canWipeGlasses.sqf b/addons/goggles/functions/fnc_canWipeGlasses.sqf index 4eaaf569d1..ef9d961bc1 100644 --- a/addons/goggles/functions/fnc_canWipeGlasses.sqf +++ b/addons/goggles/functions/fnc_canWipeGlasses.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Checks if player can wipe goggles. diff --git a/addons/goggles/functions/fnc_clearGlasses.sqf b/addons/goggles/functions/fnc_clearGlasses.sqf index 5efc547c10..f00ad4629c 100644 --- a/addons/goggles/functions/fnc_clearGlasses.sqf +++ b/addons/goggles/functions/fnc_clearGlasses.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Clears all dirt, rain, dust from glasses. diff --git a/addons/goggles/functions/fnc_externalCamera.sqf b/addons/goggles/functions/fnc_externalCamera.sqf index 0cd06fdcd6..4afafa3a5a 100644 --- a/addons/goggles/functions/fnc_externalCamera.sqf +++ b/addons/goggles/functions/fnc_externalCamera.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Returns if the camera is external or not. diff --git a/addons/goggles/functions/fnc_getExplosionIndex.sqf b/addons/goggles/functions/fnc_getExplosionIndex.sqf index 33f0668bef..1007085d5a 100644 --- a/addons/goggles/functions/fnc_getExplosionIndex.sqf +++ b/addons/goggles/functions/fnc_getExplosionIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, commy2 * Turns 0-1 damage of explosion Event into a rating system of 0-3 diff --git a/addons/goggles/functions/fnc_handleExplosion.sqf b/addons/goggles/functions/fnc_handleExplosion.sqf index db38e9ab20..0d1b88d7ba 100644 --- a/addons/goggles/functions/fnc_handleExplosion.sqf +++ b/addons/goggles/functions/fnc_handleExplosion.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, commy2 * Handles explosions. diff --git a/addons/goggles/functions/fnc_handleFired.sqf b/addons/goggles/functions/fnc_handleFired.sqf index 434a61ee5f..ea3455dcee 100644 --- a/addons/goggles/functions/fnc_handleFired.sqf +++ b/addons/goggles/functions/fnc_handleFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, commy2 * Determines whether to place dust on the goggles, based on calibre of weapon fired and other requirements. Called from the unified fired EH only for the local player. diff --git a/addons/goggles/functions/fnc_handleKilled.sqf b/addons/goggles/functions/fnc_handleKilled.sqf index 5309976160..ebf9657ba9 100644 --- a/addons/goggles/functions/fnc_handleKilled.sqf +++ b/addons/goggles/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, commy2 * Handles the player dying. diff --git a/addons/goggles/functions/fnc_isDivingGoggles.sqf b/addons/goggles/functions/fnc_isDivingGoggles.sqf index cc173f6dc3..2595142e83 100644 --- a/addons/goggles/functions/fnc_isDivingGoggles.sqf +++ b/addons/goggles/functions/fnc_isDivingGoggles.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Determines whether passed goggles is diving goggles or a variant of them. diff --git a/addons/goggles/functions/fnc_isGogglesVisible.sqf b/addons/goggles/functions/fnc_isGogglesVisible.sqf index 3ad5085a57..d52134b298 100644 --- a/addons/goggles/functions/fnc_isGogglesVisible.sqf +++ b/addons/goggles/functions/fnc_isGogglesVisible.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Determines if goggles are visible on passed unit. diff --git a/addons/goggles/functions/fnc_isInRotorWash.sqf b/addons/goggles/functions/fnc_isInRotorWash.sqf index d978cde0ce..8c3b29723d 100644 --- a/addons/goggles/functions/fnc_isInRotorWash.sqf +++ b/addons/goggles/functions/fnc_isInRotorWash.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, commy2 * Checks for nearby running helicopters (within 15m) @@ -9,8 +9,8 @@ * * Return Value: * Array : - * 0: In rotorwash - * 1: Amount of rotor wash. + * - 0: In rotorwash + * - 1: Amount of rotor wash. * * Example: * if ([ace_player, 10] call ace_goggles_fnc_isInRotorWash select 0) then { hint "Rotor wash"; }; diff --git a/addons/goggles/functions/fnc_removeDirtEffect.sqf b/addons/goggles/functions/fnc_removeDirtEffect.sqf index 732cbb5c23..eff8e102ab 100644 --- a/addons/goggles/functions/fnc_removeDirtEffect.sqf +++ b/addons/goggles/functions/fnc_removeDirtEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Removes dirt from the glasses. diff --git a/addons/goggles/functions/fnc_removeDustEffect.sqf b/addons/goggles/functions/fnc_removeDustEffect.sqf index 00031084b2..8d424662d9 100644 --- a/addons/goggles/functions/fnc_removeDustEffect.sqf +++ b/addons/goggles/functions/fnc_removeDustEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Removes dust from the glasses. diff --git a/addons/goggles/functions/fnc_removeGlassesEffect.sqf b/addons/goggles/functions/fnc_removeGlassesEffect.sqf index bebbb64aec..ea6286187b 100644 --- a/addons/goggles/functions/fnc_removeGlassesEffect.sqf +++ b/addons/goggles/functions/fnc_removeGlassesEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Removes the glasses effect from the screen, removes dirt effect, removes rain effect, removes dust effect. Does not reset array (glasses will still be broken, dirty, ect.) diff --git a/addons/goggles/functions/fnc_removeRainEffect.sqf b/addons/goggles/functions/fnc_removeRainEffect.sqf index 53de0721b1..b5140566c3 100644 --- a/addons/goggles/functions/fnc_removeRainEffect.sqf +++ b/addons/goggles/functions/fnc_removeRainEffect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Removes rain effects from the screen. diff --git a/addons/goggles/functions/script_component.hpp b/addons/goggles/functions/script_component.hpp deleted file mode 100644 index d8624df3b2..0000000000 --- a/addons/goggles/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\goggles\script_component.hpp" diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index 8d5005660e..2fb6c6e54b 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -39,13 +39,13 @@ Mostrar efectos de las gafas en tercera persona Zobrazit efekt brýlí v třetí osobě Effets des lunettes à la 3ème personne - Отображать эффект очков от третьего лица + Вкл. эффект очков от 3-го лица 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인칭시에도 고글 효과를 보이게 합니다 + 3인칭 시에도 고글 효과를 보이게 합니다 在第三人称视角显示护目镜效果 在第三人稱視角顯示護目鏡效果 Gözlük efektlerini 3. şahıs görünümün de göster @@ -92,7 +92,7 @@ 색조 Teinte Colore - 染色 + 着色 染色 Cor Zabarvení @@ -124,7 +124,7 @@ 색조+효과 Teinte + effets Colore + Effetti - 染色 + 影响 + 着色 + 效果 染色 + 影響 Cor + Efeitos Zabarvení + Efekty @@ -139,11 +139,13 @@ 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/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf b/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf index 99a28d91f4..d778ca3349 100644 --- a/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf +++ b/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Cyruz * Allows conversion of explosive charges in to throwable versions diff --git a/addons/grenades/functions/fnc_flare.sqf b/addons/grenades/functions/fnc_flare.sqf index 9ad3348f6b..8214a5600d 100644 --- a/addons/grenades/functions/fnc_flare.sqf +++ b/addons/grenades/functions/fnc_flare.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Makes flare shine. diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 07b74b7bcc..cc87f492d7 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Creates the flashbang effect and knock out AI units. @@ -47,28 +47,42 @@ private _affected = (ASLtoAGL _grenadePosASL) nearEntities ["CAManBase", 20]; _affected = _affected - [ACE_player]; { if (local _x && {alive _x}) then { - private _strength = 1 - (((eyePos _x) vectorDistance _grenadePosASL) min 20) / 20; + private _unit = _x; + private _strength = 1 - (((eyePos _unit) vectorDistance _grenadePosASL) min 20) / 20; - TRACE_3("FlashBangEffect Start",_x,((getPosASL _x) vectorDistance _grenadePosASL),_strength); + TRACE_3("FlashBangEffect Start",_unit,((getPosASL _unit) vectorDistance _grenadePosASL),_strength); - [_x, true] call EFUNC(common,disableAI); - - _x setSkill (skill _x / 50); + [_unit, true] call EFUNC(common,disableAI); // Make AI try to look away - private _dirToFlash = _x getDir _grenadePosASL; - _x setDir (_dirToFlash + linearConversion [0.2, 1, _strength, 40, 135] * selectRandom [-1, 1]); + private _dirToFlash = _unit getDir _grenadePosASL; + _unit setDir (_dirToFlash + linearConversion [0.2, 1, _strength, 40, 135] * selectRandom [-1, 1]); - [{ - params ["_unit"]; + private _flashReactionDebounce = _unit getVariable [QGVAR(flashReactionDebounce), 0]; + _unit setVariable [QGVAR(flashReactionDebounce), _flashReactionDebounce max (CBA_missionTime + (7 * _strength))]; + if (_flashReactionDebounce < CBA_missionTime) then { + // Not used interally but could be useful for other mods + _unit setVariable [QGVAR(flashStrength), _strength, true]; + { + _unit setSkill [_x, (_unit skill _x) / 50]; + } forEach SUBSKILLS; + [{ + params ["_unit"]; + CBA_missiontime >= _unit getVariable [QGVAR(flashReactionDebounce), 0] + },{ + params ["_unit"]; - //Make sure we don't enable AI for unconscious units - if !(_unit getVariable ["ace_isUnconscious", false]) then { - [_unit, false] call EFUNC(common,disableAI); - }; + _unit setVariable [QGVAR(flashStrength), 0, true]; - _unit setSkill (skill _unit * 50); - }, [_x], 7 * _strength] call CBA_fnc_waitAndExecute; + // Make sure we don't enable AI for unconscious units + if !(_unit getVariable ["ace_isUnconscious", false]) then { + [_unit, false] call EFUNC(common,disableAI); + }; + { + _unit setSkill [_x, (_unit skill _x) * 50]; + } forEach SUBSKILLS; + }, [_unit]] call CBA_fnc_waitUntilAndExecute; + }; }; } count _affected; @@ -96,14 +110,14 @@ 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 && {EGVAR(hearing,damageCoefficent) > 0.25}}) then { + if (["ACE_Hearing"] call EFUNC(common,isModLoaded) && {_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: - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical") && {_strength > 0.1}) then { + if (["ACE_Medical"] call EFUNC(common,isModLoaded) && {_strength > 0.1}) then { [ACE_player, _strength / 2] call EFUNC(medical,adjustPainLevel); }; diff --git a/addons/grenades/functions/fnc_flashbangThrownFuze.sqf b/addons/grenades/functions/fnc_flashbangThrownFuze.sqf index 46ff41171d..7f1a52417c 100644 --- a/addons/grenades/functions/fnc_flashbangThrownFuze.sqf +++ b/addons/grenades/functions/fnc_flashbangThrownFuze.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Waits for the flashbang grenade fuze to trigger and 'explode' @@ -19,7 +19,7 @@ params ["_projectile"]; TRACE_1("params",_projectile); if (alive _projectile) then { - playSound3D ["A3\Sounds_F\weapons\Explosion\explosion_mine_1.wss", _projectile, false, getPosASL _projectile, 5, 1.2, 400]; + playSound3D ["A3\Sounds_F\arsenal\explosives\grenades\Explosion_HE_grenade_01.wss", _projectile, false, getPosASL _projectile, 5, 1.2, 400]; ["ace_flashbangExploded", [getPosASL _projectile]] call CBA_fnc_globalEvent; }; diff --git a/addons/grenades/functions/fnc_incendiary.sqf b/addons/grenades/functions/fnc_incendiary.sqf index d6f689e4f2..11d89d4ca5 100644 --- a/addons/grenades/functions/fnc_incendiary.sqf +++ b/addons/grenades/functions/fnc_incendiary.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Makes incendiary burn. @@ -155,6 +155,9 @@ private _sound = objNull; if (isServer) then { _sound = createSoundSource ["Sound_Fire", _position, [], 0]; + private _radius = 1.5 * getNumber (configOf _projectile >> "indirectHitRange"); + private _intensity = getNumber (configOf _projectile >> "hit"); + [QEGVAR(fire,addFireSource), [_projectile, _radius, _intensity, _projectile, {CBA_missionTime < _this}, CBA_missionTime + _timeToLive]] call CBA_fnc_serverEvent; }; [{ diff --git a/addons/grenades/functions/fnc_nextMode.sqf b/addons/grenades/functions/fnc_nextMode.sqf index 839fbd5786..1a64cf9f7b 100644 --- a/addons/grenades/functions/fnc_nextMode.sqf +++ b/addons/grenades/functions/fnc_nextMode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Select the next throwing mode and display message. @@ -33,7 +33,7 @@ private _hint = localize ([ LSTRING(HighThrow), LSTRING(PreciseThrow), LSTRING(RollGrenade), - LSTRING(DropGrenade) + LSTRING(DropGrenade) ] select _mode); [_hint] call EFUNC(common,displayTextStructured); diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 3a8c8ef5bf..4105e861f6 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Adjust the grenades throwing direction and speed to the selected throwing mode. Called from the unified fired EH only for CAManBase diff --git a/addons/grenades/functions/script_component.hpp b/addons/grenades/functions/script_component.hpp deleted file mode 100644 index e6a44b8a20..0000000000 --- a/addons/grenades/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\grenades\script_component.hpp" \ No newline at end of file diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index c78dfff13b..dd529085e9 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -13,7 +13,7 @@ Cambia tipo di granata Alternar Modo de Granada 投てき方法を切り替え - 투척 종류 전환 + 투척 방법 전환 切换投掷模式 切換投擲模式 Bomba fırlatma modunu değiştir @@ -149,7 +149,7 @@ 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. フラッシュバンとも知られています。即時に失明と難聴、耳鳴り、内耳障害を引き起こします。 - 플래시뱅이라고도 알려져있습니다. 사용즉시 섬광으로 인한 시력장애, 청각장애, 이명, 내이기관방해를 유발합니다. + 플래시뱅이라고도 알려져있습니다. 사용 즉시 섬광으로 인한 시력장애, 청각장애, 이명, 내이기관방해를 유발합니다. 也被称为闪光弹,会造成暂时性失明,耳聋,耳鸣等效果。 也被稱為閃光彈,會造成暫時性失明,耳聾,耳鳴等效果 Flashbang olarak da bilinir. Ani flaş körlüğü, sağırlık, kulak çınlaması ve iç kulak rahatsızlığına neden olur. @@ -158,6 +158,7 @@ CTS 7290 9-bang Flash Grenade CTS 7290 9-fach Blendgranate CTS 7290-9 9閃 閃光彈 + CTS 7290 9闪 闪光弹 CTS 7290 9- Flash bang Grenade CTS 7290 9 ranný oslepující granát CTS 7290 9-bang 閃光手榴弾 @@ -167,6 +168,7 @@ CTS 7290 9- Flaş Bombası CTS 7290-9 Светошумовая граната Granada aturdidora CTS 7290 9-explosiones + CTS 7290 9-bang 섬광 수류탄 CTS 7290-9 @@ -193,12 +195,12 @@ M127A1 Bengala (Bianco) Flara ręczna sygnałowa M127A1 (biała) M127A1 Sinalizador (Branco) - M127A1 Фальшфейер (Белый) + M127A1 Фальшфейер (белый) Bengala M127A1 (Blanca) M127A1 Feu à main (Blanc) M127A1 信号弾 (白) - M127A1 신호탄 (하얀색) - M127A1 手持式信号弹 (白色) + M127A1 수타식 신호탄 (하얀색) + M127A1 手持式信号弹(白色) M127A1 手持式信號彈 (白色) M127A1 El Sinyali (Beyaz) @@ -210,12 +212,12 @@ M127A1 Bengala (Rosso) Flara ręczna sygnałowa M127A1 (czerwona) M127A1 Sinalizador (Vermelho) - M127A1 Фальшфейер (Красный) + M127A1 Фальшфейер (красный) Bengala M127A1 (Roja) M127A1 Feu à main (Rouge) M127A1 信号弾 (赤) - M127A1 신호탄 (빨간색) - M127A1 手持式信号弹 (红色) + M127A1 수타식 신호탄 (빨간색) + M127A1 手持式信号弹(红色) M127A1 手持式信號彈 (紅色) M127A1 El Sinyali (Kırmızı) @@ -227,12 +229,12 @@ M127A1 Bengala (Verde) Flara ręczna sygnałowa M127A1 (zielona) M127A1 Sinalizador (Verde) - M127A1 Фальшфейер (Зелёный) + M127A1 Фальшфейер (зелёный) Bengala M127A1 (Verde) M127A1 Feu à main (Vert) M127A1 信号弾 (緑) - M127A1 신호탄 (초록색) - M127A1 手持式信号弹 (绿色) + M127A1 수타식 신호탄 (초록색) + M127A1 手持式信号弹(绿色) M127A1 手持式信號彈 (綠色) M127A1 El Sinyali (Yeşil) @@ -244,12 +246,12 @@ M127A1 Bengala (Giallo) Flara ręczna sygnałowa M127A1 (żółta) M127A1 Sinalizador (Amarelo) - M127A1 Фальшфейер (Жёлтый) + M127A1 Фальшфейер (жёлтый) Bengala M127A1 (Amarilla) M127A1 Feu à main (Jaune) M127A1 信号弾 (黄) - M127A1 신호탄 (노란색) - M127A1 手持式信号弹 (黄色) + M127A1 수타식 신호탄 (노란색) + M127A1 手持式信号弹(黄色) M127A1 手持式信號彈 (黃色) M127A1 El Sinyali (Sarı) @@ -261,7 +263,7 @@ Bengala (Bianco) Flara ręczna (biała) Sinalizador de Mão (Branco) - Фальшфейер (Белый) + Фальшфейер (белый) Bengala (Blanca) Feu à main (Blanc) 白の手持ち式信号弾 @@ -278,7 +280,7 @@ Bengala (Rosso) Flara ręczna (czerwona) Sinalizador de Mão (Vermelho) - Фальшфейер (Красный) + Фальшфейер (красный) Bengala (Roja) Feu à main (Rouge) 赤の手持ち式信号弾 @@ -295,7 +297,7 @@ Bengala (Verde) Flara ręczna (zielona) Sinalizador de Mão (Verde) - Фальшфейер (Зелёный) + Фальшфейер (зелёный) Bengala (Verde) Feu à main (Vert) 緑の手持ち式信号弾 @@ -312,7 +314,7 @@ Bengala (Giallo) Flara ręczna (żółta) Sinalizador de Mão (Amarelo) - Фальшфейер (Жёлтый) + Фальшфейер (жёлтый) Bengala (Amarilla) Feu à main (Jaune) 黄の手持ち式信号弾 @@ -330,11 +332,11 @@ M127A1 (Bianco) M127A1 (biała) M127A1 (Branco) - M127A1 (Белый) + M127A1 (белый) M127A1 (Blanca) M127A1 (白) M127A1 (하양) - M127A1 (白色) + M127A1(白色) M127A1 (白色) M127A1 (Beyaz) @@ -347,11 +349,11 @@ M127A1 (Rosso) M127A1 (czerwona) M127A1 (Vermelho) - M127A1 (Красный) + M127A1 (красный) M127A1 (Roja) M127A1 (赤) M127A1 (빨강) - M127A1 (红色) + M127A1(红色) M127A1 (紅色) M127A1 (Kırmızı) @@ -364,11 +366,11 @@ M127A1 (Verde) M127A1 (zielona) M127A1 (Verde) - M127A1 (Зелёный) + M127A1 (зелёный) M127A1 (Verde) M127A1 (緑) M127A1 (초록) - M127A1 (绿色) + M127A1(绿色) M127A1 (綠色) M127A1 (Yeşil) @@ -381,18 +383,18 @@ M127A1 (Giallo) M127A1 (żółta) M127A1 (Amarelo) - M127A1 (Жёлтый) + M127A1 (жёлтый) M127A1 (Amarilla) M127A1 (黄) M127A1 (노랑) - M127A1 (黄色) + M127A1(黄色) M127A1 (黃色) M127A1 (Sarı) AN-M14 Incendiary Grenade AN-M14 Brandsatz - AN-M14 Зажигательная граната + AN-M14 зажигательная граната AN-M14 焼夷手榴弾 Granat zapalający AN-M14 AN-M14 소이 수류탄 @@ -427,7 +429,7 @@ Зажигательная граната используется для уничтожения оружия, боеприпасов и прочего оборудования. 焼夷手榴弾は武器や弾薬箱などの装備を破壊する為に使われます。 Granat zapalający, używany do niszczenia broni, amunicji i innego sprzętu. - 소이 수류탄은 무기나 탄약 그리고 장비를 파괴할때 쓰입니다. + 소이 수류탄은 무기나 탄약 그리고 장비를 파괴할 때 쓰입니다. 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. 燃烧手榴弹是用来摧毁武器,弹药以及其他装备的好帮手。 @@ -446,10 +448,12 @@ Тип: Осветительная ракета - звезда на парашюте Tipo: Sinalizador de pára-quedas estrela 類型:星式帶傘照明彈 + 类型:星式带伞照明弹 Type : Fusée éclairante à parachute Typ: Světlice s padákem Tür: Yıldız Paraşüt Fişeği Tipo: Bengala de paracaidas + 종류: 낙하식 조명탄 M583 Illumination Flare (White) @@ -457,13 +461,15 @@ M583 Flara oświetlająca (Biała) M583 Granata con bengala (Bianca) M583 照明弾 (白) - M583 Осветит. ракета (Белая) + M583 Осветит. ракета (белая) M583 Sinalizador de Iluminação (Branco) M583 照明彈(白色) + M583 照明弹(白色) M583 Fusée éclairante (Blanche) M583 Světlice (Bílá) M583 Aydınlatma Fişeği (Beyaz) M583 Bengala de iluminación (Blanca) + M583 조명탄 (하양) M662 Illumination Flare (Red) @@ -471,13 +477,15 @@ M662 Flara oświetlająca (Czerwona) M662 Granata con bengala (Rossa) M662 照明弾 (赤) - M662 Осветит. ракета (Красная) + M662 Осветит. ракета (красная) M662 Sinalizador de Iluminação (Vermelho) M662 照明彈(紅色) + M662 照明弹(红色) M662 Fusée éclairante (Rouge) M662 Světlice (Červená) M662 Aydınlatma Fişeği (Kırmızı) M662 Bengala de iluminación (Roja) + M662 조명탄 (빨강) M661 Illumination Flare (Green) @@ -485,13 +493,15 @@ M661 Flara oświetlająca (Zielona) M661 Granata con bengala (Verde) M661 照明弾 (緑) - M661 Осветит. ракета (Зеленая) + M661 Осветит. ракета (зелёная) M661 Sinalizador de Iluminação (Verde) M661 照明彈(綠色) + M661 照明弹(绿色) M661 Fusée éclairante (Verte) M661 Světlice (Zelená) M661 Aydınlatma Fişeği (Yeşil) M661 Bengala de iluminación (Verde) + M661 조명탄 (초록) Type: Parachute IR Flare @@ -502,32 +512,39 @@ Тип: ИК-осветительная ракета на парашюте 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 Tipo: Bengala infrarroja de paracaidas + 종류: 낙하식 적외선 조명탄 - 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 Illumination Flare (IR) + M992 Leuchtfackel (IR) + M992 Flara oświetlająca (IR) + M992 Granata con bengala (Infrarosso) + M992 照明弾 (赤外線) + M992 Осветит. ракета (ИК) + M992 Sinalizador de Iluminação (Infravermelho) M992 紅外線照明彈 - M992 Fusée IR - M992 Infračervená světlice - M992 Illumination IR Flare - M992 Bengala de iluminación infrarroja + M992 红外照明弹 + M992 Fusée éclairante (IR) + M992 Světlice (Infračervená) + M992 Aydınlatma Fişeği (IR) + M992 Bengala de iluminación (Infrarroja) + M992 조명탄 (적외선) Explosive Satchel (Throwable) - Ранец со взрывчаткой (Метательный) + Ранец со взрывчаткой (метательный) Charge en sacoche (lançable) 梱包爆薬 (投てき仕様) Carga de mochila explosiva (Lanzable) Pakiet ładunków wybuchowych (Rzucany) + Rucksackladung (Werfbar) + 炸药包(可投掷) + 폭파 장약 (투척) Type: Charge<br />Rounds: 1<br />Used on: Things that need to die @@ -536,6 +553,9 @@ 種類: 爆薬<br />弾数: 1<br />次で使用: 破壊すべき物に Tipo: Carga<br />Unidades: 1<br />Usada: Cosas que necesitan morir Typ: Ładunek<br/>Naboje: 1<br/>Użycie: Na rzeczach które mają zginąć + Typ: Ladung <br/>Patronen:1<br/>Benutzt für: Dinge die Sterben müssen + 类型:炸药<br />数量:1<br />用于:需要死亡的事物 + 종류: 장약<br />갯수: 1<br />사용처: 죽여야 할 곳에 An explosive satchel that is throwable. 7 second fixed fuse @@ -544,14 +564,20 @@ 投げられる梱包爆薬。起爆までの時間は 7 秒間 Carga de mochila explosiva que se puede lanzar. Espoleta fija de 7 segundos Rzucany pakiet ładunków wybuchowych. 7 sekundowy zapalnik + Werfbare Rucksackladung. 7 Sekunden Zeitzünder + 一个可投掷的炸药包。7秒定时引信 + 던질 수 있는 폭파 장약입니다. 던지고 7초 후에 터집니다 Explosive Charge (Throwable) - Заряд со взрывчаткой (Метательный) + Заряд со взрывчаткой (метательный) Charge explosive (lançable) 爆薬ブロック (投てき仕様) Carga explosiva (Lanzable) Ładunek wybuchowy (Rzucany) + Sprengladung (Werfbar) + 炸药块(可投掷) + 폭파 블럭 (투척) An explosive charge that is throwable. 7 second fixed fuse @@ -560,6 +586,9 @@ 投げられる爆薬ブロック。起爆までの時間は 7 秒間 Carga explosiva que se puede lanzar. Espoleta fija de 7 segundos Rzucany ładunkek wybuchowy. 7 sekundowy zapalnik + Werfbare Sprengladung. 7 Sekunden Zeitzünder + 一个可投掷的炸药块。7秒定时引信 + 던질 수 있는 폭파 블럭입니다. 던지고 7초 후에 터집니다 Convert to short fuse @@ -568,6 +597,9 @@ 短信管へ変更 Convertir a espoleta corta Konwertuj na krótki zapalnik + Zündschnur verkürzen + 切换为短引信 + 단축 신관으로 바꾸기 Remove short fuse @@ -576,6 +608,9 @@ 短信管を削除 Quitar espoleta corta Usuń krótki zapalnik + Kurze Zündschnur entfernen + 去除短引信 + 단축 신관 제거하기 ACE Grenades @@ -600,6 +635,9 @@ 爆薬変更を許可 Permitir conversión de explosivos Pozwól na konwersję ładunków wybuchowych + Erlaube die Umwandlung von Sprengstoffen + 允许转换炸药 + 폭발물 변환 가능여부 Allow converting explosives to throwables @@ -608,6 +646,9 @@ 爆発物を投てき仕様へ交換できるようにします。 Permitir convertir explosivos a lanzables Zezwala na konwersje ładunków wybuchowych na rzucane wersje + Erlaube die Umwandlung von Sprengstoffen in werfbare Ladungen + 允许将炸药转换为可投掷物 + 폭발물을 투척무기로 변환할 수 있도록 허용합니다. diff --git a/addons/gunbag/ACE_Arsenal_Actions.hpp b/addons/gunbag/ACE_Arsenal_Actions.hpp new file mode 100644 index 0000000000..6064384ad1 --- /dev/null +++ b/addons/gunbag/ACE_Arsenal_Actions.hpp @@ -0,0 +1,26 @@ +class EGVAR(arsenal,actions) { + class ADDON { + displayName = CSTRING(DisplayName); + condition = QUOTE(_this call FUNC(hasGunbag)); + scopeEditor = 0; // variables are reset between 3DEN and mission start + tabs[] = {0,5}; + class GVAR(status) { + textStatement = QUOTE([_this select 0] call FUNC(weaponName)); + }; + class GVAR(store) { + label = CSTRING(ToGunbag); + condition = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(canInteract) == 0); + statement = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(toGunbagCallback)); + }; + class GVAR(retrieve) { + label = CSTRING(OffGunbag); + condition = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(canInteract) == 1); + statement = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(offGunbagCallback)); + }; + class GVAR(swap) { + label = CSTRING(SwapGunbag); + condition = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(canInteract) == 2); + statement = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(swapGunbagCallback)); + }; + }; +}; diff --git a/addons/gunbag/XEH_PREP.hpp b/addons/gunbag/XEH_PREP.hpp index 2e2c57a056..78b7be0968 100644 --- a/addons/gunbag/XEH_PREP.hpp +++ b/addons/gunbag/XEH_PREP.hpp @@ -12,3 +12,4 @@ PREP(hasGunbag); PREP(isMachineGun); PREP(BIArsenalClose); PREP(BIArsenalOpen); +PREP(weaponName); diff --git a/addons/gunbag/XEH_preInit.sqf b/addons/gunbag/XEH_preInit.sqf index 63968a30f8..ad244390fa 100644 --- a/addons/gunbag/XEH_preInit.sqf +++ b/addons/gunbag/XEH_preInit.sqf @@ -26,22 +26,27 @@ PREP_RECOMPILE_END; }, _this] call CBA_fnc_execNextFrame; }] call CBA_fnc_addClassEventHandler; -[QEGVAR(arsenal,displayOpened), { - - private _center = EGVAR(arsenal,center); - - if (_center call FUNC(hasGunBag)) then { - GVAR(arsenalCache) = (backpackContainer _center) getVariable [QGVAR(gunbagWeapon), []]; +["CBA_loadoutSet", { + params ["_unit", "_loadout", "_extendedInfo"]; + private _gunbagWeapon = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []]; + if (_gunbagWeapon isNotEqualTo []) then { + if (!isNil QEGVAR(arsenal,virtualItemsFlatAll)) then { + private _weapon = (_gunbagWeapon select 0) call EFUNC(arsenal,baseWeapon); + if !(_weapon in EGVAR(arsenal,virtualItemsFlatAll)) then { + INFO_1("removing [%1] from loadout",_gunbagWeapon); + _gunbagWeapon = []; + }; + }; + (backpackContainer _unit) setVariable [QGVAR(gunbagWeapon), _gunbagWeapon, true]; }; }] call CBA_fnc_addEventHandler; -[QEGVAR(arsenal,displayClosed), { - - if (!isNil QGVAR(arsenalCache)) then { - (backpackContainer EGVAR(arsenal,center)) setVariable [QGVAR(gunbagWeapon),GVAR(arsenalCache), true]; +["CBA_loadoutGet", { + params ["_unit", "_loadout", "_extendedInfo"]; + private _gunbagWeapon = (backpackContainer _unit) getVariable [QGVAR(gunbagWeapon), []]; + if (_gunbagWeapon isNotEqualTo []) then { + _extendedInfo set [QGVAR(gunbagWeapon), _gunbagWeapon]; }; - - GVAR(arsenalCache) = nil; }] call CBA_fnc_addEventHandler; ADDON = true; diff --git a/addons/gunbag/config.cpp b/addons/gunbag/config.cpp index 6efaceb5d6..037d3d5df8 100644 --- a/addons/gunbag/config.cpp +++ b/addons/gunbag/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" +#include "ACE_Arsenal_Actions.hpp" diff --git a/addons/gunbag/functions/fnc_BIArsenalClose.sqf b/addons/gunbag/functions/fnc_BIArsenalClose.sqf index 011593aaa0..2d39b3a045 100644 --- a/addons/gunbag/functions/fnc_BIArsenalClose.sqf +++ b/addons/gunbag/functions/fnc_BIArsenalClose.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mjc4wilton * Handle BI arsenal closing diff --git a/addons/gunbag/functions/fnc_BIArsenalOpen.sqf b/addons/gunbag/functions/fnc_BIArsenalOpen.sqf index 713e9eb8aa..97f3beeeb2 100644 --- a/addons/gunbag/functions/fnc_BIArsenalOpen.sqf +++ b/addons/gunbag/functions/fnc_BIArsenalOpen.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mjc4wilton * Handle BI arsenal opening diff --git a/addons/gunbag/functions/fnc_calculateMass.sqf b/addons/gunbag/functions/fnc_calculateMass.sqf index 6d66d191df..6dd6a5a660 100644 --- a/addons/gunbag/functions/fnc_calculateMass.sqf +++ b/addons/gunbag/functions/fnc_calculateMass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Calculate mass of weapon and items. diff --git a/addons/gunbag/functions/fnc_canInteract.sqf b/addons/gunbag/functions/fnc_canInteract.sqf index a003afce86..4a55b0f0aa 100644 --- a/addons/gunbag/functions/fnc_canInteract.sqf +++ b/addons/gunbag/functions/fnc_canInteract.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Check if client is able to interact with gunbag. diff --git a/addons/gunbag/functions/fnc_hasGunbag.sqf b/addons/gunbag/functions/fnc_hasGunbag.sqf index 7f9c7135e0..aaf4b1918a 100644 --- a/addons/gunbag/functions/fnc_hasGunbag.sqf +++ b/addons/gunbag/functions/fnc_hasGunbag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Check if unit has a gunbag. @@ -17,4 +17,4 @@ params ["_unit"]; -getNumber (configFile >> "CfgVehicles" >> (backpack _unit) >> QUOTE(ADDON)) == 1 +getNumber ((configOf (backpackContainer _unit)) >> QUOTE(ADDON)) == 1 diff --git a/addons/gunbag/functions/fnc_isMachineGun.sqf b/addons/gunbag/functions/fnc_isMachineGun.sqf index 76cf64d443..f07866a4aa 100644 --- a/addons/gunbag/functions/fnc_isMachineGun.sqf +++ b/addons/gunbag/functions/fnc_isMachineGun.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Reports true if a weapon is a machine gun. diff --git a/addons/gunbag/functions/fnc_offGunbag.sqf b/addons/gunbag/functions/fnc_offGunbag.sqf index 2b83beba4d..8357fae9bc 100644 --- a/addons/gunbag/functions/fnc_offGunbag.sqf +++ b/addons/gunbag/functions/fnc_offGunbag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Get weapon out of gunbag. diff --git a/addons/gunbag/functions/fnc_offGunbagCallback.sqf b/addons/gunbag/functions/fnc_offGunbagCallback.sqf index 794ea2e709..8edd3e4582 100644 --- a/addons/gunbag/functions/fnc_offGunbagCallback.sqf +++ b/addons/gunbag/functions/fnc_offGunbagCallback.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Get weapon out of gunbag. diff --git a/addons/gunbag/functions/fnc_status.sqf b/addons/gunbag/functions/fnc_status.sqf index 730e992dcb..c57caac4f5 100644 --- a/addons/gunbag/functions/fnc_status.sqf +++ b/addons/gunbag/functions/fnc_status.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Check gunbag status full/empty. diff --git a/addons/gunbag/functions/fnc_swapGunbag.sqf b/addons/gunbag/functions/fnc_swapGunbag.sqf index 46eb926f38..a379c09e8f 100644 --- a/addons/gunbag/functions/fnc_swapGunbag.sqf +++ b/addons/gunbag/functions/fnc_swapGunbag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E and mjc4wilton * Swap primary weapon and weapon in gunbag. diff --git a/addons/gunbag/functions/fnc_swapGunbagCallback.sqf b/addons/gunbag/functions/fnc_swapGunbagCallback.sqf index 8ed4f2cf59..fb5009577e 100644 --- a/addons/gunbag/functions/fnc_swapGunbagCallback.sqf +++ b/addons/gunbag/functions/fnc_swapGunbagCallback.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E and mjc4wilton * Swap primary weapon and weapon in gunbag. diff --git a/addons/gunbag/functions/fnc_toGunbag.sqf b/addons/gunbag/functions/fnc_toGunbag.sqf index 1f52eb6baf..76c27b7587 100644 --- a/addons/gunbag/functions/fnc_toGunbag.sqf +++ b/addons/gunbag/functions/fnc_toGunbag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Put weapon into gunbag. diff --git a/addons/gunbag/functions/fnc_toGunbagCallback.sqf b/addons/gunbag/functions/fnc_toGunbagCallback.sqf index e47c817979..4930d1d95a 100644 --- a/addons/gunbag/functions/fnc_toGunbagCallback.sqf +++ b/addons/gunbag/functions/fnc_toGunbagCallback.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ir0n1E * Put weapon into gunbag. diff --git a/addons/gunbag/functions/fnc_weaponName.sqf b/addons/gunbag/functions/fnc_weaponName.sqf new file mode 100644 index 0000000000..51e0385b05 --- /dev/null +++ b/addons/gunbag/functions/fnc_weaponName.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: Ir0n1E, Brett Mayson + * Get gunbag weapon name + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_gunbag_fnc_weaponName + * + * Public: No + */ + +params ["_unit"]; + +private _state = (backpackContainer _unit) getVariable [QGVAR(gunbagWeapon), []]; + +private _name = localize LSTRING(empty); +if (_state isNotEqualTo []) then { + _name = getText (configFile >> "CfgWeapons" >> _state#0 >> "displayName"); +}; +_name diff --git a/addons/gunbag/functions/script_component.hpp b/addons/gunbag/functions/script_component.hpp deleted file mode 100644 index 4e342e3b04..0000000000 --- a/addons/gunbag/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\gunbag\script_component.hpp" diff --git a/addons/gunbag/initSettings.sqf b/addons/gunbag/initSettings.sqf index f48981e2fd..b4ec000fa6 100644 --- a/addons/gunbag/initSettings.sqf +++ b/addons/gunbag/initSettings.sqf @@ -1,9 +1,9 @@ -// CBA Settings [ADDON: ace_gunbag]: +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(DisplayName_Settings)]; [ QGVAR(swapGunbagEnabled), "CHECKBOX", [LSTRING(SwapGunbagEnabled_DisplayName), LSTRING(SwapGunbagEnabled_Description)], - ["ACE Uncategorized", LLSTRING(DisplayName_Settings)], + _category, true, // default value true // isGlobal ] call CBA_fnc_addSetting; diff --git a/addons/gunbag/stringtable.xml b/addons/gunbag/stringtable.xml index 7d2050c52d..324229d6e3 100644 --- a/addons/gunbag/stringtable.xml +++ b/addons/gunbag/stringtable.xml @@ -27,7 +27,7 @@ Torba na broń (jasnobrązowa) 총가방 (황갈색) Borsa per Armi (Tan) - 枪袋 (黄褐色) + 枪袋(黄褐色) 槍袋 (黃褐色) Bolsa de Arma (Bege) Silah Çantası (Tan) @@ -73,15 +73,21 @@ ガンバッグ内の武器を交換 Silah çantasında silah değişimi Intercambiar arma en funda de arma + Waffe in Waffentasche tauschen + 交换枪袋中的武器 + 총가방 안에 있는 무기랑 교환하기 Enable Weapon Swap Aktywuj wymianę broni - Включить обмен оружием + Вкл. обмен оружием Activer l'échange d'arme 武器交換を有効化 Silah Değiştirmeyi Etkinleştir Habilitar cambio de arma + Aktiviere Tauschen von Waffen + 启用武器互换 + 무기 교환 활성화 Allows interaction to directly swap the primary weapon and stored weapon. @@ -91,6 +97,9 @@ 持っている武器とガンバッグ内の武器を交換できるようにします。 Etkileşimin doğrudan birincil silahı ve depolanan silahı değiştirmesine izin verir. Permitir interacción para intercambiar el arma principal y el arma guardada. + Erlaube den direkten Wechsel von Primärer und verstauter Waffe über das Interaktionsmenü. + 允许互动直接切换主武器和存储武器。 + 보관 중인 무기와 주무기와 바로 바꾸는 것을 허용합니다. Get weapon out of gunbag diff --git a/addons/headless/CfgVehicles.hpp b/addons/headless/CfgVehicles.hpp index 4db23b20eb..3bd5ee63b5 100644 --- a/addons/headless/CfgVehicles.hpp +++ b/addons/headless/CfgVehicles.hpp @@ -2,7 +2,7 @@ class CfgVehicles { class ACE_Module; class XGVAR(module): ACE_Module { author = ECSTRING(common,ACETeam); - category = "ACEX"; + category = "ACE"; displayName = CSTRING(Module); function = QFUNC(moduleInit); scope = 1; diff --git a/addons/headless/XEH_postInit.sqf b/addons/headless/XEH_postInit.sqf index 6e9a531899..103d5c1834 100644 --- a/addons/headless/XEH_postInit.sqf +++ b/addons/headless/XEH_postInit.sqf @@ -6,7 +6,7 @@ if (isServer) then { // Request rebalance on any unit spawn (only if distribution enabled) if (XGVAR(enabled)) then { - ["AllVehicles", "init", FUNC(handleSpawn), nil, nil, true] call CBA_fnc_addClassEventHandler; + ["AllVehicles", "initPost", FUNC(handleSpawn), nil, nil, true] call CBA_fnc_addClassEventHandler; }; // Add disconnect EH addMissionEventHandler ["HandleDisconnect", {call FUNC(handleDisconnect)}]; @@ -22,14 +22,18 @@ // Check if naked unit bug happened if (_local && {uniform _unit == ""}) then { + scopeName QGVAR(applyLoadout); INFO_1("Unit [%1] became local with broken loadout - attempting to fix",_unit); if (XGVAR(transferLoadout) == 1) then { // Transferred loadout, if unavailable reset to config default (still better than naked) - _unit setUnitLoadout (_unit getVariable [QGVAR(loadout), typeOf _unit]); - } else { - // Config default loadout - _unit setUnitLoadout (typeOf _unit); + private _loadout = _unit getVariable [QGVAR(loadout), []]; + if (_loadout isNotEqualTo []) then { + [_unit, _loadout] call CBA_fnc_setLoadout; + breakOut QGVAR(applyLoadout); + }; }; + // Config default loadout + _unit setUnitLoadout (typeOf _unit); }; }] call CBA_fnc_addClassEventHandler; }; diff --git a/addons/headless/functions/fnc_endMissionNoPlayers.sqf b/addons/headless/functions/fnc_endMissionNoPlayers.sqf index 7b026081b3..6954748ba9 100644 --- a/addons/headless/functions/fnc_endMissionNoPlayers.sqf +++ b/addons/headless/functions/fnc_endMissionNoPlayers.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Ends mission on server if no players are connected. diff --git a/addons/headless/functions/fnc_handleConnectHC.sqf b/addons/headless/functions/fnc_handleConnectHC.sqf index 48335cdb86..b19ef25012 100644 --- a/addons/headless/functions/fnc_handleConnectHC.sqf +++ b/addons/headless/functions/fnc_handleConnectHC.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Registers connected Headless Client for use. diff --git a/addons/headless/functions/fnc_handleDisconnect.sqf b/addons/headless/functions/fnc_handleDisconnect.sqf index 154b51cd0b..c94cec2599 100644 --- a/addons/headless/functions/fnc_handleDisconnect.sqf +++ b/addons/headless/functions/fnc_handleDisconnect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Removes Headless Client from use. diff --git a/addons/headless/functions/fnc_handleSpawn.sqf b/addons/headless/functions/fnc_handleSpawn.sqf index bc168025d9..50277e3845 100644 --- a/addons/headless/functions/fnc_handleSpawn.sqf +++ b/addons/headless/functions/fnc_handleSpawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Handles AI spawn and requests a rebalance if applicable. diff --git a/addons/headless/functions/fnc_moduleInit.sqf b/addons/headless/functions/fnc_moduleInit.sqf index b8bedde1ae..9c9f83e350 100644 --- a/addons/headless/functions/fnc_moduleInit.sqf +++ b/addons/headless/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the Headless module. diff --git a/addons/headless/functions/fnc_rebalance.sqf b/addons/headless/functions/fnc_rebalance.sqf index c3f3b1c2a9..84be441ebe 100644 --- a/addons/headless/functions/fnc_rebalance.sqf +++ b/addons/headless/functions/fnc_rebalance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Rebalance AI groups accross HCs. diff --git a/addons/headless/functions/fnc_transferGroups.sqf b/addons/headless/functions/fnc_transferGroups.sqf index 94cd2627d4..cee85a5109 100644 --- a/addons/headless/functions/fnc_transferGroups.sqf +++ b/addons/headless/functions/fnc_transferGroups.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Transfers AI groups to Headess Client(s). @@ -65,11 +65,11 @@ private _numTransferredHC3 = 0; // Transfer AI groups { // No transfer if empty group - private _transfer = !(units _x isEqualTo []) && {!(_x getVariable [QXGVAR(blacklist), false])}; + private _transfer = ((units _x) isNotEqualTo []) && {!(_x getVariable [QXGVAR(blacklist), false])}; if (_transfer) then { // No transfer if waypoints with synchronized triggers exist for the group - private _allWaypointsWithTriggers = (waypoints _x) select {!((synchronizedTriggers _x) isEqualTo [])}; - if !(_allWaypointsWithTriggers isEqualTo []) exitWith { + private _allWaypointsWithTriggers = (waypoints _x) select {(synchronizedTriggers _x) isNotEqualTo []}; + if (_allWaypointsWithTriggers isNotEqualTo []) exitWith { _transfer = false; }; @@ -96,7 +96,7 @@ private _numTransferredHC3 = 0; // Save gear if unit about to be transferred with current loadout (naked unit work-around) if (XGVAR(transferLoadout) == 1) then { - _x setVariable [QGVAR(loadout), getUnitLoadout _x, true]; + _x setVariable [QGVAR(loadout), [_x] call CBA_fnc_getLoadout, true]; }; } forEach (units _x); }; diff --git a/addons/headless/functions/script_component.hpp b/addons/headless/functions/script_component.hpp deleted file mode 100644 index a38efad3a9..0000000000 --- a/addons/headless/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\headless\script_component.hpp" diff --git a/addons/headless/stringtable.xml b/addons/headless/stringtable.xml index 660067a293..3956c14a87 100644 --- a/addons/headless/stringtable.xml +++ b/addons/headless/stringtable.xml @@ -8,34 +8,37 @@ 헤드리스 ヘッドレス Headless - 无头客户端 + Headless 客户端 無頭客戶端 Headless Headless клиент + Headless This module allows you to setup automatic transferring of AI to Headless Clients. (Default: No) Dieses Modul erlaubt es dir, die KI automatisch auf einen Headless Client zu transferieren. (Standard: Nein) Ten moduł zezwala na automatyczny transfer AI do Headless Cient. (Domyślnie: Nie) 이 모듈을 사용하면 헤드리스 클라이언트에 AI 자동 전송을 설정할 수 있습니다. (기본값 : No) - モジュールは AI を自動的にヘッドレス クライアントへ移行します。(標準: 無効) + モジュールはAIを自動的にヘッドレスクライアントへ移行します。(標準: 無効) Ce module permet de mettre en place un transfert aotmatique de l'IA vers le Headless Clients. (Défaut: Non) - 此模块能让你自动转换AI的控制权给其他无头客户端。(预设:关闭) + 此模块能让你自动转换 AI 的控制权给其他 Headless 客户端。(预设:关闭) 此模塊能讓你自動轉換AI的控制權給其他無頭客戶端。(預設:關閉) Questo modulo ti consente di impostare il trasferimento automatico delle AI su dei Client Headless. (Default: No) Этот модуль позволяет настроить автоматическую передачу управления ИИ Headless клиентам. (По умолчанию: Откл) + Este modulo permite habilitar la transferencia de IA a los Headless Clients. (Defecto: No) Enables transferring of AI to Headless Clients. Aktiviert den Transfer der KI auf die Headless Clients. Włącza transfer AI do Headless Client. AI를 헤드리스 클라이언트로 전송할 수 있습니다. - AI をヘッドレス クライアントへ移行を有効化 + AIをヘッドレスクライアントへ移行を有効化 Permet le transfert des IA au Headless Clients. - 开启转换AI控制权给无头客户端。 + 开启转换 AI 控制权给 Headless 客户端。 開啟轉換AI控制權給無頭客戶端。 Abilita il trasferimento delle AI sugli Headless Client. Передает управление ИИ Headless клиентам. + Habilita la transferencia de IA a los Headless Clients Delay @@ -48,6 +51,7 @@ 延遲 Latenza Задержка + Retardo Minimal delay between transfers, in seconds. (Default: 15) @@ -56,10 +60,11 @@ 전송 간 최소 지연 시간, 초당. (기본값: 15) 移行する際の最低遅延を秒数で設定します。(標準: 15) Délai minimum entres les transferts, en secondes. (Défaut: 15) - 设定每次转换间隔多少秒。(预设:15秒) + 设定每次转换间隔多少秒。(预设:15秒) 設定每次轉換間隔多少秒。(預設:15秒) Latenza minima tra i trasferimenti, in secondi. (Default: 15) Минимальная задержка в секундах между передачами. (По умолчанию: 15) + Retardo mínimo entre transferencias en segundos. (Default: 15) End Mission @@ -72,18 +77,20 @@ Termina Missione Koniec misji Завершать миссию + Finalizar misión End mission when there are no players connected (same as 'persistent = 0' in server configuration but with Headless Client support). Beende die Mission, wenn keine Spieler mehr verbunden sind (das gleiche wie 'persitent = 0' in den Serverkonfigurationen aber mit Headless Client Unterstützung). 연결된 플레이어가 없을 때 임무 종료. (서버 구성에서는 'persistent = 0'과 같지만 Headless Client는 지원함) - プレイヤーが接続していない場合はミッション終了します。(サーバ設定の'presistent =0'と同じですが、ヘッドレス クライアントは適用されます) + プレイヤーが接続していない場合はミッション終了します。(サーバ設定の'presistent =0'と同じですが、ヘッドレスクライアントは適用されます) Termine la mission lorsqu'il n'y a plus de joueur connecté (idem que 'persistent = 0' dans la config serveur mais avec la gestion du Headless Client). - 当伺服器里没有任何玩家还连线时自动结束任务(效果同于伺服器设定的'persistent = 0',但支援无头客户端)。 + 当服务器里没有任何玩家还连线时自动结束任务(效果同于伺服器设定的'persistent = 0',但支援 Headless 客户端)。 當伺服器裡沒有任何玩家還連線時自動結束任務(效果同於伺服器設定的'persistent = 0',但支援無頭客戶端)。 Termina la missione quando non ci sono più giocatori connessi (come 'persistent = 0' nella configurazione dei server ma con il supporto dell'Headless Client). Kończy misje kiedy nie ma połączonych graczy(tak samo jak 'persistent = 0' w konfiguracji serwer ale z wsparciem Headless Client Завершает миссию, если нет присоединенных игроков (аналогично 'persistent = 0' в настройках сервера, но с включенной поддержкой Headless клиентов). + Finalizar la misión cuando no hay jugadores conectados (igual que la opción de servidor 'persistent = 0', pero con soporte para Headless Client). Instant @@ -96,6 +103,7 @@ Istantaneo Natychmiastowy Мгновенно + Instantáneo Delayed (60s) @@ -103,11 +111,12 @@ 지연 (60초) 遅延 (60秒) Retardé (60s) - 延迟 (60秒) + 延迟(60秒) 延遲 (60秒) Ritardato (60s) Opóźniony (60s) С задержкой (60 с) + Retardado (60s) Log @@ -120,74 +129,90 @@ 日誌 Registra Журнал + Registrar Log transfer statistics and Headless Client (dis)connections to RPT. (Default: No) Zeichnet Transferstatistiken, Verbindungen und Verbindungsabbrüche in einer RPT-Datei auf. (Standard: Nein) Zapisz statystyki transferu i status połączenia Headless Clienta do RPT. (Domyślnie: Tak) - 전송 통계 및 헤드리스 클라이언트 연결(해제) 로그 RPT. (기본값: No) - 統計とヘッドレス クライアントの接続有無を PRT へ記録します。(標準: 無効) + 전송 통계 및 헤드리스 클라이언트 연결(해제)를 RPT파일에 로그함. (기본값: No) + 統計とヘッドレスクライアントの接続有無を PRT へ記録します。(標準: 無効) Archive les statistiques de transfert et de (dé)connections du Headless Client dans le RPT. (Défaut: Non) - 记录无头客户端间的转换数量与连线/断线等记录到RPT报告档中。(预设:关闭) + 记录 Headless 客户端间的转换数量与连线/断线等记录到 RPT 报告档中。(预设:关闭) 記錄無頭客戶端間的轉換數量與連線/斷線等記錄到RPT報告檔中。(預設:關閉) Registra le statistiche del trasferimento e delle (dis)connessioni dell'Headless Clienti su RPT. (Default: No) Вести журнал передач и подключений Headless клиентов в файл RPT. (По умолчанию: Откл) + Registrar las estadísticas de transferencia y las (des)conexiones de Headless Client hacia el RPT. (Default: No) Transfer Loadout Transferiere Ausrüstung 装備の移送 裝備傳輸 + 装备转移 Передавать снаряжение Transfer Wyposażenia + 로드아웃 전송 + Transferir equipamiento Transfer loadout of units attempts to work around an issue where units appear naked after transferring to a Headless Client. Transferiere die Ausrüstung einer Einheit, um einen Fehler zu umgehen, bei welchem Einheiten nach dem Transfer auf einen Headless Client nackt erscheinen. - 装備の移送はヘッドレス クライアントへの移行後にユニットが裸で出現する問題の回避を試みます。 + 装備の移送はヘッドレスクライアントへの移行後にユニットが裸で出現する問題の回避を試みます。 Передача снаряжения юнитов позволяет обходить проблему, при которой юниты оказываются без снаряжения после передачи управления Headless клиенту. 裝備傳輸用於試著暫時應付單位透過無頭客戶端傳輸時所導致裸裝之問題。 + 装备转移用于试着暂时应付单位透过 Headless 客户端传输时所导致裸装之问题。 Transfer Wyposażenia jednostek usiłuje uniknąć problemu z nagimi jednostkami po transferze do Headless Clienta + 헤드리스 클라이언트로 넘어갈 때 유닛이 벌거벗고 있는 상황을 해결하기 위해 로드아웃을 유닛에 전송합니다. + Transferir el equipamiento de unidades intenta solventar el problema por el cual las unidades aparecen desnudas despues de ser transferidas a un Headless Client. Current Loadout Derzeitige Ausrüstung 現在の装備 目前裝備 + 当前装备 Текущее снаряжение Obecne wyposażenie + 현재 로드아웃 + Equipamiento actual Config Loadout Konfiguriere Ausrüstung コンフィグの装備 設置裝備 + 设置装备 Снаряжение из настроек Konfiguracja Wyposażenia + 로드아웃 설정 + Configuración de equipamiento Headless Blacklist Headless Blacklist - ヘッドレス ブラックリスト + ヘッドレスブラックリスト Liste noire Headless - 无头客户端黑名单 + Headless 客户端黑名单 無頭客戶端黑名單 Lista Nera Headless 헤드리스 블랙리스트 Czarna lista Headless Черный список Headless + Lista negra de Headless Disables transferring of this AI unit/group to Headless Clients. No effect on player units. Schaltet das Übertragen dieser KI Einheit/Gruppe zu einem Headless Client aus. Hat keinen Effekt auf Spielereinheiten. - ヘッドレス クライアントへ移行させない AI ユニット/グループを指定します。プレイヤー ユニットへ効果はありません。 + ヘッドレスクライアントへ移行させないAIユニット/グループを指定します。プレイヤーユニットへ効果はありません。 Désactive le transfert de ce(tte) unité/groupe au Headless Clients. Sans effet sur les unités des joueurs. - 禁止转换黑名单中的AI单位/群组到无头客户端上。此功能对玩家单位无用。 + 禁止转换黑名单中的 AI 单位/群组到 Headless 客户端上。此功能对玩家单位无用。 禁止轉換黑名單中的AI單位/群組到無頭客戶端上。此功能對玩家單位無用。 Disabilita il trasferimento di questa unità/gruppo di AI negli Headless Client. Non ha effetto sui giocatori. - 이 AI 유닛 / 그룹을 헤드리스 클라이언트로 전송하지 못하도록합니다. 플레이어 유닛에는 영향을주지 않습니다. + 이 AI 유닛/그룹을 헤드리스 클라이언트로 전송하지 못하도록 합니다. 플레이어 유닛에는 영향을 주지 않습니다. Wyłącza transfer tych jednostek/grup AI do Headless Clients. Bez efektu na jednostkach gracza. Отключает передачу управления этого юнита/группы Headless клиентам. Не влияет на юниты игроков. + Deshabilita la transferencia de esta unidad/grupo de IA hacia los Headless Clients.Sin efecto sobre unidades de jugadores. diff --git a/addons/hearing/ACE_Arsenal_Stats.hpp b/addons/hearing/ACE_Arsenal_Stats.hpp index cc9e048823..9e47b0a493 100644 --- a/addons/hearing/ACE_Arsenal_Stats.hpp +++ b/addons/hearing/ACE_Arsenal_Stats.hpp @@ -11,7 +11,7 @@ class EGVAR(arsenal,stats) { }; class ACE_volumeMuffling: statBase { scope = 2; - priority = 1; + priority = 1.75; stats[] = {QGVAR(lowerVolume)}; displayName= CSTRING(statHearingLowerVolume); showBar = 1; diff --git a/addons/hearing/CfgAmmo.hpp b/addons/hearing/CfgAmmo.hpp deleted file mode 100644 index ddc2bf3297..0000000000 --- a/addons/hearing/CfgAmmo.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// Setting up old stuff for A3 -class CfgAmmo { - class BulletBase; - class B_127x108_Ball: BulletBase { - audibleFire = 15; - }; -}; diff --git a/addons/hearing/XEH_preInit.sqf b/addons/hearing/XEH_preInit.sqf index 9361d05015..5d6b275adc 100644 --- a/addons/hearing/XEH_preInit.sqf +++ b/addons/hearing/XEH_preInit.sqf @@ -8,4 +8,19 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +["CBA_loadoutSet", { + params ["_unit", "_loadout", "_extendedInfo"]; + if (_extendedInfo getOrDefault ["ace_earplugs", false]) then { + _unit setVariable ["ACE_hasEarPlugsIn", true, true]; + [[true]] remoteExec [QFUNC(updateVolume), _unit]; + }; +}] call CBA_fnc_addEventHandler; + +["CBA_loadoutGet", { + params ["_unit", "_loadout", "_extendedInfo"]; + if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { + _extendedInfo set ["ace_earplugs", true] + }; +}] call CBA_fnc_addEventHandler; + ADDON = true; diff --git a/addons/hearing/config.cpp b/addons/hearing/config.cpp index a1cc956d89..ba6674b9db 100644 --- a/addons/hearing/config.cpp +++ b/addons/hearing/config.cpp @@ -18,6 +18,5 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgSounds.hpp" #include "CfgWeapons.hpp" -#include "CfgAmmo.hpp" #include "ACE_Settings.hpp" #include "ACE_Arsenal_Stats.hpp" diff --git a/addons/hearing/functions/fnc_addEarPlugs.sqf b/addons/hearing/functions/fnc_addEarPlugs.sqf index 2fcfdab75d..b73c94bf01 100644 --- a/addons/hearing/functions/fnc_addEarPlugs.sqf +++ b/addons/hearing/functions/fnc_addEarPlugs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called on unit initialization. Adds earplugs if the unit is equipped with either a really loud primary weapon or a rocket launcher. diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index ae830e09a2..f5a2a714db 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2, Rocko, Rommel, Ruthberg * Handle new sound souce near ace_player and apply hearing damage diff --git a/addons/hearing/functions/fnc_explosionNear.sqf b/addons/hearing/functions/fnc_explosionNear.sqf index 799002b3f7..c65cf31c76 100644 --- a/addons/hearing/functions/fnc_explosionNear.sqf +++ b/addons/hearing/functions/fnc_explosionNear.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2, Ruthberg * Handles deafness due to explosions going off near the player. diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 4dd8c759a3..98ee093381 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Handles deafness due to large-caliber weapons going off near the player. diff --git a/addons/hearing/functions/fnc_handleRespawn.sqf b/addons/hearing/functions/fnc_handleRespawn.sqf index 74dee65b04..b436aa7c41 100644 --- a/addons/hearing/functions/fnc_handleRespawn.sqf +++ b/addons/hearing/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Reset earplugs on respawn, and then re-add if appropriate diff --git a/addons/hearing/functions/fnc_hasEarPlugsIn.sqf b/addons/hearing/functions/fnc_hasEarPlugsIn.sqf index f24b17737e..f4b84281fb 100644 --- a/addons/hearing/functions/fnc_hasEarPlugsIn.sqf +++ b/addons/hearing/functions/fnc_hasEarPlugsIn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit has earplugs put in. diff --git a/addons/hearing/functions/fnc_moduleHearing.sqf b/addons/hearing/functions/fnc_moduleHearing.sqf index d36579c4c0..924f2baa21 100644 --- a/addons/hearing/functions/fnc_moduleHearing.sqf +++ b/addons/hearing/functions/fnc_moduleHearing.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Initializes the Hearing module. diff --git a/addons/hearing/functions/fnc_putInEarplugs.sqf b/addons/hearing/functions/fnc_putInEarplugs.sqf index 25584130e4..2af4df8e86 100644 --- a/addons/hearing/functions/fnc_putInEarplugs.sqf +++ b/addons/hearing/functions/fnc_putInEarplugs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Hope Johnson and commy2 * Puts in earplugs. diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf index 8399a3a84f..20a49bb530 100644 --- a/addons/hearing/functions/fnc_removeEarplugs.sqf +++ b/addons/hearing/functions/fnc_removeEarplugs.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Hope Johnson and commy2 * Takes out earplugs. diff --git a/addons/hearing/functions/fnc_updateHearingProtection.sqf b/addons/hearing/functions/fnc_updateHearingProtection.sqf index e010165f8a..15973b73a9 100644 --- a/addons/hearing/functions/fnc_updateHearingProtection.sqf +++ b/addons/hearing/functions/fnc_updateHearingProtection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Updates the hearing protection and volume attenuation for player on earbuds/helmet change diff --git a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf index 76f685df81..207c0f07a3 100644 --- a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf +++ b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets the sound attenuation of a player to the outside. diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index 11dc919a7e..0029cdc4de 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 and esteldunedain and Ruthberg * Updates and applies the current deafness. Called every 1 sec from a PFEH. * * Arguments: * 0: Args - * 0: Just update volume (skip ringing/recovery) (default: false) + * - 0: Just update volume (skip ringing/recovery) (default: false) * * Return Value: * None diff --git a/addons/hearing/functions/script_component.hpp b/addons/hearing/functions/script_component.hpp deleted file mode 100644 index 18305605c4..0000000000 --- a/addons/hearing/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\hearing\script_component.hpp" \ No newline at end of file diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 3d77dd879d..1aeac049ba 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -123,7 +123,7 @@ Disable ear ringing Désactiver les bourdonnements Desactivar zumbido de oídos - Отключить звон в ушах + Откл. звон в ушах Knalltrauma deaktivieren Vypnout pískání v uších Wyłącz dzwonienie w uszach @@ -145,8 +145,8 @@ Remove o efeito de zunido quando o jogador recebe dano na audição Убирает эффект звона в ушах, когда игрок получает повреждение слуха プレイヤーの聴覚が損傷したら耳鳴りの効果を削除します - 플레이어가 청력손실을 입을때 생기는 이명현상을 제거합니다. - 关闭耳鸣效果时,就算玩家受到相当程度的听力伤害, 也不会造成耳鸣效果 + 플레이어가 청력손실을 입을 때 생기는 이명현상을 제거합니다. + 关闭耳鸣效果时,就算玩家受到相当程度的听力伤害,也不会造成耳鸣效果 關閉耳鳴效果時,就算玩家受到相當程度的聽力傷害, 也不會造成耳鳴效果 Odstranit tinitus když hráč utrpí poškození sluchu @@ -179,7 +179,7 @@ Sordità da combattimento 戦闘による難聴を有効化 전투 난청 켜기 - 启用战斗性耳聋? + 启用战斗性耳聋? 啟用戰鬥性耳聾? @@ -194,7 +194,7 @@ Réduit la capacité auditive du joueur lorsqu'il subit des dommages auditifs. 音による損傷をうけ、聴覚が減る可能性があります 청력에 손상을 입으면 듣는 소리가 감소합니다. - 当玩家听力受损时降低听力能力? + 当玩家听力受损时降低听力能力? 當玩家聽力受損時降低聽力能力? @@ -269,7 +269,7 @@ 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é si de l'équipement personnalisé est utilisé. 全ユニットへ`ACE_EarPlugs`アイテムを持たせます。これは変更された武装で無効化できます。 - 무기를 가지고 있는 모든 인원에게 'ACE_EarPlugs'를 지급합니다. 임의의 장비를 사용시 비활성화 할 수 있습니다. + 무기를 가지고 있는 모든 인원에게 'ACE_EarPlugs'를 지급합니다. 임의의 장비를 사용시 비활성화할 수 있습니다. 增加`ACE_EarPlugs`物品给拥有巨大噪音武器的单位。当你想自定装备时,此功能可被关闭。 增加`ACE_EarPlugs`物品給擁有巨大噪音武器的單位。當你想自定裝備時,此功能可被關閉。 @@ -286,6 +286,7 @@ Proteção Auditiva Ochrana sluchu Protección auditiva + 청력 보호 Volume muffling @@ -300,6 +301,7 @@ Abafamento de Volume Snížení hlasitosti Atenuación de volumen + 소리 차음도 Earplugs Volume @@ -314,6 +316,7 @@ Volume bouchons anti bruit Hlasitost se špunty Volumen de protectores auditivos + 귀마개 볼륨 Volume when using earplugs. @@ -328,6 +331,7 @@ Volume audio perçu par les joueurs portant des bouchons anti bruit. Hlasitost při používání špuntů do uší. Volumen cuando se utilizan protectores auditivos. + 귀마개 사용 시의 볼륨입니다. Unconscious Volume @@ -342,6 +346,7 @@ Volume inconscience Hlasitost při ztrátě vědomí Volumen inconsciente + 기절 볼륨 Volume when unconscious. @@ -356,6 +361,7 @@ Volume perçu par les joueurs inconscients. Hlasitost během ztráty vědomí. Volumen durante la inconsciencia. + 기절 시 볼륨입니다. diff --git a/addons/hellfire/CfgMagazines.hpp b/addons/hellfire/CfgMagazines.hpp index 6d1651604f..8abf2529b5 100644 --- a/addons/hellfire/CfgMagazines.hpp +++ b/addons/hellfire/CfgMagazines.hpp @@ -1,6 +1,6 @@ class CfgMagazines { class 12Rnd_PG_missiles; - + // Kilo - tandem shaped charge HEAT (anti-tank) class 6Rnd_ACE_Hellfire_AGM114K: 12Rnd_PG_missiles { // Old style vehicle magazine count = 6; @@ -16,7 +16,7 @@ class CfgMagazines { count = 1; mass = 70; pylonWeapon = QGVAR(launcher); - hardpoints[] = {"SCALPEL_1RND"}; + hardpoints[] = {"SCALPEL_1RND", "HellfireRail_MELB"}; model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d"; }; class PylonRack_1Rnd_ACE_Hellfire_AGM114K: 6Rnd_ACE_Hellfire_AGM114K { // 1x Launcher Support Rack @@ -84,7 +84,7 @@ 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; diff --git a/addons/hellfire/CfgWeapons.hpp b/addons/hellfire/CfgWeapons.hpp index a09c642696..fd9bdce044 100644 --- a/addons/hellfire/CfgWeapons.hpp +++ b/addons/hellfire/CfgWeapons.hpp @@ -44,7 +44,7 @@ class CfgWeapons { cursor = "EmptyCursor"; cursorAim = "missile"; showAimCursorInternal = 0; - + // vanilla weapon lock systems weaponLockSystem = 8; cmImmunity = 0.9; diff --git a/addons/hellfire/functions/fnc_attackProfile.sqf b/addons/hellfire/functions/fnc_attackProfile.sqf index b2a08f24a3..28dda99086 100644 --- a/addons/hellfire/functions/fnc_attackProfile.sqf +++ b/addons/hellfire/functions/fnc_attackProfile.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Hellfire attack profile. Handles all 4 modes LOBL, LOAL-DIR, LOAL-HI, LOAL-LO diff --git a/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf b/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf index 066d280d65..fb12cad00f 100644 --- a/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf +++ b/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets attack profile parameters for first run of hellfire attack profile function diff --git a/addons/hellfire/functions/fnc_setupVehicle.sqf b/addons/hellfire/functions/fnc_setupVehicle.sqf index cf0a17a2e7..49eefd8274 100644 --- a/addons/hellfire/functions/fnc_setupVehicle.sqf +++ b/addons/hellfire/functions/fnc_setupVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Adds interaction menu actions to switch the firemode to a vehicle. @@ -41,7 +41,7 @@ if (!_enabled) exitWith {TRACE_3("Not enabled",_enabled,_vehicle,_turretPath);}; // Add laser if vehicle is configured for one: -if ((getNumber (configOf _vehicle >> QGVAR(addLaserDesignator))) == 1) then { +if ((getNumber (configOf _vehicle >> QGVAR(addLaserDesignator))) == 1) then { [{ params ["_vehicle", "_turretPath"]; TRACE_3("checking for laser",_vehicle,_turretPath,_vehicle turretLocal _turretPath); @@ -78,7 +78,7 @@ private _fnc_statement = { }; private _fnc_condition = { params ["_target", "_player", "_attackProfile"]; - + private _turretPath = if (ACE_player == (driver _target)) then {[-1]} else {ACE_player call CBA_fnc_turretPath}; private _hasWeapon = ({(isNumber (configFile >> "CfgWeapons" >> _x >> QGVAR(enabled))) && {getNumber (configFile >> "CfgWeapons" >> _x >> QGVAR(enabled)) > 0}} count (_target weaponsTurret _turretPath)) > 0; diff --git a/addons/hellfire/functions/script_component.hpp b/addons/hellfire/functions/script_component.hpp deleted file mode 100644 index 899f29a758..0000000000 --- a/addons/hellfire/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\hellfire\script_component.hpp" diff --git a/addons/hellfire/stringtable.xml b/addons/hellfire/stringtable.xml index 1f5b495b06..df16c00c9f 100644 --- a/addons/hellfire/stringtable.xml +++ b/addons/hellfire/stringtable.xml @@ -24,6 +24,9 @@ Missile antichar à guidage laser semi-actif (charge HEAT) セミ アクティブ レーダー誘導の対戦車弾頭 Rakieta naprowadzana laserowo z głowicą przeciwpancerną + Halbaktive Laser-Zielsuchrakete mit HEAT-Gefechtskopf + 高爆反坦克弹头半主动激光制导导弹 + 반능동 레이저 유도미사일로 대전차 고폭 탄두를 탑재하고 있습니다. Millimeter-wave radar guided missile with high explosive anti-tank warhead @@ -32,6 +35,9 @@ Missile antichar à guidage radar à ondes courtes (charge HEAT) ミリ波レーダー誘導の対戦車弾頭 Rakieta namierzana radarowo z głowicą przeciwpancerną + Millimeterwellenradar-Lenkflugkörper mit HEAT-Gefechtskopf + 高爆反坦克弹头毫米波雷达制导导弹 + 밀리미터파 레이더 유도 미사일로 대전차 고폭 탄두를 탑재하고 있습니다. Semi-active laser homing missile with metal augmented charge anti-personnel warhead @@ -40,6 +46,9 @@ Missile antipersonnel thermobarique à guidage laser semi-actif セミ アクティブ レーダー誘導の対人弾 Rakieta naprowadzana laserowo z głowicą odłamkową + Halbaktive Laser-Zielsuchrakete mit metallverstärktem Antipersonen-Gefechtskopf + 金属增强人员杀伤弹头半主动激光制导导弹 + 반능동 레이저 유도 미사일로 대인 금속 강화 탄두가 탑재하고 있습니다. diff --git a/addons/hitreactions/XEH_PREP.hpp b/addons/hitreactions/XEH_PREP.hpp index 53f2d60eb6..7701b8ef19 100644 --- a/addons/hitreactions/XEH_PREP.hpp +++ b/addons/hitreactions/XEH_PREP.hpp @@ -1,4 +1,3 @@ PREP(fallDown); PREP(getRandomAnimation); -PREP(throwWeapon); diff --git a/addons/hitreactions/functions/fnc_fallDown.sqf b/addons/hitreactions/functions/fnc_fallDown.sqf index d0f93f6f95..38f3152c7c 100644 --- a/addons/hitreactions/functions/fnc_fallDown.sqf +++ b/addons/hitreactions/functions/fnc_fallDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Adds reactions to a unit that was hit. EH only runs where to unit is local. Adds screams, falling down, falling from ladders, ejecting from static weapons and camshake for players diff --git a/addons/hitreactions/functions/fnc_getRandomAnimation.sqf b/addons/hitreactions/functions/fnc_getRandomAnimation.sqf index bfdfd9646f..8b26bf70ef 100644 --- a/addons/hitreactions/functions/fnc_getRandomAnimation.sqf +++ b/addons/hitreactions/functions/fnc_getRandomAnimation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Get a random fall animation for the unit. diff --git a/addons/hitreactions/functions/fnc_throwWeapon.sqf b/addons/hitreactions/functions/fnc_throwWeapon.sqf deleted file mode 100644 index bc2936e101..0000000000 --- a/addons/hitreactions/functions/fnc_throwWeapon.sqf +++ /dev/null @@ -1,49 +0,0 @@ -#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/functions/script_component.hpp b/addons/hitreactions/functions/script_component.hpp deleted file mode 100644 index ba26402e2b..0000000000 --- a/addons/hitreactions/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\hitreactions\script_component.hpp" \ No newline at end of file diff --git a/addons/hitreactions/initSettings.sqf b/addons/hitreactions/initSettings.sqf index 9c067bf5f7..2ca4ceaeac 100644 --- a/addons/hitreactions/initSettings.sqf +++ b/addons/hitreactions/initSettings.sqf @@ -1,7 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), QUOTE(COMPONENT_BEAUTIFIED)]; + [ QGVAR(minDamageToTrigger), "SLIDER", LSTRING(minDamageToTrigger_displayName), - "ACE Uncategorized", + _category, [-1, 1, 0.1, 1], 1 ] call CBA_fnc_addSetting; diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml index 4abcd17cac..3b8018a936 100644 --- a/addons/hitreactions/stringtable.xml +++ b/addons/hitreactions/stringtable.xml @@ -7,10 +7,10 @@ 觸發倒下前最低需受到多少傷害 触发倒下前最低需受到多少伤害 崩れ落ちるまでの最低損傷値 - 방아쇠를 당기는 최소한의 피해 + 넘어질 때 발생하는 최소 피해량 Mindestschaden, um Sturz auszulösen Minimalne obrażenie, żeby aktywować spadanie - Минимальный урон для активации падения + Мин. урон для активации падения Dano Mínimo para ativar queda Dommages minimaux pour faire tomber le joueur Minimum škody pro aktivaci spadnutí diff --git a/addons/hot/CfgAmmo.hpp b/addons/hot/CfgAmmo.hpp index dee076be0e..1be8c6067f 100644 --- a/addons/hot/CfgAmmo.hpp +++ b/addons/hot/CfgAmmo.hpp @@ -112,7 +112,7 @@ class CfgAmmo { EGVAR(frag,metal) = 7100; // 1000 steel balls EGVAR(frag,charge) = 4100; EGVAR(frag,gurney_c) = 2700; - EGVAR(frag,gurney_k) = 3/5; + EGVAR(frag,gurney_k) = "3/5"; EGVAR(frag,classes)[] = {"ACE_frag_small"}; displayName = CSTRING(hot2mp); diff --git a/addons/hot/CfgWeapons.hpp b/addons/hot/CfgWeapons.hpp index 1263ef8dea..d172de7fa1 100644 --- a/addons/hot/CfgWeapons.hpp +++ b/addons/hot/CfgWeapons.hpp @@ -12,7 +12,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}; @@ -45,7 +45,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}; @@ -54,7 +54,7 @@ class CfgWeapons { cursor = "EmptyCursor"; cursorAim = "missile"; showAimCursorInternal = 0; - + autoReload = 1; magazineReloadTime = 20; }; diff --git a/addons/hot/config.cpp b/addons/hot/config.cpp index c61886cd26..bdb7ad956f 100644 --- a/addons/hot/config.cpp +++ b/addons/hot/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common","ace_missileguidance"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/hot/stringtable.xml b/addons/hot/stringtable.xml index 816c2e9b01..85c8690fef 100644 --- a/addons/hot/stringtable.xml +++ b/addons/hot/stringtable.xml @@ -6,42 +6,48 @@ 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 + Semi-automatic command to line of sight (SACLOS) Halbautomatische Steuerung über Sichtverbindung (SACLOS) Semi-automatyczna komenda do pola widzenia Comando Semi-Automatico via Contatto Visivo(SACLOS) - 半自動指令照準線一致誘導方式 + 半自動指令照準線一致誘導方式 (SACLOS) Полуавтоматическое командное наведение по линии визирования (SACLOS) Comando semi-automático para a linha de visão (SACLOS) 視線內半自動指令 + 半自动指令到视线(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 Görüş alanına yarı otomatik komut + 반자동 가시선 지령 유도방식 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 @@ -52,10 +58,12 @@ Ракета HOT Míssil HOT 高次音速(HOT)飛彈 + 高次音速(HOT)导弹 Missile HOT HOT Střela HOT Missile Misil HOT + HOT 미사일 HOT 1 @@ -67,9 +75,11 @@ HOT 1 HOT 1 HOT 1 + HOT 1 HOT 1 HOT 1 HOT 1 + HOT 1 HOT 2 @@ -81,9 +91,11 @@ HOT 2 HOT 2 HOT 2 + HOT 2 HOT 2 HOT 2 HOT 2 + HOT 2 HOT 2MP @@ -95,9 +107,11 @@ HOT 2MP HOT 2MP HOT 2MP + HOT 2MP HOT 2MP HOT 2MP HOT 2MP + HOT 2MP HOT 3 @@ -109,23 +123,27 @@ 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] @@ -137,9 +155,11 @@ 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] @@ -151,9 +171,11 @@ 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] @@ -165,9 +187,11 @@ 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] @@ -179,9 +203,11 @@ 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] @@ -193,9 +219,11 @@ 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] @@ -207,9 +235,11 @@ 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] @@ -221,9 +251,11 @@ 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] @@ -235,9 +267,11 @@ 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] @@ -249,9 +283,11 @@ 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] @@ -263,9 +299,11 @@ 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] @@ -277,9 +315,11 @@ 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] @@ -291,9 +331,11 @@ 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/hunterkiller/$PBOPREFIX$ b/addons/hunterkiller/$PBOPREFIX$ new file mode 100644 index 0000000000..3474867891 --- /dev/null +++ b/addons/hunterkiller/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\hunterkiller \ No newline at end of file diff --git a/addons/hunterkiller/CfgEventHandlers.hpp b/addons/hunterkiller/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a3f71f852 --- /dev/null +++ b/addons/hunterkiller/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/hunterkiller/CfgVehicles.hpp b/addons/hunterkiller/CfgVehicles.hpp new file mode 100644 index 0000000000..4ba64d8a95 --- /dev/null +++ b/addons/hunterkiller/CfgVehicles.hpp @@ -0,0 +1,24 @@ +class CfgVehicles { + class Tank_F; + class MBT_01_base_F: Tank_F { + ADDON = 1; // same as ADDON[] = {{{0}, 1}, {{0,0}, 3}}; + }; + class MBT_01_arty_base_F: MBT_01_base_F { + ADDON = 0; + }; + class MBT_01_mlrs_base_F: MBT_01_base_F { + ADDON = 0; + }; + class MBT_02_base_F: Tank_F { + ADDON = 1; + }; + class MBT_02_arty_base_F: MBT_02_base_F { + ADDON = 0; + }; + class MBT_03_base_F: Tank_F { + ADDON = 1; + }; + class MBT_04_base_F: Tank_F { + ADDON = 1; + }; +}; diff --git a/addons/hunterkiller/README.md b/addons/hunterkiller/README.md new file mode 100644 index 0000000000..293192db4e --- /dev/null +++ b/addons/hunterkiller/README.md @@ -0,0 +1,4 @@ +ace_hunterkiller +========== + +Allows a tank commander to re-aim the main turret or to aim their turret at the what the main turret is looking at diff --git a/addons/hunterkiller/XEH_PREP.hpp b/addons/hunterkiller/XEH_PREP.hpp new file mode 100644 index 0000000000..e0d7cd892e --- /dev/null +++ b/addons/hunterkiller/XEH_PREP.hpp @@ -0,0 +1,5 @@ +LOG("prep"); + +PREP(keydown); +PREP(slew); +PREP(turretChangedEH); diff --git a/addons/hunterkiller/XEH_postInit.sqf b/addons/hunterkiller/XEH_postInit.sqf new file mode 100644 index 0000000000..1560b6cc54 --- /dev/null +++ b/addons/hunterkiller/XEH_postInit.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +[QGVAR(slew), LINKFUNC(slew)] call CBA_fnc_addEventHandler; + +if (!hasInterface) exitWith {}; + +GVAR(mode) = 0; +GVAR(targetTurret) = []; + +["CBA_settingsInitialized", { + ["turret", LINKFUNC(turretChangedEH), true] call CBA_fnc_addPlayerEventHandler; +}] call CBA_fnc_addEventHandler; + + +["ACE3 Vehicles", QGVAR(observe), [format ["%1 - %2", LLSTRING(displayName), LLSTRING(observe)], LLSTRING(observe_description)], +{ + [false] call FUNC(keyDown) +}, { + false +}, [DIK_Q, [false, false, false]]] call CBA_fnc_addKeybind; + +["ACE3 Vehicles", QGVAR(override), [format ["%1 - %2", LLSTRING(displayName), LLSTRING(override)], LLSTRING(override_description)], +{ + [true] call FUNC(keyDown) +}, { + false +}, [DIK_E, [false, false, false]]] call CBA_fnc_addKeybind; diff --git a/addons/hunterkiller/XEH_preInit.sqf b/addons/hunterkiller/XEH_preInit.sqf new file mode 100644 index 0000000000..b47cf6628d --- /dev/null +++ b/addons/hunterkiller/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/hunterkiller/XEH_preStart.sqf b/addons/hunterkiller/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/hunterkiller/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/hunterkiller/config.cpp b/addons/hunterkiller/config.cpp new file mode 100644 index 0000000000..ff31bbede3 --- /dev/null +++ b/addons/hunterkiller/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/hunterkiller/functions/fnc_keydown.sqf b/addons/hunterkiller/functions/fnc_keydown.sqf new file mode 100644 index 0000000000..8e2255739a --- /dev/null +++ b/addons/hunterkiller/functions/fnc_keydown.sqf @@ -0,0 +1,53 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Slew keybind pressed + * + * Arguments: + * 0: Override if true, Observe if false + * + * Return Value: + * None + * + * Example: + * [true] call ace_hunterkiller_fnc_keydown + * + * Public: No + */ + +if ( + (GVAR(mode) == MODE_NO_ACTIONS) + || {!([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith))} + || {isTurnedOut ACE_player} +) exitWith { + false +}; + +params ["_modeOverride"]; +TRACE_1("keydown",_modeOverride); +if ((_modeOverride) && {!(GVAR(mode) in [MODE_OVERRIDE, MODE_OBSERVE_AND_OVERRIDE])}) exitWith { false }; +if ((!_modeOverride) && {!(GVAR(mode) in [MODE_OBSERVE, MODE_OBSERVE_AND_OVERRIDE])}) exitWith { false }; + +private _vehicle = vehicle ACE_player; +private _playerTurret = _vehicle unitTurret ACE_player; + +private _sourceTurret = [GVAR(targetTurret), _playerTurret] select _modeOverride; +private _puppetTurret = [_playerTurret, GVAR(targetTurret)] select _modeOverride; +TRACE_3("",_modeOverride,_sourceTurret,_puppetTurret); + +private _eyePos = eyePos _vehicle; +private _lookDir = if ((getNumber (([_vehicle, _sourceTurret] call CBA_fnc_getTurret) >> "primaryObserver")) == 1) then { + TRACE_1("using commander",_sourceTurret); + // CBA_fnc_turretDir fails on "CUP_B_M1A2SEP_TUSK_II_NATO", but eyeDirection should be correct on commander turrets + eyeDirection _vehicle +} else { + ([1] + ([_vehicle, _sourceTurret] call CBA_fnc_turretDir)) call CBA_fnc_polar2vect +}; +private _lookPoint = _eyePos vectorAdd (_lookDir vectorMultiply 5000); + +TRACE_1("sending event",_lookDir); +[QGVAR(slew), [_vehicle, _puppetTurret, _lookPoint, _modeOverride], _vehicle, _puppetTurret] call CBA_fnc_turretEvent; + +playSound "ACE_Sound_Click"; + +true // return (key used) diff --git a/addons/hunterkiller/functions/fnc_slew.sqf b/addons/hunterkiller/functions/fnc_slew.sqf new file mode 100644 index 0000000000..11c53001e5 --- /dev/null +++ b/addons/hunterkiller/functions/fnc_slew.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Slews turret to target pos and shows visual feedback + * + * Arguments: + * 0: Vehicle + * 1: Turret (will be local) + * 2: Look PosASL + * 3: Override + * + * Return Value: + * None + * + * Example: + * [vehicle, [0], [0,0,0], true] call ace_hunterkiller_fnc_slew + * + * Public: No + */ + +params ["_vehicle", "_turret", "_posASL", "_isOverride"]; +TRACE_4("slew",_vehicle,_turret,_posASL,_isOverride); + +_vehicle lockCameraTo [_posASL, _turret, true]; + +if (hasInterface && {(_vehicle turretUnit _turret) isEqualTo ace_player}) then { + private _displayText = if (_isOverride) then { LLSTRING(override) } else { LLSTRING(observe) }; + QGVAR(text) cutText [format ["




[%1]", _displayText], "PLAIN", -1, false, true]; + [{ + QGVAR(text) cutText ["", "PLAIN"]; + }, [], 1] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/hunterkiller/functions/fnc_turretChangedEH.sqf b/addons/hunterkiller/functions/fnc_turretChangedEH.sqf new file mode 100644 index 0000000000..2bc00fc26f --- /dev/null +++ b/addons/hunterkiller/functions/fnc_turretChangedEH.sqf @@ -0,0 +1,52 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Turret changed event handler. Determine if in a master turret + * + * Arguments: + * 0: Unit + * 1: Turret + * + * Return Value: + * None + * + * Example: + * [player, [0]] call ace_hunterkiller_fnc_turretChangedEH + * + * Public: No + */ + +params ["_player", "_playerTurret"]; +TRACE_2("turretChangedEH",_player,_playerTurret); + +GVAR(mode) = 0; +GVAR(targetTurret) = []; + +if (_playerTurret isEqualTo []) exitWith {}; +private _vehicle = vehicle _player; +private _config = configOf _vehicle; + +// setVar can be real array or true/false +private _hkArray = _vehicle getVariable [QUOTE(ADDON), nil]; +if (isNil "_hkArray") then { + _hkArray = if (isArray (_config >> QUOTE(ADDON))) then { + getArray (_config >> QUOTE(ADDON)) + } else { + ((getNumber (_config >> QUOTE(ADDON))) == 1) + }; +}; +if (_hkArray isEqualTo true) then { _hkArray = [[[0], 1], [[0,0], 3]]; }; +if (_hkArray isEqualTo false) then { _hkArray = []; }; + +TRACE_1("",_hkArray); +if ((count _hkArray) != 2) exitWith {}; + +{ + _x params ["_xTurret", "_xMode"]; + TRACE_2("x",_playerTurret,_xTurret); + if (_xTurret isEqualTo _playerTurret) exitWith { + TRACE_3("seat active",typeOf _vehicle,_xTurret,_xMode); + GVAR(mode) = _xMode; + GVAR(targetTurret) = _hkArray # ((_forEachIndex + 1) % 2) # 0; + }; +} forEach _hkArray; diff --git a/addons/hunterkiller/script_component.hpp b/addons/hunterkiller/script_component.hpp new file mode 100644 index 0000000000..75f4a0ead5 --- /dev/null +++ b/addons/hunterkiller/script_component.hpp @@ -0,0 +1,14 @@ +#define COMPONENT hunterkiller +#define COMPONENT_BEAUTIFIED Hunter Killer +#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" + +#define MODE_NO_ACTIONS 0 +#define MODE_OBSERVE 1 +#define MODE_OVERRIDE 2 +#define MODE_OBSERVE_AND_OVERRIDE 3 diff --git a/addons/hunterkiller/stringtable.xml b/addons/hunterkiller/stringtable.xml new file mode 100644 index 0000000000..83c43a0bd7 --- /dev/null +++ b/addons/hunterkiller/stringtable.xml @@ -0,0 +1,50 @@ + + + + + Hunter Killer + 헌터 킬러 + Hunter Killer + Hunter Killer + ハンターキラー + Hunter Killer + Hunter Killer + + + Override + 오버라이드 + Указать + Anular + オーバーライド + Nadpisanie + Überschreibe + + + Force other turret to slew onto your viewpoint + 다른 포탑이 시야에 오도록 강제합니다. + Повернуть другую турель туда, куда смотрит твоя + Forzar otra torreta a dirigirse hacia tu zona de apuntado. + 他のタレットを強制的に自分の視点に旋回させる + Obróć drugą wieżyczkę w kierunku, w którym zwrócona jest twoja wieżyczka. + Zwingt andere Türme, sich auf deine Blickrichtung zu drehen + + + Observe + 관측 + Наблюдать + Observar + オブザーブ + Obserwowanie + Observiere + + + Slew your turret onto other turret's viewpoint + 포탑을 다른 포탑의 시야에 놓습니다. + Повернуть свою турель туда, куда смотрит другая + Dirigir tu propia torreta hacia la zona de apuntado de otra torreta. + 自分のタレットを相手のタレットの視点に旋回させる。 + Obróć swoją wieżyczkę tam, gdzie patrzy druga. + Richtet deinen Turm auf die Blickrichtung eines anderen Turms + + + diff --git a/addons/huntir/CfgMagazineWells.hpp b/addons/huntir/CfgMagazineWells.hpp index 2d336054df..4bd116e7a8 100644 --- a/addons/huntir/CfgMagazineWells.hpp +++ b/addons/huntir/CfgMagazineWells.hpp @@ -4,5 +4,5 @@ class CfgMagazineWells { }; 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 03243cfbdd..2a30cec6fa 100644 --- a/addons/huntir/CfgVehicles.hpp +++ b/addons/huntir/CfgVehicles.hpp @@ -24,10 +24,10 @@ class CfgVehicles { displayName = "HuntIR"; model = QPATHTOF(data\huntir.p3d); scope = 1; - soundCrash[] = {"", db-30, 1 }; + soundCrash[] = {"", "db-30", 1 }; soundEnviron[] = {"z\ace\addons\apl\sounds\padak_let", 0.316228, 1, 80}; - soundLandCrash[] = {"", db-30, 1 }; - soundWaterCrash[] = {"", db10, 1 }; + soundLandCrash[] = {"", "db-30", 1 }; + soundWaterCrash[] = {"", "db-10", 1 }; class HitPoints { class HitEngine { armor = 0; diff --git a/addons/huntir/CfgWeapons.hpp b/addons/huntir/CfgWeapons.hpp index 7cda0e7066..666e09bd84 100644 --- a/addons/huntir/CfgWeapons.hpp +++ b/addons/huntir/CfgWeapons.hpp @@ -10,6 +10,7 @@ class CfgWeapons { picture = QPATHTOF(UI\w_huntir_monitor_ca.paa); descriptionShort = CSTRING(monitor_displayName); model = QPATHTOF(data\ace_huntir_monitor.p3d); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 20; diff --git a/addons/huntir/Dialog.hpp b/addons/huntir/Dialog.hpp index 18c5ac1339..e6cc28e327 100644 --- a/addons/huntir/Dialog.hpp +++ b/addons/huntir/Dialog.hpp @@ -64,33 +64,33 @@ class GVAR(cam_dialog) { controlsBackground[] = { }; objects[] = { }; controls[] = { - TOP_BORDER, - BOTTOM_BORDER, - LEFT_BORDER, - RIGHT_BORDER, - //HELP_DIALOG, - CAM_BG, - CAM_HEIGHT, - CAM_ALT, - CAM_No, - CAM_NO_x, - CAM_TIME_REMAIN, - CAM_TIME, - CAM_ZOOM, - ZOOM_X, - CAM_POS, - CAM_POS_X, - CAM_DIR, - CAM_DIR_x + "TOP_BORDER", + "BOTTOM_BORDER", + "LEFT_BORDER", + "RIGHT_BORDER", + //"HELP_DIALOG", + "CAM_BG", + "CAM_HEIGHT", + "CAM_ALT", + "CAM_No", + "CAM_NO_x", + "CAM_TIME_REMAIN", + "CAM_TIME", + "CAM_ZOOM", + "ZOOM_X", + "CAM_POS", + "CAM_POS_X", + "CAM_DIR", + "CAM_DIR_x" }; class TOP_BORDER { idc = -1; type = CT_STATIC; style = ST_CENTER; - x = __XA; - y = __Y; - w = __WA; + x = QUOTE(__XA); + y = QUOTE(__Y); + w = QUOTE(__WA); h = 0.08; font = FontM; sizeEx = 0.04; @@ -100,17 +100,17 @@ class GVAR(cam_dialog) { blinkingPeriod = 0; }; class BOTTOM_BORDER: TOP_BORDER { - y = __Y + __H - 0.05; + y = QUOTE(__Y + __H - 0.05); h = 0.05; }; class LEFT_BORDER: TOP_BORDER { - w = (abs(__XA) - abs(__X)) + 0.05; - h = __H; + w = QUOTE((abs(__XA) - abs(__X)) + 0.05); + h = QUOTE(__H); }; class RIGHT_BORDER: TOP_BORDER { - x = __X + __W - 0.05; - w = (__WA - __W) + 0.05; - h = __H; + x = QUOTE(__X + __W - 0.05); + w = QUOTE((__WA - __W) + 0.05); + h = QUOTE(__H); }; class HELP_DIALOG { idc = -1; @@ -135,8 +135,10 @@ class GVAR(cam_dialog) { soundPush[] = { "buttonpushed.ogg", 0.1, 1 }; soundClick[] = { "", 0, 1 }; soundEscape[] = { "", 0, 1 }; - x = __X + (2*0.8); y = __Y + 0.045; - w = 0.05; h = 0.02; + x = QUOTE(__X + (2*0.8)); + y = QUOTE(__Y + 0.045); + w = 0.05; + h = 0.02; text = CSTRING(HELP); action = QUOTE(createDialog QQGVAR(help_dialog)); }; @@ -149,10 +151,10 @@ class GVAR(cam_dialog) { font = "RobotoCondensed"; sizeEx = 0.021; lineSpacing = 1; - x = __X; - y = __Y + 0.08; - w = __W; - h = __H + 0.2; + x = QUOTE(__X); + y = QUOTE(__Y + 0.08); + w = QUOTE(__W); + h = QUOTE(__H + 0.2); border = 0; text = QPATHTOF(UI\ace_huntir_monitor_on.paa); }; @@ -164,65 +166,65 @@ class GVAR(cam_dialog) { colorText[] = {1, 1, 1, 1}; font = FontM; sizeEx = 0.02; - x = __X + 0.42; - y = __Y + 0.32; + x = QUOTE(__X + 0.42); + y = QUOTE(__Y + 0.32); w = 0.08; h = 0.04; text = ""; blinkingPeriod = 0; }; class CAM_ALT: CAM_HEIGHT { - x = __X + 0.35; + x = QUOTE(__X + 0.35); text = CSTRING(ALT); }; class CAM_No: CAM_HEIGHT { - x = __X + __W - 0.64; + x = QUOTE(__X + __W - 0.64); text = CSTRING(CAM); }; class CAM_NO_x: CAM_HEIGHT { idc = 2; - x = __X + __W - 0.56; - y = __Y + 0.32; + x = QUOTE(__X + __W - 0.56); + y = QUOTE(__Y + 0.32); text = ""; }; class CAM_TIME: CAM_HEIGHT { - x = __X + 0.35; - y = __Y + __H - 0.65; + x = QUOTE(__X + 0.35); + y = QUOTE(__Y + __H - 0.65); w = 0.12; text = CSTRING(TIME); }; class CAM_TIME_REMAIN: CAM_TIME { idc = 3; - x = __X + 0.46; + x = QUOTE(__X + 0.46); text = ""; }; class CAM_ZOOM: CAM_No { - y = __Y + 0.36; + y = QUOTE(__Y + 0.36); text = "Zoom:"; }; class ZOOM_X: CAM_ZOOM { idc = 4; - x = __X + __W - 0.56; + x = QUOTE(__X + __W - 0.56); text = ""; }; class CAM_POS: CAM_HEIGHT { - x = __X + 0.35; - y = __Y + 0.36; + x = QUOTE(__X + 0.35); + y = QUOTE(__Y + 0.36); text = "GPS Pos:"; }; class CAM_POS_X: CAM_POS { idc = 5; - x = __X + 0.42; + x = QUOTE(__X + 0.42); w = 0.16; text = ""; }; class CAM_DIR: CAM_POS { - y = __Y + 0.4; + y = QUOTE(__Y + 0.4); text = ""; //"Az:"; }; class CAM_DIR_x: CAM_DIR { idc = 6; - x = __X + 0.42; + x = QUOTE(__X + 0.42); w = 0.16; text = ""; }; @@ -231,14 +233,14 @@ class GVAR(cam_dialog) { class GVAR(cam_dialog_inactive): GVAR(cam_dialog) { idd = 18881; controls[] = { - TOP_BORDER, - BOTTOM_BORDER, - LEFT_BORDER, - RIGHT_BORDER, - //HELP_DIALOG, - //PRESS_HELP, - CAM_BG, - SEARCHING_CAM + "TOP_BORDER", + "BOTTOM_BORDER", + "LEFT_BORDER", + "RIGHT_BORDER", + //"HELP_DIALOG", + //"PRESS_HELP", + "CAM_BG", + "SEARCHING_CAM" }; class TOP_BORDER: TOP_BORDER {}; @@ -249,8 +251,8 @@ class GVAR(cam_dialog_inactive): GVAR(cam_dialog) { idc = -1; type = CT_STATIC; style = ST_LEFT; - x = __X + (__W - 0.2); - y = __Y + 0.06; + x = QUOTE(__X + (__W - 0.2)); + y = QUOTE(__Y + 0.06); w = 0.4; h = 0.02; font = FontM; @@ -264,8 +266,8 @@ class GVAR(cam_dialog_inactive): GVAR(cam_dialog) { idc = -1; type = CT_STATIC; style = ST_LEFT; - x = __X + (__W - 0.2); - y = __Y + 0.03; + x = QUOTE(__X + (__W - 0.2)); + y = QUOTE(__Y + 0.03); w = 0.4; h = 0.02; font = FontM; @@ -282,8 +284,8 @@ class GVAR(cam_dialog_inactive): GVAR(cam_dialog) { style = ST_LEFT; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0,0,0,0}; - x = __X + (__W/2) - 0.07; - y = __Y + (__H/2); + x = QUOTE(__X + (__W/2) - 0.07); + y = QUOTE(__Y + (__H/2)); w = 0.6; h = 0.08; font = FontM; @@ -296,13 +298,13 @@ class GVAR(cam_dialog_inactive): GVAR(cam_dialog) { class GVAR(cam_dialog_off): GVAR(cam_dialog_inactive) { idd = 18882; controls[] = { - TOP_BORDER, - BOTTOM_BORDER, - LEFT_BORDER, - RIGHT_BORDER, - //HELP_DIALOG, - //PRESS_HELP, - CAM_BG + "TOP_BORDER", + "BOTTOM_BORDER", + "LEFT_BORDER", + "RIGHT_BORDER", + //"HELP_DIALOG", + //"PRESS_HELP", + "CAM_BG" }; class TOP_BORDER: TOP_BORDER {}; @@ -317,30 +319,30 @@ class GVAR(cam_dialog_off): GVAR(cam_dialog_inactive) { class GVAR(help_dialog): GVAR(cam_dialog) { idd = -1; controls[] = { - TOP_BORDER, - BOTTOM_BORDER, - LEFT_BORDER, - RIGHT_BORDER, - CAM_BG, - CAM_HEIGHT, - CAM_ALT, - CAM_TIME_REMAIN, - CAM_TIME, - CAM_ZOOM, - ZOOM_X, - CAM_POS, - CAM_POS_x, - CAM_No, - CAM_No_X, - CAM_DIR, - CAM_DIR_x, - HELP0, - HELP1, - HELP2, - HELP3, - HELP4, - HELP5, - HELP6 + "TOP_BORDER", + "BOTTOM_BORDER", + "LEFT_BORDER", + "RIGHT_BORDER", + "CAM_BG", + "CAM_HEIGHT", + "CAM_ALT", + "CAM_TIME_REMAIN", + "CAM_TIME", + "CAM_ZOOM", + "ZOOM_X", + "CAM_POS", + "CAM_POS_x", + "CAM_No", + "CAM_No_X", + "CAM_DIR", + "CAM_DIR_x", + "HELP0", + "HELP1", + "HELP2", + "HELP3", + "HELP4", + "HELP5", + "HELP6" }; class TOP_BORDER: TOP_BORDER {}; class BOTTOM_BORDER: BOTTOM_BORDER {}; @@ -363,8 +365,8 @@ class GVAR(help_dialog): GVAR(cam_dialog) { idc = -1; type = CT_STATIC; style = ST_LEFT; - x = __X + (__W - 0.3); - y = __Y + 0.03; + x = QUOTE(__X + (__W - 0.3)); + y = QUOTE(__Y + 0.03); w = 0.4; h = 0.03; font = FontM; @@ -375,27 +377,27 @@ class GVAR(help_dialog): GVAR(cam_dialog) { blinkingPeriod = 0; }; class HELP1: HELP0 { - y = __Y + 0.06; + y = QUOTE(__Y + 0.06); text = CSTRING(HELP_ZOOM); }; class HELP2: HELP0 { - y = __Y + 0.09; + y = QUOTE(__Y + 0.09); text = CSTRING(HELP_CAM); }; class HELP3: HELP0 { - y = __Y + 0.12; + y = QUOTE(__Y + 0.12); text = CSTRING(HELP_ROT); }; class HELP4: HELP0 { - y = __Y + 0.15; + y = QUOTE(__Y + 0.15); text = CSTRING(HELP_ELV); }; class HELP5: HELP0 { - y = __Y + 0.18; + y = QUOTE(__Y + 0.18); text = CSTRING(HELP_MOD); }; class HELP6: HELP0 { - y = __Y + 0.21; + y = QUOTE(__Y + 0.21); text = CSTRING(HELP_RES); }; }; diff --git a/addons/huntir/RscTitles.hpp b/addons/huntir/RscTitles.hpp index 7d2e06fa6b..e9ad860d68 100644 --- a/addons/huntir/RscTitles.hpp +++ b/addons/huntir/RscTitles.hpp @@ -14,7 +14,10 @@ class RscTitles { type = 0; idc = 64432; style = 0; - x = 0.497;y = 0.297;w = 0.2;h = 0.2; + x = 0.497; + y = 0.297; + w = 0.2; + h = 0.2; font = "RobotoCondensed"; sizeEx = __FONTHEIGHT; colorText[] = {1, 1, 1, 1}; @@ -23,17 +26,20 @@ class RscTitles { }; class CHAR_E: CHAR_N { idc = 64433; - x = 0.697;y = 0.497; + x = 0.697; + y = 0.497; text = "E"; }; class CHAR_S: CHAR_N { idc = 64434; - x = 0.497;y = 0.697; + x = 0.497; + y = 0.697; text = "S"; }; class CHAR_W: CHAR_N { idc = 64435; - x = 0.297;y = 0.497; + x = 0.297; + y = 0.497; text = "W"; }; }; diff --git a/addons/huntir/functions/fnc_cam.sqf b/addons/huntir/functions/fnc_cam.sqf index ca027b23ab..54b6516fff 100644 --- a/addons/huntir/functions/fnc_cam.sqf +++ b/addons/huntir/functions/fnc_cam.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Norrin, Rocko, Ruthberg * diff --git a/addons/huntir/functions/fnc_handleFired.sqf b/addons/huntir/functions/fnc_handleFired.sqf index 42c6bf3c84..d39be47b15 100644 --- a/addons/huntir/functions/fnc_handleFired.sqf +++ b/addons/huntir/functions/fnc_handleFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Norrin, Rocko, Ruthberg * diff --git a/addons/huntir/functions/fnc_huntir.sqf b/addons/huntir/functions/fnc_huntir.sqf index 221bc5ccec..60b7a1fc14 100644 --- a/addons/huntir/functions/fnc_huntir.sqf +++ b/addons/huntir/functions/fnc_huntir.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Norrin, Rocko, Ruthberg * diff --git a/addons/huntir/functions/fnc_huntirCompass.sqf b/addons/huntir/functions/fnc_huntirCompass.sqf index 9a7882f45c..8dac53b41b 100644 --- a/addons/huntir/functions/fnc_huntirCompass.sqf +++ b/addons/huntir/functions/fnc_huntirCompass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Norrin, Rocko, Ruthberg * diff --git a/addons/huntir/functions/fnc_keyPressed.sqf b/addons/huntir/functions/fnc_keyPressed.sqf index edfa39c534..70f9e75afc 100644 --- a/addons/huntir/functions/fnc_keyPressed.sqf +++ b/addons/huntir/functions/fnc_keyPressed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Norrin, Rocko * Handles the HuntIR monitor key interaction diff --git a/addons/huntir/functions/script_component.hpp b/addons/huntir/functions/script_component.hpp deleted file mode 100644 index 29e0fbff41..0000000000 --- a/addons/huntir/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\huntir\script_component.hpp" \ No newline at end of file diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml index 0ee91b8b95..57440b7bfa 100644 --- a/addons/huntir/stringtable.xml +++ b/addons/huntir/stringtable.xml @@ -13,7 +13,7 @@ HuntIR Transport Box Caixa de transporte do HuntIR HuntIR 輸送箱 - HuntIR 수송함 + HuntIR 운반함 高空战术摄像头运输箱 高空戰術成像器運輸箱 HuntIR Taşıma Kutusu @@ -82,7 +82,7 @@ Câmera: カメラ: 카메라: - 摄像头: + 摄像头: 攝影機: Kamera: @@ -99,7 +99,7 @@ Altitude: 高度: 고도: - 高度: + 高度: 高度: Yükseklik: @@ -116,7 +116,7 @@ Tempo de gravação: 録画時間: 녹화시간: - 记录时间: + 记录时间: 記錄時間: Kayıt süresi: @@ -133,7 +133,7 @@ Pressione ESC para sair da câmera ESC を押しカメラを抜ける ESC를 눌러 카메라 나가기 - 按下ESC退出摄像头 + 按下 ESC 退出摄像头 按下ESC退出攝影機 ESC'ye basarak çıkış yap @@ -167,7 +167,7 @@ A/D - Troca zoom A/D - 倍率の変更 A/D - 줌 전환 - A/D - 切换放大倍率 + A/D—切换放大倍率 A/D - 切換放大倍率 A/D Uzaklığı değiştir @@ -184,7 +184,7 @@ W/S - Seleciona câmera W/S - カメラを選択 W/S - 카메라 선택 - W/S - 切换摄像头 + W/S—切换摄像头 W/S - 切換攝影機 W/S- Kamerayı seç @@ -201,7 +201,7 @@ Esquerda/Direita - Rotaciona câmera Left/Right - カメラ回転 좌/우 - 카메라 돌리기 - 左/右 - 旋转摄像头 + 左/右—旋转摄像头 左/右 - 旋轉攝影機 Sol/Sağ Kamerayı döndür @@ -210,7 +210,7 @@ Hoch/Runter - Neige Kamera Up/Down - Subir/bajar camara Nahoru/Dolu - Zvýšít/snížit úhel pohledu kamery - Вверх/Вниз - Поднять/Опустить камеру + Вверх/Вниз - Поднять/опустить камеру Up/Down - Alza/abbassa telecamera Góra/Dół - obrót kamery w pionie Haut/Bas - Monter/descendre la caméra @@ -218,7 +218,7 @@ Acima/Abaixo - Eleva/Abaixa a câmera Up/Down - カメラ角度を変更 상/하 카메라 올리기/내리기 - 上/下 - 上升/下降摄像头 + 上/下—上升/下降摄像头 上/下 - 上升/下降攝影機 Yukarı/Asağı- Kamerayı yukarı aşağı oynat @@ -235,7 +235,7 @@ N - Troca modo IT N - IT モードを変更 N - IT모드 순환 - N - 切换热显模式 + N—切换热显模式 N - 切換熱顯模式 N- IT modülünü değiştir @@ -252,7 +252,7 @@ R - Redefine a câmera R - カメラを初期化 R - 카메라 초기화 - R - 重置摄像头 + R—重置摄像头 R - 重置攝影機 R- Kamerayı sıfırla @@ -269,7 +269,7 @@ Esc - Sai do Ajuda Esc - ヘルプ終了 Esc - 도움말 나가기 - Esc - 离开帮助 + Esc—离开帮助 Esc - 離開幫助 Esc- Çıkış Yardım diff --git a/addons/huntir/subConfig/config.cpp b/addons/huntir/subConfig/config.cpp index 29a9f0ca25..a75b34f253 100644 --- a/addons/huntir/subConfig/config.cpp +++ b/addons/huntir/subConfig/config.cpp @@ -1,9 +1,8 @@ -#include "\z\ace\addons\huntir\script_component.hpp" -#undef COMPONENT -#define COMPONENT huntir_sub +#define SUBCOMPONENT sub +#include "..\script_component.hpp" class CfgPatches { - class ADDON { + class SUBADDON { name = COMPONENT_NAME; units[] = {}; weapons[] = {}; @@ -12,6 +11,8 @@ class CfgPatches { author = ECSTRING(common,ACETeam); url = ECSTRING(main,URL); VERSION_CONFIG; + + addonRootClass = QUOTE(ADDON); }; }; diff --git a/addons/intelitems/CfgMagazines.hpp b/addons/intelitems/CfgMagazines.hpp index 48a130efa9..cb5bbf495d 100644 --- a/addons/intelitems/CfgMagazines.hpp +++ b/addons/intelitems/CfgMagazines.hpp @@ -6,16 +6,19 @@ class CfgMagazines { ACE_isUnique = 1; GVAR(intel) = 1; GVAR(control) = ""; + scopeArsenal = 0; }; class XGVAR(notepad): GVAR(base) { author = ECSTRING(common,ACETeam); - scope = 2; // Allows players to access from arsenal + scope = 2; + scopeArsenal = 2; // Allows players to access from arsenal displayName = CSTRING(Notepad_DisplayName); descriptionShort = CSTRING(Notepad_Description); picture = QPATHTOF(ui\notepad_ca.paa); model = "\a3\structures_f\items\documents\notepad_f.p3d"; GVAR(control) = QGVAR(RscNotepad); + ACE_isTool = 1; }; class XGVAR(document): GVAR(base) { diff --git a/addons/intelitems/functions/fnc_addActions.sqf b/addons/intelitems/functions/fnc_addActions.sqf index d43d7fc927..6b93a54eb1 100644 --- a/addons/intelitems/functions/fnc_addActions.sqf +++ b/addons/intelitems/functions/fnc_addActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Returns children actions for intel items in the player's inventory. diff --git a/addons/intelitems/functions/fnc_addIntel.sqf b/addons/intelitems/functions/fnc_addIntel.sqf index 101370e135..a697afb5ef 100644 --- a/addons/intelitems/functions/fnc_addIntel.sqf +++ b/addons/intelitems/functions/fnc_addIntel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Adds the given intel item (magazine) to the given unit. @@ -7,7 +7,7 @@ * Arguments: * 0: Unit * 1: Item - * 3: Data + * 2: Data * * Return Value: * Successful diff --git a/addons/intelitems/functions/fnc_attributeFocus.sqf b/addons/intelitems/functions/fnc_attributeFocus.sqf index 798a4d9b28..592811ae09 100644 --- a/addons/intelitems/functions/fnc_attributeFocus.sqf +++ b/addons/intelitems/functions/fnc_attributeFocus.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Initializes the Zeus attributes display for intel objects. @@ -24,7 +24,7 @@ private _object = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); _control ctrlRemoveAllEventHandlers "SetFocus"; private _ctrlLabel = _display displayCtrl IDC_ATTRIBUTE_LABEL; -private _labelText = getText (configFile >> "CfgVehicles" >> typeOf _object >> "Attributes" >> QGVAR(data) >> "displayName"); +private _labelText = getText ((configOf _object) >> "Attributes" >> QGVAR(data) >> "displayName"); _ctrlLabel ctrlSetText _labelText; private _index = _object getVariable [QGVAR(index), -1]; diff --git a/addons/intelitems/functions/fnc_canPickup.sqf b/addons/intelitems/functions/fnc_canPickup.sqf index 5ca78e0045..9bab60af1b 100644 --- a/addons/intelitems/functions/fnc_canPickup.sqf +++ b/addons/intelitems/functions/fnc_canPickup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Checks if the player can pickup an intel object. @@ -18,6 +18,6 @@ params ["_object", "_player"]; -private _magazineClass = getText (configFile >> "CfgVehicles" >> typeOf _object >> QGVAR(magazine)); +private _magazineClass = getText ((configOf _object) >> QGVAR(magazine)); _magazineClass != "" && {_player canAdd _magazineClass} diff --git a/addons/intelitems/functions/fnc_createControl.sqf b/addons/intelitems/functions/fnc_createControl.sqf index c24e9d74e2..b56d3f3681 100644 --- a/addons/intelitems/functions/fnc_createControl.sqf +++ b/addons/intelitems/functions/fnc_createControl.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Creates an intel controls group. diff --git a/addons/intelitems/functions/fnc_deleteControl.sqf b/addons/intelitems/functions/fnc_deleteControl.sqf index 8c93f85fa6..c2b986b21f 100644 --- a/addons/intelitems/functions/fnc_deleteControl.sqf +++ b/addons/intelitems/functions/fnc_deleteControl.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Deletes an intel controls group. @@ -27,7 +27,7 @@ ctrlPosition _controlsGroup params ["_posX", "_posY"]; private _ctrlContent = _controlsGroup controlsGroupCtrl IDC_CONTENT; private _data = ctrlText _ctrlContent; -if !(_data isEqualTo GET_DATA(_index)) then { +if (_data isNotEqualTo GET_DATA(_index)) then { SET_DATA(_index,_data); }; diff --git a/addons/intelitems/functions/fnc_handleLoadout.sqf b/addons/intelitems/functions/fnc_handleLoadout.sqf index 01650d6db4..f4e2ed5b25 100644 --- a/addons/intelitems/functions/fnc_handleLoadout.sqf +++ b/addons/intelitems/functions/fnc_handleLoadout.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles the player loadout changed event. diff --git a/addons/intelitems/functions/fnc_handleMagIndex.sqf b/addons/intelitems/functions/fnc_handleMagIndex.sqf index 4982130428..da47f9c74a 100644 --- a/addons/intelitems/functions/fnc_handleMagIndex.sqf +++ b/addons/intelitems/functions/fnc_handleMagIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Handles assigning a unique intel index to a magazine id. diff --git a/addons/intelitems/functions/fnc_onMouseButtonDown.sqf b/addons/intelitems/functions/fnc_onMouseButtonDown.sqf index 9a0339bff0..02b78678b7 100644 --- a/addons/intelitems/functions/fnc_onMouseButtonDown.sqf +++ b/addons/intelitems/functions/fnc_onMouseButtonDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles the mouse button down event for an intel control. diff --git a/addons/intelitems/functions/fnc_onMouseButtonUp.sqf b/addons/intelitems/functions/fnc_onMouseButtonUp.sqf index d8a04c0784..b8fe39e793 100644 --- a/addons/intelitems/functions/fnc_onMouseButtonUp.sqf +++ b/addons/intelitems/functions/fnc_onMouseButtonUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles the mouse button up event for an intel control. diff --git a/addons/intelitems/functions/fnc_onMouseMoving.sqf b/addons/intelitems/functions/fnc_onMouseMoving.sqf index 1147261e12..673b5718e3 100644 --- a/addons/intelitems/functions/fnc_onMouseMoving.sqf +++ b/addons/intelitems/functions/fnc_onMouseMoving.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles the mouse moving event for an intel control. diff --git a/addons/intelitems/functions/fnc_pickup.sqf b/addons/intelitems/functions/fnc_pickup.sqf index 4d61e3a281..1bb075a10f 100644 --- a/addons/intelitems/functions/fnc_pickup.sqf +++ b/addons/intelitems/functions/fnc_pickup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Picks up an intel object by converting it into a unique magazine. @@ -18,7 +18,7 @@ params ["_object", "_player"]; -private _magazineClass = getText (configFile >> "CfgVehicles" >> typeOf _object >> QGVAR(magazine)); +private _magazineClass = getText ((configOf _object) >> QGVAR(magazine)); private _index = _object getVariable [QGVAR(index), -1]; // Add magazine to inventory and get its id diff --git a/addons/intelitems/functions/fnc_setObjectData.sqf b/addons/intelitems/functions/fnc_setObjectData.sqf index b055e3202c..395195fad5 100644 --- a/addons/intelitems/functions/fnc_setObjectData.sqf +++ b/addons/intelitems/functions/fnc_setObjectData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Sets the intel data for an object. Used by 3DEN and Zeus attributes. diff --git a/addons/intelitems/functions/script_component.hpp b/addons/intelitems/functions/script_component.hpp deleted file mode 100644 index 46ffa36f0b..0000000000 --- a/addons/intelitems/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\intelitems\script_component.hpp" diff --git a/addons/intelitems/gui.hpp b/addons/intelitems/gui.hpp index 2c26b8ccc9..e5e9d4a1f2 100644 --- a/addons/intelitems/gui.hpp +++ b/addons/intelitems/gui.hpp @@ -9,42 +9,42 @@ class GVAR(RscBase): ctrlControlsGroupNoScrollbars { idc = -1; x = 0; y = 0; - w = POS_W(15); - h = POS_H(18); + w = QUOTE(POS_W(15)); + h = QUOTE(POS_H(18)); class controls { class Border: ctrlStatic { idc = IDC_BORDER; x = 0; y = 0; - w = POS_W(15); - h = POS_H(18); + w = QUOTE(POS_W(15)); + h = QUOTE(POS_H(18)); colorBackground[] = {0, 0, 0, 1}; }; class Background: ctrlStatic { idc = IDC_BACKGROUND; - x = pixelW; - y = pixelH; - w = POS_W(15) - 2 * pixelW; - h = POS_H(18) - 2 * pixelH; + x = QUOTE(pixelW); + y = QUOTE(pixelH); + w = QUOTE(POS_W(15) - 2 * pixelW); + h = QUOTE(POS_H(18) - 2 * pixelH); colorBackground[] = {1, 1, 1, 1}; }; class Header: ctrlStatic { idc = IDC_HEADER; - style = ST_MULTI + ST_NO_RECT; + style = QUOTE(ST_MULTI + ST_NO_RECT); x = 0; y = 0; - w = POS_W(14.3); - h = POS_H(0.7); - sizeEx = POS_H(0.65); + w = QUOTE(POS_W(14.3)); + h = QUOTE(POS_H(0.7)); + sizeEx = QUOTE(POS_H(0.65)); colorBackground[] = {0.1, 0.1, 0.1, 1}; }; class Close: ctrlButtonPicture { idc = IDC_CLOSE; text = "\a3\3DEN\Data\Displays\Display3DEN\search_end_ca.paa"; - x = POS_W(14.3); + x = QUOTE(POS_W(14.3)); y = 0; - w = POS_W(0.7); - h = POS_H(0.7); + w = QUOTE(POS_W(0.7)); + h = QUOTE(POS_H(0.7)); offsetPressedX = 0; offsetPressedY = 0; colorBackground[] = {0.1, 0.1, 0.1, 1}; @@ -64,13 +64,13 @@ class GVAR(RscNotepad): GVAR(RscBase) { class Close: Close {}; class Content: ctrlEditMulti { idc = IDC_CONTENT; - style = ST_MULTI + ST_NO_RECT; + style = QUOTE(ST_MULTI + ST_NO_RECT); font = "EtelkaMonospaceProBold"; - x = pixelW; - y = POS_H(0.7); - w = POS_W(15) - 2 * pixelW; - h = POS_H(17.3) - pixelH; - sizeEx = POS_H(0.9); + x = QUOTE(pixelW); + y = QUOTE(POS_H(0.7)); + w = QUOTE(POS_W(15) - 2 * pixelW); + h = QUOTE(POS_H(17.3) - pixelH); + sizeEx = QUOTE(POS_H(0.9)); shadow = 0; colorText[] = {0, 0, 0, 1}; colorBackground[] = {0, 0, 0, 0}; @@ -91,11 +91,11 @@ class GVAR(RscDocument): GVAR(RscBase) { class Content: ctrlStaticMulti { idc = IDC_CONTENT; font = "EtelkaMonospaceProBold"; - x = pixelW; - y = POS_H(0.7); - w = POS_W(15) - 2 * pixelW; - h = POS_H(17.3) - pixelH; - sizeEx = POS_H(0.9); + x = QUOTE(pixelW); + y = QUOTE(POS_H(0.7)); + w = QUOTE(POS_W(15) - 2 * pixelW); + h = QUOTE(POS_H(17.3) - pixelH); + sizeEx = QUOTE(POS_H(0.9)); shadow = 0; colorText[] = {0, 0, 0, 1}; colorBackground[] = {0, 0, 0, 0}; @@ -104,27 +104,27 @@ class GVAR(RscDocument): GVAR(RscBase) { }; class GVAR(RscPhoto): GVAR(RscBase) { - w = POS_W(18); + w = QUOTE(POS_W(18)); class controls: controls { class Border: Border { - w = POS_W(18); + w = QUOTE(POS_W(18)); }; class Background: Background { - w = POS_W(18) - 2 * pixelW; + w = QUOTE(POS_W(18) - 2 * pixelW); }; class Header: Header { text = CSTRING(Photo_DisplayName); - w = POS_W(17.3); + w = QUOTE(POS_W(17.3)); }; class Close: Close { - x = POS_W(17.3); + x = QUOTE(POS_W(17.3)); }; class Content: ctrlStaticPictureKeepAspect { idc = IDC_CONTENT; - x = pixelW; - y = POS_H(0.7); - w = POS_W(18) - 2 * pixelW; - h = POS_H(17.3) - pixelH; + x = QUOTE(pixelW); + y = QUOTE(POS_H(0.7)); + w = QUOTE(POS_W(18) - 2 * pixelW); + h = QUOTE(POS_H(17.3) - pixelH); }; }; }; @@ -160,24 +160,24 @@ class GVAR(RscSetData): RscDisplayAttributes { idc = IDC_ATTRIBUTE_GROUP; x = 0; y = 0; - w = POS_W(26); - h = POS_H(6); + w = QUOTE(POS_W(26)); + h = QUOTE(POS_H(6)); class controls { class Label: RscText { idc = IDC_ATTRIBUTE_LABEL; x = 0; y = 0; - w = POS_W(26); - h = POS_H(1); + w = QUOTE(POS_W(26)); + h = QUOTE(POS_H(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Edit: RscEditMulti { idc = IDC_ATTRIBUTE_EDIT; - x = pixelW; - y = POS_H(1) + pixelH; - w = POS_W(26) - pixelW; - h = POS_H(5) - pixelH; - sizeEx = POS_H(0.9); + x = QUOTE(pixelW); + y = QUOTE(POS_H(1) + pixelH); + w = QUOTE(POS_W(26) - pixelW); + h = QUOTE(POS_H(5) - pixelH); + sizeEx = QUOTE(POS_H(0.9)); }; }; }; diff --git a/addons/intelitems/stringtable.xml b/addons/intelitems/stringtable.xml index 17b705bf79..4bd23367eb 100644 --- a/addons/intelitems/stringtable.xml +++ b/addons/intelitems/stringtable.xml @@ -5,73 +5,97 @@ ACE Intel Items ACE Aufklärungsgegenstände ACE 情報物品 + ACE 情报物品 ACE 機密アイテム ACE Предметы с данными ACE Przedmioty Wywiadu ACE Istihbarat Eşyaları + ACE 정보 아이템 + ACE Objetos de Inteligencia Intel Items Aufklärungsgegenstände 情報物品 + 情报物品 機密アイテム Предметы с данными Przedmioty Wywiadu Istihbarat Eşyaları + 정보 아이템 + Objetos de Inteligencia Notepad Notizblock 筆記本 + 笔记本 メモ Блокнот Notes Not Defteri + 노트패드 + Bloc de notas Notepad - Can access from the map screen Notizblock - Über die Karte abrufbar 筆記本 - 可以透過地圖界面來存取 + 笔记本—可以透过地图界面访问 メモ - マップ画面から確認可能 Блокнот - Можно получить доступ с экрана карты Notes - Dostępne z mapy Not Defteri - Haritadan erişim sağlanabilinir + 노트패드 - 지도에서 확인 가능합니다 + Block de notas - Puede accederse desde la pantalla de mapa Document Dokument 文件 + 文件 資料 Документ Dokument Döküman + 문서 + Documento Printed Document - Can access from the map screen Bedrucktes Dokument - Über die Karte abrufbar 影印文件 - 可以透過地圖界面來存取 + 影印文件—可以透过地图界面访问 メモ - マップ画面から確認可能 Распечатанный документ - Можно получить доступ с экрана карты Wydrukowane Dokumenty - Dostępne z mapy Yazılı Döküman - Haritadan erişim sağlanabilinir + 문서들 - 지도에서 확인 가능합니다 + Documento Impreso - Puede accederse desde la pantalla de mapa Photo Foto 相片 + 照片 写真 Фотография Zdjęcie Fotoğraf + 사진 + Fotografía Photo - Can access from the map screen Foto - Über die Karte abrufbar 相片 - 可以透過地圖界面來存取 + 照片—可以透过地图界面访问 写真 - マップ画面から確認可能 Фотография - Можно получить доступ с экрана карты Zdjęcie - Dostępne z mapy Fotoğraf - Haritadan erişim sağlanabilinir + 사진 - 지도에서 확인 가능합니다 + Fotografía - Puede accederse desde la pantalla de mapa Text @@ -84,17 +108,22 @@ Текст Texto 文字 + 文字 テキスト Yazı + 문자 Photo Filename Foto-Dateiname 相片名稱 + 照片文件名 写真名 Имя файла фотографии Zdjęcie Nazwa Pliku Fotoğraf Dosya Adı + 사진명 + Nombre de fichero de la Fotografía Pick Up @@ -107,8 +136,10 @@ Подобрать Recoger 撿起 + 捡起 拾う Al + 줍기 diff --git a/addons/interact_menu/CursorMenus.hpp b/addons/interact_menu/CursorMenus.hpp index 98f05082a9..79f1109598 100644 --- a/addons/interact_menu/CursorMenus.hpp +++ b/addons/interact_menu/CursorMenus.hpp @@ -9,11 +9,10 @@ class RscTitles { class GVAR(menuBackground) { idd = -1; onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),_this select 0)]); - onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),displayNull)]); fadeIn = 0.25; fadeOut = 0.25; movingEnable = 0; - duration = 10e10; + duration = QUOTE(10e10); name = QGVAR(menuBackground); class controls {}; class controlsBackground { diff --git a/addons/interact_menu/functions/fnc_addActionToClass.sqf b/addons/interact_menu/functions/fnc_addActionToClass.sqf index 69425ea047..93d54c991c 100644 --- a/addons/interact_menu/functions/fnc_addActionToClass.sqf +++ b/addons/interact_menu/functions/fnc_addActionToClass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Insert an ACE action to a class, under a certain path diff --git a/addons/interact_menu/functions/fnc_addActionToObject.sqf b/addons/interact_menu/functions/fnc_addActionToObject.sqf index f3102469a5..d22b77cc83 100644 --- a/addons/interact_menu/functions/fnc_addActionToObject.sqf +++ b/addons/interact_menu/functions/fnc_addActionToObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Insert an ACE action to an object, under a certain config path diff --git a/addons/interact_menu/functions/fnc_addActionToZeus.sqf b/addons/interact_menu/functions/fnc_addActionToZeus.sqf index 538ea5fe16..b4dbb69f4a 100644 --- a/addons/interact_menu/functions/fnc_addActionToZeus.sqf +++ b/addons/interact_menu/functions/fnc_addActionToZeus.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Insert an ACE action to zeus. diff --git a/addons/interact_menu/functions/fnc_addMainAction.sqf b/addons/interact_menu/functions/fnc_addMainAction.sqf index d00cd2b60e..86b37bf416 100644 --- a/addons/interact_menu/functions/fnc_addMainAction.sqf +++ b/addons/interact_menu/functions/fnc_addMainAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas, PabstMirror * Makes sure there is a ACE_MainActions on the object type diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf index 892c26f1d0..82235493e6 100644 --- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf +++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Collect a entire tree of active actions diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 1e1924d8fd..35b0ea7177 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Compile the action menu from config for an object's class @@ -91,6 +91,7 @@ private _recurseFnc = { } else { _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; }; + private _doNotCheckLOS = getNumber (_entryCfg >> "doNotCheckLOS") > 0; _condition = compile _condition; private _children = [_entryCfg, _distance] call _recurseFnc; @@ -106,7 +107,7 @@ private _recurseFnc = { [], _position, _distance, - [_showDisabled,_enableInside,_canCollapse,_runOnHover, false], + [_showDisabled, _enableInside, _canCollapse, _runOnHover, _doNotCheckLOS], _modifierFunction ], _children diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index c3ad9b35e7..75fdb93819 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Compile the self action menu from config for an object's class diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf index 675cebe61f..e4b926b3e3 100644 --- a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Compile the zeus action menu (only to be done once) * * Arguments: diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index 428f8a26d7..d920922ddb 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Creates an isolated ACE action @@ -10,12 +10,12 @@ * 2: Icon file path or Array of icon file path and hex color ("" for default icon) * 3: Statement * 4: Condition - * 5: Insert children code (Optional) - * 6: Action parameters (Optional) - * 7: Position (Position array, Position code or Selection Name) , or (Optional) - * 8: Distance (Optional) - * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) - * 10: Modifier function (Optional) + * 5: Insert children code (default: {}) + * 6: Action parameters (default: []) + * 7: Position (Position array, Position code or Selection Name) , or (default: {[0, 0, 0]}) + * 8: Distance (default: 2) + * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (default: all false) + * 10: Modifier function (default: {}) * * Return Value: * Action diff --git a/addons/interact_menu/functions/fnc_createVehiclesActions.sqf b/addons/interact_menu/functions/fnc_createVehiclesActions.sqf index 8218242aab..b2e9407c8d 100644 --- a/addons/interact_menu/functions/fnc_createVehiclesActions.sqf +++ b/addons/interact_menu/functions/fnc_createVehiclesActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Creates child actions for vehicle list. @@ -21,13 +21,12 @@ params ["_vehicles", "_statement", "_target"]; _vehicles apply { - private _type = typeOf _x; - private _name = getText (configFile >> "CfgVehicles" >> _type >> "displayName"); + private _name = getText ((configOf _x) >> "displayName"); private _ownerName = [_x, true] call EFUNC(common,getName); if ("" != _ownerName) then { _name = format ["%1 (%2)", _name, _ownerName]; }; - private _icon = [_type] call EFUNC(common,getVehicleIcon); + private _icon = [_x] call EFUNC(common,getVehicleIcon); private _action = [format ["%1", _x], _name, _icon, _statement, {true}, {}, _x] call EFUNC(interact_menu,createAction); [_action, [], _target] } diff --git a/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf b/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf index deed10e293..dd75c37a3c 100644 --- a/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf +++ b/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Sets the controls structured text if it isn't already set. diff --git a/addons/interact_menu/functions/fnc_findActionNode.sqf b/addons/interact_menu/functions/fnc_findActionNode.sqf index c2807a3e9c..4e04fcebea 100644 --- a/addons/interact_menu/functions/fnc_findActionNode.sqf +++ b/addons/interact_menu/functions/fnc_findActionNode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Return action point from path @@ -9,7 +9,7 @@ * 1: Path * * Return Value: - * Action node or if not found + * Action node or if not found * * Example: * [actionTree, ["ACE_TapShoulderRight","VulcanPinchAction"]] call ace_interact_menu_fnc_findActionNode; diff --git a/addons/interact_menu/functions/fnc_handleEscapeMenu.sqf b/addons/interact_menu/functions/fnc_handleEscapeMenu.sqf index d915f57999..8922aca8f4 100644 --- a/addons/interact_menu/functions/fnc_handleEscapeMenu.sqf +++ b/addons/interact_menu/functions/fnc_handleEscapeMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handle the escape key being pressed. diff --git a/addons/interact_menu/functions/fnc_initMenuReorder.sqf b/addons/interact_menu/functions/fnc_initMenuReorder.sqf index 4e328bb045..48445b3fa0 100644 --- a/addons/interact_menu/functions/fnc_initMenuReorder.sqf +++ b/addons/interact_menu/functions/fnc_initMenuReorder.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Initializes "More" and "Move to Root" settings and menu. diff --git a/addons/interact_menu/functions/fnc_isSubPath.sqf b/addons/interact_menu/functions/fnc_isSubPath.sqf index 2a0cbe664b..5b58b1b1f0 100644 --- a/addons/interact_menu/functions/fnc_isSubPath.sqf +++ b/addons/interact_menu/functions/fnc_isSubPath.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Check if the first path is a subpath of the other diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index c080fa4481..5bce40d0a8 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Handle interactions key down @@ -15,13 +15,29 @@ * Public: No */ +#include "\a3\ui_f\hpp\defineResincl.inc" + params ["_menuType"]; if (GVAR(openedMenuType) == _menuType) exitWith {true}; +// Conditions: Don't open when editing a text box +private _focusedTextIndex = allDisplays findIf {(ctrlType (focusedCtrl _x)) == CT_EDIT}; +private _isTextEditing = _focusedTextIndex != -1; + +// Map's controls remain open and focused despite map not being visible, workaround +if (_isTextEditing) then { + if (ctrlIDD (allDisplays select _focusedTextIndex) == IDD_MAIN_MAP) then { + _isTextEditing = visibleMap; + }; +}; + // Conditions: canInteract (these don't apply to zeus) -if ((isNull curatorCamera) && { - !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)) +if ( + _isTextEditing || + {(isNull curatorCamera) && { + !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)) + } }) exitWith {false}; while {dialog} do { diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 9ed14d66d3..3f80201c03 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Handle interactions key up diff --git a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf index 92de6b872a..55aa0f4f82 100644 --- a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf +++ b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Removes an action from a class diff --git a/addons/interact_menu/functions/fnc_removeActionFromObject.sqf b/addons/interact_menu/functions/fnc_removeActionFromObject.sqf index 64c96ec949..cb1c4a31d0 100644 --- a/addons/interact_menu/functions/fnc_removeActionFromObject.sqf +++ b/addons/interact_menu/functions/fnc_removeActionFromObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, NouberNou and esteldunedain * Removes an action from an object diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 651aaef47d..e4ee0d6357 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Render all available nearby interactions diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 987ad3f99c..058b5ed846 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Render all action points diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 45c30696f3..9e3aaa53a9 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Render the interaction menu for a base action diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 19725fb610..fffa5e91a7 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou, esteldunedain, mharis001 * Render a single interaction icon. diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 17f9ad5145..e7bb42b4cf 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: NouberNou and esteldunedain * Render an interaction menu and it's children recursively diff --git a/addons/interact_menu/functions/fnc_renderSelector.sqf b/addons/interact_menu/functions/fnc_renderSelector.sqf index 96f42f8a19..bf71929924 100644 --- a/addons/interact_menu/functions/fnc_renderSelector.sqf +++ b/addons/interact_menu/functions/fnc_renderSelector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Render a single interaction icon diff --git a/addons/interact_menu/functions/fnc_setupTextColors.sqf b/addons/interact_menu/functions/fnc_setupTextColors.sqf index 3d0a369c60..011c7d45ef 100644 --- a/addons/interact_menu/functions/fnc_setupTextColors.sqf +++ b/addons/interact_menu/functions/fnc_setupTextColors.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Builds color strings needed for displaying interaction text diff --git a/addons/interact_menu/functions/fnc_splitPath.sqf b/addons/interact_menu/functions/fnc_splitPath.sqf index bd59a39d33..8c0856d118 100644 --- a/addons/interact_menu/functions/fnc_splitPath.sqf +++ b/addons/interact_menu/functions/fnc_splitPath.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Take full path and split it between parent path and action name diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index 1f2e0c5da1..b87f6133f3 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Scans for nearby "Static" objects (buildings) and adds the UserActions to them. @@ -27,21 +27,21 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; [{ params ["_args", "_pfID"]; - _args params ["_setPosition", "_addedHelpers", "_housesScaned", "_housesToScanForActions"]; + _args params ["_setPosition", "_addedHelpers", "_housesScanned", "_housesToScanForActions"]; if (!EGVAR(interact_menu,keyDown)) then { {deleteVehicle _x;} forEach _addedHelpers; [_pfID] call CBA_fnc_removePerFrameHandler; } else { // Prevent Rare Error when ending mission with interact key down: - if (isNull ace_player) exitWith {}; + if (isNull ACE_player) exitWith {}; //Make the common case fast (cursorTarget is looking at a door): - if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { + if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScanned)}) then { if (((count (configOf cursorTarget >> "UserActions")) > 0) || {(count (getArray (configOf cursorTarget >> "ladders"))) > 0}) then { _housesToScanForActions = [cursorTarget]; } else { - _housesScaned pushBack cursorTarget; + _housesScanned pushBack cursorTarget; }; }; @@ -51,47 +51,43 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; if (_housesToScanForActions isEqualTo []) then { //If player moved >2 meters from last pos, then rescan - if (((getPosASL ace_player) distance _setPosition) < 2) exitWith {}; + if (((getPosASL ACE_player) distance _setPosition) < 2) exitWith {}; - private _nearBuidlings = nearestObjects [ace_player, ["Static"], 30]; + private _nearBuidlings = nearestObjects [ACE_player, ["Static"], 30]; { - private _typeOfHouse = typeOf _x; - if (((count (configFile >> "CfgVehicles" >> _typeOfHouse >> "UserActions")) == 0) && {(count (getArray (configFile >> "CfgVehicles" >> _typeOfHouse >> "ladders"))) == 0}) then { - _housesScaned pushBack _x; + private _configOfHouse = configOf _x; + if (((count (_configOfHouse >> "UserActions")) == 0) && {(count (getArray (_configOfHouse >> "ladders"))) == 0}) then { + _housesScanned pushBack _x; } else { _housesToScanForActions pushBack _x; }; - nil - } count (_nearBuidlings - _housesScaned); + } forEach (_nearBuidlings - _housesScanned); - _args set [0, (getPosASL ace_player)]; + _args set [0, (getPosASL ACE_player)]; } else { - _houseBeingScaned = _housesToScanForActions deleteAt 0; - private _typeOfHouse = typeOf _houseBeingScaned; + private _houseBeingScanned = _housesToScanForActions deleteAt 0; //Skip this house for now if we are outside of it's radius //(we have to scan far out for the big houses, but we don't want to waste time adding actions on every little shack) - if ((_houseBeingScaned != cursorTarget) && {((ACE_player distance _houseBeingScaned) - ((sizeOf _typeOfHouse) / 2)) > 4}) exitWith {}; + if ((_houseBeingScanned != cursorTarget) && {((ACE_player distance _houseBeingScanned) - ((boundingBoxReal _houseBeingScanned) select 2)) > 4}) exitWith {}; - _housesScaned pushBack _houseBeingScaned; + _housesScanned pushBack _houseBeingScanned; - private _actionSet = [_typeOfHouse] call FUNC(userActions_getHouseActions); + private _actionSet = [typeOf _houseBeingScanned] call FUNC(userActions_getHouseActions); _actionSet params ["_memPoints", "_memPointsActions"]; - // systemChat format ["Add Actions for [%1] (count %2) @ %3", _typeOfHouse, (count _memPoints), diag_tickTime]; + TRACE_3("Add Actions for [%1] (count %2) @ %3",typeOf _houseBeingScanned,(count _memPoints),diag_tickTime); { - private _helperPos = _houseBeingScaned modelToWorldWorld (_houseBeingScaned selectionPosition _x); + private _helperPos = _houseBeingScanned modelToWorldWorld (_houseBeingScanned selectionPosition _x); private _helperObject = "ACE_LogicDummy" createVehicleLocal [0,0,0]; _addedHelpers pushBack _helperObject; - _helperObject setVariable [QGVAR(building), _houseBeingScaned]; + _helperObject setVariable [QGVAR(building), _houseBeingScanned]; _helperObject setPosASL _helperPos; - TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned); + TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScanned); { [_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject); - nil - } count (_memPointsActions select _forEachIndex); - + } forEach (_memPointsActions select _forEachIndex); } forEach _memPoints; }; }; -}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; +}, 0, [((getPosASL ACE_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf index 2b646e8eca..c11da0c271 100644 --- a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Scans the buidling type for UserActions and Ladder mount points. @@ -26,8 +26,8 @@ private _memPointsActions = []; //Get the offset for a memory point: private _fnc_getMemPointOffset = { params ["_memoryPoint"]; - _memPointIndex = _memPoints find _memoryPoint; - _actionOffset = [0,0,0]; + private _memPointIndex = _memPoints find _memoryPoint; + private _actionOffset = [0,0,0]; if (_memPointIndex == -1) then { _memPoints pushBack _memoryPoint; _memPointsActions pushBack []; @@ -82,7 +82,7 @@ for "_index" from 0 to ((count _configPath) - 1) do { private _actionStatement = getText (_actionPath >> "statement"); private _actionMaxDistance = getNumber (_actionPath >> "radius"); - if (_actionDisplayName == "") then {_actionDisplayName = (configName _x);}; + if (_actionDisplayName == "") then {_actionDisplayName = configName _actionPath;}; if (_actionPosition == "") then {ERROR("Bad Position");}; if (_actionCondition == "") then {_actionCondition = "true";}; if (_actionStatement == "") then {ERROR("No Statement");}; @@ -91,12 +91,12 @@ for "_index" from 0 to ((count _configPath) - 1) do { _actionCondition = compile _actionCondition; _actionMaxDistance = _actionMaxDistance + 0.1; //increase range slightly - private _iconImage = ((_actionDisplayNameDefault regexFind ["[\w\-\\\/]+.paa/gi", 0]) param [0, [""]]) select 0; + private _iconImage = ((_actionDisplayNameDefault regexFind ["[\w\-\\\/]+.paa/gi", 0]) param [0, []]) param [0, []] param [0, ""]; private _actionOffset = [_actionPosition] call _fnc_getMemPointOffset; private _memPointIndex = _memPoints find _actionPosition; - _action = [(configName _actionPath), _actionDisplayName, _iconImage, _fnc_userAction_Statement, _fnc_userAction_Condition, {}, [_actionStatement, _actionCondition], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + private _action = [(configName _actionPath), _actionDisplayName, _iconImage, _fnc_userAction_Statement, _fnc_userAction_Condition, {}, [_actionStatement, _actionCondition], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); (_memPointsActions select _memPointIndex) pushBack _action; }; diff --git a/addons/interact_menu/functions/script_component.hpp b/addons/interact_menu/functions/script_component.hpp deleted file mode 100644 index 723a7735f1..0000000000 --- a/addons/interact_menu/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\interact_menu\script_component.hpp" \ No newline at end of file diff --git a/addons/interact_menu/initSettings.sqf b/addons/interact_menu/initSettings.sqf index e070f38bda..22287189c3 100644 --- a/addons/interact_menu/initSettings.sqf +++ b/addons/interact_menu/initSettings.sqf @@ -1,9 +1,10 @@ private _category = format ["ACE %1", LLSTRING(Category_InteractionMenu)]; +private _categoryColors = [_category, format ["| %1 |", LELSTRING(common,subcategory_colors)]]; [ QGVAR(selectorColor), "COLOR", LSTRING(SelectorColor), - _category, + _categoryColors, [1, 0, 0], false, {GVAR(selectorColorHex) = _this call BIS_fnc_colorRGBtoHTML} // Stored in Hex to avoid constant conversion @@ -12,7 +13,7 @@ private _category = format ["ACE %1", LLSTRING(Category_InteractionMenu)]; [ QGVAR(colorTextMax), "COLOR", LSTRING(ColorTextMax), - _category, + _categoryColors, [1, 1, 1, 1], 0 ] call CBA_fnc_addSetting; @@ -20,7 +21,7 @@ private _category = format ["ACE %1", LLSTRING(Category_InteractionMenu)]; [ QGVAR(colorTextMin), "COLOR", LSTRING(ColorTextMin), - _category, + _categoryColors, [1, 1, 1, 0.25], 0 ] call CBA_fnc_addSetting; @@ -28,7 +29,7 @@ private _category = format ["ACE %1", LLSTRING(Category_InteractionMenu)]; [ QGVAR(colorShadowMax), "COLOR", LSTRING(ColorShadowMax), - _category, + _categoryColors, [0, 0, 0, 1], 0 ] call CBA_fnc_addSetting; @@ -36,7 +37,7 @@ private _category = format ["ACE %1", LLSTRING(Category_InteractionMenu)]; [ QGVAR(colorShadowMin), "COLOR", LSTRING(ColorShadowMin), - _category, + _categoryColors, [0, 0, 0, 0.25], 0 ] call CBA_fnc_addSetting; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 5a9964fa59..ec693604de 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -13,8 +13,8 @@ Mostra sempre il cursore delle autointerazioni Sempre mostrar cursor para interação pessoal セルフ インタラクションへ常にカーソルを表示 - 자기상호작용시 항상 커서를 보이기 - 自我互动时永远显示游标 + 자기상호작용 시 항상 커서를 보이기 + 自我互动时永远显示光标 自我互動時永遠顯示游標 Kendi kendine etkileşim için daima imleci göster @@ -30,8 +30,8 @@ Mindig legyen a cselekvés kurzorja látható Sempre mostrar cursor para interação インタラクションへ常にカーソルを表示 - 상호작용시 항상 커서를 보이기 - 互动时永远显示游标 + 상호작용 시 항상 커서를 보이기 + 互动时永远显示光标 互動時永遠顯示游標 Etkileşim için her zaman imleci göster @@ -132,7 +132,7 @@ Действия Зевса Azioni Zeus Zeus への動作 - Zeus 동작 + 제우스 동작 宙斯操作 宙斯操作 Zeus Etkileşimi @@ -150,7 +150,7 @@ Interação - Max. de Texto インタラクション - 文字の色 상호작용 - 문자색깔 - 互动-文字颜色最大值 + 互动—文字颜色最大值 互動 - 文字最大化 Etkileşim - Maksimum Metin @@ -167,7 +167,7 @@ Interação - Min. de Texto インタラクション - 文字の背景色 상호작용 - 문자배경색 - 互动-文字颜色最小值 + 互动—文字颜色最小值 互動 - 文字最小化 Etkileşim - Minumum Metin @@ -184,7 +184,7 @@ Interação - Max. de Sombra インタラクション - 文字への影の色 상호작용 - 문자그림자색 - 互动 - 阴影最大值 + 互动—阴影最大值 互動 - 陰影最大化 Etkileşim - Maksimum Gölge @@ -201,7 +201,7 @@ Interação - Min. de Sombra インタラクション - 文字への影の最低色 상호작용 - 문자그림자배경색 - 互动 - 阴影最小值 + 互动—阴影最小值 互動 - 陰影最小化 Etkileşim - Minumum Gölge @@ -218,7 +218,7 @@ Mantieni il cursore centrato 常にカーソルを中央にする 커서를 항상 가운데에 둡니다 - 保持游标在中心点 + 保持光标在中心点 保持游標在中心點 İmleci Ortada tut @@ -234,8 +234,8 @@ Manter o cursor centralizado e mover o menu de opções. Útil caso o tamanho da tela seja limitado. Mantieni il cursore centrato e sposta il menù intorno. Utile se lo schermo è piccolo. 常にカーソルを中央へ表示させ、オプション メニューが移動します。画面の大きさが制限されている時に使いやすくなります。 - 커서를 항상 가운데에 두고 메뉴를 움직입니다. 화면의 크기가 제한되있을때 유용합니다. - 保持游标在中心点并平移周遭的选项选单。这对在荧幕尺寸有限的玩家很有用! + 커서를 항상 가운데에 두고 메뉴를 움직입니다. 화면의 크기가 제한되있을 때 유용합니다. + 保持光标在中心点并平移周遭的选项菜单。这对在屏幕尺寸有限的玩家很有用! 保持游標在中心點並平移周遭的選項選單。這對在螢幕尺寸有限的玩家很有用! İmleci ortalanmış halde tutar ve seçenek menüsünü kaydırır. Ekran boyutu sınırlıysa kullanışlıdır. @@ -245,14 +245,14 @@ Wykonuj akcje po puszczeniu klawisza menu Provést akci při pustění klávesy menu 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 Cselekvés végrehajtása a menügomb elengedésekor Esegui l'azione quando rilasci il tasto menu メニュー キーを離した時に動作を実行 - 메뉴키를 놓을때 행동하기 - 当放开选单键后就执行动作 + 메뉴 키를 놓을 때 행동하기 + 当放开菜单键后就执行动作 當放開選單鍵後就執行動作 Menü tuşunu bırakırken işlem yap @@ -269,7 +269,7 @@ Dimensione del testo d'interazione インタラクション文字の大きさ 상호작용 - 문자크기 - 互动选单文字大小 + 互动菜单文字大小 互動選單文字大小 Etkileşim Metni Boyutu @@ -286,7 +286,7 @@ Ombra del testo d'interazione インタラクション文字へ影 상호작용 - 문자그림자 - 互动选单文字阴影 + 互动菜单文字阴影 互動選單文字陰影 Etkileşim Metni Gölgesi @@ -302,7 +302,7 @@ Hozzáférést biztosít a szöveg árnyékának kezeléséhez. A körvonal nem veszi figyelembe az egyedi árnyékszíneket. Permette di controllare l'ombra del testo. L'impostazione "Contorno" ignora il colore dell'ombra. 文字への影を設定します。縁取りは設定された影の色を無視します。 - 문자의 그림자를 조절하는것을 가능케합니다. 외각선은 임의의 그림자색을 무시합니다. + 문자의 그림자를 조절하는 것을 가능케 합니다. 외곽선은 임의의 그림자색을 무시합니다. 允许控制文字阴影。轮廓部分则会忽略自定义的阴影颜色。 允許控制文字陰影。輪廓部分則會忽略自定義的陰影顏色 Metin gölgesinin kontrolüne izin verir. Dış çizgi, özel gölge renklerini yok sayar. @@ -319,7 +319,7 @@ Körvonal Contorno 縁取り - 외각선 + 외곽선 只显示轮廓 只顯示輪廓 Dış Çizgi @@ -337,7 +337,7 @@ Sfondo Menù Interazioni インタラクション メニューの背景 상호작용 메뉴 배경 - 互动选单背景 + 互动菜单背景 互動選單背景 Etkileşim menüsü arka planı @@ -353,8 +353,8 @@ Размыть фон, пока открыто меню взаимодействия. Sfoca lo sfondo mentre il Menù Interazioni è aperto. インタラクション メニューを開いたとき、背景にボケを与えます。 - 상호작용 메뉴가 열릴시 배경을 흐릿하게 처리합니다. - 当互动选单开启时,模糊背景画面。 + 상호작용 메뉴가 열릴 시 배경을 흐릿하게 처리합니다. + 当互动菜单开启时,模糊背景画面。 當互動選單開啟時,模糊背景畫面 Etkileşim menüsü açıkken arka planı bulanıklaştırın. @@ -421,8 +421,8 @@ Добавляет действия открывания дверей и залезания на лестницы для зданий. (Примечание: возможно падение производительности при открытии меню взаимодействия, особенно в городах) Aggiunge azioni interattive per l'apertura delle porte e piazzamento scale su edifici. (Nota: C'è un costo in performance quando si apre il Menù Interazioni, soprattutto in città) 建物にある扉の開閉やはしごの昇降といった動作をインタラクションへ追加します。(街などでインタラクション メニューを開くと動作が低下します) - 건물의 문을 열거나 사다리에 오르는 상호작용 행동을 추가합니다. (주의: 상호작용 메뉴를 열경우 성능하락이 있을 수 있음, 특히 마을 내부에서) - 增加互动选单的功能在可开启的门与建筑物的梯子上。(注意: 此功能有可能会降低系统效能,特别是在城镇区更明显) + 건물의 문을 열거나 사다리에 오르는 상호작용 행동을 추가합니다. (주의: 상호작용 메뉴를 열 경우 성능하락이 있을 수 있음, 특히 마을 내부에서) + 增加互动菜单的功能在可开启的门与建筑物的梯子上。(注意:此功能有可能会降低系统效能,特别是在城镇区更明显) 增加互動選單的功能在可開啟的門與建築物的梯子上。(注意: 此功能有可能會降低系統效能,特別是在城鎮區更明顯) Binalara kapıları açmak ve merdivenleri monte etmek için etkileşim eylemleri ekler. (Not: Etkileşim menüsünü açarken, özellikle şehirlerde bir performansı etkiler) @@ -438,7 +438,7 @@ Menu d'interaction インタラクション メニュー 상호작용 메뉴 - 互动选单 + 互动菜单 互動選單 Etkileşim Menüsü @@ -454,7 +454,7 @@ Vitesse de l'animation d'interaction インタラクションのアニメーション速度 상호작용 움직임 속도 - 互动选单动画速度 + 互动菜单动画速度 互動選單動畫速度 Etkileşim Animasyon Hızı @@ -469,16 +469,16 @@ Hace la animación del menú más rápida, reduciendo el tiempo necesario para abrir sub-acciones. Rend les animations du menu plus rapide, et réduit le temps nécessaire à l'affichage des sous menus d'action. ホバーで子アクションを表示した時に出るメニューのアニメーション速度を早くしたり遅くしたりできます - 使选单的动画速度更快,并减少子选项显现出来的时间 + 使菜单的动画速度更快,并减少子选项显现出来的时间 使選單的動畫速度更快,並減少子選項顯現出來的時間 - 상호 작용을 표시하기 위해 메뉴 애니메이션을 빠르게 만들고 마우스를 가져 오는 데 필요한 시간을 줄입니다. + 상호작용을 표시하기 위해 메뉴 애니메이션을 빠르게 만들고 마우스를 가져오는 데 필요한 시간을 줄입니다. Menü animasyonlarını daha hızlı hale getirir ve alt eylemleri göstermek için fareyle üzerine gelmek için gereken süreyi azaltır Selector Color Farbauswahl セレクターの色 - 选择器颜色 + 菜单颜色 選單的顏色 Controllo Settore Kolor wybierającego @@ -488,13 +488,18 @@ Barva selektoru Selector de color Seçici Renk + 색상 선택 Consolidate single child actions - Объединять с единственным дочерним действием + Объединять ед. дочерные действия サブ動作を統合 Consolidar acciones hijo únicas Combiner les sous-actions uniques + Untergeordnete Aktionen zusammenfassen + Połącz akcje podrzędne + 整合子操作 + 하위 동작 통합 Combines parent action with only one child action together. @@ -502,6 +507,10 @@ メインの動作とサブ動作一つを統合して表示します。 Combina acciones padre con una única accion hijo de forma conjunta Lorsqu'un menu ne contient qu'une seule sous-action, elle est combinée avec son menu parent. + Übergeordnete Aktionen mit nur einer Unteraktion zusammenfassen. + Gdy menu zawiera tylko jedną akcję podrzędną, łączy ją z akcją nadrzędną. + 主操作与子操作集成显示。 + 대분류로 나뉜 행동을 한눈에 보여줍니다 diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 67599370a4..57753dfaff 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -162,6 +162,12 @@ class CfgVehicles { exceptions[] = {"isNotSwimming"}; icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\getout_ca.paa"; }; + class GVAR(Gear) { + displayName = "$STR_ACTION_GEAR"; + condition = QUOTE(!(lifeState _target in [ARR_2('HEALTHY','INJURED')]) && {isNull objectParent _target}); + statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)),_target)]); + icon = "\A3\ui_f\data\igui\cfg\actions\gear_ca.paa"; + }; }; class ACE_Torso { @@ -643,6 +649,27 @@ class CfgVehicles { }; class ACE_SelfActions {}; }; + + class Items_base_F; + class PlasticCase_01_base_F: Items_base_F { + class ACE_Actions { + class ACE_MainActions { + displayName = CSTRING(MainAction); + selection = ""; + distance = 2; + condition = "true"; + class ACE_OpenBox { + displayName = CSTRING(OpenBox); + condition = QUOTE(alive _target && {!lockedInventory _target} && {getNumber (configOf _target >> 'disableInventory') == 0}); + statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)), _target)]); + showDisabled = 0; + }; + }; + }; + class ACE_SelfActions {}; + }; + + class Slingload_base_F: ReammoBox_F {}; class Slingload_01_Base_F: Slingload_base_F { class ACE_Actions: ACE_Actions { @@ -672,6 +699,41 @@ class CfgVehicles { class ACE_SelfActions {}; }; + // weapons dropped from dead body + class WeaponHolderSimulated: ThingX { + class ACE_Actions { + class ACE_MainActions { + displayName = CSTRING(MainAction); + distance = 3; + position = QUOTE(_target worldToModel ASLToAGL getPosASL _target); + + class GVAR(Gear) { + displayName = "$STR_ACTION_GEAR"; + statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)),_target)]); + icon = "\A3\ui_f\data\igui\cfg\actions\gear_ca.paa"; + }; + }; + }; + }; + + class ReammoBox; + // dropped weapons/gear + class WeaponHolder: ReammoBox { + class ACE_Actions { + class ACE_MainActions { + displayName = CSTRING(MainAction); + distance = 3; + position = QUOTE(_target worldToModel ASLToAGL getPosASL _target); + + class GVAR(Gear) { + displayName = "$STR_ACTION_GEAR"; + statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)),_target)]); + icon = "\A3\ui_f\data\igui\cfg\actions\gear_ca.paa"; + }; + }; + }; + }; + class Lamps_base_F; class Land_PortableLight_single_F: Lamps_base_F { class EventHandlers { diff --git a/addons/interaction/RscTitles.hpp b/addons/interaction/RscTitles.hpp index 0ac0e18241..8857faf4b6 100644 --- a/addons/interaction/RscTitles.hpp +++ b/addons/interaction/RscTitles.hpp @@ -13,8 +13,8 @@ class ACE_Interaction_Button_Base { style = 2; x = 0; y = 0; - w = 2.0 / 16 * safezoneW; - h = 0.3 / 9 * safezoneH; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; offsetX = 0.003; offsetY = 0.003; @@ -59,7 +59,7 @@ class RscACE_SelectAnItem { }; class header: RscText { idc = 8870; - x = X_OFFSET + 0.005; + x = QUOTE(X_OFFSET + 0.005); y = 0.005; w = 0.59; h = 0.05; @@ -69,7 +69,7 @@ class RscACE_SelectAnItem { class itemList: RscListBox { onMouseButtonDblClick = QUOTE(_this call DFUNC(onSelectMenuDblClick)); idc = 8866; - x = X_OFFSET + 0.005; + x = QUOTE(X_OFFSET + 0.005); w = 0.59; h = 0.54; y = 0.06; @@ -81,7 +81,7 @@ class RscACE_SelectAnItem { idc = -1; colorBackground[] = {0,0,0,0.5}; colorBackgroundDisabled[] = {0,0,0,0.5}; - x = X_OFFSET + 0.005; + x = QUOTE(X_OFFSET + 0.005); w = 0.15; h = 0.1; y = 0.605; @@ -92,7 +92,7 @@ class RscACE_SelectAnItem { idc = -1; colorBackground[] = {0,0,0,0.5}; colorBackgroundDisabled[] = {0,0,0,0.5}; - x = X_OFFSET + 0.445; + x = QUOTE(X_OFFSET + 0.445); y = 0.605; h = 0.1; w = 0.15; @@ -100,7 +100,7 @@ class RscACE_SelectAnItem { class cancelBtn: ACE_Interaction_Button_Base { idc = 8855; - x = X_OFFSET + 0.005; + x = QUOTE(X_OFFSET + 0.005); w = 0.15; h = 0.1; y = 0.605; @@ -114,7 +114,7 @@ class RscACE_SelectAnItem { }; class approveBtn: ACE_Interaction_Button_Base { idc = 8860; - x = X_OFFSET + 0.445; + x = QUOTE(X_OFFSET + 0.445); y = 0.605; h = 0.1; w = 0.15; @@ -141,37 +141,37 @@ class RscTitles { class IconLMB: RscPicture { idc = IDC_MOUSEHINT_LMB; text = QPATHTOF(UI\mouse_left_ca.paa); - x = 20 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 17.5 * GUI_GRID_H; - w = GUI_GRID_H; - h = GUI_GRID_H; + x = QUOTE(20 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(17.5 * GUI_GRID_H); + w = QUOTE(GUI_GRID_H); + h = QUOTE(GUI_GRID_H); }; class TextLMB: RscText { idc = IDC_MOUSEHINT_LMB_TEXT; text = ""; - x = 21.1 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 17.45 * GUI_GRID_H; - w = 24 * GUI_GRID_W; - h = GUI_GRID_H; - sizeEx = GUI_GRID_H; + x = QUOTE(21.1 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(17.45 * GUI_GRID_H); + w = QUOTE(24 * GUI_GRID_W); + h = QUOTE(GUI_GRID_H); + sizeEx = QUOTE(GUI_GRID_H); }; class IconMMB: IconLMB { idc = IDC_MOUSEHINT_MMB; text = QPATHTOF(UI\mouse_scroll_ca.paa); - y = 18.55 * GUI_GRID_H; + y = QUOTE(18.55 * GUI_GRID_H); }; class TextMMB: TextLMB { idc = IDC_MOUSEHINT_MMB_TEXT; - y = 18.5 * GUI_GRID_H; + y = QUOTE(18.5 * GUI_GRID_H); }; class IconRMB: IconLMB { idc = IDC_MOUSEHINT_RMB; text = QPATHTOF(UI\mouse_right_ca.paa); - y = 19.6 * GUI_GRID_H; + y = QUOTE(19.6 * GUI_GRID_H); }; class TextRMB: TextLMB { idc = IDC_MOUSEHINT_RMB_TEXT; - y = 19.55 * GUI_GRID_H; + y = QUOTE(19.55 * GUI_GRID_H); }; }; }; @@ -181,26 +181,26 @@ class GVAR(RscExtraKey): RscControlsGroupNoScrollbars { idc = IDC_MOUSEHINT_EXTRA; x = 0; y = 0; - w = 40 * GUI_GRID_W; - h = GUI_GRID_H; + w = QUOTE(40 * GUI_GRID_W); + h = QUOTE(GUI_GRID_H); class controls { class Name: RscText { idc = IDC_MOUSEHINT_EXTRA_NAME; style = 1; x = 0; y = 0; - w = 21.5 * GUI_GRID_W + GUI_GRID_CENTER_X; - h = GUI_GRID_H; - sizeEx = GUI_GRID_H; + w = QUOTE(21.5 * GUI_GRID_W + GUI_GRID_CENTER_X); + h = QUOTE(GUI_GRID_H); + sizeEx = QUOTE(GUI_GRID_H); font = "EtelkaMonospaceProBold"; }; class Text: RscText { idc = IDC_MOUSEHINT_EXTRA_TEXT; - x = 21.1 * GUI_GRID_W + GUI_GRID_CENTER_X; - y = 0; - w = 24 * GUI_GRID_W; - h = GUI_GRID_H; - sizeEx = GUI_GRID_H; + x = QUOTE(21.1 * GUI_GRID_W + GUI_GRID_CENTER_X); + y = QUOTE(0); + w = QUOTE(24 * GUI_GRID_W); + h = QUOTE(GUI_GRID_H); + sizeEx = QUOTE(GUI_GRID_H); }; }; }; diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index 1639d79bbf..75e92c02c9 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -89,7 +89,7 @@ GVAR(isOpeningDoor) = false; if (!GVAR(interactWithTerrainObjects)) exitWith {}; { if ( - isObjectHidden _x // after hiding on server + isObjectHidden _x // after hiding on server || {_x getVariable [QGVAR(terrainObjectReplaced), false]} // after checking but before hiding || {typeOf _x isNotEqualTo ""} ) then {continue}; @@ -161,3 +161,21 @@ GVAR(isOpeningDoor) = false; [QGVAR(clearWeaponAttachmentsActionsCache)] call CBA_fnc_localEvent; }] call CBA_fnc_addPlayerEventHandler; } forEach ["loadout", "weapon"]; + + +// add "Take _weapon_" action to dropped weapons +private _action = [ + // action display name will be overwritten in modifier function + QGVAR(takeWeapon), "take", "\A3\ui_f\data\igui\cfg\actions\take_ca.paa", + {_player action ["TakeWeapon", _target, weaponCargo _target select 0]}, + {count weaponCargo _target == 1}, + nil, nil, nil, nil, nil, + { + params ["_target", "", "", "_actionData"]; + _actionData set [1, format [localize "STR_ACTION_TAKE_BAG", getText (configfile >> "CfgWeapons" >> weaponCargo _target select 0 >> "displayName")]]; + } +] call EFUNC(interact_menu,createAction); + +{ + [_x, 0, ["ACE_MainActions"], _action, true] call EFUNC(interact_menu,addActionToClass); +} forEach ["WeaponHolder", "WeaponHolderSimulated"]; diff --git a/addons/interaction/dev/initReplaceTerrainCursorObject.sqf b/addons/interaction/dev/initReplaceTerrainCursorObject.sqf index c0221b2d38..ee5ddcad49 100644 --- a/addons/interaction/dev/initReplaceTerrainCursorObject.sqf +++ b/addons/interaction/dev/initReplaceTerrainCursorObject.sqf @@ -1,7 +1,7 @@ // execVM "z\ace\addons\interaction\dev\initReplaceTerrainCursorObject.sqf"; // use "J" key to replace terrain cursorObject and add dragging actions to it -#include "\z\ace\addons\interaction\script_component.hpp" +#include "..\script_component.hpp" DFUNC(replaceTerrainModelsAdd) = { params ["_model", ["_class", ""]]; diff --git a/addons/interaction/functions/fnc_addPassengerActions.sqf b/addons/interaction/functions/fnc_addPassengerActions.sqf index 03d77e3901..112919ee80 100644 --- a/addons/interaction/functions/fnc_addPassengerActions.sqf +++ b/addons/interaction/functions/fnc_addPassengerActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Mount unit actions inside passenger submenu. diff --git a/addons/interaction/functions/fnc_addPassengersActions.sqf b/addons/interaction/functions/fnc_addPassengersActions.sqf index 93a8364415..27698eb697 100644 --- a/addons/interaction/functions/fnc_addPassengersActions.sqf +++ b/addons/interaction/functions/fnc_addPassengersActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Create one action per passenger. @@ -41,7 +41,7 @@ private _actions = []; format ["%1", _unit], [_unit, true] call EFUNC(common,getName), [_icon, "#FFFFFF"], - { + { //statement (Run on hover) - reset the cache so we will insert actions immedietly when hovering over new unit TRACE_2("Cleaning Cache",_target,vehicle _target); [vehicle _target, QEGVAR(interact_menu,ATCache_ACE_SelfActions)] call EFUNC(common,eraseCache); diff --git a/addons/interaction/functions/fnc_canBecomeLeader.sqf b/addons/interaction/functions/fnc_canBecomeLeader.sqf index af50c081a0..de06287fa2 100644 --- a/addons/interaction/functions/fnc_canBecomeLeader.sqf +++ b/addons/interaction/functions/fnc_canBecomeLeader.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Test if can Become Leader of group. diff --git a/addons/interaction/functions/fnc_canFlip.sqf b/addons/interaction/functions/fnc_canFlip.sqf index b00164415c..c6a553b48f 100644 --- a/addons/interaction/functions/fnc_canFlip.sqf +++ b/addons/interaction/functions/fnc_canFlip.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Checks if vehicle can be flipped. diff --git a/addons/interaction/functions/fnc_canInteractWithCivilian.sqf b/addons/interaction/functions/fnc_canInteractWithCivilian.sqf index 7b98ba4972..73c225626e 100644 --- a/addons/interaction/functions/fnc_canInteractWithCivilian.sqf +++ b/addons/interaction/functions/fnc_canInteractWithCivilian.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Checks if the unit can interact with civilian diff --git a/addons/interaction/functions/fnc_canJoinGroup.sqf b/addons/interaction/functions/fnc_canJoinGroup.sqf index bc21e9d162..facc3376ee 100644 --- a/addons/interaction/functions/fnc_canJoinGroup.sqf +++ b/addons/interaction/functions/fnc_canJoinGroup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Checks if the unit can join a group diff --git a/addons/interaction/functions/fnc_canJoinTeam.sqf b/addons/interaction/functions/fnc_canJoinTeam.sqf index 424b3be982..09d0281dca 100644 --- a/addons/interaction/functions/fnc_canJoinTeam.sqf +++ b/addons/interaction/functions/fnc_canJoinTeam.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Checks if the player can join a team diff --git a/addons/interaction/functions/fnc_canPardon.sqf b/addons/interaction/functions/fnc_canPardon.sqf index 81319afb3b..833a518b2f 100644 --- a/addons/interaction/functions/fnc_canPardon.sqf +++ b/addons/interaction/functions/fnc_canPardon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Checks if the unit can pardon the target. diff --git a/addons/interaction/functions/fnc_canPassMagazine.sqf b/addons/interaction/functions/fnc_canPassMagazine.sqf index a76e7fb409..9d0bed083d 100644 --- a/addons/interaction/functions/fnc_canPassMagazine.sqf +++ b/addons/interaction/functions/fnc_canPassMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if unit has a spare magazine for the specified weapon. diff --git a/addons/interaction/functions/fnc_canPullOutBody.sqf b/addons/interaction/functions/fnc_canPullOutBody.sqf index 7b7d93418c..167d09ecdb 100644 --- a/addons/interaction/functions/fnc_canPullOutBody.sqf +++ b/addons/interaction/functions/fnc_canPullOutBody.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Checks if unit can pull target body out of vehicle. @@ -18,6 +18,9 @@ params ["_body", "_unit"]; +// Defer to ACE Medical's unload patient if present +if (["ace_medical"] call EFUNC(common,isModLoaded)) exitWith {false}; + private _vehicle = objectParent _body; if ( diff --git a/addons/interaction/functions/fnc_canPush.sqf b/addons/interaction/functions/fnc_canPush.sqf index c8f82b65a5..28197d12cd 100644 --- a/addons/interaction/functions/fnc_canPush.sqf +++ b/addons/interaction/functions/fnc_canPush.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Checks if the boat can be pushed. diff --git a/addons/interaction/functions/fnc_canRenameGroup.sqf b/addons/interaction/functions/fnc_canRenameGroup.sqf index bc6d423435..7112db0cbb 100644 --- a/addons/interaction/functions/fnc_canRenameGroup.sqf +++ b/addons/interaction/functions/fnc_canRenameGroup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Seb * Checks if the unit is allowed to rename its group. diff --git a/addons/interaction/functions/fnc_canTapShoulder.sqf b/addons/interaction/functions/fnc_canTapShoulder.sqf index 0c3551051d..049c178152 100644 --- a/addons/interaction/functions/fnc_canTapShoulder.sqf +++ b/addons/interaction/functions/fnc_canTapShoulder.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Checks if the player can tap a shoulder. diff --git a/addons/interaction/functions/fnc_doBecomeLeader.sqf b/addons/interaction/functions/fnc_doBecomeLeader.sqf index 8bf1b23e30..bebda4d262 100644 --- a/addons/interaction/functions/fnc_doBecomeLeader.sqf +++ b/addons/interaction/functions/fnc_doBecomeLeader.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Become Leader of group. diff --git a/addons/interaction/functions/fnc_doRemoteControl.sqf b/addons/interaction/functions/fnc_doRemoteControl.sqf index 90cad9e49c..125a1b5e89 100644 --- a/addons/interaction/functions/fnc_doRemoteControl.sqf +++ b/addons/interaction/functions/fnc_doRemoteControl.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, joko + * Author: kymckay, joko * * Arguments: * None diff --git a/addons/interaction/functions/fnc_getDoor.sqf b/addons/interaction/functions/fnc_getDoor.sqf index 6503d1e9e9..02daf57a83 100644 --- a/addons/interaction/functions/fnc_getDoor.sqf +++ b/addons/interaction/functions/fnc_getDoor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Phyma * Find door. diff --git a/addons/interaction/functions/fnc_getDoorAnimations.sqf b/addons/interaction/functions/fnc_getDoorAnimations.sqf index f23a4f0ffd..2d5c81dc2d 100644 --- a/addons/interaction/functions/fnc_getDoorAnimations.sqf +++ b/addons/interaction/functions/fnc_getDoorAnimations.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Phyma * Get door animations. diff --git a/addons/interaction/functions/fnc_getDown.sqf b/addons/interaction/functions/fnc_getDown.sqf index 4291a00f0d..b8f6d7c50d 100644 --- a/addons/interaction/functions/fnc_getDown.sqf +++ b/addons/interaction/functions/fnc_getDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Forces a civilian to the ground with a chance of failure. diff --git a/addons/interaction/functions/fnc_getGlassDoor.sqf b/addons/interaction/functions/fnc_getGlassDoor.sqf index 5febe67067..ffa6bfec44 100644 --- a/addons/interaction/functions/fnc_getGlassDoor.sqf +++ b/addons/interaction/functions/fnc_getGlassDoor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Phyma * Find glass door. diff --git a/addons/interaction/functions/fnc_getInteractionDistance.sqf b/addons/interaction/functions/fnc_getInteractionDistance.sqf index 86a9f8050f..1b60b9539c 100644 --- a/addons/interaction/functions/fnc_getInteractionDistance.sqf +++ b/addons/interaction/functions/fnc_getInteractionDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets effective interaction distance (handles very large vehicles) diff --git a/addons/interaction/functions/fnc_getVehiclePos.sqf b/addons/interaction/functions/fnc_getVehiclePos.sqf index ea5b03a54e..ce2ce9377b 100644 --- a/addons/interaction/functions/fnc_getVehiclePos.sqf +++ b/addons/interaction/functions/fnc_getVehiclePos.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Return a suitable position for the action point for the given target vehicle diff --git a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf index a3ec0b46ee..f41b255ad9 100644 --- a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf +++ b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, PabstMirror * Return a suitable position for the action point for the given target vehicle diff --git a/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf b/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf index cd0e8f9730..c771589904 100644 --- a/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf +++ b/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Dystopian * Returns children actions for weapon attachment switching. diff --git a/addons/interaction/functions/fnc_getWeaponPos.sqf b/addons/interaction/functions/fnc_getWeaponPos.sqf index 9cd526c12c..85cb3dc007 100644 --- a/addons/interaction/functions/fnc_getWeaponPos.sqf +++ b/addons/interaction/functions/fnc_getWeaponPos.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Return a suitable position for the action point for the current weapon diff --git a/addons/interaction/functions/fnc_handleScrollWheel.sqf b/addons/interaction/functions/fnc_handleScrollWheel.sqf index 769995d0a6..ab27419983 100644 --- a/addons/interaction/functions/fnc_handleScrollWheel.sqf +++ b/addons/interaction/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles incremental door opening diff --git a/addons/interaction/functions/fnc_hideMouseHint.sqf b/addons/interaction/functions/fnc_hideMouseHint.sqf index 8daa6d6e09..b7f0420dc5 100644 --- a/addons/interaction/functions/fnc_hideMouseHint.sqf +++ b/addons/interaction/functions/fnc_hideMouseHint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth de Wet (LH) * Hides the interaction hint for mouse buttons. diff --git a/addons/interaction/functions/fnc_joinTeam.sqf b/addons/interaction/functions/fnc_joinTeam.sqf index 06a1ea9f72..977e902222 100644 --- a/addons/interaction/functions/fnc_joinTeam.sqf +++ b/addons/interaction/functions/fnc_joinTeam.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Unit joins a fire team. @@ -19,7 +19,7 @@ params ["_unit", "_team", ["_displayHint", false, [false]]]; -["CBA_teamColorChanged", [_unit, _team]] call CBA_fnc_globalEvent; +_unit assignTeam _team; // display message if (_unit == ACE_player) then { diff --git a/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf b/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf index 480cdaea40..eef77dfd37 100644 --- a/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf +++ b/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Modifies the ACE_JoinGroup action to show group name. diff --git a/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf b/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf index f7f82f2453..6324c0598a 100644 --- a/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf +++ b/addons/interaction/functions/fnc_modifyTeamManagementAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Modifies the ACE_TeamManagement or join team action with given group color and icon. diff --git a/addons/interaction/functions/fnc_moduleInteraction.sqf b/addons/interaction/functions/fnc_moduleInteraction.sqf index 7dd5baa464..25f9d50a45 100644 --- a/addons/interaction/functions/fnc_moduleInteraction.sqf +++ b/addons/interaction/functions/fnc_moduleInteraction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Initializes the Interaction module. diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf index cffb9e2410..a03ca26c04 100644 --- a/addons/interaction/functions/fnc_openDoor.sqf +++ b/addons/interaction/functions/fnc_openDoor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Open door. @@ -34,9 +34,14 @@ _getDoorAnimations params ["_animations"]; if (_animations isEqualTo []) exitWith {}; private _lockedVariable = format ["bis_disabled_%1", _door]; +private _lockedVariableAlt = _lockedVariable; // GM Buildings may have door names like door_01 but locking expects door_1 +if ((count _door == 7) && {(_door select [0, 6]) == "door_0"}) then { + _lockedVariableAlt = format ["bis_disabled_door_%1", _door select [6, 1]]; // stip off the leading zero then check both vars +}; // Check if the door can be locked aka have locked variable, otherwhise cant lock it -if ((_house animationPhase (_animations select 0) <= 0) && {_house getVariable [_lockedVariable, 0] == 1}) exitWith { +if ((_house animationPhase (_animations select 0) <= 0) && + {(_house getVariable [_lockedVariable, 0] == 1) || {_house getVariable [_lockedVariableAlt, 0] == 1}}) exitWith { private _lockedAnimation = format ["%1_locked_source", _door]; TRACE_3("locked",_house,_lockedAnimation,isClass (configOf _house >> "AnimationSources" >> _lockedAnimation)); if (isClass (configOf _house >> "AnimationSources" >> _lockedAnimation)) then { @@ -47,7 +52,7 @@ if ((_house animationPhase (_animations select 0) <= 0) && {_house getVariable [ // Add handle on carrier if (typeOf _house == "Land_Carrier_01_island_01_F") then { - private _handle = format ["door_handle_%1_rot_1", (_animations select 0) select [5, 1]]; + private _handle = format ["door_handle_%1_rotate_1", (_animations select 0) select [5, 1]]; TRACE_1("carrier handle",_handle); _animations pushBack _handle; }; diff --git a/addons/interaction/functions/fnc_pardon.sqf b/addons/interaction/functions/fnc_pardon.sqf index 4a64771e81..5a29c13046 100644 --- a/addons/interaction/functions/fnc_pardon.sqf +++ b/addons/interaction/functions/fnc_pardon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Unit pardons target unit. diff --git a/addons/interaction/functions/fnc_passMagazine.sqf b/addons/interaction/functions/fnc_passMagazine.sqf index f6438211fa..09513b4762 100644 --- a/addons/interaction/functions/fnc_passMagazine.sqf +++ b/addons/interaction/functions/fnc_passMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Pass spare magazine for the specified weapon. diff --git a/addons/interaction/functions/fnc_pullOutBody.sqf b/addons/interaction/functions/fnc_pullOutBody.sqf index 0ab901c916..397fc30f84 100644 --- a/addons/interaction/functions/fnc_pullOutBody.sqf +++ b/addons/interaction/functions/fnc_pullOutBody.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Makes unit pull target body out of vehicle. diff --git a/addons/interaction/functions/fnc_push.sqf b/addons/interaction/functions/fnc_push.sqf index abed6be396..be4440eceb 100644 --- a/addons/interaction/functions/fnc_push.sqf +++ b/addons/interaction/functions/fnc_push.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Pushes a boat away from the player diff --git a/addons/interaction/functions/fnc_renameGroup.sqf b/addons/interaction/functions/fnc_renameGroup.sqf index 100e02e0b8..4ffff5771a 100644 --- a/addons/interaction/functions/fnc_renameGroup.sqf +++ b/addons/interaction/functions/fnc_renameGroup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Seb * Renames a group to a given string (groupID), whilst checking that it is not an invalid name. diff --git a/addons/interaction/functions/fnc_renameGroupUI.sqf b/addons/interaction/functions/fnc_renameGroupUI.sqf index d67aff3322..5d891b0cf8 100644 --- a/addons/interaction/functions/fnc_renameGroupUI.sqf +++ b/addons/interaction/functions/fnc_renameGroupUI.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Seb * Shows a UI to allow a unit to change its group ID. @@ -16,7 +16,7 @@ */ // delay a frame so we don't overlap with interaction-menu as it closes -[{ +[{ params [["_unit", objNull, [objNull]]]; private _display = findDisplay 46 createDisplay QGVAR(groupNameDisplay); @@ -26,8 +26,8 @@ _display displayAddEventHandler ["Unload", { params ["_display", "_exitCode"]; - if !(_exitCode isEqualTo 1) exitWith {}; - + if (_exitCode isNotEqualTo 1) exitWith {}; + private _group = _display getVariable QGVAR(renamedGroup); private _textCtrl = _display displayCtrl 451; private _newName = ctrlText _textCtrl; diff --git a/addons/interaction/functions/fnc_replaceTerrainObject.sqf b/addons/interaction/functions/fnc_replaceTerrainObject.sqf index 7a164e4212..a857df3f95 100644 --- a/addons/interaction/functions/fnc_replaceTerrainObject.sqf +++ b/addons/interaction/functions/fnc_replaceTerrainObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Replaces terrain object with created one. diff --git a/addons/interaction/functions/fnc_sendAway.sqf b/addons/interaction/functions/fnc_sendAway.sqf index 4831fb7e3f..cef314756f 100644 --- a/addons/interaction/functions/fnc_sendAway.sqf +++ b/addons/interaction/functions/fnc_sendAway.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Sends a near civilian crowd away with a chance of failure. diff --git a/addons/interaction/functions/fnc_showMouseHint.sqf b/addons/interaction/functions/fnc_showMouseHint.sqf index 2c43937a0e..73567fa522 100644 --- a/addons/interaction/functions/fnc_showMouseHint.sqf +++ b/addons/interaction/functions/fnc_showMouseHint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth de Wet (LH), mharis001 * Shows an interaction hint for mouse buttons. diff --git a/addons/interaction/functions/fnc_switchWeaponAttachment.sqf b/addons/interaction/functions/fnc_switchWeaponAttachment.sqf index 4f9a9f2514..aaefb3315e 100644 --- a/addons/interaction/functions/fnc_switchWeaponAttachment.sqf +++ b/addons/interaction/functions/fnc_switchWeaponAttachment.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Dystopian * Switches weapon attachment. diff --git a/addons/interaction/functions/fnc_tapShoulder.sqf b/addons/interaction/functions/fnc_tapShoulder.sqf index c55f3b65d4..b7e88e8a7e 100644 --- a/addons/interaction/functions/fnc_tapShoulder.sqf +++ b/addons/interaction/functions/fnc_tapShoulder.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Taps a shoulder diff --git a/addons/interaction/functions/script_component.hpp b/addons/interaction/functions/script_component.hpp deleted file mode 100644 index ef1c22f146..0000000000 --- a/addons/interaction/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\interaction\script_component.hpp" \ No newline at end of file diff --git a/addons/interaction/groupRename_GUI.hpp b/addons/interaction/groupRename_GUI.hpp index a0b332b505..20684b0e46 100644 --- a/addons/interaction/groupRename_GUI.hpp +++ b/addons/interaction/groupRename_GUI.hpp @@ -14,7 +14,7 @@ class ctrlStaticTitle; class GVAR(groupNameDisplay) { idd = -1; enableSimulation = 1; - + class ControlsBackground { class Title: ctrlStaticTitle { x = QUOTE(safeZoneX + (safeZoneW / 2) - TOTAL_W/2); diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 1f2adaeaa4..27ddd5cb46 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -6,7 +6,7 @@ Interaktion Interazione 互動 - 互动 + 互动菜单 インタラクション 상호작용 Interakcja @@ -80,7 +80,7 @@ Braccio sinistro Braço Esquerdo 左腕 - 왼쪽 팔 + 왼팔 左手 左手 Sol Kol @@ -97,7 +97,7 @@ Braccio destro Braço Direito 右腕 - 오른쪽 팔 + 오른팔 右手 右手 Sağ Kol @@ -114,7 +114,7 @@ Gamba sinistra Perna Esquerda 左足 - 왼쪽 다리 + 왼다리 左脚 左腳 Sol Bacak @@ -131,7 +131,7 @@ Gamba destra Perna Direita 右足 - 오른쪽 다리 + 오른다리 右脚 右腳 Sağ Bacak @@ -166,7 +166,7 @@ Menù interazione インタラクション メニュー 상호작용 메뉴 - 互动选单 + 互动菜单 互動選單 Etkileim Menüsü @@ -183,7 +183,7 @@ Menù interazione (individuale) インタラクション メニュー (セルフ) 상호작용 메뉴(자신) - 互动选单 (自我) + 互动菜单(自我) 互動選單 (自我) Etkileşim Menüsü(Şahsi) @@ -194,7 +194,7 @@ Otwórz / Zamknij drzwi Otevřít / Zavřít dveře Ouvrir/Fermer la porte - Открыть / Закрыть двери + Открыть/закрыть двери Ajtó nyitása / zárása Abrir / Fechar Porta Apri / Chiudi la porta @@ -233,7 +233,7 @@ Odblokuj drzwi Odemknout dveře ドアの鍵をあける - 잠긴문 열기 + 잠긴 문 열기 解锁门 解鎖門 Kapının Kilidini Aç @@ -326,14 +326,35 @@ Rename Group グループ名変更 + Renommer le groupe + Переименовать группу + Gruppe umbenennen + Zmień nazwę grupy + 小队重命名 + 그룹 명칭 다시 짓기 + Renombrar grupo This group name is already in use. このグループ名は既に使われています。 + Ce nom de groupe est déjà attribué. + Данное имя группы уже используется. + Dieser Gruppenname ist bereits in Verwendung. + Ta nazwa grupy jest już w użyciu. + 该小队名称已被使用 + 그 명칭은 이미 사용 중 입니다. + Este nombre de grupo ya está siendo usado. NEW GROUP NAME: 新しいグループ名: + NOUVEAU NOM DE GROUPE : + НОВОЕ ИМЯ ГРУППЫ + NEUER GRUPPENNAME: + NOWA NAZWA GRUPY: + 新的小队名: + 새 그룹 명칭: + NUEVO NOMBRE DE GRUPO: DANCE! @@ -364,7 +385,7 @@ Parar de dançar Smetti di ballare 踊るのを止める - 춤 멈추기 + 춤 그만 추기 停止跳舞 停止跳舞 Dans Etmeyi Durdur @@ -501,7 +522,7 @@ Via di qui! 失せろ! 저리 가! - 走开! + 走开! 走開! Git! @@ -518,7 +539,7 @@ A terra! 伏せろ! 엎드려! - 趴下! + 趴下! 趴下! Yat! @@ -579,7 +600,7 @@ Vert Zielonych Zelený - Зеленый + Зелёный Verde Verde Zöld @@ -669,7 +690,7 @@ Assigner à bleu Assegna al team blu ブルーにする - 파랑이 등록 + 파랑에 등록 指派为蓝组 指派為藍組 Maviye Ata @@ -918,6 +939,7 @@ Перевернуть ひっくり返す + 翻动 Gira Przewróć Virar @@ -925,6 +947,7 @@ Otočit Voltear Döndür + 뒤집기 Interact @@ -1017,14 +1040,14 @@ ¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja Mohou hráči použít menu správy týmu? Výchozí: Ano - Разрешить ли игрокам использовать меню управления группами? По-умолчани: Да + Разрешить ли игрокам использовать меню управления группами? По умолчанию: Да 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 @@ -1035,9 +1058,9 @@ Disabilita valutazione negativa 關閉負面評價 关闭负面评价 - 부정행위 가중치 사용안함 + 부정행위 가중치 사용 안함 Wyłącz negatywną ocenę - Отключить отрицательный рейтинг + Откл. отрицательный рейтинг Desativar avaliação negativa Désactiver la notation négative Vypnout negativní hodnocení @@ -1046,13 +1069,13 @@ 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. Sollen Spieler negative Bewertungen erhalten dürfen? Wenn diese Option aktiviert ist, erhalten Spieler nur positive Bewertungen, was Freundbeschuss durch KI verhindert, wenn befreundete Ausrüstung zerstört oder befreundete Einheiten von Spielern des selben Teams getötet werden. - 否定評価を受けますか?有効化した場合プレイヤーは肯定評価のみを受け、友軍の装備を壊したり殺害をしても AI からの攻撃を防ぎます。 + 否定評価を受けますか?有効化した場合プレイヤーは肯定評価のみを受け、友軍の装備を壊したり殺害をしてもAIからの攻撃を防ぎます。 I giocatori dovrebbero ricevere delle valutazioni negative ? Quando è abilitato i giocatori ricevono esclusivamente valutazioni positive che prevengono il fuoco delle AI alleate quando distruggono equipaggiamenti o uccidono membri della squadra. 玩家是否會收到負面評價? 當本功能開啟時玩家只會接收到正面評價,所以當玩家做出擊殺友軍AI、毀壞友軍裝備或殺害小隊夥伴都不會收到負面評價 - 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。 - 플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 높은 레이팅을 가질때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다. + 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军 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. - Должны ли игроки получать отрицательный рейтинг? Когда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды. + Должны ли игроки получать отрицательный рейтинг?\nКогда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды. 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. @@ -1190,7 +1213,7 @@ Вытащить тело 身体を引き出す Estrai il corpo - 시체 끌기 + 인원 꺼내기 拿出屍體 拿出尸体 Wyciągnij ciało @@ -1214,6 +1237,8 @@ 踹開擋風玻璃 Romper parabrisas Ön camı parçala + 砸碎挡风玻璃 + 전면유리 부수기 Attach %1 @@ -1222,6 +1247,9 @@ Acoplar %1 Fixer %1 Przyczep %1 + Befestige %1 + 附加 %1 + %1 붙이기 Detach %1 @@ -1230,6 +1258,9 @@ Desacoplar %1 Retirer %1 Odczep %1 + Löse %1 + 拆卸 %1 + %1 떼내기 Enables attach/detach weapon attachment actions for current weapon. @@ -1238,19 +1269,42 @@ Activar acciones de acoplar/desacoplar accesorios para el arma actual. Cette option permet de fixer/retirer des accessoires d'arme à partir du menu d'interaction personnel. Włącza akcje przyczepienia/odczepienia dodatków dla obecnej broni + Aktiviert das Befestigen/Lösen von Waffenausätzen an der aktuellen Waffe. + 启用当前武器的附加/拆卸武器配件的动作。 + 현재 사용하고 있는 무기에서 부착물을 붙이거나 떼냅니다. Allow group rename グループ名変更を許可 + Permettre le renommage de groupe + Разрешить переименование группы + Erlaube das Umbenennen der Gruppe + Zezwól na zmianę nazwy grupy + 允许小队重命名 + 그룹 이름 재설정 허가 + Permitir renombrar grupo Allows a group leader to rename their group if the name is not already taken. グループ リーダーによるグループ名の変更を許可します。 + Cette option permet aux chefs de groupe de modifier le nom de leur groupe. + Разрешить лидеру группы её переименование, если имя не занято. + Erlaube Gruppenführer das Umbenennen Ihrer Gruppe, wenn der Name nicht bereits vergeben ist. + Pozwala liderowi grupy na zmianę jej nazwy, jeżeli ta nazwa nie jest już w użyciu. + 允许队长在队名未被占用的情况下重命名。 + 그룹 리더가 그룹 이름을 재설정 하는 것을 허가합니다. + Permite al lider de un grupo renombrar a su grupo si el nombre no está siendo actualmente usado. Warning: can cause some objects to collide with others. Внимание: может вызвать отталкивание некоторых объектов друг от друга. + Attention : certains objets peuvent entrer en collision avec d'autres. 警告: 一部のオブジェクトが干渉する可能性があります。 + Achtung: einige Objekte könnten mit anderen Kollidieren. + Uwaga: niektóre obiekty mogą kolidować z innymi. + 警告:会导致一些物体与其他物体发生碰撞。 + 주의: 물체끼리 충돌하는 현상이 있을 수 있음. + Advertencia: puede provocar que algunos objetos choquen con otros. diff --git a/addons/inventory/functions/fnc_addCustomFilter.sqf b/addons/inventory/functions/fnc_addCustomFilter.sqf index 6d7ab4796f..6dd6e1f559 100644 --- a/addons/inventory/functions/fnc_addCustomFilter.sqf +++ b/addons/inventory/functions/fnc_addCustomFilter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Adds a custom filter list to the inventory display. diff --git a/addons/inventory/functions/fnc_currentItemListBox.sqf b/addons/inventory/functions/fnc_currentItemListBox.sqf index 3419c8dfff..b3e5ce40b8 100644 --- a/addons/inventory/functions/fnc_currentItemListBox.sqf +++ b/addons/inventory/functions/fnc_currentItemListBox.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the current item list box of given inventory display. diff --git a/addons/inventory/functions/fnc_filterBackpacks.sqf b/addons/inventory/functions/fnc_filterBackpacks.sqf index 66f33ec105..6cb94f3d1c 100644 --- a/addons/inventory/functions/fnc_filterBackpacks.sqf +++ b/addons/inventory/functions/fnc_filterBackpacks.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Filter condition for the Backpacks filter list diff --git a/addons/inventory/functions/fnc_filterGrenades.sqf b/addons/inventory/functions/fnc_filterGrenades.sqf index 777f8c01cb..6d2b813ae4 100644 --- a/addons/inventory/functions/fnc_filterGrenades.sqf +++ b/addons/inventory/functions/fnc_filterGrenades.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Filter condition for the Grenades filter list diff --git a/addons/inventory/functions/fnc_filterHeadgear.sqf b/addons/inventory/functions/fnc_filterHeadgear.sqf index e75898849e..134a4fc45f 100644 --- a/addons/inventory/functions/fnc_filterHeadgear.sqf +++ b/addons/inventory/functions/fnc_filterHeadgear.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Filter condition for the Headgear filter list diff --git a/addons/inventory/functions/fnc_filterItems.sqf b/addons/inventory/functions/fnc_filterItems.sqf index 78343127af..0bdb18310f 100644 --- a/addons/inventory/functions/fnc_filterItems.sqf +++ b/addons/inventory/functions/fnc_filterItems.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove uniforms, vests and backpacks from Items filter. diff --git a/addons/inventory/functions/fnc_filterMagazines.sqf b/addons/inventory/functions/fnc_filterMagazines.sqf index 0e23872d73..4b7747c5a8 100644 --- a/addons/inventory/functions/fnc_filterMagazines.sqf +++ b/addons/inventory/functions/fnc_filterMagazines.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove backpacks and grenades from Magazines filter. diff --git a/addons/inventory/functions/fnc_filterMedical.sqf b/addons/inventory/functions/fnc_filterMedical.sqf index 6e04ddc3de..ec44ba2a76 100644 --- a/addons/inventory/functions/fnc_filterMedical.sqf +++ b/addons/inventory/functions/fnc_filterMedical.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Filter condition for the Medical filter list diff --git a/addons/inventory/functions/fnc_filterUniforms.sqf b/addons/inventory/functions/fnc_filterUniforms.sqf index 39529121a5..dc7d4e9287 100644 --- a/addons/inventory/functions/fnc_filterUniforms.sqf +++ b/addons/inventory/functions/fnc_filterUniforms.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Filter condition for the Uniforms filter list diff --git a/addons/inventory/functions/fnc_filterVests.sqf b/addons/inventory/functions/fnc_filterVests.sqf index 99115ac84f..439d826390 100644 --- a/addons/inventory/functions/fnc_filterVests.sqf +++ b/addons/inventory/functions/fnc_filterVests.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Filter condition for the Vests filter list diff --git a/addons/inventory/functions/fnc_filterWeapons.sqf b/addons/inventory/functions/fnc_filterWeapons.sqf index 60065069bb..2addf83665 100644 --- a/addons/inventory/functions/fnc_filterWeapons.sqf +++ b/addons/inventory/functions/fnc_filterWeapons.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Remove backpacks from Weapons filter. diff --git a/addons/inventory/functions/fnc_forceItemListUpdate.sqf b/addons/inventory/functions/fnc_forceItemListUpdate.sqf index e162aeee6c..165bff1e57 100644 --- a/addons/inventory/functions/fnc_forceItemListUpdate.sqf +++ b/addons/inventory/functions/fnc_forceItemListUpdate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Updates item list and removes every entry that does not fit in the currently selected filter list. diff --git a/addons/inventory/functions/fnc_inventoryDisplayLoad.sqf b/addons/inventory/functions/fnc_inventoryDisplayLoad.sqf index 8657d212cd..1411ec6cc8 100644 --- a/addons/inventory/functions/fnc_inventoryDisplayLoad.sqf +++ b/addons/inventory/functions/fnc_inventoryDisplayLoad.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Executed every time an inventory display is opened. diff --git a/addons/inventory/functions/fnc_onLBSelChanged.sqf b/addons/inventory/functions/fnc_onLBSelChanged.sqf index 7f20e48fdf..6fbc7020c0 100644 --- a/addons/inventory/functions/fnc_onLBSelChanged.sqf +++ b/addons/inventory/functions/fnc_onLBSelChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Executed when the filter list box is changed. diff --git a/addons/inventory/functions/script_component.hpp b/addons/inventory/functions/script_component.hpp deleted file mode 100644 index 07c5e38d2d..0000000000 --- a/addons/inventory/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\inventory\script_component.hpp" \ No newline at end of file diff --git a/addons/inventory/initSettings.sqf b/addons/inventory/initSettings.sqf index 21f8c3efe3..be7ff37b99 100644 --- a/addons/inventory/initSettings.sqf +++ b/addons/inventory/initSettings.sqf @@ -1,7 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), localize "str_a3_gear1"]; + [ QGVAR(inventoryDisplaySize), "LIST", [LSTRING(SettingName), LSTRING(SettingDescription)], - "ACE Uncategorized", + _category, [[0, 1, 2], ["str_medium", "str_large", "str_very_large"], 0], 0 ] call CBA_fnc_addSetting; diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index e5ed300836..026e23476c 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -30,8 +30,8 @@ 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. 通常、インベントリは UI の大きさにより調整して表示されます。これはインベントリ UI を大きくできますが、文字は大きくできません。 - 보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케하면서 글씨는 그대로 냅두게 해줍니다. - 一般来说,物品清单尺寸是由使用者介面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数! + 보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케 하면서 글씨는 그대로 놔두게 해줍니다. + 一般来说,物品清单尺寸是由使用者界面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数! 一般來說,物品清單尺寸是由使用者介面來決定的。此選項能讓你的物品顯示清單更大但不會增加字體大小,此舉可增加更多能被顯示的描述行數! 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. diff --git a/addons/irlight/$PBOPREFIX$ b/addons/irlight/$PBOPREFIX$ new file mode 100644 index 0000000000..5bb6f98681 --- /dev/null +++ b/addons/irlight/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\irlight diff --git a/addons/irlight/CfgEventHandlers.hpp b/addons/irlight/CfgEventHandlers.hpp new file mode 100644 index 0000000000..66a525846a --- /dev/null +++ b/addons/irlight/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/irlight/CfgJointRails.hpp b/addons/irlight/CfgJointRails.hpp new file mode 100644 index 0000000000..f9b3081c42 --- /dev/null +++ b/addons/irlight/CfgJointRails.hpp @@ -0,0 +1,82 @@ +class SlotInfo; +class PointerSlot: SlotInfo { + compatibleItems[] += { + "ACE_DBAL_A3_Red", + "ACE_DBAL_A3_Red_IP", + "ACE_DBAL_A3_Red_II", + "ACE_DBAL_A3_Red_VP", + "ACE_DBAL_A3_Red_LR", + "ACE_DBAL_A3_Red_LR_IP", + "ACE_DBAL_A3_Red_LR_II", + "ACE_DBAL_A3_Red_LR_VP", + "ACE_DBAL_A3_Green", + "ACE_DBAL_A3_Green_IP", + "ACE_DBAL_A3_Green_II", + "ACE_DBAL_A3_Green_VP", + "ACE_DBAL_A3_Green_LR", + "ACE_DBAL_A3_Green_LR_IP", + "ACE_DBAL_A3_Green_LR_II", + "ACE_DBAL_A3_Green_LR_VP", + "ACE_SPIR", + "ACE_SPIR_Medium", + "ACE_SPIR_Narrow", + "ACE_SPIR_LR", + "ACE_SPIR_LR_Medium", + "ACE_SPIR_LR_Narrow" + }; +}; + +class PointerSlot_Rail: PointerSlot { + class compatibleItems { + ACE_DBAL_A3_Red = 1; + ACE_DBAL_A3_Red_IP = 1; + ACE_DBAL_A3_Red_II = 1; + ACE_DBAL_A3_Red_VP = 1; + ACE_DBAL_A3_Red_LR = 1; + ACE_DBAL_A3_Red_LR_IP = 1; + ACE_DBAL_A3_Red_LR_II = 1; + ACE_DBAL_A3_Red_LR_VP = 1; + ACE_DBAL_A3_Green = 1; + ACE_DBAL_A3_Green_IP = 1; + ACE_DBAL_A3_Green_II = 1; + ACE_DBAL_A3_Green_VP = 1; + ACE_DBAL_A3_Green_LR = 1; + ACE_DBAL_A3_Green_LR_IP = 1; + ACE_DBAL_A3_Green_LR_II = 1; + ACE_DBAL_A3_Green_LR_VP = 1; + ACE_SPIR = 1; + ACE_SPIR_Medium = 1; + ACE_SPIR_Narrow = 1; + ACE_SPIR_LR = 1; + ACE_SPIR_LR_Medium = 1; + ACE_SPIR_LR_Narrow = 1; + }; +}; + +class asdg_SlotInfo; +class asdg_FrontSideRail: asdg_SlotInfo { + class compatibleItems { + ACE_DBAL_A3_Red = 1; + ACE_DBAL_A3_Red_IP = 1; + ACE_DBAL_A3_Red_II = 1; + ACE_DBAL_A3_Red_VP = 1; + ACE_DBAL_A3_Red_LR = 1; + ACE_DBAL_A3_Red_LR_IP = 1; + ACE_DBAL_A3_Red_LR_II = 1; + ACE_DBAL_A3_Red_LR_VP = 1; + ACE_DBAL_A3_Green = 1; + ACE_DBAL_A3_Green_IP = 1; + ACE_DBAL_A3_Green_II = 1; + ACE_DBAL_A3_Green_VP = 1; + ACE_DBAL_A3_Green_LR = 1; + ACE_DBAL_A3_Green_LR_IP = 1; + ACE_DBAL_A3_Green_LR_II = 1; + ACE_DBAL_A3_Green_LR_VP = 1; + ACE_SPIR = 1; + ACE_SPIR_Medium = 1; + ACE_SPIR_Narrow = 1; + ACE_SPIR_LR = 1; + ACE_SPIR_LR_Medium = 1; + ACE_SPIR_LR_Narrow = 1; + }; +}; diff --git a/addons/irlight/CfgWeapons.hpp b/addons/irlight/CfgWeapons.hpp new file mode 100644 index 0000000000..734bd7a7fe --- /dev/null +++ b/addons/irlight/CfgWeapons.hpp @@ -0,0 +1,378 @@ +// Only a dependency when building +#include "\z\ace\addons\laserpointer\script_macros_config.hpp" + +// Attenuation and Flashlight seem to not work with inheritance +#define DBAL_A3_FLASHLIGHT \ + class Flashlight { \ + color[] = {1, 1, 1}; \ + ambient[] = {1, 1, 1}; \ + size = 1; \ + innerAngle = 10; \ + outerAngle = 12; \ + position = "laser pos"; \ + direction = "laser dir"; \ + useFlare = 1; \ + flareSize = 1.4; \ + flareMaxDistance = 200; \ + coneFadeCoef = 6; \ + intensity = 100; \ + irLight = 1; \ + volumeShape = "a3\data_f\VolumeLightFlashlight.p3d"; \ + scale[] = {0.25, 0.25, 1}; \ + class Attenuation { \ + constant = 1; \ + linear = 0; \ + quadratic = 0.008; \ + start = 1; \ + hardLimitStart = 220; \ + hardLimitEnd = 250; \ + }; \ + } +#define DBAL_A3_FLASHLIGHT_LR \ + class Flashlight { \ + color[] = {1, 1, 1}; \ + ambient[] = {1, 1, 1}; \ + size = 1; \ + innerAngle = 10; \ + outerAngle = 12; \ + position = "laser pos"; \ + direction = "laser dir"; \ + useFlare = 1; \ + flareSize = 1.4; \ + flareMaxDistance = 200; \ + coneFadeCoef = 6; \ + intensity = 200; \ + irLight = 1; \ + volumeShape = "a3\data_f\VolumeLightFlashlight.p3d"; \ + scale[] = {0.25, 0.25, 1}; \ + class Attenuation { \ + constant = 1; \ + linear = 0; \ + quadratic = 0.001; \ + start = 1; \ + hardLimitStart = 570; \ + hardLimitEnd = 600; \ + }; \ + } +#define SPIR_FLASHLIGHT(hardLimitStart,hardLimitEnd) \ + color[] = {1, 1, 1}; \ + ambient[] = {1, 1, 1}; \ + size = 1; \ + position = "flash dir"; \ + direction = "flash"; \ + useFlare = 1; \ + flareSize = 1.4; \ + flareMaxDistance = 100; \ + irLight = 1; \ + volumeShape = "a3\data_f\VolumeLightFlashlight.p3d"; \ + class Attenuation { \ + constant = 1; \ + linear = 0; \ + quadratic = 0.02; \ + start = 1; \ + hardLimitStart = hardLimitStart; \ + hardLimitEnd = hardLimitEnd; \ + } +#define SPIR_FLASHLIGHT_LR(hardLimitStart,hardLimitEnd) \ + color[] = {1, 1, 1}; \ + ambient[] = {1, 1, 1}; \ + size = 1; \ + position = "flash dir"; \ + direction = "flash"; \ + useFlare = 1; \ + flareSize = 1.4; \ + flareMaxDistance = 100; \ + irLight = 1; \ + volumeShape = "a3\data_f\VolumeLightFlashlight.p3d"; \ + class Attenuation { \ + constant = 1; \ + linear = 0; \ + quadratic = 0.002; \ + start = 1; \ + hardLimitStart = hardLimitStart; \ + hardLimitEnd = hardLimitEnd; \ + } +#define POINTER_IR \ + class Pointer { \ + irLaserPos = "laser pos"; \ + irLaserEnd = "laser dir"; \ + irDistance = 5; \ + } + + +class CfgWeapons { + class acc_pointer_IR; + class acc_flashlight; + class InventoryFlashlightItem_Base_F; + + // DBAL-A3 (red pointer) + // IR Pointer + Illuminator + class ACE_DBAL_A3_Red: acc_pointer_IR { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(DBAL_A3_Red); + descriptionUse = CSTRING(DBAL_A3_DescriptionUse); + descriptionShort = CSTRING(DBAL_A3_DescriptionShort); + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_IP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_VP"; + MRT_SwitchItemHintText = CSTRING(Mode_IRDual); + baseWeapon = "ACE_DBAL_A3_Red"; + + class ItemInfo: InventoryFlashLightItem_Base_F { + DBAL_A3_FLASHLIGHT; + POINTER_IR; + }; + }; + + // IR Pointer only + class ACE_DBAL_A3_Red_IP: ACE_DBAL_A3_Red { + scope = 1; + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_II"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red"; + MRT_SwitchItemHintText = CSTRING(Mode_IRPointer); + + class ItemInfo: InventoryFlashLightItem_Base_F { + class Flashlight {}; + POINTER_IR; + }; + }; + + // Illuminator only + class ACE_DBAL_A3_Red_II: ACE_DBAL_A3_Red { + scope = 1; + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_VP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_IP"; + MRT_SwitchItemHintText = CSTRING(Mode_IRIlluminator); + + class ItemInfo: InventoryFlashLightItem_Base_F { + DBAL_A3_FLASHLIGHT; + }; + }; + + // Visible Pointer only + class ACE_DBAL_A3_Red_VP: ACE_DBAL_A3_Red { + scope = 1; + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_II"; + MRT_SwitchItemHintText = CSTRING(Mode_VisiblePointer); + + class ItemInfo: InventoryFlashLightItem_Base_F { + class Flashlight {}; + POINTER_VISIBLE_RED; + }; + }; + + // DBAL-A3 (red pointer, long range) + class ACE_DBAL_A3_Red_LR: ACE_DBAL_A3_Red { + scope = 1; + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_LR_IP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_LR_VP"; + baseWeapon = "ACE_DBAL_A3_Red_LR"; + + class ItemInfo: InventoryFlashLightItem_Base_F { + DBAL_A3_FLASHLIGHT_LR; + POINTER_IR; + }; + }; + + class ACE_DBAL_A3_Red_LR_IP: ACE_DBAL_A3_Red_IP { + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_LR_II"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_LR"; + baseWeapon = "ACE_DBAL_A3_Red_LR"; + }; + + class ACE_DBAL_A3_Red_LR_II: ACE_DBAL_A3_Red_II { + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_LR_VP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_LR_IP"; + baseWeapon = "ACE_DBAL_A3_Red_LR"; + + class ItemInfo: InventoryFlashLightItem_Base_F { + DBAL_A3_FLASHLIGHT_LR; + }; + }; + + class ACE_DBAL_A3_Red_LR_VP: ACE_DBAL_A3_Red_VP { + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Red_LR"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Red_LR_II"; + baseWeapon = "ACE_DBAL_A3_Red_LR"; + }; + + // DBAL-A3 (green pointer) + class ACE_DBAL_A3_Green: ACE_DBAL_A3_Red { + scope = 2; + displayName = CSTRING(DBAL_A3_Green); + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_IP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_VP"; + baseWeapon = "ACE_DBAL_A3_Green"; + }; + + class ACE_DBAL_A3_Green_IP: ACE_DBAL_A3_Red_IP { + displayName = CSTRING(DBAL_A3_Green); + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_II"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green"; + baseWeapon = "ACE_DBAL_A3_Green"; + }; + + class ACE_DBAL_A3_Green_II: ACE_DBAL_A3_Red_II { + displayName = CSTRING(DBAL_A3_Green); + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_VP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_IP"; + baseWeapon = "ACE_DBAL_A3_Green"; + }; + + class ACE_DBAL_A3_Green_VP: ACE_DBAL_A3_Red_VP { + displayName = CSTRING(DBAL_A3_Green); + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_II"; + baseWeapon = "ACE_DBAL_A3_Green"; + class ItemInfo: ItemInfo { + POINTER_VISIBLE_GREEN; + }; + }; + + // DBAL-A3 (green pointer, long range) + class ACE_DBAL_A3_Green_LR: ACE_DBAL_A3_Green { + scope = 1; + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_LR_IP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_LR_VP"; + baseWeapon = "ACE_DBAL_A3_Green_LR"; + + class ItemInfo: InventoryFlashLightItem_Base_F { + DBAL_A3_FLASHLIGHT; + POINTER_IR; + }; + }; + + class ACE_DBAL_A3_Green_LR_IP: ACE_DBAL_A3_Green_IP { + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_LR_II"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_LR"; + baseWeapon = "ACE_DBAL_A3_Green_LR"; + }; + + class ACE_DBAL_A3_Green_LR_II: ACE_DBAL_A3_Green_II { + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_LR_VP"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_LR_IP"; + baseWeapon = "ACE_DBAL_A3_Green_LR"; + + class ItemInfo: InventoryFlashLightItem_Base_F { + DBAL_A3_FLASHLIGHT; + }; + }; + + class ACE_DBAL_A3_Green_LR_VP: ACE_DBAL_A3_Green_VP { + MRT_SwitchItemNextClass = "ACE_DBAL_A3_Green_LR"; + MRT_SwitchItemPrevClass = "ACE_DBAL_A3_Green_LR_II"; + baseWeapon = "ACE_DBAL_A3_Green_LR"; + }; + + // SPIR + class ACE_SPIR: acc_flashlight { + author = ECSTRING(common,ACETeam); + displayName = "SPIR"; + descriptionUse = CSTRING(SPIR_DescriptionUse); + descriptionShort = CSTRING(SPIR_DescriptionShort); + MRT_SwitchItemNextClass = "ACE_SPIR_Medium"; + MRT_SwitchItemPrevClass = "ACE_SPIR_Narrow"; + MRT_SwitchItemHintText = CSTRING(Mode_Wide); + baseWeapon = "ACE_SPIR"; + + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + SPIR_FLASHLIGHT(50,70); + innerAngle = 20; + outerAngle = 32; + coneFadeCoef = 2; + intensity = 50; + scale[] = {1, 1, 1}; + }; + }; + }; + + class ACE_SPIR_Medium: ACE_SPIR { + scope = 1; + MRT_SwitchItemNextClass = "ACE_SPIR_Narrow"; + MRT_SwitchItemPrevClass = "ACE_SPIR"; + MRT_SwitchItemHintText = CSTRING(Mode_Medium); + + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + SPIR_FLASHLIGHT(80,100); + intensity = 100; + innerAngle = 10; + outerAngle = 12; + coneFadeCoef = 3; + scale[] = {1, 1, 5}; + }; + }; + }; + + class ACE_SPIR_Narrow: ACE_SPIR { + scope = 1; + MRT_SwitchItemNextClass = "ACE_SPIR"; + MRT_SwitchItemPrevClass = "ACE_SPIR_Medium"; + MRT_SwitchItemHintText = CSTRING(Mode_Narrow); + + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + SPIR_FLASHLIGHT(120,150); + intensity = 200; + innerAngle = 5; + outerAngle = 6; + coneFadeCoef = 4; + scale[] = {1, 1, 10}; + }; + }; + }; + + // SPIR (long range) + class ACE_SPIR_LR: ACE_SPIR { + scope = 1; + MRT_SwitchItemNextClass = "ACE_SPIR_LR_Medium"; + MRT_SwitchItemPrevClass = "ACE_SPIR_LR_Narrow"; + baseWeapon = "ACE_SPIR_LR"; + + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + SPIR_FLASHLIGHT_LR(80,100); + innerAngle = 20; + outerAngle = 32; + coneFadeCoef = 2; + intensity = 50; + scale[] = {1, 1, 1}; + }; + }; + }; + + class ACE_SPIR_LR_Medium: ACE_SPIR_LR { + MRT_SwitchItemNextClass = "ACE_SPIR_LR_Narrow"; + MRT_SwitchItemPrevClass = "ACE_SPIR_LR"; + MRT_SwitchItemHintText = CSTRING(Mode_Medium); + + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + SPIR_FLASHLIGHT_LR(100,120); + intensity = 100; + innerAngle = 10; + outerAngle = 12; + coneFadeCoef = 3; + scale[] = {1, 1, 5}; + }; + }; + }; + + class ACE_SPIR_LR_Narrow: ACE_SPIR_LR { + MRT_SwitchItemNextClass = "ACE_SPIR_LR"; + MRT_SwitchItemPrevClass = "ACE_SPIR_LR_Medium"; + MRT_SwitchItemHintText = CSTRING(Mode_Narrow); + + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + SPIR_FLASHLIGHT_LR(180,200); + intensity = 200; + innerAngle = 5; + outerAngle = 6; + coneFadeCoef = 4; + scale[] = {1, 1, 10}; + }; + }; + }; +}; diff --git a/addons/irlight/README.md b/addons/irlight/README.md new file mode 100644 index 0000000000..3e55e4903f --- /dev/null +++ b/addons/irlight/README.md @@ -0,0 +1,4 @@ +ace_irlight +=================== + +Adds IR flashlights. diff --git a/addons/irlight/XEH_PREP.hpp b/addons/irlight/XEH_PREP.hpp new file mode 100644 index 0000000000..db1a29d22e --- /dev/null +++ b/addons/irlight/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(getGlowOffset); +PREP(initItemContextMenu); +PREP(onLightToggled); diff --git a/addons/irlight/XEH_postInit.sqf b/addons/irlight/XEH_postInit.sqf new file mode 100644 index 0000000000..47763b8414 --- /dev/null +++ b/addons/irlight/XEH_postInit.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" + +[] call FUNC(initItemContextMenu); + +addUserActionEventHandler ["headlights", "Deactivate", FUNC(onLightToggled)]; + +["ACE3 Equipment", QGVAR(hold), LLSTRING(MomentarySwitch), { + ACE_player action ["GunLightOn", ACE_player]; + ACE_player action ["IRLaserOn", ACE_player]; + [] call FUNC(onLightToggled); + true +}, { + ACE_player action ["GunLightOff", ACE_player]; + ACE_player action ["IRLaserOff", ACE_player]; + [] call FUNC(onLightToggled); + true +}] call CBA_fnc_addKeybind; + +["CBA_attachmentSwitched", { + params ["", "", "_item"]; + + private _substr = _item select [0, 8]; + if ( + ACE_player getVariable [QGVAR(isTurnedOn), false] + && {_substr == "ACE_SPIR" || {_substr == "ACE_DBAL"}} + ) then { + ACE_player action ["GunLightOn", ACE_player]; + ACE_player action ["IRLaserOn", ACE_player]; + }; +}] call CBA_fnc_addEventHandler; diff --git a/addons/irlight/XEH_preInit.sqf b/addons/irlight/XEH_preInit.sqf new file mode 100644 index 0000000000..b47cf6628d --- /dev/null +++ b/addons/irlight/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/irlight/XEH_preStart.sqf b/addons/irlight/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/irlight/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/irlight/config.cpp b/addons/irlight/config.cpp new file mode 100644 index 0000000000..9446d8e9d7 --- /dev/null +++ b/addons/irlight/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut", "OmniMan"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgJointRails.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/irlight/data/irglow.p3d b/addons/irlight/data/irglow.p3d new file mode 100644 index 0000000000..d43e40d0f0 Binary files /dev/null and b/addons/irlight/data/irglow.p3d differ diff --git a/addons/irlight/data/irglow.rvmat b/addons/irlight/data/irglow.rvmat new file mode 100644 index 0000000000..d39184a535 --- /dev/null +++ b/addons/irlight/data/irglow.rvmat @@ -0,0 +1,79 @@ +ambient[] = {0, 0, 0, 1}; +diffuse[] = {0, 0, 0, 1}; +forcedDiffuse[] = {0, 0, 0, 1}; +emmisive[] = {775, 121, 549, 0}; +specular[] = {0, 0, 0, 1}; +specularPower = 30; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 { + texture = "#(argb,8,8,3)color(0.5,0.5,1,1,NOHQ)"; + 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,0.5,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(1.0,1.0,1.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.0,1.0,1.0,1.0,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,0.0,1,0,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(0.4,0.2)"; + 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"; + useWorldEnvMap = "true"; + uvSource = "tex"; + class uvTransform { + aside[] = {1, 0, 0}; + up[] = {0, 1, 0}; + dir[] = {0, 0, 0}; + pos[] = {0, 0, 0}; + }; +}; diff --git a/addons/irlight/data/model.cfg b/addons/irlight/data/model.cfg new file mode 100644 index 0000000000..949c7bebcc --- /dev/null +++ b/addons/irlight/data/model.cfg @@ -0,0 +1,8 @@ +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {""}; + skeletonName = ""; + }; + class irglow: Default {}; +}; diff --git a/addons/irlight/dev/createTestLight.sqf b/addons/irlight/dev/createTestLight.sqf new file mode 100644 index 0000000000..3aace8ab3d --- /dev/null +++ b/addons/irlight/dev/createTestLight.sqf @@ -0,0 +1,42 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Creates a scripted test light to test weapon lights without reloading. + * + * Arguments: + * 0: Flashlight class name + * + * Return Value: + * None + * + * Example: + * "ACE_SPIR" call compile preprocessFileLineNumbers "\z\ace\addons\irlight\dev\createTestLight.sqf" + * + * Public: No + */ + +params ["_className"]; + +private _cfg = configFile >> "CfgWeapons" >> _className >> "ItemInfo" >> "Flashlight"; + +deleteVehicle lgt; +lgt = "#lightreflector" createVehicleLocal [0, 0, 0]; +lgt attachTo [player, [0.0396804,0.237947,0.104276], "proxy:\a3\characters_f\proxies\weapon.001", true]; +lgt setLightIntensity getNumber (_cfg >> "intensity"); +lgt setLightColor (getArray (_cfg >> "color") select [0, 3]); +lgt setLightAmbient (getArray (_cfg >> "ambient") select [0, 3]); +lgt setLightConePars [ + getNumber (_cfg >> "outerAngle"), + getNumber (_cfg >> "innerAngle"), + getNumber (_cfg >> "coneFadeCoef") +]; + +attenuation = [ + getNumber (_cfg >> "Attenuation" >> "start"), + getNumber (_cfg >> "Attenuation" >> "constant"), + getNumber (_cfg >> "Attenuation" >> "linear"), + getNumber (_cfg >> "Attenuation" >> "quadratic"), + getNumber (_cfg >> "Attenuation" >> "hardLimitStart"), + getNumber (_cfg >> "Attenuation" >> "hardLimitEnd") +]; +lgt setLightAttenuation attenuation; diff --git a/addons/irlight/functions/fnc_getGlowOffset.sqf b/addons/irlight/functions/fnc_getGlowOffset.sqf new file mode 100644 index 0000000000..613e551111 --- /dev/null +++ b/addons/irlight/functions/fnc_getGlowOffset.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Gets the player model offset of the IR laser origin. + * Currently unused, see onLightToggled. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_irlight_fnc_getGlowOffset + * + * Public: No + */ + +if (isNil QGVAR(offsetCache)) then { + GVAR(offsetCache) = createHashMap; +}; + +private _weapon = currentWeapon ACE_player; +private _laser = ((weaponsItems ACE_player) select {_x#0 == _weapon})#0#2; + +GVAR(offsetCache) getOrDefaultCall [[_weapon, _laser], { + private _model = getText (configFile >> "CfgWeapons" >> _weapon >> "model"); + private _dummy = createSimpleObject [_model, [0, 0, 0], true]; + private _proxyOffset = _dummy selectionPosition ["\a3\data_f\proxies\weapon_slots\SIDE.001", 1]; + _proxyOffset = [_proxyOffset#1, _proxyOffset#0 * -1, _proxyOffset#2]; + deleteVehicle _dummy; + + _model = getText (configFile >> "CfgWeapons" >> _laser >> "model"); + _dummy = createSimpleObject [_model, [0, 0, 0], true]; + private _selection = getText (configFile >> "CfgWeapons" >> _laser >> "ItemInfo" >> "Pointer" >> "irLaserPos"); + private _laserOffset = _dummy selectionPosition [_selection, "Memory"]; + _laserOffset = [_laserOffset#1, _laserOffset#0 * -1, _laserOffset#2 * -1]; + deleteVehicle _dummy; + + _proxyOffset vectorAdd _laserOffset +}, true]; diff --git a/addons/irlight/functions/fnc_initItemContextMenu.sqf b/addons/irlight/functions/fnc_initItemContextMenu.sqf new file mode 100644 index 0000000000..fa75eba77b --- /dev/null +++ b/addons/irlight/functions/fnc_initItemContextMenu.sqf @@ -0,0 +1,52 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Initializes the item context menu for the DBAL. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_irlight_fnc_initItemContextMenu + * + * Public: No + */ + +{ + _x params ["_variant", "_displayName"]; + + [ + "ACE_DBAL_A3_Red", "POINTER", _displayName, [], "", { + params ["", "", "_item", "", "_variant"]; + + private _baseClass = getText (configFile >> "CfgWeapons" >> _item >> "baseWeapon"); + _item != _baseClass + _variant + }, { + params ["", "", "_item", "", "_variant"]; + + private _baseClass = getText (configFile >> "CfgWeapons" >> _item >> "baseWeapon"); + + ACE_player removePrimaryWeaponItem _item; + ACE_player addPrimaryWeaponItem (_baseClass + _variant); + playSound "click"; + + if (_turnedOn) then { + // Force update of flashlight + ACE_player action ["GunLightOff", ACE_player]; + + { + ACE_player action ["GunLightOn", ACE_player]; + ACE_player action ["IRLaserOn", ACE_player]; + } call CBA_fnc_execNextFrame; + }; + }, false, _variant + ] call CBA_fnc_addItemContextMenuOption; +} forEach [ + ["", LSTRING(Mode_IRDual)], + ["_IP", LSTRING(Mode_IRPointer)], + ["_II", LSTRING(Mode_IRIlluminator)], + ["_VP", LSTRING(Mode_VisiblePointer)] +]; diff --git a/addons/irlight/functions/fnc_onLightToggled.sqf b/addons/irlight/functions/fnc_onLightToggled.sqf new file mode 100644 index 0000000000..b3592f28f6 --- /dev/null +++ b/addons/irlight/functions/fnc_onLightToggled.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles toggling flashlights on and off. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_irlight_fnc_onLightToggled + * + * Public: No + */ + +private _isTurnedOn = ACE_player isFlashlightOn primaryWeapon ACE_player + || ACE_player isIRLaserOn primaryWeapon ACE_player; +ACE_player setVariable [QGVAR(isTurnedOn), _isTurnedOn]; + +// This is a surprise tool that will help us later +// Requires: https://feedback.bistudio.com/T170774 +/* +deleteVehicle (ACE_player getVariable [QGVAR(glow), objNull]); + +if (ACE_player isIRLaserOn currentWeapon ACE_player) then { + private _offset = [] call FUNC(getGlowOffset); + private _glow = createSimpleObject [QPATHTOF(data\irglow.p3d), [0, 0, 0]]; + _glow attachTo [ACE_player, _offset, "proxy:\a3\characters_f\proxies\weapon.001", true]; + _glow setObjectTexture [0, "#(rgb,8,8,3)color(0.35,0,0.38,0.1)"]; + _glow setObjectScale 0.1; + + ACE_player setVariable [QGVAR(glow), _glow]; +}; +*/ diff --git a/addons/irlight/script_component.hpp b/addons/irlight/script_component.hpp new file mode 100644 index 0000000000..76e3eb11a3 --- /dev/null +++ b/addons/irlight/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT irlight +#define COMPONENT_BEAUTIFIED IR Lights +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_IRLIGHT + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_IRLIGHT + #define DEBUG_SETTINGS DEBUG_SETTINGS_IRLIGHT +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/irlight/stringtable.xml b/addons/irlight/stringtable.xml new file mode 100644 index 0000000000..50d93bcd56 --- /dev/null +++ b/addons/irlight/stringtable.xml @@ -0,0 +1,61 @@ + + + + + DBAL-A3 (red) + DBAL-A3 (rot) + + + DBAL-A3 (green) + DBAL-A3 (grün) + + + <t color='#9cf953'>Use: </t>Turn Laser ON/OFF<br>Double click to switch mode + <t color='#9cf953'>Benutzen: </t>Laser EIN/AUS<br>Doppelklick um Modus zu wechseln + + + Dual Beam Aiming Laser + Doppelstrahllaservisier + + + Visible Laser + Sichtbarer Laser + + + IR Laser + IR-Laser + + + IR Illuminator + IR-Taschenlampe + + + IR Laser and Illuminator + IR-Laser und -Licht + + + Wide Beam + Breiter Lichtstrahl + + + Medium Beam + Mittlerer Lichtstrahl + + + Narrow Beam + Schmaler Lichtstrahl + + + <t color='#9cf953'>Use: </t>Turn Light ON/OFF<br>Double click to switch mode + <t color='#9cf953'>Benutzen: </t>Licht EIN/AUS<br>Doppelklick um Modus zu wechseln + + + Special Purpose IR LED Illuminator + Infrarot LED Taschenlampe + + + Illuminator / Laser Momentary Switch + Licht / Laser Tastschalter + + + diff --git a/addons/javelin/CfgSounds.hpp b/addons/javelin/CfgSounds.hpp index 9cd2627fa2..289a571e6e 100644 --- a/addons/javelin/CfgSounds.hpp +++ b/addons/javelin/CfgSounds.hpp @@ -2,12 +2,12 @@ class CfgSounds { class ACE_Javelin_Locking { name = "ACE_Javelin_Locking"; - sound[] = {PATHTOF(data\sounds\javelin_locking.ogg), db+0, 1.0}; + sound[] = {QPATHTOF(data\sounds\javelin_locking.ogg), "db+0", 1.0}; titles[] = {}; }; class ACE_Javelin_Locked { name = "ACE_Javelin_Locked"; - sound[] = {PATHTOF(data\sounds\javelin_locked.ogg), db+0, 1.0}; + sound[] = {QPATHTOF(data\sounds\javelin_locked.ogg), "db+0", 1.0}; titles[] = {}; }; }; diff --git a/addons/javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp index e34630dde3..4a2a567e22 100644 --- a/addons/javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -19,15 +19,15 @@ class RscInGameUI { y = -10; w = 0; h = 0; - }; - + }; + class GVAR(elements_group): RscControlsGroupNoScrollbars { x = "safeZoneX"; y = "safeZoneY"; w = "safeZoneW"; h = "safeZoneH"; idc = 170; - class Controls { + class Controls { class CA_Distance: RscOpticsValue { idc = 151; sizeEx = "0"; @@ -238,7 +238,7 @@ class RscInGameUI { y = "safeZoneY"; w = "safeZoneW"; h = "safeZoneH"; - enabled = 0; + enabled = 0; show = 0; class Controls { class ACE_TargetingConstrains: RscControlsGroupNoScrollbars { diff --git a/addons/javelin/functions/fnc_getTarget.sqf b/addons/javelin/functions/fnc_getTarget.sqf index 9aff228391..6fd4686eb8 100644 --- a/addons/javelin/functions/fnc_getTarget.sqf +++ b/addons/javelin/functions/fnc_getTarget.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Find a target within the optic range diff --git a/addons/javelin/functions/fnc_mapHelperDraw.sqf b/addons/javelin/functions/fnc_mapHelperDraw.sqf index 1b81fc7dd5..2794d46f58 100644 --- a/addons/javelin/functions/fnc_mapHelperDraw.sqf +++ b/addons/javelin/functions/fnc_mapHelperDraw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the map helper's draw event diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 8c3b088dda..e6809a8e04 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus, PabstMirror * Main loop, handles scaning for targets and drawing the javelin optic @@ -55,6 +55,19 @@ if ((_ammoCount == 0) || // No ammo loaded _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); _this set [0, diag_frameno]; _this set [4, _fireDisabledEH]; + + // Fix weapon being in top-attack when loading AP magazine (https://feedback.bistudio.com/T171012) + if ((_currentShooter == ACE_player) && {_currentMagazine == "Titan_AP"} && {currentWeaponMode ACE_player == "TopDown"}) then { + { + _x params ["_xIndex", "", "", "", "_xMode"]; + if (_xMode == "Single") exitWith { + ACE_player action ["SwitchWeapon", _currentShooter, ACE_player, _xIndex]; + __JavelinIGUITop ctrlSetTextColor __ColorGray; + __JavelinIGUIDir ctrlSetTextColor __ColorGreen; + TRACE_2("fix top-attack for AP",weaponState _currentShooter,_x); + }; + } forEach (ACE_player weaponsInfo [_currentWeapon, true]); + }; }; @@ -91,11 +104,11 @@ if (GVAR(isLockKeyDown) && {cameraView == "GUNNER"} && {((currentVisionMode ACE_ private _boundsInput = if (_currentTarget isKindOf "CAManBase") then { [_currentTarget,[-0.5,-0.5,-0.25],[0,0,0]]; } else { - [_currentTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"]; + [_currentTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"]; }; private _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); - + private _lockTime = if (isNull _currentTarget) then {0} else {CBA_missionTime - _lockStartTime}; private _minX = ((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 - 0.075*safeZoneW, (_bpos select 0), true]) + _offsetX) max __ConstraintLeft; private _minY = ((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 - 0.075*safeZoneH, (_bpos select 1), true]) + _offsetY) max __ConstraintTop; @@ -128,7 +141,7 @@ if (isNull _newTarget) then { _currentShooter setVariable ["ace_missileguidance_target", nil, false]; __JavelinIGUITargetingLines ctrlShow false; - + // Disallow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); } else { diff --git a/addons/javelin/functions/fnc_showFireMode.sqf b/addons/javelin/functions/fnc_showFireMode.sqf index 589a9727aa..85ed983718 100644 --- a/addons/javelin/functions/fnc_showFireMode.sqf +++ b/addons/javelin/functions/fnc_showFireMode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Updates fire mode on javelin display (top/dir) diff --git a/addons/javelin/functions/script_component.hpp b/addons/javelin/functions/script_component.hpp deleted file mode 100644 index 21c6597c86..0000000000 --- a/addons/javelin/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\javelin\script_component.hpp" \ No newline at end of file diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 4200722da0..0054cf4f03 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -14,7 +14,7 @@ Travar Alvo(Segurar) 目標を捕捉 (長押し) 표적 획득 (누르기) - 锁定目标 (按住) + 锁定目标(按住) 鎖定目標 (按住) Hedefe Kilitlen(Basılı Tut) diff --git a/addons/kestrel4500/CfgSound.hpp b/addons/kestrel4500/CfgSound.hpp index 5f7569647f..a657ef53f9 100644 --- a/addons/kestrel4500/CfgSound.hpp +++ b/addons/kestrel4500/CfgSound.hpp @@ -1,32 +1,32 @@ class CfgSounds { class kestrel4500_center_button_click { name="kestrel4500_center_button_click"; - sound[]={PATHTOF(sound\kestrel_center_button_click.wav),1,1}; + sound[]={QPATHTOF(sound\kestrel_center_button_click.wav),1,1}; titles[]={}; }; class kestrel4500_top_button_click { name="kestrel4500_top_button_click"; - sound[]={PATHTOF(sound\kestrel_top_button_click.wav),1,1}; + sound[]={QPATHTOF(sound\kestrel_top_button_click.wav),1,1}; titles[]={}; }; class kestrel4500_right_button_click { name="kestrel4500_right_button_click"; - sound[]={PATHTOF(sound\kestrel_right_button_click.wav),1,1}; + sound[]={QPATHTOF(sound\kestrel_right_button_click.wav),1,1}; titles[]={}; }; class kestrel4500_bottom_button_click { name="kestrel4500_bottom_button_click"; - sound[]={PATHTOF(sound\kestrel_bottom_button_click.wav),1,1}; + sound[]={QPATHTOF(sound\kestrel_bottom_button_click.wav),1,1}; titles[]={}; }; class kestrel4500_left_button_click { name="kestrel4500_left_button_click"; - sound[]={PATHTOF(sound\kestrel_left_button_click.wav),1,1}; + sound[]={QPATHTOF(sound\kestrel_left_button_click.wav),1,1}; titles[]={}; }; class kestrel4500_exit_button_click { name="kestrel4500_exit_button_click"; - sound[]={PATHTOF(sound\kestrel_exit_button_click.wav),1,1}; + sound[]={QPATHTOF(sound\kestrel_exit_button_click.wav),1,1}; titles[]={}; }; }; diff --git a/addons/kestrel4500/CfgWeapons.hpp b/addons/kestrel4500/CfgWeapons.hpp index ea9cd2ab2f..35930e53d9 100644 --- a/addons/kestrel4500/CfgWeapons.hpp +++ b/addons/kestrel4500/CfgWeapons.hpp @@ -12,6 +12,7 @@ class CfgWeapons { picture = QPATHTOF(UI\Kestrel4500.paa); icon = "iconObject_circle"; mapSize = 0.034; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2; diff --git a/addons/kestrel4500/RscTitles.hpp b/addons/kestrel4500/RscTitles.hpp index 276e8c4392..faae6a8f32 100644 --- a/addons/kestrel4500/RscTitles.hpp +++ b/addons/kestrel4500/RscTitles.hpp @@ -64,26 +64,26 @@ class Kestrel4500_Display { SizeEX=0.025; idc=74000; style=48; - x=safezoneX; + x="safezoneX"; y = DIALOG_SAFE_Y(0); - w=1.024; - h=1.024*4/3; + w="1.024"; + h="1.024*4/3"; colorBackground[]={1,1,1,1}; colorText[]={1,1,1,1}; - text=PATHTOF(UI\Kestrel4500.paa); + text=QPATHTOF(UI\Kestrel4500.paa); }; class POWER: Kestrel4500_RscButton { idc=-1; - x=safezoneX+0.385; + x="safezoneX+0.385"; y = DIALOG_SAFE_Y(1.125); - w=0.042; - h=0.042*4/3; + w="0.042"; + h="0.042*4/3"; action=QUOTE(7 call FUNC(buttonPressed)); onMouseButtonDown = "playSound 'kestrel4500_exit_button_click'"; }; class ENTER: POWER { idc=-1; - x=safezoneX+0.46; + x="safezoneX+0.46"; y = DIALOG_SAFE_Y(1.0); w=0.1; action=QUOTE(0 call FUNC(buttonPressed)); @@ -91,7 +91,7 @@ class Kestrel4500_Display { }; class TOP: Kestrel4500_RscButton { idc=-1; - x=safezoneX+0.46; + x="safezoneX+0.46"; y = DIALOG_SAFE_Y(0.93); w=0.1; h=0.03; @@ -106,7 +106,7 @@ class Kestrel4500_Display { }; class LEFT: Kestrel4500_RscButton { idc=-1; - x=safezoneX+0.4; + x="safezoneX+0.4"; y = DIALOG_SAFE_Y(0.97); w=0.046; h=0.11; @@ -115,27 +115,27 @@ class Kestrel4500_Display { }; class RIGHT: LEFT { idc=-1; - x=safezoneX+0.58; + x="safezoneX+0.58"; action=QUOTE(4 call FUNC(buttonPressed)); onMouseButtonDown = "playSound 'kestrel4500_right_button_click'"; }; class MEMORY: Kestrel4500_RscButton { idc=-1; - x=safezoneX+0.395; + x="safezoneX+0.395"; y = DIALOG_SAFE_Y(0.87); w=0.05; - h=0.045*4/3; + h="0.045*4/3"; action=QUOTE(5 call FUNC(buttonPressed)); }; class BACKLIGHT: MEMORY { idc=-1; - x=safezoneX+0.585; + x="safezoneX+0.585"; action=QUOTE(6 call FUNC(buttonPressed)); }; class TEXT_TOP: Kestrel4500_RscText { idc=74100; - x=safezoneX+0.40; + x="safezoneX+0.40"; y = DIALOG_SAFE_Y(0.58); w=0.22; h=0.04; @@ -223,7 +223,6 @@ class RscTitles { class RscKestrel4500 { idd=-1; onLoad="with uiNameSpace do { RscKestrel4500 = _this select 0 };"; - onUnload=(_this call FUNC(onCloseDisplay)); movingEnable=0; duration=60; fadeIn="false"; @@ -235,30 +234,30 @@ class RscTitles { moving=0; type=0; font="TahomaB"; - SizeEX=0.025*0.75; + SizeEX=".025*0.75"; style=48; - x=safezoneX+0.14; + x="safezoneX+0.14"; y = DISPLAY_SAFE_Y(0); - w=0.512*0.75; - h=1.024*4/3*0.75; + w="0.512*0.75"; + h="1.024*4/3*0.75"; colorBackground[]={1,1,1,1}; colorText[]={1,1,1,1}; - text=PATHTOF(UI\Kestrel4500_0.paa); + text=QPATHTOF(UI\Kestrel4500_0.paa); }; class RscTextTop: Kestrel4500_RscText { idc=75100; - x=safezoneX-0.05+0.40*0.75; + x="safezoneX-0.05+0.40*0.75"; y = DISPLAY_SAFE_Y(0.58*0.75); - w=0.22*0.75; - h=0.04*0.75; - SizeEx=0.04*0.75; + w="0.22*0.75"; + h="0.04*0.75"; + SizeEx="0.04*0.75"; text=""; }; class RscTextCenterBig: RscTextTop { idc=75200; y = DISPLAY_SAFE_Y(0.61*0.75); - h=0.10*0.75; - SizeEx=0.06*0.75; + h="0.10*0.75"; + SizeEx="0.06*0.75"; text=""; }; class RscTextCenter: RscTextTop { @@ -269,8 +268,8 @@ class RscTitles { idc=75300; y = DISPLAY_SAFE_Y(0.60*0.75); style=ST_LEFT; - h=0.10*0.75; - SizeEx=0.05*0.75; + h="0.10*0.75"; + SizeEx="0.05*0.75"; text=""; }; class RscTextCenterLine2Left: RscTextCenterLine1Left { @@ -308,14 +307,14 @@ class RscTitles { class RscTextBottomBig: RscTextTop { idc=75500; y = DISPLAY_SAFE_Y(0.67*0.75); - h=0.10*0.75; - SizeEx=0.06*0.75; + h="0.10*0.75"; + SizeEx="0.06*0.75"; text=""; }; class RscTextCenterLine1: RscTextTop { idc=75600; y = DISPLAY_SAFE_Y(0.58*0.75); - SizeEx=0.03*0.75; + SizeEx="0.03*0.75"; }; class RscTextCenterLine2: RscTextCenterLine1 { idc=75601; @@ -370,4 +369,4 @@ class RscTitles { }; }; }; -}; \ No newline at end of file +}; diff --git a/addons/kestrel4500/XEH_PREP.hpp b/addons/kestrel4500/XEH_PREP.hpp index 7d062c9ac8..ce9ecf95db 100644 --- a/addons/kestrel4500/XEH_PREP.hpp +++ b/addons/kestrel4500/XEH_PREP.hpp @@ -7,7 +7,6 @@ PREP(displayKestrel); PREP(generateOutputData); PREP(measureWindSpeed); PREP(onCloseDialog); -PREP(onCloseDisplay); PREP(restoreUserData); PREP(storeUserData); PREP(updateDisplay); diff --git a/addons/kestrel4500/XEH_postInit.sqf b/addons/kestrel4500/XEH_postInit.sqf index 9511041bd2..033dbafbe8 100644 --- a/addons/kestrel4500/XEH_postInit.sqf +++ b/addons/kestrel4500/XEH_postInit.sqf @@ -29,4 +29,4 @@ GVAR(ImpellerState) = 0; GVAR(Kestrel4500) = false; GVAR(Overlay) = false; -[] call FUNC(restoreUserData); \ No newline at end of file +[] call FUNC(restoreUserData); diff --git a/addons/kestrel4500/config.cpp b/addons/kestrel4500/config.cpp index 11bc51f801..5ea15f07ff 100644 --- a/addons/kestrel4500/config.cpp +++ b/addons/kestrel4500/config.cpp @@ -18,4 +18,4 @@ class CfgPatches { #include "CfgSound.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" -#include "RscTitles.hpp" \ No newline at end of file +#include "RscTitles.hpp" diff --git a/addons/kestrel4500/functions/fnc_buttonPressed.sqf b/addons/kestrel4500/functions/fnc_buttonPressed.sqf index 2edd9d17b8..df002ae2a4 100644 --- a/addons/kestrel4500/functions/fnc_buttonPressed.sqf +++ b/addons/kestrel4500/functions/fnc_buttonPressed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Handles the Kestrel 4500 dialog button actions diff --git a/addons/kestrel4500/functions/fnc_canShow.sqf b/addons/kestrel4500/functions/fnc_canShow.sqf index 0dc623c735..c51e65b835 100644 --- a/addons/kestrel4500/functions/fnc_canShow.sqf +++ b/addons/kestrel4500/functions/fnc_canShow.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Tests if the Kestrel 4500 can be shown diff --git a/addons/kestrel4500/functions/fnc_collectData.sqf b/addons/kestrel4500/functions/fnc_collectData.sqf index a05aac2667..14fd6047f2 100644 --- a/addons/kestrel4500/functions/fnc_collectData.sqf +++ b/addons/kestrel4500/functions/fnc_collectData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Gathers the weather data for the Kestrel 4500 diff --git a/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf b/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf index 80ff3025f5..6bdaf8927a 100644 --- a/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf +++ b/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Opens the Kestrel 4500 dialog diff --git a/addons/kestrel4500/functions/fnc_dayOfWeek.sqf b/addons/kestrel4500/functions/fnc_dayOfWeek.sqf index 39190ca38f..f15a232a86 100644 --- a/addons/kestrel4500/functions/fnc_dayOfWeek.sqf +++ b/addons/kestrel4500/functions/fnc_dayOfWeek.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculate Current Day in the Week diff --git a/addons/kestrel4500/functions/fnc_displayKestrel.sqf b/addons/kestrel4500/functions/fnc_displayKestrel.sqf index 1c2338645e..ac020c800f 100644 --- a/addons/kestrel4500/functions/fnc_displayKestrel.sqf +++ b/addons/kestrel4500/functions/fnc_displayKestrel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows the Kestrel 4500 as rsc title diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf index 9a9d0551fe..2143904f80 100644 --- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf +++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Generates the Kestrel 4500 output text. diff --git a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf index c28fef1262..9ecbca180c 100644 --- a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf +++ b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Measures the wind speed, stores the information in GVAR(MeasuredWindSpeed) and updates GVAR(ImpellerState) diff --git a/addons/kestrel4500/functions/fnc_onCloseDialog.sqf b/addons/kestrel4500/functions/fnc_onCloseDialog.sqf index 8b8a88f46b..98a39f9a37 100644 --- a/addons/kestrel4500/functions/fnc_onCloseDialog.sqf +++ b/addons/kestrel4500/functions/fnc_onCloseDialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Called if Kestrel Dialog is closed diff --git a/addons/kestrel4500/functions/fnc_onCloseDisplay.sqf b/addons/kestrel4500/functions/fnc_onCloseDisplay.sqf deleted file mode 100644 index 09e5941a77..0000000000 --- a/addons/kestrel4500/functions/fnc_onCloseDisplay.sqf +++ /dev/null @@ -1,19 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Ruthberg - * Called if Kestrel Display is closed - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ace_kestrel4500_fnc_onCloseDisplay - * - * Public: No - */ - -uiNamespace setVariable ['RscKestrel4500', nil]; -GVAR(Overlay) = false; diff --git a/addons/kestrel4500/functions/fnc_restoreUserData.sqf b/addons/kestrel4500/functions/fnc_restoreUserData.sqf index 869eb6eb17..43953ab397 100644 --- a/addons/kestrel4500/functions/fnc_restoreUserData.sqf +++ b/addons/kestrel4500/functions/fnc_restoreUserData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Reads user data from profileNamespace diff --git a/addons/kestrel4500/functions/fnc_storeUserData.sqf b/addons/kestrel4500/functions/fnc_storeUserData.sqf index 37bf2c90f6..bb3cf70827 100644 --- a/addons/kestrel4500/functions/fnc_storeUserData.sqf +++ b/addons/kestrel4500/functions/fnc_storeUserData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Saves user data into profileNamespace diff --git a/addons/kestrel4500/functions/fnc_updateDisplay.sqf b/addons/kestrel4500/functions/fnc_updateDisplay.sqf index 94255115db..1f55d8c400 100644 --- a/addons/kestrel4500/functions/fnc_updateDisplay.sqf +++ b/addons/kestrel4500/functions/fnc_updateDisplay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the Kestrel 4500 dialog text boxes. diff --git a/addons/kestrel4500/functions/fnc_updateImpellerState.sqf b/addons/kestrel4500/functions/fnc_updateImpellerState.sqf index 5692f0d276..36ffcd6599 100644 --- a/addons/kestrel4500/functions/fnc_updateImpellerState.sqf +++ b/addons/kestrel4500/functions/fnc_updateImpellerState.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Updates the Kestrel 4500 Impeller state diff --git a/addons/kestrel4500/functions/fnc_updateMemory.sqf b/addons/kestrel4500/functions/fnc_updateMemory.sqf index 2eff1c5a9a..c717035390 100644 --- a/addons/kestrel4500/functions/fnc_updateMemory.sqf +++ b/addons/kestrel4500/functions/fnc_updateMemory.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Update Memory of Kestrel diff --git a/addons/kestrel4500/functions/script_component.hpp b/addons/kestrel4500/functions/script_component.hpp deleted file mode 100644 index bc42218de7..0000000000 --- a/addons/kestrel4500/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\kestrel4500\script_component.hpp" diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index 1ce5294745..f6580aa507 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -13,8 +13,8 @@ Kestrel 4500NV Kestrel 4500NV ケストレル 4500NV - Kestrel 4500NV - 猎隼4500测风仪 + 케스트렐 4500NV + 猎隼4500 测风仪 獵隼4500測風儀 Kestrel 4500NV @@ -30,8 +30,8 @@ Kestrel 4500 kézi szél-és időjárásmérő Příruční meteostanice Kestrel 4500 ケストレル 4500 携帯型風速計 - Kestrel 4500 휴대형 기상 관측기 - 猎隼4500掌上型天气追踪仪 + 케스트렐 4500 휴대형 기상 관측기 + 猎隼4500 掌上型天气追踪仪 獵隼4500掌上型天氣追蹤儀 Kestrel 4500 Cep Hava Durumu Izleyicisi @@ -47,8 +47,8 @@ Abrir Kestrel 4500 Otevřít Kestrel 4500 Kestrel 4500 を開く - Kestrel 4500 열기 - 开启猎隼4500测风仪 + 케스트렐 4500 열기 + 开启猎隼4500 测风仪 開啟獵隼4500測風儀 Aç Kestrel 4500 @@ -64,8 +64,8 @@ Zobrazit Kestrel 4500 Mostrar Kestrel 4500 ケストレル 4500 を見る - Kestrel 4500 보이기 - 显示猎隼4500测风仪 + 케스트렐 4500 보이기 + 显示猎隼4500 测风仪 顯示獵隼4500測風儀 Göster Kestrel 4500 @@ -81,8 +81,8 @@ Skrýt Kestrel 4500 Ocultar Kestrel 4500 Kestrel 4500 を隠す - Kestrel 4500 숨기기 - 隐藏猎隼4500测风仪 + 케스트렐 4500 숨기기 + 隐藏猎隼4500 测风仪 隱藏獵隼4500測風儀 Gizle Kestrel 4500 @@ -98,8 +98,8 @@ Otevřít Kestrel 4500 Abrir Kestrel 4500 ケストレル 4500 を開く - Kestrel 4500 열기 - 开启猎隼4500测风仪 + 케스트렐 4500 열기 + 开启猎隼4500 测风仪 開啟獵隼4500測風儀 Aç Kestrel 4500 @@ -115,8 +115,8 @@ Zobrazit Kestrel 4500 Mostrar Kestrel 4500 ケストレル 4500 を見る - Kestrel 4500 숨기기 - 显示猎隼4500测风仪 + 케스트렐 4500 숨기기 + 显示猎隼4500 测风仪 顯示獵隼4500測風儀 Göster Kestrel 4500 diff --git a/addons/killtracker/README.md b/addons/killtracker/README.md index f96e43e2a2..81b98a6b50 100644 --- a/addons/killtracker/README.md +++ b/addons/killtracker/README.md @@ -1,7 +1,8 @@ ace_killtracker ============ -Tracks deaths/kills and logs to the end mission disaplay. Attemps to log kills from Medical by using `ace_medical_lastDamageSource`. +Tracks deaths/kills and logs to the end mission disaplay. +Show detailed info from player kills from ACE Medical by using `ace_killed` event. Note: Requires config setup in a mission, see `killtracker.inc` - has no effect if mission is not setup correctly. diff --git a/addons/killtracker/XEH_postInit.sqf b/addons/killtracker/XEH_postInit.sqf index 63801c1506..2f75baa929 100644 --- a/addons/killtracker/XEH_postInit.sqf +++ b/addons/killtracker/XEH_postInit.sqf @@ -19,8 +19,13 @@ if ((getText (missionconfigfile >> "CfgDebriefingSections" >> QUOTE(XADDON) >> "variable")) != QXGVAR(outputText)) exitWith { TRACE_1("no mission debriefing config",_this); }; +if (!(["ACE_Medical"] call EFUNC(common,isModLoaded))) exitWith { + WARNING("No ACE-Medical"); + XGVAR(outputText) = "No ACE-Medical"; +}; -INFO("Running Kill Tracking"); +private _global = missionNamespace getVariable [QGVAR(globalSync), false]; // Global Sync (e.g. for spectator) +INFO_1("Running Kill Tracking [Global: %1]",_global); // Variables: GVAR(eventsArray) = []; @@ -35,6 +40,9 @@ GVAR(killCount) = 0; GVAR(killCount) = GVAR(killCount) + 1; GVAR(eventsArray) pushBack format [LLSTRING(Kill), _name, _killInfo]; XGVAR(outputText) = (format ["%1 %2
", LLSTRING(TotalKills), GVAR(killCount)]) + (GVAR(eventsArray) joinString "
"); + if (missionNamespace getVariable [QGVAR(globalSync), false]) then { + ACE_player setVariable [QGVAR(output), XGVAR(outputText), true]; + }; }] call CBA_fnc_addEventHandler; [QGVAR(death), { @@ -42,6 +50,9 @@ GVAR(killCount) = 0; TRACE_2("death eh",_name,_killInfo); GVAR(eventsArray) pushBack format [LLSTRING(Killer), _name, _killInfo]; XGVAR(outputText) = (format ["%1 %2
", LLSTRING(TotalKills), GVAR(killCount)]) + (GVAR(eventsArray) joinString "
"); + if (missionNamespace getVariable [QGVAR(globalSync), false]) then { + ACE_player setVariable [QGVAR(output), XGVAR(outputText), true]; + }; }] call CBA_fnc_addEventHandler; ["ace_killed", { @@ -54,7 +65,7 @@ GVAR(killCount) = 0; if (!isNull _killer) then { if (!(_killer isKindof "CAManBase")) then { // If killer is a vehicle log the vehicle type - _killInfo pushBack format [LLSTRING(Vehicle), getText (configfile >> "CfgVehicles" >> (typeOf _killer) >> "displayName")]; + _killInfo pushBack format [LLSTRING(Vehicle), getText ((configOf _killer) >> "displayName")]; }; if (isNull _instigator) then { _instigator = effectiveCommander _killer; @@ -71,7 +82,7 @@ GVAR(killCount) = 0; // Log firendly fire private _fnc_getSideFromConfig = { params ["_object"]; - switch (getNumber (configFile >> "CfgVehicles" >> (typeOf _object) >> "side")) do { + switch (getNumber ((configOf _object) >> "side")) do { case (0): {east}; case (1): {west}; case (2): {resistance}; @@ -106,7 +117,7 @@ GVAR(killCount) = 0; } else { _killerName = _killer getVariable [QGVAR(aiName), ""]; // allow setting a custom AI name (e.g. VIP Target) if (_killerName == "") then { - _killerName = format ["*AI* - %1", getText (configfile >> "CfgVehicles" >> (typeOf _killer) >> "displayName")]; + _killerName = format ["*AI* - %1", getText ((configOf _killer) >> "displayName")]; }; }; }; @@ -122,7 +133,7 @@ GVAR(killCount) = 0; } else { _unitName = _unit getVariable [QGVAR(aiName), ""]; // allow setting a custom AI name (e.g. VIP Target) if (_unitName == "") then { - _unitName = format ["*AI* - %1", getText (configfile >> "CfgVehicles" >> (typeOf _unit) >> "displayName")]; + _unitName = format ["*AI* - %1", getText ((configOf _unit) >> "displayName")]; }; }; TRACE_3("send kill event",_killer,_unitName,_killInfo); diff --git a/addons/killtracker/config.cpp b/addons/killtracker/config.cpp index 8164c08f7c..7cda7110d4 100644 --- a/addons/killtracker/config.cpp +++ b/addons/killtracker/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_medical"}; + requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); authors[]= {"PabstMirror"}; url = ECSTRING(main,URL); diff --git a/addons/killtracker/stringtable.xml b/addons/killtracker/stringtable.xml index c5776d67f4..8ea5a99243 100644 --- a/addons/killtracker/stringtable.xml +++ b/addons/killtracker/stringtable.xml @@ -4,6 +4,12 @@ ACE Killed Events ACE キルトラッカー + ACE Abgeschossene Ereignisse + ACE Licznik Zabójstw + ACE 击杀事件 + ACE 사살 이벤트 + ACE Счётчик убийств + ACE Eventos de Muertes Total Kills: @@ -11,6 +17,10 @@ Liczba zabójstw: Toplam Öldürme: 総キル: + Gesammte Abschüsse: + 总击杀数: + 총 사살수: + Muertes totales: Kill: %1 %2 @@ -18,6 +28,10 @@ Zabójstwo: %1 %2 Öldürülen: %1 %2 キル: %1 %2 + Abschuss: %1 %2 + 击杀:%1 %2 + 사살: %1 %2 + Muertes: %1 %2 Killer: %1 %2 @@ -25,6 +39,10 @@ Zabójca: %1 %2 Öldüren: %1 %2 キラー: %1 %2 + Täter: %1 %2 + 击杀者:%1 %2 + 사살자: %1 %2 + Asesino: %1 %2 Vehicle: %1 @@ -32,6 +50,10 @@ Pojazd: %1 Araç :%1 車両: %1 + Fahrzeuge %! + 载具:%1 + 차량: %1 + Vehículo: %1 Friendly Fire @@ -45,7 +67,7 @@ Střelba do vlastních! Fogo amigo 아군 오인사격 - 友军误射 + 友军误击 同士討ち Dost Atışı diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index 49ce3fdf5b..753564385c 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -1,117 +1,18 @@ class RscInGameUI { class RscOptics_LaserDesignator { - idd = 300; - controls[] = {"CA_IGUI_elements_group"}; - - onLoad = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',(_this select 0)];"; - onUnload = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',nil];"; - class CA_IGUI_elements_group: RscControlsGroup { - idc = 170; - - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class VScrollbar: VScrollbar { - width = 0; - }; - class HScrollbar: HScrollbar { - height = 0; - }; class controls { - class CA_OpticsZoom: RscText { - idc = 180; - style = 1; - colorText[] = {0.706,0.0745,0.0196,1}; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "4.5"; - x = "43.85 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4.5 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; - class ACE_Distance: RscText { - idc = 123002; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = "24.6 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; + // Hide the vanilla distance display class CA_Distance: RscText { - idc = 151; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = 0; - y = 0; - w = 0; - h = 0; + idc = IDC_LASERDESIGNATOR_DISTANCE; // Purposeful overwrite, makes range update constantly, do not remove + fade = 1; + colorText[] = {0,0,0,0}; // fade doesn't work in some cases (e.g. controlling remote designator uav) }; - class CA_Elev: RscText { - idc = 175; - style = 1; - sizeEx = "0.038*SafezoneH"; + class ACE_Distance: CA_Distance { + idc = IDC_LASERDESIGNATOR_ACEDISTANCE; + fade = 0; colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "80.5"; - x = "32.7 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; }; - class CA_VisionMode: RscText { - idc = 179; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "VIS"; - x = "6.5 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; - class CA_Laser: RscText { - idc = 158; - style = "0x30 + 0x800"; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; - x = "29.2 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_Heading: RscText { - idc = 156; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "023"; - x = "16.1 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.6 * (0.025 * SafezoneH)"; - }; - class ACE_LaserCode_Helper: RscMapControl { idc = -1; onDraw = QUOTE(_this call FUNC(onLaserDesignatorDraw)); @@ -119,7 +20,7 @@ class RscInGameUI { h = 0; }; class ACE_LaserCode: RscText { - idc = 123001; + idc = IDC_LASERDESIGNATOR_LASERCODE; style = 0; sizeEx = "0.038*SafezoneH"; colorText[] = {0.706,0.0745,0.0196,1}; diff --git a/addons/laser/XEH_PREP.hpp b/addons/laser/XEH_PREP.hpp index 6af5643e23..9b9be64752 100644 --- a/addons/laser/XEH_PREP.hpp +++ b/addons/laser/XEH_PREP.hpp @@ -1,11 +1,13 @@ PREP(addLaserTarget); +PREP(addMapHandler); PREP(dev_drawVisibleLaserTargets); PREP(findLaserSource); PREP(handleLaserTargetCreation); PREP(keyLaserCodeChange); PREP(laserOff); PREP(laserOn); +PREP(laserPointTrack); PREP(laserTargetPFH); PREP(onLaserDesignatorDraw); PREP(rotateVectLine); @@ -14,3 +16,4 @@ PREP(seekerFindLaserSpot); PREP(shootCone); PREP(shootRay); PREP(showVehicleHud); +PREP(toggleLST); diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf index 84a3416e50..364e9a682f 100644 --- a/addons/laser/XEH_postInit.sqf +++ b/addons/laser/XEH_postInit.sqf @@ -6,6 +6,13 @@ if (hasInterface) then { GVAR(pfID) = -1; ["CBA_settingsInitialized", { + // Handle Map Drawing + GVAR(mapLaserSource) = objNull; + ["ACE_controlledUAV", LINKFUNC(addMapHandler)] call CBA_fnc_addEventHandler; + ["turret", LINKFUNC(addMapHandler), false] call CBA_fnc_addPlayerEventHandler; + ["unit", LINKFUNC(addMapHandler), true] call CBA_fnc_addPlayerEventHandler; + + // Laser code display ["turret", LINKFUNC(showVehicleHud), false] call CBA_fnc_addPlayerEventHandler; ["vehicle", LINKFUNC(showVehicleHud), true] call CBA_fnc_addPlayerEventHandler; // only one of these needs the retro flag @@ -26,7 +33,12 @@ if (hasInterface) then { ["ace_laserOn", { params ["_uuid", "_args"]; TRACE_2("ace_laserOn eh",_uuid,_args); + GVAR(laserEmitters) set [_uuid, _args]; + private _unit = _args select 0; + if (local _unit && {hasPilotCamera _unit}) then { + [_unit] call FUNC(laserPointTrack); + }; }] call CBA_fnc_addEventHandler; ["ace_laserOff", { @@ -45,6 +57,19 @@ if (hasInterface) then { }; }] call CBA_fnc_addEventHandler; +["AllVehicles", "init", { + params ["_unit"]; + if (hasPilotCamera _unit) then { + _unit setVariable [QGVAR(hasLaserSpotTracker), true]; + _unit setVariable [QGVAR(laserSpotTrackerOn), false]; + private _actionOff = ["LSTOff", localize LSTRING(LSTOff), "", {[_this select 0] call FUNC(toggleLST)}, {(_this select 0) getVariable [QGVAR(laserSpotTrackerOn), false]}] call ace_interact_menu_fnc_createAction; + [_unit, 1, ["ACE_SelfActions"], _actionOff] call ace_interact_menu_fnc_addActionToObject; + private _actionOn = ["LSTOn", localize LSTRING(LSTOn), "", {[_this select 0] call FUNC(toggleLST)}, {!((_this select 0) getVariable [QGVAR(laserSpotTrackerOn), false])}] call ace_interact_menu_fnc_createAction; + [_unit, 1, ["ACE_SelfActions"], _actionOn] call ace_interact_menu_fnc_addActionToObject; + }; +}, true, [], true] call CBA_fnc_addClassEventHandler; + + // Shows detector and mine posistions in 3d when debug is on #ifdef DRAW_LASER_INFO addMissionEventHandler ["Draw3D", {_this call FUNC(dev_drawVisibleLaserTargets)}]; diff --git a/addons/laser/config.cpp b/addons/laser/config.cpp index fb6ae5e638..5bd8bf8548 100644 --- a/addons/laser/config.cpp +++ b/addons/laser/config.cpp @@ -13,15 +13,13 @@ class CfgPatches { }; }; -#include "ACE_Settings.hpp" +#include "ACE_Settings.hpp" #include "CfgEventhandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" class RscControlsGroup; -class VScrollbar; -class HScrollbar; class RscText; class RscMapControl; class RscControlsGroupNoScrollbars; diff --git a/addons/laser/functions/fnc_addLaserTarget.sqf b/addons/laser/functions/fnc_addLaserTarget.sqf index 2cf99a5311..08ea6f65b0 100644 --- a/addons/laser/functions/fnc_addLaserTarget.sqf +++ b/addons/laser/functions/fnc_addLaserTarget.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Adds a vanilla laser target to the tracker PFH and globaly turns it on diff --git a/addons/laser/functions/fnc_addMapHandler.sqf b/addons/laser/functions/fnc_addMapHandler.sqf new file mode 100644 index 0000000000..7e10122c05 --- /dev/null +++ b/addons/laser/functions/fnc_addMapHandler.sqf @@ -0,0 +1,70 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Add laser drawing to map + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_laser_fnc_addMapHandler + * + * Public: No + */ +TRACE_3("addMapHandler",ace_player,typeOf vehicle ace_player,ACE_controlledUAV); + +GVAR(mapLaserSource) = call { + if (GVAR(showLaserOnMap) == 0) exitWith { + TRACE_1("setting - disabled",GVAR(showLaserOnMap)); + objNull + }; + if (alive (ACE_controlledUAV # 0)) exitWith { + TRACE_1("using UAV",objNull); + ACE_controlledUAV # 0; + }; + if (GVAR(showLaserOnMap) == 1) exitWith { + TRACE_1("setting - no UAV",GVAR(showLaserOnMap)); + objNull + }; + private _player = ace_player; + private _vehicle = vehicle _player; + if ((_player != _vehicle) && {_player in [gunner _vehicle, commander _vehicle]}) exitWith { + TRACE_1("using player's vehicle",_vehicle); + _vehicle + }; + if (GVAR(showLaserOnMap) == 2) exitWith { + TRACE_1("setting - no UAV or vehicle",GVAR(showLaserOnMap)); + objNull + }; + TRACE_1("using player",_player); + _player +}; + +if (!alive GVAR(mapLaserSource)) exitWith {}; + +[{!isNull findDisplay 12}, // for some reason the display is null for the frame when starting to control drone +{ + private _map = ((findDisplay 12) displayCtrl 51); + private _ehID = _map getVariable [QGVAR(ehID), -1]; + if (_ehID > -1) exitWith {}; + _ehID = _map ctrlAddEventHandler ["Draw", { + if (!alive GVAR(mapLaserSource)) exitWith {}; + private _laserTarget = laserTarget GVAR(mapLaserSource); + if (!alive _laserTarget) exitWith {}; + + params ["_map"]; + _map drawLine [getPos _laserTarget, getPos GVAR(mapLaserSource), [1,0,0,0.333]]; + _map drawIcon [ + "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa", + [1,0,1,1], + (getPos _laserTarget), + 16, 16, + ((getDir _laserTarget) + 90) + ]; + }]; + TRACE_2("added map drawEH",_map,_ehID); + _map setVariable [QGVAR(ehID), _ehID]; +}, []] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf index 1a84ee7eb9..c56412512a 100644 --- a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf +++ b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team diff --git a/addons/laser/functions/fnc_findLaserSource.sqf b/addons/laser/functions/fnc_findLaserSource.sqf index 878b3e91db..9e90ef8ad7 100644 --- a/addons/laser/functions/fnc_findLaserSource.sqf +++ b/addons/laser/functions/fnc_findLaserSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Handler function for finding position and direction of a vanilla laser. @@ -6,7 +6,7 @@ * Arguments: * 0: Vehicle (shooter of laser) * 6: Method Args - * 0: Laser Source selection on Vehicle + * - 0: Laser Source selection on Vehicle * * Return Value: * [position, direction] diff --git a/addons/laser/functions/fnc_handleLaserTargetCreation.sqf b/addons/laser/functions/fnc_handleLaserTargetCreation.sqf index 3a797d28c8..b8cedf22c3 100644 --- a/addons/laser/functions/fnc_handleLaserTargetCreation.sqf +++ b/addons/laser/functions/fnc_handleLaserTargetCreation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Associates a newly created laser target to it's owner diff --git a/addons/laser/functions/fnc_keyLaserCodeChange.sqf b/addons/laser/functions/fnc_keyLaserCodeChange.sqf index 32d9151083..73b9160daf 100644 --- a/addons/laser/functions/fnc_keyLaserCodeChange.sqf +++ b/addons/laser/functions/fnc_keyLaserCodeChange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Change the laser key code (both seeker and transmitter) @@ -40,8 +40,14 @@ if (isNull (ACE_controlledUAV param [0, objNull])) then { }; TRACE_2("",_currentShooter,_currentWeapon); -if (((getNumber (configFile >> "CfgWeapons" >> _currentWeapon >> "laser")) == 0) && - {(getNumber (configFile >> "CfgWeapons" >> _currentWeapon >> QGVAR(canSelect))) == 0}) exitWith {false}; +private _currentWeaponCfg = configFile >> "CfgWeapons" >> _currentWeapon; +if ( + (getNumber (_currentWeaponCfg >> "laser") == 0) && + { + !(_currentShooter getVariable [QGVAR(hasLaserSpotTracker), false]) && + {(getNumber (_currentWeaponCfg >> QGVAR(canSelect))) == 0} + } +) exitWith {false}; private _oldLaserCode = _currentShooter getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; private _newLaserCode = _oldLaserCode; diff --git a/addons/laser/functions/fnc_laserOff.sqf b/addons/laser/functions/fnc_laserOff.sqf index bb207f2781..98560ce30f 100644 --- a/addons/laser/functions/fnc_laserOff.sqf +++ b/addons/laser/functions/fnc_laserOff.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nou * Turn a laser designator off. diff --git a/addons/laser/functions/fnc_laserOn.sqf b/addons/laser/functions/fnc_laserOn.sqf index 4038e065ef..268ce1b289 100644 --- a/addons/laser/functions/fnc_laserOn.sqf +++ b/addons/laser/functions/fnc_laserOn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nou * Turn a laser designator on. diff --git a/addons/laser/functions/fnc_laserPointTrack.sqf b/addons/laser/functions/fnc_laserPointTrack.sqf new file mode 100644 index 0000000000..ab249f0d5e --- /dev/null +++ b/addons/laser/functions/fnc_laserPointTrack.sqf @@ -0,0 +1,39 @@ +#include "..\script_component.hpp" +/* + * Author: LorenLuke + * Toggles laser point tracking when a laser is on, for tracking coordinates. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * Nothing + * + * Example: + * [vehicle player] call ace_laser_fnc_laserPointTrack + * + * Public: No + */ +params ["_vehicle"]; + +[{ + params ["_args", "_pfhID"]; + _args params ["_vehicle"]; + if !(alive _vehicle && {local _vehicle} && {hasPilotCamera _vehicle} && {!isNull (laserTarget _vehicle)}) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + (getPilotCameraTarget _vehicle) params ["_isTracking", "_spotPos", "_targetObj"]; + if (!_isTracking) exitWith {}; + if (isNull _targetObj) then { + private _laserTargetPos = getPosASL laserTarget _vehicle; + private _distance = _spotPos distance _laserTargetPos; + if (_distance > 0.15) then { + private _vehPos = getPosASL _vehicle; + private _vectorToLaser = _vehPos vectorFromTo _laserTargetPos; + private _vectorToSpot = _vehPos vectorFromTo _spotPos; + if (acos (_vectorToLaser vectorCos _vectorToSpot) < 0.025) then { + _vehicle setPilotCameraTarget _laserTargetPos; + }; + }; + }; +}, 0, [_vehicle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/laser/functions/fnc_laserTargetPFH.sqf b/addons/laser/functions/fnc_laserTargetPFH.sqf index c833aa5254..5c5f51931b 100644 --- a/addons/laser/functions/fnc_laserTargetPFH.sqf +++ b/addons/laser/functions/fnc_laserTargetPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Maintains the tracked lasers, deleting any laser that is turned off diff --git a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf index e7a4994ce2..5dbbc5a4b5 100644 --- a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf +++ b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nou * Update distance when rangefinder laser is on @@ -15,14 +15,26 @@ * Public: No */ -private _laserCode = ACE_player getVariable[QGVAR(code), ACE_DEFAULT_LASER_CODE]; -if (!isNil "_laserCode") then { - __LaserDesignatorIGUI_LaserCode ctrlSetText format["Code: %1", [_laserCode, 4, 0, false] call CBA_fnc_formatNumber]; +params ["_ctrl"]; + +private _display = ctrlParent _ctrl; + +private _currentShooter = ACE_controlledUAV param [0, objNull]; +if (isNull _currentShooter) then { + if (ACE_player call CBA_fnc_canUseWeapon) then { + _currentShooter = ACE_player; + } else { + _currentShooter = objectParent ACE_player; + }; }; -if (! (ctrlShown __LaserDesignatorIGUI_LaserOn) ) then { - // TODO: hide distance - __LaserDesignatorIGUI_ACE_Distance ctrlSetText "----"; -} else { - __LaserDesignatorIGUI_ACE_Distance ctrlSetText (ctrlText __LaserDesignatorIGUI_CA_Distance); +private _laserCode = _currentShooter getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; +private _ctrlLaserCode = _display displayCtrl IDC_LASERDESIGNATOR_LASERCODE; +_ctrlLaserCode ctrlSetText format ["Code: %1", [_laserCode, 4, 0, false] call CBA_fnc_formatNumber]; + +private _ctrlDistanceACE = _display displayCtrl IDC_LASERDESIGNATOR_ACEDISTANCE; +if (!isLaserOn _currentShooter) exitWith { + _ctrlDistanceACE ctrlSetText "----"; }; + +_ctrlDistanceACE ctrlSetText (ctrlText (_display displayCtrl IDC_LASERDESIGNATOR_DISTANCE)); diff --git a/addons/laser/functions/fnc_rotateVectLine.sqf b/addons/laser/functions/fnc_rotateVectLine.sqf index 766cb5df5b..3cdf12c005 100644 --- a/addons/laser/functions/fnc_rotateVectLine.sqf +++ b/addons/laser/functions/fnc_rotateVectLine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/laser/functions/fnc_rotateVectLineGetMap.sqf b/addons/laser/functions/fnc_rotateVectLineGetMap.sqf index f87aa21376..7a05660f16 100644 --- a/addons/laser/functions/fnc_rotateVectLineGetMap.sqf +++ b/addons/laser/functions/fnc_rotateVectLineGetMap.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index 089c25e0a0..1019eb4770 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nou * Searches for a laser spot given a seekers params. @@ -12,6 +12,8 @@ * 4: Seeker wavelength sensitivity range, [1550,1550] is common eye safe * 5: Seeker laser code. * 6: Ignore 1 (e.g. Player's vehicle) (default: objNull) + * 7: Ignore 2 (e.g. Attached object) (default: objNull) + * 8: Owners to ignore (e.g. Player's vehicle) (default: []) * * Return Value: * [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found @@ -24,7 +26,7 @@ BEGIN_COUNTER(seekerFindLaserSpot); -params ["_posASL", "_dir", "_seekerFov", "_seekerMaxDistance", "_seekerWavelengths", "_seekerCode", ["_ignoreObj1", objNull]]; +params ["_posASL", "_dir", "_seekerFov", "_seekerMaxDistance", "_seekerWavelengths", "_seekerCode", ["_ignoreObj1", objNull], ["_ignoreObj2", objNull], ["_ignoreOwners", []]]; _dir = vectorNormalized _dir; _seekerWavelengths params ["_seekerWavelengthMin", "_seekerWavelengthMax"]; @@ -43,6 +45,8 @@ private _finalOwner = objNull; _x params ["_obj", "_owner", "_laserMethod", "_emitterWavelength", "_laserCode", "_divergence"]; TRACE_6("laser",_obj,_owner,_laserMethod,_emitterWavelength,_laserCode,_divergence); + if (_owner in _ignoreOwners) then {continue}; + if (alive _obj && {_emitterWavelength >= _seekerWavelengthMin} && {_emitterWavelength <= _seekerWavelengthMax} && {_laserCode == _seekerCode}) then { private _laser = []; @@ -142,7 +146,7 @@ if ((count _spots) > 0) then { _bucketList = _finalBuckets select _index; { private _testPos = (_x select 0) vectorAdd [0,0,0.05]; - private _testIntersections = lineIntersectsSurfaces [_posASL, _testPos, _ignoreObj1]; + private _testIntersections = lineIntersectsSurfaces [_posASL, _testPos, _ignoreObj1, _ignoreObj2]; if ([] isEqualTo _testIntersections) then { _bucketList pushBack _x; }; @@ -164,8 +168,9 @@ if ((count _spots) > 0) then { { _x params ["_xPos", "_owner"]; _finalPos = _finalPos vectorAdd _xPos; - private _count = _ownersHash getOrDefault [hashValue _owner, 0]; - _ownersHash set [hashValue _owner, _count + 1]; + private _value = _ownersHash getOrDefault [hashValue _owner, [0, _owner]]; + _value set [0, 1 + _value#0]; + _ownersHash set [hashValue _owner, _value]; } forEach _finalBucket; _finalPos = _finalPos vectorMultiply (1 / (count _finalBucket)); @@ -174,8 +179,10 @@ if ((count _spots) > 0) then { { //IGNORE_PRIVATE_WARNING ["_x", "_y"]; - if (_y > _maxOwnerCount) then { - _finalOwner = _x; + _y params ["_count", "_owner"]; + if (_count > _maxOwnerCount) then { + _maxOwnerCount = _count; + _finalOwner = _owner; }; } forEach _ownersHash; }; diff --git a/addons/laser/functions/fnc_shootCone.sqf b/addons/laser/functions/fnc_shootCone.sqf index b9d64a42fa..976fb734a6 100644 --- a/addons/laser/functions/fnc_shootCone.sqf +++ b/addons/laser/functions/fnc_shootCone.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nou * Shoots multiple rays in a dispersion pattern. diff --git a/addons/laser/functions/fnc_shootRay.sqf b/addons/laser/functions/fnc_shootRay.sqf index 03c3afd69a..434560eea7 100644 --- a/addons/laser/functions/fnc_shootRay.sqf +++ b/addons/laser/functions/fnc_shootRay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nou, PabstMirror * Shoots a ray from a source to a direction and finds first intersction and distance. diff --git a/addons/laser/functions/fnc_showVehicleHud.sqf b/addons/laser/functions/fnc_showVehicleHud.sqf index 39e0a92586..778df61a6c 100644 --- a/addons/laser/functions/fnc_showVehicleHud.sqf +++ b/addons/laser/functions/fnc_showVehicleHud.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Shows the laser hud when vehicle is equiped with the weapon. diff --git a/addons/laser/functions/fnc_toggleLST.sqf b/addons/laser/functions/fnc_toggleLST.sqf new file mode 100644 index 0000000000..59969d014e --- /dev/null +++ b/addons/laser/functions/fnc_toggleLST.sqf @@ -0,0 +1,67 @@ +#include "..\script_component.hpp" +/* + * Author: LorenLuke + * Toggles the laser spot tracker for any enabled vehicle. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * Nothing + * + * Example: + * [vehicle player] call ace_laser_fnc_toggleLST + * + * Public: No + */ + + +params ["_vehicle"]; + +if !(_vehicle getVariable [QGVAR(hasLaserSpotTracker), false]) exitWith {}; + +private _enabled = _vehicle getVariable [QGVAR(laserSpotTrackerOn), false]; +_vehicle setVariable [QGVAR(laserSpotTrackerOn), !_enabled]; + +private _LSTmessage = if (_vehicle getVariable [QGVAR(laserSpotTrackerOn), false]) then {localize LSTRING(LSTOn)} else {localize LSTRING(LSTOff)}; +private _string = format ["%1
", _LSTmessage]; +private _laserCode = _vehicle getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; +_string = format ["%1%2: %3
",_string, localize LSTRING(laserCode), _laserCode]; +[_string] call EFUNC(common,displayTextStructured); + +if (_enabled) exitWith {}; + +[{ + params ["_args", "_pfhID"]; + _args params ["_vehicle"]; + + if !(_vehicle getVariable [QGVAR(laserSpotTrackerOn), false] && {alive _vehicle}) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + + private _laserCode = _vehicle getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE]; + private _angle = 25; + + private _pos = _vehicle modelToWorldVisualWorld [0,0,0]; + private _pilotCameraPos = getPilotCameraPosition _vehicle; + private _pilotCameraVector = _pos vectorFromTo (_vehicle modelToWorldVisualWorld (getPilotCameraDirection _vehicle)); + + (getPilotCameraTarget _vehicle) params ["_isTracking", "_spotPos"]; + + if (_isTracking) then { + _angle = 0.25; + }; + + private _laserSource = _vehicle modelToWorldWorld _pilotCameraPos; + private _laserResult = [_laserSource, _pilotCameraVector, _angle, 5000, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], _laserCode, _vehicle, laserTarget _vehicle, [_vehicle]] call FUNC(seekerFindLaserSpot); + private _foundTargetPos = _laserResult select 0; + + if (_isTracking) then { + private _distance = _spotPos distance _foundTargetPos; + if (_distance > 0.75) then { + _vehicle setPilotCameraTarget _foundTargetPos; + }; + } else { + _vehicle setPilotCameraTarget _foundTargetPos; + }; +}, 0, [_vehicle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/laser/functions/script_component.hpp b/addons/laser/functions/script_component.hpp deleted file mode 100644 index 98d00342c0..0000000000 --- a/addons/laser/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\laser\script_component.hpp" \ No newline at end of file diff --git a/addons/laser/initSettings.sqf b/addons/laser/initSettings.sqf index 519e04e6b1..a7574e55ad 100644 --- a/addons/laser/initSettings.sqf +++ b/addons/laser/initSettings.sqf @@ -1,7 +1,21 @@ +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(laser)]; + [ QGVAR(dispersionCount), "SLIDER", LSTRING(dispersionCount_displayName), - "ACE Uncategorized", + _category, [0, 5, 2, -1], 1 ] call CBA_fnc_addSetting; + +[ + QGVAR(showLaserOnMap), "LIST", + [LSTRING(showLaserOnMap), LSTRING(showLaserOnMap_tooltip)], + _category, + [ + [0, 1, 2, 3], + [LELSTRING(Common,Disabled), "STR_A3_CfgEditorSubcategories_EdSubcat_Drones0", "str_dn_vehicles", LELSTRING(common,Always)], + 1 + ], + true +] call CBA_fnc_addSetting; diff --git a/addons/laser/script_component.hpp b/addons/laser/script_component.hpp index b0d9951bf3..64a9a85f13 100644 --- a/addons/laser/script_component.hpp +++ b/addons/laser/script_component.hpp @@ -17,14 +17,11 @@ #include "\z\ace\addons\main\script_macros.hpp" - -#define __LaserDesignatorIGUI (uiNamespace getVariable ["ACE_RscOptics_LaserDesignator", nil]) -#define __LaserDesignatorIGUI_LaserCode (__LaserDesignatorIGUI displayCtrl 123001) -#define __LaserDesignatorIGUI_ACE_Distance (__LaserDesignatorIGUI displayCtrl 123002) -#define __LaserDesignatorIGUI_CA_Distance (__LaserDesignatorIGUI displayCtrl 151) -#define __LaserDesignatorIGUI_LaserOn (__LaserDesignatorIGUI displayCtrl 158) - #define IDC_MODECONTROLGROUP 1000 #define IDC_ATTACKMODE 1001 #define IDC_LASERCODE 1002 #define IDC_LASERICON 1003 + +#define IDC_LASERDESIGNATOR_LASERCODE 123001 +#define IDC_LASERDESIGNATOR_ACEDISTANCE 123002 +#define IDC_LASERDESIGNATOR_DISTANCE 151 diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index 4663712840..a04d339441 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -1,6 +1,23 @@ + + Laser + Laser + Laser + Laser + Лазер + Laser + Lézer + Láser + Laser + Laser + レーザー + 레이저 + 激光 + 雷射 + Lazer + Laser Dispersion Simulation Count レーザーの分散シミュレート数 @@ -9,7 +26,7 @@ Wskaźnik poziomu rozproszenia wiązki lasera Nombre de simulations pour la dispersion du laser Contatore di Simulazione della Dispersione del Laser - 雷射散射模拟计算 + 激光色散模拟计数 雷射散射模擬計算 Число симуляций рассеивания лазерного луча Contador da Simulação de Dispersão de Laser @@ -30,7 +47,7 @@ Codice laser レーザ コード 레이저 코드 - 雷射码 + 激光码 雷射碼 Lazer Kod @@ -47,7 +64,7 @@ Laser - Cambia codice + レーザ - コードの数値を増やす 레이저 - 코드 순환 위 - 雷射 - 循环切换雷射码 上 + 激光—循环切换激光码 上 雷射 - 循環切換雷射碼 上 Lazer - Çevrim Kodu Yukarı @@ -64,9 +81,41 @@ Laser - Cambia codice - レーザ - コードの数値を減らす 레이저 - 코드 순환 아래 - 雷射 - 循环切换雷射码 下 + 激光—循环切换激光码 下 雷射 - 循環切換雷射碼 下 Lazer - Çevrim Kodu aşağı + + Laser Spot Tracker: On + レーザースポットトラッカー: オン + Laserowe Śledzenie Punktu: Wł. + Laserziel Verfolgung: An + + + Laser Spot Tracker: Off + レーザースポットトラッカー: オフ + Laserowe Śledzenie Punktu: Wył. + Laserziel Verfolgung: Aus + + + Draw Laser on Map + 地図上にレーザーを表示する + Rysuj Laser na Mapie + 맵에 레이저 그리기 + 在地图上绘制激光 + Отображать лазер на карте + Dibujar láser en mapa + Laser auf Karte zeichnen + + + Active laser designator's position will be drawn on the map + アクティブな指示レーザーの位置が地図上に描画されます + Pozycja aktywnego wskaźnika laserowego będzie rysowana na mapie. + 지도에 능동 레이저 표시기의 위치가 그려집니다. + 激活的激光指示器本身及其标记的点会在地图上显示 + Точка, куда светит активный лазер, будет указана на карте + La posición del designador láser activo será dibujada en el mapa + Die Position des aktiven Lasermarkierers wird auf der Karte eingezeichnet + diff --git a/addons/laserpointer/ACE_Settings.hpp b/addons/laserpointer/ACE_Settings.hpp deleted file mode 100644 index 94d6fcf40f..0000000000 --- a/addons/laserpointer/ACE_Settings.hpp +++ /dev/null @@ -1,5 +0,0 @@ -class ACE_Settings { - class GVAR(enabled) { - movedToSQF = 1; - }; -}; diff --git a/addons/laserpointer/CfgEventHandlers.hpp b/addons/laserpointer/CfgEventHandlers.hpp index f6503c2479..f72363981a 100644 --- a/addons/laserpointer/CfgEventHandlers.hpp +++ b/addons/laserpointer/CfgEventHandlers.hpp @@ -3,15 +3,8 @@ class Extended_PreStart_EventHandlers { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); }; }; - class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); }; }; - -class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); - }; -}; diff --git a/addons/laserpointer/CfgJointRails.hpp b/addons/laserpointer/CfgJointRails.hpp index da7aee71b5..8c40d678a9 100644 --- a/addons/laserpointer/CfgJointRails.hpp +++ b/addons/laserpointer/CfgJointRails.hpp @@ -7,6 +7,15 @@ class asdg_FrontSideRail: asdg_SlotInfo { }; }; +class SlotInfo; +class PointerSlot: SlotInfo { + compatibleItems[] += { + "ACE_acc_pointer_red", + "ACE_acc_pointer_green_IR", + "ACE_acc_pointer_green" + }; +}; + class PointerSlot_Rail: PointerSlot { class compatibleItems { ACE_acc_pointer_red = 1; diff --git a/addons/laserpointer/CfgWeapons.hpp b/addons/laserpointer/CfgWeapons.hpp index 6afa29a344..2ac5f1fda6 100644 --- a/addons/laserpointer/CfgWeapons.hpp +++ b/addons/laserpointer/CfgWeapons.hpp @@ -1,9 +1,3 @@ - -class SlotInfo; -class PointerSlot: SlotInfo { - compatibleItems[] += {"ACE_acc_pointer_red","ACE_acc_pointer_green_IR","ACE_acc_pointer_green"}; -}; - class CfgWeapons { class ItemCore; class InventoryFlashLightItem_Base_F; @@ -15,85 +9,50 @@ class CfgWeapons { displayName = CSTRING(red); descriptionUse = CSTRING(useLaser); - }; - - class ACE_acc_pointer_red: ItemCore { - MRT_SwitchItemNextClass = "acc_pointer_IR"; - MRT_SwitchItemPrevClass = "acc_pointer_IR"; - MRT_switchItemHintText = CSTRING(Laser); - - ACE_laserpointer = 1; - - author = ECSTRING(common,ACETeam); - _generalMacro = "ACE_acc_pointer_red"; - scope = 1; - displayName = CSTRING(red); - descriptionUse = CSTRING(useLaser); - picture = "\A3\weapons_F\Data\UI\gear_accv_pointer_CA.paa"; - model = "\A3\weapons_f\acc\accv_pointer_F"; - descriptionShort = CSTRING(Description); class ItemInfo: InventoryFlashLightItem_Base_F { - mass = 6; - - class Pointer { - irLaserPos = "laser pos"; - irLaserEnd = "laser dir"; - irDistance = 5; - }; - - class FlashLight { - color[] = {0,0,0}; - ambient[] = {0,0,0}; - intensity = 0; - size = 0; - innerAngle = 0; - outerAngle = 0; - coneFadeCoef = 5; - position = "flash dir"; - direction = "flash"; - useFlare = 0; - flareSize = 0; - flareMaxDistance = "100.0f"; - dayLight = 0; - - class Attenuation { - start = 0; - constant = 0; - linear = 0; - quadratic = 0; - hardLimitStart = 0; - hardLimitEnd = 0; - }; - - scale[] = {0}; - }; + class Pointer; }; - - inertia = 0.1; }; class ACE_acc_pointer_green_IR: acc_pointer_IR { MRT_SwitchItemNextClass = "ACE_acc_pointer_green"; MRT_SwitchItemPrevClass = "ACE_acc_pointer_green"; - MRT_switchItemHintText = CSTRING(IRLaser); author = ECSTRING(common,ACETeam); _generalMacro = "ACE_acc_pointer_green"; scope = 1; displayName = CSTRING(green); + baseWeapon = "ACE_acc_pointer_green"; + }; + + class ACE_acc_pointer_red: acc_pointer_IR { + MRT_SwitchItemNextClass = "acc_pointer_IR"; + MRT_SwitchItemPrevClass = "acc_pointer_IR"; + MRT_switchItemHintText = CSTRING(Laser); + + author = ECSTRING(common,ACETeam); + _generalMacro = "ACE_acc_pointer_red"; + scope = 1; + descriptionShort = CSTRING(Description); + baseWeapon = "acc_pointer_IR"; + + class ItemInfo: ItemInfo { + POINTER_VISIBLE_RED; + }; }; class ACE_acc_pointer_green: ACE_acc_pointer_red { MRT_SwitchItemNextClass = "ACE_acc_pointer_green_IR"; MRT_SwitchItemPrevClass = "ACE_acc_pointer_green_IR"; - MRT_switchItemHintText = CSTRING(Laser); - ACE_laserpointer = 2; - - author = ECSTRING(common,ACETeam); _generalMacro = "ACE_acc_pointer_green"; scope = 2; displayName = CSTRING(green); + baseWeapon = "ACE_acc_pointer_green"; + + class ItemInfo: ItemInfo { + POINTER_VISIBLE_GREEN; + }; }; }; diff --git a/addons/laserpointer/XEH_PREP.hpp b/addons/laserpointer/XEH_PREP.hpp deleted file mode 100644 index 59a28bb4cc..0000000000 --- a/addons/laserpointer/XEH_PREP.hpp +++ /dev/null @@ -1,3 +0,0 @@ -PREP(drawLaserpoint); -PREP(getNearUnits); -PREP(onDraw); diff --git a/addons/laserpointer/XEH_postInit.sqf b/addons/laserpointer/XEH_postInit.sqf deleted file mode 100644 index 3a8d611364..0000000000 --- a/addons/laserpointer/XEH_postInit.sqf +++ /dev/null @@ -1,91 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -// fixes laser when being captured. Needed, because the selectionPosition of the right hand is used -[QEGVAR(captives,setHandcuffed), {if (_this select 1) then {(_this select 0) action ["GunLightOff", _this select 0]};}] call CBA_fnc_addEventHandler; - -if (!hasInterface) exitWith {}; - -GVAR(nearUnits) = []; -GVAR(index) = -1; -GVAR(laserClassesCache) = [] call CBA_fnc_createNamespace; -GVAR(redLaserUnits) = []; -GVAR(greenLaserUnits) = []; - -["CBA_settingsInitialized", { - // If not enabled, dont't add draw eventhandler or PFEH (for performance) - if (!GVAR(enabled)) exitWith { - ["CBA_attachmentSwitched", { - params ["_unit", "_prevItem", "_newItem", "_currWeaponType"]; - TRACE_4("CBA_attachmentSwitched eh",_unit,_prevItem,_newItem,_currWeaponType); - if ((getNumber (configFile >> "CfgWeapons" >> _newItem >> "ACE_laserpointer")) > 0) then { - TRACE_1("removing ACE_laserpointer",getNumber (configFile >> "CfgWeapons" >> _newItem >> "ACE_laserpointer")); - [1, "prev"] call CBA_accessory_fnc_switchAttachment; - }; - }] call CBA_fnc_addEventHandler; - }; - - [{ - private _oldNearUnits = GVAR(nearUnits); - GVAR(nearUnits) = call FUNC(getNearUnits); - - // remove units that moved away - { - GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _x); - GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _x); - } forEach (_oldNearUnits - GVAR(nearUnits)); - }, 5, []] call CBA_fnc_addPerFrameHandler; - - - private _fnc_processUnit = { - params ["_unit"]; - - private _weapon = currentWeapon _unit; - if (!(_unit isFlashlightOn _weapon)) exitWith { - GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit); - GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit); - }; - - private _laser = [(_unit weaponAccessories _weapon) select 1] param [0, ""]; - if (_laser isEqualTo "") exitWith { - GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit); - GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit); - }; - - private _laserID = GVAR(laserClassesCache) getVariable _laser; - - if (isNil "_laserID") then { - _laserID = getNumber (configFile >> "CfgWeapons" >> _laser >> "ACE_laserpointer"); - GVAR(laserClassesCache) setVariable [_laser, _laserID]; - }; - TRACE_3("",_weapon,_laser,_laserID); - - if (_laserID isEqualTo 1) exitWith { - GVAR(redLaserUnits) pushBackUnique _unit; - GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit); - }; - - if (_laserID isEqualTo 2) exitWith { - GVAR(greenLaserUnits) pushBackUnique _unit; - GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit); - }; - }; - - // custom scheduler - [{ - params ["_fnc_processUnit"]; - - ACE_player call _fnc_processUnit; - - GVAR(index) = GVAR(index) + 1; - private _unit = GVAR(nearUnits) param [GVAR(index), objNull]; - - if (isNull _unit) exitWith { - GVAR(index) = -1; - }; - - _unit call _fnc_processUnit; - }, 0.1, _fnc_processUnit] call CBA_fnc_addPerFrameHandler; - - addMissionEventHandler ["Draw3D", {call FUNC(onDraw)}]; -}] call CBA_fnc_addEventHandler; diff --git a/addons/laserpointer/XEH_preInit.sqf b/addons/laserpointer/XEH_preInit.sqf index b5e9d9b58f..7ab1e00588 100644 --- a/addons/laserpointer/XEH_preInit.sqf +++ b/addons/laserpointer/XEH_preInit.sqf @@ -1,18 +1,8 @@ #include "script_component.hpp" -ADDON = false; - -PREP_RECOMPILE_START; -#include "XEH_PREP.hpp" -PREP_RECOMPILE_END; - -["visionMode", { - params ["", "_visionMode"]; - - GVAR(isIR) = _visionMode isEqualTo 1; - GVAR(isTI) = _visionMode isEqualTo 2; -}] call CBA_fnc_addPlayerEventHandler; - -#include "initSettings.sqf" +{ + TRACE_1("blocking switching to unsupported laser mode",_x); + [_x, { false }] call CBA_fnc_addAttachmentCondition; +} forEach (keys (uiNamespace getVariable QGVAR(oldLasers))); ADDON = true; diff --git a/addons/laserpointer/XEH_preStart.sqf b/addons/laserpointer/XEH_preStart.sqf index 022888575e..41fe08e7cc 100644 --- a/addons/laserpointer/XEH_preStart.sqf +++ b/addons/laserpointer/XEH_preStart.sqf @@ -1,3 +1,5 @@ #include "script_component.hpp" -#include "XEH_PREP.hpp" +private _lasers = ((toString {(getNumber (_x >> "ACE_laserpointer")) > 0}) configClasses (configFile >> "CfgWeapons")) apply {configName _x}; +if (_lasers isNotEqualTo []) then { WARNING_1("%1 attachements still using unsupported ACE_laserpointer config",count _lasers) }; +uiNamespace setVariable [QGVAR(oldLasers), compileFinal (_lasers createHashMapFromArray [])]; diff --git a/addons/laserpointer/config.cpp b/addons/laserpointer/config.cpp index 4058157660..f405d0dfa0 100644 --- a/addons/laserpointer/config.cpp +++ b/addons/laserpointer/config.cpp @@ -14,7 +14,6 @@ class CfgPatches { }; }; -#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf deleted file mode 100644 index 918bcf9f02..0000000000 --- a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf +++ /dev/null @@ -1,109 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 and esteldunedain - * Draw a Laser Point - * - * Arguments: - * 0: Target unit - * 1: Range - * 2: is Green - * 3: Brightness - * - * Return Value: - * None - * - * Example: - * [player, 10, false, 2] call ace_laserpointer_fnc_drawLaserpoint - * - * Public: No - */ - -params ["_target", "_range", "_isGreen", "_brightness"]; - -private _unit = ACE_player; - -private _p0 = _target modelToWorldVisualWorld (_target selectionPosition "righthand"); - -// Find a system of orthogonal reference vectors -// _v1 points in the direction of the weapon -// _v2 points to the right of the weapon -// _v3 points to the top side of the weapon -private _v1 = _target weaponDirection currentWeapon _target; -private _v2 = vectorNormalized (_v1 vectorCrossProduct [0,0,1]); -private _v3 = _v2 vectorCrossProduct _v1; - -// Offset over the 3 reference axis -// This offset could eventually be configured by weapon in the config -#define OFFV1 0.31 -#define OFFV2 0 -#define OFFV3 0.08 - -// Offset _p0, the start of the laser -_p0 = _p0 vectorAdd (_v1 vectorMultiply OFFV1) vectorAdd (_v3 vectorMultiply OFFV3) vectorAdd (_v2 vectorMultiply OFFV2); - -// Calculate _p1, the potential end of the laser -private _p1 = _p0 vectorAdd (_v1 vectorMultiply _range); - -private _pL = lineIntersectsSurfaces [_p0, _p1, _unit, vehicle _unit] select 0 select 0; - -// no intersection found, quit (pointed to the sky or too far) -if (isNil "_pL") exitWith {}; - -private _distance = _p0 vectorDistance _pL; - -//systemChat str _distance; -if (_distance < 0.5) exitWith {}; - -_pL = _p0 vectorAdd (_v1 vectorMultiply _distance); - -private _pL2 = _p0 vectorAdd (_v1 vectorMultiply (_distance - 0.5)); - -_pL = ASLtoAGL _pL; - -/* -drawLine3D [ - _p0, - _pL, - [[1,0,0,1], [0,1,0,1]] select _isGreen -]; -*/ - -//systemChat str [_target, "FIRE"] intersect [_camPos, _pL]; - -private _camPos = positionCameraToWorld [0,0,0.2]; - -// Check for blocking laser by player or external laser source (other player) -private _blocked = false; -if (_unit isEqualTo _target && {cameraView in ["INTERNAL","GUNNER"]}) then { - // Laser belongs to player: check VIEW LOD - // (it's less detailed & fallbacks to GEO if not present, but allows to draw laser mark behind bulletproof glass) - if (count ([_unit, "VIEW"] intersect [_camPos, _pL]) > 0) exitWith { _blocked = true; }; -} else { - // External laser: check FIRE GEO LOD (more detailed) - if (count ([_target, "FIRE"] intersect [_camPos, _pL]) > 0) exitWith { _blocked = true; }; - if (count ([_unit, "FIRE"] intersect [_camPos, _pL]) > 0) exitWith { _blocked = true; }; -}; - -// Exit due to LOS blocked by source/player -if (_blocked) exitWith {}; - -// Convert _camPos to ASL -_camPos = AGLToASL _camPos; - -// Check for blocking by terrain or object -if (terrainIntersectASL [_camPos, _pL2]) exitWith {}; -if (lineIntersects [_camPos, _pL2]) exitWith {}; - -private _size = 2 * sqrt (1 / _distance) * (call EFUNC(common,getZoom)); - -drawIcon3D [ - format ["\a3\weapons_f\acc\data\collimdot_%1_ca.paa", ["red", "green"] select _isGreen], - [[1,0.25,0.25,0.6*_brightness], [0.25,1,0.25,0.5*_brightness]] select _isGreen, - _pL, - _size, - _size, - 45, - "", - 0, - 0.05 -]; diff --git a/addons/laserpointer/functions/fnc_getNearUnits.sqf b/addons/laserpointer/functions/fnc_getNearUnits.sqf deleted file mode 100644 index 38b1a32ed9..0000000000 --- a/addons/laserpointer/functions/fnc_getNearUnits.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Reports near units. - * - * Arguments: - * None - * - * Return Value: - * Near Units - * - * Example: - * call ACE_laserpointer_fnc_getNearUnits - * - * Public: No - */ - -private _camPosAGL = positionCameraToWorld [0, 0, 0]; - -// handle RHS / bugged vehicle slots -if !((_camPosAGL select 0) isEqualType 0) exitWith { [] }; - -private _nearUnits = []; - -{ - _nearUnits append crew _x; -} forEach nearestObjects [_camPosAGL, ["AllVehicles"], MAX_LASER_RANGE]; - -_nearUnits diff --git a/addons/laserpointer/functions/fnc_onDraw.sqf b/addons/laserpointer/functions/fnc_onDraw.sqf deleted file mode 100644 index bfee8a7ea6..0000000000 --- a/addons/laserpointer/functions/fnc_onDraw.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Draw the visible laser beams of all cached units. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_laserpointer_fnc_onDraw - * - * Public: No - */ - -if (count GVAR(redLaserUnits) + count GVAR(greenLaserUnits) > 0 && {!GVAR(isTI)}) then { - private _brightness = 2 - call EFUNC(common,ambientBrightness); - - { - // red laser. draw green dot anyway in IR mode - [_x, 100, GVAR(isIR), _brightness] call FUNC(drawLaserpoint); - } count GVAR(redLaserUnits); - - { - // green laser - [_x, 100, true, _brightness] call FUNC(drawLaserpoint); - } count GVAR(greenLaserUnits); -}; diff --git a/addons/laserpointer/functions/script_component.hpp b/addons/laserpointer/functions/script_component.hpp deleted file mode 100644 index 727c32539f..0000000000 --- a/addons/laserpointer/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\laserpointer\script_component.hpp" \ No newline at end of file diff --git a/addons/laserpointer/initSettings.sqf b/addons/laserpointer/initSettings.sqf deleted file mode 100644 index edf9138b7b..0000000000 --- a/addons/laserpointer/initSettings.sqf +++ /dev/null @@ -1,7 +0,0 @@ -[ - QGVAR(enabled), "CHECKBOX", - LSTRING(DisplayName), - localize ELSTRING(common,ACEKeybindCategoryWeapons), - true, - 1 -] call CBA_fnc_addSetting; diff --git a/addons/laserpointer/script_component.hpp b/addons/laserpointer/script_component.hpp index 4b7b2e0d39..8e1d126e23 100644 --- a/addons/laserpointer/script_component.hpp +++ b/addons/laserpointer/script_component.hpp @@ -15,5 +15,4 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" - -#define MAX_LASER_RANGE 50 +#include "\z\ace\addons\laserpointer\script_macros_config.hpp" diff --git a/addons/laserpointer/script_macros_config.hpp b/addons/laserpointer/script_macros_config.hpp new file mode 100644 index 0000000000..497911dc95 --- /dev/null +++ b/addons/laserpointer/script_macros_config.hpp @@ -0,0 +1,39 @@ +/* + Usage: + + #include "\z\ace\addons\laserpointer\script_macros_config.hpp" + + class CfgWeapons { + class My_AwesomePointer_base; + class My_AwesomePointer: My_AwesomePointer_base { + class ItemInfo { + POINTER_VISIBLE_GREEN; + }; + }; + }; +*/ + +#define POINTER_VISIBLE_RED \ + class Pointer { \ + irLaserPos = "laser pos"; \ + irLaserEnd = "laser dir"; \ + irDistance = 5; \ + isIR = 0; \ + irDotSize = QUOTE(0.1/4); \ + beamThickness = 0; \ + beamMaxLength = 50; \ + dotColor[] = {16384, 0, 0}; \ + beamColor[] = {0, 0, 0}; \ + } +#define POINTER_VISIBLE_GREEN \ + class Pointer { \ + irLaserPos = "laser pos"; \ + irLaserEnd = "laser dir"; \ + irDistance = 5; \ + isIR = 0; \ + irDotSize = QUOTE(0.1/4); \ + beamThickness = 0; \ + beamMaxLength = 75; \ + dotColor[] = {0, 16384, 0}; \ + beamColor[] = {0, 0, 0}; \ + } diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 9418705ceb..fb93914b44 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -14,7 +14,7 @@ Laser レーザ ポインタ 레이저 지시기 - 雷射指示器 + 激光指示器 雷射指示器 Lazer Işaretleyici @@ -31,7 +31,7 @@ Laser (vermelho) レーザ ポインタ (赤) 레이저 지시기 (빨강) - 雷射指示器 (红色) + 激光指示器(红色) 雷射指示器 (紅色) Lazer Işaretleyici (Kırmızı) @@ -48,7 +48,7 @@ Laser (verde) レーザ ポインタ (緑) 레이저 지시기 (초록) - 雷射指示器 (绿色) + 激光指示器(绿色) 雷射指示器 (綠色) Lazer Işaretleyici (Yeşil) @@ -65,7 +65,7 @@ Emite luz visível. 可視光をだします。 밝은 곳에서도 보임 - 发射出可见光 + 发出可见激光 發射出可見光 Görünür ışık yayar. @@ -82,7 +82,7 @@ <t color='#9cf953'>Használat: </t>Lézer BE/KI kapcsolása <t color='#9cf953'>つかう: </t>レーザの起動/停止 <t color='#9cf953'>사용키: </t>레이저 켜기/끄기 - <t color='#9cf953'>使用: </t>雷射开启/关闭 + <t color='#9cf953'>使用:</t>激光开启/关闭 <t color='#9cf953'>使用: </t>雷射開啟/關閉 <t color='#9cf953'>Use: </t>Turn Laser ON/OFF @@ -97,9 +97,9 @@ Lézer Laser Laser - レーザ + レーザー 레이저 - 雷射 + 激光 雷射 Lazer @@ -116,7 +116,7 @@ Laser IV 赤外線レーザ 적외선 레이저 - 红外线雷射 + 红外线激光 紅外線雷射 IR Lazer @@ -132,8 +132,8 @@ Přepnout Laser / Infračervený Laser Alternar entre Laser / Laser IV レーザ/赤外線レーザを切り替える - 레이저 / 적외선 레이저 전환 - 切换雷射/红外线雷射 + 가시광/적외선 레이저 전환 + 切换激光/红外线激光 切換雷射/紅外線雷射 Değiştir Lazer/IR Lazer diff --git a/addons/logistics_rope/CfgWeapons.hpp b/addons/logistics_rope/CfgWeapons.hpp index 1b492be2a2..c5f1b384a2 100644 --- a/addons/logistics_rope/CfgWeapons.hpp +++ b/addons/logistics_rope/CfgWeapons.hpp @@ -4,7 +4,7 @@ class CfgWeapons { class ACE_ropeBase: ACE_ItemCore { scope = 1; picture = QPATHTOF(data\m_rope_ca); - model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + // model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; // model is Locked to Helicopter DLC descriptionShort = CSTRING(descriptionShort); }; @@ -64,4 +64,4 @@ class CfgWeapons { mass = 108; }; }; -}; \ No newline at end of file +}; diff --git a/addons/logistics_rope/stringtable.xml b/addons/logistics_rope/stringtable.xml index ac05508402..ff4624d027 100644 --- a/addons/logistics_rope/stringtable.xml +++ b/addons/logistics_rope/stringtable.xml @@ -4,19 +4,28 @@ A twisted braid of fibers. Usually used for rappelling or towing. 組み紐されたロープ。ラペリングやけん引に使用されます。 + Une corde en fibres torsadées. Généralement utilisée pour la descente en rappel ou le remorquage. + Витой канат. Обычно используется для спуска или буксирования. + Ein verdrehtes Geflecht aus Fasern. Wird normalerweise zum Abseilen oder Abschleppen verwendet. + Lina skręcona z włókien. Zwykle używana do zjazdów lub holowania. + 编织绳。通常用于索降和牵引拖曳。 + 꼬아진 섬유입니다. 주로 레펠이나 견인에 사용됩니다. + Malla trenzada de fibras. Normalmente utilizada para descolgarse desde ella o remolcar. Rope 3.2 meters 3.2 Meter Seil Corde de 3,2 mètres Lina, długość 3,2 m. - Канат 3.2 метров + Канат 3.2 метра Corda (3.2m) Corda da 3.2 metri Lano 3.2 metrů 3.2 metre halat Cuerda de 3.2 metros ロープ (3.2 メートル) + 绳索(3.2米) + 줄 (3.2m) Rope 6.2 meters @@ -30,6 +39,8 @@ 6.2 metre halat Cuerda de 6.2 metros ロープ (6.2 メートル) + 绳索(6.2米) + 줄 (6.2m) Rope 12.2 meters @@ -40,10 +51,12 @@ Канат 12.2 метров Corda (12.2m) 繩索(12.2公尺長) + 绳索(12.2米) Corda da 12.2 metri Lano 12.2 metrů 12.2 metre halat Cuerda de 12.2 metros + 줄 (12.2m) Rope 15.2 meters @@ -54,10 +67,12 @@ Канат 15.2 метров Corda (15.2m) 繩索(15.2公尺長) + 绳索(15.2米) Corda da 15.2 metri Lano 15.2 metrů 15.2 metre halat Cuerda de 15.2 metros + 줄 (15.2m) Rope 18.3 meters @@ -68,10 +83,12 @@ Канат 18.3 метров Corda (18.3m) 繩索(18.3公尺長) + 绳索(18.3米) Corda da 18.3 metri Lano 18.3 metrů 18.3 metre halat Cuerda de 18.3 metros + 줄 (18.3m) Rope 27.4 meters @@ -82,10 +99,12 @@ Канат 27.4 метров Corda (27.4m) 繩索(27.4公尺長) + 绳索(27.4米) Corda da 27.4 metri Lano 27.4 metrů 27.4 metre halat Cuerda de 27.4 metros + 줄 (27.4m) Rope 36.6 meters @@ -96,10 +115,12 @@ Канат 36.6 метров Corda (36.6m) 繩索(36.6公尺長) + 绳索(36.6米) Corda da 36.6 metri Lano 36.6 metrů 36.6 metre halat Cuerda 36.6 metros + 줄 (36.6m) diff --git a/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf index d4e62afa15..3e7ce4f15c 100644 --- a/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: marc_book * Tests if unit can refuel the target UAV diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index c29be7636a..8c73052c45 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: marc_book * Starts refueling/recharging the 'Dartar' UAVs diff --git a/addons/logistics_uavbattery/functions/script_component.hpp b/addons/logistics_uavbattery/functions/script_component.hpp deleted file mode 100644 index 56cb8114f5..0000000000 --- a/addons/logistics_uavbattery/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\logistics_uavbattery\script_component.hpp" \ No newline at end of file diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index 1cfe226eef..5ca12e7d4e 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -13,8 +13,8 @@ Il drone è pieno БПЛА полностью заряжен ドローンは充電完了 - 무인기 충전완료 - 无人载具电池已充满 + 무인기 충전 완료 + 无人机电池已充满 無人載具電池已充滿 IHA Dolu @@ -31,7 +31,7 @@ Требуется аккумулятор для БПЛА UAV バッテリが必要です 무인기 배터리가 필요합니다 - 你需要一个无人载具电池 + 你需要一个无人机电池 你需要一個無人載具電池 UAV Bataryaya ihtiyacın var @@ -65,7 +65,7 @@ Аккумулятор БПЛА UAV バッテリ 무인기 배터리 - 无人载具电池 + 无人机电池 無人載具電池 UAV Batarya @@ -81,8 +81,8 @@ Usata per ricaricare la Batteria dell'UAV Используется для зарядки переносных БПЛА 運んでいる UAV を充電に使う - 무인기를 재충전 할때 씁니다. - 对可携式无人载具进行充电 + 무인기를 재충전 할 때 씁니다. + 对可携式无人机进行充电 對可攜式無人載具進行充電 Used to refuel Carried UAV's @@ -100,7 +100,7 @@ 充電しています・・・ 正在充电... 充電中... - 충전중... + 충전 중... Şarj Oluyor diff --git a/addons/logistics_wirecutter/ACE_Arsenal_Stats.hpp b/addons/logistics_wirecutter/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..e317c1a19f --- /dev/null +++ b/addons/logistics_wirecutter/ACE_Arsenal_Stats.hpp @@ -0,0 +1,23 @@ +class EGVAR(arsenal,stats) { + class statBase; + class GVAR(wireCutter): statBase { + scope = 2; + priority = -1; + stats[] = {QGVAR(hasWirecutter)}; + displayName = CSTRING(wirecutterName); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(common,yes))); + condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + tabs[] = {{4,5}, {}}; + }; + class GVAR(wireCutterItem): statBase { + scope = 2; + priority = -1; + stats[] = {"ACE_isWirecutter"}; + displayName = CSTRING(wirecutterName); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(common,yes))); + condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + tabs[] = {{}, {7}}; + }; +}; diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index cfaa6c3259..609c84d9ba 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -8,6 +8,8 @@ class CfgWeapons { descriptionShort = CSTRING(wirecutterDescription); model = QPATHTOF(data\ace_wirecutter.p3d); picture = QPATHTOF(ui\item_wirecutter_ca.paa); + ACE_isWirecutter = 1; + ACE_isTool = 1; scope = 2; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 25; diff --git a/addons/logistics_wirecutter/XEH_postInit.sqf b/addons/logistics_wirecutter/XEH_postInit.sqf index a22479e7e1..29dc506396 100644 --- a/addons/logistics_wirecutter/XEH_postInit.sqf +++ b/addons/logistics_wirecutter/XEH_postInit.sqf @@ -7,3 +7,5 @@ if (hasInterface) then { if (isServer) then { [QGVAR(destroyFence), {_this call FUNC(destroyFence)}] call CBA_fnc_addEventHandler; }; + +GVAR(possibleWirecutters) = call (uiNamespace getVariable [QGVAR(possibleWirecutters), {[]}]); diff --git a/addons/logistics_wirecutter/XEH_preStart.sqf b/addons/logistics_wirecutter/XEH_preStart.sqf index 022888575e..75567fe26e 100644 --- a/addons/logistics_wirecutter/XEH_preStart.sqf +++ b/addons/logistics_wirecutter/XEH_preStart.sqf @@ -1,3 +1,7 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +// Cache wirecutter item classes, see XEH_postInit.sqf +private _possibleWirecutters = ("getNumber (_x >> 'ACE_isWirecutter') == 1" configClasses (configFile >> "CfgWeapons")) apply {configName _x}; +uiNamespace setVariable [QGVAR(possibleWirecutters), compileFinal str _possibleWirecutters]; diff --git a/addons/logistics_wirecutter/config.cpp b/addons/logistics_wirecutter/config.cpp index c68f362be8..34107e57b1 100644 --- a/addons/logistics_wirecutter/config.cpp +++ b/addons/logistics_wirecutter/config.cpp @@ -17,3 +17,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" +#include "ACE_Arsenal_Stats.hpp" diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index 170c628d18..46e38acb90 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: gpgpgpgp, commy2, PabstMirror, mharis001 * Starts cutting down a fence. Triggers global "ace_wireCuttingStarted" event. diff --git a/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf b/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf index 9098acb743..3698f4a22f 100644 --- a/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Destroys the given fence and replaces it with a destroyed fence if possible. diff --git a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf index 640034f851..6f5b3218b0 100644 --- a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf +++ b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Dynamically adds "Cut Fence" actions to nearby fences when interact_menu is opened. diff --git a/addons/logistics_wirecutter/functions/fnc_isFence.sqf b/addons/logistics_wirecutter/functions/fnc_isFence.sqf index 38610f30fb..28c6a254b8 100644 --- a/addons/logistics_wirecutter/functions/fnc_isFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_isFence.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Checks if object is a fence. Should work on any fence type, even when (typeOf == ""). @@ -19,14 +19,4 @@ params ["_object"]; TRACE_1("Checking if fence",_object); -private _typeOf = typeOf _object; - -private _returnValue = if (_typeOf != "") then { - // Check for isFence entry since we have valid typeOf - 1 == getNumber (configFile >> "CfgVehicles" >> _typeOf >> QGVAR(isFence)); -} else { - // Check the p3d name against list (in script_component.hpp) - (getModelInfo _object select 0) in FENCE_P3DS; -}; - -_returnValue +getNumber (configOf _object >> QGVAR(isFence)) == 1 || {(getModelInfo _object select 0) in FENCE_P3DS} diff --git a/addons/logistics_wirecutter/functions/script_component.hpp b/addons/logistics_wirecutter/functions/script_component.hpp deleted file mode 100644 index 4a5c48048c..0000000000 --- a/addons/logistics_wirecutter/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\logistics_wirecutter\script_component.hpp" \ No newline at end of file diff --git a/addons/logistics_wirecutter/script_component.hpp b/addons/logistics_wirecutter/script_component.hpp index 38ed1dd077..7335ef2e57 100644 --- a/addons/logistics_wirecutter/script_component.hpp +++ b/addons/logistics_wirecutter/script_component.hpp @@ -74,7 +74,13 @@ "netfence_03_m_3m_corner_f.p3d",\ "netfence_03_m_9m_f.p3d",\ "vineyardfence_01_f.p3d",\ - "gameprooffence_01_l_5m_f.p3d"\ + "gameprooffence_01_l_5m_f.p3d",\ + "netfence_01_m_gate_f.p3d",\ + "netfence_02_m_2m_f.p3d",\ + "netfence_02_m_4m_f.p3d",\ + "netfence_02_m_8m_f.p3d",\ + "net_fence_gate_f.p3d",\ + "new_wiredfence_10m_dam_f.p3d"\ ] #define SOUND_CLIP_TIME_SPACING 1.5 @@ -82,7 +88,7 @@ #define CUT_TIME_ENGINEER 7.5 #define HAS_WIRECUTTER(unit) (\ - "ACE_wirecutter" in (unit call EFUNC(common,uniqueItems)) \ - || {1 == getNumber (configFile >> "CfgVehicles" >> (backpack unit) >> QGVAR(hasWirecutter))} \ - || {1 == getNumber (configFile >> "CfgWeapons" >> (vest unit) >> QGVAR(hasWirecutter))} \ + ((unit call EFUNC(common,uniqueItems)) arrayIntersect GVAR(possibleWirecutters)) isNotEqualTo []\ + || {getNumber ((configOf (backpackContainer unit)) >> QGVAR(hasWirecutter)) == 1} \ + || {getNumber (configFile >> "CfgWeapons" >> (vest unit) >> QGVAR(hasWirecutter)) == 1} \ ) diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index ffc95dfcd8..5e71db11b3 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -64,7 +64,7 @@ Drótok elvágása... Разрезаем забор / провода... フェンス/ワイヤを切断しています・・・ - 철망/철조망 자르는중... + 철망/철조망 자르는 중... 正在剪断护栏/刺网... 剪斷護欄/刺網中... Kesiliyor Çit/Tel diff --git a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf index b5b159b7c2..d6d8f3b827 100644 --- a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Checks if the given unit can repack magazines of the given type. diff --git a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf index 70018cd31d..b4cf8b16ef 100644 --- a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf +++ b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, commy2, esteldunedain, Ruthberg * Gets magazine children for interaciton menu. diff --git a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf index d70899ba56..9383089d28 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) * Simulates repacking a set of magazines. diff --git a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf index f48d0029fa..8cd5977cca 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) * Handles each frame durring the repack progressBar. diff --git a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf index bd7d4dae2a..4782aba840 100644 --- a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf +++ b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Simulates repacking a set of magazines. diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index f62e6dc0e3..1b4c2d281e 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) * Starts repacking a specific magazine classname. @@ -61,6 +61,10 @@ if (count _startingAmmoCounts < 2) exitWith {ERROR("Not Enough Mags to Repack"); private _simEvents = [_fullMagazineCount, _startingAmmoCounts, _isBelt] call FUNC(simulateRepackEvents); private _totalTime = _simEvents select (count _simEvents - 1) select 0; +if (GVAR(repackAnimation)) then { + [_player, "Gear"] call EFUNC(common,doGesture); +}; + [ _totalTime, [_magazineClassname, _startingAmmoCounts, _simEvents], diff --git a/addons/magazinerepack/functions/script_component.hpp b/addons/magazinerepack/functions/script_component.hpp deleted file mode 100644 index d43593994d..0000000000 --- a/addons/magazinerepack/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\magazinerepack\script_component.hpp" \ No newline at end of file diff --git a/addons/magazinerepack/initSettings.sqf b/addons/magazinerepack/initSettings.sqf index d489864a44..0bb18f3707 100644 --- a/addons/magazinerepack/initSettings.sqf +++ b/addons/magazinerepack/initSettings.sqf @@ -31,3 +31,11 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)]; true, 0 ] call CBA_fnc_addSetting; + +[ + QGVAR(repackAnimation), "CHECKBOX", + LSTRING(repackAnimation), + _category, + true, + 0 +] call CBA_fnc_addSetting; diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 35af14f472..fb239ce0d7 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -10,7 +10,7 @@ 弾倉詰め替え 탄약 채우기 Przepakowywanie magazynków - Перепаковка Магазинов + Перепаковка магазинов Preenchimento de Carregador Remplissage des chargeurs Přepáskování zásobníků @@ -24,7 +24,7 @@ 每發所需時間 每发所需时间 弾頭毎の所有時間 - 구경 당 시간 + 탄알 당 시간 Czas na nabój Время на патрон Tempo por projétil @@ -56,7 +56,7 @@ 每彈鍊所需時間 每弹炼所需时间 ベルトリンク毎の所有時間 - 탄약띠 당 시간 + 탄띠 당 시간 Czas na taśmę Время на звено ленты Tempo por carregador de cinto @@ -93,7 +93,7 @@ Újratárazás... Перепаковка магазинов... 弾倉を詰め替えしています・・・ - 다시 채우는중... + 다시 채우는 중... 正在整理弹匣 ... 重新整理彈匣中 ... Şarjör Yeniden Dolduruluyor... @@ -128,7 +128,7 @@ Reorganização Terminada 詰め替えが完了しました 탄창 채우기 끝남 - 重整完成 + 整理完成 重整完成 Yeniden Doldurma Bitti @@ -144,7 +144,7 @@ Riempimento Interrotto Reorganização Interrompida 詰め替えを中断しました - 탄창 채우기 방해받음 + 탄창을 채우는 중 방해받음 弹匣整理被打断 重整被中斷 Yeniden Doldurma Durduruldu @@ -161,7 +161,7 @@ %1 Pieno(i) e %2 Parziale(i) %1 Total e %2 Parcial %1 個の満杯と %2 個の弾薬入り弾倉 - %1 꽉찼고 %2 부분참 + %1 꽉 찼고 %2 부분적으로 참 %1个满的与%2个部分的 %1個滿的與%2個部分的 %1 Dolu ve %2 Partial @@ -169,10 +169,34 @@ Repack Loaded Magazines 装填済み弾倉を詰め替え + Remplir le chargeur engagé + Перепаковать загруженные магазины + Geladene Magazine umpacken + Przepakuj załadowane magazynki + 重新整理已上膛的弹匣 + 장전된 탄창에 총알 채우는 중 + Reorganizar cargadores llenos Repacking magazines, weapon unloaded 弾倉を詰め替えし、<br />非装填状態です + Remplissage des chargeurs, arme déchargée. + Перепаковка магазинов, оружие разряжено + Magazin umgepackt, Waffe entladen + Przepakowywanie magazynków, broń rozładowana + 重新整理弹匣,武器未上膛 + 탄창 다시 채우는 중, 무기에서 탄창 뺌 + Reorganizando cargadores, arma descargada + + + Repack Animation + Animation für Umpacken + Animacja przepakowywania + 탄약 합치기 애니메이션 + 詰め替え時のアニメーション + 整理动画 + Анимация перепаковки + Animación de reorganizar diff --git a/addons/main/script_debug.hpp b/addons/main/script_debug.hpp index bb08e34e09..72b6657094 100644 --- a/addons/main/script_debug.hpp +++ b/addons/main/script_debug.hpp @@ -10,8 +10,8 @@ Fast Recompiling via function #define PREP_RECOMPILE_END }; call _recomp; ACE_RECOMPILES pushBack _recomp; #else #define LINKFUNC(x) FUNC(x) - #define PREP_RECOMPILE_START /* */ - #define PREP_RECOMPILE_END /* */ + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ #endif @@ -32,7 +32,7 @@ STACK TRACING #else #define CALLSTACK(function) function #define CALLSTACK_NAMED(function, functionName) function - #define DUMPSTACK + #define DUMPSTACK ; /* disabled */ #endif @@ -51,8 +51,8 @@ PERFORMANCE COUNTERS SECTION #define DUMP_COUNTERS ([__FILE__, __LINE__] call ACE_DUMPCOUNTERS_FNC) #else - #define CREATE_COUNTER(x) /* disabled */ - #define BEGIN_COUNTER(x) /* disabled */ - #define END_COUNTER(x) /* disabled */ - #define DUMP_COUNTERS /* disabled */ + #define CREATE_COUNTER(x) ; /* disabled */ + #define BEGIN_COUNTER(x) ; /* disabled */ + #define END_COUNTER(x) ; /* disabled */ + #define DUMP_COUNTERS ; /* disabled */ #endif diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 58ae338aae..96d96f5dd5 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -38,6 +38,7 @@ #define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) #define ARR_SELECT(ARRAY,INDEX,DEFAULT) (if (count ARRAY > INDEX) then {ARRAY select INDEX} else {DEFAULT}) +#define ANY_OF(ARRAY,CONDITION) (ARRAY findIf {CONDITION} != -1) // ACEX Merge #define ACEX_PREFIX acex @@ -147,4 +148,21 @@ #define ZEUS_ACTION_CONDITION ([_target, {QUOTE(QUOTE(ADDON)) in curatorAddons _this}, missionNamespace, QUOTE(QGVAR(zeusCheck)), 1E11, 'ace_interactMenuClosed'] call EFUNC(common,cachedCall)) +#define SUBSKILLS ["aimingAccuracy", "aimingShake", "aimingSpeed", "spotDistance", "spotTime", "courage", "reloadSpeed", "commanding", "general"] + +// macro add a dummy cfgPatch and notLoaded entry +#define ACE_PATCH_NOT_LOADED(NAME,CAUSE) \ +class CfgPatches { \ + class DOUBLES(NAME,notLoaded) { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {"ace_main"}; \ + VERSION_CONFIG; \ + }; \ +}; \ +class ace_notLoaded { \ + NAME = CAUSE; \ +}; + #include "script_debug.hpp" diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 8e598ffeef..167466d853 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -10,11 +10,14 @@ #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 2.06 -#define REQUIRED_CBA_VERSION {3,15,6} +#define REQUIRED_VERSION 2.14 +#define REQUIRED_CBA_VERSION {3,15,7} -#ifdef COMPONENT_BEAUTIFIED - #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) -#else - #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT) +#ifndef COMPONENT_BEAUTIFIED + #define COMPONENT_BEAUTIFIED COMPONENT +#endif +#ifdef SUBCOMPONENT_BEAUTIFIED + #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED - SUBCOMPONENT_BEAUTIFIED) +#else + #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) #endif diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 861a028d34..098eec73cb 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 -#define MINOR 13 -#define PATCHLVL 6 -#define BUILD 60 +#define MINOR 15 +#define PATCHLVL 2 +#define BUILD 69 diff --git a/addons/main/stringtable.xml b/addons/main/stringtable.xml index 31c0b5c16c..e97670f84f 100644 --- a/addons/main/stringtable.xml +++ b/addons/main/stringtable.xml @@ -14,25 +14,25 @@ ACE ロジスティクス ACE 后勤 ACE 後勤 - ACE 논리 + ACE 병참 ACE Lojistik - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ diff --git a/addons/map/CfgAmmo.hpp b/addons/map/CfgAmmo.hpp index aca4042b4f..d54ab0a2c9 100644 --- a/addons/map/CfgAmmo.hpp +++ b/addons/map/CfgAmmo.hpp @@ -1,7 +1,7 @@ class CfgAmmo { - + class Grenade; - + class ACE_FlashlightProxy_White: Grenade { effectsSmoke = "ACE_FlashlightEffect_White"; explosionTime = 0.01; @@ -12,7 +12,7 @@ class CfgAmmo { simulation = "shotSmokeX"; smokeColor[] = {1,1,1,1}; timeToLive = 1e10; - + impactArmor[] = {}; impactConcrete[] = {}; impactDefault[] = {}; @@ -30,24 +30,24 @@ class CfgAmmo { impactWater[] = {}; impactWood[] = {}; }; - + class ACE_FlashlightProxy_Red: ACE_FlashlightProxy_White { effectsSmoke = "ACE_FlashlightEffect_Red"; }; - + class ACE_FlashlightProxy_Blue: ACE_FlashlightProxy_White { effectsSmoke = "ACE_FlashlightEffect_Blue"; }; - + class ACE_FlashlightProxy_Green: ACE_FlashlightProxy_White { effectsSmoke = "ACE_FlashlightEffect_Green"; }; - + class ACE_FlashlightProxy_Yellow: ACE_FlashlightProxy_White { effectsSmoke = "ACE_FlashlightEffect_Yellow"; }; - + class ACE_FlashlightProxy_Orange: ACE_FlashlightProxy_White { effectsSmoke = "ACE_FlashlightEffect_Orange"; }; -}; \ No newline at end of file +}; diff --git a/addons/map/CfgMarkers.hpp b/addons/map/CfgMarkers.hpp index 3dd6463891..303194de00 100644 --- a/addons/map/CfgMarkers.hpp +++ b/addons/map/CfgMarkers.hpp @@ -4,7 +4,7 @@ class CfgMarkers { // Reenable NATO symbols ... class b_unknown: Flag {scope = 2;}; - + // disable all civy markers (harbor etc.) class c_unknown: b_unknown {scope = 1;}; diff --git a/addons/map/Effects.hpp b/addons/map/Effects.hpp index 5258b225aa..dbd358eaba 100644 --- a/addons/map/Effects.hpp +++ b/addons/map/Effects.hpp @@ -40,4 +40,4 @@ class ACE_FlashlightEffect_Orange { simulation = "light"; type = "ACE_FlashlightLight_Orange"; }; -}; \ No newline at end of file +}; diff --git a/addons/map/MapTweaks.hpp b/addons/map/MapTweaks.hpp index 52edf29341..daafb58636 100644 --- a/addons/map/MapTweaks.hpp +++ b/addons/map/MapTweaks.hpp @@ -27,11 +27,11 @@ class Tree { }; class Legend { - x = SafeZoneX+SafeZoneW-.340; - y = SafeZoneY+SafeZoneH-.152; + x = "SafeZoneX+SafeZoneW-0.340"; + y = "SafeZoneY+SafeZoneH-0.152"; font = "RobotoCondensed"; - w = .340; - h = .152; + w = 0.340; + h = 0.152; sizeEx = 0.039210; colorBackground[] = {0.906000, 0.901000, 0.880000, 0.5}; color[] = {0, 0, 0, 0.75}; diff --git a/addons/map/XEH_postInitServer.sqf b/addons/map/XEH_postInitServer.sqf index dc0c7f991e..80cbb73d54 100644 --- a/addons/map/XEH_postInitServer.sqf +++ b/addons/map/XEH_postInitServer.sqf @@ -6,7 +6,7 @@ addMissionEventHandler ["HandleDisconnect",{ if (!GVAR(mapGlow)) exitWith {}; private _unitLight = _disconnectedPlayer getVariable [QGVAR(flashlight), ["", objNull]]; _unitLight params ["", "_glow"]; - + if ((!isNull _disconnectedPlayer) && {!isNull _glow}) then { detach _glow; deleteVehicle _glow; diff --git a/addons/map/functions/fnc_blueForceTrackingModule.sqf b/addons/map/functions/fnc_blueForceTrackingModule.sqf index 6569fabc35..f7436e7bf9 100644 --- a/addons/map/functions/fnc_blueForceTrackingModule.sqf +++ b/addons/map/functions/fnc_blueForceTrackingModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Initializes the blue force tracking module. diff --git a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf index 152964b8ed..54ce2ef87c 100644 --- a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf +++ b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Update the blue force tracking. diff --git a/addons/map/functions/fnc_compileFlashlightMenu.sqf b/addons/map/functions/fnc_compileFlashlightMenu.sqf index c6af389a0a..4dc24a23f6 100644 --- a/addons/map/functions/fnc_compileFlashlightMenu.sqf +++ b/addons/map/functions/fnc_compileFlashlightMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Compile list of flashlight classnames and add to the "Flashlight" parent menu. diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index 732cb394cf..e747d9b400 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko and esteldunedain * Calculates the current map illumination for a given unit diff --git a/addons/map/functions/fnc_determineZoom.sqf b/addons/map/functions/fnc_determineZoom.sqf index 45a6faeaf2..e8135cc4cf 100644 --- a/addons/map/functions/fnc_determineZoom.sqf +++ b/addons/map/functions/fnc_determineZoom.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko * Calculate the maximum zoom level allowed for the current map diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 9457865bc2..3263a4b9e8 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Add or remove global flashlight glow for when player is looking at map. diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index f1c72e74c5..cedc99cfcb 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Check a unit for any flashlights that can be used on map. diff --git a/addons/map/functions/fnc_initMainMap.sqf b/addons/map/functions/fnc_initMainMap.sqf index 1617be33db..51cb883ba3 100644 --- a/addons/map/functions/fnc_initMainMap.sqf +++ b/addons/map/functions/fnc_initMainMap.sqf @@ -1,5 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "\a3\ui_f\hpp\defineResincl.inc" +/* + * Author: commy2 + * + * Public: No +*/ params ["_display"]; if (ctrlIDD _display != IDD_MAIN_MAP) exitWith {}; diff --git a/addons/map/functions/fnc_isFlashlight.sqf b/addons/map/functions/fnc_isFlashlight.sqf index 3d75803fc3..e563d74114 100644 --- a/addons/map/functions/fnc_isFlashlight.sqf +++ b/addons/map/functions/fnc_isFlashlight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Checks if the given item is a flashlight. @@ -32,7 +32,7 @@ if (isNil "_isFlashlight") then { _weaponConfig >> "FlashLight" ] findIf { isText (_x >> "ACE_Flashlight_Colour") - || {!(getArray (_x >> "ambient") in [[], [0,0,0]])} + || {!(getArray (_x >> "ambient") in [[], [0,0,0]]) && {getNumber (_x >> "irLight") == 0}} } != -1 // return } != -1; diff --git a/addons/map/functions/fnc_moduleMap.sqf b/addons/map/functions/fnc_moduleMap.sqf index e5747d5955..fbc99d497d 100644 --- a/addons/map/functions/fnc_moduleMap.sqf +++ b/addons/map/functions/fnc_moduleMap.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Initializes the Map module. diff --git a/addons/map/functions/fnc_needPlaySound.sqf b/addons/map/functions/fnc_needPlaySound.sqf index 0c0d34f42e..6636066d09 100644 --- a/addons/map/functions/fnc_needPlaySound.sqf +++ b/addons/map/functions/fnc_needPlaySound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Checks if sound needs to be played when flashlight is toggled. diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index 5ad3d42fe0..c81eb40627 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf index 2e80d83815..0d0bdd51e6 100644 --- a/addons/map/functions/fnc_simulateMapLight.sqf +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Draw nearby lighting and sexy flashlight beams on main map. diff --git a/addons/map/functions/fnc_switchFlashlight.sqf b/addons/map/functions/fnc_switchFlashlight.sqf index 5d4ed9de0a..3502bbc262 100644 --- a/addons/map/functions/fnc_switchFlashlight.sqf +++ b/addons/map/functions/fnc_switchFlashlight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: voiper * Switch flashlight on/off. diff --git a/addons/map/functions/fnc_updateMapEffects.sqf b/addons/map/functions/fnc_updateMapEffects.sqf index bebb15ac4f..cf6e01bf21 100644 --- a/addons/map/functions/fnc_updateMapEffects.sqf +++ b/addons/map/functions/fnc_updateMapEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko and esteldunedain * On map draw, updates the effects @@ -21,7 +21,7 @@ private _mapCentre = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; if (GVAR(mapIllumination)) then { //get nearby lighting - private _light = [[ACE_player], FUNC(determineMapLight), missionNamespace, QGVAR(mapLight), 0.1] call EFUNC(common,cachedCall); + private _light = [ACE_player] call FUNC(determineMapLight); _light params ["_applyLighting", "_lightLevel"]; diff --git a/addons/map/functions/script_component.hpp b/addons/map/functions/script_component.hpp deleted file mode 100644 index a9d4b1f265..0000000000 --- a/addons/map/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\map\script_component.hpp" diff --git a/addons/map/initSettings.sqf b/addons/map/initSettings.sqf index 4da66c22eb..fa248bf736 100644 --- a/addons/map/initSettings.sqf +++ b/addons/map/initSettings.sqf @@ -68,7 +68,7 @@ true, { [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; diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index c2f827e7de..e9b54537f0 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -46,8 +46,8 @@ 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? 地図へ環境光やプレイヤーのアイテムに基づいた光のシミュレーションを行うかどうかを設定できます。 - 주변 환경및 플레이어 조명에 의한 빛 변화를 지도에 반영할까요? - 透过环境光与玩家的手电筒来决定地图亮度. + 주변 환경 및 플레이어 조명에 의한 빛 변화를 지도에 반영할까요? + 透过环境光与玩家的手电筒来决定地图亮度。 透過環境光與玩家的物品來決定地圖亮度? @@ -61,7 +61,7 @@ Luce della torcia in mappa Lueur lampe carte 地図をライトで照らす - 지도 조명이 빛이 납니까 + 지도 조명 발광 增加地图亮度 增加地圖亮度 @@ -76,8 +76,8 @@ Přidat externí záři hráči který používá baterku v mapě? Aggiungi luce esterna a giocatori che usano la torcia in mappa? プレイヤーが地図をフラッシュライトで照らせられるように設定します。 - 지도에 불빛을 비치는 플레이어를 조금 더 밝게 합니까? - 当玩家打开手电筒时,增加地图亮度. + 지도에 조명을 사용하는 플레이어에 외부 불빛을 추가합니까? + 当玩家打开手电筒时,增加地图亮度。 當玩家擁有手電筒時,增加地圖亮度? @@ -109,8 +109,8 @@ Заставлять карту трястись при ходьбе? Far scuotere la mappa mentre cammini? 歩いているときは地図を揺らすかかどうかを設定できます。 - 걸을때 지도보면 흔들리게 합니까? - 走路时打开地图会产生晃动. + 걸을 때 지도를 보면 흔들리게 합니까? + 走路时打开地图会产生晃动。 走路時讓地圖有震動的感覺? @@ -142,7 +142,7 @@ Limita l'ammontare di zoom disponibile per la mappa? 地図上で利用できる拡大倍率を制限できます。 지도 확대에 제한을 둡니까? - 限制地图上可允许缩放的倍率? + 限制地图上可允许缩放的倍率? 限制地圖上可允許縮放的倍率? @@ -157,8 +157,8 @@ Показывать координаты курсора Mostra coordinate sul cursore カーソル先で座標を表示 - 커서에 좌표를 보이게 합니까 - 显示游标的座标 + 커서에 좌표를 보이기 + 显示光标的座标 顯示游標的座標 @@ -174,7 +174,7 @@ Mostra la griglia coordinate sul cursore mouse? カーソルで合わせた先を地図座標で表示するかどうかを設定できます。 지도에서 커서 옆에 좌표가 뜨게 합니까? - 显示滑鼠游标所在的网格座标? + 显示鼠标光标所在的网格座标? 顯示滑鼠游標所在的網格座標? @@ -190,7 +190,7 @@ Questo modulo ti permette di customizzare lo schermo della mappa. このモジュールは地図画面を変更できます。 이 모듈은 지도 화면을 임의로 설정할 수 있게 해줍니다. - 此模块允许自定地图的相关效果. + 此模块允许自定地图的相关效果。 此模塊允許自定地圖的相關效果. @@ -205,8 +205,8 @@ Система слежения Blue Force Tracking Blue Force Tracking ブルー フォース トラッキング - GPS피아식별기 - 显示蓝方踪迹 + GPS 피아식별기 + 显示蓝方追踪 顯示藍方蹤跡 @@ -221,8 +221,8 @@ Включить BFT Abilita BFT BFT を有効化 - GPS피아식별기 켜기 - 蓝方踪迹启用 + GPS 피아식별기 켜기 + 蓝方追踪启用 藍方蹤跡啟用 @@ -234,11 +234,11 @@ Activar Blue Force Tracking. Por defecto: No Active le SFA. Valeur par défaut : désactivé. Blue Force követés engedélyezése. Alapértelmezett: Nem - Включает систему служения BFT. По-умолчанию: Нет + Включает систему служения BFT. По умолчанию: Нет Abilita Blue Force Tracking. Default: No ブルー フォース トラッキングを有効化します。標準: 無効 - GPS피아식별기 켭니다. 기본설정: 아니요 - 启用显示蓝方踪迹. 预设: 否 + GPS 피아식별기 켭니다. 기본설정: 아니요 + 启用显示蓝方追踪。预设:否 啟用顯示藍方蹤跡. 預設: 否 @@ -270,7 +270,7 @@ Quanto spesso vengono aggiornati i marker (in secondi) マーカが再描画される間隔を設定できます (秒) 몇 초마다 마커를 새로 갱신합니까? - 设定每多少时间重新标示出单位位置 (秒) + 设定每多少时间重新标示出单位位置(秒) 設定每多少時間重新標示出單位位置 (秒) @@ -284,9 +284,9 @@ AI csoportok elrejtése Скрыть группы ботов Nascondere gruppi IA - AI グループを非表示 - 인공지능 그룹을 숨깁니까 - 隐藏AI小队 + AIグループを非表示 + 인공지능 그룹 숨기기 + 隐藏 AI 小队 隱藏AI小隊 @@ -300,9 +300,9 @@ Jelölők elrejtése "csak AI" csoportoknál? Скрыть маркеры групп, которые состоят полностью из ботов? Nascondi markers per gruppi di sole IA? - 'AI のみ'グループのマーカー表示有無を設定できます。 + 'AIのみ'グループのマーカー表示有無を設定できます。 인공지능만 있는 그룹의 마커를 숨깁니까? - 隐藏'AI小队'的踪迹? + 隐藏'AI 小队'的追踪? 隱藏'AI小隊'的蹤跡? @@ -317,7 +317,7 @@ Показать имена игроков Mostra i nomi dei giocatori プレイヤー名を表示 - 플레이어 이름을 표시합니까 + 플레이어 이름 표시 显示玩家名称 顯示玩家名稱 @@ -334,7 +334,7 @@ Mostra i nomi dei giocatori singoli? プレイヤーの名前の表示有無を設定できます。 각 플레이어의 이름을 표시합니까? - 显示玩家的个别名称? + 显示玩家的个别名称? 顯示玩家的個別名稱? @@ -350,7 +350,7 @@ Questo modulo permette il tracciamento di unità alleate con i marker BFT in mappa モジュールは BFT マップ マーカとともに、同勢力ユニットの追跡を許可します。 이 모듈은 아군을 지도상에서 추적할 수 있게 해줍니다. - 此模块将使你能在地图上看见友方单位的踪迹 + 此模块将使你能在地图上看见友方单位的追踪 此模塊將使你能在地圖上看見友方單位的蹤跡 @@ -380,8 +380,8 @@ NVG NVG 夜間暗視装置 - 야투경 - 夜视镜 + 야간투시경 + 夜视仪 夜視鏡 NVG @@ -507,7 +507,7 @@ Cambiar el canal de marcadores inicial al comenzar la misión Change le canal de communication par défaut au début de la mission. ミッション開始時にあらかじめ設定されているマーカ チャンネルを変更します - 미션시작시 마커채널을 변경합니다 + 미션 시작시 마커채널을 변경합니다 更改任务启动时的聊天频道 更改任務啟動時的聊天頻道 @@ -515,11 +515,11 @@ Disable BFT BFT deaktivieren BFTを無効化 - GPS피아식별기 끄기 + GPS 피아식별기 끄기 Wyłącz BFT Désactiver le SFA Disablita BFT - 关闭友军踪迹 + 关闭友军追踪 關閉友軍蹤跡 Отключить BFT Desativar BFT @@ -530,11 +530,11 @@ Always disable Blue Force Tracking for this group. Blue Force Tracking für diese Gruppe immer deaktivieren. このグループへのブルー フォース トラッキングを常に無効化します。 - 이 그룹에 한해 GPS피아식별기를 항상 끕니다. + 이 그룹에 한해 GPS 피아식별기를 항상 끕니다. Zawsze wyłączaj Blue Force Tracking dla tej grupy. 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. diff --git a/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf index eaf319bc90..17a8ffbb04 100644 --- a/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf +++ b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, MikeMatrix, PabstMirror * Adds a group id color mapping. diff --git a/addons/map_gestures/functions/fnc_drawMapGestures.sqf b/addons/map_gestures/functions/fnc_drawMapGestures.sqf index ed1c91f16b..2f0c80de3e 100644 --- a/addons/map_gestures/functions/fnc_drawMapGestures.sqf +++ b/addons/map_gestures/functions/fnc_drawMapGestures.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, MikeMatrix * Receives and draws map gestures from nearby players. diff --git a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf index f057c000bc..43853da494 100644 --- a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf +++ b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, MikeMatrix * Returns all players in a given range and in the units vehicle. diff --git a/addons/map_gestures/functions/fnc_initDisplayCurator.sqf b/addons/map_gestures/functions/fnc_initDisplayCurator.sqf index 6d32273765..1337ea4220 100644 --- a/addons/map_gestures/functions/fnc_initDisplayCurator.sqf +++ b/addons/map_gestures/functions/fnc_initDisplayCurator.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas * Binds Draw EventHandlers to Zeus map. diff --git a/addons/map_gestures/functions/fnc_initDisplayDiary.sqf b/addons/map_gestures/functions/fnc_initDisplayDiary.sqf index 18c65e005a..5d77b229b5 100644 --- a/addons/map_gestures/functions/fnc_initDisplayDiary.sqf +++ b/addons/map_gestures/functions/fnc_initDisplayDiary.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, MikeMatrix, joko // Jonas * Bind all required EventHandlers to Player map. diff --git a/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf b/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf index 20159b5e4a..dbbd31ae65 100644 --- a/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf +++ b/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas * Binds Draw EventHandlers to Spectator map. diff --git a/addons/map_gestures/functions/fnc_isValidColorArray.sqf b/addons/map_gestures/functions/fnc_isValidColorArray.sqf index 8abaf4f375..7cc9335800 100644 --- a/addons/map_gestures/functions/fnc_isValidColorArray.sqf +++ b/addons/map_gestures/functions/fnc_isValidColorArray.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: MikeMatrix * Validate if an array is in the propper color format. diff --git a/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf b/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf index fb87822a30..07be21fc90 100644 --- a/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf +++ b/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, MikeMatrix * Initializes Settings for the groups modules and transcodes settings to a useable format. diff --git a/addons/map_gestures/functions/fnc_moduleSettings.sqf b/addons/map_gestures/functions/fnc_moduleSettings.sqf index ac0bb62b36..b637997af7 100644 --- a/addons/map_gestures/functions/fnc_moduleSettings.sqf +++ b/addons/map_gestures/functions/fnc_moduleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, MikeMatrix * Initializes Settings for the module and transcodes settings to a useable format. diff --git a/addons/map_gestures/functions/script_component.hpp b/addons/map_gestures/functions/script_component.hpp deleted file mode 100644 index 65841c15f9..0000000000 --- a/addons/map_gestures/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\map_gestures\script_component.hpp" diff --git a/addons/map_gestures/initSettings.sqf b/addons/map_gestures/initSettings.sqf index 9b4b2a7fba..2d9bc6b695 100644 --- a/addons/map_gestures/initSettings.sqf +++ b/addons/map_gestures/initSettings.sqf @@ -1,7 +1,10 @@ +private _category = LLSTRING(mapGestures_category); +private _categoryColors = [_category, format ["| %1 |", LELSTRING(common,subcategory_colors)]]; + [ QGVAR(enabled), "CHECKBOX", [LSTRING(enabled_displayName), LSTRING(enabled_description)], - LSTRING(mapGestures_category), + _category, true, true ] call CBA_fnc_addSetting; @@ -9,7 +12,7 @@ [ QGVAR(maxRange), "SLIDER", [LSTRING(maxRange_displayName), LSTRING(maxRange_description)], - LSTRING(mapGestures_category), + _category, [0,50,7,1], true ] call CBA_fnc_addSetting; @@ -17,7 +20,7 @@ [ QGVAR(maxRangeCamera), "SLIDER", [LSTRING(maxRangeCamera_displayName), LSTRING(maxRangeCamera_description)], - LSTRING(mapGestures_category), + _category, [0,50,14,1], true ] call CBA_fnc_addSetting; @@ -25,21 +28,21 @@ [ QGVAR(allowSpectator), "CHECKBOX", [LSTRING(allowSpectator_displayName), LSTRING(allowSpectator_description)], - LSTRING(mapGestures_category), + _category, true ] call CBA_fnc_addSetting; [ QGVAR(allowCurator), "CHECKBOX", [LSTRING(allowCurator_displayName), LSTRING(allowCurator_description)], - LSTRING(mapGestures_category), + _category, true ] call CBA_fnc_addSetting; [ QGVAR(briefingMode), "LIST", [LSTRING(briefingMode_displayName), LSTRING(briefingMode_description)], - LSTRING(mapGestures_category), + _category, [[0, 1, 2, 3, 4], [LSTRING(briefingMode_All), LSTRING(briefingMode_Group), LSTRING(briefingMode_Side), LSTRING(briefingMode_Proximity), LSTRING(briefingMode_Disabled)], 0] ] call CBA_fnc_addSetting; @@ -47,7 +50,7 @@ QGVAR(onlyShowFriendlys), "CHECKBOX", [LSTRING(onlyShowFriendlys_displayName), LSTRING(onlyShowFriendlys_description)], - LSTRING(mapGestures_category), + _category, false, 1 ] call CBA_fnc_addSetting; @@ -55,7 +58,7 @@ [ QGVAR(interval), "SLIDER", [LSTRING(interval_displayName), LSTRING(interval_description)], - LSTRING(mapGestures_category), + _category, [0,1,0.03,2], true ] call CBA_fnc_addSetting; @@ -63,7 +66,7 @@ [ QGVAR(nameTextColor), "COLOR", [LSTRING(nameTextColor_displayName), LSTRING(nameTextColor_description)], - [LSTRING(mapGestures_category), LSTRING(mapGestures_subcategory_colors)], + _categoryColors, [0.2,0.2,0.2,0.3], false ] call CBA_fnc_addSetting; @@ -71,7 +74,7 @@ [ QGVAR(defaultLeadColor), "COLOR", [LSTRING(defaultLeadColor_displayName), LSTRING(defaultLeadColor_description)], - [LSTRING(mapGestures_category), LSTRING(mapGestures_subcategory_colors)], + _categoryColors, [1,0.88,0,0.95], false ] call CBA_fnc_addSetting; @@ -79,7 +82,7 @@ [ QGVAR(defaultColor), "COLOR", [LSTRING(defaultColor_displayName), LSTRING(defaultColor_description)], - [LSTRING(mapGestures_category), LSTRING(mapGestures_subcategory_colors)], + _categoryColors, [1,0.88,0,0.7], false ] call CBA_fnc_addSetting; diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml index 0613ac27bb..64168b6b70 100644 --- a/addons/map_gestures/stringtable.xml +++ b/addons/map_gestures/stringtable.xml @@ -13,7 +13,7 @@ Pointage sur carte マップ ジェスチャー 지도 신호 - 地图标识器 + 地图指示 地圖指示器 Harita Hareketleri @@ -45,7 +45,7 @@ Active le pointage sur carte. マップ ジェスチャーを有効化 지도 신호 활성화 - 启用地图标识器 + 启用地图指示 啟用地圖指示器 Harita hareketlerini etkinleştir. @@ -61,7 +61,7 @@ Portée du pointage sur carte マップ ジェスチャーの最大範囲 지도 신호 최대 거리 - 地图标识器最大范围 + 地图指示最大范围 地圖指示器最大範圍 Harita Hareketi Max Uzaklık @@ -77,7 +77,7 @@ Définit le rayon au-delà duquel un joueur ne verra plus l'indicateur de pointage des autres joueurs. プレイヤーによるマップ ジェスチャーの表示範囲を設定します 플레이어간에 지도 신호 표시거리를 설정합니다. - 设定地图标识器显示的最大范围距离 + 设定地图指示显示的最大范围距离 設定地圖指示器顯示的最大範圍距離 @@ -108,7 +108,7 @@ Période de mise à jour des données. データの更新間隔 데이터 갱신 간격 - 定义每次更新数据的时间. + 定义每次更新数据的时间。 定義每次更新數據的時間 Veri güncellemeleri arasındaki zaman. @@ -139,7 +139,7 @@ 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ě. @@ -147,7 +147,7 @@ Lead Default Color Cor padrão para o líder Domyślny kolor lidera - Лид. цвет по-умолчанию + Лид. цвет по умолчанию Výchozí barva velitele Colore Default Caposquadra Gruppenführer-Standardfarbe @@ -167,9 +167,9 @@ 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] 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ů] @@ -177,7 +177,7 @@ Default Color Cor padrão Kolor domyślny - Цвет по-умолчанию + Цвет по умолчанию Výchozí barva Colore Default Standardfarbe @@ -198,9 +198,9 @@ 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] 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ů] @@ -229,8 +229,8 @@ Color para los líderes de los grupos sincronizados al módulo. Couleur pour les chefs des groupes synchronisés avec ce module. モジュールで同期されたグループのリーダー用に色の値を決定します。 - 그룹이 이 모듈에 동기화 됐을때의 리더 색상입니다. - 改变与此同步小队队长的标识器颜色。 + 그룹이 이 모듈에 동기화 됐을 때의 리더 색상입니다. + 改变与此同步小队队长的指示颜色。 改變與此同步小隊隊長的指示器顏色 Barva pro velitele skupin které jsou synchronizované s tímto modulem. @@ -260,8 +260,8 @@ Color para los miembros de los grupos sincronizados al módulo. Couleur pour les membres des groupes synchronisés avec ce module. モジュールで同期されたグループのメンバ用に色の値を決定します。 - 그룹이 이 모듈에 동기화 됐을때의 멤버 색상입니다. - 改变与此同步小队队员的标识器颜色 + 그룹이 이 모듈에 동기화 됐을 때의 멤버 색상입니다. + 改变与此同步小队队员的指示颜色 改變與此同步小隊隊員的指示器顏色 Barva pro členy skupin které jsou synchronizované s tímto modulem. @@ -272,6 +272,9 @@ Afficher uniquement le pointage des alliés 友軍ジェスチャーのみ表示 Mostrar sólo gestos de aliados + Nur Gesten befreundeter Einheiten zeigen + 仅显示友军指示 + 아군 신호만 보기 Shows only Gestures from Units that are from the same side or a Friendly side. @@ -280,6 +283,9 @@ 友軍ユニットのみからジェスチャーを表示します。 Muestra únicamente gestos de las unidades que son del mismo bando o de un bando aliado Pokazuj tylko Gesty od jednostek z tej samej lub sojuszniczej strony + Nur Gesten von Einheiten der selben oder einer verbündeten Seite zeigen. + 仅显示来自同一阵营或友军的单位的指示。 + 같은 진영 혹은 아군 진영 인원들만 보이게 합니다. Max range Camera @@ -288,6 +294,9 @@ カメラ最大範囲 Máximo alcance de cámara Maksymalny zasięg kamery + Maximale Kamerareichweite + 摄像机最大范围 + 카메라와 지도 신호의 최대 거리 Max range between a Camera and players to show the map gesture indicator @@ -296,6 +305,9 @@ プレイヤーが行うマップ ジェスチャーをカメラから確認できる最大範囲を設定します。 Máxima distancia entre una cámara y los jugadores para mostrar el indicador de gestos en mapa Maksymalny zasięg pomiędzy kamerą a graczami do pokazania gestów na mapie + Maximale Reichweite, in der eine Kamera das Kartenzeichen der Spieler zeigt + 摄像机和玩家之间的最大范围显示地图指示 + 카메라와 플레이어간 지도 신호를 볼 수 있는 최대 거리를 정합니다 Allow Spectator @@ -304,6 +316,9 @@ スペクテイターに許可 Permitir espectador Zezwól na Obserwatora + Erlaube Zuschauer + 允许旁观者 + 관전자 허용 Allows Spectator to See Map Gestures @@ -312,6 +327,9 @@ スペクテイターからマップ ジェスチャーを表示できるようにします。 Permitir al espectador ver los gestos de mapa Zezwól Obserwatorowi widzieć Gesty na mapie + Erlaube, dass Zuschauer das Kartenzeichen sehen können + 允许旁观者查看地图指示 + 관전자가 지도 신호를 볼 수 있습니다 Allow Curator @@ -320,6 +338,9 @@ キュレーターに許可 Permitir Curador Zezwól na Zeusa + Erlaube Zeus + 允许宙斯 + 큐레이터 허용 Allows Curator to See Map Gestures @@ -328,6 +349,9 @@ キュレーターからマップ ジェスチャーを表示できるようにします。 Permitir al Curador ver los gestos de mapa Zezwól Zeusowi widzieć gesty na mapie + Erlaube, dass Zeus das Kartenzeichen sehen kann + 允许宙斯查看地图指示 + 큐레이터가 지도 신호를 볼 수 있습니다 Briefing Mode @@ -336,6 +360,9 @@ ブリーフィング モード Modo de briefing Tryb Odprawy + Briefing-Modus + 简报模式 + 브리핑 모드 What player can see what @@ -344,6 +371,9 @@ プレイヤーが見ることができる対象を決定します。 Qué puede ver cada jugador Co mogą widzieć gracze + Welcher Spieler kann was sehen + 什么玩家能看到什么 + 어떤 플레이어가 볼 수 있는지 정합니다 Disabled @@ -352,6 +382,9 @@ 無効化 Deshabilitado Zablokowany + Deaktiviert + 禁用 + 비활성화 Group @@ -364,6 +397,8 @@ Группа Grupo グループ + 小队 + 그룹 Side @@ -376,6 +411,8 @@ Сторона Bando 陣営 + 阵营 + 진영 Proximity @@ -383,6 +420,10 @@ Proximité 付近のみ Proximidad + Umgebung + Tylko w pobliżu + 附近 + 근처 All @@ -395,6 +436,8 @@ Все Todas 全て + 全部 + 모두 Map Gestures - Group Settings @@ -408,7 +451,7 @@ Pointage sur carte - réglages de groupe マップ ジェスチャー - グループ設定 지도 신호 - 그룹 설정 - 地图标识器 - 队伍设定 + 地图指示—队伍设定 地圖指示器 - 隊伍設定 @@ -423,21 +466,9 @@ ACE Pointage sur carte ACE マップ ジェスチャー ACE 지도 신호 - ACE 地图标识器 + ACE 地图指示 ACE 地圖指示器 ACE Harita Hareketleri - - Colors - Barvy - Couleurs - Farben - Colori - Kolory - Cores - Цвета - Colores - - diff --git a/addons/maptools/CfgVehicles.hpp b/addons/maptools/CfgVehicles.hpp index 5ab3eac165..aacde4cb93 100644 --- a/addons/maptools/CfgVehicles.hpp +++ b/addons/maptools/CfgVehicles.hpp @@ -32,14 +32,14 @@ class CfgVehicles { class ACE_MapToolsShowNormal { displayName = CSTRING(MapToolsShowNormal); condition = QUOTE(GVAR(mapTool_Shown) != 1); - statement = QUOTE(GVAR(mapTool_Shown) = 1;); + statement = QUOTE(if (GVAR(mapTool_Shown) == 0) then {GVAR(mapTool_moveToMouse) = true}; GVAR(mapTool_Shown) = 1;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; }; class ACE_MapToolsShowSmall { displayName = CSTRING(MapToolsShowSmall); condition = QUOTE(GVAR(mapTool_Shown) != 2); - statement = QUOTE(GVAR(mapTool_Shown) = 2;); + statement = QUOTE(if (GVAR(mapTool_Shown) == 0) then {GVAR(mapTool_moveToMouse) = true}; GVAR(mapTool_Shown) = 2;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; }; @@ -52,7 +52,7 @@ class CfgVehicles { }; class ACE_MapToolsAlignCompass { displayName = CSTRING(MapToolsAlignCompass); - condition = QUOTE((GVAR(mapTool_Shown) != 0) && {'ItemCompass' in assigneditems ACE_player}); + condition = QUOTE(GVAR(mapTool_Shown) != 0 && {getUnitLoadout ACE_player param [ARR_2(9, [])] param [ARR_2(3, '')] != ''}); statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; diff --git a/addons/maptools/CfgWeapons.hpp b/addons/maptools/CfgWeapons.hpp index 31d8bc491e..f8a95acc73 100644 --- a/addons/maptools/CfgWeapons.hpp +++ b/addons/maptools/CfgWeapons.hpp @@ -9,6 +9,7 @@ class CfgWeapons { model = QPATHTOF(data\ace_MapTools.p3d); picture = QPATHTOF(UI\maptool_item.paa); scope = 2; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index c7dceacd75..eede4db015 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -13,6 +13,7 @@ GVAR(mapTool_pos) = [0,0]; GVAR(mapTool_angle) = 0; GVAR(mapTool_isDragging) = false; GVAR(mapTool_isRotating) = false; +GVAR(mapTool_moveToMouse) = true; // used to display it in center of screen when opened //Install the event handers for the map tools on the main in-game map [{!isNull findDisplay 12}, diff --git a/addons/maptools/data/mapToolFixed.paa b/addons/maptools/data/mapToolFixed.paa index 854d1eb17e..964cf6da20 100644 Binary files a/addons/maptools/data/mapToolFixed.paa and b/addons/maptools/data/mapToolFixed.paa differ diff --git a/addons/maptools/data/mapToolRotatingNormal.paa b/addons/maptools/data/mapToolRotatingNormal.paa index fcfb11cfa7..7437dd50c3 100644 Binary files a/addons/maptools/data/mapToolRotatingNormal.paa and b/addons/maptools/data/mapToolRotatingNormal.paa differ diff --git a/addons/maptools/data/mapToolRotatingNormalOriginal.paa b/addons/maptools/data/mapToolRotatingNormalOriginal.paa new file mode 100644 index 0000000000..fcfb11cfa7 Binary files /dev/null and b/addons/maptools/data/mapToolRotatingNormalOriginal.paa differ diff --git a/addons/maptools/data/mapToolRotatingSmall.paa b/addons/maptools/data/mapToolRotatingSmall.paa index 4f37dea565..b9582eadd5 100644 Binary files a/addons/maptools/data/mapToolRotatingSmall.paa and b/addons/maptools/data/mapToolRotatingSmall.paa differ diff --git a/addons/maptools/data/mapToolRotatingSmallOriginal.paa b/addons/maptools/data/mapToolRotatingSmallOriginal.paa new file mode 100644 index 0000000000..4f37dea565 Binary files /dev/null and b/addons/maptools/data/mapToolRotatingSmallOriginal.paa differ diff --git a/addons/maptools/functions/fnc_calculateMapScale.sqf b/addons/maptools/functions/fnc_calculateMapScale.sqf index 035946aea5..667ee5ff5d 100644 --- a/addons/maptools/functions/fnc_calculateMapScale.sqf +++ b/addons/maptools/functions/fnc_calculateMapScale.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Returns the equivalent of 100m in screen coordinates diff --git a/addons/maptools/functions/fnc_canUseMapGPS.sqf b/addons/maptools/functions/fnc_canUseMapGPS.sqf index 5de3546d9c..1d28af74f6 100644 --- a/addons/maptools/functions/fnc_canUseMapGPS.sqf +++ b/addons/maptools/functions/fnc_canUseMapGPS.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * canUseMapGPS diff --git a/addons/maptools/functions/fnc_canUseMapTools.sqf b/addons/maptools/functions/fnc_canUseMapTools.sqf index e09a450031..ef45c9a527 100644 --- a/addons/maptools/functions/fnc_canUseMapTools.sqf +++ b/addons/maptools/functions/fnc_canUseMapTools.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * canUseMapTools @@ -17,13 +17,7 @@ visibleMap && {alive ACE_player} && -{ - scopeName "hasMap"; - { - if (_x isKindOf ["ItemMap", configFile >> "CfgWeapons"]) exitWith {true breakOut "hasMap"}; - } forEach (assignedItems ACE_player); - false -} && {"ACE_MapTools" in (ACE_player call EFUNC(common,uniqueItems))} && {!GVAR(mapTool_isDragging)} && -{!GVAR(mapTool_isRotating)} +{!GVAR(mapTool_isRotating)} && +{getUnitLoadout ACE_player param [9, []] param [0, ""] != ""} diff --git a/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf b/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf index 334ecb4d5c..722f96468e 100644 --- a/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf +++ b/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Prevents the cursor from entering the roamer when drawing lines and records the positions diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index 4e1c124b2a..beee6157eb 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Handle mouse buttons. @@ -40,18 +40,11 @@ if ((_button == 0) && {GVAR(freedrawing) || _ctrlKey}) exitWith { if ((count GVAR(freeDrawingData)) != 3) exitWith {TRACE_1("never touched roamer",GVAR(freeDrawingData));}; GVAR(freeDrawingData) params ["", "_startStraightPos", "_endStraightPos"]; - _startStraightPos set [2, 0]; - _endStraightPos set [2, 0]; - - // Convert marker to rectangle and change it's pos/size/dir - _markerName setMarkerShape "RECTANGLE"; - - private _difPos = _endStraightPos vectorDiff _startStraightPos; - private _mag = vectorMagnitude _difPos; - _markerName setMarkerPos (_startStraightPos vectorAdd (_difPos vectorMultiply 0.5)); - _markerName setMarkerSize [10, _mag / 2]; - _markerName setMarkerDir (_difPos call CBA_fnc_vectDir); + _markerName setMarkerPolyline [ + _startStraightPos#0, _startStraightPos#1, + _endStraightPos#0, _endStraightPos#1 + ]; }, []] call CBA_fnc_execNextFrame; } else { if (_ctrlKey && {_dir == 1}) then { diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index 6ba8e1938c..5af4f02e30 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Handle mouse movement over the map tool. diff --git a/addons/maptools/functions/fnc_isInsideMapTool.sqf b/addons/maptools/functions/fnc_isInsideMapTool.sqf index 97eedf85f3..f6c633d885 100644 --- a/addons/maptools/functions/fnc_isInsideMapTool.sqf +++ b/addons/maptools/functions/fnc_isInsideMapTool.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Return true if the position is inside the map marker (to allow dragging). diff --git a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf index 646b5df2e0..4cfd9be238 100644 --- a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf +++ b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, PabstMirror * update gps display, called from main map's draw diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index e9cb14d7ed..34642c5c68 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Update the map tool markers, position, size, rotation and visibility. @@ -19,6 +19,13 @@ params ["_theMap"]; if ((GVAR(mapTool_Shown) == 0) || {!("ACE_MapTools" in (ACE_player call EFUNC(common,uniqueItems)))}) exitWith {}; +// open map tools in center of screen when toggled to be shown +if (GVAR(mapTool_moveToMouse)) then { + private _mousePosition = _theMap ctrlMapScreenToWorld getMousePosition; + GVAR(mapTool_pos) = _mousePosition; + GVAR(mapTool_moveToMouse) = false; // we only need to do this once after opening the map tool +}; + private _rotatingTexture = ""; private _textureWidth = 0; if (GVAR(mapTool_Shown) == 1) then { @@ -34,7 +41,7 @@ if (GVAR(freedrawing)) then {[_theMap, _textureWidth] call FUNC(drawLinesOnRoame // Update scale of both parts getResolution params ["_resWidth", "_resHeight", "", "", "_aspectRatio"]; private _scaleX = 32 * _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); -private _scaleY = _scaleX * ((_resWidth / _resHeight) / _aspectRatio); //handle bad aspect ratios +private _scaleY = _scaleX; // Position of the fixed part private _xPos = GVAR(mapTool_pos) select 0; diff --git a/addons/maptools/functions/script_component.hpp b/addons/maptools/functions/script_component.hpp deleted file mode 100644 index adeb2788b5..0000000000 --- a/addons/maptools/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\maptools\script_component.hpp" diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 4145954df9..0d6cebe370 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -133,7 +133,7 @@ Выровнять инструменты по компасу マップ ツールを方位磁石に合わせる 독도용 도구를 나침반에 정렬 - 地图工具对准指北针 + 地图工具对准指南针 地圖工具對準指北針 Harita Aracını Pusulaya Hizala @@ -150,7 +150,7 @@ Показать GPS на карте 地図上に GPS を表示する GPS를 지도상에 꺼내기 - 在地图上显示GPS + 在地图上显示 GPS 在地圖上顯示GPS Harita da GPS Göster @@ -167,7 +167,7 @@ Скрыть GPS на карте 地図上から GPS を隠す GPS를 지도상에서 숨기기 - 在地图上隐藏GPS + 在地图上隐藏 GPS 在地圖上隱藏GPS Harita da GPS'i Gizle @@ -182,9 +182,9 @@ Направление: %1° Direzione: %1° Direção: %1 - 方位:%1° + 方位: %1° 방위: %1° - 方位: %1° + 方位:%1° 方位: %1° Yön: %1° @@ -244,7 +244,7 @@ Przeciągnij po krawędzi narzędzi nawigacyjnych by narysować prostą linię. Uwaga: aby usunąć linię - nalezy ustawić kursor nad jej środkiem. 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. diff --git a/addons/marker_flags/$PBOPREFIX$ b/addons/marker_flags/$PBOPREFIX$ new file mode 100644 index 0000000000..cf7a6f6f77 --- /dev/null +++ b/addons/marker_flags/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\marker_flags diff --git a/addons/marker_flags/CfgEventHandlers.hpp b/addons/marker_flags/CfgEventHandlers.hpp new file mode 100644 index 0000000000..b468b9e8b5 --- /dev/null +++ b/addons/marker_flags/CfgEventHandlers.hpp @@ -0,0 +1,23 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; + +class Extended_DisplayLoad_EventHandlers { + class RscDisplayMission { + ADDON = QUOTE(_this call COMPILE_SCRIPT(XEH_missionDisplayLoad)); + }; +}; diff --git a/addons/marker_flags/CfgVehicles.hpp b/addons/marker_flags/CfgVehicles.hpp new file mode 100644 index 0000000000..6a615ca533 --- /dev/null +++ b/addons/marker_flags/CfgVehicles.hpp @@ -0,0 +1,52 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class ADDON { + displayName = CSTRING(ActionPlace); + condition = QUOTE(_player call FUNC(canPlace)); + insertChildren = QUOTE(_this call FUNC(addActions)); + icon = QPATHTOF(ui\icons\white_place_icon.paa); + }; + }; + }; + }; + + class FlagMarker_01_F; + class GVAR(white): FlagMarker_01_F { + scope = 2; + scopeCurator = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(white); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.82,0.82,0.82,1,co)"}; + }; + class GVAR(black): GVAR(white) { + displayName = CSTRING(black); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.18,0.18,0.18,1,co)"}; + }; + class GVAR(red): GVAR(white) { + displayName = CSTRING(red); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.647,0.141,0.161,1,co)"}; + }; + class GVAR(green): GVAR(white) { + displayName = CSTRING(green); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.063,0.588,0.063,1,co)"}; + }; + class GVAR(blue): GVAR(white) { + displayName = CSTRING(blue); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.161,0.349,0.58,1,co)"}; + }; + class GVAR(yellow): GVAR(white) { + displayName = CSTRING(yellow); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.776,0.729,0.129,1,co)"}; + }; + class GVAR(orange): GVAR(white) { + displayName = CSTRING(orange); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.678,0.349,0.153,1,co)"}; + }; + class GVAR(purple): GVAR(white) { + displayName = CSTRING(purple); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.373,0.141,0.647,1,co)"}; + }; +}; diff --git a/addons/marker_flags/CfgWeapons.hpp b/addons/marker_flags/CfgWeapons.hpp new file mode 100644 index 0000000000..b4c2f88125 --- /dev/null +++ b/addons/marker_flags/CfgWeapons.hpp @@ -0,0 +1,63 @@ +class CfgWeapons { + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + + class GVAR(white): ACE_ItemCore { + GVAR(vehicle) = QGVAR(white); + GVAR(icon) = QPATHTOF(ui\icons\white_place_icon.paa); + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(white); + model = QPATHTOF(data\ace_markerpole.p3d); + picture = QPATHTOF(ui\white_ca.paa); + icon = "iconObject_1x10"; + mapSize = 0.2; + + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + + class GVAR(black): GVAR(white) { + GVAR(vehicle) = QGVAR(black); + GVAR(icon) = QPATHTOF(ui\icons\black_place_icon.paa); + displayName = CSTRING(black); + picture = QPATHTOF(ui\black_ca.paa); + }; + class GVAR(red): GVAR(white) { + GVAR(vehicle) = QGVAR(red); + GVAR(icon) = QPATHTOF(ui\icons\red_place_icon.paa); + displayName = CSTRING(red); + picture = QPATHTOF(ui\red_ca.paa); + }; + class GVAR(green): GVAR(white) { + GVAR(vehicle) = QGVAR(green); + GVAR(icon) = QPATHTOF(ui\icons\green_place_icon.paa); + displayName = CSTRING(green); + picture = QPATHTOF(ui\green_ca.paa); + }; + class GVAR(blue): GVAR(white) { + GVAR(vehicle) = QGVAR(blue); + GVAR(icon) = QPATHTOF(ui\icons\blue_place_icon.paa); + displayName = CSTRING(blue); + picture = QPATHTOF(ui\blue_ca.paa); + }; + class GVAR(yellow): GVAR(white) { + GVAR(vehicle) = QGVAR(yellow); + GVAR(icon) = QPATHTOF(ui\icons\yellow_place_icon.paa); + displayName = CSTRING(yellow); + picture = QPATHTOF(ui\yellow_ca.paa); + }; + class GVAR(orange): GVAR(white) { + GVAR(vehicle) = QGVAR(orange); + GVAR(icon) = QPATHTOF(ui\icons\orange_place_icon.paa); + displayName = CSTRING(orange); + picture = QPATHTOF(ui\orange_ca.paa); + }; + class GVAR(purple): GVAR(white) { + GVAR(vehicle) = QGVAR(purple); + GVAR(icon) = QPATHTOF(ui\icons\purple_place_icon.paa); + displayName = CSTRING(purple); + picture = QPATHTOF(ui\purple_ca.paa); + }; +}; diff --git a/addons/marker_flags/XEH_PREP.hpp b/addons/marker_flags/XEH_PREP.hpp new file mode 100644 index 0000000000..628433ff1c --- /dev/null +++ b/addons/marker_flags/XEH_PREP.hpp @@ -0,0 +1,6 @@ +PREP(addActions); +PREP(canPlace); +PREP(getFlags); +PREP(handleScrollWheel); +PREP(pickUpFlag); +PREP(placeFlag); diff --git a/addons/marker_flags/XEH_missionDisplayLoad.sqf b/addons/marker_flags/XEH_missionDisplayLoad.sqf new file mode 100644 index 0000000000..fc336ad799 --- /dev/null +++ b/addons/marker_flags/XEH_missionDisplayLoad.sqf @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +params ["_display"]; + +_display displayAddEventHandler ["MouseZChanged", { + params ["", "_scroll"]; + [_scroll] call FUNC(handleScrollWheel); +}]; + +_display displayAddEventHandler ["MouseButtonDown", { + params ["", "_button"]; + if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith {false}; + if (_button isNotEqualTo 1) exitWith {false}; // 1 = Left mouse button + GVAR(isPlacing) = PLACE_CANCEL; +}]; diff --git a/addons/marker_flags/XEH_postInit.sqf b/addons/marker_flags/XEH_postInit.sqf new file mode 100644 index 0000000000..19011893cc --- /dev/null +++ b/addons/marker_flags/XEH_postInit.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +GVAR(isPlacing) = PLACE_CANCEL; +["ace_interactMenuOpened", {GVAR(isPlacing) = PLACE_CANCEL;}] call CBA_fnc_addEventHandler; + +private _cfgWeapons = configFile >> "CfgWeapons"; +private _weapons = (call (uiNamespace getVariable [QGVAR(flagItems), {[]}])) apply {_cfgWeapons >> _x}; + +{ + private _name = configName _x; + private _vehicleClass = getText (_x >> QGVAR(vehicle)); + private _displayName = getText (_x >> "displayName"); + private _icon = getText (_x >> QGVAR(icon)); + GVAR(flagCache) set [_name, [_vehicleClass, _displayName, _icon]]; + + private _action = [ + QGVAR(pickup), + LLSTRING(ActionPickUp), + QPATHTOF(ui\icons\white_pickup_icon.paa), + {call FUNC(pickUpFlag)}, + {[_player, _target, []] call EFUNC(common,canInteractWith)}, + {}, + [_name], + [0, 0.072, 0.2], + 2 + ] call EFUNC(interact_menu,createAction); + [_vehicleClass, 0, [], _action] call EFUNC(interact_menu,addActionToClass); +} forEach _weapons; diff --git a/addons/marker_flags/XEH_preInit.sqf b/addons/marker_flags/XEH_preInit.sqf new file mode 100644 index 0000000000..62febdc7cb --- /dev/null +++ b/addons/marker_flags/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" + +GVAR(flagCache) = createHashMap; + +ADDON = true; diff --git a/addons/marker_flags/XEH_preStart.sqf b/addons/marker_flags/XEH_preStart.sqf new file mode 100644 index 0000000000..2a2bc52161 --- /dev/null +++ b/addons/marker_flags/XEH_preStart.sqf @@ -0,0 +1,6 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" + +private _weapons = (configProperties [configfile >> "CfgWeapons", QUOTE(isClass _x && {isText (_x >> QQGVAR(vehicle))}), true]) apply {configName _x}; +uiNamespace setVariable [QGVAR(flagItems), compileFinal str _weapons]; diff --git a/addons/marker_flags/config.cpp b/addons/marker_flags/config.cpp new file mode 100644 index 0000000000..078a0d8e7e --- /dev/null +++ b/addons/marker_flags/config.cpp @@ -0,0 +1,37 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = { + QGVAR(white), + QGVAR(black), + QGVAR(red), + QGVAR(green), + QGVAR(blue), + QGVAR(yellow), + QGVAR(orange), + QGVAR(purple) + }; + weapons[] = { + QGVAR(white), + QGVAR(black), + QGVAR(red), + QGVAR(green), + QGVAR(blue), + QGVAR(yellow), + QGVAR(orange), + QGVAR(purple) + }; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common", "ace_interaction", "ace_interact_menu"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Brett Mayson", "Timi007"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/marker_flags/data/ace_default.rvmat b/addons/marker_flags/data/ace_default.rvmat new file mode 100644 index 0000000000..782c9714b8 --- /dev/null +++ b/addons/marker_flags/data/ace_default.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.01,0.01,0.01,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=500; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="#(rgb,1,1,1)color(0.5,0.5,1,1)"; + 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="#(rgb,1,1,1)color(0.2,0.2,1,1)"; + 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/marker_flags/data/ace_markerpole.p3d b/addons/marker_flags/data/ace_markerpole.p3d new file mode 100644 index 0000000000..8722db4260 Binary files /dev/null and b/addons/marker_flags/data/ace_markerpole.p3d differ diff --git a/addons/marker_flags/functions/fnc_addActions.sqf b/addons/marker_flags/functions/fnc_addActions.sqf new file mode 100644 index 0000000000..98e62633db --- /dev/null +++ b/addons/marker_flags/functions/fnc_addActions.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" +/* + * Author: Brett Mayson, Timi007 + * Adds the child actions for placing flags. + * + * Arguments: + * 0: Player + * + * Return Value: + * Actions + * + * Example: + * [player] call ace_marker_flags_fnc_addActions + * + * Public: No + */ + +params ["_unit"]; + +private _actions = []; + +{ + (GVAR(flagCache) get _x) params ["_vehicle", "_displayName", "_icon"]; + + _actions pushBack [ + [ + _x, + _displayName, + _icon, + {[_this select 0, _this select 2] call FUNC(placeFlag)}, + {true}, + {}, + _x + ] call EFUNC(interact_menu,createAction), + [], + _unit + ]; +} forEach ([_unit] call FUNC(getFlags)); + +_actions diff --git a/addons/marker_flags/functions/fnc_canPlace.sqf b/addons/marker_flags/functions/fnc_canPlace.sqf new file mode 100644 index 0000000000..0ddeff533e --- /dev/null +++ b/addons/marker_flags/functions/fnc_canPlace.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Authors: Brett Mayson + * Checks if a flag can be placed by a unit. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Can place + * + * Example: + * player call ace_marker_flags_fnc_canPlace + * + * Public: No + */ + +params ["_unit"]; + +GVAR(placeAnywhere) || {_unit call EFUNC(common,canDig)} diff --git a/addons/marker_flags/functions/fnc_getFlags.sqf b/addons/marker_flags/functions/fnc_getFlags.sqf new file mode 100644 index 0000000000..579a63229d --- /dev/null +++ b/addons/marker_flags/functions/fnc_getFlags.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Authors: Brett Mayson + * Get the placeable flags in the unit's inventory. + * + * Arguments: + * 0: Unit + * + * Return Value: + * flags + * + * Example: + * [_unit] call ace_marker_flags_fnc_getFlags + * + * Public: No + */ + +params ["_unit"]; + +(_unit call EFUNC(common,uniqueItems)) arrayIntersect keys GVAR(flagCache) diff --git a/addons/marker_flags/functions/fnc_handleScrollWheel.sqf b/addons/marker_flags/functions/fnc_handleScrollWheel.sqf new file mode 100644 index 0000000000..e9dc7b7424 --- /dev/null +++ b/addons/marker_flags/functions/fnc_handleScrollWheel.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: Timi007 + * Handles the marker flag object height. + * + * Arguments: + * 0: Scroll amount + * + * Return Value: + * Handled + * + * Example: + * [5] call ace_marker_flags_fnc_handleScrollWheel + * + * Public: No + */ + +params ["_scrollAmount"]; + +if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith { + false +}; + +// Move object height 5cm per scroll +GVAR(objectHeight) = GVAR(objectHeight) + (_scrollAmount * 0.05); + +// Clamp height between MIN_HEIGHT and MAX_HEIGHT +GVAR(objectHeight) = MIN_HEIGHT max (GVAR(objectHeight) min MAX_HEIGHT); + +true diff --git a/addons/marker_flags/functions/fnc_pickUpFlag.sqf b/addons/marker_flags/functions/fnc_pickUpFlag.sqf new file mode 100644 index 0000000000..661f476fb6 --- /dev/null +++ b/addons/marker_flags/functions/fnc_pickUpFlag.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" +/* + * Author: Brett Mayson, Timi007 + * Places a flag in front of the unit. + * + * Arguments: + * 0: Flag + * 1: Unit + * 2: Action Args + * + * Return Value: + * Nothing + * + * Example: + * [_flag, player, ["ace_marker_flags_white"]] call ace_marker_flags_fnc_pickupFlag + * + * Public: No + */ + +params [["_flag", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", [""], [[]]]]; +_args params ["_item"]; +TRACE_3("pickupFlag",_unit,_flag,_itemName); + +if (isNull _flag) exitWith {}; + +[_unit, "PutDown"] call EFUNC(common,doGesture); + +[{ + params ["_flag", "_unit", "_item"]; + + [_unit, _item] call EFUNC(common,addToInventory); + deleteVehicle _flag; +}, [_flag, _unit, _item], 0.7] call CBA_fnc_waitAndExecute; diff --git a/addons/marker_flags/functions/fnc_placeFlag.sqf b/addons/marker_flags/functions/fnc_placeFlag.sqf new file mode 100644 index 0000000000..74dc615588 --- /dev/null +++ b/addons/marker_flags/functions/fnc_placeFlag.sqf @@ -0,0 +1,74 @@ +#include "..\script_component.hpp" +/* + * Author: Timi007 + * Starts the placing process of the marker flag for the player. + * Flags can be placed with the special marker flag items. + * + * Arguments: + * 0: Player + * 1: Flag item + * + * Return Value: + * Nothing + * + * Example: + * [player, "ace_marker_flags_white"] call ace_marker_flags_fnc_placeFlag + * + * Public: No + */ + +params [["_player", objNull, [objNull]], ["_item", QGVAR(white), [""]]]; +TRACE_2("Placing flag", _player, _item); + +(GVAR(flagCache) get _item) params ["_vehicleClass"]; + +private _flag = _vehicleClass createVehicle [0, 0, 0]; + +TRACE_1("Created flag", _flag); + +// Set flag start height +GVAR(objectHeight) = MAX_HEIGHT; + +GVAR(isPlacing) = PLACE_WAITING; + +// Add info dialog for the player which show the controls +[LLSTRING(ActionPlace), LLSTRING(ActionCancel), LLSTRING(ActionAdjustHeight)] call EFUNC(interaction,showMouseHint); + +private _mouseClickID = [_player, "DefaultAction", { + GVAR(isPlacing) isEqualTo PLACE_WAITING +}, { + GVAR(isPlacing) = PLACE_APPROVE +}] call EFUNC(common,addActionEventHandler); + +[{ + params ["_args", "_handle"]; + _args params ["_player", "_item", "_flag", "_mouseClickID"]; + + if (isNull _flag || {!([_player, _flag] call EFUNC(common,canInteractWith))}) then { + GVAR(isPlacing) = PLACE_CANCEL; + }; + + if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + call EFUNC(interaction,hideMouseHint); + [_player, "DefaultAction", _mouseClickID] call EFUNC(common,removeActionEventHandler); + + if (GVAR(isPlacing) isEqualTo PLACE_APPROVE) then { + // End position of the flag + GVAR(isPlacing) = PLACE_CANCEL; + [_player, "PutDown"] call EFUNC(common,doGesture); + _player removeItem _item; + [QGVAR(placed), [_player, _flag, _item]] call CBA_fnc_localEvent; + } else { + // Action is canceled + deleteVehicle _flag; + }; + }; + + private _pos = (eyePos _player) vectorAdd ((getCameraViewDirection _player) vectorMultiply FLAG_PLACING_DISTANCE); + // Adjust height of flag with the scroll wheel + _pos set [2, ((getPosWorld _player) select 2) + GVAR(objectHeight)]; + + _flag setPosWorld _pos; + _flag setDir (getDir _player - 90); +}, 0, [_player, _item, _flag, _mouseClickID]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/marker_flags/initSettings.sqf b/addons/marker_flags/initSettings.sqf new file mode 100644 index 0000000000..74ae5a0721 --- /dev/null +++ b/addons/marker_flags/initSettings.sqf @@ -0,0 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(DisplayName_Settings)]; + +[ + QGVAR(placeAnywhere), "CHECKBOX", + [LSTRING(PlaceAnywhere_DisplayName), LSTRING(PlaceAnywhere_Description)], + _category, + false, // default value + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/marker_flags/script_component.hpp b/addons/marker_flags/script_component.hpp new file mode 100644 index 0000000000..bef8c1d423 --- /dev/null +++ b/addons/marker_flags/script_component.hpp @@ -0,0 +1,26 @@ +#define COMPONENT marker_flags +#define COMPONENT_BEAUTIFIED Marker Flags +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MARKER_FLAGS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_MARKER_FLAGS + #define DEBUG_SETTINGS DEBUG_ENABLED_MARKER_FLAGS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define PLACE_WAITING -1 +#define PLACE_CANCEL 0 +#define PLACE_APPROVE 1 + +#define MIN_HEIGHT -0.3 +#define MAX_HEIGHT 0.4 + +#define FLAG_PLACING_DISTANCE 2 diff --git a/addons/marker_flags/stringtable.xml b/addons/marker_flags/stringtable.xml new file mode 100644 index 0000000000..13cd270147 --- /dev/null +++ b/addons/marker_flags/stringtable.xml @@ -0,0 +1,166 @@ + + + + + Marker Flags + Markierungsfahnen + Chorągiewki + 旗マーカー + 마킹용 깃발 + 标记旗 + Флажки + Banderas de señalizado + + + Place Anywhere + Überall platzieren + どこでも設置可能 + Umieść w dowolnym miejscu + 아무 곳에나 배치 + 随意放置 + Размещать где угодно + Colocar en cualquier lugar + + + Place marker flag anywhere regardless of surface. + どのような地表でも旗を設置できるようにします + Umieść chorągiewkę w dowolnym miejscu, niezależnie od powierzchni. + 지면에 상관없이 아무곳에서나 마킹용 깃발을 배치합니다. + 不管地形表面是什么都可以放标记旗 + Размещать флажки где угодно вне зависимости от поверхности. + Permitir colocar las banderas de señalizado en cualquier lugar, al margen del tipo de superficie. + Platzieren Sie die Markierungsfahne überall, unabhängig von der Oberfläche. + + + Place Marker Flag + Markierungsfahne platzieren + Postaw chorągiewkę + 마킹용 깃발 꽂기 + Поставить флажок + Colocar Bandera de señalizado + マーカーフラッグを置く + + + Adjust height + Höhe anpassen + Dostosuj wysokość + 높이 조정 + Регулировать высоту + Ajustar altura + 高さを調整する + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Mégsem + Cancelar + Отмена + 中止 + 취소 + 取消 + 取消 + Iptal + + + Pick Up + 提取點 + Récupérer + Recoger + Recupera + Podnieś + Подобрать + Vyzvednutí + Pegar + 가져가기 + 提取点 + 拾う + Al + Aufheben + + + Marker Flag (White) + Markierungsfahne (Weiß) + Chorągiewka (Biała) + 旗マーカー (白) + 마킹용 깃발(하양) + 标记旗(白) + Флажок (белый) + Bandera de señalizado (Blanca) + + + Marker Flag (Black) + Markierungsfahne (Schwarz) + Chorągiewka (Czarna) + 旗マーカー (黒) + 마킹용 깃발(검정) + 标记旗(黑) + Флажок (чёрный) + Bandera de señalizado (Negra) + + + Marker Flag (Red) + Markierungsfahne (Rot) + Chorągiewka (Czerwona) + 旗マーカー (赤) + 마킹용 깃발(빨강) + 标记旗(红) + Флажок (красный) + Bandera de señalizado (Roja) + + + Marker Flag (Green) + Markierungsfahne (Grün) + Chorągiewka (Zielona) + 旗マーカー (緑) + 마킹용 깃발(초록) + 标记旗(绿) + Флажок (зелёный) + Bandera de señalizado (Verde) + + + Marker Flag (Blue) + Markierungsfahne (Blau) + Chorągiewka (Niebieska) + 旗マーカー (青) + 마킹용 깃발(파랑) + 标记旗(蓝) + Флажок (синий) + Bandera de señalizado (Azul) + + + Marker Flag (Yellow) + Markierungsfahne (Gelb) + Chorągiewka (Żółta) + 旗マーカー (黄) + 마킹용 깃발(노랑) + 标记旗(黄) + Флажок (жёлтый) + Bandera de señalizado (Amarilla) + + + Marker Flag (Orange) + Markierungsfahne (Orange) + Chorągiewka (Pomarańczowa) + 旗マーカー (橙) + 마킹용 깃발(주황) + 标记旗(橙) + Флажок (оранжевый) + Bandera de señalizado (Naranja) + + + Marker Flag (Purple) + Markierungsfahne (Lila) + Chorągiewka (Fioletowa) + 旗マーカー (紫) + 마킹용 깃발(보라) + 标记旗(紫) + Флажок (фиолетовый) + Bandera de señalizado (Púrpura) + + + diff --git a/addons/marker_flags/ui/black_ca.paa b/addons/marker_flags/ui/black_ca.paa new file mode 100644 index 0000000000..72ac604b6b Binary files /dev/null and b/addons/marker_flags/ui/black_ca.paa differ diff --git a/addons/marker_flags/ui/blue_ca.paa b/addons/marker_flags/ui/blue_ca.paa new file mode 100644 index 0000000000..9c45de381f Binary files /dev/null and b/addons/marker_flags/ui/blue_ca.paa differ diff --git a/addons/marker_flags/ui/green_ca.paa b/addons/marker_flags/ui/green_ca.paa new file mode 100644 index 0000000000..72a2f62d6c Binary files /dev/null and b/addons/marker_flags/ui/green_ca.paa differ diff --git a/addons/marker_flags/ui/icons/black_place_icon.paa b/addons/marker_flags/ui/icons/black_place_icon.paa new file mode 100644 index 0000000000..5526fc2c92 Binary files /dev/null and b/addons/marker_flags/ui/icons/black_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/blue_place_icon.paa b/addons/marker_flags/ui/icons/blue_place_icon.paa new file mode 100644 index 0000000000..8f899cae24 Binary files /dev/null and b/addons/marker_flags/ui/icons/blue_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/green_place_icon.paa b/addons/marker_flags/ui/icons/green_place_icon.paa new file mode 100644 index 0000000000..151b597cfe Binary files /dev/null and b/addons/marker_flags/ui/icons/green_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/orange_place_icon.paa b/addons/marker_flags/ui/icons/orange_place_icon.paa new file mode 100644 index 0000000000..7477a4a07f Binary files /dev/null and b/addons/marker_flags/ui/icons/orange_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/purple_place_icon.paa b/addons/marker_flags/ui/icons/purple_place_icon.paa new file mode 100644 index 0000000000..1c5a63d8ef Binary files /dev/null and b/addons/marker_flags/ui/icons/purple_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/red_place_icon.paa b/addons/marker_flags/ui/icons/red_place_icon.paa new file mode 100644 index 0000000000..c0fcea9048 Binary files /dev/null and b/addons/marker_flags/ui/icons/red_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/white_pickup_icon.paa b/addons/marker_flags/ui/icons/white_pickup_icon.paa new file mode 100644 index 0000000000..bc5d4ac7e4 Binary files /dev/null and b/addons/marker_flags/ui/icons/white_pickup_icon.paa differ diff --git a/addons/marker_flags/ui/icons/white_place_icon.paa b/addons/marker_flags/ui/icons/white_place_icon.paa new file mode 100644 index 0000000000..c4f03200d8 Binary files /dev/null and b/addons/marker_flags/ui/icons/white_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/yellow_place_icon.paa b/addons/marker_flags/ui/icons/yellow_place_icon.paa new file mode 100644 index 0000000000..965a36185f Binary files /dev/null and b/addons/marker_flags/ui/icons/yellow_place_icon.paa differ diff --git a/addons/marker_flags/ui/orange_ca.paa b/addons/marker_flags/ui/orange_ca.paa new file mode 100644 index 0000000000..f6d8b0643a Binary files /dev/null and b/addons/marker_flags/ui/orange_ca.paa differ diff --git a/addons/marker_flags/ui/purple_ca.paa b/addons/marker_flags/ui/purple_ca.paa new file mode 100644 index 0000000000..4a8e620bd9 Binary files /dev/null and b/addons/marker_flags/ui/purple_ca.paa differ diff --git a/addons/marker_flags/ui/red_ca.paa b/addons/marker_flags/ui/red_ca.paa new file mode 100644 index 0000000000..b570688bc9 Binary files /dev/null and b/addons/marker_flags/ui/red_ca.paa differ diff --git a/addons/marker_flags/ui/white_ca.paa b/addons/marker_flags/ui/white_ca.paa new file mode 100644 index 0000000000..c69afdec28 Binary files /dev/null and b/addons/marker_flags/ui/white_ca.paa differ diff --git a/addons/marker_flags/ui/yellow_ca.paa b/addons/marker_flags/ui/yellow_ca.paa new file mode 100644 index 0000000000..c085ad2376 Binary files /dev/null and b/addons/marker_flags/ui/yellow_ca.paa differ diff --git a/addons/markers/functions/fnc_canMove.sqf b/addons/markers/functions/fnc_canMove.sqf index 2b2eaf5e9f..a915905b79 100644 --- a/addons/markers/functions/fnc_canMove.sqf +++ b/addons/markers/functions/fnc_canMove.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: chris579 * Checks whether the player can move markers. @@ -17,6 +17,8 @@ params [["_marker",""]]; +if ((markerShape _marker) == "POLYLINE") exitWith { false }; + switch (GVAR(moveRestriction)) do { case MOVE_RESTRICTION_NOBODY: {false}; case MOVE_RESTRICTION_ALL: {true}; diff --git a/addons/markers/functions/fnc_canTimestamp.sqf b/addons/markers/functions/fnc_canTimestamp.sqf index 21e80c0921..5d9234f04a 100644 --- a/addons/markers/functions/fnc_canTimestamp.sqf +++ b/addons/markers/functions/fnc_canTimestamp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Freddo * Checks whether a unit is able to timestamp. diff --git a/addons/markers/functions/fnc_getEnabledChannels.sqf b/addons/markers/functions/fnc_getEnabledChannels.sqf index bc665cf69c..291544f73e 100644 --- a/addons/markers/functions/fnc_getEnabledChannels.sqf +++ b/addons/markers/functions/fnc_getEnabledChannels.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2, Timi007 + * Author: commy2, Timi007, LinkIsGrim * Return enabled channels. * * Arguments: @@ -17,33 +17,19 @@ params [["_localize", false, [false]]]; -private _currentChannel = currentChannel; private _enabledChannels = []; +private _currentChannel = currentChannel; -if (_localize) then { - if (setCurrentChannel 0) then { - _enabledChannels pushBack localize "str_channel_global"; - }; +// Micro-optimization so we don't rebuild the array and localize in each iteration +private _engineChannels = CHANNEL_NAMES; - if (setCurrentChannel 1) then { - _enabledChannels pushBack localize "str_channel_side"; - }; - - if (setCurrentChannel 2) then { - _enabledChannels pushBack localize "str_channel_command"; - }; - - if (setCurrentChannel 3) then { - _enabledChannels pushBack localize "str_channel_group"; - }; - - if (setCurrentChannel 4) then { - _enabledChannels pushBack localize "str_channel_vehicle"; - }; -} else { - for "_i" from 0 to 4 do { - if (setCurrentChannel _i) then { - _enabledChannels pushBack _i; +for "_channelId" from 0 to 15 do { + if (_channelId == 5) then {continue}; // Direct channel, ignore + if (setCurrentChannel _channelId) then { + if (_localize) then { + _enabledChannels pushBack (_engineChannels param [_channelId, (radioChannelInfo (_channelId - 5)) select 1]); // radioChannelInfo works off custom IDs only, offset engine channels + } else { + _enabledChannels pushBack _channelId; }; }; }; diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 2aa7a0155e..a102502b24 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BIS, commy2, Timi007 * Sets up the marker placement @@ -223,8 +223,7 @@ while {_i < lbSize _channel} do { private _channelName = _channel lbText _i; - // _enabledChannels can not include custom channels names. Therefore also check if it's a custom one. Blame BI if the unit should not access the channel. - if (_channelName in _enabledChannels || {!(_channelName in CHANNEL_NAMES)}) then { + if (_channelName in _enabledChannels) then { _i = _i + 1; } else { _channel lbDelete _i; @@ -238,13 +237,14 @@ currentChannel }; - private _currentChannelName = CHANNEL_NAMES param [_selectChannel, localize "str_channel_group"]; + // engine channels (0-4) can use names directly, custom channels need an offset for radioChannelInfo + private _selectChannelName = CHANNEL_NAMES param [_selectChannel, radioChannelInfo (_selectChannel - 5) select 1]; // select current channel in list box, must be done after lbDelete for "_j" from 0 to (lbSize _channel - 1) do { - if (_channel lbText _j == _currentChannelName) then { + if (_channel lbText _j == _selectChannelName) then { _channel lbSetCurSel _j; - setCurrentChannel (CHANNEL_NAMES find _currentChannelName); + setCurrentChannel _selectChannel; }; }; @@ -343,7 +343,7 @@ // init marker scale slider _aceScaleSlider sliderSetRange [0.5, 2.0]; - if !(GVAR(editingMarker) isEqualTo "") then { + if (GVAR(editingMarker) isNotEqualTo "") then { //get the original scale GVAR(currentMarkerScale) = (markerSize GVAR(editingMarker)) param [0, 1]; }; diff --git a/addons/markers/functions/fnc_mapDisplayInitEH.sqf b/addons/markers/functions/fnc_mapDisplayInitEH.sqf index 3ab874c445..e5242b9067 100644 --- a/addons/markers/functions/fnc_mapDisplayInitEH.sqf +++ b/addons/markers/functions/fnc_mapDisplayInitEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles XEH DisplayLoad for the various map displays (RscDiary) diff --git a/addons/markers/functions/fnc_mapDrawEH.sqf b/addons/markers/functions/fnc_mapDrawEH.sqf index 02540b699f..3fc04c6c8c 100644 --- a/addons/markers/functions/fnc_mapDrawEH.sqf +++ b/addons/markers/functions/fnc_mapDrawEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Draws the current temp marker. Allows rotation and scale. diff --git a/addons/markers/functions/fnc_movePFH.sqf b/addons/markers/functions/fnc_movePFH.sqf index 962f39d328..4fd1bf5b49 100644 --- a/addons/markers/functions/fnc_movePFH.sqf +++ b/addons/markers/functions/fnc_movePFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: chris579 * When the marker is being moved. diff --git a/addons/markers/functions/fnc_onButtonClickConfirm.sqf b/addons/markers/functions/fnc_onButtonClickConfirm.sqf index 12c6f37d06..2822cd69f0 100644 --- a/addons/markers/functions/fnc_onButtonClickConfirm.sqf +++ b/addons/markers/functions/fnc_onButtonClickConfirm.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Freddo * When the confirm button is pressed. diff --git a/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf b/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf index 5980e875cd..5c452b6cad 100644 --- a/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf +++ b/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Freddo, commy2 * When the timestamp checkbox is toggled. diff --git a/addons/markers/functions/fnc_onLBSelChangedChannel.sqf b/addons/markers/functions/fnc_onLBSelChangedChannel.sqf index 954e90470c..d8c2bc71fb 100644 --- a/addons/markers/functions/fnc_onLBSelChangedChannel.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedChannel.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 + * Author: commy2, LinkIsGrim * When the channel list box is changed. * * Arguments: @@ -19,6 +19,6 @@ params ["_ctrl", "_index"]; TRACE_2("params",_ctrl,_index); -private _channelName = _ctrl lbText _index; +private _enabledChannels = false call FUNC(getEnabledChannels); -setCurrentChannel (CHANNEL_NAMES find _channelName); +setCurrentChannel (_enabledChannels select _index); diff --git a/addons/markers/functions/fnc_onLBSelChangedColor.sqf b/addons/markers/functions/fnc_onLBSelChangedColor.sqf index ceb3cfe0b5..20bae84915 100644 --- a/addons/markers/functions/fnc_onLBSelChangedColor.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedColor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * When the color list box is changed. diff --git a/addons/markers/functions/fnc_onLBSelChangedShape.sqf b/addons/markers/functions/fnc_onLBSelChangedShape.sqf index 5dfbbabd01..62e9ca6e52 100644 --- a/addons/markers/functions/fnc_onLBSelChangedShape.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedShape.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * When the shape list box is changed. diff --git a/addons/markers/functions/fnc_onMouseButtonDown.sqf b/addons/markers/functions/fnc_onMouseButtonDown.sqf index df56154ad6..ce4d637400 100644 --- a/addons/markers/functions/fnc_onMouseButtonDown.sqf +++ b/addons/markers/functions/fnc_onMouseButtonDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: chris579 * Triggered when a mouse button is pressed on the map. diff --git a/addons/markers/functions/fnc_onMouseButtonUp.sqf b/addons/markers/functions/fnc_onMouseButtonUp.sqf index ffe0ed000f..8c1c1ff7fe 100644 --- a/addons/markers/functions/fnc_onMouseButtonUp.sqf +++ b/addons/markers/functions/fnc_onMouseButtonUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: chris579 * Triggered when a mouse button is released on the map. diff --git a/addons/markers/functions/fnc_onSliderMouseButtonUpAngle.sqf b/addons/markers/functions/fnc_onSliderMouseButtonUpAngle.sqf index b6c29cfd1a..f5b485e851 100644 --- a/addons/markers/functions/fnc_onSliderMouseButtonUpAngle.sqf +++ b/addons/markers/functions/fnc_onSliderMouseButtonUpAngle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 10Dozen * Angle slider clicked handler. Resets slider pos to 0 on RMB button up. diff --git a/addons/markers/functions/fnc_onSliderMouseButtonUpScale.sqf b/addons/markers/functions/fnc_onSliderMouseButtonUpScale.sqf index 144f1c4909..e8f1cec429 100644 --- a/addons/markers/functions/fnc_onSliderMouseButtonUpScale.sqf +++ b/addons/markers/functions/fnc_onSliderMouseButtonUpScale.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 10Dozen * Scale slider clicked handler. Resets slider pos to 1 on RMB button up. diff --git a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf index 20f63e7115..76257b5572 100644 --- a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf +++ b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Angle Slider Pos changed diff --git a/addons/markers/functions/fnc_onSliderPosChangedScale.sqf b/addons/markers/functions/fnc_onSliderPosChangedScale.sqf index 8f386729d0..607bbb41cc 100755 --- a/addons/markers/functions/fnc_onSliderPosChangedScale.sqf +++ b/addons/markers/functions/fnc_onSliderPosChangedScale.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: frankplow * Applies scale from on slider position change. diff --git a/addons/markers/functions/fnc_placeMarker.sqf b/addons/markers/functions/fnc_placeMarker.sqf index 77942343ad..fdd758be5e 100644 --- a/addons/markers/functions/fnc_placeMarker.sqf +++ b/addons/markers/functions/fnc_placeMarker.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Timi007 * MarkerPlacement closed @@ -51,7 +51,7 @@ if (_closeNum isEqualTo 1) then { // 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])}; + GVAR(userPlacedMarkers) = GVAR(userPlacedMarkers) select {(getMarkerPos _x) isNotEqualTo [0,0,0]}; [QGVAR(setMarkerNetwork), [ _newestMarker, [ diff --git a/addons/markers/functions/fnc_removeTimestamp.sqf b/addons/markers/functions/fnc_removeTimestamp.sqf index 9f9d6ab438..073d9ce613 100644 --- a/addons/markers/functions/fnc_removeTimestamp.sqf +++ b/addons/markers/functions/fnc_removeTimestamp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Removes timestamp from end of a string. @@ -50,14 +50,14 @@ while {_keepCheckingDigits} do { _index = _index + 3; }; case ("]"): { - _keepCheckingDigits = false; + _keepCheckingDigits = false; }; case (" "): { _keepCheckingDigits = false; if (!(_string select [_index+3, 3] in ["am]", "pm]"])) then {_validTimestamp = false; }; }; default { - _keepCheckingDigits = false; + _keepCheckingDigits = false; _validTimestamp = false; }; }; diff --git a/addons/markers/functions/fnc_sendMarkersJIP.sqf b/addons/markers/functions/fnc_sendMarkersJIP.sqf index 2d6a3c912a..99ddb4b3c4 100644 --- a/addons/markers/functions/fnc_sendMarkersJIP.sqf +++ b/addons/markers/functions/fnc_sendMarkersJIP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Server: Recives a dummy logic, sends marker data back to the owner. diff --git a/addons/markers/functions/fnc_setMarkerJIP.sqf b/addons/markers/functions/fnc_setMarkerJIP.sqf index a4c2e9631e..8536b90a90 100644 --- a/addons/markers/functions/fnc_setMarkerJIP.sqf +++ b/addons/markers/functions/fnc_setMarkerJIP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Client: Recives a marker data from server. diff --git a/addons/markers/functions/fnc_setMarkerNetwork.sqf b/addons/markers/functions/fnc_setMarkerNetwork.sqf index a8e8453525..7d0cc0e827 100644 --- a/addons/markers/functions/fnc_setMarkerNetwork.sqf +++ b/addons/markers/functions/fnc_setMarkerNetwork.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Sets newly placed marker diff --git a/addons/markers/functions/script_component.hpp b/addons/markers/functions/script_component.hpp deleted file mode 100644 index 26adba2431..0000000000 --- a/addons/markers/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\markers\script_component.hpp" diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index fed0c0c96f..b364c3f50d 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -8,6 +8,9 @@ Масштаб: %1 スケール: %1 Skala: %1 + Skalierung: %1 + 规模:%1° + 크기: %1 Direction: %1° @@ -22,7 +25,7 @@ Direção %1 方位: %1° 방위: %1° - 方位: %1° + 方位:%1° 方位: %1° Yön: %1° @@ -32,6 +35,10 @@ Clic droit pour réinitialiser 右クリックでリセット Naciśnij PPM żeby zresetować + Rechte Maustaste zum Zurücksetzen + 点击鼠标右键重置 + 오른쪽 클릭으로 재설정 + Click botón derecho para restaurar Markers @@ -39,8 +46,8 @@ マーカー Marcatori 標誌 - 标志 - 맵마커 + 标识 + 지도 마커 Znaczniki Маркеры Marcadores @@ -55,7 +62,7 @@ 次ユーザーにマーカー移動を許可 마커 이동 허가 誰可以移動標誌 - 谁可以移动标志 + 谁可以移动标识 Permetti di spostare i marcatori a: Zezwól na poruszanie znaczników dla Разрешить перемещение маркеров для @@ -68,9 +75,9 @@ 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键来移动标志。 + 设定谁可以透过按住 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 @@ -168,19 +175,24 @@ Создателя Criador 放置者 + 放置者 Créateur Creatore Tvůrce Yaratıcı Creador + 제작자 Allow Timestamps - Включить отображение времени на метках + Вкл. отображение времени на метках Permettre l'horodatage タイムスタンプ許可 Permitir marcas de tiempo Zezwól na znaczniki czasu + Erlaube Zeitstempel + 允许时间戳 + 시간 표기 허용 Whether to allow timestamps to be automatically applied to markers @@ -189,6 +201,9 @@ マーカーへ自動的にタイムスタンプを付与するかどうかを設定できます。 Permitir que las marcas de tiempo sean automáticamente aplicadas a los marcadores Zezwól na automatyczne stosowanie znaczników czasu do markerów + Ob Zeitstempel automatisch auf Maker angewendet werden sollen. + 是否允许时间戳自动应用于标记 + 허용 시 마커를 내려놓음과 동시에 시간이 표기됩니다 Timestamp @@ -197,6 +212,9 @@ タイムスタンプ Marca de tiempo Znacznik czasu + Zeitstempel + 时间戳 + 시간 표기 Watch Required @@ -205,6 +223,9 @@ 時計の要求 Reloj requerido Wymagany zegarek + Uhr benötigt + 需要手表 + 시계 필요함 Timestamp Format @@ -213,6 +234,9 @@ タイムスタンプ形式 Formato de marca de tiempo Format znacznika czasu + Format des Zeitstempels + 时间戳格式 + 시간 표기 포맷 Changes the timestamp format @@ -221,6 +245,9 @@ タイムスタンプの形式を変更します Cambia el formato de marca de tiempo Zmienia format znacznika czasu + Zeitstempel-Format anpassen + 更改时间戳格式 + 시간 표기 포맷을 바꿉니다 "HH" - Hour @@ -229,6 +256,9 @@ "HH" - 時間 "HH" - Hora "HH" - Godziny + "HH" - Stunden + "HH"—时 + "HH" - 시 "MM" - Minute @@ -237,6 +267,9 @@ "MM" - 分 "MM" - Minuto "MM" - Minuty + "MM" - Minuten + "MM"—分 + "MM" - 분 "SS" - Seconds @@ -245,6 +278,9 @@ "SS" - 秒 "SS" - Segundos "SS" - Sekundy + "SS" - Sekunden + "SS"—秒 + "SS" - 초 "MM" - Milliseconds @@ -253,6 +289,9 @@ "MM" - ミリ秒 "MM" - Milisegundos "MM" - Milisekundy + "MS" - Milisekunden + "MS"—毫秒 + "MS" - 밀리초 Timestamp Hour Format @@ -261,6 +300,9 @@ タイムスタンプ時刻形式 Formato de hora de marca de tiempo Format Godzinnych znaczników czasu + Zeitstempel-Stundenformat + 时间戳小时格式 + 시간 표기 시간 포맷 24-Hour Clock @@ -269,6 +311,9 @@ 24 時間表記 Reloj 24-Horas Zegar 24-godzinny + 24-Stunden + 24小时制 + 24시간제 12-Hour Clock @@ -277,6 +322,9 @@ 12 時間表記 Reloj 12-Horas Zegar 12-godzinny + 12-Stunden + 12小时制 + 12시간제 Changes timestamp to use either 24-hour or 12-hour clock format @@ -285,6 +333,9 @@ タイムスタンプの時刻を 24 時間か 12 時間表記のどちらかに変更できます。 Cambia que la marca de tiempo sea en formato de reloj 24-horas o 12-horas Zmienia znacznik czasu tak, aby używał formatu 24-godzinnego lub 12-godzinnego + Ändert den Zeitstempel, um entweder das 24-Stunden- oder das 12-Stunden-Format zu verwenden + 改变时间戳以使用24小时或12小时的时钟格式 + 시간 표기를 24시간제 혹은 12시간제 에서 골라 표기합니다 diff --git a/addons/maverick/ACE_GuidanceConfig.hpp b/addons/maverick/ACE_GuidanceConfig.hpp index f6b9020157..948404b7cc 100644 --- a/addons/maverick/ACE_GuidanceConfig.hpp +++ b/addons/maverick/ACE_GuidanceConfig.hpp @@ -1,5 +1,5 @@ class EGVAR(missileguidance,AttackProfiles) { - class maverick { + class maverick { name = "LOAL-DIR"; nameLocked = "LOBL-DIR"; functionName = QEFUNC(missileguidance,attackProfile_DIR); diff --git a/addons/maverick/CfgMagazines.hpp b/addons/maverick/CfgMagazines.hpp index 524b3e0094..705d52010d 100644 --- a/addons/maverick/CfgMagazines.hpp +++ b/addons/maverick/CfgMagazines.hpp @@ -1,18 +1,18 @@ class CfgMagazines { class CA_Magazine; class VehicleMagazine: CA_Magazine {}; - + class magazine_Missile_AGM_02_x1: VehicleMagazine {}; class PylonMissile_Missile_AGM_02_x1: magazine_Missile_AGM_02_x1 {}; class PylonMissile_Missile_AGM_02_x2: magazine_Missile_AGM_02_x1 {}; - + class 6Rnd_Missile_AGM_02_F: VehicleMagazine {}; class PylonRack_1Rnd_Missile_AGM_02_F: 6Rnd_Missile_AGM_02_F {}; class PylonRack_3Rnd_Missile_AGM_02_F: PylonRack_1Rnd_Missile_AGM_02_F {}; - + class PylonRack_Missile_AGM_02_x1: magazine_Missile_AGM_02_x1 {}; class PylonRack_Missile_AGM_02_x2: magazine_Missile_AGM_02_x1 {}; - + class GVAR(L_magazine_x1): magazine_Missile_AGM_02_x1 { ammo = QGVAR(L); author = "xrufix"; @@ -54,7 +54,7 @@ class CfgMagazines { displayNameShort = CSTRING(L_MAG_short); pylonWeapon = QGVAR(L_Launcher_Plane); }; - + class GVAR(L_PylonRack_x1): PylonRack_Missile_AGM_02_x1 { ammo = QGVAR(L); author = "xrufix"; diff --git a/addons/maverick/CfgWeapons.hpp b/addons/maverick/CfgWeapons.hpp index e05c380381..1c0ae744ef 100644 --- a/addons/maverick/CfgWeapons.hpp +++ b/addons/maverick/CfgWeapons.hpp @@ -58,7 +58,7 @@ class CfgWeapons { }; weaponLockDelay = 0.1; weaponLockSystem = 0; - + EGVAR(laser,canSelect) = 1; // can ace_laser lock (allows switching laser code) EGVAR(laser,showHud) = 1; // show attack profile / lock on hud GVAR(enabled) = 1; diff --git a/addons/maverick/config.cpp b/addons/maverick/config.cpp index dbfabf7f9d..6d5837f87d 100644 --- a/addons/maverick/config.cpp +++ b/addons/maverick/config.cpp @@ -1,7 +1,7 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { + class ADDON { name = COMPONENT_NAME; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_missileguidance"}; @@ -10,7 +10,7 @@ class CfgPatches { url = ECSTRING(main,URL); VERSION_CONFIG; ammo[] = { - GVAR(L), + QGVAR(L), "ace_kh25ml" }; magazines[] = { @@ -26,12 +26,12 @@ class CfgPatches { "ace_kh25ml_pylonmissile_int_x1" }; weapons[] = { - GVAR(L_Launcher_Plane), - GVAR(L_Launcher), + QGVAR(L_Launcher_Plane), + QGVAR(L_Launcher), "ace_kh25ml_launcher" }; units[] = {}; - }; + }; }; diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml index 0a94999c7a..e50668ed7b 100644 --- a/addons/maverick/stringtable.xml +++ b/addons/maverick/stringtable.xml @@ -8,8 +8,8 @@ AGM-65 Maverick L, Guida Laser Missile Anti-Terra AGM-65 マーベリック L、レーザー誘導対地ミサイル AGM-65"小牛"飛彈L型,雷射導引對地導彈 - AGM-65"小牛"空地L型,雷射导引对地导弹 - AGM-65 Maverick L, 레이저 유도 대지 미사일 + AGM-65"小牛"L型激光制导对地导弹 + AGM-65 매버릭 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 @@ -25,7 +25,7 @@ AGM-65 マーベリック L [ACE] AGM-65"小牛"飛彈L型 [ACE] AGM-65"小牛"空地L型 [ACE] - AGM-65 Maverick L [ACE] + AGM-65 매버릭 L [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] @@ -41,7 +41,7 @@ 2x AGM-65 マーベリック L [ACE] 2x AGM-65"小牛"飛彈L型 [ACE] 2x AGM-65"小牛"空地L型 [ACE] - 2x AGM-65 Maverick L [ACE] + 2x AGM-65 매버릭 L [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] @@ -57,7 +57,7 @@ 3x AGM-65 マーベリック L [ACE] 3x AGM-65"小牛"飛彈L型 [ACE] 3x AGM-65"小牛"空地L型 [ACE] - 3x AGM-65 Maverick L [ACE] + 3x AGM-65 매버릭 L [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] @@ -73,13 +73,16 @@ MAVL MAVL MAVL + MAVL + MAVL + MAVL Kh-25ML, Laser Guided Air-to-Ground-Missile Ch-25ML, Lasergelenkte Luft-Boden-Rakete Kh-25ML, 레이저 유도 대공 미사일 Kh-25ML,雷射導引對地導彈 - Kh-25ML,镭射导引空地导弹 + Kh-25ML,激光制导空地导弹 Kh-25ML、レーザー誘導対地ミサイル Kh-25ML, a Guida Laser Missile Aria-Terra Kh-25ML, Kierowany laserowo pocisk powietrze-ziemia @@ -96,7 +99,7 @@ 1x Х-25МЛ [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] 1x Kh-25ML [ACE] @@ -114,8 +117,8 @@ AGM-65 Maverick L AGM-65 マーベリック L AGM-65"小牛"空地L型 - AGM-65"小牛"飞弹L型 - AGM-65 Maverick L + AGM-65"小牛"导弹L型 + AGM-65 매버릭 L AGM-65 Maverick L AGM-65 Maverick L AGM-65 Maverick L @@ -130,7 +133,7 @@ Х-25МЛ Kh-25ML Kh-25ML - Kh-25ML镭射空地导弹 + Kh-25ML 激光空地导弹 Kh-25ML Kh-25ML Kh-25ML diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index a1322f48e5..81984dab73 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -10,7 +10,7 @@ class ACE_Settings { }; */ class GVAR(enableVehicleCrashes) { - movedToSQF = 1; + movedToSQF = 1; }; class GVAR(spontaneousWakeUpChance) { movedToSQF = 1; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 89c3ced877..23c90b2579 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -5,9 +5,15 @@ if (!hasInterface) exitWith {}; -[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); +// Fractures affect base sway, pain makes it worse +["baseline", { + ACE_player getVariable [QEGVAR(medical_engine,aimFracture), 0] +}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); + +// Max pain = 5x sway +["multiplier", { + 1 + (GET_PAIN_PERCEIVED(ACE_player) * 4) +}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); #ifdef DEBUG_MODE_FULL call compile preprocessFileLineNumbers QPATHTOF(dev\reportSettings.sqf); diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 2ebebbbd3d..9361d05015 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -8,47 +8,4 @@ PREP_RECOMPILE_END; #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/addon.toml b/addons/medical/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 6c93d1e3e8..76e9818124 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -21,3 +28,5 @@ class CfgPatches { class ACE_Tests { medicalHitpoints = QPATHTOF(dev\test_hitpointConfigs.sqf); }; + +#endif diff --git a/addons/medical/dev/debugDisplay.sqf b/addons/medical/dev/debugDisplay.sqf index 541aaaccba..015a71be14 100644 --- a/addons/medical/dev/debugDisplay.sqf +++ b/addons/medical/dev/debugDisplay.sqf @@ -1,4 +1,4 @@ -#include "\z\ace\addons\medical\script_component.hpp" +#include "..\script_component.hpp" [{!isNull findDisplay 46}, { INFO("Creating Debug Display"); diff --git a/addons/medical/dev/reportSettings.sqf b/addons/medical/dev/reportSettings.sqf index eb489fab6a..b06c3a33ee 100644 --- a/addons/medical/dev/reportSettings.sqf +++ b/addons/medical/dev/reportSettings.sqf @@ -1,4 +1,4 @@ -#include "\z\ace\addons\medical\script_component.hpp" +#include "..\script_component.hpp" // Dumps info on all non-default medical settings [{ diff --git a/addons/medical/dev/test_hitpointConfigs.sqf b/addons/medical/dev/test_hitpointConfigs.sqf index 2067abcd66..9de5c5e686 100644 --- a/addons/medical/dev/test_hitpointConfigs.sqf +++ b/addons/medical/dev/test_hitpointConfigs.sqf @@ -2,7 +2,7 @@ // ["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" +#include "..\script_component.hpp" // UAV-AI should get filtered by scope check diff --git a/addons/medical/dev/watchVariable.sqf b/addons/medical/dev/watchVariable.sqf index 94ff6b4c29..0eb191e8dd 100644 --- a/addons/medical/dev/watchVariable.sqf +++ b/addons/medical/dev/watchVariable.sqf @@ -1,4 +1,4 @@ -#include "\z\ace\addons\medical\script_component.hpp" +#include "..\script_component.hpp" if (missionNamespace getVariable [QGVAR(dev_watchVariableRunning), false]) exitWith {}; GVAR(dev_watchVariableRunning) = true; @@ -95,24 +95,33 @@ GVAR(dev_watchVariableRunning) = true; _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]; + private _bodyPart = _x; + { + _x params ["_xClassID", "_xAmountOf", "_xBleeding", "_xDamage"]; + _return pushBack format ["%1: [%2] [x%3] [Bld: %4] [Dmg: %5]", _bodyPart, _xClassID, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _y; } 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]; + private _bodyPart = _x; + { + _x params ["_xClassID", "_xAmountOf", "_xBleeding", "_xDamage"]; + _return pushBack format ["%1: [%2] [x%3] [Bld: %4] [Dmg: %5]", _bodyPart, _xClassID, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _y; } 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]; + private _bodyPart = _x; + { + _x params ["_xClassID", "_xAmountOf", "_xBleeding", "_xDamage"]; + _return pushBack format ["%1: [%2] [x%3] [Bld: %4] [Dmg: %5]", _bodyPart, _xClassID, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _y; } forEach _wounds; // IVs: diff --git a/addons/medical/functions/fnc_addDamageToUnit.sqf b/addons/medical/functions/fnc_addDamageToUnit.sqf index f571d27726..23ac9f0990 100644 --- a/addons/medical/functions/fnc_addDamageToUnit.sqf +++ b/addons/medical/functions/fnc_addDamageToUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Manually Apply Damage to a unit (can cause lethal damage) @@ -9,7 +9,8 @@ * 2: Body part ("Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg") * 3: Projectile Type * 4: Source - * 5: Non-directional damage source array (Optional) + * 5: Unused parameter maintained for backwards compatibility (default: []) + * 6: Override Invulnerability (default: true) * * Return Value: * Successful @@ -22,8 +23,16 @@ */ // #define DEBUG_TESTRESULTS -params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]], ["_instigator", objNull, [objNull]], ["_damageSelectionArray", [], [[]]]]; -TRACE_6("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator,_damageSelectionArray); +params [ + ["_unit", objNull, [objNull]], + ["_damageToAdd", -1, [0]], + ["_bodyPart", "", [""]], + ["_typeOfDamage", "", [""]], + ["_instigator", objNull, [objNull]], + "", + ["_overrideInvuln", true, [true]] +]; +TRACE_7("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator,_damageSelectionArray,_overrideInvuln); _bodyPart = toLower _bodyPart; private _bodyPartIndex = ALL_BODY_PARTS find _bodyPart; @@ -32,13 +41,13 @@ if (_bodyPartIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad selection %1", 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}; +if (!_overrideInvuln && {!((isDamageAllowed _unit) && {_unit getVariable [QEGVAR(medical,allowDamage), true]})}) exitWith { + ERROR_1("addDamageToUnit - unit invulnerable %1", _this); false +}; + // Extension is case sensitive and expects this format (different from ALL_BODY_PARTS) _bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex; -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]; -}; - if (!isNull _instigator) then { _unit setVariable [QEGVAR(medical,lastDamageSource), _instigator]; _unit setVariable [QEGVAR(medical,lastInstigator), _instigator]; @@ -49,7 +58,7 @@ private _startDmg = +(_unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0, private _startPain = GET_PAIN(_unit); #endif -[QEGVAR(medical,woundReceived), [_unit, _bodyPart, _damageToAdd, _instigator, _typeOfDamage, _damageSelectionArray]] call CBA_fnc_localEvent; +[QEGVAR(medical,woundReceived), [_unit, [[_damageToAdd, _bodyPart, _damageToAdd]], _instigator, _typeOfDamage]] call CBA_fnc_localEvent; #ifdef DEBUG_TESTRESULTS private _endDmg = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; diff --git a/addons/medical/functions/fnc_adjustPainLevel.sqf b/addons/medical/functions/fnc_adjustPainLevel.sqf index 233638180f..f5c3d9a35d 100644 --- a/addons/medical/functions/fnc_adjustPainLevel.sqf +++ b/addons/medical/functions/fnc_adjustPainLevel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Public interface to allow external modules to safely adjust pain levels. diff --git a/addons/medical/functions/fnc_deserializeState.sqf b/addons/medical/functions/fnc_deserializeState.sqf index 938c18e8fa..b85e0b31e2 100644 --- a/addons/medical/functions/fnc_deserializeState.sqf +++ b/addons/medical/functions/fnc_deserializeState.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Deserializes the medical state of a unit and applies it. @@ -35,11 +35,34 @@ if !(_unit getVariable [QGVAR(initialized), false]) exitWith { private _state = [_json] call CBA_fnc_parseJSON; +// Migration from old array wounding storage serialized in old versions (<= 3.16.0) +{ + if ((_state getVariable [_x, createHashMap]) isEqualType []) then { + private _migratedWounds = createHashMap; + + { + _x params ["_class", "_bodyPartIndex", "_amountOf", "_bleeding", "_damage"]; + + private _partWounds = _migratedWounds getOrDefault [ALL_BODY_PARTS select _bodyPartIndex, [], true]; + _partWounds pushBack [_class, _amountOf, _bleeding, _damage]; + } forEach (_state getVariable _x); + + _state setVariable [_x, _migratedWounds]; + }; +} forEach [VAR_OPEN_WOUNDS, VAR_BANDAGED_WOUNDS, VAR_STITCHED_WOUNDS]; + // Set medical variables { _x params ["_var", "_default"]; private _value = _state getVariable _x; + // Handle wound hashmaps deserialized as CBA_namespaces + if (typeName _value == "LOCATION") then { + private _keys = allVariables _value; + private _values = _keys apply {_value getVariable _x}; + _value = _keys createHashMapFromArray _values; + }; + // Treat null as nil if (_value isEqualTo objNull) then { _value = _default; @@ -57,9 +80,9 @@ private _state = [_json] call CBA_fnc_parseJSON; [VAR_PAIN, 0], [VAR_IN_PAIN, false], [VAR_PAIN_SUPP, 0], - [VAR_OPEN_WOUNDS, []], - [VAR_BANDAGED_WOUNDS, []], - [VAR_STITCHED_WOUNDS, []], + [VAR_OPEN_WOUNDS, createHashMap], + [VAR_BANDAGED_WOUNDS, createHashMap], + [VAR_STITCHED_WOUNDS, createHashMap], [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES], // State transition should handle this // [VAR_UNCON, false], diff --git a/addons/medical/functions/fnc_serializeState.sqf b/addons/medical/functions/fnc_serializeState.sqf index f48a714f9e..67783e85d9 100644 --- a/addons/medical/functions/fnc_serializeState.sqf +++ b/addons/medical/functions/fnc_serializeState.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Serializes the medical state of a unit into a string. @@ -7,7 +7,7 @@ * 0: Unit * * Return Value: - * Serialized state as JSON string + * Serialized state as JSON string * * Example: * [player] call ace_medical_fnc_serializeState @@ -33,9 +33,9 @@ private _state = [] call CBA_fnc_createNamespace; [VAR_PAIN, 0], [VAR_IN_PAIN, false], [VAR_PAIN_SUPP, 0], - [VAR_OPEN_WOUNDS, []], - [VAR_BANDAGED_WOUNDS, []], - [VAR_STITCHED_WOUNDS, []], + [VAR_OPEN_WOUNDS, createHashMap], + [VAR_BANDAGED_WOUNDS, createHashMap], + [VAR_STITCHED_WOUNDS, createHashMap], [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES], // State transition should handle this // [VAR_UNCON, false], diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index f6f39b03c5..cf078ae64b 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Sets a unit in the unconscious state. diff --git a/addons/medical/functions/script_component.hpp b/addons/medical/functions/script_component.hpp deleted file mode 100644 index ea579c04a5..0000000000 --- a/addons/medical/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical\script_component.hpp" \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 6c61ce2ee4..5d2b66ae6c 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -13,7 +13,7 @@ ACE Orvosi Rendszer ACE Medical ACE 의료 - ACE 医疗系统 + ACE 医疗 ACE 醫療系統 ACE Medikal ACE 医療 @@ -21,7 +21,7 @@ Unconscious Wake Up Chance Wahrscheinlichkeit um aufzuwachen - 気絶から覚醒の可能性 + 気絶時の覚醒確率 Шанс очнуться при потере сознания Chance de reprendre connaissance Chance de recuperar consciência @@ -32,11 +32,12 @@ Szansa na wybudzenie nieprzytomnego Posibilidad de recuperar la conciencia Bayılmış Bir Kişinin Uyanma Şansı + 기절 회복 확률 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 秒毎に確認) Вероятность, что стабилизированный юнит очнется от потери сознания (Проверяется каждые 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) @@ -47,6 +48,7 @@ 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) Hayati değerleri stabil olan bir kişinin bilinçsizlikten uyanma olasılığı (her 15 saniyede bir kontrol edilir). + 기절하고 안정화된 상태에서 깨어날 확률을 정합니다 (매 15초 마다 갱신됨) Epinephrine Wake Up Chance Boost @@ -55,15 +57,16 @@ 腎上腺素甦醒率加成 肾上腺素苏醒概率加成 Erhöhung der Aufwachüberprüfungsrate durch Epinephrin - アドレナリン覚醒率の上昇 + アドレナリンによる覚醒確率上昇 Zvýšení pravděpodobnosti probuzení s Epinefrinem Увеличение шанса очнуться от адреналина Epinefrin Uyanma Şansı Artışı Aumento de probabilidad de despertarse por epinefrina + 에피네프린 사용 시 추가 회복 확률 - Increases how often spontaneous wake up checks happen when patient has Epinephrine in their system. - 患者がアドレナリンを投与されると自発的に覚醒する確率を上昇させます。 + When an unconscious patient has Epinephrine in their system, the time between spontaneous wake up checks is divided by this value. + 患者の体内に投与されたアドレナリンがある場合、\n覚醒計算の確率が上昇(値で除算)されます。 增加因病患的循環系統裡面的腎上腺素自我甦醒的機率。 增加因病患的循环系统里面的肾上腺素自我苏醒的机率。 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.) @@ -75,11 +78,12 @@ Erhöht wie oft Aufwachprüfungen passieren, wenn ein Patient Epinephrin im Blutkreislauf hat. Увеличивает частоту проверок на спонтанное пробуждение, когда пациент под действием адреналина. Hastanın sisteminde Epinefrin olduğunda rasgele uyanma kontrollerinin ne sıklıkla gerçekleştiğini artırır. + 에피네프린 투여 후 환자가 일어날 확률을 얼마나 추가할 지 정합니다. Limping Хромота - 跛行 + 足の引きずり(跛行) Boitement Mancando 跛腳 @@ -90,10 +94,11 @@ Cojera Humpeln Topallama + 절뚝거림 Controls whether open or bandaged wounds cause a person to limp. - 創傷開放か傷があると跛行するかどうかを決定できます。 + 開放状態の負傷や包帯で治療した負傷がある時、\n足を引きずる(跛行する)かを設定します。 控制裂開或者已包紮傷口是否會讓人跛腳。 控制裂开或者已包扎伤口是否会让人跛脚。 Permet de définir si les plaies ouvertes ou pansées font boiter une personne. @@ -105,11 +110,12 @@ Stellt ein, ob offene oder bandagierte Wunden eine Person zum Humpeln bringen. Контролирует хромоту в случае открытых или забинтованных ран. Açık veya sargılı yaraların bir kişinin topallamasına neden olup olmadığını kontrol eder. + 붕대로 묶인 상처가 플레이어를 절게 만들지 결정합니다. Limp on Open Wounds Хромота при открытых ранах - 創傷開放時に跛行 + 開放創傷で跛行 Boiter si plaies ouvertes Mancar se possuir feridas abertas 傷口裂開時跛腳 @@ -120,11 +126,12 @@ Cojera en heridas abiertas Humpeln bei offenen Wunden Açık Yaralarda Topallama + 상처 개방 시 절뚝거림 Limp on Open or Bandaged Wounds Хромота при открытых или забинтованых ранах - 手当した傷か創傷開放すると跛行 + 開放創傷または包帯創傷で跛行 Boiter si plaies ouvertes ou pansées Mancar se possuir feridas abertas ou atadas 使裂開或者包紮過的傷口讓人跛腳 @@ -135,6 +142,7 @@ Cojera en heridas abiertas o vendadas Humpeln bei offenen oder bandagierten Wunden Açık veya Sargılı Yaralarda Topallama + 상처 개방 혹은 붕대질 후에도 절뚝거림 Fractures @@ -150,12 +158,13 @@ Fracturas Brüche Kırıklar + 골절 Controls the effect of using splints to treat fractures.\nWhen disabled, injuries will not cause fractures. - 医療機能で骨折に添え木効果を使うかどうかを決定できます。\n無効化すると、骨折効果は表れません。 + 骨折の治療に添え木を使用した際の効果を設定します。\n無効にすると、骨折しません。 控制是否讓固定版能夠治療骨折。\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. @@ -165,6 +174,7 @@ Kontrolliert den Effekt wenn Schienen verwendet werden, um Knochenbrüche zu behandeln.\nWenn diese Einstellung nicht aktiviert ist, verursachen Verletzungen keine Knochenbrüche. Управляет эффектом использования шин для лечения переломов.\nПри отключении травмы не вызывают переломов. Kırıkları tedavi etmek için atel kullanmanın etkisini kontrol eder. \ Devre dışı bırakıldığında, yaralanmalar kırılmaya neden olmaz. + 부목이 골절을 어떻게 치료할 지 결정합니다\n비활성화 시 골절이 일어나지 않습니다. Splints Fully Heal Fractures @@ -180,6 +190,7 @@ Férulas sanan completamente las fracturas Schienen heilen Knochenbrüche vollständig Ateller Kırıkları Tamamen İyileştirir + 부목이 골절을 완전히 치료 Splints Heal, but Cannot Sprint @@ -188,13 +199,14 @@ 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 Ateller İyileştirir, ancak Koşamaz + 부목이 치료는 하지만 달릴 수는 없음 Splints Heal, but Cannot Jog @@ -204,6 +216,9 @@ Las férulas sanan, pero no pueden trotar Шины вылечивают, но не дают бежать трусцой Szyny leczą, ale uniemożliwiają trucht + Schiene heilt, aber verhindert Sprinten + 부목이 치료는 하지만 빨리 걷지 못함 + 固定板能治愈骨折,但无法慢跑 Fracture Chance @@ -215,17 +230,21 @@ Szansa na złamanie Kırılma Şansı Probabilidad de fractura + Wahrscheinlichkeit einer Fraktur + 골절 확률 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. Yaraya neden olan bir kırığın kırılma olasılığı. La probabilidad de que una herida que pueda provocar una fractura, provoque una fractura. + Die Wahrscheinlichkeit, dass eine Wunde, die eine Fraktur verursachen würde, tatsächlich zu einer Fraktur führt. + 상처를 입을 때 골절에 얼마나 관여할지를 결정합니다. Enabled for @@ -255,9 +274,9 @@ 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 il sistema medico avanzato - 選択されたユニットが、アドバンスド医療が使えるようになります + 選択されたユニットが、高度な医療が使えるようになります 어느 인원에게 고급 의료 시스템을 적용시킬지 선택하십시요. - 选择进阶医疗系统影响的对象 + 选择进阶医疗系统影响的物体 選擇進階醫療系統影響的對象 Gelişmiş tıbbi sistemin hangi üniteler için etkinleştirileceğini seçin @@ -289,9 +308,9 @@ Joueurs et IA Játékosok és AI Giocatori ed IA - プレイヤーと AI + プレイヤーとAI 플레이어 및 인공지능 - 玩家与AI + 玩家与 AI 玩家與AI Oyuncular ve AI @@ -323,9 +342,9 @@ 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? - ユニットは車両の衝突による損傷を受けるようにしますか? + ユニットが車両の衝突による負傷を受けるようにしますか? 차량 사고시 인원들이 부상을 입습니까? - 设定人员是否会因为载具冲撞别的物件而产生伤害? + 设定人员是否会因为载具冲撞别的物体而产生伤害? 設定人員是否會因為載具衝撞別的物件而產生傷害? Birimler bir araç kazasından hasar alır mı? @@ -390,7 +409,7 @@ %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 は治療出来ない距離まで離れた %1 부터의 거리가 너무 멀어 치료할 수 없습니다 设定当距离超过%1将不能使用治疗动作 設定當距離超過%1將不能使用治療動作 diff --git a/addons/medical_ai/XEH_PREP.hpp b/addons/medical_ai/XEH_PREP.hpp index 9300f0cbb3..de4ac3c38a 100644 --- a/addons/medical_ai/XEH_PREP.hpp +++ b/addons/medical_ai/XEH_PREP.hpp @@ -4,6 +4,7 @@ PREP(healSelf); PREP(healUnit); PREP(isInjured); PREP(isSafe); +PREP(itemCheck); PREP(playTreatmentAnim); PREP(requestMedic); PREP(wasRequested); diff --git a/addons/medical_ai/XEH_postInit.sqf b/addons/medical_ai/XEH_postInit.sqf index 06a6f95e5e..778dafb72b 100644 --- a/addons/medical_ai/XEH_postInit.sqf +++ b/addons/medical_ai/XEH_postInit.sqf @@ -14,6 +14,11 @@ _unit setVariable [QGVAR(lastHit), CBA_missionTime]; }] call CBA_fnc_addClassEventHandler; - #include "stateMachine.sqf" -}] call CBA_fnc_addEventHandler; + ["CAManBase", "Suppressed", { + params ["_unit"]; + _unit setVariable [QGVAR(lastSuppressed), CBA_missionTime]; + }] call CBA_fnc_addClassEventHandler; + #include "stateMachine.sqf" + +}] call CBA_fnc_addEventHandler; diff --git a/addons/medical_ai/XEH_preInit.sqf b/addons/medical_ai/XEH_preInit.sqf index 8dcb0111d7..774ef681f3 100644 --- a/addons/medical_ai/XEH_preInit.sqf +++ b/addons/medical_ai/XEH_preInit.sqf @@ -11,5 +11,8 @@ PREP_RECOMPILE_END; // default time values for AI being ready to heal, used in fnc_isSafe if (isNil QGVAR(timeSafe_shoot)) then { GVAR(timeSafe_shoot) = 30; }; if (isNil QGVAR(timeSafe_hit)) then { GVAR(timeSafe_hit) = 30; }; +if (isNil QGVAR(timeSafe_suppressed)) then { GVAR(timeSafe_suppressed) = 30; }; + +GVAR(itemHash) = uinamespace getVariable QGVAR(itemHash); ADDON = true; diff --git a/addons/medical_ai/XEH_preStart.sqf b/addons/medical_ai/XEH_preStart.sqf index 022888575e..52e3374924 100644 --- a/addons/medical_ai/XEH_preStart.sqf +++ b/addons/medical_ai/XEH_preStart.sqf @@ -1,3 +1,27 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + + +private _itemHash = createHashMap; +// key is Treatment Type (prefix @ represents a group of treatments) +// value is hash of item/treatment pairs +{ + _x params ["_itemType", "_treatments"]; + private _typeHash = createHashMap; + { + private _items = getArray (configFile >> "ace_medical_treatment_actions" >> _x >> "items"); + if (_items isEqualTo []) then { ERROR_1("bad action %1",_x); }; + private _itemClassname = configName (configFile >> "CfgWeapons" >> _items # 0); + private _treatment = if ((count _treatments) > 1) then { _x } else { "" }; + _typeHash set [_itemClassname, _treatment]; + } forEach _treatments; + _itemHash set [_itemType, _typeHash]; +} forEach [ + ["@bandage", ["FieldDressing", "PackingBandage", "ElasticBandage", "QuikClot"]], + ["@iv", ["SalineIV", "SalineIV_500", "SalineIV_250", "BloodIV", "BloodIV_500", "BloodIV_250", "PlasmaIV", "PlasmaIV_500", "PlasmaIV_250"]], + ["splint", ["splint"]], + ["morphine", ["morphine"]], + ["epinephrine", ["epinephrine"]] +]; +uinamespace setVariable [QGVAR(itemHash), compileFinal _itemHash]; diff --git a/addons/medical_ai/addon.toml b/addons/medical_ai/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_ai/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_ai/config.cpp b/addons/medical_ai/config.cpp index c42fc98f95..b9fb4386ad 100644 --- a/addons/medical_ai/config.cpp +++ b/addons/medical_ai/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_ai/functions/fnc_canRequestMedic.sqf b/addons/medical_ai/functions/fnc_canRequestMedic.sqf index 135c345750..685bd57f54 100644 --- a/addons/medical_ai/functions/fnc_canRequestMedic.sqf +++ b/addons/medical_ai/functions/fnc_canRequestMedic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if there is a medic available in the unit's group. diff --git a/addons/medical_ai/functions/fnc_healSelf.sqf b/addons/medical_ai/functions/fnc_healSelf.sqf index 524625f3c3..5747637995 100644 --- a/addons/medical_ai/functions/fnc_healSelf.sqf +++ b/addons/medical_ai/functions/fnc_healSelf.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Makes the unit heal itself. diff --git a/addons/medical_ai/functions/fnc_healUnit.sqf b/addons/medical_ai/functions/fnc_healUnit.sqf index 158de90f36..ad867d2570 100644 --- a/addons/medical_ai/functions/fnc_healUnit.sqf +++ b/addons/medical_ai/functions/fnc_healUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Makes a medic heal the next unit that needs treatment. diff --git a/addons/medical_ai/functions/fnc_healingLogic.sqf b/addons/medical_ai/functions/fnc_healingLogic.sqf index 136b6927da..c9c5fdd483 100644 --- a/addons/medical_ai/functions/fnc_healingLogic.sqf +++ b/addons/medical_ai/functions/fnc_healingLogic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, PabstMirror * Applies healing to target @@ -17,13 +17,19 @@ */ params ["_healer", "_target"]; -(_healer getVariable [QGVAR(currentTreatment), [-1]]) params ["_finishTime", "_treatmentTarget", "_treatmentEvent", "_treatmentArgs"]; +(_healer getVariable [QGVAR(currentTreatment), [-1]]) params ["_finishTime", "_treatmentTarget", "_treatmentEvent", "_treatmentArgs", "_treatmentItem"]; // 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); + TRACE_5("treatment finished",_finishTime,_treatmentTarget,_treatmentEvent,_treatmentArgs,_treatmentItem); _healer setVariable [QGVAR(currentTreatment), nil]; + if ((GVAR(requireItems)) && {_treatmentItem != ""}) then { + ([_healer, _treatmentItem] call FUNC(itemCheck)) params ["_itemOk", "_itemClassname", "_treatmentClass"]; + if (!_itemOk) exitWith { _treatmentEvent = "#fail"; }; // no item after delay + _healer removeItem _itemClassname; + if (_treatmentClass != "") then { _treatmentArgs set [2, _treatmentClass]; }; + }; if ((_treatmentTarget == _target) && {(_treatmentEvent select [0, 1]) != "#"}) then { [_treatmentEvent, _treatmentArgs, _target] call CBA_fnc_targetEvent; #ifdef DEBUG_MODE_FULL @@ -41,25 +47,31 @@ private _fractures = GET_FRACTURES(_target); private _treatmentEvent = "#none"; private _treatmentArgs = []; private _treatmentTime = 6; +private _treatmentItem = ""; switch (true) do { - case (GET_WOUND_BLEEDING(_target) > 0): { + case ((GET_WOUND_BLEEDING(_target) > 0) + && {([_healer, "@bandage"] call FUNC(itemCheck)) # 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; + private _foundBleeding = _y findIf { + _x params ["", "_amount", "_percentage"]; + (_amount * _percentage) > 0 + }; + if (_foundBleeding != -1) exitWith { _selection = _x; }; + } forEach GET_OPEN_WOUNDS(_target); _treatmentEvent = QEGVAR(medical_treatment,bandageLocal); _treatmentTime = 5; _treatmentArgs = [_target, _selection, "FieldDressing"]; + _treatmentItem = "@bandage"; }; - case (IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChance) > 0}): { + case (IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChanceMin) > 0}): { _treatmentEvent = QEGVAR(medical_treatment,cprLocal); _treatmentArgs = [_healer, _target]; _treatmentTime = 15; }; - case (_isMedic && {GET_BLOOD_VOLUME(_target) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE}): { + case (_isMedic && {GET_BLOOD_VOLUME(_target) < MINIMUM_BLOOD_FOR_STABLE_VITALS} + && {([_healer, "@iv"] call FUNC(itemCheck)) # 0}): { // Check if patient's blood volume + remaining IV volume is enough to allow the patient to wake up private _totalIvVolume = 0; //in ml { @@ -67,27 +79,33 @@ switch (true) do { _totalIvVolume = _totalIvVolume + _volumeRemaining; } forEach (_target getVariable [QEGVAR(medical,ivBags), []]); - if (GET_BLOOD_VOLUME(_target) + (_totalIvVolume / 1000) > BLOOD_VOLUME_CLASS_2_HEMORRHAGE) exitWith { + if (GET_BLOOD_VOLUME(_target) + (_totalIvVolume / 1000) > MINIMUM_BLOOD_FOR_STABLE_VITALS) exitWith { _treatmentEvent = "#waitForBlood"; }; _treatmentEvent = QEGVAR(medical_treatment,ivBagLocal); _treatmentTime = 5; _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "SalineIV"]; + _treatmentItem = "@iv"; }; case ((count (_target getVariable [VAR_MEDICATIONS, []])) >= 6): { _treatmentEvent = "#tooManyMeds"; }; - case ((_fractures select 4) == 1): { + case (((_fractures select 4) == 1) + && {([_healer, "splint"] call FUNC(itemCheck)) # 0}): { _treatmentEvent = QEGVAR(medical_treatment,splintLocal); _treatmentTime = 6; _treatmentArgs = [_healer, _target, "leftleg"]; + _treatmentItem = "splint"; }; - case ((_fractures select 5) == 1): { + case (((_fractures select 5) == 1) + && {([_healer, "splint"] call FUNC(itemCheck)) # 0}): { _treatmentEvent = QEGVAR(medical_treatment,splintLocal); _treatmentTime = 6; _treatmentArgs = [_healer, _target, "rightleg"]; + _treatmentItem = "splint"; }; - case (IS_UNCONSCIOUS(_target) || {_heartRate <= 50}): { + case ((IS_UNCONSCIOUS(_target) || {_heartRate <= 50}) + && {([_healer, "epinephrine"] call FUNC(itemCheck)) # 0}): { if (CBA_missionTime < (_target getVariable [QGVAR(nextEpinephrine), -1])) exitWith { _treatmentEvent = "#waitForEpinephrineToTakeEffect"; }; @@ -98,8 +116,10 @@ switch (true) do { _treatmentEvent = QEGVAR(medical_treatment,medicationLocal); _treatmentTime = 2.5; _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "Epinephrine"]; + _treatmentItem = "epinephrine"; }; - case ((GET_PAIN_PERCEIVED(_target) > 0.25) || {_heartRate >= 180}): { + case (((GET_PAIN_PERCEIVED(_target) > 0.25) || {_heartRate >= 180}) + && {([_healer, "morphine"] call FUNC(itemCheck)) # 0}): { if (CBA_missionTime < (_target getVariable [QGVAR(nextMorphine), -1])) exitWith { _treatmentEvent = "#waitForMorphineToTakeEffect"; }; @@ -110,10 +130,11 @@ switch (true) do { _treatmentEvent = QEGVAR(medical_treatment,medicationLocal); _treatmentTime = 2.5; _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "Morphine"]; + _treatmentItem = "morphine"; }; }; -_healer setVariable [QGVAR(currentTreatment), [CBA_missionTime + _treatmentTime, _target, _treatmentEvent, _treatmentArgs]]; +_healer setVariable [QGVAR(currentTreatment), [CBA_missionTime + _treatmentTime, _target, _treatmentEvent, _treatmentArgs, _treatmentItem]]; // Play animation if ((_treatmentEvent select [0,1]) != "#") then { diff --git a/addons/medical_ai/functions/fnc_isInjured.sqf b/addons/medical_ai/functions/fnc_isInjured.sqf index d022770f6d..a163a4c808 100644 --- a/addons/medical_ai/functions/fnc_isInjured.sqf +++ b/addons/medical_ai/functions/fnc_isInjured.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if a unit needs treatment. diff --git a/addons/medical_ai/functions/fnc_isSafe.sqf b/addons/medical_ai/functions/fnc_isSafe.sqf index 93ac425602..04da058ce0 100644 --- a/addons/medical_ai/functions/fnc_isSafe.sqf +++ b/addons/medical_ai/functions/fnc_isSafe.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if a unit is currently considered safe enough to treat itself. @@ -15,7 +15,7 @@ * Public: No */ -(getSuppression _this == 0) -&& {CBA_missionTime - (_this getVariable [QGVAR(lastFired), -999999]) > GVAR(timeSafe_shoot)} + (CBA_missionTime - (_this getVariable [QGVAR(lastFired), -999999]) > GVAR(timeSafe_shoot)) && {CBA_missionTime - (_this getVariable [QGVAR(lastHit), -999999]) > GVAR(timeSafe_hit)} +&& {CBA_missionTime - (_this getVariable [QGVAR(lastSuppressed), -999999]) > GVAR(timeSafe_suppressed)} && {!(_this getVariable [QEGVAR(captives,isHandcuffed), false])} diff --git a/addons/medical_ai/functions/fnc_itemCheck.sqf b/addons/medical_ai/functions/fnc_itemCheck.sqf new file mode 100644 index 0000000000..e93af9953c --- /dev/null +++ b/addons/medical_ai/functions/fnc_itemCheck.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Checks if AI healer has items + * + * Arguments: + * 0: Healer + * 1: Treatment Type + * + * Return Value: + * 0: Has Item + * 1: Item Classname (Optional) + * 2: Treatment (Optional) + * + * Example: + * [cursorObject, "@bandage"] call ACE_medical_ai_fnc_itemCheck + * + * Public: No + */ + +if (!GVAR(requireItems)) exitWith { [true] }; + +params ["_healer", "_treatementType"]; + +private _return = [false]; +private _items = _healer call EFUNC(common,uniqueItems); +private _treatment = GVAR(itemHash) get _treatementType; +{ + if (_x in _items) exitWith { + _return = [true, _x, _y]; + }; +} forEach _treatment; + +_return diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf index 5b594edae2..f412a718d8 100644 --- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf +++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Plays the corresponding treatment animation. diff --git a/addons/medical_ai/functions/fnc_requestMedic.sqf b/addons/medical_ai/functions/fnc_requestMedic.sqf index 450911c801..9e59181204 100644 --- a/addons/medical_ai/functions/fnc_requestMedic.sqf +++ b/addons/medical_ai/functions/fnc_requestMedic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Sends a request to the units assigned medic to heal it. diff --git a/addons/medical_ai/functions/fnc_wasRequested.sqf b/addons/medical_ai/functions/fnc_wasRequested.sqf index 38efdd8121..3b6c1cf059 100644 --- a/addons/medical_ai/functions/fnc_wasRequested.sqf +++ b/addons/medical_ai/functions/fnc_wasRequested.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the unit was requested to treat another unit. diff --git a/addons/medical_ai/functions/script_component.hpp b/addons/medical_ai/functions/script_component.hpp deleted file mode 100644 index e0adc75020..0000000000 --- a/addons/medical_ai/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_ai\script_component.hpp" diff --git a/addons/medical_ai/initSettings.sqf b/addons/medical_ai/initSettings.sqf index 7d583382d7..4a5bc5d691 100644 --- a/addons/medical_ai/initSettings.sqf +++ b/addons/medical_ai/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_medical_ai]: - private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"]; [ @@ -15,3 +13,13 @@ private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"]; {[QGVAR(enabledFor), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart ] call CBA_fnc_addSetting; + +[ + QGVAR(requireItems), "CHECKBOX", + [LSTRING(requireItems_title), LSTRING(requireItems_desc)], + _categoryArray, + false, + true, // isGlobal + {}, + true // Needs mission restart +] call CBA_fnc_addSetting; diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index e8b73e56b3..bfefa3bd18 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -4,29 +4,33 @@ Medic AI Sanitäts KI - AI 衛生兵 + AI衛生兵 ИИ Медик Médecine IA IA Médico + AI 医疗兵 AI醫療兵 Medico AI Zdravotnická AI Medyk AI Médico para IA Medikal AI + 인공지능 의무병 AI will respond to injury and unconsciousness KI reagiert auf Verletzungen und Bewusstlosigkeit - AI が負傷者と気絶している人に対して行動するようになります。 + 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 对于受伤及无意识单位会有所反应 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 @@ -37,12 +41,22 @@ Tylko serwer i 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 + + Require Items + Wymagane Przedmioty + Erfordere Gegenstände + + + AI will only perform medical treatment if they have the necessary items in their inventory.\nRequires custom AI loadouts! + AI będzie wykonywać zabiegi medyczne tylko wtedy, gdy ma w ekwipunku niezbędne przedmioty. \nWymaga niestandardowego wyposażenia AI! + Die KI führt nur dann medizinische Behandlungen durch, wenn sie die erforderlichen Gegenstände in ihrem Inventar hat.\nErfordert benutzerdefinierte KI-Ausrüstungen! + diff --git a/addons/medical_blood/XEH_postInit.sqf b/addons/medical_blood/XEH_postInit.sqf index 02201f5506..9ef55adf0e 100644 --- a/addons/medical_blood/XEH_postInit.sqf +++ b/addons/medical_blood/XEH_postInit.sqf @@ -9,10 +9,10 @@ if (isServer) then { GVAR(bloodDrops) = []; [QGVAR(bloodDropCreated), { - params ["_bloodDrop"]; + params ["_bloodDrop", "_source"]; - // Add to created queue with format: [expire time, blood object] - private _index = GVAR(bloodDrops) pushBack [CBA_missionTime + GVAR(bloodLifetime), _bloodDrop]; + // Add to created queue with format: [expire time, blood object, source unit] + private _index = GVAR(bloodDrops) pushBack [CBA_missionTime + GVAR(bloodLifetime), _bloodDrop, _source]; if (count GVAR(bloodDrops) >= GVAR(maxBloodObjects)) then { (GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; diff --git a/addons/medical_blood/XEH_preInit.sqf b/addons/medical_blood/XEH_preInit.sqf index ae4de9d026..3d10086703 100644 --- a/addons/medical_blood/XEH_preInit.sqf +++ b/addons/medical_blood/XEH_preInit.sqf @@ -8,6 +8,9 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +// Damage types which do not cause blood spurts +GVAR(noBloodDamageTypes) = createHashMapFromArray (call (uiNamespace getVariable QGVAR(noBloodDamageTypes))); + // blood object model namespace GVAR(models) = [] call CBA_fnc_createNamespace; diff --git a/addons/medical_blood/XEH_preStart.sqf b/addons/medical_blood/XEH_preStart.sqf index 022888575e..d051879f3c 100644 --- a/addons/medical_blood/XEH_preStart.sqf +++ b/addons/medical_blood/XEH_preStart.sqf @@ -1,3 +1,10 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +// Damage types which do not cause blood spurts +private _noBloodDamageTypes = "getNumber (_x >> 'noBlood') == 1" configClasses (configFile >> "ACE_Medical_Injuries" >> "damageTypes"); +uiNamespace setVariable [ + QGVAR(noBloodDamageTypes), + compileFinal str (_noBloodDamageTypes apply {[configName _x, nil]}) +]; diff --git a/addons/medical_blood/addon.toml b/addons/medical_blood/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_blood/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_blood/config.cpp b/addons/medical_blood/config.cpp index 3e5d5227da..c10bd80ee0 100644 --- a/addons/medical_blood/config.cpp +++ b/addons/medical_blood/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "ACE_Settings.hpp" + +#endif diff --git a/addons/medical_blood/functions/fnc_cleanupLoop.sqf b/addons/medical_blood/functions/fnc_cleanupLoop.sqf index e8461b2e31..92d0a5f3bb 100644 --- a/addons/medical_blood/functions/fnc_cleanupLoop.sqf +++ b/addons/medical_blood/functions/fnc_cleanupLoop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles cleaning up blood objects that have reached the end of their lifetime. diff --git a/addons/medical_blood/functions/fnc_createBlood.sqf b/addons/medical_blood/functions/fnc_createBlood.sqf index e54247d02e..e6740ef459 100644 --- a/addons/medical_blood/functions/fnc_createBlood.sqf +++ b/addons/medical_blood/functions/fnc_createBlood.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Creates a blood object and handles its cleanup. @@ -7,18 +7,19 @@ * Arguments: * 0: Blood Drop Type * 1: Position + * 2: Source * * Return Value: * Blood Drop * * Example: - * ["blooddrop_2", getPos player] call ace_medical_blood_fnc_createBlood + * ["blooddrop_2", getPos player, player] call ace_medical_blood_fnc_createBlood * * Public: No */ -params ["_type", "_position"]; -TRACE_2("Creating blood",_type,_position); +params ["_type", "_position", "_source"]; +TRACE_3("Creating blood",_type,_position,_source); private _model = GVAR(models) getVariable _type; @@ -26,6 +27,6 @@ private _bloodDrop = createSimpleObject [_model, [0, 0, 0]]; _bloodDrop setDir random 360; _bloodDrop setPos _position; -[QGVAR(bloodDropCreated), _bloodDrop] call CBA_fnc_serverEvent; +[QGVAR(bloodDropCreated), [_bloodDrop, _source]] call CBA_fnc_serverEvent; _bloodDrop diff --git a/addons/medical_blood/functions/fnc_handleWoundReceived.sqf b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf index 7447cac52f..8dfc9c650b 100644 --- a/addons/medical_blood/functions/fnc_handleWoundReceived.sqf +++ b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#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 + * 1: Damage done to each body part + * 2: Shooter + * 3: Ammo classname or damage type * * Return Value: * None @@ -18,7 +18,11 @@ * Public: No */ -params ["_unit", "", "_damage", "_shooter"]; +params ["_unit", "_allDamages", "_shooter", "_damageType"]; +(_allDamages select 0) params ["_damage"]; + +// Don't bleed if damage type does not cause bleeding +if (_damageType in GVAR(noBloodDamageTypes)) exitWith {}; // 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 {}; diff --git a/addons/medical_blood/functions/fnc_init.sqf b/addons/medical_blood/functions/fnc_init.sqf index 336d964de7..86c0c668c1 100644 --- a/addons/medical_blood/functions/fnc_init.sqf +++ b/addons/medical_blood/functions/fnc_init.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Initializes the medical blood system based on the given mode. diff --git a/addons/medical_blood/functions/fnc_isBleeding.sqf b/addons/medical_blood/functions/fnc_isBleeding.sqf index 14aecbb55b..2d57dcf73b 100644 --- a/addons/medical_blood/functions/fnc_isBleeding.sqf +++ b/addons/medical_blood/functions/fnc_isBleeding.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks if the given unit is bleeding. Handles both ACE Medical and Vanilla. diff --git a/addons/medical_blood/functions/fnc_onBleeding.sqf b/addons/medical_blood/functions/fnc_onBleeding.sqf index 8b6bcbb8f6..63ceb3bd29 100644 --- a/addons/medical_blood/functions/fnc_onBleeding.sqf +++ b/addons/medical_blood/functions/fnc_onBleeding.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handles periodically creating blood for a bleeding unit. @@ -35,5 +35,5 @@ if (CBA_missionTime > (_unit getVariable [QGVAR(nextTime), -10])) then { _position set [2, 0]; private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss min 3); - [_bloodDrop, _position] call FUNC(createBlood); + [_bloodDrop, _position, _unit] call FUNC(createBlood); }; diff --git a/addons/medical_blood/functions/fnc_spurt.sqf b/addons/medical_blood/functions/fnc_spurt.sqf index fd5c7a9fc0..ab2be414b5 100644 --- a/addons/medical_blood/functions/fnc_spurt.sqf +++ b/addons/medical_blood/functions/fnc_spurt.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Sickboy * Spurts blood on the ground based on the direction and damage. @@ -27,7 +27,7 @@ private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage; private _offset = OFFSET + _distanceBetweenDrops; private _position = _unit getPos [_offset, _direction]; -["blooddrop_2", _position, _direction] call FUNC(createBlood); +["blooddrop_2", _position, _unit] call FUNC(createBlood); private _dropAmount = ceil (MAXIMUM_DROPS * _damage); TRACE_2("Spurting blood",_dropAmount,_damage); @@ -35,6 +35,6 @@ TRACE_2("Spurting blood",_dropAmount,_damage); if (_dropAmount > 1) then { for "_i" from 2 to _dropAmount do { _position = _position getPos [_distanceBetweenDrops, _direction]; - ["blooddrop_1", _position, _direction] call FUNC(createBlood); + ["blooddrop_1", _position, _unit] call FUNC(createBlood); }; }; diff --git a/addons/medical_blood/functions/script_component.hpp b/addons/medical_blood/functions/script_component.hpp deleted file mode 100644 index 8f2dd066de..0000000000 --- a/addons/medical_blood/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_blood\script_component.hpp" diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index 79f8f7ba75..5320cab219 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -13,6 +13,7 @@ Sangue 혈흔 血痕 + 血迹 血跡 Kan @@ -34,10 +35,11 @@ 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. @@ -45,13 +47,15 @@ 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 @@ -59,13 +63,15 @@ 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 ラグを引き起こします。 + 生成される血痕オブジェクト数を設定できます。極端に設定すると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 @@ -73,6 +79,7 @@ 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. + 스폰되는 피의 최대량을 결정합니다. 너무 많은 양은 FPS 랙이 생길 수 있습니다. Blood Lifetime @@ -80,6 +87,7 @@ Durée d'affichage du sang Время жизни капель крови Duração do Sangue + 血迹时长 血跡時長 Durata del sangue Životnost krve @@ -87,6 +95,7 @@ Duración de la sangre Kan Ömrü Anzeigedauer der Blutstropfen + 피 잔존기간 Controls the lifetime of blood drop objects. @@ -94,6 +103,7 @@ 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ží. @@ -101,6 +111,7 @@ 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 @@ -110,7 +121,7 @@ Tylko gracze Joueurs seulement Solo Giocatori - 只有玩家 + 仅玩家 只有玩家 Только игроки Apenas Jogadores diff --git a/addons/medical_damage/ACE_Medical_Injuries.hpp b/addons/medical_damage/ACE_Medical_Injuries.hpp index c85040ba29..f09008880b 100644 --- a/addons/medical_damage/ACE_Medical_Injuries.hpp +++ b/addons/medical_damage/ACE_Medical_Injuries.hpp @@ -7,136 +7,305 @@ class ACE_Medical_Injuries { // 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; }; // Pain wound that is caused by making or being in contact with heat class ThermalBurn { - causes[] = {"burn"}; bleeding = 0; pain = 0.7; minDamage = 0; }; }; + class damageTypes { - // thresholds[] {{, }, {...}} + // thresholds[] {{, }, {...}} + // if damage is between two points, number is interpolated and then rounded by chance based on the decimal part + // e.g. a value of 2.7 has 70% chance to give 3 and 30% to give 2 + // put damage values in descending order; uses the first value found that is below the wound damage, and the point immediately before that thresholds[] = {{0.1, 1}}; + + // if 1, wounds are only applied to the hitpoint that took the most damage. othewrise, wounds are applied to all damaged hitpoints selectionSpecific = 1; + // list of damage handlers, which will be called in reverse order + // each entry should be a SQF expression that returns a function + // this can also be overridden for each damage type + class woundHandlers { + ADDON = QFUNC(woundsHandlerBase); + }; + 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}}; + // bullets only create multiple wounds when the damage is very high + thresholds[] = {{20, 10}, {4.5, 2}, {3, 1}, {0, 1}}; selectionSpecific = 1; + + class Avulsion { + // at damage, weight. between points, weight is interpolated then wound is chosen by weighted random. + // as with thresholds, but result is not rounded (decimal values used as-is) + weighting[] = {{1, 1}, {0.35, 0}}; + /* + damageMultiplier = 1; + sizeMultiplier = 1; + bleedingMultiplier = 1; + painMultiplier = 1; + fractureMultiplier = 1; + */ + }; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + // bruises caused by bullets hitting the plate are big + sizeMultiplier = 3.2; + // tone down the pain a tiny bit to compensate + painMultiplier = 0.8; + }; + class VelocityWound { + // velocity wounds are only in the 0.35-1.5 range + weighting[] = {{1.5, 0}, {1.5, 1}, {0.35, 1}, {0.35, 0}}; + // velocity wounds will tend to be medium or large + sizeMultiplier = 0.9; + }; }; class grenade { - thresholds[] = {{0.1, 3}, {0, 1}}; + // at low damage numbers, chance to create no wounds - makes it a bit more random instead of consistently covering people in bruises + thresholds[] = {{20, 10}, {10, 5}, {4, 3}, {1.5, 2}, {0.8, 2}, {0.3, 1}, {0, 0}}; selectionSpecific = 0; + class Avulsion { + weighting[] = {{1.5, 1}, {1.1, 0}}; + }; + class VelocityWound { + weighting[] = {{1.5, 0}, {1.1, 1}, {0.7, 0}}; + }; + class PunctureWound { + weighting[] = {{0.9, 0}, {0.7, 1}, {0.35, 0}}; + }; + class Cut { + weighting[] = {{0.7, 0}, {0.35, 1}, {0.35, 0}}; + }; + class Contusion { + weighting[] = {{0.5, 0}, {0.35, 1}}; + sizeMultiplier = 2; + painMultiplier = 0.9; + }; }; class explosive { - thresholds[] = {{1, 6}, {0.1, 4}, {0, 1}}; + // explosives create more and smaller wounds than grenades + thresholds[] = {{20, 15}, {8, 7}, {2, 3}, {1.2, 2}, {0.4, 1}, {0,0}}; selectionSpecific = 0; + class Avulsion { + weighting[] = {{1, 1}, {0.8, 0}}; + }; + class Cut { + weighting[] = {{1.5, 0}, {0.35, 1}, {0, 0}}; + }; + class Contusion { + weighting[] = {{0.5, 0}, {0.35, 1}}; + sizeMultiplier = 2; + painMultiplier = 0.9; + }; }; class shell { - thresholds[] = {{1, 7}, {0.1, 5}, {0, 1}}; + // shells tend to involve big pieces of shrapnel, so create fewer and larger wounds + thresholds[] = {{20, 10}, {10, 5}, {4.5, 2}, {2, 2}, {0.8, 1}, {0.2, 1}, {0, 0}}; selectionSpecific = 0; + class Avulsion { + weighting[] = {{1.5, 1}, {1.1, 0}}; + }; + class VelocityWound { + weighting[] = {{1.5, 0}, {1.1, 1}, {0.7, 0}}; + }; + class PunctureWound { + weighting[] = {{0.9, 0}, {0.7, 1}, {0.35, 0}}; + }; + class Cut { + weighting[] = {{0.7, 0}, {0.35, 1}, {0.35, 0}}; + }; + class Contusion { + weighting[] = {{0.5, 0}, {0.35, 1}}; + sizeMultiplier = 2; + painMultiplier = 0.9; + }; }; class vehiclecrash { - thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + thresholds[] = {{1.5, 3}, {1.5, 2}, {1, 2}, {1, 1}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered selectionSpecific = 0; + class woundHandlers: woundHandlers { + GVAR(vehiclecrash) = QFUNC(woundsHandlerVehiclecrash); + }; + class Abrasion { + weighting[] = {{0.30, 0}, {0.30, 1}}; + }; + class Avulsion { + weighting[] = {{0.01, 1}, {0.01, 0}}; + }; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + }; + class Crush { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Laceration { + + }; }; class collision { - thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + thresholds[] = {{8, 4}, {1, 1}, {0.3, 1}, {0.15, 0.5}, {0, 0.3}}; // 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 Avulsion { + weighting[] = {{1, 2}, {0.5, 0.5}, {0.5, 0}}; + }; + class Abrasion { + weighting[] = {{0.4, 0}, {0.2, 1}, {0, 0}}; + }; + class Contusion { + weighting[] = {{0.4, 0}, {0.2, 1}}; + }; + class Crush { + weighting[] = {{0.4, 1}, {0.2, 0}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Laceration { + }; }; class falling { - thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + thresholds[] = {{8, 4}, {1, 1}, {0.2, 1}, {0.1, 0.7}, {0, 0.5}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered selectionSpecific = 0; + class Abrasion { + weighting[] = {{0.4, 0}, {0.2, 1}, {0, 0}}; + sizeMultiplier = 3; + }; + class Contusion { + weighting[] = {{0.4, 0}, {0.2, 1}}; + sizeMultiplier = 3; + }; + class Crush { + weighting[] = {{0.4, 1}, {0.2, 0}}; + sizeMultiplier = 1.5; + }; + }; + class backblast { + thresholds[] = {{1, 6}, {1, 5}, {0.55, 5}, {0.55, 2}, {0, 2}}; + selectionSpecific = 0; + class Avulsion { + weighting[] = {{0.30, 0}, {0.30, 1}}; + }; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + }; + class stab { + thresholds[] = {{0.1, 1}, {0.1, 0}}; + selectionSpecific = 1; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class PunctureWound { + weighting[] = {{0.02, 1}, {0.02, 0}}; + }; + }; + class punch { + thresholds[] = {{0.1, 1}, {0.1, 0}}; + selectionSpecific = 1; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + }; + class Crush { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Laceration { + + }; }; class ropeburn { - thresholds[] = {{0.1, 1}}; + thresholds[] = {{0.1, 1}, {0.1, 0}}; selectionSpecific = 1; + noBlood = 1; + class Abrasion { + weighting[] = {{0.30, 1}}; + }; + }; + class drowning { + //No related wounds as drowning should not cause wounds/bleeding. Can be extended for internal injuries if they are added. + thresholds[] = {{0, 0}}; + noBlood = 1; + class woundHandlers {}; + }; + class fire { + noBlood = 1; + // custom handling for environmental fire sources + // passes damage to "burn" so doesn't need its own wound stats + class woundHandlers { + ADDON = QFUNC(woundsHandlerBurning); + }; }; class burn { thresholds[] = {{0, 1}}; selectionSpecific = 0; - }; - //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}}; + noBlood = 1; + class ThermalBurn { + weighting[] = {{0, 1}}; + }; }; class unknown { - thresholds[] = {{0.1, 1}}; + thresholds[] = {{0.1, 1}, {0.1, 0}}; + class Abrasion { + weighting[] = {{0.30, 0}, {0.30, 1}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class VelocityWound { + weighting[] = {{0.35, 1}, {0.35, 0}}; + }; }; }; }; diff --git a/addons/medical_damage/CfgAmmo.hpp b/addons/medical_damage/CfgAmmo.hpp index 89dfb486bb..7ef0834161 100644 --- a/addons/medical_damage/CfgAmmo.hpp +++ b/addons/medical_damage/CfgAmmo.hpp @@ -71,7 +71,7 @@ class CfgAmmo { class BombDemine_01_Ammo_F: BombCore { ACE_damageType = "explosive"; }; - + // Autocannon rounds are special (#7401) class B_19mm_HE: BulletBase { ACE_damageType = "explosive"; diff --git a/addons/medical_damage/XEH_PREP.hpp b/addons/medical_damage/XEH_PREP.hpp index 7f3a5b1102..6df53fb309 100644 --- a/addons/medical_damage/XEH_PREP.hpp +++ b/addons/medical_damage/XEH_PREP.hpp @@ -1,6 +1,11 @@ +PREP(debug_explosiveTest); PREP(determineIfFatal); PREP(getTypeOfDamage); PREP(handleIncapacitation); +PREP(interpolatePoints); PREP(parseConfigForInjuries); -PREP(woundsHandler); -PREP(woundsHandlerSQF); +PREP(parseWoundHandlersCfg); +PREP(woundReceived); +PREP(woundsHandlerBase); +PREP(woundsHandlerBurning); +PREP(woundsHandlerVehiclecrash); diff --git a/addons/medical_damage/XEH_preInit.sqf b/addons/medical_damage/XEH_preInit.sqf index b649db67cf..26445ad61a 100644 --- a/addons/medical_damage/XEH_preInit.sqf +++ b/addons/medical_damage/XEH_preInit.sqf @@ -16,20 +16,6 @@ addMissionEventHandler ["Loaded",{ 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; +[QEGVAR(medical,woundReceived), LINKFUNC(woundReceived)] call CBA_fnc_addEventHandler; ADDON = true; diff --git a/addons/medical_damage/addon.toml b/addons/medical_damage/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_damage/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_damage/config.cpp b/addons/medical_damage/config.cpp index 5edaa691b3..712ec44a01 100644 --- a/addons/medical_damage/config.cpp +++ b/addons/medical_damage/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -27,3 +34,5 @@ class ACE_Extensions { }; }; */ + +#endif diff --git a/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf b/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf new file mode 100644 index 0000000000..d17b268c15 --- /dev/null +++ b/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf @@ -0,0 +1,63 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Testing function that spawns AI units in a spiral around the given point and optionally spawns a projectile at the center + * Used for observing the effects of explosive munitions + * + * Arguments: + * 0: Center position, format PositionAGL + * 1: Distance to spawn units + * 0: Min (default: 1) + * 1: Max (default: 10) + * 2: Step (default: 1) + * 2: Unit class to spawn (default: "B_Soldier_F") + * 3: Ammo class to spawn, "" or nil to skip (default: "") + * 4: Delay between unit placement and ammo spawning in seconds (default: 1) + * 5: Function to run on each unit that is spawned (optional) params [_unit, _center, _ammoClass] + * + * ReturnValue: + * Nothing + * + * Example: + * [position player, [20, 80, 5]] call ace_medical_damage_fnc_debug_explosiveTest + * + * Public: No + */ +params [ + "_center", + ["_distances", []], + ["_unitClass", "B_Soldier_F"], + ["_ammoClass", ""], + ["_delay", 1], + "_initCode" +]; + +_distances params [["_min", 1], ["_max", 10], ["_step", 1]]; + +if (isNil "_center") exitwith {}; + +_max = _max max _min; +private _nSteps = 0 max ceil ((_max - _min) / _step); +private _angleStep = 360 / (_nSteps + 1); + +for "_distance" from _min to _max step _step do { + private _i = (_distance - _min) / _step; + private _angle = _i * _angleStep; + private _offset = [_distance * sin _angle, _distance * cos _angle, 0]; + private _position = _center vectorAdd _offset; + private _unit = (createGroup west) createUnit [_unitClass, _position, [], 0, "CAN_COLLIDE"]; + if !(isNil "_initCode") then { + [_unit, _center, _ammoClass] call _initCode; + }; +}; + +// spawn the ammo above the ground falling. necessary for shells, doesn't cause problems for grenades etc. +if (_ammoClass != "") then { + [{ + params ["_ammoClass", "_center"]; + private _position = _center vectorAdd [0, 0, 5]; + private _obj = _ammoClass createVehicle _position; + _obj setVectorDirAndUp [[0, 0, -1], [0, 1, 0]]; + _obj setVelocity [0, 0, -20]; + }, [_ammoClass, _center], _delay] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/medical_damage/functions/fnc_determineIfFatal.sqf b/addons/medical_damage/functions/fnc_determineIfFatal.sqf index 097ec66ed6..1e5c533e98 100644 --- a/addons/medical_damage/functions/fnc_determineIfFatal.sqf +++ b/addons/medical_damage/functions/fnc_determineIfFatal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, Glowbal * Determines if damage is fatal diff --git a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf index f73edf580f..80542359f6 100644 --- a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the type of damage based upon the projectile. @@ -17,7 +17,7 @@ params ["_typeOfProjectile"]; -private _damageType = GVAR(damageTypeCache) getVariable _typeOfProjectile; +private _damageType = GVAR(damageTypeCache) get _typeOfProjectile; if (isNil "_damageType") then { if (isText (configFile >> "CfgAmmo" >> _typeOfProjectile >> "ACE_damageType")) then { @@ -28,13 +28,13 @@ if (isNil "_damageType") then { }; // 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); + if !(_damageType in GVAR(damageTypeDetails)) then { + WARNING_2("Damage type [%1] for ammo [%2] not found",_damageType,_typeOfProjectile); _damageType = "unknown"; }; TRACE_2("getTypeOfDamage caching",_typeOfProjectile,_damageType); - GVAR(damageTypeCache) setVariable [_typeOfProjectile, _damageType]; + GVAR(damageTypeCache) set [_typeOfProjectile, _damageType]; }; _damageType // return diff --git a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf index 4e87e749df..b352564b45 100644 --- a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf +++ b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Handle incapacitation due to damage and pain @@ -24,11 +24,11 @@ _bodyPartDamage params ["_headDamage", "_bodyDamage", "_leftArmDamage", "_rightA // Exclude non penetrating body damage { - _x params ["", "_bodyPartN", "_amountOf", "", "_damage"]; - if (_bodyPartN == 1 && {_damage < PENETRATION_THRESHOLD}) then { + _x params ["", "_amountOf", "", "_damage"]; + if (_damage < PENETRATION_THRESHOLD) then { _bodyDamage = _bodyDamage - (_amountOf * _damage); }; -} forEach GET_OPEN_WOUNDS(_unit); +} forEach (GET_OPEN_WOUNDS(_unit) getOrDefault ["body", []]); private _damageThreshold = GET_DAMAGE_THRESHOLD(_unit); diff --git a/addons/medical_damage/functions/fnc_interpolatePoints.sqf b/addons/medical_damage/functions/fnc_interpolatePoints.sqf new file mode 100644 index 0000000000..a84f079f30 --- /dev/null +++ b/addons/medical_damage/functions/fnc_interpolatePoints.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Returns the image of a value on a linear piecewise function defined by given points + * Force integer causes decimals to be rounded up or down by chance based on their decimal part, i.e. 2.7 has a 70% chance to return 3 and 30% to return 2 + * + * Arguments: + * 0: Input value + * 1: Function points, must be in descending order by X (input) value + * 2: Whether to force integer + * + * ReturnValue: + * Interpolated result + * + * Example: + * [0.2, [[1,0], [0.5,1], [0,0]]] call ace_medical_damage_fnc_interpolatePoints + * + * Public: No + */ +params ["_input", "_points", ["_randomRound", false]]; + +if (count _points < 1) exitWith { + //TODO: sensible default/error value + 0 +}; +if (count _points == 1) exitWith {_points select 0 select 1}; + +private _output = 0; +private _lower = _points findIf {(_x select 0) < _input}; +if (_lower == 0) exitWith {_points select 0 select 1}; +if (_lower == -1) exitWith {_points select (count _points - 1) select 1}; +private _upper = _points select (_lower-1); +_lower = _points select _lower; +_output = linearConversion [_lower select 0, _upper select 0, _input, _lower select 1, _upper select 1, true]; + +if (_randomRound) then { + // chance to round up is equal to the decimal part + _output = ceil (_output - random 1); +}; + +_output //return diff --git a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf index af932581be..f2441b3704 100644 --- a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, commy2 * Parse the ACE_Medical_Advanced config for all injury types. @@ -20,7 +20,7 @@ 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) = []; +GVAR(woundDetails) = createHashMap; private _woundsConfig = _injuriesConfigRoot >> "wounds"; private _classID = 0; @@ -32,53 +32,61 @@ private _classID = 0; 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 isNotEqualTo []) 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; - }; + private _details = [_selections, _bleeding, _pain, _causeLimping, _causeFracture]; + GVAR(woundDetails) set [_className, _details]; + GVAR(woundDetails) set [_classID, _details]; + + GVAR(woundClassNames) pushBack _className; + { + 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; +GVAR(damageTypeDetails) = createHashMap; // cache for ammunition -> damageType -GVAR(damageTypeCache) = [] call CBA_fnc_createNamespace; +GVAR(damageTypeCache) = createHashMap; // minimum lethal damage collection, mapped to damageTypes private _damageTypesConfig = _injuriesConfigRoot >> "damageTypes"; private _thresholdsDefault = getArray (_damageTypesConfig >> "thresholds"); private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionSpecific"); +private _defaultWoundHandlers = []; +if (isClass (_damageTypesConfig >> "woundHandlers")) then { + _defaultWoundHandlers = [_damageTypesConfig >> "woundHandlers"] call FUNC(parseWoundHandlersCfg); + reverse _defaultWoundHandlers; +}; +TRACE_1("Found default wound handlers", count _defaultWoundHandlers); + // 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); + if (_className == "woundHandlers") then {continue}; + + GVAR(damageTypeCache) set [_className, _className]; + GVAR(damageTypeCache) set ["#"+_className, _className]; 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]; + + private _woundHandlers = []; + if (isClass (_damageTypeSubClassConfig >> "woundHandlers")) then { + _woundHandlers = [_damageTypeSubClassConfig >> "woundHandlers"] call FUNC(parseWoundHandlersCfg); + reverse _woundHandlers; + TRACE_2("Damage type found wound handlers", _className, count _woundHandlers); + } else { + _woundHandlers = _defaultWoundHandlers; + TRACE_1("Damage type has no wound handlers, using default", _className); + }; /* // extension loading @@ -99,6 +107,26 @@ private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionS // private _extensionRes = "ace_medical" callExtension _extensionArgs; // TRACE_1("",_extensionRes); */ + + // parse config for each wound this damage type can cause + private _damageWoundDetails = []; + { + private _woundType = configName _x; + if (_woundType == "woundHandlers") then {continue}; + if (_woundType in GVAR(woundDetails)) then { + private _weighting = GET_ARRAY(_x >> "weighting",[[ARR_2(0,1)]]); + private _dmgMulti = GET_NUMBER(_x >> "damageMultiplier", 1); + private _bleedMulti = GET_NUMBER(_x >> "bleedingMultiplier", 1); + private _sizeMulti = GET_NUMBER(_x >> "sizeMultiplier", 1); + private _painMulti = GET_NUMBER(_x >> "painMultiplier", 1); + private _fractureMulti = GET_NUMBER(_x >> "fractureMultiplier", 1); + _damageWoundDetails pushBack [_woundType, _weighting, _dmgMulti, _bleedMulti, _sizeMulti, _painMulti, _fractureMulti]; + } else { + WARNING_2("Damage type %1 refers to wound %2, but it doesn't exist: skipping.",_className,configName _x); + }; + } forEach configProperties [_damageTypeSubClassConfig, "isClass _x"]; + + GVAR(damageTypeDetails) set [_className, [_thresholds, _selectionSpecific, _woundHandlers, _damageWoundDetails]]; } forEach configProperties [_damageTypesConfig, "isClass _x"]; /* diff --git a/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf b/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf new file mode 100644 index 0000000000..0dad747c68 --- /dev/null +++ b/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Read a list of wound handler entries from config, accounting for inheritance + * + * Arguments: + * 0: The config class containing the entries + * + * ReturnValue: + * None + * + * Example: + * [configFile >> "ace_medical_injuries" >> "damageTypes"] call ace_medical_damage_fnc_parseWoundHandlersCfg + * + * Public: No + */ +params ["_config"]; + +// read all valid entries from config and store +private _entries = []; +{ + private _entryResult = call compile getText _x; + if !(isNil "_entryResult") then { + _entries pushBack _entryResult; + } +} forEach configProperties [_config, "isText _x", false]; + +private _parent = inheritsFrom _config; +if (isNull _parent) exitWith {_entries}; + +// recursive call for parent +// can't use configProperties for inheritance since it returns entries in the wrong order +([_parent] call FUNC(parseWoundHandlersCfg)) + _entries; diff --git a/addons/medical_damage/functions/fnc_woundReceived.sqf b/addons/medical_damage/functions/fnc_woundReceived.sqf new file mode 100644 index 0000000000..52dbcba265 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundReceived.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Handle woundReceived event and pass to individual wound handlers + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Shooter + * 3: Ammo classname or damage type + * + * ReturnValue: + * None + * + * Example: + * [_target, [[0.5, "LeftLeg", 1]], _shooter, "B_65x39_Caseless"] call ace_medical_damage_fnc_woundReceived + * + * Public: No + */ +params ["_unit", "_allDamages", "_shooter", "_ammo"]; + +private _typeOfDamage = _ammo call FUNC(getTypeOfDamage); +if (_typeOfDamage in GVAR(damageTypeDetails)) then { + (GVAR(damageTypeDetails) get _typeOfDamage) params ["", "", "_woundHandlers"]; + + private _damageData = [_unit, _allDamages, _typeOfDamage]; + { + _damageData = _damageData call _x; + TRACE_1("Wound handler returned", _damageData); + if !(_damageData isEqualType [] && {(count _damageData) >= 3}) exitWith { + TRACE_1("Return invalid, terminating wound handling", _damageData); + }; + } forEach _woundHandlers; + +}; diff --git a/addons/medical_damage/functions/fnc_woundsHandler.sqf b/addons/medical_damage/functions/fnc_woundsHandler.sqf deleted file mode 100644 index 049437fdf5..0000000000 --- a/addons/medical_damage/functions/fnc_woundsHandler.sqf +++ /dev/null @@ -1,141 +0,0 @@ -#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_woundsHandlerBase.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf new file mode 100644 index 0000000000..5df29c7702 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf @@ -0,0 +1,215 @@ +#include "..\script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, [[0.5, "Body", 1]], "bullet"] call ace_medical_damage_fnc_woundsHandlerBase + * + * Public: No + */ + +params ["_unit", "_allDamages", "_typeOfDamage"]; +TRACE_3("woundsHandlerBase",_unit,_allDamages,_typeOfDamage); + + +if !(_typeOfDamage in GVAR(damageTypeDetails)) then { + WARNING_1("damage type not found",_typeOfDamage); + _typeOfDamage = "unknown"; +}; + +GVAR(damageTypeDetails) get _typeOfDamage params ["_thresholds", "_selectionSpecific", "", "_damageWoundDetails"]; + +// Administration for open wounds and ids +private _openWounds = GET_OPEN_WOUNDS(_unit); + +private _createdWounds = false; +private _updateDamageEffects = false; +private _painLevel = 0; +private _criticalDamage = 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); + +// process wounds separately for each body part hit +{ // forEach _allDamages + _x params ["_damage", "_bodyPart"]; + _bodyPart = toLower _bodyPart; + + // silently ignore structural damage + if (_bodyPart == "#structural") then {continue}; + + // Convert the selectionName to a number and ensure it is a valid selection. + private _bodyPartNToAdd = ALL_BODY_PARTS find _bodyPart; + if (_bodyPartNToAdd < 0) then { + ERROR_1("invalid body part %1",_bodyPart); + continue + }; + + // determine how many wounds to create + private _nWounds = [_damage, _thresholds, true] call FUNC(interpolatePoints); + if (_nWounds < 1) then { + TRACE_2("Damage created zero wounds",_damage,_typeOfDamage); + continue + }; + private _dmgPerWound = _damage/_nWounds; + + // find the available injuries for this damage type and damage amount + private _weightedWoundTypes = []; + { + private _weighting = _x select 1; + private _woundWeight = [_dmgPerWound, _weighting] call FUNC(interpolatePoints); + _weightedWoundTypes pushBack _x; + _weightedWoundTypes pushBack _woundWeight; + } forEach _damageWoundDetails; + + if (_weightedWoundTypes isEqualTo []) then { + TRACE_2("No valid wounds",_damage,_typeOfDamage); + continue + }; + + for "_i" from 1 to _nWounds do { + + // Select the injury we are going to add + selectRandomWeighted _weightedWoundTypes params ["_woundTypeToAdd", "", "_dmgMultiplier", "_bleedMultiplier", "_sizeMultiplier", "_painMultiplier", "_fractureMultiplier"]; + if (isNil "_woundTypeToAdd") then { + WARNING_4("No valid wound types",_damage,_dmgPerWound,_typeOfDamage,_bodyPart); + continue + }; + GVAR(woundDetails) get _woundTypeToAdd params ["","_injuryBleedingRate","_injuryPain","_causeLimping","_causeFracture"]; + private _woundClassIDToAdd = GVAR(woundClassNames) find _woundTypeToAdd; + + // Add a bit of random variance to wounds + private _woundDamage = _dmgPerWound * _dmgMultiplier * random [0.9, 1, 1.1]; + + _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 + + // Anything above this value is guaranteed worst wound possible + private _worstDamage = 2; + + #define LARGE_WOUND_THRESHOLD 0.5 + + // Config specifies bleeding and pain for worst possible wound + // Worse wound correlates to higher damage, damage is not capped at 1 + private _woundSize = linearConversion [0.1, _worstDamage, _woundDamage * _sizeMultiplier, LARGE_WOUND_THRESHOLD^3, 1, true]; + + private _pain = _woundSize * _painMultiplier * _injuryPain; + _painLevel = _painLevel + _pain; + + private _bleeding = _woundSize * _bleedMultiplier * _injuryBleedingRate; + + // large wounds are > LARGE_WOUND_THRESHOLD + // medium is > LARGE_WOUND_THRESHOLD^2 + // minor is > LARGE_WOUND_THRESHOLD^3 + private _category = 0 max (2 - floor (ln _woundSize / ln LARGE_WOUND_THRESHOLD)) min 2; + + private _classComplex = 10 * _woundClassIDToAdd + _category; + + // Create a new injury. Format [0:classComplex, 1:amountOf, 2:bleedingRate, 3:woundDamage] + private _injury = [_classComplex, 1, _bleeding, _woundDamage]; + + if (_bodyPart isEqualTo "head" || {_bodyPart isEqualTo "body" && {_woundDamage > PENETRATION_THRESHOLD}}) then { + _criticalDamage = true; + }; + if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then { + if (!isPlayer _unit || {random 1 < EGVAR(medical,deathChance)}) 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 < (_fractureMultiplier * 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; + private _existingWounds = _openWounds getOrDefault [_bodyPart, [], true]; + { + _x params ["_classID", "_oldAmountOf", "_oldBleeding", "_oldDamage"]; + if ( + (_classComplex == _classID) && + {(_bodyPart isNotEqualTo "body") || {(_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 [1, _newAmountOf]; + private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; + _x set [2, _newBleeding]; + private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; + _x set [3, _newDamage]; + _createNewWound = false; + }; + } forEach _existingWounds; + + if (_createNewWound) then { + TRACE_1("adding new wound",_injury); + _existingWounds pushBack _injury; + }; + _createdWounds = true; + }; + + // selection-specific damage only hits the first part + if (_selectionSpecific > 0) then { + break; + }; +} forEach _allDamages; + +if (_updateDamageEffects) then { + [_unit] call EFUNC(medical_engine,updateDamageEffects); +}; + +if (_createdWounds) then { + _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 (_criticalDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { + [_unit] call FUNC(handleIncapacitation); + }; + + TRACE_4("exit",_unit,_painLevel,GET_PAIN(_unit),GET_OPEN_WOUNDS(_unit)); +}; + +[] //return, no further damage handling diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf new file mode 100644 index 0000000000..47c625684a --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf @@ -0,0 +1,51 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Custom wound handler for burns. Stores up small damage events until there's enough to create a wound. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, [[0.5, "Body", 0.5]], "burning"] call ace_medical_damage_fnc_woundsHandlerBurning + * + * Public: No + */ +params ["_unit", "_allDamages", "_typeOfDamage"]; +TRACE_3("woundsHandlerBurning",_unit,_allDamages,_typeOfDamage); + +#define FIRE_DAMAGE_INTERVAL 1 + +{ + _x params ["_damage", "_bodyPart"]; + + if (_bodyPart != "#structural") then { + continue + }; + + private _storedDamage = _unit getVariable [QGVAR(storedBurnDamage), 0]; + private _newDamage = _storedDamage + _damage; + + // schedule a task to convert stored damage to wounds after a delay + // the task resets stored damage to zero, so if it isn't currently zero that means there is a task already waiting + if (_storedDamage == 0 && _newDamage > 0) then { + [{ + params ["_unit"]; + + _bodyPart = selectRandom ["body", "leftleg", "rightleg"]; + private _storedDamage = _unit getVariable [QGVAR(storedBurnDamage), 0]; + [QEGVAR(medical,woundReceived), [_unit, [[_storedDamage, _bodyPart, _storedDamage]], _unit, "burn"]] call CBA_fnc_localEvent; + _unit setVariable [QGVAR(storedBurnDamage), 0, true]; + }, + [_unit], FIRE_DAMAGE_INTERVAL] call CBA_fnc_waitAndExecute; + }; + + _unit setVariable [QGVAR(storedBurnDamage), _newDamage]; +} forEach _allDamages; + +[] //return, no further damage handling for this event diff --git a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf deleted file mode 100644 index b0de1f6e4a..0000000000 --- a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf +++ /dev/null @@ -1,208 +0,0 @@ -#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 { - if (!isPlayer _unit || {random 1 < EGVAR(medical,deathChance)}) 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/fnc_woundsHandlerVehiclecrash.sqf b/addons/medical_damage/functions/fnc_woundsHandlerVehiclecrash.sqf new file mode 100644 index 0000000000..64ac637107 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerVehiclecrash.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" +/* + * Author: Pterolatypus + * Custom wound handler for vehicle crashes, sends damage to a random hitpoint + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, [[0.5, "#structural", 1.5]], "vehicleCrash"] call ace_medical_damage_fnc_woundsHandlerVehicleCrash + * + * Public: No + */ +params ["_unit", "_allDamages", "_typeOfDamage"]; +TRACE_3("woundsHandlerVehicleCrash",_unit,_allDamages,_typeOfDamage); + +// randomise all hit selections +private _newDamages = _allDamages apply { + [_x select 0, selectRandom ALL_BODY_PARTS, _x select 2]; +}; + +TRACE_1("Vehicle crash handled, passing damage", _newDamages); +[_unit, _newDamages, _typeOfDamage] //return diff --git a/addons/medical_damage/functions/script_component.hpp b/addons/medical_damage/functions/script_component.hpp deleted file mode 100644 index 66d3d51283..0000000000 --- a/addons/medical_damage/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#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 index 14dac50f1a..0ce21319e2 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -34,6 +34,15 @@ true ] call CBA_fnc_addSetting; +[ + QEGVAR(medical,painUnconsciousThreshold), + "SLIDER", + [LSTRING(PainUnconsciousThreshold_DisplayName), LSTRING(PainUnconsciousThreshold_Description)], + ELSTRING(medical,Category), + [0, 1, 0.5, 2, false], + true +] call CBA_fnc_addSetting; + [ QEGVAR(medical,deathChance), "SLIDER", diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 718b97c746..256516a47d 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -3,56 +3,64 @@ 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). - プレイヤーが気絶になる前に受けられるダメージ量を決定できます。 + プレイヤーが気絶するまでに受けられるダメージ量を設定します。\n("外傷の合計"が有効な場合は死亡するまでに受けられるダメージ量) 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 のクリティカル ダメージしきい値 + AIのクリティカルダメージしきい値 Seuil de dégât critique de l'IA Порог критического урона AI Limite de Dano Crítico da IA AI重擊承受量 + 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 が気絶になる前に受けられるダメージ量を決定できます。 + AIが気絶するまでに受けられるダメージ量を設定します。\n("外傷の合計"が有効な場合は死亡するまでに受けられるダメージ量) 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在無意識之前能承受多少傷害 + 设置 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 @@ -134,7 +142,7 @@ Avulsão Avulze 剥離傷 - 떨어져나감 + 찢김 撕除傷 Kopma 撕脱伤 @@ -151,7 +159,7 @@ Avulsão leve Malá avulze 小さな剥離傷 - 조금 떨어져나감 + 조금 찢김 小撕除傷 Küçük Kopuk 轻度撕脱伤 @@ -168,7 +176,7 @@ Avulsão média Střední avulze 中くらいの剥離傷 - 꽤 떨어져나감 + 꽤 찢김 中度撕除傷 Orta Kopuk 中度撕脱伤 @@ -185,7 +193,7 @@ Avulsão grave Velká avulze 大きな剥離傷 - 크게 떨어져나감 + 크게 찢김 嚴重撕除傷 Büyük Kopuk 重度撕脱伤 @@ -259,7 +267,7 @@ 重度挫伤 - Crushed tissue + Crushed Tissue Quetschverletzung Tessuto Schiacciato Компрессионная травма @@ -276,7 +284,7 @@ 挤压伤 - Minor crushed tissue + Minor Crushed Tissue Kleine Quetschverletzung Minimo Tessuto Schiacciato Слабая компрессионная травма @@ -293,7 +301,7 @@ 轻度挤压伤 - Medium crushed tissue + Medium Crushed Tissue Mittlere Quetschverletzung Medio Tessuto Schiacciato Умеренная компрессионная травма @@ -310,7 +318,7 @@ 中度挤压伤 - Large crushed tissue + Large Crushed Tissue Große Quetschverletzung Alto Tessuto Schiacciato Сильная компрессионная травма @@ -406,10 +414,10 @@ Ruptura Tržná rána 裂傷 - 찢어짐 + 열상 撕裂傷 Yırtık - 裂伤 + 撕裂伤 Small Tear @@ -423,10 +431,10 @@ Ruptura leve Malá tržná rána 小さな裂傷 - 조금 찢어짐 + 조그마한 열상 小撕裂傷 Küçük Yırtık - 轻度裂伤 + 轻度撕裂伤 Medium Tear @@ -440,10 +448,10 @@ Ruptura média Střední tržná rána 中くらいの裂傷 - 꽤 찢어짐 + 꽤 큰 열상 中度撕裂傷 Orta Yırtık - 中度裂伤 + 中度撕裂伤 Large Tear @@ -457,9 +465,9 @@ Ruptura grave Velká tržná rána 大きな裂傷 - 심하게 찢어짐 + 심한 열상 嚴重撕裂傷 - 重度裂伤 + 重度撕裂伤 Büyük Yırtık @@ -603,6 +611,7 @@ Причина смертельного урона 致命傷の原因 致命傷來源 + 致命伤来源 Cause de blessure mortelle Fonte del danno fatale Zdroj smrtelné škody @@ -611,12 +620,14 @@ 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é @@ -625,12 +636,14 @@ 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ů @@ -639,12 +652,14 @@ 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ů @@ -652,12 +667,14 @@ Soma do trauma Suma de traumatismos Summe aller Traumata + 피해량 중첩 Either Оба - 両方 + どちらか 兩者都是 + 二者之一 Les deux o Kterýkoliv ze dvou @@ -666,22 +683,51 @@ Ambos Ikisinden biri Beide + 둘 다 Thermal Burn 熱傷 + Brûlure thermique + Термический ожог + Thermische Verbrennung + Oparzenie + 热灼伤 + 화상 + Quemadura térmica Minor Thermal Burn - 小さな熱傷 + 軽度の熱傷 + Légère brûlure thermique + Незначительный термический ожог + Leichte thermische Verbrennung + Pomniejsze oparzenie + 轻微热灼伤 + 작은 화상 + Quemadura térmica menor Medium Thermal Burn - 中くらいの熱傷 + 中度の熱傷 + Brûlure thermique modérée + Средний термический ожог + Mittlere thermische Verbrennung + Średnie oparzenie + 中度热灼伤 + 꽤 큰 화상 + Quemadura térmica media Major Thermal Burn - 大きな熱傷 + 重度の熱傷 + Sévère brûlure thermique + Сильный термический ожог + Schwere thermische Verbrennung + Duże oparzenie + 重度热灼伤 + 심각한 화상 + Quemadura térmica severa Unit Damage Threshold @@ -693,33 +739,59 @@ Próg obrażeń jednostki Birim Hasar Katsayısı Umbral de daño de unidad + 单位伤害阈值 + 유닛 피해 한계점 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 + ユニットが気絶するまで許容できるダメージ値を設定できます。(ミッション開始時は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) Bilinçsiz duruma geçmeden önce bir birimin alabileceği hasar miktarını ayarlar. (Görev varsayılanı için 0) Determina la cantidad de daño que puede recibir una unidad antes de quedar inconsciente (0 para predeterminado de misión) + 设定一个单位在昏迷前所能承受的伤害量。(任务默认为0) + 이 유닛이 얼마나 많은 피해를 받아야 기절할 지 정합니다. (0은 미션 기본 설정을 사용합니다) Pain Unconscious Chance Шанс потерять сознание от боли Szansa na nieprzytomność przez ból - 気絶確率 + 痛みによる気絶確率 Probabilidad de inconsciencia por dolor Douleur - Chance d'évanouissement + Chance für Bewusslosigkeit durch Schmerz + 疼痛昏厥概率 + 고통으로 인한 기절 확률 The probability of a person falling unconscious when their pain is above the tolerance threshold upon receiving damage. Шанс, что человек потеряет сознание, когда его боль выше допустимого порога при получении травмы. Szansa że osoba straci przytomność gdy jej ból jest powyżej tolerowalnego progu podczas otrzymywania obrażeń. - ユニットがダメージを受けた時に痛みが許容しきい値を超えた場合、気絶をする確率を設定します。 + ユニットがダメージを受けた時の痛みが許容しきい値を超えていた場合に気絶する確率を設定します。 La probabilidad de que una persona caiga inconsciente cuando su dolor está por encima del umbral al haber recibido daño. La probabilité pour qu'une personne perde connaissance lorsque la douleur ressentie est supérieure à son seuil de tolérance. + Die Wahrscheinlichkeit, dass eine Person bewusstlos wird, wenn ihre Schmerzen bei einer Verwundung über der Toleranzschwelle liegen. + 当一个人的疼痛超过承受能力的极限时,他陷入昏迷的概率。 + 고통 한계점을 넘을 시 기절하는 확률을 정합니다. + + + Pain Unconscious Threshold + Порог боли для потери сознания + Seuil d'inconscience par la douleur. + 気絶する痛みのしきい値 + Próg Nieprzytomności od Bólu + Schmerz-Bewusstlosigkeit-Grenze + + + Sets the threshold for severe pain, above which a person can fall unconscious upon receiving damage. + Устанавливает количество боли от полученной травмы, при котором юнит может потерять сознание. + Définis le niveau de douleur à partir duquel une personne peut perdre connaissance. Cf PainUnconsciousChance. + 激しい痛みのしきい値を設定します。このしきい値を超えた状態でダメージを受けると意識を失う可能性があります。 + Ustawia próg silnego bólu, powyżej którego osoba może stracić przytomność po otrzymaniu obrażeń. + Legt die Grenze für starke Schmerzen fest, oberhalb derer eine Person bei erlittenem Schaden bewusstlos werden kann. Fatal Injury Death Chance @@ -728,6 +800,9 @@ Blessure mortelle - Chance de décès Szana na śmierć przy śmiertelej ranie 致命傷による死亡確率 + Tödliche Verletzung - Wahrscheinlichkeit des Todes + 致命伤死亡概率 + 치명상 사망 확률 The chance of dying to a fatal injury. @@ -736,6 +811,9 @@ La probabilité de mourir lors d'une "blessure mortelle".\nUne blessure mortelle est définie par des dommages importants à la tête ou au cœur. Szansa na śmierć po otrzymaniu śmiertelnej rany. 致命傷による死亡確率を設定します。 + Die Wahrscheinlichkeit, an einer eigentlich tödlichen Verletzung zu sterben. + 死于致命伤的概率。 + 치명상으로 인해 사망할 확률을 정합니다. diff --git a/addons/medical_engine/CfgExtendedAnimation.hpp b/addons/medical_engine/CfgExtendedAnimation.hpp index 596418bb7b..03fde9fee4 100644 --- a/addons/medical_engine/CfgExtendedAnimation.hpp +++ b/addons/medical_engine/CfgExtendedAnimation.hpp @@ -1,9 +1,9 @@ class CfgExtendedAnimation { class Revive { - left = QGVAR(faceLeft_unconscious); - right = QGVAR(faceRight_unconscious); - front = QGVAR(faceDown_unconscious); - back = QGVAR(faceUp_unconscious); + left = QUNCON_ANIM(faceLeft); + right = QUNCON_ANIM(faceRight); + front = QUNCON_ANIM(faceDown); + back = QUNCON_ANIM(faceUp); }; }; diff --git a/addons/medical_engine/CfgMoves.hpp b/addons/medical_engine/CfgMoves.hpp index 0bf6ac4b56..7c99321887 100644 --- a/addons/medical_engine/CfgMoves.hpp +++ b/addons/medical_engine/CfgMoves.hpp @@ -8,75 +8,86 @@ class CfgMovesMaleSdr: CfgMovesBasic { weaponIK = 0; }; - class Unconscious; class DeadState; - class ace_unconscious_1: DeadState { + class UNCON_ANIM(1): DeadState { file = QPATHTO_T(data\ace_unconscious_1.rtm); }; - class ace_unconscious_2: ace_unconscious_1 { + + class UNCON_ANIM(2): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_2.rtm); }; - class ace_unconscious_3: ace_unconscious_1 { + + class UNCON_ANIM(3): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_3.rtm); }; - class ace_unconscious_4: ace_unconscious_1 { + + class UNCON_ANIM(4): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_4.rtm); }; - class ace_unconscious_5: ace_unconscious_1 { + + class UNCON_ANIM(5): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_5.rtm); }; - class ace_unconscious_6: ace_unconscious_1 { + + class UNCON_ANIM(6): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_6.rtm); }; - class ace_unconscious_7: ace_unconscious_1 { + + class UNCON_ANIM(7): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_7.rtm); }; - class ace_unconscious_8: ace_unconscious_1 { + + class UNCON_ANIM(8): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_8.rtm); }; - class ace_unconscious_1_1: ace_unconscious_1 { + + class UNCON_ANIM(1_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_1_1.rtm); }; - class ace_unconscious_2_1: ace_unconscious_1 { + + class UNCON_ANIM(2_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_2_1.rtm); }; - class ace_unconscious_3_1: ace_unconscious_1 { + + class UNCON_ANIM(3_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_3_1.rtm); }; - class ace_unconscious_4_1: ace_unconscious_1 { + + class UNCON_ANIM(4_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_4_1.rtm); }; - class ace_unconscious_5_1: ace_unconscious_1 { + + class UNCON_ANIM(5_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_5_1.rtm); }; - class ace_unconscious_6_1: ace_unconscious_1 { + + class UNCON_ANIM(6_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_6_1.rtm); }; - class ace_unconscious_7_1: ace_unconscious_1 { + + class UNCON_ANIM(7_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_7_1.rtm); }; - class ace_unconscious_8_1: ace_unconscious_1 { + + class UNCON_ANIM(8_1): UNCON_ANIM(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 UNCON_ANIM(9): KIA_passenger_boat_holdleft {}; + class KIA_driver_boat01; - class ace_unconscious_10: KIA_driver_boat01 { - }; + class UNCON_ANIM(10): KIA_driver_boat01 {}; - class GVAR(faceDown_unconscious): Unconscious { - }; + class Unconscious; + class UNCON_ANIM(faceDown): Unconscious {}; - class GVAR(faceLeft_unconscious): Unconscious { - }; + class UNCON_ANIM(faceLeft): Unconscious {}; - class GVAR(faceRight_unconscious): Unconscious { - }; + class UNCON_ANIM(faceRight): Unconscious {}; - class GVAR(faceUp_unconscious): Unconscious { - }; + class UNCON_ANIM(faceUp): Unconscious {}; class AmovPpneMstpSnonWnonDnon; class ACE_UnconsciousOutProne: AmovPpneMstpSnonWnonDnon { diff --git a/addons/medical_engine/CfgVehicles.hpp b/addons/medical_engine/CfgVehicles.hpp index b17ca15a98..ac744031e3 100644 --- a/addons/medical_engine/CfgVehicles.hpp +++ b/addons/medical_engine/CfgVehicles.hpp @@ -4,7 +4,9 @@ class CfgVehicles { class CAManBase: Man { // General class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -12,12 +14,16 @@ class CfgVehicles { class B_Soldier_base_F; class B_Soldier_04_f: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class B_Soldier_05_f: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -25,12 +31,16 @@ class CfgVehicles { class I_Soldier_base_F; class I_Soldier_03_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class I_Soldier_04_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -38,79 +48,107 @@ class CfgVehicles { class SoldierEB; class O_Soldier_base_F: SoldierEB { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Soldier_02_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_officer_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Soldier_diver_base_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; // Virtual Reality class B_Soldier_VR_F: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class B_Protagonist_VR_F: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Soldier_VR_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class I_Soldier_VR_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class I_Protagonist_VR_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Protagonist_VR_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class C_man_1; class C_Protagonist_VR_F: C_man_1 { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; // Civilians class C_Soldier_VR_F: C_man_1 { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; // APEX class O_V_Soldier_Viper_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(3,3); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_V_Soldier_base_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(3,3); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -118,7 +156,9 @@ class CfgVehicles { 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); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; }; diff --git a/addons/medical_engine/XEH_PREP.hpp b/addons/medical_engine/XEH_PREP.hpp index 63faaf7bbe..ffc3543745 100644 --- a/addons/medical_engine/XEH_PREP.hpp +++ b/addons/medical_engine/XEH_PREP.hpp @@ -4,7 +4,9 @@ PREP(disableThirdParty); PREP(getHitpointArmor); PREP(getItemArmor); PREP(handleDamage); +PREP(lockUnconsciousSeat); PREP(setStructuralDamage); PREP(setUnconsciousAnim); +PREP(unlockUnconsciousSeat); PREP(updateBodyPartVisuals); PREP(updateDamageEffects); diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf index fec92ca620..64f8bab83b 100644 --- a/addons/medical_engine/XEH_postInit.sqf +++ b/addons/medical_engine/XEH_postInit.sqf @@ -13,6 +13,7 @@ // Check if last hit point is our dummy. private _allHitPoints = getAllHitPointsDamage _unit param [0, []]; reverse _allHitPoints; + while {(_allHitPoints param [0, ""]) select [0,1] == "#"} do { WARNING_1("Ignoring Reflector hitpoint %1", _allHitPoints deleteAt 0); }; if (_allHitPoints param [0, ""] != "ACE_HDBracket") then { private _config = configOf _unit; @@ -31,8 +32,8 @@ #ifdef DEBUG_MODE_FULL [QEGVAR(medical,woundReceived), { - params ["_unit", "_woundedHitPoint", "_receivedDamage", "_shooter", "_ammo"]; - TRACE_5("wound",_unit,_woundedHitPoint, _receivedDamage, _shooter, _ammo); + params ["_unit", "_damages", "_shooter", "_ammo"]; + TRACE_4("wound",_unit,_damages, _shooter, _ammo); //systemChat str _this; }] call CBA_fnc_addEventHandler; #endif @@ -41,12 +42,23 @@ // 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 {}; + params ["_unit", "", "_vehicle"]; - if (lifeState _unit == "INCAPACITATED") then { + if (local _unit && {lifeState _unit == "INCAPACITATED"}) then { [_unit, true] call FUNC(setUnconsciousAnim); }; + + if (local _vehicle) then { + [_unit] call FUNC(lockUnconsciousSeat); + }; +}] call CBA_fnc_addClassEventHandler; + +["CAManBase", "GetOutMan", { + params ["_unit", "", "_vehicle"]; + + if (local _vehicle) then { + [_unit] call FUNC(unlockUnconsciousSeat); + }; }] call CBA_fnc_addClassEventHandler; // Guarantee aircraft crashes are more lethal @@ -59,14 +71,42 @@ 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; + [QEGVAR(medical,woundReceived), [_x, [[_lethality, "Head", _lethality]], _killer, "#vehiclecrash"], _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 { + if (local _unit && {_anim find QUNCON_ANIM(face) != -1 && {lifeState _unit != "INCAPACITATED"}}) then { [_unit, false] call FUNC(setUnconsciousAnim); }; }] call CBA_fnc_addClassEventHandler; + +["ace_unconscious", { + params ["_unit", "_unconscious"]; + TRACE_3("unit uncon",_unit,objectParent _unit,local _unit); + if (!isNull objectParent _unit && {local objectParent _unit}) then { + if (_unconscious) then { + [_unit] call FUNC(lockUnconsciousSeat); + } else { + [_unit] call FUNC(unlockUnconsciousSeat); + }; + }; +}] call CBA_fnc_addEventHandler; + +["ace_killed", { // global event + params ["_unit"]; + TRACE_3("unit Killed",_unit,objectParent _unit,local _unit); + if (!isNull objectParent _unit && {local objectParent _unit}) exitWith { + [_unit] call FUNC(lockUnconsciousSeat); + }; +}] call CBA_fnc_addEventHandler; + +["CAManBase", "deleted", { + params ["_unit"]; + TRACE_3("unit deleted",_unit,objectParent _unit,local _unit); + if ((!isNull objectParent _unit) && {local objectParent _unit}) then { + [_unit] call FUNC(unlockUnconsciousSeat); + }; +}, true, []] call CBA_fnc_addClassEventHandler; diff --git a/addons/medical_engine/XEH_preInit.sqf b/addons/medical_engine/XEH_preInit.sqf index 71c7a86595..379b30da4b 100644 --- a/addons/medical_engine/XEH_preInit.sqf +++ b/addons/medical_engine/XEH_preInit.sqf @@ -9,12 +9,13 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" // Define "Constants" variables (both are macros defined in script_macros_medical.hpp, look there for actual variable names) +if (isNil QUOTE(SPONTANEOUS_WAKE_UP_INTERVAL)) then {SPONTANEOUS_WAKE_UP_INTERVAL = SPONTANEOUS_WAKE_UP_INTERVAL_DEFAULT}; +if (isNil QUOTE(MINIMUM_BLOOD_FOR_STABLE_VITALS)) then {MINIMUM_BLOOD_FOR_STABLE_VITALS = MINIMUM_BLOOD_FOR_STABLE_VITALS_DEFAULT}; 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}; @@ -31,7 +32,7 @@ if (isNil QUOTE(FATAL_SUM_DAMAGE_WEIBULL_K) || isNil QUOTE(FATAL_SUM_DAMAGE_WEIB }; // Cache for armor values of equipped items (vests etc) -GVAR(armorCache) = false call CBA_fnc_createNamespace; +GVAR(armorCache) = createHashMap; // 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 @@ -39,10 +40,10 @@ GVAR(armorCache) = false call CBA_fnc_createNamespace; 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"]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceUp), [QUNCON_ANIM(2),QUNCON_ANIM(2_1),QUNCON_ANIM(7_1),QUNCON_ANIM(8_1),QUNCON_ANIM(5_1),QUNCON_ANIM(6_1)]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceDown), [QUNCON_ANIM(1),QUNCON_ANIM(3),QUNCON_ANIM(4),"unconscious",QUNCON_ANIM(9),QUNCON_ANIM(3_1),QUNCON_ANIM(4_1)]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceLeft), [QUNCON_ANIM(7),QUNCON_ANIM(8),QUNCON_ANIM(1_1),QUNCON_ANIM(7_1),QUNCON_ANIM(8_1)]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceRight), [QUNCON_ANIM(5),QUNCON_ANIM(6),QUNCON_ANIM(10),QUNCON_ANIM(5_1),QUNCON_ANIM(6_1)]]; private _fnc_fixStatic = { params ["_vehicle"]; @@ -69,7 +70,7 @@ addMissionEventHandler ["Loaded", { // Use object reference to indicate the waitUnit is already running (this prevents issues with respawning units keeping SetVars) if ((_unit getVariable [QGVAR(waitForAnim), objNull]) == _unit) exitWith {}; _unit setVariable [QGVAR(waitForAnim), _unit]; - [{(animationState _this) find QGVAR(face) != -1}, { + [{(animationState _this) find QUNCON_ANIM(face) != -1}, { [_this, animationState _this] call FUNC(applyAnimAfterRagdoll); }, _unit, 20] call CBA_fnc_waitUntilAndExecute; } else { diff --git a/addons/medical_engine/addon.toml b/addons/medical_engine/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_engine/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_engine/config.cpp b/addons/medical_engine/config.cpp index be5dc54040..8d718155d1 100644 --- a/addons/medical_engine/config.cpp +++ b/addons/medical_engine/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -21,3 +28,5 @@ class CfgPatches { #include "CfgMoves.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" + +#endif diff --git a/addons/medical_engine/data/zDummy.rtm b/addons/medical_engine/data/zDummy.rtm new file mode 100644 index 0000000000..dfeb7b7fcc Binary files /dev/null and b/addons/medical_engine/data/zDummy.rtm differ diff --git a/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf b/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf index 7d97f8b3f8..db522b2bf7 100644 --- a/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf +++ b/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: diwako * Apply a fitting unconscious animation to a knocked out unit @@ -17,13 +17,16 @@ */ params ["_unit", "_anim"]; -TRACE_2("applyAnimAfterRagdoll",_unit,_unconsciousAnimation); +TRACE_2("applyAnimAfterRagdoll",_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, [""]]); +private _animsArray = GVAR(animations) getVariable [_anim, [""]]; +private _random = (toArray (hashValue _unit)) param [0, 0]; +private _index = _random % (count _animsArray); +private _unconsciousAnimation = _animsArray select _index; if (_unconsciousAnimation isEqualTo "") exitWith { // not a valid animation found @@ -33,4 +36,5 @@ if (_unconsciousAnimation isEqualTo "") exitWith { // 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 +TRACE_2("switchMove",_unit,_unconsciousAnimation); _unit switchMove _unconsciousAnimation; diff --git a/addons/medical_engine/functions/fnc_damageBodyPart.sqf b/addons/medical_engine/functions/fnc_damageBodyPart.sqf index a435632801..c25d83c46c 100644 --- a/addons/medical_engine/functions/fnc_damageBodyPart.sqf +++ b/addons/medical_engine/functions/fnc_damageBodyPart.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Damages a body part of a local unit. Does not kill the unit. diff --git a/addons/medical_engine/functions/fnc_disableThirdParty.sqf b/addons/medical_engine/functions/fnc_disableThirdParty.sqf index 5caa2fd74d..4a9bacd088 100644 --- a/addons/medical_engine/functions/fnc_disableThirdParty.sqf +++ b/addons/medical_engine/functions/fnc_disableThirdParty.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Detects and disables third party medical systems. diff --git a/addons/medical_engine/functions/fnc_getHitpointArmor.sqf b/addons/medical_engine/functions/fnc_getHitpointArmor.sqf index 62954a1b56..8214ba0079 100644 --- a/addons/medical_engine/functions/fnc_getHitpointArmor.sqf +++ b/addons/medical_engine/functions/fnc_getHitpointArmor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Pterolatypus * Checks a unit's equipment to calculate the total armor on a hitpoint. diff --git a/addons/medical_engine/functions/fnc_getItemArmor.sqf b/addons/medical_engine/functions/fnc_getItemArmor.sqf index 9457c54c6e..fa66762a06 100644 --- a/addons/medical_engine/functions/fnc_getItemArmor.sqf +++ b/addons/medical_engine/functions/fnc_getItemArmor.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#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. @@ -19,22 +19,26 @@ params ["_item", "_hitpoint"]; private _key = format ["%1$%2", _item, _hitpoint]; -private _armor = GVAR(armorCache) getVariable _key; +private _armor = GVAR(armorCache) get _key; if (isNil "_armor") then { TRACE_2("Cache miss",_item,_hitpoint); if ("" in [_item, _hitpoint]) exitWith { _armor = 0; - GVAR(armorCache) setVariable [_key, _armor]; + GVAR(armorCache) set [_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") + if (_hitpoint == "#structural") then { + // TODO: I'm not sure if this should be multiplied by the base armor value or not + _armor = getNumber (_unitCfg >> "armorStructural"); + } else { + private _entry = _unitCfg >> "HitPoints" >> _hitpoint; + _armor = getNumber (_unitCfg >> "armor") * (1 max getNumber (_entry >> "armor")); + }; } else { private _condition = format ["getText (_x >> 'hitpointName') == '%1'", _hitpoint]; private _entry = configProperties [_itemInfo >> "HitpointsProtectionInfo", _condition] param [0, configNull]; @@ -42,7 +46,7 @@ if (isNil "_armor") then { _armor = getNumber (_entry >> "armor"); }; - GVAR(armorCache) setVariable [_key, _armor]; + GVAR(armorCache) set [_key, _armor]; }; _armor // return diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf index 9eb799cdcd..3c042f5532 100644 --- a/addons/medical_engine/functions/fnc_handleDamage.sqf +++ b/addons/medical_engine/functions/fnc_handleDamage.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2, SilentSpike + * Author: commy2, kymckay * 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". @@ -13,9 +13,6 @@ * * 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. @@ -38,13 +35,37 @@ 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); +TRACE_4("Received hit",_hitpoint,_ammo,_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}; +// 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 { + TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage); + [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, "Body", _newDamage]], _unit, "drowning"]] call CBA_fnc_localEvent; + + 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 ( + EGVAR(medical,enableVehicleCrashes) && + {_hitPoint isEqualTo "#structural"} && + {_ammo isEqualTo ""} && + {_vehicle != _unit} && + {vectorMagnitude (velocity _vehicle) > 5} + // todo: no way to detect if stationary and another vehicle hits you +) exitWith { + TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage); + [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, _hitPoint, _newDamage]], _unit, "vehiclecrash"]] call CBA_fnc_localEvent; + + 0 +}; // This hitpoint is set to trigger last, evaluate all the stored damage values // to determine where wounds are applied @@ -52,7 +73,7 @@ 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]; + private _damageStructural = _unit getVariable [QGVAR($#structural), [0,0]]; // --- Head private _damageHead = [ @@ -81,38 +102,20 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { 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) + // Priority used for sorting if incoming damage is equal 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"] + [_damageHead select 0, PRIORITY_HEAD, _damageHead select 1, "Head"], + [_damageBody select 0, PRIORITY_BODY, _damageBody select 1, "Body"], + [_damageLeftArm select 0, PRIORITY_LEFT_ARM, _damageLeftArm select 1, "LeftArm"], + [_damageRightArm select 0, PRIORITY_RIGHT_ARM, _damageRightArm select 1, "RightArm"], + [_damageLeftLeg select 0, PRIORITY_LEFT_LEG, _damageLeftLeg select 1, "LeftLeg"], + [_damageRightLeg select 0, PRIORITY_RIGHT_LEG, _damageRightLeg select 1, "RightLeg"], + [_damageStructural select 0, PRIORITY_STRUCTURAL, _damageStructural select 1, "#structural"] ]; 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 - }; + _allDamages = _allDamages apply {[_x select 2, _x select 3, _x select 0]}; // Environmental damage sources all have empty ammo string // No explicit source given, we infer from differences between them @@ -120,8 +123,6 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { // 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 @@ -130,48 +131,24 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { 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); + _ammo = "falling"; + TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_allDamages); } 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]; - } + _ammo = "collision"; + TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_allDamages); }; } 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; - }; + _ammo = "fire"; + TRACE_5("Fire Damage",_unit,_shooter,_instigator,_damage,_allDamages); }; }; // 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; + // TODO check if this needs to be changed for burning damage (occurs as lots of small events that we add together) + if ((_allDamages select 0 select 0) > 1E-3) then { + TRACE_1("received",_allDamages); + [QEGVAR(medical,woundReceived), [_unit, _allDamages, _shooter, _ammo]] call CBA_fnc_localEvent; }; // Clear stored damages otherwise they will influence future damage events @@ -181,45 +158,19 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { } 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) + QGVAR($HitLeftArm),QGVAR($HitRightArm),QGVAR($HitLeftLeg),QGVAR($HitRightLeg), + QGVAR($#structural) ]; 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); +// Damages are stored for "ace_hdbracket" event triggered last +_unit setVariable [format [QGVAR($%1), _hitPoint], [_realDamage, _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 ( - EGVAR(medical,enableVehicleCrashes) && - {_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 -}; +// 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}; // We store our own damage values so engine damage is unnecessary 0 diff --git a/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf b/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf new file mode 100644 index 0000000000..cc29e75cc1 --- /dev/null +++ b/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Locks the seat of an unconscious or dead unit to prevent automatic unloading. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Public: No + */ +if (missionNamespace getVariable [QGVAR(disableSeatLocking), false]) exitWith {}; +params ["_unit"]; + +private _vehicle = objectParent _unit; +TRACE_3("lockUnconsciousSeat",_unit,_vehicle,lifeState _unit); + +if (isNull _vehicle) exitWith {}; +if (alive _unit && {lifeState _unit != "INCAPACITATED"}) exitWith {}; + +switch (true) do { + case (_unit isEqualTo (driver _vehicle)): { + _vehicle lockDriver true; + _unit setVariable [QGVAR(lockedSeat), [_vehicle, "driver"], true]; + }; + + case (_vehicle getCargoIndex _unit != -1): { + private _cargoIndex = _vehicle getCargoIndex _unit; + _vehicle lockCargo [_cargoIndex, true]; + _unit setVariable [QGVAR(lockedSeat), [_vehicle, "cargo", _cargoIndex], true]; + }; + + case ((_vehicle unitTurret _unit) isNotEqualTo []): { + private _turretPath = _vehicle unitTurret _unit; + _vehicle lockTurret [_turretPath, true]; + _unit setVariable [QGVAR(lockedSeat), [_vehicle, "turret", _turretPath], true]; + }; +}; +TRACE_1("locked",_unit getVariable QGVAR(lockedSeat)); diff --git a/addons/medical_engine/functions/fnc_setStructuralDamage.sqf b/addons/medical_engine/functions/fnc_setStructuralDamage.sqf index 4f2888ff71..6094c3d78e 100644 --- a/addons/medical_engine/functions/fnc_setStructuralDamage.sqf +++ b/addons/medical_engine/functions/fnc_setStructuralDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Set structural damage of an object without modifying the individual hit points. diff --git a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf index f71c550add..531f5d4062 100644 --- a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf +++ b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Force local unit into ragdoll / unconsciousness animation. @@ -59,7 +59,7 @@ if (_isUnconscious) then { 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 { + if ((_animation == "unconscious" || {_animation == "deadstate" || {_animation find QGVAR(uncon_anim) != -1}}) && {lifeState _unit != "INCAPACITATED"}) then { [_unit, "AmovPpneMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); TRACE_1("forcing SwitchMove",animationState _unit); }; diff --git a/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf b/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf new file mode 100644 index 0000000000..5214a32201 --- /dev/null +++ b/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Unlocks the seat of an unconscious or dead unit after getting moved out or waking up. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Public: No + */ +params ["_unit"]; + +private _seat = _unit getVariable [QGVAR(lockedSeat), []]; +_seat params ["_vehicle", "_type", "_position"]; + +TRACE_2("unlockUnconsciousSeat",_unit,_seat); +if (_seat isEqualTo []) exitWith {}; + +switch (_type) do { + case "driver": { + _vehicle lockDriver false; + }; + + case "cargo": { + _vehicle lockCargo [_position, false]; + }; + + case "turret": { + _vehicle lockTurret [_position, false]; + }; +}; + +_unit setVariable [QGVAR(lockedSeat), nil, true]; diff --git a/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf index 3e240b807b..a4403ffa7d 100644 --- a/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf +++ b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Damages a body part of a local unit. Does not kill the unit. diff --git a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf index 107a1945c6..7dc73e04f4 100644 --- a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf +++ b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, PabstMirror * Updates damage effects for limping and fractures. @@ -35,8 +35,8 @@ if (EGVAR(medical,fractures) > 0) then { if (EGVAR(medical,fractures) in [2, 3]) then { // the limp with a splint will still cause effects // Block sprint / force walking based on fracture setting and leg splint status private _hasLegSplint = (_fractures select 4) == -1 || {(_fractures select 5) == -1}; - if (EGVAR(medical,fractures) == 2) then { - [_unit, "blockSprint", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set); + if (EGVAR(medical,fractures) == 2) then { + [_unit, "blockSprint", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set); } else { [_unit, "forceWalk", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set); }; @@ -48,18 +48,31 @@ if (EGVAR(medical,fractures) > 0) then { }; if (!_isLimping && {EGVAR(medical,limping) > 0}) then { - private _woundsToCheck = GET_OPEN_WOUNDS(_unit); + private _openWounds = GET_OPEN_WOUNDS(_unit); + + // Want a copy of combined arrays to prevent wound mixing + private _legWounds = (_openWounds getOrDefault ["leftleg", []]) + + (_openWounds getOrDefault ["rightleg", []]); + if (EGVAR(medical,limping) == 2) then { - _woundsToCheck = _woundsToCheck + GET_BANDAGED_WOUNDS(_unit); // do not append + private _bandagedWounds = GET_BANDAGED_WOUNDS(_unit); + _legWounds = _legWounds + + (_bandagedWounds getOrDefault ["leftleg", []]) + + (_bandagedWounds getOrDefault ["rightleg", []]); }; + { - _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 + _x params ["_xClassID", "_xAmountOf", "", "_xDamage"]; + if ( + (_xAmountOf > 0) + && {_xDamage > LIMPING_DAMAGE_THRESHOLD} + // select _causeLimping from woundDetails + && {(EGVAR(medical_damage,woundDetails) get (_xClassID / 10)) select 3} + ) exitWith { TRACE_1("limping because of wound",_x); _isLimping = true; }; - } forEach _woundsToCheck; + } forEach _legWounds; }; _unit setVariable [QEGVAR(medical,isLimping), _isLimping, true]; diff --git a/addons/medical_engine/functions/script_component.hpp b/addons/medical_engine/functions/script_component.hpp deleted file mode 100644 index c28da622f0..0000000000 --- a/addons/medical_engine/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#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 index e5e03e6d1f..59cd015080 100644 --- a/addons/medical_engine/script_component.hpp +++ b/addons/medical_engine/script_component.hpp @@ -32,7 +32,11 @@ #define PRIORITY_RIGHT_ARM (1 + random 1) #define PRIORITY_LEFT_LEG (1 + random 1) #define PRIORITY_RIGHT_LEG (1 + random 1) +#define PRIORITY_STRUCTURAL 1 // don't change, these reflect hard coded engine behaviour #define DAMAGED_MIN_THRESHOLD 0.45 #define LIMPING_MIN_DAMAGE 0.5 + +#define UNCON_ANIM(var1) DOUBLES(GVAR(uncon_anim),var1) +#define QUNCON_ANIM(var1) QUOTE(UNCON_ANIM(var1)) diff --git a/addons/medical_engine/script_macros_config.hpp b/addons/medical_engine/script_macros_config.hpp index b29f9dd958..611a8ad356 100644 --- a/addons/medical_engine/script_macros_config.hpp +++ b/addons/medical_engine/script_macros_config.hpp @@ -7,16 +7,19 @@ class My_AwesomeUnit_base; class My_AwesomeUnit: My_AwesomeUnit_base { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; }; */ // 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. +// that are used for animations and therefore exist in all third party units. +// This used to take the armor values as parameters; it now inherits the values +// of `armor`, `passThrough` and `explosionShielding` from the existing hitpoints +// for vanilla consistency. // "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 @@ -24,27 +27,21 @@ // 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;\ +#define ADD_ACE_HITPOINTS\ + class HitLeftArm: HitHands {\ 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;\ + class HitLeftLeg: HitLegs {\ material = -1;\ name = "leg_l";\ - passThrough = 1;\ radius = 0.1;\ - explosionShielding = 1;\ visual = "injury_legs";\ minimalHit = 0.01;\ };\ diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp index f2d4fb9a09..1f1f2c5aba 100644 --- a/addons/medical_engine/script_macros_medical.hpp +++ b/addons/medical_engine/script_macros_medical.hpp @@ -4,7 +4,7 @@ #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 ALL_HITPOINTS ["HitHead", "HitChest", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] #define HITPOINT_INDEX_HEAD 0 #define HITPOINT_INDEX_BODY 1 @@ -54,6 +54,10 @@ #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 +// Minimum blood volume, in liters, for a patient to have the chance to wake up +#define MINIMUM_BLOOD_FOR_STABLE_VITALS EGVAR(medical,const_stableVitalsBloodThreshold) +#define MINIMUM_BLOOD_FOR_STABLE_VITALS_DEFAULT BLOOD_VOLUME_CLASS_2_HEMORRHAGE + // 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 @@ -72,9 +76,8 @@ #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 above which a unit can go unconscious upon receiving damage +#define PAIN_UNCONSCIOUS EGVAR(medical,painUnconsciousThreshold) // Pain fade out time (time it takes until pain is guaranteed to be completly gone) #define PAIN_FADE_TIME EGVAR(medical,const_painFadeTime) @@ -85,7 +88,8 @@ #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 +#define SPONTANEOUS_WAKE_UP_INTERVAL EGVAR(medical,const_wakeUpCheckInterval) +#define SPONTANEOUS_WAKE_UP_INTERVAL_DEFAULT 15 // Minimum leg damage required for limping #define LIMPING_DAMAGE_THRESHOLD EGVAR(medical,const_limpingDamageThreshold) @@ -99,8 +103,8 @@ #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] +// [classID, amountOf, bloodloss, damage] +#define EMPTY_WOUND [-1, 0, 0, 0] // Base time to bandage each wound category #define BANDAGE_TIME_S 4 @@ -173,9 +177,9 @@ #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_OPEN_WOUNDS(unit) (unit getVariable [VAR_OPEN_WOUNDS, createHashMap]) +#define GET_BANDAGED_WOUNDS(unit) (unit getVariable [VAR_BANDAGED_WOUNDS, createHashMap]) +#define GET_STITCHED_WOUNDS(unit) (unit getVariable [VAR_STITCHED_WOUNDS, createHashMap]) #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 diff --git a/addons/medical_engine/stringtable.xml b/addons/medical_engine/stringtable.xml index c90e6c57cf..81e2ae8450 100644 --- a/addons/medical_engine/stringtable.xml +++ b/addons/medical_engine/stringtable.xml @@ -3,11 +3,14 @@ Enable Vehicle Crash Damage - Включить урон при аварии в транспортном средстве. + Вкл. урон при аварии в транспорте Activar daño por accidente de vehículo Blessures de collision (véhicules) Włącz obrażenia od kolizji pojazdu 車両衝突ダメージを有効化 + Aktiviere Verletzungen durch Fahrzeugunfälle + 启用车辆碰撞损坏 + 차량 충돌 피해 활성화 Controls whether crew receives damage from vehicle collisions. @@ -16,6 +19,9 @@ Définit si les passagers à bord des véhicules peuvent être blessés en cas d'accident. Kontroluje czy załoga pojazdu otrzyma obrażenia podczas kolizji pojazdu. 車両が衝突をすると乗員がダメージを受けるかどうかを決定します。 + Kontrolliert, ob Besatzung eines Fahrzeugs Schaden durch Unfälle erleiden soll + 控制乘员是否受到车辆碰撞的伤害。 + 차량 충돌로 인해 탑승인원들이 피해를 받을 지 결정합니다. diff --git a/addons/medical_feedback/RscInGameUI.hpp b/addons/medical_feedback/RscInGameUI.hpp index cc2712d8ab..cbea0e35b5 100644 --- a/addons/medical_feedback/RscInGameUI.hpp +++ b/addons/medical_feedback/RscInGameUI.hpp @@ -1,3 +1,9 @@ +// Workaround required for new HEMTT, vanilla macros requires the use of auto-quote +#undef IGUI_GRID_STANCE_X +#undef IGUI_GRID_STANCE_Y +#define ace_IGUI_GRID_STANCE_X (profilenamespace getvariable ['IGUI_GRID_STANCE_X',IGUI_GRID_STANCE_XDef]) +#define ace_IGUI_GRID_STANCE_Y (profilenamespace getvariable ['IGUI_GRID_STANCE_Y',IGUI_GRID_STANCE_YDef]) + class RscPictureKeepAspect; class RscInGameUI { class RscStanceInfo { @@ -9,26 +15,26 @@ class RscInGameUI { }; 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; + x = QUOTE(ace_IGUI_GRID_STANCE_X); + y = QUOTE(ace_IGUI_GRID_STANCE_Y); + w = QUOTE(IGUI_GRID_STANCE_WAbs / 4); + h = QUOTE(IGUI_GRID_STANCE_HAbs / 4); }; class GVAR(stateIndicator1): RscPictureKeepAspect { onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(stateIndicator1), _this select 0)]); - x = IGUI_GRID_STANCE_X + IGUI_GRID_STANCE_WAbs * 3 / 4; - y = IGUI_GRID_STANCE_Y; - w = IGUI_GRID_STANCE_WAbs / 4; - h = IGUI_GRID_STANCE_HAbs / 4; + x = QUOTE(ace_IGUI_GRID_STANCE_X + IGUI_GRID_STANCE_WAbs * 3 / 4); + y = QUOTE(ace_IGUI_GRID_STANCE_Y); + w = QUOTE(IGUI_GRID_STANCE_WAbs / 4); + h = QUOTE(IGUI_GRID_STANCE_HAbs / 4); }; class GVAR(stateIndicator2): GVAR(stateIndicator1) { onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(stateIndicator2), _this select 0)]); - y = IGUI_GRID_STANCE_Y + IGUI_GRID_STANCE_HAbs / 4; + y = QUOTE(ace_IGUI_GRID_STANCE_Y + IGUI_GRID_STANCE_HAbs / 4); }; class GVAR(stateIndicator3): GVAR(stateIndicator1) { onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(stateIndicator3), _this select 0)]); - y = IGUI_GRID_STANCE_Y + IGUI_GRID_STANCE_HAbs * 2 / 4; + y = QUOTE(ace_IGUI_GRID_STANCE_Y + IGUI_GRID_STANCE_HAbs * 2 / 4); }; }; }; diff --git a/addons/medical_feedback/XEH_postInit.sqf b/addons/medical_feedback/XEH_postInit.sqf index c482be9ad1..96d15dbf21 100644 --- a/addons/medical_feedback/XEH_postInit.sqf +++ b/addons/medical_feedback/XEH_postInit.sqf @@ -89,13 +89,12 @@ GVAR(bloodTickCounter) = 0; if (_newCamera == "") then { // switched back to player view private _status = IS_UNCONSCIOUS(_unit); [!_status, _unit] call EFUNC(common,setVolume); - [QUOTE(ADDON), _volume, _status] call EFUNC(common,setHearingCapability); - ["unconscious", _status] call EFUNC(common,setDisableUserInputStatus); } else { // camera view [true, _unit] call EFUNC(common,setVolume); [QUOTE(ADDON), 1, false] call EFUNC(common,setHearingCapability); + ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); }; }] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/medical_feedback/addon.toml b/addons/medical_feedback/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_feedback/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_feedback/config.cpp b/addons/medical_feedback/config.cpp index 50eb2bbab3..caea028b79 100644 --- a/addons/medical_feedback/config.cpp +++ b/addons/medical_feedback/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -20,3 +27,5 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "RscTitles.hpp" #include "RscInGameUI.hpp" + +#endif diff --git a/addons/medical_feedback/functions/fnc_effectBleeding.sqf b/addons/medical_feedback/functions/fnc_effectBleeding.sqf index 0f04ffd333..b018948f23 100644 --- a/addons/medical_feedback/functions/fnc_effectBleeding.sqf +++ b/addons/medical_feedback/functions/fnc_effectBleeding.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the bleeding effect. diff --git a/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf b/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf index ae2dcc1e74..08a200cbd0 100644 --- a/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf +++ b/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the blood volume effect. diff --git a/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf b/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf index 2ba1e5b665..b03867e4bb 100644 --- a/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf +++ b/addons/medical_feedback/functions/fnc_effectBloodVolumeIcon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 10Dozen * Handles the blood volume icon. diff --git a/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf index c92a377c13..89d98883fc 100644 --- a/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf +++ b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the hear beat sound. diff --git a/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf b/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf index 73526d462a..2607a69db3 100644 --- a/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf +++ b/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Creates the incapacitation effect. diff --git a/addons/medical_feedback/functions/fnc_effectPain.sqf b/addons/medical_feedback/functions/fnc_effectPain.sqf index 9b8320244d..0df6cde5dd 100644 --- a/addons/medical_feedback/functions/fnc_effectPain.sqf +++ b/addons/medical_feedback/functions/fnc_effectPain.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Triggers the pain effect (single flash). diff --git a/addons/medical_feedback/functions/fnc_effectUnconscious.sqf b/addons/medical_feedback/functions/fnc_effectUnconscious.sqf index 3cd15bd405..5780b8ea5f 100644 --- a/addons/medical_feedback/functions/fnc_effectUnconscious.sqf +++ b/addons/medical_feedback/functions/fnc_effectUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the unconscious effect. diff --git a/addons/medical_feedback/functions/fnc_handleEffects.sqf b/addons/medical_feedback/functions/fnc_handleEffects.sqf index 4f81ba4689..2066527461 100644 --- a/addons/medical_feedback/functions/fnc_handleEffects.sqf +++ b/addons/medical_feedback/functions/fnc_handleEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles any visual effects of medical. diff --git a/addons/medical_feedback/functions/fnc_handleHUDIndicators.sqf b/addons/medical_feedback/functions/fnc_handleHUDIndicators.sqf index 5579c62110..0f065c6d34 100644 --- a/addons/medical_feedback/functions/fnc_handleHUDIndicators.sqf +++ b/addons/medical_feedback/functions/fnc_handleHUDIndicators.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 10Dozen * Handles indication of the fractures, applied tourniquets and splints over Stance indicator. diff --git a/addons/medical_feedback/functions/fnc_initEffects.sqf b/addons/medical_feedback/functions/fnc_initEffects.sqf index eb2dc31f8b..ccaaffa976 100644 --- a/addons/medical_feedback/functions/fnc_initEffects.sqf +++ b/addons/medical_feedback/functions/fnc_initEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Initializes visual effects of medical. diff --git a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf index 44f60b496f..c278e6e08a 100644 --- a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf +++ b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Play random injured sound for a unit. The sound is broadcasted across MP. diff --git a/addons/medical_feedback/functions/script_component.hpp b/addons/medical_feedback/functions/script_component.hpp deleted file mode 100644 index ff9d04881c..0000000000 --- a/addons/medical_feedback/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_feedback\script_component.hpp" diff --git a/addons/medical_feedback/stringtable.xml b/addons/medical_feedback/stringtable.xml index bf24005976..b6f433d399 100644 --- a/addons/medical_feedback/stringtable.xml +++ b/addons/medical_feedback/stringtable.xml @@ -3,17 +3,19 @@ Feedback - Feedback - 感触 + Rückmeldung + フィードバック Реакция на ранения Réaction aux blessures Reação a Lesões 視覺回饋 + 受伤反应 Commenti Zpětná vazba Informacje Zwrotne Reacción Geri Bildirim + 피드백 Pain Effect Type @@ -26,24 +28,27 @@ 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 @@ -53,11 +58,13 @@ 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 @@ -67,11 +74,13 @@ Pulsations floues Borrão Pulsante 脈動模糊 + 脉冲式模糊 Sfocatura pulsante Pulzující rozmazání Pulsujące rozmycie Enborronamiento pulsante Titreşimli Bulanıklık + 두근대는 흐려짐 Chromatic Aberration @@ -84,7 +93,7 @@ Kromatikus aberráció Chromatická aberace Aberração cromática - 色の収差 + 色収差 색수차 色差 色差 @@ -92,8 +101,9 @@ Only high pain effect - 強い痛みの時のみ + 強い痛み効果のみ 只有在強烈疼痛時使用 + 仅在剧烈疼痛下启用 Juste un fort effet douloureux Solo elevato effetto di dolore Pouze efekt vysoké bolesti @@ -103,26 +113,33 @@ 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 Düşük Kan Efekt Türü Tipo de efecto por volumen bajo de sangre + Effektart für "Niedriges Blutvolumen" + 低血容量影响类型 + 혈액량 부족 시 효과 종류 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. Kullanılan düşük kan hacmi efekt türünü seçer. Selecciona el tipo de efecto a causa de un volumen bajo de sangre. + Wählt die verwendete Effektart für niedriges Blutvolumen. + 选择低血容量下的效果类型。 + 혈액량이 부족할 때 어떤 효과로 나타낼지 결정합니다. Color Fading @@ -133,6 +150,9 @@ Zanikanie kolorów Renk Soldurma Atenuación del color + Farbverblassen + 褪色 + 색바램 Icon @@ -143,6 +163,9 @@ Ikona Simge Icono + Symbol + 图标 + 아이콘 Icon + Color Fading @@ -153,11 +176,14 @@ Ikona + Zanikanie kolorów Simge + Renk Soldurma Icono + Atenuación del color + Symbol + Farbverblassen + 图标+褪色 + 아이콘 및 색바램 Enable Screams - Включить крики + Вкл. крики Aktywuj wrzaski Activar gritos Schreie aktivieren @@ -168,7 +194,7 @@ Abilita Grida 叫びを有効化 비명 활성화 - 启用尖叫 + 启用惨叫 啟用尖叫 Çığlıkları Etkinleştir @@ -183,21 +209,33 @@ 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 Enable Fracture/Tourniquet/Splint Indicators - Включить индикаторы переломов/жгутов/шин + Вкл. индикаторы переломов/жгутов/шин 骨折/止血帯の表記を有効化 + Indicateurs de fractures/garrots/attelles + Fraktur-/Tourniquet-/Schienen-Indikatoren aktivieren + Włącz wskaźniki złamań/stazy/szyny + 启用骨折/止血带/夹板指示器 + 골절/지혈대/부목 표시 활성화 + Habilitar indicadores de Fractura/Torniquete Enables indicators for fractures and applied tourniquets and splints over the Stance Indicator. Включает индикацию переломов, наложенных шин и жгутов поверх индикатора положения тела. 体勢インジケータに骨折や添え木、止血帯の有無を表示するかどうかを設定できます。 + Affiche des icônes au niveau de l'indicateur de posture, indiquant si le personnage souffre de fractures ou si des garrots ou des attelles sont appliqués. + Aktiviert Indikatoren für Frakturen mit angelegte Tourniquets und Schienen über dem Haltungsindikator. + Włącza wskaźniki złamań oraz założonej staz/szyn przy ikonie stanu postawy + 在姿态指示器上启用骨折、应用止血带和夹板指示器。 + 자세 표시기 옆에 골절, 지혈대, 부목의 여부를 표시합니다. + Habilita los indicadores para fracturas y torniquetes apllicados y férulas sobre el indicador de posición del personaje. diff --git a/addons/medical_gui/CfgUIGrids.hpp b/addons/medical_gui/CfgUIGrids.hpp index b0835fe709..1a7716503f 100644 --- a/addons/medical_gui/CfgUIGrids.hpp +++ b/addons/medical_gui/CfgUIGrids.hpp @@ -5,13 +5,13 @@ class CfgUIGrids { class Variables { GVAR(patientInfo)[] = { { - PATIENT_INFO_IGUI_BASE_X, - PATIENT_INFO_IGUI_BASE_Y, - POS_W(9), - POS_H(20) + QUOTE(PATIENT_INFO_IGUI_BASE_X), + QUOTE(PATIENT_INFO_IGUI_BASE_Y), + QUOTE(POS_W(9)), + QUOTE(POS_H(20)) }, - GUI_GRID_W, - GUI_GRID_H + QUOTE(GUI_GRID_W), + QUOTE(GUI_GRID_H) }; }; }; diff --git a/addons/medical_gui/CfgVehicles.hpp b/addons/medical_gui/CfgVehicles.hpp index f30f9908ce..8abfe9f067 100644 --- a/addons/medical_gui/CfgVehicles.hpp +++ b/addons/medical_gui/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class ACE_Medical { displayName = CSTRING(Medical); condition = QGVAR(enableSelfActions); - exceptions[] = {"isNotInside", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotSwimming"}; statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); runOnHover = 1; icon = QPATHTOF(ui\cross.paa); @@ -38,7 +38,7 @@ class CfgVehicles { }; class ACE_Medical_Radial { displayName = CSTRING(Medical); - condition = QUOTE((GVAR(enableActions) == 1 || {GVAR(enableActions) != 2 && {vehicle _target != _target && {vehicle _target == vehicle _player}}})); + condition = QUOTE((GVAR(enableActions) == 1 || {GVAR(enableActions) != 2 && {!isNull objectParent _target && {objectParent _target isEqualTo objectParent _player}}})); exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); runOnHover = 1; @@ -49,7 +49,7 @@ class CfgVehicles { }; class ACE_LoadPatient { displayName = CSTRING(LoadPatient); - condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {alive _target} && {vehicle _target == _target}); + condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {alive _target} && {isNull objectParent _target} && {(_target call EFUNC(common,nearestVehiclesFreeSeat)) isNotEqualTo []}); exceptions[] = {"isNotDragging", "isNotCarrying"}; statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,loadUnit)); icon = QPATHTOF(ui\cross.paa); @@ -57,7 +57,7 @@ class CfgVehicles { }; class ACE_UnloadPatient { displayName = CSTRING(UnloadPatient); - condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {vehicle _target != _target} && {vehicle _player == _player}); + condition = QUOTE((_target getVariable [ARR_2('ACE_isUnconscious',false)] || {!alive _target}) && {!isNull objectParent _target} && {isNull objectParent _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 index b06e24c2e7..928ec330ed 100644 --- a/addons/medical_gui/InteractionBodyParts.hpp +++ b/addons/medical_gui/InteractionBodyParts.hpp @@ -5,7 +5,7 @@ class ACE_Head { 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)); + modifierFunction = QUOTE([ARR_3(_target,""head"",_this select 3)] call FUNC(modifyAction)); runOnHover = 1; }; class ACE_Torso { @@ -15,7 +15,7 @@ class ACE_Torso { 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)); + modifierFunction = QUOTE([ARR_3(_target,""body"",_this select 3)] call FUNC(modifyAction)); runOnHover = 1; class TriageCard { displayName = CSTRING(Actions_TriageCard); @@ -32,7 +32,7 @@ class ACE_ArmLeft { 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)); + modifierFunction = QUOTE([ARR_3(_target,""leftarm"",_this select 3)] call FUNC(modifyAction)); runOnHover = 1; }; class ACE_ArmRight { @@ -42,7 +42,7 @@ class ACE_ArmRight { 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)); + modifierFunction = QUOTE([ARR_3(_target,""rightarm"",_this select 3)] call FUNC(modifyAction)); runOnHover = 1; }; class ACE_LegLeft { @@ -52,7 +52,7 @@ class ACE_LegLeft { 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)); + modifierFunction = QUOTE([ARR_3(_target,""leftleg"",_this select 3)] call FUNC(modifyAction)); runOnHover = 1; }; class ACE_LegRight { @@ -62,6 +62,6 @@ class ACE_LegRight { 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)); + modifierFunction = QUOTE([ARR_3(_target,""rightleg"",_this select 3)] call FUNC(modifyAction)); runOnHover = 1; }; diff --git a/addons/medical_gui/addon.toml b/addons/medical_gui/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_gui/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_gui/config.cpp b/addons/medical_gui/config.cpp index b09143a6c9..eb3ac27561 100644 --- a/addons/medical_gui/config.cpp +++ b/addons/medical_gui/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -18,3 +25,5 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "gui.hpp" + +#endif diff --git a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf index 541c308ff0..3df89894d2 100644 --- a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf +++ b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, mharis001 * Creates actions for treatments from config and adds them to the interaction menu. diff --git a/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf index 71c40bc2ae..acc2181aac 100644 --- a/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf +++ b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: ShackTac, SilentSpike + * Author: ShackTac, kymckay * Converts a blood loss value into a representative RGBA colour. * * Arguments: diff --git a/addons/medical_gui/functions/fnc_canOpenMenu.sqf b/addons/medical_gui/functions/fnc_canOpenMenu.sqf index f94c73bb9e..f89ee64031 100644 --- a/addons/medical_gui/functions/fnc_canOpenMenu.sqf +++ b/addons/medical_gui/functions/fnc_canOpenMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Checks if the player can open the Medical Menu for the target. diff --git a/addons/medical_gui/functions/fnc_collectActions.sqf b/addons/medical_gui/functions/fnc_collectActions.sqf index cfc5dc5a03..7a9902ad71 100644 --- a/addons/medical_gui/functions/fnc_collectActions.sqf +++ b/addons/medical_gui/functions/fnc_collectActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Collect treatment actions for medical menu from config. @@ -48,3 +48,8 @@ if ("ace_dragging" call EFUNC(common,isModLoaded)) then { } ]; }; + +// testing code for multi-line +// for "_i" from 0 to 12 do { +// GVAR(actions) pushBack [format ["Example %1", _i], "medication", {true}, compile format ['systemChat "%1"', _i]] +// }; diff --git a/addons/medical_gui/functions/fnc_damageToRGBA.sqf b/addons/medical_gui/functions/fnc_damageToRGBA.sqf index 236b8a8f98..56bd9a256f 100644 --- a/addons/medical_gui/functions/fnc_damageToRGBA.sqf +++ b/addons/medical_gui/functions/fnc_damageToRGBA.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: ShackTac, SilentSpike + * Author: ShackTac, kymckay * Converts a damage value into a representative RGBA colour. * * Arguments: diff --git a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf index ac76d34012..07294f1218 100644 --- a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Opens the patient information display for given target. diff --git a/addons/medical_gui/functions/fnc_displayTriageCard.sqf b/addons/medical_gui/functions/fnc_displayTriageCard.sqf index 3a7f8c4adf..75db6bf6a3 100644 --- a/addons/medical_gui/functions/fnc_displayTriageCard.sqf +++ b/addons/medical_gui/functions/fnc_displayTriageCard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Displays the triage card for the target. diff --git a/addons/medical_gui/functions/fnc_handleToggle.sqf b/addons/medical_gui/functions/fnc_handleToggle.sqf index c2634affdb..5ec0f8d7d0 100644 --- a/addons/medical_gui/functions/fnc_handleToggle.sqf +++ b/addons/medical_gui/functions/fnc_handleToggle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles toggling of Medical Menu between the player and previous target. diff --git a/addons/medical_gui/functions/fnc_handleTriageSelect.sqf b/addons/medical_gui/functions/fnc_handleTriageSelect.sqf index 31a25e18ee..2c28aaded3 100644 --- a/addons/medical_gui/functions/fnc_handleTriageSelect.sqf +++ b/addons/medical_gui/functions/fnc_handleTriageSelect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles clicking the triage select buttons. diff --git a/addons/medical_gui/functions/fnc_menuPFH.sqf b/addons/medical_gui/functions/fnc_menuPFH.sqf index c2dc7a277f..53d6545a52 100644 --- a/addons/medical_gui/functions/fnc_menuPFH.sqf +++ b/addons/medical_gui/functions/fnc_menuPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Handles updating the Medical Menu UI for the current target. diff --git a/addons/medical_gui/functions/fnc_modifyAction.sqf b/addons/medical_gui/functions/fnc_modifyAction.sqf index 422c73a475..177eb4e091 100644 --- a/addons/medical_gui/functions/fnc_modifyAction.sqf +++ b/addons/medical_gui/functions/fnc_modifyAction.sqf @@ -1,36 +1,34 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: esteldunedain, SilentSpike, mharis001 + * Author: esteldunedain, kymckay, mharis001 * Modifies the medical action icons to show blood loss and tourniquets. * * Arguments: * 0: Unit - * 1: Body part index + * 1: Body part * 2: Action data * * Return Value: * None * * Example: - * [_target, 0, _actionData] call ace_medical_gui_fnc_modifyAction + * [_target, "head", _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"]; +params ["_target", "_bodyPart", "_actionData"]; +private _partIndex = ALL_BODY_PARTS find _bodyPart; 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); + _x params ["", "_amountOf", "_bleeding"]; + _bloodLossOnBodyPart = _bloodLossOnBodyPart + (_amountOf * _bleeding); +} forEach (GET_OPEN_WOUNDS(_target) getOrDefault [_bodyPart, []]); 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 diff --git a/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf b/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf index 1d07f79de2..b8cca898f2 100644 --- a/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf +++ b/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Brett Mayson * Modifies the action color to match the triage level. diff --git a/addons/medical_gui/functions/fnc_onMenuClose.sqf b/addons/medical_gui/functions/fnc_onMenuClose.sqf index a531eca4e8..01165d8479 100644 --- a/addons/medical_gui/functions/fnc_onMenuClose.sqf +++ b/addons/medical_gui/functions/fnc_onMenuClose.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas * Handles closing the Medical Menu. Called from onUnload event. diff --git a/addons/medical_gui/functions/fnc_onMenuOpen.sqf b/addons/medical_gui/functions/fnc_onMenuOpen.sqf index b6c326f590..bdf5ea9b06 100644 --- a/addons/medical_gui/functions/fnc_onMenuOpen.sqf +++ b/addons/medical_gui/functions/fnc_onMenuOpen.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Handles opening the Medical Menu. Called from onLoad event. diff --git a/addons/medical_gui/functions/fnc_openMenu.sqf b/addons/medical_gui/functions/fnc_openMenu.sqf index cd8f71274c..4c9f21f62a 100644 --- a/addons/medical_gui/functions/fnc_openMenu.sqf +++ b/addons/medical_gui/functions/fnc_openMenu.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Opens the Medical Menu for given target. diff --git a/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf b/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf index 11281692e3..4b9ca1a750 100644 --- a/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf +++ b/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Toggles showing of the triage select buttons. diff --git a/addons/medical_gui/functions/fnc_updateActions.sqf b/addons/medical_gui/functions/fnc_updateActions.sqf index def2466009..43141b9c10 100644 --- a/addons/medical_gui/functions/fnc_updateActions.sqf +++ b/addons/medical_gui/functions/fnc_updateActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Updates the action buttons based currently avaiable treatments. @@ -19,39 +19,45 @@ 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; +private _group = _display displayCtrl IDC_ACTION_BUTTON_GROUP; +private _actionButons = allControls _group; // Handle triage list (no actions shown) private _ctrlTriage = _display displayCtrl IDC_TRIAGE_CARD; private _showTriage = _selectedCategory == "triage"; _ctrlTriage ctrlEnable _showTriage; +_group ctrlEnable !_showTriage; lbClear _ctrlTriage; if (_showTriage) exitWith { + { ctrlDelete _x } forEach _actionButons; [_ctrlTriage, GVAR(target)] call FUNC(updateTriageCard); }; // Show treatment options on action buttons -private _idcIndex = 0; - +private _shownIndex = 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); + private _ctrl = if (_shownIndex >= count _actionButons) then { + _actionButons pushBack (_display ctrlCreate ["ACE_Medical_Menu_ActionButton", -1, _group]); + }; + _ctrl = _actionButons # _shownIndex; + _ctrl ctrlRemoveAllEventHandlers "ButtonClick"; + _ctrl ctrlSetPositionY POS_H(1.1 * _shownIndex); + _ctrl ctrlCommit 0; + _ctrl ctrlSetText _displayName; _ctrl ctrlShow true; _ctrl ctrlAddEventHandler ["ButtonClick", _statement]; _ctrl ctrlAddEventHandler ["ButtonClick", {GVAR(pendingReopen) = true}]; - _idcIndex = _idcIndex + 1; + _shownIndex = _shownIndex + 1; }; } forEach GVAR(actions); + +{ ctrlDelete _x } forEach (_actionButons select [_shownIndex, 9999]); diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf index 3a1f756f79..11454e2dfd 100644 --- a/addons/medical_gui/functions/fnc_updateBodyImage.sqf +++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Glowbal, SilentSpike, mharis001 + * Author: Glowbal, kymckay, mharis001 * Updates the body image for given target. * * Arguments: @@ -22,11 +22,15 @@ params ["_ctrlGroup", "_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 _damageThreshold = GET_DAMAGE_THRESHOLD(_target); private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; { - _x params ["", "_bodyPartN", "_amountOf", "_bleeding"]; - _bodyPartBloodLoss set [_bodyPartN, (_bodyPartBloodLoss select _bodyPartN) + (_bleeding * _amountOf)]; + private _partIndex = ALL_BODY_PARTS find _x; + { + _x params ["", "_amountOf", "_bleeding"]; + _bodyPartBloodLoss set [_partIndex, (_bodyPartBloodLoss select _partIndex) + (_bleeding * _amountOf)]; + } forEach _y; } forEach GET_OPEN_WOUNDS(_target); { @@ -67,6 +71,21 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; [_bloodLoss] call FUNC(bloodLossToRGBA); } else { private _damage = _bodyPartDamage select _forEachIndex; + switch (true) do { // torso damage threshold doesn't need scaling + case (_forEachIndex > 3): { // legs: index 4 & 5 + _damageThreshold = LIMPING_DAMAGE_THRESHOLD * 4; + }; + case (_forEachIndex > 1): { // arms: index 2 & 3 + _damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4; + }; + case (_forEachIndex == 0): { // head: index 0 + _damageThreshold = _damageThreshold * 1.25; + }; + default { // torso: index 1 + _damageThreshold = _damageThreshold * 1.5 + }; + }; + _damage = (_damage / _damageThreshold) min 1; [_damage] call FUNC(damageToRGBA); }; diff --git a/addons/medical_gui/functions/fnc_updateCategories.sqf b/addons/medical_gui/functions/fnc_updateCategories.sqf index ac1c068fb7..cf6498924e 100644 --- a/addons/medical_gui/functions/fnc_updateCategories.sqf +++ b/addons/medical_gui/functions/fnc_updateCategories.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Updates the category buttons based currently avaiable treatments. @@ -24,8 +24,17 @@ params ["_display"]; private _enable = GVAR(actions) findIf {_category == _x select 1 && {call (_x select 2)}} > -1; _ctrl ctrlEnable _enable; + private _selectedColor = [ + profileNamespace getVariable ["GUI_BCG_RGB_R", 0.13], + profileNamespace getVariable ["GUI_BCG_RGB_G", 0.54], + profileNamespace getVariable ["GUI_BCG_RGB_B", 0.21], + profileNamespace getVariable ["GUI_BCG_RGB_A", 0.8] + ]; private _color = [[0.4, 0.4, 0.4, 1], [1, 1, 1, 1]] select _enable; + _color = [_color, _selectedColor] select (GVAR(selectedCategory) isEqualTo _category); _ctrl ctrlSetTextColor _color; + _color set [-1, 0.8]; // Mouseover change + _ctrl ctrlSetActiveColor _color; } forEach [ [IDC_EXAMINE, "examine"], [IDC_BANDAGE, "bandage"], diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf index 7e8ed55e40..85c87cec7e 100644 --- a/addons/medical_gui/functions/fnc_updateInjuryList.sqf +++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Updates injury list for given body part for the target. @@ -33,24 +33,63 @@ private _bodyPartName = [ _entries pushBack [localize _bodyPartName, [1, 1, 1, 1]]; +// Damage taken tooltip +if (GVAR(showDamageEntry)) then { + private _bodyPartDamage = (_target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0]]) select _selectionN; + if (_bodyPartDamage > 0) then { + private _damageThreshold = GET_DAMAGE_THRESHOLD(_target); + switch (true) do { + case (_selectionN > 3): { // legs: index 4 & 5 + _damageThreshold = LIMPING_DAMAGE_THRESHOLD * 4; + }; + case (_selectionN > 1): { // arms: index 2 & 3 + _damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4; + }; + case (_selectionN == 0): { // head: index 0 + _damageThreshold = _damageThreshold * 1.25; + }; + default { // torso: index 1 + _damageThreshold = _damageThreshold * 1.5; + }; + }; + _bodyPartDamage = (_bodyPartDamage / _damageThreshold) min 1; + switch (true) do { + case (_bodyPartDamage isEqualTo 1): { + _entries pushBack [localize LSTRING(traumaSustained4), [_bodyPartDamage] call FUNC(damageToRGBA)]; + }; + case (_bodyPartDamage >= 0.75): { + _entries pushBack [localize LSTRING(traumaSustained3), [_bodyPartDamage] call FUNC(damageToRGBA)]; + }; + case (_bodyPartDamage >= 0.5): { + _entries pushBack [localize LSTRING(traumaSustained2), [_bodyPartDamage] call FUNC(damageToRGBA)]; + }; + case (_bodyPartDamage >= 0.25): { + _entries pushBack [localize LSTRING(traumaSustained1), [_bodyPartDamage] call FUNC(damageToRGBA)]; + }; + }; + }; +}; + // 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, 1, 0, 1]]; - }; - case 2: { - _entries pushBack [localize LSTRING(Lost_Blood2), [1, 0.67, 0, 1]]; - }; - case 3: { - _entries pushBack [localize LSTRING(Lost_Blood3), [1, 0.33, 0, 1]]; - }; - case 4: { - _entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]]; +if (GVAR(showBloodlossEntry)) then { + // Give a qualitative description of the blood volume lost + switch (GET_HEMORRHAGE(_target)) do { + case 1: { + _entries pushBack [localize LSTRING(Lost_Blood1), [1, 1, 0, 1]]; + }; + case 2: { + _entries pushBack [localize LSTRING(Lost_Blood2), [1, 0.67, 0, 1]]; + }; + case 3: { + _entries pushBack [localize LSTRING(Lost_Blood3), [1, 0.33, 0, 1]]; + }; + case 4: { + _entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]]; + }; }; }; @@ -76,10 +115,10 @@ 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): { + case (_pain > PAIN_UNCONSCIOUS): { ELSTRING(medical_treatment,Status_SeverePain); }; - case (_pain > 0.1): { + case (_pain > (PAIN_UNCONSCIOUS / 5)): { ELSTRING(medical_treatment,Status_Pain); }; default { @@ -108,13 +147,13 @@ private _fnc_processWounds = { params ["_wounds", "_format", "_color"]; { - _x params ["_woundClassID", "_bodyPartN", "_amountOf"]; + _x params ["_woundClassID", "_amountOf"]; - if (_selectionN == _bodyPartN && {_amountOf > 0}) then { + if (_amountOf > 0) then { private _classIndex = _woundClassID / 10; private _category = _woundClassID % 10; - private _className = EGVAR(medical_damage,woundsData) select _classIndex select 6; + private _className = EGVAR(medical_damage,woundClassNames) select _classIndex; private _suffix = ["Minor", "Medium", "Large"] select _category; private _woundName = localize format [ELSTRING(medical_damage,%1_%2), _className, _suffix]; @@ -126,7 +165,7 @@ private _fnc_processWounds = { _woundEntries pushBack [format [_format, _woundDescription], _color]; }; - } forEach _wounds; + } forEach (_wounds getOrDefault [ALL_BODY_PARTS select _selectionN, []]); }; [GET_OPEN_WOUNDS(_target), "%1", [1, 1, 1, 1]] call _fnc_processWounds; diff --git a/addons/medical_gui/functions/fnc_updateLogList.sqf b/addons/medical_gui/functions/fnc_updateLogList.sqf index fb83640698..d2bb75b63f 100644 --- a/addons/medical_gui/functions/fnc_updateLogList.sqf +++ b/addons/medical_gui/functions/fnc_updateLogList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Updates list control with given logs. diff --git a/addons/medical_gui/functions/fnc_updateTriageCard.sqf b/addons/medical_gui/functions/fnc_updateTriageCard.sqf index b4e1977d42..40bd196c66 100644 --- a/addons/medical_gui/functions/fnc_updateTriageCard.sqf +++ b/addons/medical_gui/functions/fnc_updateTriageCard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Updates the triage card for the given target. diff --git a/addons/medical_gui/functions/fnc_updateTriageStatus.sqf b/addons/medical_gui/functions/fnc_updateTriageStatus.sqf index 9a50e4f6c0..0ec694409a 100644 --- a/addons/medical_gui/functions/fnc_updateTriageStatus.sqf +++ b/addons/medical_gui/functions/fnc_updateTriageStatus.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Updates the triage status control for the given target. diff --git a/addons/medical_gui/functions/script_component.hpp b/addons/medical_gui/functions/script_component.hpp deleted file mode 100644 index d2302a9920..0000000000 --- a/addons/medical_gui/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_gui\script_component.hpp" diff --git a/addons/medical_gui/gui.hpp b/addons/medical_gui/gui.hpp index 6aa6c7d354..e0f836f058 100644 --- a/addons/medical_gui/gui.hpp +++ b/addons/medical_gui/gui.hpp @@ -4,22 +4,23 @@ class RscPicture; class RscListBox; class RscActivePicture; class RscButtonMenu; +class RscControlsGroup; 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); + x = QUOTE(POS_X(13.33)); + y = QUOTE(POS_Y(2.73)); + w = QUOTE(POS_W(12.33)); + h = QUOTE(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); + w = QUOTE(POS_W(12.33)); + h = QUOTE(POS_H(12.33)); }; class Head: Background { idc = IDC_BODY_HEAD; @@ -87,10 +88,10 @@ class GVAR(BodyImage): RscControlsGroupNoScrollbars { 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); + x = QUOTE(POS_X(13.33)); + y = QUOTE(POS_Y(15.5)); + w = QUOTE(POS_W(12.33)); + h = QUOTE(POS_H(1.1)); colorFocused[] = {0, 0, 0, 0}; colorBackground[] = {0, 0, 0, 0}; colorBackgroundActive[] = {0, 0, 0, 0}; @@ -98,10 +99,10 @@ class GVAR(TriageToggle): RscButton { 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); + x = QUOTE(POS_X(13.33)); + y = QUOTE(POS_Y(16.6)); + w = QUOTE(POS_W(12.33)); + h = QUOTE(POS_H(5.5)); class controls { class None: RscButton { idc = -1; @@ -110,8 +111,8 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { text = ECSTRING(medical_treatment,Triage_Status_None); x = 0; y = 0; - w = POS_W(12.33); - h = POS_H(1.1); + w = QUOTE(POS_W(12.33)); + h = QUOTE(POS_H(1.1)); shadow = 0; colorText[] = {TRIAGE_TEXT_COLOR_NONE}; colorFocused[] = {TRIAGE_COLOR_NONE}; @@ -121,7 +122,7 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { 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); + y = QUOTE(POS_H(1.1)); colorText[] = {TRIAGE_TEXT_COLOR_MINIMAL}; colorFocused[] = {TRIAGE_COLOR_MINIMAL}; colorBackground[] = {TRIAGE_COLOR_MINIMAL}; @@ -130,7 +131,7 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { 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); + y = QUOTE(POS_H(2.2)); colorText[] = {TRIAGE_TEXT_COLOR_DELAYED}; colorFocused[] = {TRIAGE_COLOR_DELAYED}; colorBackground[] = {TRIAGE_COLOR_DELAYED}; @@ -139,7 +140,7 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { 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); + y = QUOTE(POS_H(3.3)); colorText[] = {TRIAGE_TEXT_COLOR_IMMEDIATE}; colorFocused[] = {TRIAGE_COLOR_IMMEDIATE}; colorBackground[] = {TRIAGE_COLOR_IMMEDIATE}; @@ -148,7 +149,7 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { 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); + y = QUOTE(POS_H(4.4)); colorText[] = {TRIAGE_TEXT_COLOR_DECEASED}; colorFocused[] = {TRIAGE_COLOR_DECEASED}; colorBackground[] = {TRIAGE_COLOR_DECEASED}; @@ -157,6 +158,22 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { }; }; +class ACE_Medical_Menu_ActionButton: RscButtonMenu { + idc = -1; + style = ST_LEFT; + x = 0; + y = 0; + w = QUOTE(POS_W(11.833)); + h = QUOTE(POS_H(1)); + size = QUOTE(POS_H(0.9)); + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; +}; + class ACE_Medical_Menu { idd = IDD_MEDICAL_MENU; movingEnable = 1; @@ -166,24 +183,24 @@ class ACE_Medical_Menu { class controlsBackground { class Title: RscText { idc = IDC_TITLE; - x = POS_X(1); - y = POS_Y(0); - w = POS_W(38); - h = POS_H(1); + x = QUOTE(POS_X(1)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(38)); + h = QUOTE(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); + x = QUOTE(POS_X(1)); + y = QUOTE(POS_Y(1.1)); + w = QUOTE(POS_W(38)); + h = QUOTE(POS_H(16)); colorBackground[] = {0, 0, 0, 0.7}; }; class Bottom: Center { - y = POS_Y(17.6); - h = POS_H(9); + y = QUOTE(POS_Y(17.6)); + h = QUOTE(POS_H(9)); }; }; class controls { @@ -191,27 +208,27 @@ class ACE_Medical_Menu { 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); + x = QUOTE(POS_X(1)); + y = QUOTE(POS_Y(1.5)); + w = QUOTE(POS_W(12.33)); + h = QUOTE(POS_H(1)); + sizeEx = QUOTE(POS_H(1.2)); colorText[] = {1, 1, 1, 0.9}; }; class StatusHeader: TreatmentHeader { text = CSTRING(STATUS); - x = POS_X(13.33); + x = QUOTE(POS_X(13.33)); }; class OverviewHeader: TreatmentHeader { text = CSTRING(OVERVIEW); - x = POS_X(25.66); + x = QUOTE(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); + x = QUOTE(POS_X(1.5)); + y = QUOTE(POS_Y(2.6)); + w = QUOTE(POS_W(37)); + h = QUOTE(POS_H(0.03)); colorBackground[] = {1, 1, 1, 0.5}; }; class Triage: RscActivePicture { @@ -219,11 +236,12 @@ class ACE_Medical_Menu { 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); + x = QUOTE(POS_X(1.5)); + y = QUOTE(POS_Y(2.73)); + w = QUOTE(POS_W(1.5)); + h = QUOTE(POS_H(1.5)); color[] = {1, 1, 1, 1}; + colorActive[] = {1, 1, 1, 0.8}; 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}; @@ -234,57 +252,57 @@ class ACE_Medical_Menu { onButtonClick = QUOTE(GVAR(selectedCategory) = 'examine'); text = QPATHTOF(data\categories\examine_patient.paa); tooltip = CSTRING(ExaminePatient); - x = POS_X(3); + x = QUOTE(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); + x = QUOTE(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); + x = QUOTE(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); + x = QUOTE(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); + x = QUOTE(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); + x = QUOTE(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); + x = QUOTE(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); + x = QUOTE(POS_X(1.5)); + y = QUOTE(POS_Y(4.4)); + w = QUOTE(POS_W(11.833)); + h = QUOTE(POS_H(10)); + sizeEx = QUOTE(POS_H(0.7)); colorSelect[] = {1, 1, 1, 1}; colorSelect2[] = {1, 1, 1, 1}; colorBackground[] = {0, 0, 0, 0.2}; @@ -292,62 +310,22 @@ class ACE_Medical_Menu { 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 ActionButtonGroup: RscControlsGroup { + idc = IDC_ACTION_BUTTON_GROUP; + x = QUOTE(POS_X(1.5)); + y = QUOTE(POS_Y(4.4)); + w = QUOTE(POS_W(11.833)); + h = QUOTE(POS_H(10)); }; 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); + x = QUOTE(POS_X(18.8)); + y = QUOTE(POS_Y(3.2)); + w = QUOTE(POS_W(1.4)); + h = QUOTE(POS_H(1.8)); colorFocused[] = {0, 0, 0, 0}; colorBackground[] = {0, 0, 0, 0}; colorBackgroundActive[] = {0, 0, 0, 0}; @@ -355,75 +333,75 @@ class ACE_Medical_Menu { 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); + x = QUOTE(POS_X(18.4)); + y = QUOTE(POS_Y(5)); + w = QUOTE(POS_W(2.2)); + h = QUOTE(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); + x = QUOTE(POS_X(20.6)); + y = QUOTE(POS_Y(5.1)); + w = QUOTE(POS_W(1.1)); + h = QUOTE(POS_H(4.6)); }; class SelectArmRight: SelectArmLeft { onButtonClick = QUOTE(GVAR(selectedBodyPart) = 3); tooltip = CSTRING(SelectRightArm); - x = POS_X(17.4); + x = QUOTE(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); + x = QUOTE(POS_X(19.5)); + y = QUOTE(POS_Y(8.8)); + w = QUOTE(POS_W(1.1)); + h = QUOTE(POS_H(5.8)); }; class SelectLegRight: SelectLegLeft { onButtonClick = QUOTE(GVAR(selectedBodyPart) = 5); tooltip = CSTRING(SelectRightLeg); - x = POS_X(18.4); + x = QUOTE(POS_X(18.4)); }; class Injuries: TriageCard { idc = IDC_INJURIES; - x = POS_X(25.66); - w = POS_W(12.33); + x = QUOTE(POS_X(25.66)); + w = QUOTE(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); + y = QUOTE(POS_Y(17.6)); + w = QUOTE(POS_W(18.5)); + sizeEx = QUOTE(POS_H(1)); colorText[] = {0.6, 0.7, 1, 1}; }; class QuickViewHeader: ActivityHeader { text = CSTRING(QUICK_VIEW); - x = POS_X(19.5); + x = QUOTE(POS_X(19.5)); }; class LowerLine: HeaderLine { - y = POS_Y(18.5); + y = QUOTE(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); + x = QUOTE(POS_X(1.5)); + y = QUOTE(POS_Y(18.5)); + w = QUOTE(POS_W(18.5)); + h = QUOTE(POS_H(6.5)); colorBackground[] = {0, 0, 0, 0}; }; class QuickView: Activity { idc = IDC_QUICKVIEW; - x = POS_X(21.5); + x = QUOTE(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); + x = QUOTE(POS_X(13.33)); + y = QUOTE(POS_Y(15.5)); + w = QUOTE(POS_W(12.33)); + h = QUOTE(POS_H(1.1)); shadow = 0; }; class TriageToggle: GVAR(TriageToggle) {}; @@ -438,45 +416,45 @@ class GVAR(RscTriageCard) { class controls { class Background: RscText { idc = -1; - x = POS_X(12.5); - y = POS_Y(0); - w = POS_W(15); - h = POS_H(19); + x = QUOTE(POS_X(12.5)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(15)); + h = QUOTE(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); + x = QUOTE(POS_X(12.5)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(5)); + h = QUOTE(POS_H(5)); colorText[] = {1, 1, 0, 1}; }; class CornerRight: CornerLeft { text = QPATHTOF(data\triage_card\corner_right.paa); - x = POS_X(22.5); + x = QUOTE(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); + x = QUOTE(POS_X(12.5)); + y = QUOTE(POS_Y(3)); + w = QUOTE(POS_W(15)); + h = QUOTE(POS_H(0.9)); + sizeEx = QUOTE(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); + x = QUOTE(POS_X(13.5)); + y = QUOTE(POS_Y(5)); + w = QUOTE(POS_W(13)); + h = QUOTE(POS_H(13)); + sizeEx = QUOTE(POS_H(0.7)); colorText[] = {0, 0, 0, 1}; colorSelect[] = {0, 0, 0, 1}; colorSelect2[] = {0, 0, 0, 1}; @@ -488,36 +466,36 @@ class GVAR(RscTriageCard) { 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); + x = QUOTE(POS_X(12.5)); + y = QUOTE(POS_Y(19)); + w = QUOTE(POS_W(15)); + h = QUOTE(POS_H(1.1)); shadow = 0; }; class TriageToggle: GVAR(TriageToggle) { - x = POS_X(12.5); - y = POS_Y(19); - w = POS_W(15); + x = QUOTE(POS_X(12.5)); + y = QUOTE(POS_Y(19)); + w = QUOTE(POS_W(15)); }; class TriageSelect: GVAR(TriageSelect) { - x = POS_X(12.5); - y = POS_Y(20); - w = POS_W(15); + x = QUOTE(POS_X(12.5)); + y = QUOTE(POS_Y(20)); + w = QUOTE(POS_W(15)); class controls: controls { class None: None { - w = POS_W(15); + w = QUOTE(POS_W(15)); }; class Minimal: Minimal { - w = POS_W(15); + w = QUOTE(POS_W(15)); }; class Delayed: Delayed { - w = POS_W(15); + w = QUOTE(POS_W(15)); }; class Immediate: Immediate { - w = POS_W(15); + w = QUOTE(POS_W(15)); }; class Deceased: Deceased { - w = POS_W(15); + w = QUOTE(POS_W(15)); }; }; }; @@ -535,96 +513,96 @@ class RscTitles { 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; + x = QUOTE(safeZoneX + PATIENT_INFO_IGUI_OFFSET_X); + y = QUOTE(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); + x = QUOTE(POS_W(2.25)); + y = QUOTE(POS_H(1.5)); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); class controls: controls { class Background: Background { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class Head: Head { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class Torso: Torso { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class ArmLeft: ArmLeft { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class ArmRight: ArmRight { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class LegLeft: LegLeft { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class LegRight: LegRight { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class ArmLeftB: ArmLeftB { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class ArmRightB: ArmRightB { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class LegLeftB: LegLeftB { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class LegRightB: LegRightB { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class ArmLeftT: ArmLeftT { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class ArmRightT: ArmRightT { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class LegLeftT: LegLeftT { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(POS_H(8.5)); }; class LegRightT: LegRightT { - w = POS_W(8.5); - h = POS_H(8.5); + w = QUOTE(POS_W(8.5)); + h = QUOTE(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); + x = QUOTE(POS_W(2)); + y = QUOTE(POS_H(10.2)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(0.7)); + sizeEx = QUOTE(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); + x = QUOTE(POS_W(2)); + y = QUOTE(POS_H(11)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(9)); + sizeEx = QUOTE(POS_H(0.7)); colorSelect[] = {1, 1, 1, 1}; colorSelect2[] = {1, 1, 1, 1}; colorBackground[] = {0, 0, 0, 0.2}; @@ -634,19 +612,19 @@ class RscTitles { }; 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); + x = QUOTE(POS_W(2)); + y = QUOTE(POS_H(20.2)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(0.7)); + sizeEx = QUOTE(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); + x = QUOTE(POS_W(1.75)); + y = QUOTE(POS_H(21)); + w = QUOTE(POS_W(15)); + h = QUOTE(POS_H(7)); shadow = 2; colorBackground[] = {0, 0, 0, 0}; }; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf index 16d0bdc4a9..c1d02d7131 100644 --- a/addons/medical_gui/initSettings.sqf +++ b/addons/medical_gui/initSettings.sqf @@ -86,12 +86,13 @@ private _damageColors = [ [0.00, 0.00, 1.00, 1] ]; +private _categoryColors = [ELSTRING(medical,Category), format ["| %1 |", LELSTRING(common,subcategory_colors)]]; { [ - format ["%1_%2", QGVAR(bloodLossColor), _forEachIndex], + format ["%1_%2", QGVAR(bloodLossColor), _forEachIndex], "COLOR", [format [localize LSTRING(BloodLossColorX_DisplayName), _forEachIndex], LSTRING(BloodLossColor_Description)], - [ELSTRING(medical,Category), LSTRING(BloodLossColors)], + _categoryColors, _x, false // isGlobal ] call CBA_fnc_addSetting; @@ -102,8 +103,26 @@ private _damageColors = [ format ["%1_%2", QGVAR(damageColor), _forEachIndex], "COLOR", [format [localize LSTRING(DamageColorX_DisplayName), _forEachIndex], LSTRING(DamageColor_Description)], - [ELSTRING(medical,Category), LSTRING(DamageColors)], + _categoryColors, _x, false // isGlobal ] call CBA_fnc_addSetting; } forEach _damageColors; + +[ + QGVAR(showDamageEntry), + "CHECKBOX", + [LSTRING(showDamageEntry_DisplayName), LSTRING(showDamageEntry_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + false, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(showBloodlossEntry), + "CHECKBOX", + [LSTRING(ShowBloodlossEntry_DisplayName), LSTRING(ShowBloodlossEntry_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp index 48382ed6fa..62c38447ee 100644 --- a/addons/medical_gui/script_component.hpp +++ b/addons/medical_gui/script_component.hpp @@ -51,17 +51,7 @@ #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_ACTION_BUTTON_GROUP 1599 #define IDC_BODY_GROUP 6000 #define IDC_BODY_HEAD 6005 diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index a4d3a67c45..a8b1a69241 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -8,26 +8,30 @@ Медицинский интерфейс GUI 界面 + 界面 GUI GUI Graficzny Interfejs Użytkownika Interfaz gráfica GUI Graphische Benutzeroberfläche + GUI 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. @@ -37,11 +41,13 @@ 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. Etkileşim Menüsü için tıbbi eylemleri etkinleştirir ve stillerini seçer. + 상호작용 메뉴에서 의료 행동을 하는 것을 허락합니다. Selections (3D) @@ -56,7 +62,7 @@ Selezione (3D) 選択 (3D) 선택 (3d) - 选择 (3D) + 选择(3D) 選擇 (3D) Seçimler (3D) @@ -80,16 +86,18 @@ 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. @@ -99,11 +107,13 @@ 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 Kişisel Etkileşim Menüsü için tıbbi eylemleri etkinleştirir. + 자기 상호작용 메뉴에서 의료 행동을 하는 것을 허락합니다. Enable Medical Menu @@ -113,11 +123,13 @@ 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. @@ -127,39 +139,45 @@ 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 Medikal Menünün bir tuşla veya etkileşim menüsü aracılığıyla kullanılmasını sağlar. + 단축키나 상호작용을 통해 의료 메뉴를 활성화 할지 정합니다. 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 Medikal Menüyü Yeniden Aç + 의료 메뉴 다시 열기 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 Başarılı bir tedaviden sonra Tıbbi Menüyü yeniden açın. + 성공적으로 치료한 뒤 의료 메뉴를 다시 열지 결정합니다. Maximum Distance @@ -169,11 +187,13 @@ Distance maximale Distância Máxima 最大醫療距離 + 最大医疗距离 Massima distanza Maximální vzdálenost Maksymalny dystans Distancia máxima Maksimum Mesafe + 최대 거리 Maximum distance from which the Medical Menu can be opened. @@ -183,11 +203,13 @@ 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 Tıbbi Menünün açılabileceği maksimum mesafe. + 의료 메뉴를 열 수 있는 최대 거리를 지정합니다. Show Triage Level in Interaction Menu @@ -196,6 +218,9 @@ Mostrar nivel de triado en menú de interacción Показывать группу триажа в меню взаимодействий Pokaż poziom Triażu w menu interakcji + Zeige Triage-Einstufung im Interaktionsmenü + 在交互式菜单中显示分诊级别 + 상호작용 메뉴에서 부상자 카드 보기 Shows the patient's triage level by changing the color of the main and medical menu actions. @@ -204,6 +229,9 @@ Mostrar el nivel de triado en el paciente cambiando el color de acciones de menú principales y médicas Отображает установленную группу карты медицинской сортировки (триажа), изменяя цвет действий основного и медицинского меню. Pokazuje poziom Triażu pacjenta poprzez zmianę koloru ikony w menu interakcji. + Zeigt die Triage-Einstufung des Patienten durch Ändern der Farbe der Aktionen des Hauptmenüs und des medizinischen Menüs an. + 通过改变主菜单和医疗菜单动作的颜色来显示伤员的分诊级别。 + 환자의 부상자 카드를 상호작용에서 볼 수 있게 합니다. Medical @@ -330,7 +358,7 @@ VISÃO GERAL PŘEHLED PANORAMICA - オーバービュー + 概況 개요 总览 概述 @@ -362,7 +390,7 @@ VISÃO RÁPIDA RYCHLÝ NÁHLED VISTA RAPIDA - クイック ビュー + 簡易概況 퀵 뷰 快速检查 快速檢查 @@ -395,7 +423,7 @@ Ver cartão de triagem Zkontrolovat štítek Guarda Triage Card - トリアージ カードを見る + トリアージカードを見る 부상자 카드 보기 查看分诊卡 查看診斷卡 @@ -411,7 +439,7 @@ Examinar paciente Zkontrolovat pacienta Esamina Paziente - 患者を調べる + 患者の診察 환자 검사하기 检查伤员 檢查傷者 @@ -429,7 +457,7 @@ Bendaggi/Fratture 包帯 / 骨折 붕대 / 골절 - 包扎 / 骨折 + 包扎/骨折 繃帶 / 骨折 Bandaj / Kırıklar @@ -443,7 +471,7 @@ Medicação Léky Medicazione - 薬物による治療 + 投薬 약물 치료 药物 藥物 @@ -459,7 +487,7 @@ Dýchací systém Gestione Vie Respiratorie Atemwegssicherung - 気道を確保 + 気道管理 기도 관리 呼吸道管理 呼吸道管理 @@ -493,7 +521,7 @@ Trascina / Trasporta 引きずる / 担ぐ 끌기 / 들기 - 拖 / 背 + 拖/背 拖 / 背 Sürükle / Taşı @@ -509,7 +537,7 @@ Attiva (Te Stesso) 切り替え (自分) 토글 (자신) - 切换 (自己) + 切换(自己) 切換 (自己) Değiştir (Şahsi) @@ -520,7 +548,7 @@ Cabeza Tête Głowa - Caebça + Cabeça Hlava Testa 頭部 @@ -556,7 +584,7 @@ Levá Ruka Braccio Sinistro 左腕 - 왼쪽 팔 + 왼팔 左臂 左手 Sol Kol @@ -572,7 +600,7 @@ Pravá Ruka Braccio Destro 右腕 - 오른쪽 팔 + 오른팔 右臂 右手 Sağ Kol @@ -588,7 +616,7 @@ Levá Noha Gamba Sinistra 左足 - 왼쪽 다리 + 왼다리 左腿 左腳 Sol Bacak @@ -604,7 +632,7 @@ Pravá Noha Gamba Destra 右足 - 오른쪽 다리 + 오른다리 右腿 右腳 Sağ Bacak @@ -652,7 +680,7 @@ Vybrat Levou ruku Seleziona Braccio Sinistro 左腕を選ぶ - 왼쪽 팔 선택 + 왼팔 선택 选择左臂 選擇左手 Sol Kolu Seç @@ -668,7 +696,7 @@ Vybrat Pravou ruku Seleziona Braccio Destro 右腕を選ぶ - 오른쪽 팔 선택 + 오른팔 선택 选择右臂 選擇右手 Sağ Kolu Seç @@ -684,7 +712,7 @@ Vybrat Levou nohu Seleziona Gamba Sinistra 左足を選ぶ - 왼쪽 다리 선택 + 왼다리 선택 选择左腿 選擇左腳 Sol Bacağı Seç @@ -700,7 +728,7 @@ Vybrat Pravou nohu Seleziona Gamba Destra 右足を選ぶ - 오른쪽 다리 선택 + 오른다리 선택 选择右腿 選擇右腳 Sağ Bacağı Seç @@ -716,7 +744,7 @@ Malý Piccolo 小さい - + 작은 Küçük @@ -732,7 +760,7 @@ Střední Medio 中くらい - + 중간의 Orta @@ -748,7 +776,7 @@ Velký Grande 大きい - + Büyük @@ -859,7 +887,7 @@ Respiração normal Normální dýchání Respirazione Normale - 通常の呼吸 + 正常な呼吸 정상 호흡 呼吸正常 正常呼吸 @@ -875,7 +903,7 @@ Sem respiração Nedýchá Nessuna Respirazione - 息をしていない + 呼吸していない 호흡이 없음 没有呼吸 沒有呼吸 @@ -891,7 +919,7 @@ Dificuldade para respirar Potíže s dýcháním Difficoltà Respiratorie - 呼吸が難しそうだ + 呼吸が厳しそうだ 호흡 곤란 呼吸困难 呼吸困難 @@ -974,6 +1002,8 @@ Fracturada 骨折 Kırık + Gebrochen + 골절됨 Splint Applied @@ -988,6 +1018,8 @@ Tablilla aplicada 已用夹板固定 Atel Uygulandı + Schiene angelegt + 부목 적용함 @@ -1004,6 +1036,7 @@ Algo de sangre perdida Az kan kaybı var 轻微失血 + 피를 조금 잃음 Lost a lot of blood @@ -1017,7 +1050,7 @@ Ha perso parecchio sangue Perdeu muito sangue 大量失血した - 많은 양의 혈액을 잃음 + 피를 꽤 잃음 大量失血 大量失血中 Çok fazla kan kaybı var @@ -1036,6 +1069,7 @@ Perdida gran cantidad de sangre Çok miktarda kan kaybetti 严重失血 + 피를 많이 잃음 Lost a fatal amount of blood @@ -1051,6 +1085,7 @@ Perdida una cantidad fatal de sangre Ölümcül miktarda kan kaybetti 致命失血 + 피를 심각할 만큼 잃음 Tourniquet [CAT] @@ -1064,7 +1099,7 @@ Laccio Emostatico [CAT] 止血帯 [CAT] 지혈대 [CAT] - 止血带 (军用型) + 止血带(军用型) 軍用止血帶 Turnike [CAT] @@ -1079,7 +1114,7 @@ Nasofaryngeální trubice [NPA] Tubo Nasofaringeo [NPA] 鼻咽頭チューブ [NPA] - 비-인두 기도기 [NPA] + 기관삽입기 [NPA] 鼻咽管 鼻咽管 Nazofarengeal Tüp [NPA] @@ -1103,7 +1138,7 @@ Partial %1 - 部分的な%1 + 部分的な %1 部分 %1 Partiel %1 Parziale %1 @@ -1115,6 +1150,7 @@ Parsiyel %1 Частичное %1 未完全处理的 %1 + 부분 %1 Patient Info @@ -1125,36 +1161,136 @@ 患者情報 Hasta Bilgileri Información de paciente + Patienteninformation + 환자 정보 Blood Loss Colors Цвета кровопотери 失血量カラー + Couleurs des hémorragies + Farben für Blutverlust + Kolory utraty krwi + 失血颜色 + 출혈 색상 + Colores de pérdida de sangre - Blood Loss Colors, That Used in Medical GUI. 10 Color Gradient. + Defines the 10 color gradient used to indicate blood loss in Medical GUIs. Цвета кровопотери, которые используются в Медицинском интерфейсе. Градиент из 10 цветов. 医療 GUI 内で失血量を 10 段階のカラーで表します。 + Couleurs utilisées pour afficher les hémorragies dans l'interface médicale. Dégradé de 10 couleurs. + Farben für Blutverlust, die in dem Medizinischen Menü verwendet werden. 10-Farben Farbverlauf. + Kolory używane do wyświetlania krwawienia w interfejsie medycznym. Gradient 10 kolorów. + 失血颜色,用于医学图形用户界面。10种渐变颜色。 + 출혈로 인한 의료 GUI의 색상을 변경합니다. 총 10가지 색상이 있습니다. + Define los 10 gradientes de color utilizados para indicar la pérdida de sangre en la interfaz gráfica del sistema Médico. Blood Loss Color %1 Цвет кровопотери %1 失血量カラー %1 + Hémorragies - couleur %1 + Blutverlustfarbe %1 + Krwawienie - kolor %1 + 失血颜色 %1 + 출혈 색상 %1 + Color de pérdida de sangre %1 Damage Colors Цвета урона 負傷カラー + Couleur des dégâts + Farben für Schaden + Kolory obrażeń + 负伤颜色 + 피해 색상 + Colores de daño - Damage Colors, That Used in Medical GUI. 10 Color Gradient. + Defines the 10 color gradient used to indicate damage in Medical GUIs. Цвета урона, которые используются в Медицинском интерфейсе. Градиент из 10 цветов. 医療 GUI 内で負傷を 10 段階のカラーで表します。 + Couleurs utilisées pour afficher les dégâts dans l'interface médicale. Dégradé de 10 couleurs. + Farben für Schaden, die in dem medizinischen Menü verwendet werden. 10-Farben Farbverlauf. + Kolory używane do wyświetlania obrażeń w interfejsie medycznym. Gradient 10 kolorów. + 负伤颜色,用于医学图形用户界面。10种渐变颜色。 + 의료 GUI에 쓰이는 피해 색상입니다. 총 10가지 색상이 있습니다. + Define los 10 gradientes de color utilizados para indicar el daño en la interfaz gráfiica del sistema Médico. Damage Color %1 Цвет урона %1 負傷カラー %1 + Dégâts - couleur %1 + Schadensfarbe %1 + Obrażenia - kolor %1 + 负伤颜色 %1 + 피해 색상 %1 + Color de daño %1 + + + Show Blood Loss + Blutverlust anzeigen + 혈액 손실 표시 + Pokaż utratę krwi + 失血量の表示 + 显示失血量 + Показывать кровопотерю + Mostrar pérdida de sangre + + + Show qualitative blood loss in the injury list. + Qualitativen Blutverlust in der Verletzungsliste anzeigen. + 부상 목록에 혈액 손실량을 표시합니다. + Pokaż jakościową utratę krwi na liście ran. + 負傷リストに段階的な失血量を表示します。 + 在负伤列表中显示失血阶段 + Показывать тяжесть кровопотери в списке ранений. + Mostrar la pérdida de sangre cualitativa en la lista de heridas. + + + Show Trauma Sustained + Mostrar Traumatismo Sofrido + 外傷の表示 + Pokaż Doznane Urazy + Zeigen Sie das erlittene Trauma + + + Show trauma sustained in the injury list. + Mostrar traumatismo sofrido na lista de feridas. + 負傷リストに外傷を表示する。 + Pokaż odniesione obrażenia na liście obrażeń. + Zeigen Sie das erlittene Trauma in der Verletzungsliste an. + + + Minor Trauma + Traumatismo Leve + 軽度の外傷 + Niewielki Uraz + Kleineres Trauma + + + Major Trauma + Traumatismo Significante + 中度の外傷 + Poważny Uraz + Großes Trauma + + + Severe Trauma + Traumatismo Severo + 重度の外傷 + Ciężki Uraz + Schweres Trauma + + + Chronic Trauma + Traumatismo Crônico + 慢性的な外傷 + Przewlekły Uraz + Chronisches Trauma diff --git a/addons/medical_statemachine/Statemachine.hpp b/addons/medical_statemachine/Statemachine.hpp index eecb6a236c..39ff12448e 100644 --- a/addons/medical_statemachine/Statemachine.hpp +++ b/addons/medical_statemachine/Statemachine.hpp @@ -43,10 +43,10 @@ class ACE_Medical_StateMachine { }; class Unconscious { onState = QFUNC(handleStateUnconscious); - onStateEntered = QUOTE([ARR_2(_this,true)] call EFUNC(medical_status,setUnconsciousState)); + onStateEntered = QFUNC(enteredStateUnconscious); class DeathAI { targetState = "Dead"; - condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this}); + condition = QUOTE(!(_this getVariable [ARR_2(QQGVAR(AIUnconsciousness), GVAR(AIUnconsciousness))]) && {!isPlayer _this}); }; class WakeUp { targetState = "Injured"; diff --git a/addons/medical_statemachine/XEH_PREP.hpp b/addons/medical_statemachine/XEH_PREP.hpp index 38d0cb573a..df481ae634 100644 --- a/addons/medical_statemachine/XEH_PREP.hpp +++ b/addons/medical_statemachine/XEH_PREP.hpp @@ -4,6 +4,7 @@ PREP(conditionSecondChance); PREP(enteredStateCardiacArrest); PREP(enteredStateDeath); PREP(enteredStateFatalInjury); +PREP(enteredStateUnconscious); PREP(handleStateCardiacArrest); PREP(handleStateDefault); PREP(handleStateInjured); diff --git a/addons/medical_statemachine/addon.toml b/addons/medical_statemachine/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_statemachine/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_statemachine/config.cpp b/addons/medical_statemachine/config.cpp index 23a55f5258..2b396c8b8c 100644 --- a/addons/medical_statemachine/config.cpp +++ b/addons/medical_statemachine/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "Statemachine.hpp" #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf b/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf index b28459db53..1e91e6f54d 100644 --- a/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf +++ b/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Checks if the cardiac arrest timer ran out. diff --git a/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf b/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf index 26ff20c42a..0812e3b74c 100644 --- a/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf +++ b/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Condition for an execution caused death (fatal injury received in cardiac arrest). diff --git a/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf b/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf index 660ea84ac1..432e6ce30f 100644 --- a/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf +++ b/addons/medical_statemachine/functions/fnc_conditionSecondChance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Condition for going into cardiac arrest upon receiving a fatal injury. diff --git a/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf index b2bcde8071..313baf6505 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles a unit entering cardiac arrest (calls for a status update). @@ -17,6 +17,9 @@ */ params ["_unit"]; +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateCardiacArrest: State transition on dead or null unit - %1",_unit); +}; // 10% possible variance in cardiac arrest time private _time = GVAR(cardiacArrestTime); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf index cb6f63c39a..537c356651 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles a unit reaching the point of death (calls for a status update). * * Arguments: @@ -16,12 +16,15 @@ */ params ["_unit"]; -if (isNull _unit) exitWith {}; +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + if ((_unit getVariable [QEGVAR(medical,causeOfDeath), ""]) == "#scripted") exitWith {}; + WARNING_1("enteredStateDeath: State transition on dead or null unit - %1",_unit); +}; //IGNORE_PRIVATE_WARNING ["_thisOrigin", "_thisTransition"]; // vars provided by CBA_statemachine -TRACE_3("enteredStateDeath",_this,_thisOrigin,_thisTransition); +TRACE_4("enteredStateDeath",_this,_thisOrigin,_thisTransition,CBA_missionTime); private _causeOfDeath = format ["%1:%2", _thisOrigin, _thisTransition]; +private _instigator = _unit getVariable [QEGVAR(medical,lastInstigator), objNull]; -// 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); +[_unit, _causeOfDeath, _instigator] call EFUNC(medical_status,setDead); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf index 04121b1c95..d5d81889dd 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Raises the transition to the next state instantly when fatally injured. @@ -16,5 +16,8 @@ */ params ["_unit"]; +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateFatalInjury: State transition on dead or null unit - %1",_unit); +}; [QEGVAR(medical,FatalInjuryInstantTransition), _unit] call CBA_fnc_localEvent; diff --git a/addons/medical_statemachine/functions/fnc_enteredStateUnconscious.sqf b/addons/medical_statemachine/functions/fnc_enteredStateUnconscious.sqf new file mode 100644 index 0000000000..c80481bad2 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateUnconscious.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: Grim + * Handles a unit reaching the point of unconsciousness (calls for a status update). + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateUnconscious + * + * Public: No + */ +params ["_unit"]; + +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateUnconscious: State transition on dead or null unit - %1",_unit); +}; + +//IGNORE_PRIVATE_WARNING ["_thisOrigin", "_thisTransition"]; // vars provided by CBA_statemachine +TRACE_4("enteredStateUnconscious",_this,_thisOrigin,_thisTransition,CBA_missionTime); + +[_unit, true] call EFUNC(medical_status,setUnconsciousState); diff --git a/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf index b9e49adfe3..7e7860bb12 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the unconscious state @@ -18,8 +18,7 @@ params ["_unit"]; // If the unit died the loop is finished -if (!alive _unit) exitWith {}; -if (!local _unit) exitWith {}; +if (!alive _unit || {!local _unit}) exitWith {}; [_unit] call EFUNC(medical_vitals,handleUnitVitals); @@ -34,4 +33,3 @@ if (_timeDiff >= 1) then { _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 index f1fdada8dc..89e09b0d4c 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the default state @@ -18,8 +18,7 @@ params ["_unit"]; // If the unit died the loop is finished -if (!alive _unit) exitWith {}; -if (!local _unit) exitWith {}; +if (!alive _unit || {!local _unit}) exitWith {}; if ([_unit] call EFUNC(medical_vitals,handleUnitVitals)) then { // returns true when update ran private _painLevel = GET_PAIN_PERCEIVED(_unit); diff --git a/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf index 6bdd3e07d3..ad407c0191 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the injured state @@ -18,8 +18,7 @@ params ["_unit"]; // If the unit died the loop is finished -if (!alive _unit) exitWith {}; -if (!local _unit) exitWith {}; +if (!alive _unit || {!local _unit}) exitWith {}; if ([_unit] call EFUNC(medical_vitals,handleUnitVitals)) then { // returns true when update ran private _painLevel = GET_PAIN_PERCEIVED(_unit); diff --git a/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf b/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf index 0cdc4e1d94..aa93d44932 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Handles the unconscious state diff --git a/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf index 2f0793f7c7..a83e971fe7 100644 --- a/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf +++ b/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: RedBery * Handles a unit leaving cardiac arrest (calls for a status update). diff --git a/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf b/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf index 80486601f5..6f6ee43c6f 100644 --- a/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf +++ b/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles locality switch. Will also be called at unit init. diff --git a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf index b29adcb9f4..d05d0939a2 100644 --- a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf +++ b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Resets the default state on a unit after respawning. * * Arguments: diff --git a/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf b/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf index bdee0f9432..ea90b3e962 100644 --- a/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf +++ b/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Gives the unit a second chance and prevents death for 1 second. diff --git a/addons/medical_statemachine/functions/script_component.hpp b/addons/medical_statemachine/functions/script_component.hpp deleted file mode 100644 index 5dd15bb8b4..0000000000 --- a/addons/medical_statemachine/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_statemachine\script_component.hpp" diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 724ecd3f4f..aa30396617 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -9,17 +9,20 @@ États Estados 狀態 + 状态 Stato Stavy Stany Devletler Estados + 현재 상태 Player Fatal Injuries Lesões Fatais do Jogador プレイヤーの致命傷 玩家致命傷 + 玩家致命伤 Décès si blessure mortelle (joueurs) Smrtelná zranění hráčů Śmiertelne Obrażenia Gracza @@ -28,12 +31,14 @@ Tödliche Spielerverletzungen Смертельные травмы игрока Heridas mortales del jugador + 플레이어 중태 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. @@ -42,12 +47,14 @@ Legt fest, wann Spieler tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Torso verursacht. Определяет, могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища. Controla cuándo los jugadores pueden sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. + 플레이어가 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다. AI Fatal Injuries Lesões Fatais da IA - AI の致命傷 + AIの致命傷 AI致命傷 + AI 致命伤 Décès si blessure mortelle (IA) Smrtelná zranění AI Śmiertelne obrażenia AI. @@ -56,12 +63,14 @@ Tödliche KI-Verletzungen Смертельные травмы ИИ Heridas mortales IA + 인공지능 중태 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の即死" 効果が生まれます。\n注: "常に"以外のモードではAIの無意識化を有効化させる必要があります。 控制當AI受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。\n當設置為"總是"時,這會使其與"AI 瞬間死亡"同一個效果,在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". @@ -70,6 +79,7 @@ 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ПРИМЕЧАНИЕ: Любой режим, кроме «Всегда», требует включения функции «Потеря сознания». Controla cuándo la IA puede sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. \n Cuando se establece en "Siempre", esto produce efectivamente un comportamiento de "Muerte instantánea de IA", ya que la IA morirá inmediatamente por cualquier lesión fatal. \n NOTA: Cualquier modo que no sea "Siempre" requiere que la inconsciencia de la IA esté habilitada. + 인공지능이 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다.\n "언제나"로 설정하면 "인공지능 즉사" 기능이 즉각 적용됩니다.\n 참고: "언제나"를 제외한 다른 모드는 인공지능의 기절이 활성화가 필요합니다. AI Unconsciousness @@ -82,17 +92,18 @@ Inconscience IA AI eszméletlenség Incoscienza IA - AI の気絶 + AIの気絶 인공지능 기절 - 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の致命傷" 設定と連動します。これはAIの心停止を起こすにはユニットが気絶する必要がある為です。\nしかしながら、これらの設定はユニットが非致死性の負傷により重体となって気絶できるよう分離されています。\n本質的にはこの設定はAIユニットの心停止を可能にするものであり、有効化されておくべきです。 控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「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. @@ -101,6 +112,7 @@ Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен. Yapay zekanın hemen ölmek yerine bilinçsiz duruma geçip geçemeyeceğini kontrol eder. \ Bu ayar, "Yapay Zeka Ölümcül Yaralanmalar" ayarı ile birlikte çalışır, çünkü kalp durması, ünitenin bilinçsiz duruma geçebilmesini gerektirir. \ Özünde, bunun anlamı şudur: AI birimleri için kalp durmasını etkinleştirirseniz, bu ayar etkinleştirilmelidir. Controla si la IA puede quedar inconsciente en lugar de morir de inmediato. \n Esta configuración funciona junto con la configuración de "Heridas mortales IA", ya que, sufrir un paro cardíaco requiere que la unidad pueda quedar inconsciente. \n Sin embargo, estas configuraciones están separadas porque las unidades pueden perder el conocimiento de los signos vitales críticos como resultado de lesiones no mortales. \n En esencia, esto significa que para habilitar el paro cardíaco en las unidades de IA, esta configuración debe estar habilitada. + 인공지능이 즉사하기보다 기절하는걸 설정합니다.\n이 기능은 "인공지능 중태" 기능과 같이 사용시 심정지를 구현합니다. Cardiac Arrest Time @@ -110,11 +122,13 @@ 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 Tiempo de paro cardíaco + 심정지 시간 Controls how long it takes to die from cardiac arrest. @@ -123,12 +137,14 @@ Контролирует, сколько времени требуется, чтобы умереть от остановки сердца. 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. Bestimmt die Dauer bis zum Tod durch Herzstillstand. Ne kadar süre de kalbi durarak ölmesini belirleyin. Controla cuanto tiempo dura el paro cardiaco antes de morir. + 심정지 후 얼마나 지나야 죽는지 결정합니다. In Cardiac Arrest @@ -138,11 +154,13 @@ Provoquer un arrêt cardiaque Em Parada Cardíaca 心搏停止中 + 心脏骤停中 In arresto cardiaco V srdeční zástavě Zatrzymanie Akcji Serca Kalbi Durdu En parada cardíaca + 심정지가 옴 Bleedout During Cardiac Arrest @@ -152,6 +170,8 @@ 心停止中の失血 Desangrado durante parada cardíaca Wykrwawienie podczas zatrzymanej akcji serca + 心脏骤停期间失血情况 + 심정지 중 출혈 Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. @@ -161,6 +181,8 @@ 心停止時間を超え死亡する前に、失血による心停止で死亡するかどうかを決定します。 COntrola si una persona puede morir en parada cardíaca por causa de pérdida de sangre antes de que se termine el contador de parada cardíaca Kontroluje czy śmierć osoby może nastąpić poprzez wykrwawienie zanim wyczerpię się Czas Zatrzymania Akcji Serca. + 控制单位是否会在心脏骤停时间耗完之前因失血过多而死亡。 + 지정한 심정지 시간이 다 되기 전에 출혈로 인해 사망할 수 있는 지를 결정합니다. diff --git a/addons/medical_status/XEH_PREP.hpp b/addons/medical_status/XEH_PREP.hpp index 811c49c103..77f9712eb1 100644 --- a/addons/medical_status/XEH_PREP.hpp +++ b/addons/medical_status/XEH_PREP.hpp @@ -1,3 +1,4 @@ +PREP(addInventoryActions); PREP(addMedicationAdjustment); PREP(adjustPainLevel); PREP(getBloodLoss); @@ -14,5 +15,6 @@ PREP(isBeingDragged); PREP(isInStableCondition); PREP(setCardiacArrestState); PREP(setDead); +PREP(setStatusEffects); PREP(setUnconsciousState); PREP(updateWoundBloodLoss); diff --git a/addons/medical_status/XEH_postInit.sqf b/addons/medical_status/XEH_postInit.sqf index 9b7d186b46..3f342987c9 100644 --- a/addons/medical_status/XEH_postInit.sqf +++ b/addons/medical_status/XEH_postInit.sqf @@ -2,3 +2,35 @@ // Handle pain changes on injury [QEGVAR(medical,injured), LINKFUNC(adjustPainLevel)] call CBA_fnc_addEventHandler; + + +// Add inventory and open backpack actions to units +[QGVAR(addInventoryActions), LINKFUNC(addInventoryActions)] call CBA_fnc_addEventHandler; +// apply to all living and dead now +{ + [QGVAR(addInventoryActions), _x] call CBA_fnc_localEvent; +} forEach (allUnits + allDeadMen); +// apply to all future units +["CAManBase", "init", LINKFUNC(addInventoryActions), true, [], false] call CBA_fnc_addClassEventHandler; +// Respawn is called locally +["CAManBase", "respawn", { + params ["_unit"]; + if (!local _unit) exitWith {}; + [QGVAR(addInventoryActions), _unit] call CBA_fnc_globalEvent; +}, true] call CBA_fnc_addClassEventHandler; + + +// Handle comms status effects for spectator +// Separate from medical_feedback as these affect unit behavior rather than what the player sees +["featureCamera", { + params ["_unit", "_newCamera"]; + + if (_unit isNotEqualTo ACE_player) exitWith {}; + + if (_newCamera == "") then { // switched back to player view + private _status = IS_UNCONSCIOUS(_unit); + [_unit, _status] call FUNC(setStatusEffects); + } else { + [_unit, false, true] call FUNC(setStatusEffects); + }; +}] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf index 89386bf4fa..c6343dcb63 100644 --- a/addons/medical_status/XEH_preInit.sqf +++ b/addons/medical_status/XEH_preInit.sqf @@ -25,20 +25,4 @@ PREP_RECOMPILE_END; addMissionEventHandler ["EntityKilled", {_this call FUNC(handleKilledMission)}]; -if (hasInterface) then { - //Add Inventory action to uncon units - ["CAManBase", "init", { - params ["_unit"]; - - private _id = _unit addAction ["", { - params ["_target", "_caller", "_actionId", "_arguments"]; - - _caller action ["Gear", _target]; - }, nil, 5.1, true, true, "gear", "_target getVariable ['ACE_isUnconscious',false] && {alive _target}", 3.5]; - - _unit setUserActionText [_id, localize "STR_ACTION_GEAR", ""]; - - }, nil, nil, true] call CBA_fnc_addClassEventHandler; -}; - ADDON = true; diff --git a/addons/medical_status/addon.toml b/addons/medical_status/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_status/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_status/config.cpp b/addons/medical_status/config.cpp index 69c1b2fd27..dc68c63bcc 100644 --- a/addons/medical_status/config.cpp +++ b/addons/medical_status/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "ACE_settings.hpp" #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_status/functions/fnc_addInventoryActions.sqf b/addons/medical_status/functions/fnc_addInventoryActions.sqf new file mode 100644 index 0000000000..8041eb0613 --- /dev/null +++ b/addons/medical_status/functions/fnc_addInventoryActions.sqf @@ -0,0 +1,50 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim, johnb43 + * Adds inventory and open backpack actions to uncon units. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [cursorTarget] call ace_medical_status_fnc_addInventoryActions + * + * Public: No + */ + +if (!hasInterface) exitWith {}; + +params ["_unit"]; + +// Gear Action - For Unconscious Units +private _id = _unit addAction ["", { + params ["_target", "_caller"]; + + _caller action ["Gear", _target]; +}, nil, 5.1, true, true, "gear", toString { + (_target isNotEqualTo ACE_player) && + {(lifeState _target) isEqualTo "INCAPACITATED"} +}, 2]; + +_unit setUserActionText [_id, localize "STR_ACTION_GEAR", ""]; + +// Open Bag Action - For Dead Units +_unit addAction ["OpenBag", { + params ["_target", "_caller"]; + + _caller action ["OpenBag", _target]; +}, nil, 5.2, true, true, "", toString { + private _backpackContainer = backpackContainer _target; + private _backpackConfig = configOf _backpackContainer; + + (_target isNotEqualTo ACE_player) && + {!((lifeState _target) in ["HEALTHY", "INJURED", "INCAPACITATED"])} && + {!isNull _backpackContainer} && + {!lockedInventory _backpackContainer} && + {maxLoad _backpackContainer > 0} && + {getNumber (_backpackConfig >> "disableInventory") != 1} && + {_target setUserActionText [_actionId, format [localize "STR_ACTION_OPEN_BAG", getText (_backpackConfig >> "displayName")]]; true} +}, 2]; diff --git a/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf b/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf index 524b242b1a..4c101c7521 100644 --- a/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf +++ b/addons/medical_status/functions/fnc_addMedicationAdjustment.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, PabstMirror * Adds a medication and it's effects @@ -17,6 +17,8 @@ * * Example: * [player, "Morphine", 120, 60, -10, 0.8, -10] call ace_medical_status_fnc_addMedicationAdjustment + * + * Public: No */ params ["_unit", "_medication", "_timeToMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust"]; TRACE_7("addMedicationAdjustment",_unit,_medication,_timeToMaxEffect,_maxTimeInSystem,_hrAdjust,_painAdjust,_flowAdjust); diff --git a/addons/medical_status/functions/fnc_adjustPainLevel.sqf b/addons/medical_status/functions/fnc_adjustPainLevel.sqf index c6df1adda3..9e7362d3e9 100644 --- a/addons/medical_status/functions/fnc_adjustPainLevel.sqf +++ b/addons/medical_status/functions/fnc_adjustPainLevel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Interface to allow external modules to affect the pain level diff --git a/addons/medical_status/functions/fnc_getBloodLoss.sqf b/addons/medical_status/functions/fnc_getBloodLoss.sqf index ca3cba77cd..8ff0fbff3b 100644 --- a/addons/medical_status/functions/fnc_getBloodLoss.sqf +++ b/addons/medical_status/functions/fnc_getBloodLoss.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Calculate the total blood loss of a unit. diff --git a/addons/medical_status/functions/fnc_getBloodPressure.sqf b/addons/medical_status/functions/fnc_getBloodPressure.sqf index bbb0e5b65e..a6a8ccd65d 100644 --- a/addons/medical_status/functions/fnc_getBloodPressure.sqf +++ b/addons/medical_status/functions/fnc_getBloodPressure.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Calculate the blood pressure of a unit. diff --git a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf index c46338a475..61f5353583 100644 --- a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf +++ b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Calculates the blood volume change and decreases the IVs given to the unit. diff --git a/addons/medical_status/functions/fnc_getCardiacOutput.sqf b/addons/medical_status/functions/fnc_getCardiacOutput.sqf index cf405b52bc..3253f684ab 100644 --- a/addons/medical_status/functions/fnc_getCardiacOutput.sqf +++ b/addons/medical_status/functions/fnc_getCardiacOutput.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Glowbal, SilentSpike + * Author: Glowbal, kymckay * Get the cardiac output from the Heart, based on current Heart Rate and Blood Volume. * * Arguments: diff --git a/addons/medical_status/functions/fnc_getMedicationCount.sqf b/addons/medical_status/functions/fnc_getMedicationCount.sqf index 5c8b3bfd57..e98707c721 100644 --- a/addons/medical_status/functions/fnc_getMedicationCount.sqf +++ b/addons/medical_status/functions/fnc_getMedicationCount.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets effective count of medications in a unit's system diff --git a/addons/medical_status/functions/fnc_handleKilled.sqf b/addons/medical_status/functions/fnc_handleKilled.sqf index a78c82bf55..6c01e4135e 100644 --- a/addons/medical_status/functions/fnc_handleKilled.sqf +++ b/addons/medical_status/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Vanilla Killed EH, attempts to set correct source/killer for other killed event handlers (vanilla and XEH) @@ -30,20 +30,22 @@ if (_unit isEqualTo (_unit getVariable [QGVAR(killed), objNull])) exitWith { _unit setVariable [QGVAR(killed), _unit]; private _causeOfDeath = _unit getVariable [QEGVAR(medical,causeOfDeath), "#scripted"]; +private _modifyKilledArray = missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]; // getVar so this can be disabled -// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect) +// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect, forced respawn while conscious) 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]; - }; -} else { // in that case, call setDead manually to prevent any issues +} else { + // call setDead manually to prevent any issues [_unit, "#scripted"] call FUNC(setDead); }; + +// All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator +if (_modifyKilledArray) then { + _this set [1, _killer]; + _this set [2, _instigator]; +}; TRACE_3("killer info",_killer,_instigator,_causeOfDeath); if (_unit == player) then { @@ -51,4 +53,7 @@ if (_unit == player) then { ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); }; +// Remove status effects before respawn, in case mission is using spectator +[_unit, false] call FUNC(setStatusEffects); + ["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 index 67d1f050f4..d77c08e6f7 100644 --- a/addons/medical_status/functions/fnc_handleKilledMission.sqf +++ b/addons/medical_status/functions/fnc_handleKilledMission.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Vanilla EntityKilled mission EH, attempts to set correct source/killer for other killed event handlers. @@ -30,16 +30,16 @@ if (_unit isEqualTo (_unit getVariable [QGVAR(killedMission), objNull])) exitWit _unit setVariable [QGVAR(killedMission), _unit]; private _causeOfDeath = _unit getVariable [QEGVAR(medical,causeOfDeath), "#scripted"]; +private _modifyKilledArray = missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]; // getVar so this can be disabled -// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect) +// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect, forced respawn while conscious) 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]; - }; +}; +// All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator +if (_modifyKilledArray) then { + _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 index 90e2caac93..29424c96b0 100644 --- a/addons/medical_status/functions/fnc_hasStableVitals.sqf +++ b/addons/medical_status/functions/fnc_hasStableVitals.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Check if a unit has stable vitals (required to become conscious) @@ -17,7 +17,7 @@ params ["_unit"]; -if (GET_BLOOD_VOLUME(_unit) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE) exitWith { false }; +if (GET_BLOOD_VOLUME(_unit) < MINIMUM_BLOOD_FOR_STABLE_VITALS) exitWith { false }; if IN_CRDC_ARRST(_unit) exitWith { false }; private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); diff --git a/addons/medical_status/functions/fnc_initUnit.sqf b/addons/medical_status/functions/fnc_initUnit.sqf index 73ff2ce8b6..786f2be950 100644 --- a/addons/medical_status/functions/fnc_initUnit.sqf +++ b/addons/medical_status/functions/fnc_initUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, commy2 * Initializes unit variables. @@ -46,9 +46,9 @@ if (_isRespawn) then { _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 [VAR_OPEN_WOUNDS, createHashMap, true]; + _unit setVariable [VAR_BANDAGED_WOUNDS, createHashMap, true]; + _unit setVariable [VAR_STITCHED_WOUNDS, createHashMap, true]; _unit setVariable [QEGVAR(medical,isLimping), false, true]; _unit setVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES, true]; @@ -74,7 +74,10 @@ if (_isRespawn) then { _unit setVariable [VAR_MEDICATIONS, [], true]; // Unconscious spontanious wake up chance - _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil]; + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil, true]; + + // Cause of death + _unit setVariable [QEGVAR(medical,causeOfDeath), nil, true]; }; [{ diff --git a/addons/medical_status/functions/fnc_isBeingCarried.sqf b/addons/medical_status/functions/fnc_isBeingCarried.sqf index 7e58efc1ed..2c4d6552f4 100644 --- a/addons/medical_status/functions/fnc_isBeingCarried.sqf +++ b/addons/medical_status/functions/fnc_isBeingCarried.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns if a target is being carried. (from ace_dragging) diff --git a/addons/medical_status/functions/fnc_isBeingDragged.sqf b/addons/medical_status/functions/fnc_isBeingDragged.sqf index e8c21bdb56..e5b3c5da88 100644 --- a/addons/medical_status/functions/fnc_isBeingDragged.sqf +++ b/addons/medical_status/functions/fnc_isBeingDragged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns if a target is being dragged. (from ace_dragging) diff --git a/addons/medical_status/functions/fnc_isInStableCondition.sqf b/addons/medical_status/functions/fnc_isInStableCondition.sqf index 36ff02ac2b..dedb2513f3 100644 --- a/addons/medical_status/functions/fnc_isInStableCondition.sqf +++ b/addons/medical_status/functions/fnc_isInStableCondition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if a unit is in a stable condition, needed for PersonalAidKit treatment diff --git a/addons/medical_status/functions/fnc_setCardiacArrestState.sqf b/addons/medical_status/functions/fnc_setCardiacArrestState.sqf index 3dec76ab35..b806cef195 100644 --- a/addons/medical_status/functions/fnc_setCardiacArrestState.sqf +++ b/addons/medical_status/functions/fnc_setCardiacArrestState.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Marks a unit as in cardiac arrest and sets heart rate to 0. diff --git a/addons/medical_status/functions/fnc_setDead.sqf b/addons/medical_status/functions/fnc_setDead.sqf index 7f41ebf3da..9dfc07d114 100644 --- a/addons/medical_status/functions/fnc_setDead.sqf +++ b/addons/medical_status/functions/fnc_setDead.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Kills a local unit. @@ -6,6 +6,7 @@ * Arguments: * 0: The unit * 1: Reason for death + * 2: Killer * * Return Value: * None @@ -13,8 +14,8 @@ * Public: No */ -params ["_unit", ["_reason", "#setDead"]]; -TRACE_2("setDead",_unit,_reason); +params ["_unit", ["_reason", "#setDead"], ["_instigator", objNull]]; +TRACE_3("setDead",_unit,_reason,_instigator); // No heart rate or blood pressure to measure when dead _unit setVariable [VAR_HEART_RATE, 0, true]; @@ -25,5 +26,22 @@ _unit setVariable [QEGVAR(medical,causeOfDeath), _reason, true]; // Send a local event before death [QEGVAR(medical,death), [_unit]] call CBA_fnc_localEvent; +// Update the state machine if necessary (forced respawn, scripted death, etc) +private _unitState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; +if (_unitState isNotEqualTo "Dead") then { + [_unit, EGVAR(medical,STATE_MACHINE), _unitState, "Dead"] call CBA_statemachine_fnc_manualTransition; +}; + +// (#8803) Reenable damage if disabled to prevent having live units in dead state +// Keep this after death event for compatibility with third party hooks +if !(isDamageAllowed _unit) then { + WARNING_1("setDead executed on unit with damage blocked - %1",_this); + _unit allowDamage true; +}; + // Kill the unit without changing visual apperance -[_unit, 1] call EFUNC(medical_engine,setStructuralDamage); +private _prevDamage = _unit getHitPointDamage "HitHead"; + +_unit setHitPointDamage ["HitHead", 1, true, _instigator]; + +_unit setHitPointDamage ["HitHead", _prevDamage]; diff --git a/addons/medical_status/functions/fnc_setStatusEffects.sqf b/addons/medical_status/functions/fnc_setStatusEffects.sqf new file mode 100644 index 0000000000..4d093464de --- /dev/null +++ b/addons/medical_status/functions/fnc_setStatusEffects.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Sets status effects for a unit. + * For Internal Use: Called by FUNC(setUnconsciousState), FUNC(handleKilled), and on featureCamera changes. + * + * Arguments: + * 0: The unit + * 1: Status effects value + * 2: Skip setHidden (default: false) + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", "_set", ["_skipSetHidden", false]]; +TRACE_3("setStatusEffect",_unit,_set,_skipSetHidden); + +// Block radio on unconsciousness for compatibility with captive module +[_unit, "blockRadio", "ace_unconscious", _set] call EFUNC(common,statusEffect_set); + +// Block speaking on unconsciousness +[_unit, "blockSpeaking", "ace_unconscious", _set] call EFUNC(common,statusEffect_set); + +if (_skipSetHidden) exitWith {}; + +// Stop AI firing at unconscious units in most situations (global effect) +[_unit, "setHidden", "ace_unconscious", _set] call EFUNC(common,statusEffect_set); diff --git a/addons/medical_status/functions/fnc_setUnconsciousState.sqf b/addons/medical_status/functions/fnc_setUnconsciousState.sqf index 0a10a29a5d..3071ae0d14 100644 --- a/addons/medical_status/functions/fnc_setUnconsciousState.sqf +++ b/addons/medical_status/functions/fnc_setUnconsciousState.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Sets a unit in the unconscious state. @@ -9,7 +9,7 @@ * 1: Set unconscious * * Return Value: - * Success + * None * * Example: * [player, true] call ace_medical_status_fnc_setUnconsciousState @@ -21,18 +21,15 @@ 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)); }; +if (_active isEqualTo IS_UNCONSCIOUS(_unit) || {!alive _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); - -// Block radio on unconsciousness for compatibility with captive module -[_unit, "blockRadio", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); +// Handle hiding from AI and talking blocks. +[_unit, _active] call FUNC(setStatusEffects); if (_active) then { // Don't bother setting this if not used @@ -48,6 +45,10 @@ if (_active) then { while {dialog} do { closeDialog 0; }; + + if (EGVAR(medical,dropWeaponUnconsciousChance) != 0 && {random 1 <= EGVAR(medical,dropWeaponUnconsciousChance)}) then { + _unit call EFUNC(common,throwWeapon); + }; }; // Unlock controls for copilot if unit is pilot of aircraft if (vehicle _unit isKindOf "Air" && {_unit == driver vehicle _unit}) then { diff --git a/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf b/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf index fe38aabadc..8696349642 100644 --- a/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf +++ b/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Update total wound bleeding based on open wounds and tourniquets @@ -21,9 +21,12 @@ 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)]; + private _partIndex = ALL_BODY_PARTS find _x; + if (_tourniquets select _partIndex == 0) then { + { + _x params ["", "_amountOf", "_bleeeding"]; + _bodyPartBleeding set [_partIndex, (_bodyPartBleeding select _partIndex) + (_amountOf * _bleeeding)]; + } forEach _y; }; } forEach GET_OPEN_WOUNDS(_unit); diff --git a/addons/medical_status/functions/script_component.hpp b/addons/medical_status/functions/script_component.hpp deleted file mode 100644 index 9b83bfbc4f..0000000000 --- a/addons/medical_status/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_status\script_component.hpp" diff --git a/addons/medical_status/initSettings.sqf b/addons/medical_status/initSettings.sqf index 743c55cc00..849b10ef8c 100644 --- a/addons/medical_status/initSettings.sqf +++ b/addons/medical_status/initSettings.sqf @@ -24,3 +24,12 @@ [0, 25, 1, 1], true ] call CBA_fnc_addSetting; + +[ + QEGVAR(medical,dropWeaponUnconsciousChance), + "SLIDER", + [LSTRING(DropWeaponUnconsciousChance_DisplayName), LSTRING(DropWeaponUnconsciousChance_Description)], + ELSTRING(medical,Category), + [0, 1, 0, 2, true], + true +] call CBA_fnc_addSetting; diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml index 8f46954596..a6f95a3634 100644 --- a/addons/medical_status/stringtable.xml +++ b/addons/medical_status/stringtable.xml @@ -9,15 +9,17 @@ Statut Status 狀態 + 状态 Stato Stav Status Estado Durum + 결과 상태 Bleeding Coefficient - Коэффициент кровопотери + Коэф. кровопотери Mnożnik krwawienia Coeficiente de sangrado Verblutungsmultiplikator @@ -51,7 +53,7 @@ Pain Coefficient - Коэффициент боли + Коэф. боли Mnożnik bólu Coeficiente de dolor Schmerzmultiplikator @@ -91,11 +93,13 @@ 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). @@ -105,11 +109,23 @@ 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毫升/秒)乘上流量(該係數)。 + 控制从点滴输入人体的液体流量多快。静脉输液袋容积变化的计算方法是:\n时间间隔(秒)x点滴每秒速度(4.1667毫升/秒)x流量(该系数)。 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ı). + 수액용기에서 얼마나 빨리 들어가는 지를 정합니다. 초당 4.16ml * 계수를 적용받습니다. + + + Weapon Drop Chance + Szansa Upuszczenia Broni + Wahrscheinlichkeit, die Waffe fallen zu lassen + + + Chance for a player to drop their weapon when going unconscious.\nHas no effect on AI. + Szansa na upuszczenie broni przez gracza, przy utracie przytomności. \nNie ma wpływu na AI. + Chance für einen Spieler, seine Waffe fallen zu lassen, wenn er bewusstlos wird.\nHat keine Auswirkung auf die KI. diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index 433e8a5a62..a9c6eca5d7 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -83,6 +83,7 @@ class GVAR(actions) { condition = QUOTE(!([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo))); callbackSuccess = QFUNC(tourniquet); litter[] = {}; + allowedUnderwater = 1; }; class RemoveTourniquet: ApplyTourniquet { displayName = CSTRING(Actions_RemoveTourniquet); @@ -90,6 +91,7 @@ class GVAR(actions) { items[] = {}; condition = QUOTE([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo)); callbackSuccess = QFUNC(tourniquetRemove); + allowedUnderwater = 1; }; // - Splint --------------------------------------------------------------- @@ -286,8 +288,9 @@ class GVAR(actions) { treatmentTime = QFUNC(getStitchTime); condition = QFUNC(canStitch); callbackSuccess = ""; + callbackStart = QFUNC(surgicalKitStart); callbackProgress = QFUNC(surgicalKitProgress); - consumeItem = QGVAR(consumeSurgicalKit); + consumeItem = QGVAR(consumeSurgicalKit); // setting can be 0,1,2 - only 1 will consume items[] animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; litter[] = {{"ACE_MedicalLitter_gloves"}}; }; diff --git a/addons/medical_treatment/Cfg3DEN.hpp b/addons/medical_treatment/Cfg3DEN.hpp index 04c3fc3efd..0df2b498e6 100644 --- a/addons/medical_treatment/Cfg3DEN.hpp +++ b/addons/medical_treatment/Cfg3DEN.hpp @@ -23,9 +23,9 @@ class Cfg3DEN { class Title: Title {}; class Value: ctrlToolbox { idc = 100; - x = 48 * GRID_3DEN_W; - w = 82 * GRID_3DEN_W; - h = 5 * GRID_3DEN_H; + x = QUOTE(48 * GRID_3DEN_W); + w = QUOTE(82 * GRID_3DEN_W); + h = QUOTE(5 * GRID_3DEN_H); rows = 1; columns = 4; strings[] = { diff --git a/addons/medical_treatment/CfgVehicles.hpp b/addons/medical_treatment/CfgVehicles.hpp index fc832a7189..bb9ea8054f 100644 --- a/addons/medical_treatment/CfgVehicles.hpp +++ b/addons/medical_treatment/CfgVehicles.hpp @@ -18,6 +18,7 @@ class CfgVehicles { EGVAR(dragging,dragDirection) = 0; EGVAR(cargo,size) = 1; EGVAR(cargo,canLoad) = 1; + EGVAR(cargo,noRename) = 1; hiddenSelections[] = {"camo"}; hiddenSelectionsTextures[] = {QPATHTOEF(apl,data\bodybag_co.paa)}; class ACE_Actions { @@ -77,6 +78,9 @@ class CfgVehicles { class ACE_MedicalLitter_splint: ACE_MedicalLitterBase { model = QPATHTOF(data\littergeneric_splint.p3d); }; + class ACE_MedicalLitter_suture: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_suture.p3d); + }; // Treatment items class Item_Base_F; @@ -231,6 +235,16 @@ class CfgVehicles { MACRO_ADDITEM(ACE_surgicalKit,1); }; }; + class ACE_sutureItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Suture_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_suture,1); + }; + }; class ACE_bodyBagItem: Item_Base_F { scope = 2; scopeCurator = 2; @@ -327,4 +341,14 @@ class CfgVehicles { MACRO_ADDITEM(ACE_bodyBag,5); }; }; + + class Van_02_base_F; + class Van_02_medevac_base_F: Van_02_base_F { + GVAR(patientSeats)[] = {3,4}; + }; + + class Heli_Transport_04_base_F; + class O_Heli_Transport_04_medevac_F: Heli_Transport_04_base_F { + GVAR(patientSeats)[] = {0,1,2}; + }; }; diff --git a/addons/medical_treatment/CfgWeapons.hpp b/addons/medical_treatment/CfgWeapons.hpp index 3e90457c8b..e285697cc1 100644 --- a/addons/medical_treatment/CfgWeapons.hpp +++ b/addons/medical_treatment/CfgWeapons.hpp @@ -8,12 +8,14 @@ class CfgWeapons { class FirstAidKit: ItemCore { type = 0; + ACE_isMedicalItem = 1; class ItemInfo: InventoryFirstAidKitItem_Base_F { mass = 4; }; }; class Medikit: ItemCore { type = 0; + ACE_isMedicalItem = 1; class ItemInfo: MedikitItem { mass = 60; }; @@ -27,6 +29,7 @@ class CfgWeapons { displayName = CSTRING(Bandage_Basic_Display); descriptionShort = CSTRING(Bandage_Basic_Desc_Short); descriptionUse = CSTRING(Bandage_Basic_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -39,6 +42,7 @@ class CfgWeapons { model = QPATHTOF(data\packingbandage.p3d); descriptionShort = CSTRING(Packing_Bandage_Desc_Short); descriptionUse = CSTRING(Packing_Bandage_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -51,6 +55,7 @@ class CfgWeapons { model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -63,6 +68,7 @@ class CfgWeapons { model = QPATHTOF(data\tourniquet.p3d); descriptionShort = CSTRING(Tourniquet_Desc_Short); descriptionUse = CSTRING(Tourniquet_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -74,6 +80,7 @@ class CfgWeapons { picture = QPATHTOF(ui\splint_ca.paa); model = QPATHTOF(data\splint.p3d); descriptionShort = CSTRING(splint_Desc_Short); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2; }; @@ -86,6 +93,7 @@ class CfgWeapons { model = QPATHTOF(data\morphine.p3d); descriptionShort = CSTRING(Morphine_Desc_Short); descriptionUse = CSTRING(Morphine_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -98,6 +106,7 @@ class CfgWeapons { model = QPATHTOF(data\adenosine.p3d); descriptionShort = CSTRING(adenosine_Desc_Short); descriptionUse = CSTRING(adenosine_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -110,6 +119,7 @@ class CfgWeapons { model = QPATHTOF(data\atropine.p3d); descriptionShort = CSTRING(Atropine_Desc_Short); descriptionUse = CSTRING(Atropine_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -122,6 +132,7 @@ class CfgWeapons { model = QPATHTOF(data\epinephrine.p3d); descriptionShort = CSTRING(Epinephrine_Desc_Short); descriptionUse = CSTRING(Epinephrine_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -137,6 +148,7 @@ class CfgWeapons { picture = QPATHTOF(ui\plasmaIV_ca.paa); descriptionShort = CSTRING(Plasma_IV_Desc_Short); descriptionUse = CSTRING(Plasma_IV_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; @@ -167,6 +179,7 @@ class CfgWeapons { hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_1000ml_ca.paa)}; descriptionShort = CSTRING(Blood_IV_Desc_Short); descriptionUse = CSTRING(Blood_IV_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; @@ -197,6 +210,7 @@ class CfgWeapons { picture = QPATHTOF(ui\salineIV_ca.paa); descriptionShort = CSTRING(Saline_IV_Desc_Short); descriptionUse = CSTRING(Saline_IV_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; @@ -225,6 +239,7 @@ class CfgWeapons { picture = QPATHTOF(ui\quickclot_ca.paa); descriptionShort = CSTRING(QuikClot_Desc_Short); descriptionUse = CSTRING(QuikClot_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; }; @@ -236,6 +251,7 @@ class CfgWeapons { picture = QPATHTOF(ui\personal_aid_kit_ca.paa); descriptionShort = CSTRING(Aid_Kit_Desc_Short); descriptionUse = CSTRING(Aid_Kit_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; @@ -248,10 +264,24 @@ class CfgWeapons { picture = QPATHTOF(ui\surgicalKit_ca.paa); descriptionShort = CSTRING(SurgicalKit_Desc_Short); descriptionUse = CSTRING(SurgicalKit_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 15; }; }; + class ACE_suture: ACE_ItemCore { + scope = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(Suture_Display); + model = QPATHTOF(data\suture.p3d); + picture = QPATHTOF(ui\suture_ca.paa); + descriptionShort = CSTRING(Suture_Desc_Short); + descriptionUse = CSTRING(Suture_Desc_Use); + ACE_isMedicalItem = 1; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; class ACE_bodyBag: ACE_ItemCore { scope = 2; author = ECSTRING(common,ACETeam); @@ -260,6 +290,7 @@ class CfgWeapons { picture = QPATHTOF(ui\bodybag_ca.paa); descriptionShort = CSTRING(Bodybag_Desc_Short); descriptionUse = CSTRING(Bodybag_Desc_Use); + ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 7; }; diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp index 0c0f11742f..a6266b1508 100644 --- a/addons/medical_treatment/XEH_PREP.hpp +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -25,12 +25,11 @@ PREP(cprStart); PREP(createLitter); PREP(createLitterServer); PREP(diagnose); -PREP(findMostEffectiveWound); +PREP(findMostEffectiveWounds); PREP(fullHeal); PREP(fullHealLocal); PREP(getBandageTime); PREP(getHealTime); -PREP(getStitchableWounds); PREP(getStitchTime); PREP(getTriageStatus); PREP(handleBandageOpening); @@ -49,10 +48,12 @@ PREP(medicationLocal); PREP(onMedicationUsage); PREP(placeInBodyBag); PREP(removeBody); +PREP(scanMedicalItems); PREP(setTriageStatus); PREP(splint); PREP(splintLocal); PREP(surgicalKitProgress); +PREP(surgicalKitStart); PREP(tourniquet); PREP(tourniquetLocal); PREP(tourniquetRemove); diff --git a/addons/medical_treatment/XEH_preInit.sqf b/addons/medical_treatment/XEH_preInit.sqf index dfb6bf6518..79ec737aa6 100644 --- a/addons/medical_treatment/XEH_preInit.sqf +++ b/addons/medical_treatment/XEH_preInit.sqf @@ -8,6 +8,8 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +#define ARSENAL_CATEGORY_ICON (["\A3\ui_f\data\igui\cfg\actions\heal_ca.paa", QPATHTOEF(medical_gui,data\categories\bandage_fracture.paa)] select (["ace_medical_gui"] call EFUNC(common,isModLoaded))) + // config to determine animation acceleration coefficient // adjusting these is trail and error // if the animation is cut of ingame, increase these values @@ -44,4 +46,9 @@ GVAR(facilityClasses) = []; } forEach getArray _x; } forEach configProperties [configFile >> QEGVAR(medical,facilities), "isArray _x"]; +// Custom Arsenal tab +if (["ace_arsenal"] call EFUNC(common,isModLoaded)) then { + [MEDICAL_TREATMENT_ITEMS, LELSTRING(medical,Category), ARSENAL_CATEGORY_ICON, -1, true] call EFUNC(arsenal,addRightPanelButton); +}; + ADDON = true; diff --git a/addons/medical_treatment/XEH_preStart.sqf b/addons/medical_treatment/XEH_preStart.sqf index 022888575e..27f8f2d9c2 100644 --- a/addons/medical_treatment/XEH_preStart.sqf +++ b/addons/medical_treatment/XEH_preStart.sqf @@ -1,3 +1,5 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +call FUNC(scanMedicalItems) diff --git a/addons/medical_treatment/addon.toml b/addons/medical_treatment/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_treatment/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp index 7506903b46..9c77b37f13 100644 --- a/addons/medical_treatment/config.cpp +++ b/addons/medical_treatment/config.cpp @@ -1,10 +1,17 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {"ACE_fieldDressingItem","ACE_packingBandageItem","ACE_elasticBandageItem","ACE_tourniquetItem","ACE_splintItem","ACE_morphineItem","ACE_adenosineItem","ACE_epinephrineItem","ACE_plasmaIVItem","ACE_bloodIVItem","ACE_salineIVItem","ACE_quikClotItem","ACE_personalAidKitItem","ACE_surgicalKitItem","ACE_bodyBagItem","ACE_medicalSupplyCrate","ACE_medicalSupplyCrate_advanced"}; - weapons[] = {"ACE_fieldDressing","ACE_packingBandage","ACE_elasticBandage","ACE_tourniquet","ACE_splint","ACE_morphine","ACE_adenosine","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[] = {"ACE_fieldDressingItem","ACE_packingBandageItem","ACE_elasticBandageItem","ACE_tourniquetItem","ACE_splintItem","ACE_morphineItem","ACE_adenosineItem","ACE_epinephrineItem","ACE_plasmaIVItem","ACE_bloodIVItem","ACE_salineIVItem","ACE_quikClotItem","ACE_personalAidKitItem","ACE_surgicalKitItem","ACE_sutureItem","ACE_bodyBagItem","ACE_medicalSupplyCrate","ACE_medicalSupplyCrate_advanced"}; + weapons[] = {"ACE_fieldDressing","ACE_packingBandage","ACE_elasticBandage","ACE_tourniquet","ACE_splint","ACE_morphine","ACE_adenosine","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_suture","ACE_bodyBag"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_medical_status", "ace_medical_damage", "ace_apl"}; author = ECSTRING(common,ACETeam); @@ -22,3 +29,5 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "Cfg3DEN.hpp" + +#endif diff --git a/addons/medical_treatment/data/littergeneric_suture.p3d b/addons/medical_treatment/data/littergeneric_suture.p3d new file mode 100644 index 0000000000..eb4a1fc9dd Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_suture.p3d differ diff --git a/addons/medical_treatment/data/suture.p3d b/addons/medical_treatment/data/suture.p3d new file mode 100644 index 0000000000..b98ee47f95 Binary files /dev/null and b/addons/medical_treatment/data/suture.p3d differ diff --git a/addons/medical_treatment/data/suture.rvmat b/addons/medical_treatment/data/suture.rvmat new file mode 100644 index 0000000000..8664194d32 --- /dev/null +++ b/addons/medical_treatment/data/suture.rvmat @@ -0,0 +1,96 @@ +class StageTI +{ + texture="a3\data_f\default_vehicle_ti_ca.paa"; +}; +ambient[]={0.10196079,0.35686275,0.26274511,1}; +diffuse[]={0.10196079,0.35686275,0.26274511,1}; +forcedDiffuse[]={0,0,0,1}; +emmisive[]={0,0,0,0}; +specular[]={0,0,0,1}; +specularPower=3.5; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\suture_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,0.5,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="z\ace\addons\medical_treatment\data\suture_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(1.5,1)"; + 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/medical_treatment/data/suture_co.paa b/addons/medical_treatment/data/suture_co.paa new file mode 100644 index 0000000000..5555b9dce1 Binary files /dev/null and b/addons/medical_treatment/data/suture_co.paa differ diff --git a/addons/medical_treatment/data/suture_nohq.paa b/addons/medical_treatment/data/suture_nohq.paa new file mode 100644 index 0000000000..94c4f595cf Binary files /dev/null and b/addons/medical_treatment/data/suture_nohq.paa differ diff --git a/addons/medical_treatment/data/suture_smdi.paa b/addons/medical_treatment/data/suture_smdi.paa new file mode 100644 index 0000000000..c41af47eba Binary files /dev/null and b/addons/medical_treatment/data/suture_smdi.paa differ diff --git a/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf index fe97152c92..921e98d642 100644 --- a/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf +++ b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Returns children actions to the "Load Patient" action for nearby vehicles. diff --git a/addons/medical_treatment/functions/fnc_addToLog.sqf b/addons/medical_treatment/functions/fnc_addToLog.sqf index b250fec9b1..93d7f8824f 100644 --- a/addons/medical_treatment/functions/fnc_addToLog.sqf +++ b/addons/medical_treatment/functions/fnc_addToLog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Adds an entry to the specified medical log of the unit. diff --git a/addons/medical_treatment/functions/fnc_addToTriageCard.sqf b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf index 75cbc76b26..6e6fe12161 100644 --- a/addons/medical_treatment/functions/fnc_addToTriageCard.sqf +++ b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Adds an entry to the unit's triage card. diff --git a/addons/medical_treatment/functions/fnc_bandage.sqf b/addons/medical_treatment/functions/fnc_bandage.sqf index 1a7dd4f818..a4fb2c7698 100644 --- a/addons/medical_treatment/functions/fnc_bandage.sqf +++ b/addons/medical_treatment/functions/fnc_bandage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Bandages open wounds on the given body part of the patient. diff --git a/addons/medical_treatment/functions/fnc_bandageLocal.sqf b/addons/medical_treatment/functions/fnc_bandageLocal.sqf index d02ab8f749..0f695c4c61 100644 --- a/addons/medical_treatment/functions/fnc_bandageLocal.sqf +++ b/addons/medical_treatment/functions/fnc_bandageLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Local callback for bandaging a patient's open wounds. @@ -19,65 +19,83 @@ params ["_patient", "_bodyPart", "_bandage"]; TRACE_3("bandageLocal",_patient,_bodyPart,_bandage); - -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; -if (_partIndex < 0) exitWith {}; +_bodyPart = toLower _bodyPart; private _openWounds = GET_OPEN_WOUNDS(_patient); -if (_openWounds isEqualTo []) exitWith {}; +private _woundsOnPart = _openWounds getOrDefault [_bodyPart, []]; +if (_woundsOnPart 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"]; +// Figure out which injuries for this bodypart are the best choice to bandage +private _targetWounds = [_patient, _bandage, _bodyPart, GVAR(bandageEffectiveness)] call FUNC(findMostEffectiveWounds); // Everything is patched up on this body part already -if (_effectiveness == -1) exitWith {}; +if (count _targetWounds == 0) 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]; +private _treatedDamage = 0; +private _clearConditionCache = false; + +{ + private _wound = _x; + _wound params ["_classID", "_amountOf", "_bleeding", "_damage"]; + _y params ["_effectiveness", "_woundIndex", "_impact"]; + + // clear condition cache if we stopped all bleeding for this injury + if (!_clearConditionCache) then { + _clearConditionCache = (_effectiveness >= _amountOf); + }; + + // Reduce the amount this injury is present + (_woundsOnPart select _woundIndex) set [1, _amountOf - _impact]; + + // Store treated damage for clearing trauma + _treatedDamage = _treatedDamage + (_impact * _damage); + + // Handle reopening bandaged wounds + if (_impact > 0 && {GVAR(advancedBandages) == 2}) then { + [_patient, _impact, _bodyPart, _woundIndex, _wound, _bandage] call FUNC(handleBandageOpening); + }; +} forEach _targetWounds; _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 { +if ( + EGVAR(medical,limping) == 1 + && {_clearConditionCache} + && {_bodyPart in ["leftleg", "rightleg"]} + && {_patient getVariable [QEGVAR(medical,isLimping), false]} +) then { [_patient] call EFUNC(medical_engine,updateDamageEffects); }; if (GVAR(clearTrauma) == 2) then { - TRACE_2("clearTrauma - clearing trauma after bandage",_partIndex,_openWounds); - private _treatedDamageOf = (_wound select 4) * _impact; + TRACE_2("clearTrauma - clearing trauma after bandage",_bodyPart,_openWounds); + private _partIndex = ALL_BODY_PARTS find _bodyPart; private _bodyPartDamage = _patient getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; - private _newDam = (_bodyPartDamage select _partIndex) - _treatedDamageOf; - if (_newDam < 0.05) then { // Prevent obscenely small damage from lack of floating precision + private _newDam = (_bodyPartDamage select _partIndex) - _treatedDamage; + + // Prevent obscenely small damage from lack of floating precision + if (_newDam < 0.05) then { _bodyPartDamage set [_partIndex, 0]; } else { _bodyPartDamage set [_partIndex, _newDam]; }; _patient setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; - TRACE_2("clearTrauma - healed damage",_partIndex,_treatedDamageOf); + TRACE_2("clearTrauma - healed damage",_partIndex,_treatedDamage); - 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); }; + switch (_bodyPart) do { + case "head": { [_patient, true, false, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + case "body": { [_patient, false, true, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + case "leftarm"; + case "rightarm": { [_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 +// Reset treatment condition cache for nearby players if we stopped all bleeding +if (_clearConditionCache) then { 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 index 1e630b510a..e66513a19d 100644 --- a/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, esteldunedain * Handles cleaning up bodies that were replaced by body bags. diff --git a/addons/medical_treatment/functions/fnc_canBandage.sqf b/addons/medical_treatment/functions/fnc_canBandage.sqf index 0908e469b2..18fb304d11 100644 --- a/addons/medical_treatment/functions/fnc_canBandage.sqf +++ b/addons/medical_treatment/functions/fnc_canBandage.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Prevents bandage actions from showing if selected body part isn't bleeding. * Toggles between showing all or only basic bandage action for advanced setting. * @@ -20,20 +20,23 @@ */ params ["_medic", "_patient", "_bodyPart", "_bandage"]; +_bodyPart = toLower _bodyPart; + +// If patient is swimming, don't allow bandage actions. +if (_patient call EFUNC(common,isSwimming)) exitWith {false}; // 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"]; + _x params ["", "_amountOf", "_bleeding"]; // If any single wound on the bodypart is bleeding bandaging can go ahead - if (_bodyPartN == _index && {_amountOf * _bleeding > 0}) exitWith { + if (_amountOf * _bleeding > 0) exitWith { _canBandage = true; }; -} forEach GET_OPEN_WOUNDS(_patient); +} forEach ((GET_OPEN_WOUNDS(_patient)) getOrDefault [_bodyPart, []]); _canBandage diff --git a/addons/medical_treatment/functions/fnc_canCPR.sqf b/addons/medical_treatment/functions/fnc_canCPR.sqf index 6efd2f268b..e5b4d7a317 100644 --- a/addons/medical_treatment/functions/fnc_canCPR.sqf +++ b/addons/medical_treatment/functions/fnc_canCPR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Checks if CPR can be performed on the patient. diff --git a/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf b/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf index 2fa3b01939..cc4ca4d23f 100644 --- a/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf +++ b/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Brett Mayson * Checks if the patient can be placed in a bodybag. diff --git a/addons/medical_treatment/functions/fnc_canSplint.sqf b/addons/medical_treatment/functions/fnc_canSplint.sqf index 56551ace02..f2fc6fa034 100644 --- a/addons/medical_treatment/functions/fnc_canSplint.sqf +++ b/addons/medical_treatment/functions/fnc_canSplint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Checks if a splint can be applied to the patient. diff --git a/addons/medical_treatment/functions/fnc_canStitch.sqf b/addons/medical_treatment/functions/fnc_canStitch.sqf index a542de23f1..685c2bd1d7 100644 --- a/addons/medical_treatment/functions/fnc_canStitch.sqf +++ b/addons/medical_treatment/functions/fnc_canStitch.sqf @@ -1,21 +1,31 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Katalam, mharis001 - * Checks if the patient can be stitched. + * Author: Katalam, mharis001, Brett Mayson + * Checks if the patient's body part can be stitched. * * Arguments: - * 0: Medic (not used) + * 0: Medic * 1: Patient + * 2: Body Part * * ReturnValue: * Can Stitch * * Example: - * [player, cursorTarget] call ace_medical_treatment_fnc_canStitch + * [player, cursorTarget, "head"] call ace_medical_treatment_fnc_canStitch * * Public: No */ -params ["", "_patient"]; +params ["_medic", "_patient", "_bodyPart"]; -(_patient call FUNC(getStitchableWounds) isNotEqualTo []) +if ((GVAR(consumeSurgicalKit) == 2) && {!([_medic, _patient, ["ACE_suture"]] call FUNC(hasItem))}) exitWith {false}; + +private _isBleeding = false; +{ + _x params ["", "_amountOf", "_bleedingRate"]; + _isBleeding = _amountOf > 0 && {_bleedingRate > 0}; + if (_isBleeding) then {break}; +} forEach (GET_OPEN_WOUNDS(_patient) get _bodyPart); + +(!_isBleeding && {(GET_BANDAGED_WOUNDS(_patient) getOrDefault [_bodyPart, []]) isNotEqualTo []}) // return diff --git a/addons/medical_treatment/functions/fnc_canTreat.sqf b/addons/medical_treatment/functions/fnc_canTreat.sqf index 938e8a356d..1f18e2b6c1 100644 --- a/addons/medical_treatment/functions/fnc_canTreat.sqf +++ b/addons/medical_treatment/functions/fnc_canTreat.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Checks if the given treatment can be performed. @@ -40,7 +40,7 @@ isClass _config if (_condition isEqualTo {}) exitWith { _condition = true; }; - + _condition = call _condition; }; @@ -59,4 +59,6 @@ isClass _config }; default {false}; }; +} && { + ((getNumber (_config >> "allowedUnderwater")) == 1) || {!([_medic] call ace_common_fnc_isSwimming)} } diff --git a/addons/medical_treatment/functions/fnc_canTreatCached.sqf b/addons/medical_treatment/functions/fnc_canTreatCached.sqf index d70f041c17..95ecc228c5 100644 --- a/addons/medical_treatment/functions/fnc_canTreatCached.sqf +++ b/addons/medical_treatment/functions/fnc_canTreatCached.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Cached check to determine if given treatment can be performed. diff --git a/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf b/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf index 96f498c258..c903fc88d7 100644 --- a/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf +++ b/addons/medical_treatment/functions/fnc_canTreat_holsterCheck.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ddm999 * Handle holster settings [disabled, lowered, loweredExam, holster, holsterExam] diff --git a/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf b/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf index b708b7e50f..78a6fcb015 100644 --- a/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf +++ b/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks the blood pressure of the patient. diff --git a/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf b/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf index 5da7495f74..0c3fe39876 100644 --- a/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf +++ b/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Local callback for checking the blood pressure of a patient. diff --git a/addons/medical_treatment/functions/fnc_checkPulse.sqf b/addons/medical_treatment/functions/fnc_checkPulse.sqf index 6c5b628fae..3f776ff749 100644 --- a/addons/medical_treatment/functions/fnc_checkPulse.sqf +++ b/addons/medical_treatment/functions/fnc_checkPulse.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks the pulse or heart rate of the patient. diff --git a/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf b/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf index f386fa2c89..737a40c0ca 100644 --- a/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf +++ b/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Local callback for checking the pulse or heart rate of a patient. diff --git a/addons/medical_treatment/functions/fnc_checkResponse.sqf b/addons/medical_treatment/functions/fnc_checkResponse.sqf index fd661f0809..dc76b1dbfb 100644 --- a/addons/medical_treatment/functions/fnc_checkResponse.sqf +++ b/addons/medical_treatment/functions/fnc_checkResponse.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks the response status of the patient. diff --git a/addons/medical_treatment/functions/fnc_cprFailure.sqf b/addons/medical_treatment/functions/fnc_cprFailure.sqf index 513c2e43ee..b060bea9c9 100644 --- a/addons/medical_treatment/functions/fnc_cprFailure.sqf +++ b/addons/medical_treatment/functions/fnc_cprFailure.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Zakant * Handles failure of the CPR treatment. diff --git a/addons/medical_treatment/functions/fnc_cprLocal.sqf b/addons/medical_treatment/functions/fnc_cprLocal.sqf index 89abfdeacf..228774b2f6 100644 --- a/addons/medical_treatment/functions/fnc_cprLocal.sqf +++ b/addons/medical_treatment/functions/fnc_cprLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Local callback for finishing performing CPR on the patient. diff --git a/addons/medical_treatment/functions/fnc_cprProgress.sqf b/addons/medical_treatment/functions/fnc_cprProgress.sqf index f3d565f99a..d8b8dd9e3f 100644 --- a/addons/medical_treatment/functions/fnc_cprProgress.sqf +++ b/addons/medical_treatment/functions/fnc_cprProgress.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Zakant * Handles the progress of the CPR treatment. diff --git a/addons/medical_treatment/functions/fnc_cprStart.sqf b/addons/medical_treatment/functions/fnc_cprStart.sqf index f49ccbb4a3..07a5edf819 100644 --- a/addons/medical_treatment/functions/fnc_cprStart.sqf +++ b/addons/medical_treatment/functions/fnc_cprStart.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Zakant * Handles starting the CPR treatment. diff --git a/addons/medical_treatment/functions/fnc_cprSuccess.sqf b/addons/medical_treatment/functions/fnc_cprSuccess.sqf index bd9d0c3e2b..35f7292ad2 100644 --- a/addons/medical_treatment/functions/fnc_cprSuccess.sqf +++ b/addons/medical_treatment/functions/fnc_cprSuccess.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handles finishing performing CPR on the patient. diff --git a/addons/medical_treatment/functions/fnc_createLitter.sqf b/addons/medical_treatment/functions/fnc_createLitter.sqf index 93b7e7397e..28269bb4ce 100644 --- a/addons/medical_treatment/functions/fnc_createLitter.sqf +++ b/addons/medical_treatment/functions/fnc_createLitter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Creates litter around the patient based on the treatment. @@ -28,10 +28,9 @@ 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} +private _isBleeding = (GET_OPEN_WOUNDS(_patient) get _bodyPart) findIf { + _x params ["", "_amountOf", "_bleeding"]; + _amountOf * _bleeding > 0 } != -1; // Get litter config for the treatment diff --git a/addons/medical_treatment/functions/fnc_createLitterServer.sqf b/addons/medical_treatment/functions/fnc_createLitterServer.sqf index 790d1d21c5..afeba0eb36 100644 --- a/addons/medical_treatment/functions/fnc_createLitterServer.sqf +++ b/addons/medical_treatment/functions/fnc_createLitterServer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Creates a litter object and handles its cleanup. Only execute on server. diff --git a/addons/medical_treatment/functions/fnc_diagnose.sqf b/addons/medical_treatment/functions/fnc_diagnose.sqf index 531827302d..5605cd2794 100644 --- a/addons/medical_treatment/functions/fnc_diagnose.sqf +++ b/addons/medical_treatment/functions/fnc_diagnose.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Action for diagnosing in basic medical diff --git a/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf deleted file mode 100644 index a7a133c2e4..0000000000 --- a/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf +++ /dev/null @@ -1,72 +0,0 @@ -#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_findMostEffectiveWounds.sqf b/addons/medical_treatment/functions/fnc_findMostEffectiveWounds.sqf new file mode 100644 index 0000000000..6f11f84f57 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_findMostEffectiveWounds.sqf @@ -0,0 +1,92 @@ +#include "..\script_component.hpp" +/* + * Author: kymckay, LinkIsGrim + * Finds the most effective wounds to bandage on the given bodypart of the patient for the given bandage type and remaining overall bandage effectiveness. + * + * Arguments: + * 0: Patient + * 1: Treatment classname + * 2: Body part + * 3: Amount of bandage remaining (default: 1) + * 4: Wounds found from prior runs of the function (default: Empty Hashmap) + * + * Return Value: + * [Wound, [Effectiveness, Index, Impact]] of : + * + * Example: + * [cursorObject, "FieldDressing", "rightleg"] call ace_medical_treatment_fnc_findMostEffectiveWounds + * + * Public: No + */ + +params ["_patient", "_bandage", "_bodyPart", ["_bandageRemaining", 1], ["_foundWounds", createHashMap]]; +TRACE_1("findMostEffectiveWounds",count _foundWounds); + +// 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) getOrDefault [_bodyPart, []]; +if (_openWounds isEqualTo []) exitWith {_foundWounds}; + +private _wound = EMPTY_WOUND; +private _woundIndex = -1; +private _effectivenessFound = -1; +private _impactFound = -1; + +{ + // Ignore iterated wounds + if (_x in _foundWounds) then {continue}; + _x params ["_classID", "_amountOf", "_bleeding", "_damage"]; + + 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 effectiveness for all wound types) + if (_bandage != "BasicBandage") then { + WARNING_2("No config for wound type [%1] config base [%2]",_className,_config); + }; + }; + + // Multiply by bandageRemaining in case this is a rollover + _woundEffectiveness = _woundEffectiveness * _bandageRemaining; + + // Track most effective found so far + if ((_woundEffectiveness * _amountOf * _bleeding) > (_effectivenessFound * (_wound select 1) * (_wound select 2))) then { + _effectivenessFound = _woundEffectiveness; + _impactFound = _amountOf min _effectivenessFound; + _woundIndex = _forEachIndex; + _wound = _x; + }; +} forEach _openWounds; + +if (_woundIndex isEqualTo -1) exitWith {_foundWounds}; + +_bandageRemaining = _bandageRemaining - (_impactFound/_effectivenessFound); +_foundWounds set [_wound, [_effectivenessFound, _woundIndex, _impactFound]]; + +// recursion, run function again to find next most effective wound +if (GVAR(bandageRollover) && {_bandageRemaining > 0}) then { + [_patient, _bandage, _bodyPart, _bandageRemaining, _foundWounds] call FUNC(findMostEffectiveWounds); +}; + +_foundWounds // return diff --git a/addons/medical_treatment/functions/fnc_fullHeal.sqf b/addons/medical_treatment/functions/fnc_fullHeal.sqf index c5027e7dbe..0d8e93d3c7 100644 --- a/addons/medical_treatment/functions/fnc_fullHeal.sqf +++ b/addons/medical_treatment/functions/fnc_fullHeal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Fully heals the patient. diff --git a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf index 0a1c498d41..e845e04304 100644 --- a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf +++ b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Local callback for fully healing a patient. @@ -20,6 +20,11 @@ TRACE_1("fullHealLocal",_patient); if (!alive _patient) exitWith {}; +// check if on fire, then put out the fire before healing +if ((["ace_fire"] call EFUNC(common,isModLoaded)) && {[_patient] call EFUNC(fire,isBurning)}) then { + _patient setVariable [QEGVAR(fire,intensity), 0, true]; +}; + private _state = GET_SM_STATE(_patient); TRACE_1("start",_state); @@ -45,9 +50,9 @@ _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 [VAR_OPEN_WOUNDS, createHashMap, true]; +_patient setVariable [VAR_BANDAGED_WOUNDS, createHashMap, true]; +_patient setVariable [VAR_STITCHED_WOUNDS, createHashMap, true]; _patient setVariable [QEGVAR(medical,isLimping), false, true]; _patient setVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES, true]; diff --git a/addons/medical_treatment/functions/fnc_getBandageTime.sqf b/addons/medical_treatment/functions/fnc_getBandageTime.sqf index 8a6248e3b5..ffe5c81f63 100644 --- a/addons/medical_treatment/functions/fnc_getBandageTime.sqf +++ b/addons/medical_treatment/functions/fnc_getBandageTime.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Calculates the time to bandage a wound based on it's size, the patient and the medic. * * Arguments: @@ -13,34 +13,45 @@ * Treatment Time * * Example: - * [player, cursorTarget, "Head", "FieldDressing"] call ace_medical_treatment_fnc_getBandageTime + * [player, cursorTarget, "head", "FieldDressing"] call ace_medical_treatment_fnc_getBandageTime * * Public: No */ -params ["_medic", "_patient", "_bodypart", "_bandage"]; +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); +private _targetWounds = [_patient, _bandage, _bodyPart] call FUNC(findMostEffectiveWounds); +TRACE_1("findMostEffectiveWounds",_targetWounds); + +private _woundCount = count _targetWounds; // 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); +if (_woundCount == 0) exitWith {0}; // Base bandage time is based on wound size and remaining percentage -private _bandageTime = [BANDAGE_TIME_S, BANDAGE_TIME_M, BANDAGE_TIME_L] select _category; +private _bandageTimesArray = [BANDAGE_TIME_S, BANDAGE_TIME_M, BANDAGE_TIME_L]; +private _bandageTime = 0; -// 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]; -}; +{ + private _wound = _x; + _wound params ["_classID", "", "_amountOf"]; + _y params ["_effectiveness", "", "_impact"]; + private _category = (_classID % 10); + + // Base bandage time is based on wound size and remaining percentage + private _woundTime = _bandageTimesArray 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 { + _woundTime = _woundTime * linearConversion [0, _effectiveness, _impact, 0.666, 1, true]; + }; + + _bandageTime = _bandageTime + _woundTime; +} forEach _targetWounds; // Medics are more practised at applying bandages if ([_medic] call FUNC(isMedic)) then { @@ -52,6 +63,11 @@ if (_medic == _patient) then { _bandageTime = _bandageTime + BANDAGE_TIME_MOD_SELF; }; +// Bandaging multiple injuries doesn't require opening a new bandage each time +if (_woundCount > 1) then { + _bandageTime = _bandageTime - (2 * _woundCount); +}; + 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 index e8e8c302bf..74c2bb26d8 100644 --- a/addons/medical_treatment/functions/fnc_getHealTime.sqf +++ b/addons/medical_treatment/functions/fnc_getHealTime.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the PAK treatment time based on the amount of damage to heal. diff --git a/addons/medical_treatment/functions/fnc_getStitchTime.sqf b/addons/medical_treatment/functions/fnc_getStitchTime.sqf index 12c770eb95..f170d9db26 100644 --- a/addons/medical_treatment/functions/fnc_getStitchTime.sqf +++ b/addons/medical_treatment/functions/fnc_getStitchTime.sqf @@ -1,21 +1,22 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: mharis001 + * Author: kymckay * Calculates the Surgical Kit treatment time based on the amount of stitchable wounds. * * Arguments: * 0: Medic (not used) * 1: Patient + * 2: Body Part * * Return Value: * Treatment Time * * Example: - * [player, cursorObject] call ace_medical_treatment_fnc_getStitchTime + * [player, cursorObject, "head"] call ace_medical_treatment_fnc_getStitchTime * * Public: No */ -params ["", "_patient"]; +params ["", "_patient", "_bodyPart"]; -count (_patient call FUNC(getStitchableWounds)) * GVAR(woundStitchTime) +count (GET_BANDAGED_WOUNDS(_patient) getOrDefault [_bodyPart, []]) * GVAR(woundStitchTime) diff --git a/addons/medical_treatment/functions/fnc_getStitchableWounds.sqf b/addons/medical_treatment/functions/fnc_getStitchableWounds.sqf deleted file mode 100644 index a46d878409..0000000000 --- a/addons/medical_treatment/functions/fnc_getStitchableWounds.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#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 index 6db6484b8f..22207a5496 100644 --- a/addons/medical_treatment/functions/fnc_getTriageStatus.sqf +++ b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Returns the current triage status of the unit. diff --git a/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf index 31affbb311..69a6118099 100644 --- a/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handles the bandage of a patient. @@ -6,7 +6,7 @@ * Arguments: * 0: The target * 1: The impact - * 2: Selection part number + * 2: Body part * 3: Injury index * 4: Injury * 5: Used Bandage type @@ -20,7 +20,7 @@ params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; TRACE_6("handleBandageOpening",_target,_impact,_part,_injuryIndex,_injury,_bandage); -_injury params ["_classID", "_bodyPartN"]; +_injury params ["_classID"]; private _className = EGVAR(medical_damage,woundClassNamesComplex) select _classID; private _reopeningChance = DEFAULT_BANDAGE_REOPENING_CHANCE; @@ -61,19 +61,19 @@ TRACE_5("configs",_bandage,_className,_reopeningChance,_reopeningMinDelay,_reope 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); + _x params ["_id", "_amountOf"]; + if (_id == _classID) exitWith { + _x set [1, _amountOf + _impact]; + TRACE_2("adding to existing bandagedWound",_id,_part); _exist = true; }; -} forEach _bandagedWounds; +} forEach (_bandagedWounds getOrDefault [_part, []]); if (!_exist) then { - TRACE_2("adding new bandagedWound",_classID,_bodyPartN); + TRACE_2("adding new bandagedWound",_classID,_part); private _bandagedInjury = +_injury; - _bandagedInjury set [2, _impact]; - _bandagedWounds pushBack _bandagedInjury; + _bandagedInjury set [1, _impact]; + (_bandagedWounds getOrDefault [_part, [], true]) pushBack _bandagedInjury; }; _target setVariable [VAR_BANDAGED_WOUNDS, _bandagedWounds, true]; @@ -92,42 +92,45 @@ if (random 1 <= _reopeningChance * GVAR(woundReopenChance)) then { 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); }; + private _woundsOnPart = _openWounds getOrDefault [_part, []]; + if (count _woundsOnPart - 1 < _injuryIndex) exitWith { TRACE_2("index bounds",_injuryIndex,count _woundsOnPart); }; - _injury params ["_classID", "_bodyPartN"]; + _injury params ["_classID"]; - private _selectedInjury = _openWounds select _injuryIndex; - _selectedInjury params ["_selClassID", "_selBodyPart", "_selAmmount"]; - if ((_selClassID == _classID) && {_selBodyPart == _bodyPartN}) then { // matching the IDs + private _selectedInjury = _woundsOnPart select _injuryIndex; + _selectedInjury params ["_selClassID", "_selAmmount"]; + if (_selClassID == _classID) then { // matching the IDs private _bandagedWounds = GET_BANDAGED_WOUNDS(_target); private _exist = false; { - _x params ["_id", "_partN", "_amountOf"]; - if ((_id == _classID) && {_partN == _bodyPartN}) exitWith { + _x params ["_id", "_amountOf"]; + if (_id == _classID) exitWith { TRACE_2("bandagedWound exists",_id,_classID); - _x set [2, 0 max (_amountOf - _impact)]; + _x set [1, 0 max (_amountOf - _impact)]; _exist = true; }; - } forEach _bandagedWounds; + } forEach (_bandagedWounds getOrDefault [_part, []]); if (_exist) then { TRACE_2("Reopening Wound",_bandagedWounds,_openWounds); - _selectedInjury set [2, _selAmmount + _impact]; + _selectedInjury set [1, _selAmmount + _impact]; _target setVariable [VAR_BANDAGED_WOUNDS, _bandagedWounds, true]; _target setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; [_target] call EFUNC(medical_status,updateWoundBloodLoss); + private _partIndex = ALL_BODY_PARTS find _part; + // Re-add trauma and damage visuals if (GVAR(clearTrauma) == 2) then { private _injuryDamage = (_selectedInjury select 4) * _impact; private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; - private _newDam = (_bodyPartDamage select _selBodyPart) + _injuryDamage; - _bodyPartDamage set [_selBodyPart, _newDam]; + private _newDam = (_bodyPartDamage select _partIndex) + _injuryDamage; + _bodyPartDamage set [_partIndex, _newDam]; _target setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; - switch (_selBodyPart) do { + switch (_partIndex) do { case 0: { [_target, true, false, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; case 1: { [_target, false, true, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; case 2; @@ -137,12 +140,12 @@ if (random 1 <= _reopeningChance * GVAR(woundReopenChance)) then { }; // Check if we gained limping from this wound re-opening - if ((EGVAR(medical,limping) == 1) && {_bodyPartN > 3}) then { + if ((EGVAR(medical,limping) == 1) && {_partIndex > 3}) then { [_target] call EFUNC(medical_engine,updateDamageEffects); }; }; } else { - TRACE_3("no match",_selectedInjury,_classID,_bodyPartN); + TRACE_3("no match",_selectedInjury,_classID,_part); }; }, [_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 index 78d3f79b68..e84a79f142 100644 --- a/addons/medical_treatment/functions/fnc_hasItem.sqf +++ b/addons/medical_treatment/functions/fnc_hasItem.sqf @@ -1,9 +1,10 @@ -#include "script_component.hpp" +#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. + * If medic or patient are in a vehicle then vehicle's inventory will also be checked. * * Arguments: * 0: Medic @@ -25,6 +26,10 @@ private _fnc_checkItems = { params ["_unit"]; private _unitItems = _unit call EFUNC(common,uniqueItems); + private _unitVehicle = objectParent _unit; + if (!isNull _unitVehicle) then { + _unitItems append (itemCargo _unitVehicle); + }; _items findIf {_x in _unitItems} != -1 }; diff --git a/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf index c8d2aa8e7b..9ef1261238 100644 --- a/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf +++ b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks if the unit has a tourniquet applied on the specified body part. diff --git a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf index d2789f5d38..2d4468d2c4 100644 --- a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Checks if the unit is in a medical facility. diff --git a/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf index 2f76f04f99..f6ca395f9c 100644 --- a/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Checks if the unit is in a medical vehicle. diff --git a/addons/medical_treatment/functions/fnc_isMedic.sqf b/addons/medical_treatment/functions/fnc_isMedic.sqf index d109ad2452..7e1360e5ed 100644 --- a/addons/medical_treatment/functions/fnc_isMedic.sqf +++ b/addons/medical_treatment/functions/fnc_isMedic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, KoffeinFlummi * Checks if the unit is a medic of the given level. diff --git a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf index dda930a4f4..4747860ae6 100644 --- a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks if the vehicle is a medical vehicle. diff --git a/addons/medical_treatment/functions/fnc_ivBag.sqf b/addons/medical_treatment/functions/fnc_ivBag.sqf index bfc149564e..7f56f332b3 100644 --- a/addons/medical_treatment/functions/fnc_ivBag.sqf +++ b/addons/medical_treatment/functions/fnc_ivBag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Administers an IV bag treatment to the patient. diff --git a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf index f2640fb0bf..64eabf844a 100644 --- a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf +++ b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Local callback for administering an IV bag to a patient. diff --git a/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf index 1039edb4c6..f9450ac5e1 100644 --- a/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, esteldunedain, mharis001 * Handles cleaning up litter objects that have reached the end of their lifetime. diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf index 8b556014e1..edb9cbe062 100644 --- a/addons/medical_treatment/functions/fnc_loadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Loads an unconscious or dead patient in the given or nearest vehicle. @@ -32,7 +32,13 @@ if (_patient call EFUNC(medical_status,isBeingDragged)) then { [_medic, _patient] call EFUNC(dragging,dropObject); }; -private _vehicle = [_medic, _patient, _vehicle] call EFUNC(common,loadPerson); +private _vehicle = [ + _medic, + _patient, + _vehicle, + getArray (configOf _vehicle >> QGVAR(patientSeats)), + ([configOf _vehicle >> QGVAR(patientReverseFill), "NUMBER", 1] call CBA_fnc_getConfigEntry) > 0 +] call EFUNC(common,loadPerson); if (isNull _vehicle) exitWith { TRACE_1("no vehicle found",_vehicle); }; @@ -46,7 +52,6 @@ if (isNull _vehicle) exitWith { TRACE_1("no vehicle found",_vehicle); }; private _vehicleName = getText (configOf _vehicle >> "displayName"); [[LSTRING(LoadedInto), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); }, [_patient, _vehicle], 3, { - params ["_unit", "_emptyPos"]; + params ["_unit", "_vehicle"]; 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 index 6def70b212..b69a63e994 100644 --- a/addons/medical_treatment/functions/fnc_medication.sqf +++ b/addons/medical_treatment/functions/fnc_medication.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Administers medication to the patient on the given body bodypart. diff --git a/addons/medical_treatment/functions/fnc_medicationLocal.sqf b/addons/medical_treatment/functions/fnc_medicationLocal.sqf index bb14e14b5b..b5499e9bb4 100644 --- a/addons/medical_treatment/functions/fnc_medicationLocal.sqf +++ b/addons/medical_treatment/functions/fnc_medicationLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Local callback for administering medication to a patient. diff --git a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf index da2253ca18..6235358446 100644 --- a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handles the medication given to a patient. diff --git a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf index 3154107e01..fd4a62a10b 100644 --- a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf +++ b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Places a dead body inside a body bag. @@ -31,7 +31,7 @@ if (!local _patient) exitWith { if (alive _patient) then { TRACE_1("Manually killing with setDead",_patient); - [_patient, "buried_alive"] call EFUNC(medical_status,setDead); + [_patient, "buried_alive", _medic] call EFUNC(medical_status,setDead); }; private _position = (getPosASL _patient) vectorAdd [0, 0, 0.2]; diff --git a/addons/medical_treatment/functions/fnc_removeBody.sqf b/addons/medical_treatment/functions/fnc_removeBody.sqf index e86d374e8e..5380b7e8f1 100644 --- a/addons/medical_treatment/functions/fnc_removeBody.sqf +++ b/addons/medical_treatment/functions/fnc_removeBody.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Removes a body. Ideally it is deleted the next frame. diff --git a/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf b/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf new file mode 100644 index 0000000000..0501dc5eb5 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf @@ -0,0 +1,38 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Caches all item classnames used in ACE_Medical_Treatment_Actions + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_medical_treatment_fnc_scanMedicalItems + * + * Public: No + */ + +private _list = []; +private _cfgActions = configFile >> QGVAR(actions); + +private _fnc_isMedicalItem = toString { + getNumber (_x >> "ACE_isMedicalItem") isEqualTo 1 +}; + +// Get items in ACE_Medical_Treament_Actions, fallback for items without API config property +{ + _list append (getArray (_x >> "items")); +} forEach ("true" configClasses _cfgActions); + +{ + _list pushBack (configName _x); +} forEach (_fnc_isMedicalItem configClasses (configFile >> "CfgWeapons")); + +{ + _list pushBack (configName _x); +} forEach (_fnc_isMedicalItem configClasses (configFile >> "CfgMagazines")); + +uiNamespace setVariable [QGVAR(treatmentItems), compileFinal str (_list arrayIntersect _list)] diff --git a/addons/medical_treatment/functions/fnc_setTriageStatus.sqf b/addons/medical_treatment/functions/fnc_setTriageStatus.sqf index aee8326056..dffd5f7154 100644 --- a/addons/medical_treatment/functions/fnc_setTriageStatus.sqf +++ b/addons/medical_treatment/functions/fnc_setTriageStatus.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Sets the traige status of the given unit. diff --git a/addons/medical_treatment/functions/fnc_splint.sqf b/addons/medical_treatment/functions/fnc_splint.sqf index f7883da86a..e48fb55d36 100644 --- a/addons/medical_treatment/functions/fnc_splint.sqf +++ b/addons/medical_treatment/functions/fnc_splint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Applies a splint to the patient on the given body part. diff --git a/addons/medical_treatment/functions/fnc_splintLocal.sqf b/addons/medical_treatment/functions/fnc_splintLocal.sqf index f0834b328e..f415d8296f 100644 --- a/addons/medical_treatment/functions/fnc_splintLocal.sqf +++ b/addons/medical_treatment/functions/fnc_splintLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Local callback for applying a splint to a patient. diff --git a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf index 9928936f30..c099d04011 100644 --- a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf +++ b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, mharis001 * Handles the surgical kit treatment by periodically closing bandaged wounds. @@ -7,6 +7,7 @@ * 0: Arguments * 0: Medic (not used) * 1: Patient + * 2: Body Part * 1: Elapsed Time * 2: Total Time * @@ -20,49 +21,50 @@ */ 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) * GVAR(woundStitchTime)) exitWith {true}; +_args params ["_medic", "_patient", "_bodyPart"]; private _bandagedWounds = GET_BANDAGED_WOUNDS(_patient); -private _stitchedWounds = GET_STITCHED_WOUNDS(_patient); +private _bandagedWoundsOnPart = _bandagedWounds get _bodyPart; + +// Stop treatment if there are no wounds that can be stitched remaining +if (_bandagedWoundsOnPart isEqualTo []) exitWith {false}; + +// Not enough time has elapsed to stitch a wound +if (_totalTime - _elapsedTime > ([_patient, _patient, _bodyPart] call FUNC(getStitchTime)) - GVAR(woundStitchTime)) exitWith {true}; // Remove the first stitchable wound from the bandaged wounds -private _treatedWound = _bandagedWounds deleteAt (_bandagedWounds find (_stitchableWounds select 0)); -_treatedWound params ["_treatedID", "_treatedBodyPartN", "_treatedAmountOf", "", "_treatedDamageOf"]; +private _treatedWound = _bandagedWoundsOnPart deleteAt (count _bandagedWoundsOnPart - 1); +_treatedWound params ["_treatedID", "_treatedAmountOf", "", "_treatedDamageOf"]; // 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"]; +private _stitchedWounds = GET_STITCHED_WOUNDS(_patient); +private _stitchedWoundsOnPart = _stitchedWounds getOrDefault [_bodyPart, [], true]; - _classID == _treatedID && {_bodyPartN == _treatedBodyPartN} +private _woundIndex = _stitchedWoundsOnPart findIf { + _x params ["_classID"]; + _classID == _treatedID }; if (_woundIndex == -1) then { - _stitchedWounds pushBack _treatedWound; + _stitchedWoundsOnPart pushBack _treatedWound; } else { - private _wound = _stitchedWounds select _woundIndex; - _wound set [2, (_wound select 2) + _treatedAmountOf]; + private _wound = _stitchedWoundsOnPart select _woundIndex; + _wound set [1, (_wound select 1) + _treatedAmountOf]; }; if (GVAR(clearTrauma) == 1) then { - TRACE_2("clearTrauma - clearing trauma after stitching",_partIndex,_treatedWound); + private _partIndex = ALL_BODY_PARTS find _bodyPart; + TRACE_2("clearTrauma - clearing trauma after stitching",_bodyPart,_treatedWound); private _bodyPartDamage = _patient getVariable [QEGVAR(medical,bodyPartDamage), []]; - _bodyPartDamage set [_treatedBodyPartN, (_bodyPartDamage select _treatedBodyPartN) - _treatedDamageOf]; + _bodyPartDamage set [_partIndex, (_bodyPartDamage select _partIndex) - _treatedDamageOf]; _patient setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; - TRACE_2("clearTrauma - healed damage",_partIndex,_treatedDamageOf); + TRACE_2("clearTrauma - healed damage",_bodyPart,_treatedDamageOf); - switch (_treatedBodyPartN) 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); }; + switch (_bodyPart) do { + case "head": { [_patient, true, false, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + case "body": { [_patient, false, true, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; + case "leftarm"; + case "rightarm": { [_patient, false, false, true, false] call EFUNC(medical_engine,updateBodyPartVisuals); }; default { [_patient, false, false, false, true] call EFUNC(medical_engine,updateBodyPartVisuals); }; }; }; @@ -71,9 +73,19 @@ _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); +if ( + EGVAR(medical,limping) == 2 + && {_patient getVariable [QEGVAR(medical,isLimping), false]} + && {_bodyPart in ["leftleg", "rightleg"]} +) then { + TRACE_3("Updating damage effects",_patient,_bodyPart,local _patient); [QEGVAR(medical_engine,updateDamageEffects), _patient, _patient] call CBA_fnc_targetEvent; }; -true +// Consume a suture for the next wound if one exists, stop stitching if none are left +if (GVAR(consumeSurgicalKit) == 2 && {_bandagedWoundsOnPart isNotEqualTo []}) then { + ([_medic, _patient, ["ACE_suture"]] call FUNC(useItem)) params ["_user"]; + !isNull _user +} else { + true +} diff --git a/addons/medical_treatment/functions/fnc_surgicalKitStart.sqf b/addons/medical_treatment/functions/fnc_surgicalKitStart.sqf new file mode 100644 index 0000000000..b194f88736 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_surgicalKitStart.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Brett Mayson + * Handles the surgical kit treatment start by consuming a suture when applicable + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_surgicalKitStart + * + * Public: No + */ + +params ["_medic", "_patient"]; +TRACE_2("surgicalKitStart",_medic,_patient); + +if (GVAR(consumeSurgicalKit) == 2) then { + ([_medic, _patient, ["ACE_suture"]] call FUNC(useItem)); +}; diff --git a/addons/medical_treatment/functions/fnc_tourniquet.sqf b/addons/medical_treatment/functions/fnc_tourniquet.sqf index 155a2c502b..8e70529ece 100644 --- a/addons/medical_treatment/functions/fnc_tourniquet.sqf +++ b/addons/medical_treatment/functions/fnc_tourniquet.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Applies a tourniquet to the patient on the given body part. diff --git a/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf index e20510951b..3fe5f4e55d 100644 --- a/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf +++ b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Local callback for applying a tourniquet to a patient. diff --git a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf index 2eb620bf77..5c5cf93dc8 100644 --- a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf +++ b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Removes the tourniquet from the patient on the given body part. @@ -38,9 +38,9 @@ private _nearPlayers = (_patient nearEntities ["CAManBase", 6]) select {_x call 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"] call EFUNC(common,addToInventory); +// Add tourniquet item to medic or patient +private _receiver = [_patient, _medic, _medic] select GVAR(allowSharedEquipment); +[_receiver, "ACE_tourniquet"] call EFUNC(common,addToInventory); // Handle occluded medications that were blocked due to tourniquet private _occludedMedications = _patient getVariable [QEGVAR(medical,occludedMedications), []]; diff --git a/addons/medical_treatment/functions/fnc_treatment.sqf b/addons/medical_treatment/functions/fnc_treatment.sqf index b99e703f22..0c89820eb4 100644 --- a/addons/medical_treatment/functions/fnc_treatment.sqf +++ b/addons/medical_treatment/functions/fnc_treatment.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, KoffeinFlummi, mharis001 * Starts the treatment process. @@ -156,7 +156,7 @@ if (_callbackProgress isEqualTo {}) then { FUNC(treatmentFailure), getText (_config >> "displayNameProgress"), _callbackProgress, - ["isNotInside"] + ["isNotInside", "isNotSwimming"] ] call EFUNC(common,progressBar); true diff --git a/addons/medical_treatment/functions/fnc_treatmentFailure.sqf b/addons/medical_treatment/functions/fnc_treatmentFailure.sqf index 3519c3fba0..64d18fa830 100644 --- a/addons/medical_treatment/functions/fnc_treatmentFailure.sqf +++ b/addons/medical_treatment/functions/fnc_treatmentFailure.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Glowbal, mharis001 * Handles treatment process failure. diff --git a/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf b/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf index 06ad566d5c..96f0d11ead 100644 --- a/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf +++ b/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Glowbal, mharis001 * Handles treatment process success. diff --git a/addons/medical_treatment/functions/fnc_unloadUnit.sqf b/addons/medical_treatment/functions/fnc_unloadUnit.sqf index 07410493ad..0ddc297a32 100644 --- a/addons/medical_treatment/functions/fnc_unloadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_unloadUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Unloads an unconscious or dead patient from their vehicle. @@ -19,7 +19,7 @@ params ["_medic", "_patient"]; TRACE_2("unloadUnit",_medic,_patient); -if (vehicle _patient == _patient) exitWith { +if (isNull objectParent _patient) exitWith { ERROR_1("Unit %1 is not in a vehicle",_patient); }; @@ -27,18 +27,18 @@ 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; +["ace_unloadPersonEvent", [_patient, objectParent _patient, _medic], _patient] call CBA_fnc_targetEvent; [{ - params ["_unit", "_vehicle"]; - (alive _unit) && {alive _vehicle} && {(vehicle _unit) != _vehicle} + params ["_unit"]; + isNull objectParent _unit }, { params ["_unit", "_vehicle"]; TRACE_2("success",_unit,_vehicle); private _patientName = [_unit, false, true] call EFUNC(common,getName); private _vehicleName = getText (configOf _vehicle >> "displayName"); [[LSTRING(UnloadedFrom), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); -}, [_patient, vehicle _patient], 3, { +}, [_patient, objectParent _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 index 5425e0848c..08fc860569 100644 --- a/addons/medical_treatment/functions/fnc_useItem.sqf +++ b/addons/medical_treatment/functions/fnc_useItem.sqf @@ -1,7 +1,8 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, mharis001 * Uses one of the treatment items. Respects the priority defined by the allowSharedEquipment setting. + * Can use items from vehicle inventory if either unit is in a vehicle. * * Arguments: * 0: Medic @@ -25,9 +26,14 @@ private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select GV { private _unit = _x; + private _unitVehicle = objectParent _unit; private _unitItems = _x call EFUNC(common,uniqueItems); { + if (!isNull _unitVehicle && {_x in (itemCargo _unitVehicle)}) then { + _unitVehicle addItemCargoGlobal [_x, -1]; + [_unit, _x] breakOut "Main"; + }; if (_x in _unitItems) then { _unit removeItem _x; [_unit, _x] breakOut "Main"; diff --git a/addons/medical_treatment/functions/script_component.hpp b/addons/medical_treatment/functions/script_component.hpp deleted file mode 100644 index 86227531f9..0000000000 --- a/addons/medical_treatment/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#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 index 40e8dcaf87..fd83a9995f 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -25,6 +25,24 @@ true ] call CBA_fnc_addSetting; +[ + QGVAR(bandageRollover), + "CHECKBOX", + [LSTRING(bandageRollover_DisplayName), LSTRING(bandageRollover_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + false // server can force if necessary, otherwise client decides +] call CBA_fnc_addSetting; + +[ + QGVAR(bandageEffectiveness), + "SLIDER", + [LSTRING(bandageEffectiveness_DisplayName), LSTRING(bandageEffectiveness_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0, 5, 1, 2], + true +] call CBA_fnc_addSetting; + [ QGVAR(woundReopenChance), "SLIDER", @@ -193,7 +211,7 @@ "LIST", [LSTRING(ConsumeSurgicalKit_DisplayName), LSTRING(ConsumeSurgicalKit_Description)], [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + [[0, 1, 2], ["str_eval_typenothing", LSTRING(SurgicalKit_Display), LSTRING(Suture_Display)], 0], true ] call CBA_fnc_addSetting; diff --git a/addons/medical_treatment/script_component.hpp b/addons/medical_treatment/script_component.hpp index 682e8a471c..36173d4ac1 100644 --- a/addons/medical_treatment/script_component.hpp +++ b/addons/medical_treatment/script_component.hpp @@ -54,3 +54,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 + +#define MEDICAL_TREATMENT_ITEMS (call (uiNamespace getVariable [QGVAR(treatmentItems), {[]}])) diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 2e6d800858..e597980f9e 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -9,11 +9,13 @@ Traitement Tratamento 治療 + 治疗 Trattamento Léčba Leczenie Tedavi Tratamiento + 치료 Litter @@ -22,12 +24,14 @@ Медицинский мусор Lixo 醫療用廢棄物 + 医疗废弃物 Rifiuti Odpadky Śmieci Abfall Cöp Basura + 의료폐기물 Advanced Diagnose @@ -37,31 +41,40 @@ Diagnostic avancé Diagnóstico Avançado 進階診斷 + 进阶诊断 Diagnosi avanzata Pokročilá diagnóza Zaawansowana Diagnoza Gelişmiş Teşhis Diagnóstico avanzado + 고급 진료 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當這個選項啟用時必須診斷病患是否無意識或者心搏停止。 + 启用后,可以检查脉搏、血压和反应治疗,而不是通用诊断。\n禁用时,心肺复苏操作将仅在适当时显示。\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. Genel Teşhis eylemi yerine Nabzı Kontrol Et, Kan Basıncını Kontrol Et ve Yanıtı Kontrol Et tedavi eylemlerini etkinleştirir. \ Devre dışı bırakıldığında, CPR eylemi yalnızca CPR gerçekleştirilmesi uygun olduğunda gösterilecektir. Habilita la comprobación del pulso, presión sanguinea y rsepuesta a las acciones del tratamiento en lugar de la acción de diagnóstico genérico. \n Cuando se deshabilita, la acción RCP solo se mostrará cuando realizar un RCP sea apropiado. \n Las acciones activadas de este ajuste son necesarias para determinar si una persona está inconsciente o en parada cardiaca. + 맥박 확인, 혈압 확인, 반응 확인 등의 일반적인 진료행위를 추가합니다. \n 비활성화시 심폐소생술은 가능 할때만 표시됩니다. \n 해당 옵션은 인원이 기절한건지 아니면 심정지가 왔는지 구분할 때 쓰입니다. Enabled & Can Diagnose Death/Cardiac Arrest Activé & Diagnostic du décès/de l'arrêt cardiaque Włączone i pozwala zdiagnozować Śmierć/Zatrzymanie Akcji Serca 死亡/心停止状態でも診断許可 + Включено & Может диагностировать смерть/остановку сердца + Aktiviert & kann Tod/Herzstillstand diagnostizieren + 已启用 & 可以诊断死亡/心搏骤停 + 활성화 및 사망/심정지 진찰가능 + Habilitado y poder diagnosticar Muerte/Parada cardíaca Advanced Medication @@ -71,11 +84,13 @@ Médication avancée Medicação Avançada 進階醫療用品 + 进阶医疗用品 Pokročilé léky Medicazione avanzata Zaawansowane leki Gelişmiş Ilaç Medicación avanzada + 고급 약물 Enables extended, more in-depth medication handling. Also, enables the use of Adenosine. @@ -84,11 +99,13 @@ 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. Habilita el manejo de la medicación más avanzada y en profundidad. Tambien permite el uso de Adenosina. + 더욱 더 확장된, 깊은 약물 치료를 활성화합니다. 또한 아데노신 기능을 활성화합니다. Advanced Bandages @@ -98,11 +115,13 @@ Pansements avancés Ataduras Avançadas 進階包紮 + 进阶包扎 Bendaggi avanzati Pokročilé obvazy Zaawansowane Bandaże Gelişmiş Bandajlar Vendaje avanzado + 고급 붕대 Enables treatment actions for different bandage types instead of the generic Bandage action.\nAdditionally, the reopening of bandaged wounds can also be enabled. @@ -112,11 +131,13 @@ Включает действия для разных типов повязок, вместо общего действия «Перевязка». Ativa o uso de tipos diferentes de ataduras ao invés de apenas a atadura básica. 啟用不同繃帶的可用行為而非一般包紮動作。 + 启用不同绷带类型的治疗操作,而不是通用的绷带操作。\n此外,也可以启用包扎伤口开裂。 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. Genel Bandaj eylemi yerine farklı bandaj türleri için tedavi eylemlerini etkinleştirir. \ Ek olarak, bandajlı yaraların yeniden açılması da etkinleştirilebilir. Habilita las acciones de ttratamiento para distintos tipos de vendajes en lugar de la acción de vendaje genérico + 붕대마다 조금씩 다른 차이를 둬 상황에 알맞는 붕대를 쓰게 합니다.\n또한 붕대 풀림을 구현합니다. Enabled & Can Reopen @@ -127,17 +148,22 @@ Aktywne & możliwe ponowne otwarcie Etkinleştirildi ve Yeniden Açılabilir Habilitada y pueden reabrirse + Aktiviert und können sich wieder öffnen + 已启用 & 可以伤口开裂 + 활성화 및 붕대 풀림 구현 Wound Reopening Coefficient Coefficient de réouverture des plaies Wundwiederöffnungskoeffizient Koeficient opětovného otevření rány - Коэффициент повторного открытия раны + Коэф. повторного открытия раны Współczynnik ponownego otwierania ran 再開放係数 Yara Yeniden Açılma Katsayısı Coeficiente de reapertura de heridas + 伤口开裂系数 + 붕대 풀림 계수 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. @@ -149,22 +175,52 @@ 傷が再開放する確率の係数を設定できます。再開放は、この数値と傷の種類、そして使用した包帯に応じて左右されます。 Yaranın yeniden açılma şansını kontrol etme katsayısı. Son yeniden açılma şansı, bu değerin kullanılan yara tipi ve bandaj için spesifik yeniden açılma şansı ile çarpılmasıyla belirlenir. Coeficiente que controla la probabilidad de reapertura de heridas. La probabilidad final de reapertura de heridas queda determinada multiplicando este valor por la probabilidad específica del tipo de herida y venda usada. + 用于控制伤口开裂概率的系数。最终的重开放概率=该值x伤口类型x所使用的绷带的具体开裂概率。 + 붕대가 풀리는 기회 계수를 정합니다. 최종 붕대 풀림 계수는 상처의 종류와 쓰인 붕대의 합의 결과에 계수를 곱한 결과입니다. Clear Trauma 外傷の削除 + Soigner les blessures + Очистить рану + Traumata entfernen + Leczenie ran + 清理创伤 + 상처 제거 + Despejar trauma Controls when hitpoint damage from wounds is healed. 治療後に負傷箇所にある外傷の状態を決定できます。 + Définit à quel moment les blessures sont entièrement soignées. + Определяет, когда исцеляется урон от ран. + Steuert, wann Trefferpunktschaden von Wunden geheilt wird. + Kontroluje kiedy punkty obrażeń od odniesionych ran są w pełni wyleczone. + 控制伤口治疗后确定受伤部位的受伤情况。 + 상처가 언제 제거되는 지를 결정합니다. + Controla cuando los puntos de daño de las heridas son curados. After Bandage 包帯を巻いた後 + Après bandage + После перевязки + Nach dem Bandagieren + Po zabandażowaniu + 包扎后 + 붕대 묶은 후 + Después de vendado After Stitch 縫合後 + Après suture + После наложения швов + Nach dem Nähen + Po zszyciu + 缝合后 + 상처 봉합 후 + Después de sutura Boost medical training when in medical vehicles or facilities. Untrained becomes medic, medic becomes doctor. @@ -173,12 +229,14 @@ Увеличивает уровень медподготовки при нахождении в медицинской технике или госпитале. Неподготовленный становится Медиком, Медик становится Доктором. 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. Tıbbi araçlar veya tesislerdeyken tıbbi müdaheleyi artırın. Eğitimsizler sıhhiye olur, sıhhiyeler doktor olur. Aumente la formación médica cuando se encuentre en vehículos o instalaciones médicas. Sin entrenamiento se convierte en médico, médico se convierte en médico. + 의료 차량이나 시설 주위에 있으면 의료 수준을 높입니다. 의무병이 아닌 사람은 의무병이 되고, 의무병은 군의관이 됩니다. Allow Shared Equipment @@ -187,12 +245,14 @@ Разрешить общие медикаменты Permitir Compartilhar Itens Médicos 允許共享設備 + 允许共享装备 Consentire la condivisione di attrezzature Povolit sdílení vybavení Zezwalaj na współdzielenie sprzętu Erlaube geteilte Ausrüstung Paylaşılan Ekipmana İzin Ver Permite compartir material médico. + 의료물자 공유 Controls whether medical equipment can be shared between the patient and the medic. @@ -201,12 +261,14 @@ Контролирует, можно ли разделить медикаменты между пациентом и врачом. 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. Tıbbi ekipmanın hasta ve sağlık görevlisi arasında paylaşılıp paylaşılamayacağını kontrol eder. Controla si el equipo médico se puede compartir entre el paciente y el médico. + 환자와 치료자간에 의료물자를 공유할 지를 결정합니다. Patient's Equipment First @@ -215,12 +277,14 @@ Сначала медикаменты пациента Usar do Paciente Primeiro 優先使用患者的醫療物資 + 优先消耗伤员装备 L'attrezzatura del paziente prima di tutto Prvně pacientovo vybavení Najpierw sprzęt pacjenta Ausrüstung des Patienten zuerst Önce Hastanın Ekipmanı Usar equipo médico del paciente en primer lugar. + 환자의 의료물자 먼저 사용 Medic's Equipment First @@ -229,12 +293,14 @@ Сначала медикаменты врача Usar do Médico Primeiro 優先使用醫療兵的醫療物資 + 优先消耗医疗兵装备 Prima le attrezzature mediche Prvně medikovo vybavení Najpierw sprzęt medyka Ausrüstung des Sanitäters zuerst İlk Sıhhiyenin Ekipmanı Usar equipo médico del santiario en primer lugar. + 치료자의 의료물자 먼저 사용 Autoinjector Treatment Time @@ -243,6 +309,9 @@ Tiempo de tratamiento de autoinyección Время ввода автоинъектора Czas aplikacji autostrzykawki + Behandlungszeit des Autoinjektors + 自动注射器治疗时间 + 주사기 사용 시간 Time, in seconds, required to administer medication using an autoinjector. @@ -251,6 +320,9 @@ Tiempo, en segundos, requerido para administrar medicación utilizando un autoinyectador. Время, необходимое для введения медикаментов автоинъектором (в секундах). Czas w sekundach potrzebny do aplikacji medykamentów za pomocą autostrzykawki. + Zeit in Sekunden, die benötigt wird, um Medikamente mittels Autoinjektor zu verabreichen. + 使用自动注射器给药所需的时间(秒) + 초 단위로 주사기를 사용하는데 걸리는 시간을 정합니다. Tourniquet Treatment Time @@ -260,6 +332,8 @@ Tiempo de tratamiento de torniquete Время наложения/снятия жгута Czas aplikacji stazy + 止血带治疗时间 + 지혈대 사용 시간 Time, in seconds, required to apply/remove a tourniquet. @@ -269,6 +343,8 @@ Tiempo, en segundos, requerido para aplicar/quitar un torniquete. Время, необходимое для наложения/снятия жгута (в секундах). Czas w sekundach potrzebny do założenia/zdjęcia stazy. + 使用/移除止血带所需的时间(秒) + 초 단위로 지혈대를 사용/제거하는 데 걸리는 시간을 정합니다. IV Bag Treatment Time @@ -278,6 +354,8 @@ Tiempo de tratamiento de bolsa de IV Время применения пакета внутривенного переливания Czas aplikacji IV + 静脉输液袋治疗时间 + 수액용기 사용 시간 Time, in seconds, required to administer an IV bag. @@ -287,6 +365,8 @@ Tiempo, en segundos, requerido para administrar una bolsa de IV. Время, необходимое для применения пакета внутривенного переливания (в секундах). Czas w sekundach potrzebny na aplikację transfuzji IV. + 使用静脉输液所需的时间(秒) + 초 단위로 수액용기를 사용하는 데 걸리는 시간을 정합니다. Splint Treatment Time @@ -296,6 +376,8 @@ TIempo de tratamiento de férula Время наложения шины Czas aplikacji szyny + 夹板治疗时间 + 부목 사용 시간 Time, in seconds, required to apply a splint. @@ -305,6 +387,8 @@ TIempo, en segundos, requerido para aplicar una férula. Время, необходимое для наложения шины (в секундах). Czas w sekundach potrzebny na aplikację szyny. + 使用夹板所需的时间(秒) + 초 단위로 부목을 사용하는데 걸리는 시간을 정합니다. Body Bag Use Time @@ -314,6 +398,8 @@ TIempo de uso de bolsa para cuerpos Время использования мешка для трупов Czas użycia worka na ciało + 尸袋使用时间 + 시체 운반용 부대 사용 시간 Time, in seconds, required to put a patient in a body bag. @@ -323,6 +409,8 @@ Tiempo, en segundos, requerido para poner a un paciente en una bolsa para cuerpos. Время, необходимое для того чтобы упаковать труп в мешок (в секундах). Czas w sekundach potrzebny na spakowanie ciała do worka na ciało. + 装入裹尸袋时间 + 초 단위로 시체 운반용 부대를 사용하는데 걸리는 시간을 정합니다. Allow Epinephrine @@ -335,7 +423,7 @@ Permitir Epinefrina Разрешить Адреналин アドレナリンの許可 - 에피네프린 활성화 + 에피네프린 사용 허가 允许使用肾上腺素 允許使用腎上腺素 Epinefrine izin ver @@ -347,12 +435,14 @@ Уровень подготовки, необходимый для использования Адреналина. É 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. Epinefrin kullanmak için gerekli eğitim seviyesi. Nivel de entrenamiento médico requerido para usar Epinefrina. + 에피네프린을 사용하는데 필요한 등급을 정합니다. Locations Epinephrine @@ -377,12 +467,14 @@ Контролирует, где можно использовать Адреналин. 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. Epinefrinin nerelerde kullanılabileceğini kontrol eder Controla donde puede sr usada la Epinefrina. + 에피네프린을 사용할 수 있는 장소를 정합니다. Allow PAK @@ -396,7 +488,7 @@ Elsősegélycsomag engedélyezése Consenti Kit di Pronto Soccorso 応急処置キットの許可 - 개인응급키트 활성화 + 개인응급키트 사용 허가 允许使用个人急救包 允許使用個人急救包 PAK'a izin ver @@ -408,12 +500,14 @@ Уровень подготовки, необходимый для использования Аптечки. É 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. PAK kullanmak için gerekli eğitim seviyesi. Nivel de entrenamiento requerido para usar EPA + 개인응급키트을 사용하는 데 필요한 등급을 정합니다. Locations PAK @@ -439,12 +533,14 @@ Контролирует, где можно использовать Аптечку. 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. PAK'ın nerelerde kullanılabileceğini kontrol eder Controla donde puede usarse el EPA + 개인응급키트을 사용할 수 있는 장소를 정합니다. Consume PAK @@ -453,12 +549,14 @@ Израсходовать Аптечку KPS Descartável 個人急救包為消耗品 + 个人急救包会被消耗 Consumare PAK Spotřebuj osobní lékárničku (PAK) Zużycie apteczek osobistych Verbrauche Erste-Hilfe-Set PAK Tüketimi Consumir EPA + 개인응급키트 소모 Controls whether a PAK should be consumed after use. @@ -467,18 +565,21 @@ Контролирует, следует ли израсходовать Аптечку после использования. 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. Kullanımdan sonra bir PAK tüketilip tüketilmeyeceğini kontrol eder. Controla si se debe consumir un EPA después de su uso. + 개인응급키트가 사용 후 소모되는 지를 결정합니다. 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 応急処置キットの自己使用 @@ -486,12 +587,14 @@ Использование аптечки на себе Kendi PAK Kullanımı Usar EPA sobre uno mismo + 개인응급키트 자가 사용 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 応急処置キットを使って、自分を治療できるようにします。 @@ -499,6 +602,7 @@ Позволяют использовать аптечку на себе в одиночку. Kendini iyileştirmek için PAK'ların kullanılmasını sağlar. Habilita el uso de EPA para curarse a uno mismo. + 개인응급키트를 사용자 본인에게 쓸 수 있는 지를 정합니다. Time Coefficient PAK @@ -507,12 +611,14 @@ Контролирует, следует ли израсходовать Аптечку после использования. 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 PAK Zaman Katsayısı EPA coheficiente de tiempo + 개인응급키트 사용 시간 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. @@ -521,12 +627,14 @@ Изменяет быстроту применения Аптечки.\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醫療時間是依照全身的肢體狀況並乘上該係數而決定的,至少十秒。 + 修改个人急救包应用时间。 \n治疗时间=全身的总伤害x该系数,至少十秒。 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. Bir PAK'ın uygulanmasının ne kadar süreceğini değiştirir. \ Tedavi süresi, toplam vücut parçası hasarının bu katsayı ile en az 10 saniye çarpımına dayanır. Modifica el tiempo que tarda en aplicarse un EPA. \n El tiempo de tratamiento se basa en el daño total de la parte del cuerpo multiplicado por este coeficiente, con un mínimo de 10 segundos. + 개인응급키트를 사용하는데 걸리는 시간의 계수을 정합니다.\n최소 10초를 기준으로 몸 전체 피해량과 계수를 합산하여 계산합니다. Allow Surgical Kit @@ -535,12 +643,14 @@ Разрешить Хирургический набор Permitir Kit Cirúrgico 允許使用手術包 + 允许使用手术包 Permettere il kit chirurgico Povolit sešívací sadu Ograniczenia Użycia Zestawu Chirurgicznego Erlaube Operations-Set Cerrahi Kitine İzin Ver Permitir kit quirúrjico + 봉합키트 사용 허가 Training level required to use a surgical kit. @@ -549,12 +659,14 @@ Уровень медицинской подготовки, необходимый для использования Хирургического набора. É 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. Cerrahi kit kullanmak için gerekli eğitim seviyesi. Nivel de entrenamiento requerido para usar el kit quirúrgico + 봉합키트를 사용하는데 필요한 등급을 정합니다. Locations Surgical Kit @@ -563,12 +675,14 @@ Места использования Хирургического набора 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 Cerrahi Kitin kullanılabileceği yerler Localización de los kits quirúrgicos + 봉합키트 사용 장소 Controls where a surgical kit can be used. @@ -577,12 +691,14 @@ Контролирует, где можно использовать Хирургический набор 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. Cerrahi Kitin nerelerde kullanılabileceğini kontrol eder Controla donde puede usarse un kit quirúrgico. + 봉합키트을 사용할 수 있는 장소를 정합니다. Consume Surgical Kit @@ -591,24 +707,19 @@ Израсходовать Хирургический набор Kit Cirúrgico Consumível 手術包為消耗品 + 手术包是否被消耗 Consumare Kit Chirurgico Spotřebuj sešívací sadu Zużycie Zestawów Chirurgicznych Verbrauche Operations-Set Consumir kit quirúrgico + 봉합키트 소모 - Controls whether a surgical kit should be consumed after use. + What should be consumed after use. + Legt fest, ob etwas nach der Anwendung verwendet werden soll. + Qué debe ser consumido despues de su uso. 縫合キットの使用後に消費するかどうかを決定します。 - 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. - Controla si un kit quirúrgico debería ser consumido tras su uso Self Stitching @@ -616,12 +727,14 @@ Auto-Cirurgia 自己縫合 自我縫合 + 自我缝合 Auto cucitura Samo-zašívání Zszywanie własnych ran Selbstnähen Зашивание своей раны Auto cosido + 봉합키트 자가 사용 Enables the use of surgical kits to stitch oneself. @@ -629,12 +742,14 @@ 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. Включает использование хирургического набора на себе. Permite el uso de kits quirúrgicos sobre uno mismo + 봉합키트를 사용자 본인에게 쓸 수 있는지를 정합니다. Wound Stitch Time @@ -643,6 +758,9 @@ Tiempo de sutura de herida Время зашивания ран Czas szycia rany + Benötigte Zeit, um Wunden zu nähen + 伤口缝合时间 + 상처 봉합 시간 Time, in seconds, required to stitch a single wound. @@ -651,6 +769,9 @@ Tiempo, en segundos, requerido para suturar una única herida. Время, необходимое для зашивания одной раны (в секундах). Czas w sekundach potrzebny na zaszycie pojedyńczej rany. + Zeit in Sekunden, um eine einzelne Wunde zu nähen. + 缝合一个伤口所需的时间(秒) + 초 단위로, 한 상처를 봉합하는데 걸리는 시간을 설정합니다. Self IV Transfusion @@ -660,10 +781,12 @@ Pose d'IV sur soi-même Autotransfusão de IV 自我注射點滴 + 自我静脉输液 Samoaplikace IV transfuze Samotransfuzja IV Trasfusione endovena su se stessi Autotransfusión intravenosa (IV) + 수액용기 자가 사용 Enables the use of IV transfusions on oneself. @@ -673,10 +796,12 @@ Active la possibilité de s'auto-poser des IVs. 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. Habilita el uso de las transfusiones IV sobre uno mismo + 수액용기를 사용자 본인에게 쓸 수 있는지를 정합니다. Allow Unconscious Body Bag @@ -685,6 +810,9 @@ Permitir bolsa para cuerpos inconsciente Разрешить упаковывать пациентов без сознания в мешки для трупов Nieprzytomni w worku na ciało + Erlaube Benutzung des Leichensackes mit bewusstlosen Personen + 允许昏迷者装入尸袋 + 기절 인원 시체 운반용 부대에 옮기기 Enables placing an unconscious patient in a body bag. @@ -693,6 +821,9 @@ Permitir colocar a un paciente inconsciente en una bolsa para cuerpos. Разрешает упаковывать пациентов без сознания в мешки для трупов. Zezwalaj na pakowanie nieprzytomnych osób do worka na ciało. + Aktiviert, Bewusstlose in Leichensack zu legen. + 能够将昏迷的伤员装入尸袋中。 + 기절상태의 인원을 시체운반용부대에 옮겨 담을 수 있는지를 정합니다. Allow IV Transfusion @@ -700,10 +831,12 @@ Zezwalaj na przetaczanie płynów IV Pose de perfusions autorisée pour 允許操作點滴 + 允许静脉输液 IV 輸血の制限 Povolit IV transfuzi Разрешить внутривенное переливание Permitir transfusión de IV + 수액용기 사용 허가 Training level required to transfuse IVs. @@ -711,10 +844,12 @@ Poziom wyszkolenia potrzebny aby móc przetaczać płyny IV. Définit la qualification médicale requise pour poser des perfusions intraveineuses. 要有何種醫療水準才可注射點滴。 + 静脉输液所需的医疗水平。 IV 輸血を行うのに訓練済レベルを要求とします。 Úroveň výcviku nutná pro IV transfuzi. Уровень навыка, требуемый для осуществления внутривенного переливания. Nivel de capacitación requerido para transfusiones de IV. + 수액용기를 사용하는데 필요한 등급을 정합니다. Locations IV Transfusion @@ -723,6 +858,9 @@ Lieux perfusions IV Места введения пакетов внутривенного переливания Miejsca do transfuzji IV + Orte an denen IV-Transfusionen angelegt werden können + 静脉输液地点 + 수액용기 사용 장소 Controls where IV transfusions can be performed. @@ -731,6 +869,9 @@ Définit les lieux où la pose de perfusions est autorisée. Определяет к каким частям тела разрешено применять пакеты внутренного переливания. Kontroluje w jakich miejscach można robić transfuzje IV. + Kontrolliert, wo IV-Transfusionen durchgeführt werden können. + 控制何地可以静脉输液 + 수액용기를 사용할 수 있는 장소를 정합니다. Convert Vanilla Items @@ -740,10 +881,12 @@ 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 Convierte los objetos estándars de A3 en objetos ACE + 바닐라 아이템 전환 Controls whether vanilla medical items are converted to ACE Medical items, removed only, or ignored. @@ -753,10 +896,12 @@ Определяет, что делать с ванильными медикаментами: преобразовать в медикаменты ACE, удалить или проигнорировать. Controla se itens médicos vanilla serão convertidos para itens do ACE, removidos ou ignorados. 控制是否轉換原版的醫療物資成ACE的醫療物資,或者單純移除或無視。 + 控制是否转换原版的医疗物品成 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. Controla si los artículos médicos básicos se convierten en artículos médicos de ACE, solo se eliminan o se ignoran. + 바닐라 치료 아이템을 ACE 치료 물자로 바꿀지, 제거할지, 무시할지를 정합니다. Remove Only @@ -765,15 +910,17 @@ Удалять Apenas Remover 單純移除 + 仅移除 Rimuovere solo Pouze odstranit Tylko Usuwaj Nur Entfernen Solo eliminar + 바닐라 제거 Enable Litter - Включить мусор + Вкл. мусор Aktywuj odpadki Activar restos médicos Abfälle aktivieren @@ -784,7 +931,9 @@ Abilita rifiuti 廃棄物の有効化 啟用醫療用廢棄物 + 启用医疗废弃物 Çöpleri Etkinleştir + 의료폐기물 생성 활성화 Enables the creation of litter upon treatment. @@ -793,38 +942,44 @@ Разрешает создание медицинского мусора при лечении. 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. Habilita la opción de basura durante el tratamiento + 치료시 의료폐기물을 주위에 생성하는지를 결정합니다. 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 Maks. Çöp Objesi Número máximo de objetos de basura + 최대 의료폐기물 수 Sets the maximum number of litter objects which can be spawned, excessive amounts can cause FPS lag. - 生成される最大廃棄物数を設定できます。極端に増やすと FPS ラグを引き起こします。 + 生成される廃棄物の最大数を設定できます。極端に増やすと 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. 設定最大可以產生的醫療用廢棄物數量,極端的數量的話可能導致幀數下降。 + 设置可以生成的最大垃圾数量,数量过多会导致 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. Establece el número máximo de objetos de basura que se pueden generar, cantidades excesivas pueden causar saltos de FPS. + 최대 의료폐기물의 스폰 수를 결정합니다. 많은 양은 프레임의 저하로 이어질 수 있습니다. Litter Lifetime @@ -833,25 +988,29 @@ Время жизни мусора Duração de Lixo 醫療用廢棄物時長 + 医疗垃圾寿命 Tempo rifiuti Životnost odpadků Czas trwania Śmieci Abfall Anzeigedauer Cöp Silinme Süresi Tiempo de vida de la basura + 의료폐기물 지속시간 Controls the lifetime of litter objects, in seconds. -1 is forever. - 廃棄物の寿命を秒で決定できます。-1 で永遠です。 + 廃棄物の寿命を秒で決定できます。-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則是永不刪除。 + 控制医疗垃圾物体的生命周期,以秒为单位。-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. Controla el tiempo de vida de la basura (segundos). -1 es igual a permanentes + 의료폐기물의 지속시간을 초 단위로 결정합니다. -1의 경우 사라지지 않습니다. Anyone @@ -877,12 +1036,14 @@ Медики Médicos 醫療兵 + 医疗兵 Medici Medikové Medycy Sanitäter Sıhhiye Médicos + 의무병 Doctors @@ -891,12 +1052,14 @@ Доктора Doutores 軍醫 + 军医 Dottori Doktoři Doktorzy Ärzte Doktor Doctores + 군의관 Medical Facilities @@ -905,12 +1068,14 @@ Госпитали Instalações Médicas 醫療設施 + 医疗设施 Strutture mediche Zdravotnické zařízení Obiekty Medyczne Medizinische Einrichtungen Tıbbi tesisler Instalaciones médicas + 의료 시설 Vehicles & Facilities @@ -919,40 +1084,58 @@ Техника и госпитали Veículos e Instalações Médicas 車輛與設施 + 载具&设施 Zdravotnická zařízení a vozidla Veicoli e strutture Pojazdy i Obiekty Fahrzeuge und Einrichtungen Araçlar ve Tesisler Vehículos e instalaciones médicas + 의료 차량 및 시설 CPR Success Chance Minimum RCP - Chance minimale de réussite - Минимальные шансы успеха СЛР + Мин. шансы успеха СЛР Szansa na powodzenie CPR - Minimum 心肺蘇生の最低成功確率 + HLW Minimale Erfolgschance + 心肺复苏的最低成功率 + 최소 심폐소생술 성공 가능성 + RCP posibilidad mínima de resultado satisfactorio CPR Success Chance Maximum RCP - Chance maximale de réussite - Максимальные шансы успеха СЛР + Макс. шансы успеха СЛР Szansa na powodzenie CPR - Maksimum 心肺蘇生の最高成功確率 + HLW Maximale Erfolgschance + 心肺复苏的最高成功率 + 최대 심폐소생술 성공 가능성 + RCP posibilidad máxima de resultado satisfactorio Minimum probability that performing CPR will restore heart rhythm.\nThis minimum value is used when the patient has at least "Lost a fatal amount of blood".\nAn interpolated probability is used when the patient's blood volume is between the minimum and maximum thresholds. Probabilité minimale de rétablir un rythme cardiaque suite à une RCP.\nCette valeur minimale est définie pour un patient à l'état "A perdu une quantité critique de sang".\nUne interpolation est faite entre la chance minimale et maximale, en fonction du volume sanguin du patient. Минимальная вероятность того, что выполнение искусственного дыхания восстановит сердечный ритм.\nЭто минимальное значение используется, когда пациент, по крайней мере, получил статус "Фатальная кровопотеря".\n Интерполированная вероятность используется, когда объем крови пациента находится между минимальным и максимальным порогами. Minimalna wartość szansy na to że CPR przywróci bicie serca.\nTa minimalna wartość jest używana gdy pacjent ma status "Stracił krytyczną ilość krwi".\nInterpolowana wartość szansy jest używana gdy pacjent ma poziom krwi będący pomiędzy minimum a maksimum. - 心肺蘇生を行うことで心拍が回復する最低成功確率を設定します。\nこの値は患者が"致命的な程失血している"時に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 + 心肺蘇生を行うことで脈拍が回復する最低成功確率を設定します。\nこの値は患者が"致命的な程失血している"時に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 + Minimale Wahrscheinlichkeit, dass die Durchführung einer HLW den Herzrhythmus wiederherstellt.\nDieser Mindestwert wird verwendet, wenn der Patient mindestens "eine tödliche Menge Blut verloren" hat.\nEine interpolierte Wahrscheinlichkeit wird verwendet, wenn das Blutvolumen des Patienten zwischen dem minimalen und dem maximalen Schwellenwert liegt. + 实施心肺复苏恢复心律的最小可能性。\n当伤员至少有"致命失血量"时,就取该最小值。\n当伤员的血量介于最小和最大阈值之间时,将使用插值概率。 + 심폐소생술 시 제일 낮은 성공 가능성을 결정합니다.\n이 가능성은 환자가 최소 "심각한 양의 혈액을 잃음"일 때 사용됩니다. + Probabilidad mínima de que realizar RCP restaure el ritmo cardíaco.\n Este valor mínimo es utilizado cuando el paciente tiene al menos "Pérdida fatal de sangre".\n Una probabilidad interpolada es usada cuando el volumen de sangre del paciente está entre el umbral mínimo y máximo. Maximum probability that performing CPR will restore heart rhythm.\nThis maximum value is used when the patient has at most "Lost some blood".\nAn interpolated probability is used when the patient's blood volume is between the minimum and maximum thresholds. Probabilité maximale de rétablir un rythme cardiaque suite à une RCP.\nCette valeur maximale est définie pour un patient à l'état "A perdu une faible quantité de sang".\nUne interpolation est faite entre la chance minimale et maximale, en fonction du volume sanguin du patient. Максимальная вероятность того, что выполнение искусственного дыхания восстановит сердечный ритм.\nЭто максимальное значение используется, когда пациент, по крайней мере, получил статус "Фатальная кровопотеря".\n Интерполированная вероятность используется, когда объем крови пациента находится между минимальным и максимальным порогами. Maksymalna wartość szansy na to że CPR przywróci bicie serca.\nTa maksymalna wartość jest używana gdy pacjent ma status "Stracił trochę krwi".\nInterpolowana wartość szansy jest używana gdy pacjent ma poziom krwi będący pomiędzy minimum a maksimum. - 心肺蘇生を行うことで心拍が回復する最高成功確率を設定します。\nこの値は患者が"いくらか失血している"時以上の場合に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 + 心肺蘇生を行うことで脈拍が回復する最高成功確率を設定します。\nこの値は患者が"いくらか失血している"時以上の場合に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 + Maximale Wahrscheinlichkeit, dass die Durchführung einer HLW den Herzrhythmus wiederherstellt.\nDieser Maximalwert wird verwendet, wenn der Patient höchstens "Blut verloren" hat.\nEine interpolierte Wahrscheinlichkeit wird verwendet, wenn das Blutvolumen des Patienten zwischen dem minimalen und dem maximalen Schwellenwert liegt. + 实施心肺复苏恢复心律的最大可能性。\n当伤员最多“失血一些”时,就取该最大值。\n当伤员的血量介于最小和最大阈值之间时,将使用插值概率。 + 심폐소생술 시 제일 높은 성공 가능성을 결정합니다.\n이 가능성은 환자가 최소 "혈액을 조금 잃음"일 때 사용됩니다. + Probabilidad máxima de que realizar RCP restaure el ritmo cardíaco.\n Este valor máximo es utilizado cuando el paciente tiene como mucho "Pérdida de un poco de sangre".\n Una probabilidad interpolada es usada cuando el volumen de sangre del paciente está entre el umbral mínimo y máximo. CPR Treatment Time @@ -961,6 +1144,9 @@ Tiempo de tratamiento de RCP Время проведения СЛР Czas potrzebny na wykonanie CPR + HLW Behandlungsdauer + 心肺复苏时间 + 심폐소생술 시행 시간 Time, in seconds, required to perform CPR on a patient. @@ -969,11 +1155,15 @@ Tiempo, en segundos, requerido para realizar RCP en un paciente. Время, необходимое для проведения сердечно-лёгочной реанимации (СЛР) (в секундах). Czas w sekundach jaki jest potrzebny do wykonania CPR na pacjencie. + Zeit in Sekunden, die benötigt wird, um eine HLW durzuführen. + 对伤员实施心肺复苏所需的时间(秒) + 초 단위로, 심폐소생술을 진행하는 시간을 결정합니다. Holster Required 武器の扱い 需要收起武器 + 需要收起武器 Rengainer obligatoirement Fondina richiesta Vyžadováno schování zbraně @@ -981,11 +1171,13 @@ Holstern benötigt Необходимость убирать оружие Requiere enfundar + 무장여부 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なお次の診断行動は設定で例外できます: 脈拍確認、血圧測定、反応確認 控制是否要先放下或把武器放入武器套才能做出醫療行為。\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. @@ -993,11 +1185,13 @@ 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Опция «Проверка разрешена» разрешает проверять пульс, кровяное давление или реакцию независимо от этого параметра. Controla si las armas deben estar enfundadas / bajadas para realizar acciones médicas. \n Excepto Las opciones de examen permiten acciones de examen (control del pulso, presión arterial, respuesta) en todo momento, independientemente de esta configuración. + 치료하기에 앞서 손에서 무기를 집어넣을 지/내릴 지를 결정합니다.\n검사제외 옵션의 경우 맥박 확인, 혈압 확인, 반응 확인은 앞선 옵션에 구애받지 않고 사용할 수 있습니다. Lowered or Holstered 下げるか収める 放低或者收起 + 放低或者收起 Abaisser ou rengainer Abbassato o con fondina Snížena nebo Schována @@ -1005,11 +1199,13 @@ Gesenkt oder Geholstert Опущено или убрано Bajada o enfundada + 내리거나 집어넣기 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) @@ -1017,11 +1213,13 @@ Gesenkt oder Geholstert (Ausnahme Untersuchung) Опущено или убрано (Проверка разрешена) Bajada o enfundada (excepto examen) + 내리거나 집어넣기(검사 제외) Holstered Only 収めた時のみ 只能收起 + 只能收起 Rengainer seulement Solo con la fondina Pouze Schována @@ -1029,11 +1227,13 @@ Nur geholstert Только убрано Solo enfundada + 집어넣기 Holstered Only (Except Exam) 収めた時のみ (診断行動は除外) 只能收起(除了診斷) + 只能收起(除了诊断) Rengainer seulement (sauf examens) Solo fondina (eccetto esame) Pouze Schována (kromě Diagnózy) @@ -1041,6 +1241,7 @@ Nur geholstert (Ausnahme Untersuchung) Только убрано (Проверка разрешена) Solo enfundada (excepto examen) + 집어넣기(검사 제외) [ACE] Medical Supply Crate (Basic) @@ -1055,7 +1256,7 @@ [ACE] Cassa Rifornimenti Medici (Basico) [ACE] 医療物資箱 (ベーシック) [ACE] 의료 물자 (기본) - [ACE] 医疗补给箱 (基础) + [ACE] 医疗补给箱(基础) [ACE] 醫療補給箱(基本) [ACE] Tıbbi Malzeme Kutusu (Temel) @@ -1072,7 +1273,7 @@ [ACE] Cassa Rifornimenti Medici (Avanzato) [ACE] 医療物資箱 (アドバンスド) [ACE] 의료 물자 (고급) - [ACE] 医疗补给箱 (高级) + [ACE] 医疗补给箱(高级) [ACE] 醫療補給箱(進階) [ACE] Tıbbi Malzeme Kutusu (Gelişmiş) @@ -1086,8 +1287,8 @@ Se o objeto será ou não um veículo médico Будет ли объект считаться медицинским транспортом. どれでも、またはオブジェクトを医療車両として割り当てます。 - 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. - 是否使该载具为医疗载具? + 이 물체는 의료 차량이 됩니다. + 是否使该载具为医疗载具? 是否使該載具為醫療載具? Rozhoduje zda bude objekt zdravotnickým vozidlem. @@ -1136,7 +1337,7 @@ 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. 選択されたユニットを衛生兵として指定します。 - 이 모듈은 선택한 보직이 의무병을 할 수 있게 해줍니다. + 이 모듈로 선택한 유닛을 의무병으로 만들 수 있습니다. 本模块可让被同步的单位成为医疗兵 本模塊可讓被同步的單位成為醫療兵 Bu modül, Medic sınıfını seçilen birimlere atamanıza izin verir. @@ -1153,7 +1354,7 @@ Nincs Nessuno なし - 없음 + 아님 Hiçbiri @@ -1170,7 +1371,7 @@ Hagyományos orvos Medico Regolare 通常の衛生兵 - 일반 의무병 + 의무병 普通医疗兵 普通醫療兵 Normal Sıhhıye @@ -1222,7 +1423,7 @@ Registra un oggetto come struttura medica オブジェクトを医療施設として割り当てる 물체를 의료시설로 등록합니다 - 指定一个物件作为医疗设施 + 指定一个物体作为医疗设施 指定一個物件作為醫療設施 @@ -1237,8 +1438,8 @@ Doktor (csak fejlett orvosok) Dottore (Solo Medici Avanzati) 医師 (アドバンスド医療のみ) - 의사 (오직 고급 의료에서만) - 军医 (只限进阶医疗系统) + 군의관 (오직 고급 의료에서만) + 军医(只限进阶医疗系统) 軍醫 (只限進階醫療系統) @@ -1253,7 +1454,7 @@ Doktor Dottore 医師 - 의사 + 군의관 军医 軍醫 Doktor @@ -1271,7 +1472,7 @@ Bandagem(Básico) 包帯 (緊急圧迫) 붕대 (기본) - 绷带 (基础型) + 绷带(基础型) 基礎繃帶 Bandaj (Basit) @@ -1287,7 +1488,7 @@ Usado para cobrir um ferimento Slouží k překrytí poranění 傷口を覆います - 상처를 덮을때 씁니다 + 상처를 덮을 때 씁니다 用于覆盖伤口 用於覆蓋傷口 Bir yarayı kapatmak için kullanılır @@ -1305,7 +1506,7 @@ Obvaz je vhodným způsobem upravený sterilní materiál, určený k překrytí rány, případně k fixaci poranění. 傷口を血液凝固剤で塞ぐようにできていて、使うと出血の原因を取りさります。 드레싱, 출혈을 막고서 상처를 덮기위해 쓰는 물건입니다. - 用于覆盖伤口以防止出血, 透过敷料的止血剂来让出血慢慢停止 + 用于覆盖伤口以防止出血,透过敷料的止血剂来让出血慢慢停止 用於覆蓋傷口以防止出血, 透過敷料的止血劑來讓出血慢慢停止 Bir yarayı örtmek için kullanılan ve kanama başladıktan sonra yaranın üzerine uygulanan özel bir malzeme olan bir pansuman. @@ -1320,9 +1521,9 @@ Bendaggio compressivo Bandagem de Compressão Obvaz (Tlakový) - 弾性包帯 - 거즈 붕대 - 绷带 (包扎型) + 包帯 (弾性) + 붕대 (거즈) + 绷带(包扎型) 繃帶(包紮型) Bandaj (Paket) @@ -1338,8 +1539,8 @@ 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í 粘着フィルム状で、普通から大きめなケガに使い止血します。 - 중형 또는 대형 상처를 채우고 출혈을 막기위해 쓰입니다 - 用于包扎中到大型伤口, 并防止出血 + 중형 또는 대형 상처를 채우고 출혈을 막기 위해 쓰입니다, + 用于包扎中到大型伤口,并防止出血 用於包紮中到大型傷口, 並防止出血 Orta ila büyük yaraları sarmak ve kanamayı durdurmak için kullanılır @@ -1355,8 +1556,8 @@ 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í. 包帯を使うと出血元を塞ぎ、怪我の治癒を促進させます。また大きめ多発性外傷に対しても使えます。 - 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 채우는것도 한 가지 방법입니다. - 用于包扎中到大型伤口, 并防止出血, 为在大型多处性伤口的选项之一! + 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 싸매는 것도 한 가지 방법입니다. + 用于包扎中到大型伤口,并防止出血, 为在大型多处性伤口的选项之一! 用於包紮中到大型傷口, 並防止出血, 為在大型多處性傷口的選項之一! Kanamayı durdurmak ve yara iyileşmesini kolaylaştırmak için yarayı sarmak için kullanılan bir bandaj. @@ -1373,7 +1574,7 @@ Bandagem (Elástica) 包帯 (伸縮) 붕대 (압박) - 绷带 (弹性型) + 绷带(弹性型) 繃帶(彈性型) Bandaj (Elastik) @@ -1389,8 +1590,8 @@ Kit de Bandagem, Elástica Sada obvazů, Elastická 包帯キット (伸縮) - 붕대, 압박 - 绷带 (弹性型) + 압박 붕대 키트 + 绷带(弹性型) 一個彈性繃帶包 Bandaj kiti, Elastik @@ -1424,7 +1625,7 @@ Torniquete (CAT) 止血帯 (CAT) 지혈대 [CAT] - 止血带 (军用型) + 止血带(军用型) 軍用止血帶 Turnike (CAT) @@ -1439,7 +1640,7 @@ Rallenta la perdita di sangue in caso di sanguinamento Reduz a velocidade da perda de sangue Zpomaluje ztráty krve při krvácení - 出血時に失血量を減らします。 + 出血時の失血を抑えます。 출혈 시 혈액손실을 늦춰줍니다 减缓失血速度 減緩失血的速度 @@ -1456,9 +1657,9 @@ 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. - 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れを遅し失血を防ぎます。 + 静脈と動脈の循環を圧迫し、血流を抑制または減速させ、出血時の失血を抑えます。 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. - 用于压迫静脉与动脉的血液流动, 以达到减缓失血速度的目的 + 用于压迫静脉与动脉的血液流动,以达到减缓失血速度的目的 用於壓迫靜脈與動脈的血液流動, 達到減緩失血速度的目的 Kan akışını engelleyen veya yavaşlatan ve dolayısıyla kan kaybını azaltan venöz ve arteriyel dolaşımı sıkıştırmak için kullanılan bir daraltıcı cihaz. @@ -1476,6 +1677,7 @@ 夹板 Atel Férula + 부목 Stabilizes a fractured limb @@ -1491,6 +1693,7 @@ 用于固定骨折的肢体 Kırık bir uzvu stabilize eder Estabilizar un hueso roto + 아작난 사지를 고정시킵니다. Morphine Autoinjector @@ -1520,7 +1723,7 @@ 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í - 戦闘が収まった時に痛みに対して使います。 + 中等度から重度の痛みに対処するために使用される。 심한 통증을 완화하는데 쓰입니다 用于削减中度至重度疼痛 減低中度至重度的疼痛感 @@ -1536,7 +1739,7 @@ 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í - 戦闘が収まった時にモルヒネを痛みに対して使います。 + 中等度から重度の痛みに対処するための鎮痛薬。 심한 통증을 완화하기 위해 쓰이는 진통제입니다. 一种用于削减中度至重度疼痛的止痛药 止痛藥的一種, 用於減低中度至重度的疼痛感 @@ -1616,7 +1819,7 @@ Usado em casos de ataque QBRN Používá se v přítomnosti nervových plynů 核・生物・化学兵器による汚染環境下にて使います。 - 핵,생물,화학 상황에 쓰입니다 + 화생방 상황에 쓰입니다 使用于核生化污染的情况 使用於核生化汙染的情況 @@ -1632,8 +1835,8 @@ 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. 核・生物・化学兵器による汚染環境下にて使います。 - 핵,생물,화학 상황에 쓰이는 군용 약품 - 军用神经解毒针, 用来应付核生化污染的情况. + 화생방 상황에 쓰이는 군용 약품 + 军用神经解毒针,用来应付核生化污染的情况。 軍用神經解毒針, 用來應付核生化汙染的情況. @@ -1664,8 +1867,8 @@ 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 - 心拍数を増加させたり、アレルギー反応を収める効果もあります。 - 심박수를 높이며 알러지반응의 대응책입니다 + 脈拍数を増加させたり、アレルギー反応を収める効果もあります。 + 심박수를 높이며 알러지 반응의 대응책입니다 用于提升心率的一种药物 增加心跳速率的一種藥物 @@ -1680,9 +1883,9 @@ 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ě. - 気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります (アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにも使われます。 - 기관지를 확장시키는 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과에 대응합니다(아나필락시스). 심폐가 정지하는 경우 호전이 되지않을때 사용합니다. - 俗称强心针, 为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! + 気管支を拡張するよう交感神経を拡張させ、脈拍数を増加させます。それにアレルギー反応を収める効果もあります (アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにも使われます。 + 기관지를 확장시키고 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과(과민증)에 대응합니다. 심정지의 경우 호전이 되지 않을 때 사용합니다. + 俗称强心针,为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! 俗稱強心針, 為一種支氣管擴張藥物, 會增加心跳速率並減緩過敏反應(過敏性休克), 在心跳驟停時有恢復心跳的效果! @@ -1697,8 +1900,8 @@ Plasma IV (1000ml) Krevní plazma (1000ml) 血しょう IV (1000ml) - 혈장 IV (250ml) - 血浆 (1000毫升) + 혈장 IV (1000ml) + 血浆(1000毫升) 血漿 (1000毫升) @@ -1712,7 +1915,7 @@ Volumenerweiterungsmittel (künstliches Blutvolumen) Suplemento para expandir o volume sanguíneo. Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 + 血液量の増加を補助します。 혈액량을 늘리기위한 보조수단 입니다. 可快速得到血液补充 可快速得到血液補充 @@ -1728,7 +1931,7 @@ Volumenerweiterungsmittel (künstliches Blutvolumen) Suplemento para expandir o volume sanguíneo. Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 + 血液量の増加を補助します。 혈액량을 늘리기위한 보조수단 입니다. 可快速得到血液补充 可快速得到血液補充 @@ -1746,7 +1949,7 @@ Krevní plazma (500ml) 血しょう IV (500ml) 혈장 IV (500ml) - 血浆 (500毫升) + 血浆(500毫升) 點滴 (血漿 500毫升) Plasma IV (500ml) @@ -1763,7 +1966,7 @@ Krevní plazma (250ml) 血しょう IV (250ml) 혈장 IV (250ml) - 血浆 (250毫升) + 血浆(250毫升) 點滴 (血漿 250毫升) Plasma IV (250ml) @@ -1780,7 +1983,7 @@ Krevní transfúze (1000ml) 血液 IV (1000ml) 혈액 IV (1000ml) - 血液 (1000毫升) + 血液(1000毫升) 點滴 (血液 1000毫升) Kan IV (1000ml) @@ -1795,9 +1998,9 @@ 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は患者の血液量を回復させます。 혈액 IV, 환자에게 혈액을 공급합니다. - 血液, 用于补充伤者流失的血液 + 血液,用于补充伤者流失的血液 血液, 用於補充傷者流失的血液 Kan IV, bir hastanın kanını geri enjekte etmek için @@ -1812,9 +2015,9 @@ 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-の輸血は、厳密かつ稀な事象において行われる。通常、医療の搬送段階で血液を補充するために使用される。 + O형 혈액 투여는 매우 엄격하고 드문 혈액 보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. + O型负值注射用血液,在紧急情况时使用, 用于补充伤者流失的血液 O型陰性注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液 @@ -1830,7 +2033,7 @@ Krevní transfúze (500ml) 血液 IV (500ml) 혈액 IV (500ml) - 血液 (500毫升) + 血液(500毫升) 點滴 (血液 500毫升) Kan IV (500ml) @@ -1847,7 +2050,7 @@ Krevní transfúze (250ml) 血液 IV (250ml) 혈액 IV (250ml) - 血液 (250毫升) + 血液(250毫升) 點滴 (血液 250毫升) Kan IV (250ml) @@ -1864,7 +2067,7 @@ Fyziologický roztok (1000ml) 生理食塩水 IV (1000ml) 생리식염수 IV (1000ml) - 生理盐水 (1000毫升) + 生理盐水(1000毫升) 點滴 (食鹽水 1000毫升) Serum IV (1000ml) @@ -1879,9 +2082,9 @@ 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 は、患者の血液量を補助します + 生理食塩水 IVは患者の血液量を回復させます。 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 - 生理盐水, 用于恢复伤者血液 + 生理盐水,用于恢复伤者血液 生理食鹽水, 用於恢復傷者血液 @@ -1895,9 +2098,9 @@ 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로 투여되는 의료 용적 대체 요법 - 利用静脉注射进入人体血液系统, 帮助伤者血液恢复 + 利用静脉注射进入人体血液系统,帮助伤者血液恢复 利用靜脈注射進入人體血液系統, 幫助傷者血液恢復 @@ -1913,7 +2116,7 @@ Fyziologický roztok (500ml) 生理食塩水 IV (500ml) 생리식염수 IV (500ml) - 生理盐水 (500毫升) + 生理盐水(500毫升) 點滴 (食鹽水 500毫升) Serum IV (500ml) @@ -1930,7 +2133,7 @@ Fyziologický roztok (250ml) 生理食塩水 IV (250ml) 생리식염수 IV (250ml) - 生理盐水 (250毫升) + 生理盐水(250毫升) 點滴 (食鹽水 250毫升) Serum IV (250ml) @@ -1945,9 +2148,9 @@ Bendaggio emostatico (QuikClot) Bandagem básica (Coagulante) Hemostatický obvaz (QuikClot) - 緊急圧迫止血包帯 (クイッククロット) - 필드 드레싱 (퀵 클롯) - 绷带 (止血型) + 包帯 (クイッククロット) + 붕대 (퀵 클롯) + 绷带(止血型) 繃帶 (止血粉) @@ -1963,7 +2166,7 @@ Hemostatický obvaz (QuikClot) クイッククロット 퀵 클롯 붕대 - 绷带 (止血型) + 绷带(止血型) 止血粉繃帶 QuikClot bandaj @@ -1979,8 +2182,8 @@ 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í 血液凝固剤を含む包帯により、止血できます。 - 지혈시 사용하는 붕대로 혈액 응고제를 포함하고있습니다. - 包含止血粉成分的止血绷带, 可用于止血 + 지혈 시 사용하는 붕대로 혈액 응고제를 포함하고 있습니다. + 包含止血粉成分的止血绷带,可用于止血 包含止血粉成分的止血繃帶, 可用於止血 @@ -2012,8 +2215,8 @@ 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 縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 - 봉합및 고급 조치에 필요한 다양한 치료 도구가 있습니다. - 包含各种医疗套件, 以及进阶伤口系统需要的缝合用品 + 봉합 및 고급 조치에 필요한 다양한 치료 도구가 있습니다. + 包含各种医疗套件,以及进阶伤口系统需要的缝合用品 包含各種醫療套件, 以及進階傷口系統需要的縫合用品 Dikiş veya gelişmiş tedavi için gerekli çeşitli tedavi malzemelerini içerir @@ -2029,7 +2232,7 @@ 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. 戦場で縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 - 야전에서 봉합및 고급 조치를 위한 개인응급키트 + 야전에서 봉합 및 고급 조치를 위한 개인응급키트 个人急救包可用于战地缝合手术或进阶伤口系统使用 個人急救包可用於戰地縫合手術或進階醫療用 Alan dikişi veya gelişmiş tedavi için Kişisel Yardım Kiti @@ -2046,7 +2249,7 @@ Použít osobní lékárničku (PAK) Usa il pronto soccorso personale 応急処置キットを使う - 개인 응급 키트사용하기 + 개인응급키트 사용 使用个人急救包 使用個人急救包 Kişisel Yardım Kitini Kullan @@ -2081,7 +2284,7 @@ Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli 縫合キットは戦場で高度な処置をする為に使われます。 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) 用於在戰場上為傷口進行縫合 Sahada gelişmiş tıbbi tedavi için Cerrahi Kit @@ -2098,7 +2301,7 @@ Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli 縫合キットは戦場で高度な処置をする為に使われます。 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) 用於在戰場上為傷口進行縫合 Sahada gelişmiş tıbbi tedavi için Cerrahi Kit @@ -2119,6 +2322,24 @@ 使用手術包 Cerrahi Kit Kullan + + Suture + Naht + Sutura + 縫合糸 + + + Surgical Suture for stitching injuries. + Chirurgisches Nahtmaterial zum Nähen von Wunden. + Sutura quirúrjica para heridas de puntos. + 傷害縫合用の外科縫合糸。 + + + Surgical Suture for stitching injuries. + Chirurgisches Nahtmaterial zum Nähen von Wunden. + Sutura quirúrjica para heridas de puntos. + 傷害縫合用の外科縫合糸。 + Bodybag Housse mortuaire @@ -2131,7 +2352,7 @@ Saco para cadáver Pytel na mrtvoly 死体袋 - 시체 가방 + 시체 운반용 부대 尸袋 屍袋 Ceset torbası @@ -2148,7 +2369,7 @@ Um saco para corpos mortos Pytel na mrtvoly 死体袋は死体を入れる為に使います。 - 시체를 운반할때 쓰는 가방입니다 + 시체를 운반할 때 쓰는 가방입니다 用于装尸体 用來裝屍體用 Ölü bedenler için bir ceset torbası @@ -2165,7 +2386,7 @@ Um saco para corpos mortos. Pytel na mrtvoly 死体袋は死体を入れる為に使います。 - 시체를 운반할때 쓰는 가방입니다 + 시체를 운반할 때 쓰는 가방입니다 用于装尸体 用來裝屍體用 Ölü bedenler için bir ceset torbası @@ -2198,7 +2419,7 @@ Injetar Adenosina Ввести аденозин アデノシンを投与 - 아데노신 주사 + 아데노신 주사하기 注射腺苷 注射腺苷 Adenosin Enjekte Et @@ -2215,7 +2436,7 @@ Inietta atropina Injetar Atropina アトロピンを投与 - 아트로핀 주사 + 아트로핀 주사하기 注射阿托品 注射阿托品 Atropin Enjekte Et @@ -2232,7 +2453,7 @@ Injetar Epinefrina Inietta adrenalina アドレナリンを投与 - 에피네프린 주사 + 에피네프린 주사하기 注射肾上腺素 注射腎上腺素 Epinefrin Enjekte Et @@ -2249,7 +2470,7 @@ Injetar Morfina Inietta morfina モルヒネを投与 - 모르핀 주사 + 모르핀 주사하기 注射吗啡 注射嗎啡 Morfin Enjekte Et @@ -2351,7 +2572,7 @@ Atar Cabeça Benda la testa 包帯を頭へ - 머리에 붕대감기 + 머리에 붕대 감기 包扎头部 繃帶包紮 頭部 Kafayı Bandajla @@ -2368,7 +2589,7 @@ Atar Tronco Benda il torso 包帯を胴体へ - 몸통에 붕대감기 + 몸통에 붕대 감기 包扎躯干 繃帶包紮 身體 Gövdeyi Bandajla @@ -2385,7 +2606,7 @@ Atar Braço Esquerdo Benda il braccio sinistro 包帯を左腕に - 왼팔에 붕대감기 + 왼팔에 붕대 감기 包扎左臂 繃帶包紮 左手 Sol Kolu Bandajla @@ -2402,7 +2623,7 @@ Atar Braço Direito Benda il braccio destro 包帯を右腕に - 오른팔에 붕대감기 + 오른팔에 붕대 감기 包扎右臂 繃帶包紮 右手 Sağ Kolu Bandajla @@ -2419,7 +2640,7 @@ Atar Perna Esquerda Benda la gamba sinistra 包帯を左足へ - 왼쪽 다리에 붕대감기 + 왼쪽 다리에 붕대 감기 包扎左腿 繃帶包紮 左腳 Sol Bacağı Bandajla @@ -2436,7 +2657,7 @@ Atar Perna Direita Benda la gamba destra 包帯を右足へ - 오른쪽 다리에 붕대감기 + 오른쪽 다리에 붕대 감기 包扎右腿 繃帶包紮 右腳 Sağ Bacağı Bandajla @@ -2453,7 +2674,7 @@ Injetando Morfina... Inietto la morfina... モルヒネを投与しています・・・ - 모르핀 주사중... + 모르핀 주사 중... 正在注射吗啡... 嗎啡注射中... Morfin Enjekte Ediliyor ... @@ -2470,7 +2691,7 @@ Injetando Epinefrina... Inietto l'adrenalina... アドレナリンを投与しています・・・ - 에피네프린 주사중... + 에피네프린 주사 중... 正在注射肾上腺素... 腎上腺素注射中... Epinefrin Enjekte Ediliyor... @@ -2486,7 +2707,7 @@ Injetando Adenosina... Введение аденозина... アドネシンを投与しています・・・ - 아데노신 주사중... + 아데노신 주사 중... 正在注射腺苷... 腺苷注射中... Adenosin Enjekte Ediliyor... @@ -2503,7 +2724,7 @@ Inietto l'atropina... Injetando Atropina アトロピンを投与しています・・・ - 아트리핀 주사중... + 아트로핀 주사 중... 正在注射阿托品... 阿托品注射中 ... Atropin Enjekte Ediliyor... @@ -2520,7 +2741,7 @@ Transfundindo Sangue... Effettuo la trasfusione di sangue... 輸血しています・・・ - 혈액 수혈중... + 혈액 수혈 중... 正在输入血液... 輸血液中 ... Kan Veriliyor... @@ -2537,7 +2758,7 @@ Effettuo la rasfusione di soluzione salina Transfundindo Soro... 生理食塩水を投与しています・・・ - 생리식염수 수혈중... + 생리식염수 수혈 중... 正在输入生理盐水... 施打生理食鹽水中 ... Serum Veriliyor... @@ -2554,7 +2775,7 @@ Effettu la trasfusione di plasma... Transfundindo Plasma... 血しょうを投与しています・・・ - 혈장 수혈중... + 혈장 수혈 중... 正在输入血浆... 輸血漿中 ... Plasma Veriliyor... @@ -2571,7 +2792,7 @@ Atando... Перевязывание... 包帯を巻いています・・・ - 붕대감는중... + 붕대 감는 중... 正在包扎... 繃帶包紮中 ... Bandajlanıyor... @@ -2588,7 +2809,7 @@ Sto applicando il laccio emostatico... Applicando Torniquete 止血帯を巻いています・・・ - 지혈대 적용중... + 지혈대 적용 중... 正在使用止血带... 使用軍用止血帶中 ... Turnike Uygulanıyor... @@ -2604,9 +2825,9 @@ Zárókötszer Bendaggio rapido Curativo de Campo - 緊急圧迫包帯を巻く - 필드 드레싱 - 绷带 (基础型) + 包帯を巻く (緊急圧迫) + 붕대 (기본) + 绷带(基础型) 基礎繃帶 @@ -2620,9 +2841,9 @@ Bandage compressif Bandagem de Compressão Obvaz Tlakový - 弾性包帯を巻く - 거즈 붕대 - 绷带 (包扎型) + 包帯を巻く (弾性) + 붕대 (거즈) + 绷带(包扎型) 包紮繃帶 Paket Bandaj @@ -2637,9 +2858,9 @@ Rögzitő kötszer Bendaggio elastico Bandagem Elástica - 伸縮包帯を巻く - 압박 붕대 - 绷带 (弹性型) + 包帯を巻く (伸縮) + 붕대 (압박) + 绷带(弹性型) 彈性繃帶 Elastik Bandaj @@ -2654,9 +2875,9 @@ QuikClot QuikClot (polvere emostatica) QuikClot - クイッククロットを巻く - 퀵 클롯 - 绷带 (止血型) + 包帯を巻く (クイッククロット) + 붕대 (퀵 클롯) + 绷带(止血型) 止血粉 @@ -2670,7 +2891,7 @@ Pulzus ellenőrzése Controlla il polso Checar Pulso - 心拍数を計る + 脈拍を計る 맥박 확인 检查脉搏 檢查脈搏 @@ -2705,7 +2926,7 @@ Žádné záznamy na tomto štítku Nenhuma entrada neste cartão de triagem トリアージ カードには何も無い。 - 부상자 분류 카드에 쓰여있는것이 없습니다. + 부상자 분류 카드에 쓰여있는 것이 없습니다. 此分诊卡上没有信息。 此檢傷分類卡上沒有任何資料 Bu triyaj kartında kayıt yok. @@ -2721,7 +2942,7 @@ Érszorító Laccio emostatico Torniquete - 止血帯 + 止血帯を巻く 지혈대 止血带 軍用止血帶 @@ -2758,6 +2979,7 @@ Schiene anlegen 安装夹板 Atel Uygula + 부목 대기 Applying Splint... @@ -2773,6 +2995,7 @@ Lege Schiene an ... 正在安装夹板... Atel Uygulanıyor... + 부목 대는 중... Diagnose @@ -2785,7 +3008,7 @@ Diagnosztizálás Diagnóza Diagnosticar - 診断する + 診断をする 진단 诊断 診斷 @@ -2803,7 +3026,7 @@ Diagnostika... Diagnosticando... 診断しています・・・ - 진단중... + 진단 중... 正在诊断... 診斷中... Teşhis ediliyor... @@ -2819,9 +3042,9 @@ Újraélesztés CPR SBV - 心肺蘇生 + 心肺蘇生をする 심폐소생술 - 心肺复苏(CPR) + 心肺复苏(CPR) 心肺復甦術 CPR @@ -2837,7 +3060,7 @@ Provádím CPR... Realizando o SBV... 心肺蘇生をしています・・・ - 심폐소생중... + 심폐소생 중... 正在进行心肺复苏... 進行心肺復甦術中... CPR Yapılıyor... @@ -2855,7 +3078,7 @@ Administrar Sangue IV (1000ml) 血液 IV (1000ml) を投与 IV 혈액 수혈 (1000ml) - 静脉输血 (1000毫升) + 静脉输血(1000毫升) 輸血液 (1000毫升) Kan IV (1000ml) Ver @@ -2872,7 +3095,7 @@ Administrar Sangue IV (500ml) 血液 IV (500ml) を投与 IV 혈액 수혈 (500ml) - 静脉输血 (500毫升) + 静脉输血(500毫升) 輸血液 (500毫升) Kan IV (500ml) Ver @@ -2889,7 +3112,7 @@ Administrar Sangue IV (250ml) 血液 IV (250ml) を投与 IV 혈액 수혈 (250ml) - 静脉输血 (250毫升) + 静脉输血(250毫升) 輸血液 (250毫升) Kan IV (250ml) Ver @@ -2906,7 +3129,7 @@ Administrar Plasma IV (1000ml) 血しょう IV (1000ml) を投与 IV 혈장 수혈 (1000ml) - 静脉注射血浆 (1000毫升) + 静脉注射血浆(1000毫升) 輸血漿 (1000毫升) Plasma IV (1000ml) Ver @@ -2923,7 +3146,7 @@ Administrar Plasma IV (500ml) 血しょう IV (500ml) を投与 IV 혈장 수혈 (500ml) - 静脉注射血浆 (500毫升) + 静脉注射血浆(500毫升) 輸血漿 (500毫升) Plasma IV (500ml) Ver @@ -2940,7 +3163,7 @@ Administrar Plasma IV (250ml) 血しょう IV (250ml) を投与 IV 혈장 수혈 (250ml) - 静脉注射血浆 (250毫升) + 静脉注射血浆(250毫升) 輸血漿 (250毫升) Plasma IV (250ml) Ver @@ -2957,7 +3180,7 @@ Administrar Soro IV (1000ml) 生理食塩水 IV (1000ml) を投与 IV 생리식염수 수혈 (1000ml) - 静脉注射生理盐水 (1000毫升) + 静脉注射生理盐水(1000毫升) 注射生理食鹽水 (1000毫升) Serum IV (1000ml) Ver @@ -2974,7 +3197,7 @@ Administrar Soro IV (500ml) 生理食塩水 IV (500ml) を投与 IV 생리식염수 수혈 (500ml) - 静脉注射生理盐水 (500毫升) + 静脉注射生理盐水(500毫升) 注射生理食鹽水 (500毫升) Serum IV (500ml) Ver @@ -2991,7 +3214,7 @@ Administrar Soro IV (250ml) 生理食塩水 IV (250ml) を投与 IV 생리식염수 수혈 (250ml) - 静脉注射生理盐水 (250毫升) + 静脉注射生理盐水(250毫升) 注射生理食鹽水 (250毫升) Serum IV (250ml) Ver @@ -3009,6 +3232,7 @@ Mínimo 轻微 Düşük + 비응급 Delayed @@ -3022,7 +3246,7 @@ Differito Atrasado 待機的治療群 - 늦어짐 + 응급 延后 延後 Ertelenmiş @@ -3149,7 +3373,7 @@ In mild pain Hat leichte Schmerzen - 中くらいの痛みがある + 軽い痛みがある Небольшая боль Légère douleur Com dor leve @@ -3159,6 +3383,7 @@ W łagodnym bólu Con dolor leve 轻度疼痛 + 조금 고통스러움 In pain @@ -3172,7 +3397,7 @@ Con dolore Com dor 痛みがある - 고통 + 꽤 고통스러움 疼痛 疼痛中 @@ -3189,6 +3414,7 @@ W silnym bólu Con dolor severo 重度疼痛 + 매우 고통스러움 Tourniquet [CAT] @@ -3203,7 +3429,7 @@ Torniquete [CAT] 止血帯 [CAT] 지혈대 [CAT] - 止血带 (军用型) + 止血带(军用型) 軍用止血帶 Turnike [CAT] @@ -3252,7 +3478,7 @@ Aferindo Pressão Arterial... Měřím krevní tlak... 血圧を測定しています・・・ - 혈압 측정증... + 혈압 측정 중... 正在测量血压... 檢查血壓中... Kan basıncı kontrol ediliyor... @@ -3268,7 +3494,7 @@ %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 已由%1確認血壓: %2 @@ -3285,7 +3511,7 @@ Você verificou o paciente %1 Zkontroloval jsi %1 血圧は %1 - 나의 혈압은 %1 이다 + 혈압은 %1 입니다 你已检查 %1 你已經檢查 %1 Kontrol ettin %1 @@ -3302,7 +3528,7 @@ A Pressão Arterial é de %2/%3 Naměřil si krevní tlak u %2/%3 血圧は %2/%3 - 혈압이 %2/%3 이다 + 혈압이 %2/%3 입니다 血压为 %2/%3 血壓為%2/%3 Kan basıncı buldun %2/%3 @@ -3318,8 +3544,8 @@ La pressione sanguigna è bassa Pressão Arterial baixa Naměřil si nízký krevní tlak - 血圧はかなり低い - 혈압이 매우 낮다 + 血圧は低い + 혈압이 매우 낮습니다 血压低 發現到低血壓 Düşük kan basıncı buldun @@ -3335,8 +3561,8 @@ La pressione sanguigna è normale Pressão Arterial normal Naměřil si normální krevní tlak - 血圧は通常 - 혈압이 정상이다 + 血圧は正常 + 혈압이 정상입니다 血压正常 發現到正常血壓 Normal kan basıncı buldun @@ -3352,8 +3578,8 @@ La pressione sanguigna è alta Pressão Arterial Alta Naměřil si vysoký krevní tlak - 血圧はかなり高い - 혈압이 매우 높다 + 血圧は高い + 혈압이 매우 높습니다 血压高 發現到高血壓 Yüksek kan basıncı buldun @@ -3370,7 +3596,7 @@ Sem Pressão Arterial Nenaměřil si žádný krevní tlak 血圧は測れなかった - 혈압이 잡히지 않는다 + 혈압이 잡히지 않습니다 血压为零 量不到血壓 Kan basıncı yok @@ -3386,8 +3612,8 @@ Manca strumento per misurare pressione sanguigna Você falhou em aferir a Pressão Arterial Nedokázal si změřit krevní tlak - 血圧を測るのに失敗 - 혈압을 잡을 수 없었다 + 血圧を測るのに失敗した + 혈압을 측정하는데 실패했습니다 无法测得血压 檢查血壓的動作失敗 Kan basıncını bulamıyorsun @@ -3420,7 +3646,7 @@ Normális Normální Normal - 通常 + 正常 보통 正常 正常 @@ -3471,7 +3697,7 @@ Polso Pulso Puls - 心拍数 + 脈拍数 맥박 脉搏 脈搏 @@ -3489,7 +3715,7 @@ Checando Pulso... Kontroluji puls... 脈拍数を測定しています・・・ - 맥박 확인중... + 맥박 확인 중... 正在测量脉搏... 檢查心跳中... Nabız Kontrol Ediliyor ... @@ -3505,8 +3731,8 @@ Hai diagnosticato %1 Você aferiu o paciente %1 Zkontroloval si %1 - 心拍数は %1 - 나의 맥박은 %1 이다 + 脈拍数は %1 + 맥박은 %1 입니다 你已检查 %1 你已經檢查 %1 @@ -3521,7 +3747,7 @@ %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 已由%1確認心跳: %2 @@ -3571,7 +3797,7 @@ Normális Normální Normal - 通常 + 正常 보통 正常 正常 @@ -3606,7 +3832,7 @@ A Freqüência Cardíaca é de %2 Nahmatal jsi srdeční tep u %2 心拍数は %2 - 맥박이 %2 이다 + 맥박이 %2 입니다 心率为 %2 心跳為%2 @@ -3621,8 +3847,8 @@ Hai riscontrato un debole battito cardiaco Freqüência Cardíaca baixa Nahmatal jsi slabý srdeční puls - 心拍数は低い - 약한 맥박이다 + 心拍は弱い + 약한 맥박입니다 心率微弱 心跳微弱 Düşük nabız ölçtün @@ -3638,8 +3864,8 @@ Hai riscontrato un forte battito cardiaco Freqüência Cardíaca normal Nahmatal jsi silný srdeční puls - 心拍数は強い - 강한 맥박이다 + 心拍は強い + 강한 맥박입니다 心率过快 心跳過快 Yüksek nabız ölçtün @@ -3655,8 +3881,8 @@ Hai riscontrato un normale battito cardiaco Freqüência Cardíaca alta Nahmatal jsi normální srdeční puls - 心拍数は通常 - 보통 맥박이다 + 心拍は正常 + 보통 맥박입니다 心率正常 心跳正常 Normal nabız ölçtün @@ -3672,8 +3898,8 @@ Hai riscontrato una assenza di battito cardiaco Sem Freqüência Cardíaca Žádný puls - 心拍数を測れなかった - 맥박을 찾을 수가 없다 + 心拍を測れなかった + 맥박을 찾을 수가 없습니다 无法测得心率 量不到心跳 Nabız bulamadın @@ -3706,7 +3932,7 @@ Aferindo se o paciente tem reação Zkontroloval jsi reakci pacienta 患者からの反応をみる - 대상의 반응 확인중 + 대상의 반응 확인 중 检查伤员的反应 檢查傷者的反應 @@ -3722,7 +3948,7 @@ %1 está respondendo %1 odpovídá %1 は反応あり - %1 은 반응이있다 + %1 은 반응이 있습니다 %1 有反应 %1 有反應 %1 tepki veriyor @@ -3739,7 +3965,7 @@ %1 não está respondendo %1 neodpovídá %1 の反応なし - %1 은 반응이없다 + %1 은 반응이 없습니다 %1 没有反应 %1 沒有反應 %1 tepki vermiyor @@ -3749,12 +3975,22 @@ %1 est inconscient, respire par intermittence et convulse. %1 jest nieresponsywny, ma płytki oddech oraz jest w konwulsjach %1 は反応せず、浅い呼吸とけいれんをしている + %1 reagiert nicht, schnappt nach Luft und verkrampft + %1没有反应,微软的喘着气和抽搐 + %1 은 반응이 없고, 얕은 헐떡임과 경련증세를 보입니다 + %1 не реагирует на раздражители, поверхностно дышит, в конвульсиях + %1 no responde, dando pequeñas bocanadas y convulsionando %1 is not responsive, motionless and cold %1 est inconscient, inanimé et froid. %1 jest nieresponsywny, nieruchomy oraz zimny %1 は反応せず、動かず冷たくなっている + %1 reagiert nicht, ist regungslos und kalt + %1没有反应,一动不动,身体冰凉 + %1 은 반응이 없고, 움직임이 없으며 차갑습니다 + %1 не реагирует на раздражители, не шевелится и холодный + %1 no responde, sin movimiento y frío You checked %1 @@ -3953,7 +4189,7 @@ %1 está aplicando uma bandagem em você %1 tě obvazuje %1 はあなたに包帯を巻いている - %1 (이)가 나에게 붕대를 감고있다 + %1 (이)가 나에게 붕대를 감고 있다 你正在被 %1 包扎 %1 正在對你包紮繃帶中 %1 seni bandajlıyor @@ -3970,26 +4206,26 @@ Você começa a suturar os ferimentos do %1 (%2) Zašíváš rány %1 (%2) あなたは %1 (%2) の外傷へ縫合を始めた - 나는 %1(%2) 상처로부터 봉합을 시작했다 + 당신은 %1(%2) 상처로부터 봉합을 시작했다 你正在使用 %2 缝合 %1 的伤口 你正開始對 %1 (%2) 縫合傷口中 - Stitching - Наложение швов - Suturando - Nähen + Stitching... + Наложение швов... + Suturando... + Nähen... Suture en cours... - Szycie - Összevarrás - Suturando - Suturando - Šití - 縫合中 - 붕합중 - 正在缝合 - 縫合中 - Dikiş + Szycie... + Összevarrás... + Suturando... + Suturando... + Šití... + 縫合中・・・ + 봉합 중... + 正在缝合... + 縫合中... + Dikiş... You treat the airway of %1 @@ -4037,7 +4273,7 @@ %1 está te entubando %1 ošetřuje tvoje dýchací cesty %1 はあなたの気道を見ている - %1 (이)가 나의 기도를 확보중이다 + %1 (이)가 나의 기도를 확보 중이다 %1 正在治疗你的呼吸道 %1 正在治療你的呼吸道 % 1 hava yolu tedavi ediyor @@ -4054,7 +4290,7 @@ Arrastar Trascina 引きずる - 끌다 + 끌기 拖拽 拖拉 Sürükle @@ -4071,7 +4307,7 @@ Carregar Trasporta 担ぐ - 업다 + 업기 背起 背起 Taşı @@ -4139,7 +4375,7 @@ %1 est conscient et ne peut être embarqué. 患者 (%1) は意識があり、積み込めない 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 - 此人(%1)处于清醒状态, 因此无法被装载 + 此人(%1)处于清醒状态,因此无法被装载 此人(%1)是清醒且不能被裝載 Bu kişi (% 1) uyanık ve yüklenemiyor @@ -4155,7 +4391,7 @@ %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 %1<br/>装载至<br/>%2 @@ -4171,7 +4407,7 @@ 1%<br/>kirakodva ebből:<br/>%2 %1<br/>разгружен из<br/>%2 <br/>%1が<br/>%2から降ろされました - %1<br/>는<br/>%2 에서 내려짐 + %1<br/>(은)는<br/>%2 에서 내려짐 從<br/>%2卸載<br/>%1 从<br/>%2卸载<br/>%1 @@ -4187,7 +4423,7 @@ Colocar corpo dentro do saco para cadáver Umístit tělo do pytle na mrtvoly 死体袋に入れる - 시체 가방에 담기 + 시체 운반용 부대에 담기 将尸体装入尸袋 將屍體放入屍袋 Vücudu ceset torbasına yerleştir @@ -4204,7 +4440,7 @@ Colocando corpo dentro do saco para cadáver... Umisťuji tělo do pytle na mrtvoly... 死体袋へ入れています・・・ - 시체 가방에 담는중... + 시체 운반용 부대에 담는 중... 正在将尸体装入尸袋... 將屍體放入屍袋中... Vücut, ceset torbasına yerleştiriliyor... @@ -4268,7 +4504,7 @@ %1 ha somministrato una EV %1 aplicou um intravenoso %1 již aplikoval IV - %1 は IV を投与した + %1 はIVを投与した %1 (이)가 IV를 실시했다 %1 已进行静脉注射 %1 已經給予靜脈注射液 @@ -4305,6 +4541,7 @@ %1 hat eine Schiene angelegt %1 已安装夹板 % 1 splint uyguladı + %1 (이)가 부목을 적용했다 %1 used Personal Aid Kit @@ -4368,7 +4605,7 @@ Velmi lehce raněn Muito levemente ferido かなり浅い傷 - 매우 가벼운 부상 + 미미한 부상 小伤 小傷 Çok hafif yaralı @@ -4384,7 +4621,7 @@ Guérir les plaies entièrement bandées Heilt vollständig bandagierte Trefferpunkte 包帯は体力を完全に回復させます - 붕대를 감은후 체력을 회복함 + 붕대를 감은 후 체력을 회복함 完全医疗包扎的部位至痊愈 完全醫療包紮的部位至痊癒 @@ -4400,7 +4637,7 @@ Ošetřuji... Curando... 治療しています・・・ - 치료중... + 치료 중... 正在治疗... 治療中... Tedavi ediliyor ... @@ -4417,7 +4654,7 @@ Снятие жгута... Togliendo il laccio emostatico... 止血帯を外しています・・・ - 지혈대 제거중... + 지혈대 제거 중... 正在移除止血带... 移除軍用止血帶中... Turnike Çıkarılıyor ... @@ -4432,9 +4669,9 @@ Žá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 ! - 身体には止血帯が無い! + この部位には止血帯がない! 이 부위에는 지혈대가 없습니다! - 该部位没有使用止血带! + 该部位没有使用止血带! 這部位沒有止血帶! Bu vücut kısmında turnike yok! @@ -4442,9 +4679,32 @@ The body twitched and may not be dead! Тело дернулось и, возможно, пациент жив! L'unité a bougé et n'est peut-être pas morte ! - 身体が動き死んでないようだ! + 身体が痙攣している、まだ死んでないようだ! ¡El cuerpo se retorció y puede que no esté muerto! Ciało drgnęło i może nie być martwe! + Der Körper zuckte und kann nicht tot sein! + 身体抽搐了一下,可能还没死! + 꿈틀대는걸 보니 죽은 것 같지는 않습니다! + + + Bandage Rollover + Bandażowanie Wielu Ran + Verbandüberschlag + + + If enabled, bandages can close different types of wounds on the same body part.\nBandaging multiple injuries will scale bandaging time accordingly. + Jeśli opcja jest włączona, bandaże mogą zamykać różne rodzaje ran na tej samej części ciała. \nOpatrywanie wielu ran będzie adekwatnie skalować czas bandażowania. + Wenn diese Option aktiviert ist, können Verbände verschiedene Arten von Wunden am selben Körperteil schließen.\nBeim Verbinden mehrerer Verletzungen wird die Verbandszeit entsprechend skaliert. + + + Bandage Effectiveness Coefficient + Współczynnik Efektywności Bandażowania + Verbandswirksamkeitskoeffizient + + + Determines how effective bandages are at closing wounds. + Określa skuteczność bandaży w zamykaniu ran. + Bestimmt, wie wirksam Bandagen beim Verschließen von Wunden sind. diff --git a/addons/medical_treatment/ui/suture_ca.paa b/addons/medical_treatment/ui/suture_ca.paa new file mode 100644 index 0000000000..4b27ca8509 Binary files /dev/null and b/addons/medical_treatment/ui/suture_ca.paa differ diff --git a/addons/medical_vitals/addon.toml b/addons/medical_vitals/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_vitals/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_vitals/config.cpp b/addons/medical_vitals/config.cpp index 91995242c9..f00fbe7174 100644 --- a/addons/medical_vitals/config.cpp +++ b/addons/medical_vitals/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -15,3 +22,5 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf index 850ff41607..683cfd34b7 100644 --- a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Updates the vitals. Called from the statemachine's onState functions. @@ -165,4 +165,7 @@ if (!isPlayer _unit) then { END_COUNTER(Vitals); +//placed outside the counter as 3rd-party code may be called from this event +[QEGVAR(medical,handleUnitVitals), [_unit, _deltaT]] call CBA_fnc_localEvent; + true diff --git a/addons/medical_vitals/functions/fnc_updateHeartRate.sqf b/addons/medical_vitals/functions/fnc_updateHeartRate.sqf index 4da8519077..9ffc52d663 100644 --- a/addons/medical_vitals/functions/fnc_updateHeartRate.sqf +++ b/addons/medical_vitals/functions/fnc_updateHeartRate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Update the heart rate diff --git a/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf b/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf index 98906746e2..36e8708be0 100644 --- a/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf +++ b/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Update the pain suppression diff --git a/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf index c5552143c7..30f8038d80 100644 --- a/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf +++ b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Update the peripheral resistance diff --git a/addons/medical_vitals/functions/script_component.hpp b/addons/medical_vitals/functions/script_component.hpp deleted file mode 100644 index 4fe94957b5..0000000000 --- a/addons/medical_vitals/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_vitals\script_component.hpp" diff --git a/addons/metis/config.cpp b/addons/metis/config.cpp index 65e4474dd9..f16d3c7892 100644 --- a/addons/metis/config.cpp +++ b/addons/metis/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_missileguidance"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/microdagr/CfgWeapons.hpp b/addons/microdagr/CfgWeapons.hpp index 6c7c920427..aebe427c90 100644 --- a/addons/microdagr/CfgWeapons.hpp +++ b/addons/microdagr/CfgWeapons.hpp @@ -9,6 +9,7 @@ class CfgWeapons { descriptionShort = CSTRING(itemDescription); model = QPATHTOF(data\MicroDAGR.p3d); picture = QPATHTOF(images\microDAGR_item.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2; }; diff --git a/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf b/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf index ece62c22e9..8d77fb6605 100644 --- a/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf +++ b/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the keypad entries from the "Mark" Application diff --git a/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf b/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf index 4aa01155ca..da22251453 100644 --- a/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf +++ b/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the "Connect To" button from the menu application diff --git a/addons/microdagr/functions/fnc_appSettingsLBClick.sqf b/addons/microdagr/functions/fnc_appSettingsLBClick.sqf index 5c5c511ca6..4f084b5932 100644 --- a/addons/microdagr/functions/fnc_appSettingsLBClick.sqf +++ b/addons/microdagr/functions/fnc_appSettingsLBClick.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles double clicking on the setting listbox diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf index 61508a1553..8649d8d962 100644 --- a/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf +++ b/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles clicking the delete button from the waypoint application diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf index 80d5cfaef6..d888eb4bbf 100644 --- a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf +++ b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles clicking the setWP button from the waypoint application diff --git a/addons/microdagr/functions/fnc_canShow.sqf b/addons/microdagr/functions/fnc_canShow.sqf index 0c80896661..141fad9ed0 100644 --- a/addons/microdagr/functions/fnc_canShow.sqf +++ b/addons/microdagr/functions/fnc_canShow.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Tests if the dagr can be shown in a mode diff --git a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf index 443ab193e4..080ff73deb 100644 --- a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf +++ b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Adds a waypoint to the "device" diff --git a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf index 895b64bb38..14bfcbf1de 100644 --- a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf +++ b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Deletes a waypoint from the "device" diff --git a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf index 88e89f7fa7..d392024b0b 100644 --- a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf +++ b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets all waypoints from the "device" diff --git a/addons/microdagr/functions/fnc_dialogClosedEH.sqf b/addons/microdagr/functions/fnc_dialogClosedEH.sqf index fc94b101f5..942167462b 100644 --- a/addons/microdagr/functions/fnc_dialogClosedEH.sqf +++ b/addons/microdagr/functions/fnc_dialogClosedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the dialog closeing, switches back to display mode diff --git a/addons/microdagr/functions/fnc_mapButtonDownEH.sqf b/addons/microdagr/functions/fnc_mapButtonDownEH.sqf index 9ca55bc5ab..6a92ebc601 100644 --- a/addons/microdagr/functions/fnc_mapButtonDownEH.sqf +++ b/addons/microdagr/functions/fnc_mapButtonDownEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles right clicking on the map ('dragging' the map) diff --git a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf index aeb73414f5..00d53418b1 100644 --- a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf +++ b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the double tapping either of the 2 mini-maps diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf index 15c1b0a59c..30a0c6ad6e 100644 --- a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the draw event from all 3 maps (compass + 2 minimaps) diff --git a/addons/microdagr/functions/fnc_modeMapButtons.sqf b/addons/microdagr/functions/fnc_modeMapButtons.sqf index 8ed8171535..e1a0509ee4 100644 --- a/addons/microdagr/functions/fnc_modeMapButtons.sqf +++ b/addons/microdagr/functions/fnc_modeMapButtons.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Takes some arguments and returns something or other. diff --git a/addons/microdagr/functions/fnc_moduleMapFill.sqf b/addons/microdagr/functions/fnc_moduleMapFill.sqf index 01e6af799f..aa227830da 100644 --- a/addons/microdagr/functions/fnc_moduleMapFill.sqf +++ b/addons/microdagr/functions/fnc_moduleMapFill.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Function for the module (handles the map fill level) diff --git a/addons/microdagr/functions/fnc_openDisplay.sqf b/addons/microdagr/functions/fnc_openDisplay.sqf index 775378a533..56d404bf6f 100644 --- a/addons/microdagr/functions/fnc_openDisplay.sqf +++ b/addons/microdagr/functions/fnc_openDisplay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Changes the display mode of the MicroDAGR. diff --git a/addons/microdagr/functions/fnc_recieveRangefinderData.sqf b/addons/microdagr/functions/fnc_recieveRangefinderData.sqf index 640c42cfe4..8fd16d68f7 100644 --- a/addons/microdagr/functions/fnc_recieveRangefinderData.sqf +++ b/addons/microdagr/functions/fnc_recieveRangefinderData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Recieves the data packet from the vector rangefinder diff --git a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf index 068b8d2cd2..c756b63141 100644 --- a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf +++ b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Saves the current mode and sets a new mode diff --git a/addons/microdagr/functions/fnc_showApplicationPage.sqf b/addons/microdagr/functions/fnc_showApplicationPage.sqf index 1ba8a36d45..75f817ad3f 100644 --- a/addons/microdagr/functions/fnc_showApplicationPage.sqf +++ b/addons/microdagr/functions/fnc_showApplicationPage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Changes the "application page" shown on the microDAGR diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index d4cc5000c3..3e5775b86d 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Updates the display (several times a second) called from the pfeh @@ -44,7 +44,7 @@ case (APP_MODE_INFODISPLAY): { (_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText; //Heading: - _compassAngleText = if (GVAR(settingUseMils)) then { + private _compassAngleText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (([ACE_player] call CBA_fnc_headDir) select 0))), 4, 0] call CBA_fnc_formatNumber; } else { ([([ACE_player] call CBA_fnc_headDir) select 0, 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 @@ -65,8 +65,8 @@ case (APP_MODE_INFODISPLAY): { } else { private _targetPosName = ""; private _targetPosLocationASL = []; - _bearingText = "----"; - _rangeText = "----"; + private _bearingText = "----"; + private _rangeText = "----"; _aboveSeaLevelText = "----"; if (GVAR(currentWaypoint) == -2) then { @@ -134,8 +134,8 @@ case (APP_MODE_COMPASS): { _targetPosLocationASL = (_waypoints select GVAR(currentWaypoint)) select 1; }; - _bearingText = "---"; - _rangeText = "---"; + private _bearingText = "---"; + private _rangeText = "---"; if (_targetPosLocationASL isNotEqualTo []) then { private _bearing = [(getPosASL ACE_player), _targetPosLocationASL] call BIS_fnc_dirTo; diff --git a/addons/microdagr/functions/script_component.hpp b/addons/microdagr/functions/script_component.hpp deleted file mode 100644 index 13fbbcf5fe..0000000000 --- a/addons/microdagr/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\microdagr\script_component.hpp" \ No newline at end of file diff --git a/addons/microdagr/initSettings.sqf b/addons/microdagr/initSettings.sqf index 85614c9821..8810939302 100644 --- a/addons/microdagr/initSettings.sqf +++ b/addons/microdagr/initSettings.sqf @@ -1,9 +1,9 @@ -// CBA Settings [ADDON: ace_microdagr]: +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(itemName)]; [ QGVAR(mapDataAvailable), "LIST", [LSTRING(MapDataAvailable_DisplayName), LSTRING(MapDataAvailable_Description)], - ["ACE Uncategorized", "MicroDAGR"], + _category, [[0,1,2],[LSTRING(MapFill_None), LSTRING(MapFill_OnlyRoads), LSTRING(MapFill_Full)],2], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(mapDataAvailable), _this] call EFUNC(common,cbaSettings_settingChanged)}, @@ -13,7 +13,7 @@ [ QGVAR(waypointPrecision), "LIST", [LSTRING(WaypointPrecision_DisplayName), LSTRING(WaypointPrecision_Description)], - ["ACE Uncategorized", "MicroDAGR"], + _category, [[1, 2, 3], [LSTRING(WaypointPrecision_medium), LSTRING(WaypointPrecision_close), LSTRING(WaypointPrecision_exact)], 2], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(waypointPrecision), _this] call EFUNC(common,cbaSettings_settingChanged)}, diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 6bb267df13..f090377c2f 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -13,8 +13,8 @@ GPS MicroDAGR GPS MicroDAGR MicroDAGR GPS - MicroDAGR GPS - 微型军用GPS接收器 + 마이크로DAGR GPS + 微型军用 GPS 接收器 微型軍用GPS接收器 MicroDAGR GPS @@ -30,8 +30,8 @@ Ricevitore GPS avanzato MicroDAGR Receptor GPS avançado MicroDAGR MicroDAGR は改良された GPS 受信機です - MicroDAGR 고급 위성항법 수신기 - 微型军用高级防御GPS接收器 + 마이크로DAGR 고급 위성항법 수신기 + 微型军用高级防御 GPS 接收器 微型軍用高級防禦GPS接收器 @@ -47,7 +47,7 @@ Unidade Angular: 角度の種類: 각도의 단위: - 角密位: + 角密位: 角密位: @@ -95,7 +95,7 @@ Mostrar Waypoints no mapa: 地図へウェイポイントを表示: 웨이포인트를 지도에 보이기: - 显示路径点在地图上: + 显示路径点在地图上: 顯示路徑點在地圖上: @@ -144,7 +144,7 @@ Introduci griglia coordinate: Digite as Coords. do Grid 座標を入力: - 输入网格座标: + 输入网格座标: 輸入網格座標: 좌표 입력: @@ -176,9 +176,9 @@ Nuovo MGRS MGRS-Novo MGRS-New - 军事网格座标系统-新型 - 軍事網格座標系統-新型 - MGRS-New + 军事网格座标系统—新型 + 軍事網格座標系統—新型 + 군용 좌표 시스템-신형 WGD @@ -192,7 +192,7 @@ WGD WGD WGD - WGD + 세계좌표 世界座标 世界座標 @@ -209,7 +209,7 @@ Distância: 距離: 거리: - 范围: + 范围: 範圍: @@ -225,7 +225,7 @@ Direção na bússula 方位磁石での方位 방위 - 指北针方位 + 指南针方位 指北針方位 @@ -352,8 +352,8 @@ Alterna modalità display MicroDAGR Alternar Modo de Display do MicroDAGR MicroDAGR の表示モード - MicroDAGR 화면 모드 토글 - 切换微型军用GPS接收器显示模式 + 마이크로DAGR 화면 모드 토글 + 切换微型军用 GPS 接收器显示模式 切換微型軍用GPS接收器顯示模式 @@ -368,8 +368,8 @@ Mostra MicroDAGR Mostrar MicroDAGR MicoDAGR を表示 - MicroDAGR 꺼내기 - 显示微型军用GPS接收器 + 마이크로DAGR 꺼내기 + 显示微型军用 GPS 接收器 顯示微型軍用GPS接收器 @@ -384,8 +384,8 @@ ConfiguraMicroDAGR Configurar MicroDAGR MicroDAGR を設定 - MicroDAGR 설정하기 - 设定微型军用GPS接收器 + 마이크로DAGR 설정하기 + 设定微型军用 GPS 接收器 設定微型軍用GPS接收器 @@ -400,8 +400,8 @@ Chiudi MicroDAGR Fechar MicroDAGR MicroDAGR を閉じる - MicroDAGR 집어넣기 - 关闭微型军用GPS接收器 + 마이크로DAGR 집어넣기 + 关闭微型军用 GPS 接收器 關閉微型軍用GPS接收器 @@ -416,8 +416,8 @@ Заполнение карты MicroDAGR Riempimento Mappa MicroDAGR MicroDAGR での地図情報 - MicroDAGR - 지도채우기 - 微型军用GPS接收器地图资料 + 마이크로DAGR - 지도채우기 + 微型军用 GPS 接收器地图资料 微型軍用GPS接收器地圖資料 @@ -432,8 +432,8 @@ Заполнение карты MicroDAGR Riempimento Mappa MicroDAGR MicroDAGR での地図情報 - MicroDAGR - 지도채우기 - 微型军用GPS接收器地图资料 + 마이크로DAGR - 지도채우기 + 微型军用 GPS 接收器地图资料 微型軍用GPS接收器地圖資料 @@ -448,8 +448,8 @@ Сколько данных должно отображаться на карте MicroDAGR Quanti dati sono trasferiti nella mappa del MicroDAGR MicroDAGR で表示する地図情報を決定します - 얼마나 많은 데이터가 MicroDAGR에 있는지에 대한 정보 - 有多少地图数据会显示在微型军用GPS接收器 + 얼마나 많은 데이터를 마이크로DAGR가 보여주는지를 결정합니다 + 有多少地图数据会显示在微型军用 GPS 接收器 有多少地圖數據會顯示在微型軍用GPS接收器 @@ -495,9 +495,9 @@ Semmi (nem használható a térképnézet) Не показывать (запрещает использовать режим карты) Nessuno (Non puoi usare la vista mappa) - なし(地図表示を使えません) + なし (地図表示を使えません) 없음 (지도를 볼 수 없음) - 无 (无法检视地图) + 无(无法检视地图) 無 (無法檢視地圖) @@ -510,8 +510,10 @@ MicroDAGR - Precisão de Waypoint Précision des points de passage 微型軍用GPS接收器 - 導航精確度 + 微型军用 GPS 接收器—航点精度 MicroDAGR - přesnost Waypointů Micro DAGR - precisión del waypoint + 마이크로DAGR - 경유지 정확도 Controls how precise the waypointdistance can be displayed @@ -523,8 +525,10 @@ 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. Controla cómo de precisa se mostrará la distancia al waypoint + 경유지 거리가 얼마나 정확하게 표시되는지를 결정합니다 100m @@ -536,9 +540,11 @@ 100m 100 m 一百公尺 + 100米 100 m 100m 100m + 100m 10m @@ -550,9 +556,11 @@ 10m 10 m 十公尺 + 10米 10 m 10m 10m + 10m 1m @@ -564,9 +572,11 @@ 1m 1 m 一公尺 + 1米 1 m 1m 1m + 1m Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap. @@ -580,8 +590,8 @@ Контролирует, сколько данных должно отображаться на карте устройств MicroDAGR. Ограничивает объем отображаемых данных на миникарте. Controlla quanti dati sono presenti negli oggetti MicroDAGR. Meno dati costringono la vista mappa a mostrare meno informazioni nella minimappa. アイテム上で表示されるデータ量を決定します。設定を減らすと地図上での情報が少なくなります。 - MicroDAGR에 얼마나 많은 데이터가 들어있는지 정합니다. 적을 수록 지도상에도 비춰지는게 적어집니다. - 设定有多少数据会显示在微型军用GPS接收器上。这些资料的多寡会反映在迷你地图的显示上。 + 마이크로DAGR에 얼마나 많은 데이터가 들어있는지 정합니다. 적을 수록 지도상에도 비춰지는게 적어집니다. + 设定有多少数据会显示在微型军用 GPS 接收器上。这些资料的多寡会反映在迷你地图的显示上。 設定有多少數據會顯示在微型軍用GPS接收器上。這些資料的多寡會反映在迷你地圖的顯示上。 @@ -590,6 +600,10 @@ MicroDAGR - Modo anterior MicroDAGR - Mode précédent MicroDAGR - 前のモードに + MicroDAGR - vorheriger Modus + MicroDAGR - Poprzedni Tryb + 微型 GPS 接收器—上一个模式 + 마이크로DAGR - 이전 모드 MicroDAGR - Next Mode @@ -597,6 +611,10 @@ MicroDAGR - Modo siguiente MicroDAGR - Mode suivant MicroDAGR - 次のモードに + MicroDAGR - nächster Modus + MicroDAGR - Kolejny Tryb + 微型 GPS 接收器—下一个模式 + 마이크로DAGR - 다음 모드 diff --git a/addons/minedetector/functions/fnc_activateDetector.sqf b/addons/minedetector/functions/fnc_activateDetector.sqf index 5ce236250b..7899899d4b 100644 --- a/addons/minedetector/functions/fnc_activateDetector.sqf +++ b/addons/minedetector/functions/fnc_activateDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Activate the mine detector diff --git a/addons/minedetector/functions/fnc_canActivateDetector.sqf b/addons/minedetector/functions/fnc_canActivateDetector.sqf index 8a5d795b49..7b1de093e9 100644 --- a/addons/minedetector/functions/fnc_canActivateDetector.sqf +++ b/addons/minedetector/functions/fnc_canActivateDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if the mine detector can be activated diff --git a/addons/minedetector/functions/fnc_canConnectHeadphones.sqf b/addons/minedetector/functions/fnc_canConnectHeadphones.sqf index 4266f6e065..cc83271d03 100644 --- a/addons/minedetector/functions/fnc_canConnectHeadphones.sqf +++ b/addons/minedetector/functions/fnc_canConnectHeadphones.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Check if headphones can be connected to the mine detector diff --git a/addons/minedetector/functions/fnc_canDeactivateDetector.sqf b/addons/minedetector/functions/fnc_canDeactivateDetector.sqf index 8c38363288..06eeab62e1 100644 --- a/addons/minedetector/functions/fnc_canDeactivateDetector.sqf +++ b/addons/minedetector/functions/fnc_canDeactivateDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if the mine detector can be deactivated diff --git a/addons/minedetector/functions/fnc_canDisconnectHeadphones.sqf b/addons/minedetector/functions/fnc_canDisconnectHeadphones.sqf index b55338b641..733d1a9ff2 100644 --- a/addons/minedetector/functions/fnc_canDisconnectHeadphones.sqf +++ b/addons/minedetector/functions/fnc_canDisconnectHeadphones.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Check if headphones can be disconnected from the mine detector diff --git a/addons/minedetector/functions/fnc_connectHeadphones.sqf b/addons/minedetector/functions/fnc_connectHeadphones.sqf index 3bf76a4d23..88b6b29846 100644 --- a/addons/minedetector/functions/fnc_connectHeadphones.sqf +++ b/addons/minedetector/functions/fnc_connectHeadphones.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Connect/disconnect headphones to the mine detector diff --git a/addons/minedetector/functions/fnc_deactivateDetector.sqf b/addons/minedetector/functions/fnc_deactivateDetector.sqf index 7ed0713846..7403250ad6 100644 --- a/addons/minedetector/functions/fnc_deactivateDetector.sqf +++ b/addons/minedetector/functions/fnc_deactivateDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Deactivate the mine detector diff --git a/addons/minedetector/functions/fnc_detectorLoop.sqf b/addons/minedetector/functions/fnc_detectorLoop.sqf index 3895ab8193..1ede6c7422 100644 --- a/addons/minedetector/functions/fnc_detectorLoop.sqf +++ b/addons/minedetector/functions/fnc_detectorLoop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Handle mine detection in a PFH loop diff --git a/addons/minedetector/functions/fnc_disableDetector.sqf b/addons/minedetector/functions/fnc_disableDetector.sqf index be0c57117d..33106b4c45 100644 --- a/addons/minedetector/functions/fnc_disableDetector.sqf +++ b/addons/minedetector/functions/fnc_disableDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Disables the mine detector diff --git a/addons/minedetector/functions/fnc_enableDetector.sqf b/addons/minedetector/functions/fnc_enableDetector.sqf index 2bb663d977..b673176086 100644 --- a/addons/minedetector/functions/fnc_enableDetector.sqf +++ b/addons/minedetector/functions/fnc_enableDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Enables the mine detector diff --git a/addons/minedetector/functions/fnc_getDetectedObject.sqf b/addons/minedetector/functions/fnc_getDetectedObject.sqf index 9bcfcf2cc7..6827e59c99 100644 --- a/addons/minedetector/functions/fnc_getDetectedObject.sqf +++ b/addons/minedetector/functions/fnc_getDetectedObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the distance to the nearest detectable object diff --git a/addons/minedetector/functions/fnc_getDetectorConfig.sqf b/addons/minedetector/functions/fnc_getDetectorConfig.sqf index 313cc30142..fe7a888ebf 100644 --- a/addons/minedetector/functions/fnc_getDetectorConfig.sqf +++ b/addons/minedetector/functions/fnc_getDetectorConfig.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Get the mine detector configuration from the cache or config file diff --git a/addons/minedetector/functions/fnc_hasDetector.sqf b/addons/minedetector/functions/fnc_hasDetector.sqf index c7ebd5b9f0..05ac7e412e 100644 --- a/addons/minedetector/functions/fnc_hasDetector.sqf +++ b/addons/minedetector/functions/fnc_hasDetector.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if unit has a mine detector in hands diff --git a/addons/minedetector/functions/fnc_isDetectorEnabled.sqf b/addons/minedetector/functions/fnc_isDetectorEnabled.sqf index 4b18d417bc..6b94e4bc11 100644 --- a/addons/minedetector/functions/fnc_isDetectorEnabled.sqf +++ b/addons/minedetector/functions/fnc_isDetectorEnabled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if the mine detector is enabled diff --git a/addons/minedetector/functions/fnc_playDetectorSound.sqf b/addons/minedetector/functions/fnc_playDetectorSound.sqf index dc0be60015..cfd5dc3822 100644 --- a/addons/minedetector/functions/fnc_playDetectorSound.sqf +++ b/addons/minedetector/functions/fnc_playDetectorSound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Play the detector sound diff --git a/addons/minedetector/functions/script_component.hpp b/addons/minedetector/functions/script_component.hpp deleted file mode 100644 index 03333c8bae..0000000000 --- a/addons/minedetector/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\minedetector\script_component.hpp" diff --git a/addons/minedetector/stringtable.xml b/addons/minedetector/stringtable.xml index 7dec7d1a80..3f6eca652b 100644 --- a/addons/minedetector/stringtable.xml +++ b/addons/minedetector/stringtable.xml @@ -88,7 +88,7 @@ ヘッドホンからはずす Odłącz słuchawki Kopfhörer trennen - 헤드폰 연결끊기 + 헤드폰 연결 끊기 Déconnecter les écouteurs Disconnetti Auricolari 断开耳机 @@ -120,7 +120,7 @@ ヘッドホンから外しました Słuchawki odpięte Kopfhörer getrennt - 헤드폰 연결끊김 + 헤드폰 연결 끊김 Écouteurs déconnectés Auricolari Disconnessi 已断开耳机 diff --git a/addons/missileguidance/ACE_GuidanceConfig.hpp b/addons/missileguidance/ACE_GuidanceConfig.hpp index 8e3324b09d..3628c9eec0 100644 --- a/addons/missileguidance/ACE_GuidanceConfig.hpp +++ b/addons/missileguidance/ACE_GuidanceConfig.hpp @@ -86,7 +86,7 @@ class GVAR(SeekerTypes) { name = ""; visualName = ""; description = ""; - + functionName = QFUNC(seekerType_ARH); onFired = QFUNC(ahr_onFired); }; diff --git a/addons/missileguidance/XEH_pre_init.sqf b/addons/missileguidance/XEH_pre_init.sqf index f377efddb6..0798fed2e4 100644 --- a/addons/missileguidance/XEH_pre_init.sqf +++ b/addons/missileguidance/XEH_pre_init.sqf @@ -6,7 +6,7 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -// Formally a ace_setting, users can still disable by `setting ace_missileguidance_enabled = x;` +// Formally a ace_setting, users can still disable by `setting ace_missileguidance_enabled = x;` // [0 - Off , 1 - PlayerOnly, 2 - PlayerAndAi] // As weapons take config changes, there is little point in being able to disable guidance if (isNil QGVAR(enabled)) then { GVAR(enabled) = 2; }; diff --git a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf index 10c3bd5892..299ec6f236 100644 --- a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf +++ b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Sets up SACLOS state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/fnc_ahr_onFired.sqf b/addons/missileguidance/functions/fnc_ahr_onFired.sqf index c7a3e5561c..0618c046ad 100644 --- a/addons/missileguidance/functions/fnc_ahr_onFired.sqf +++ b/addons/missileguidance/functions/fnc_ahr_onFired.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Sets up Active Radar state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf index 823e85efaa..e1675bc1bb 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: AIR diff --git a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf index 7e9408b2d7..5aaff9d7f8 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Attack profile: Beam guided. Exact same as wire-guided, except no wire cutting * * Arguments: diff --git a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf index cddd70807e..80499a85da 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: DIR diff --git a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf index 6f1fbe67d3..92413f59d0 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: HI diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf index f277c1bc68..6ddb60d21b 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: Javelin Dir diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index 08219ea24a..d7092a924d 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: Javelin Top diff --git a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf index 464ee9e36b..23476ec46c 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: Linear (used by DAGR) diff --git a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf index f66088844c..2ca9eef77f 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Attack profile: MID diff --git a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf index 4f0324597f..443fe1bb97 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Attack profile: Wire guided * * Arguments: diff --git a/addons/missileguidance/functions/fnc_changeMissileDirection.sqf b/addons/missileguidance/functions/fnc_changeMissileDirection.sqf index d560f05e2a..21884c1693 100644 --- a/addons/missileguidance/functions/fnc_changeMissileDirection.sqf +++ b/addons/missileguidance/functions/fnc_changeMissileDirection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Change a projectile's direction, maintaing speed diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf index 838254e950..1fadc5510e 100644 --- a/addons/missileguidance/functions/fnc_checkLos.sqf +++ b/addons/missileguidance/functions/fnc_checkLos.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Returns whether the seeker object can see the target position with checkVisibility diff --git a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf index d8b3b858b3..c69f6d20f0 100644 --- a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf +++ b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus * Returns whether the target position is within the maximum angle FOV of the provided seeker diff --git a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf index adfd1b5e01..d25d2bc2b7 100644 --- a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf +++ b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Cycles fire mode for any missileGuidance enabled ammo that has multiple attack profiles @@ -78,14 +78,13 @@ TRACE_4("",_currentFireMode,_nextFireMode,_index,_attackProfiles); 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"]; + { + _x params ["_xIndex", "", "_xWeapon", "", "_xMode"]; if ((_xWeapon == _weapon) && {(getText (configFile >> "CfgWeapons" >> _weapon >> _xMode >> QGVAR(attackProfile))) == _nextFireMode}) exitWith { - TRACE_2("Restoring",_weaponIndex,weaponState _currentShooter); + ACE_player action ["SwitchWeapon", _currentShooter, ACE_player, _xIndex]; + TRACE_2("Restoring",weaponState _currentShooter,_x); }; - if ((weaponState _weaponStateToken) isEqualTo ["","","","",0]) exitWith {ERROR_2("weaponState not found",_weapon,_nextFireMode);}; - }; + } forEach (ACE_player weaponsInfo [_weapon, false]); } else { TRACE_2("setVariable attackProfile",_currentShooter,_nextFireMode); _currentShooter setVariable [QGVAR(attackProfile), _nextFireMode, false]; diff --git a/addons/missileguidance/functions/fnc_doAttackProfile.sqf b/addons/missileguidance/functions/fnc_doAttackProfile.sqf index 53d43883d3..cafbadf69c 100644 --- a/addons/missileguidance/functions/fnc_doAttackProfile.sqf +++ b/addons/missileguidance/functions/fnc_doAttackProfile.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou, PabstMirror * Do attack profile with a valid seeker target location diff --git a/addons/missileguidance/functions/fnc_doHandoff.sqf b/addons/missileguidance/functions/fnc_doHandoff.sqf index 569a827173..153f38a3c4 100644 --- a/addons/missileguidance/functions/fnc_doHandoff.sqf +++ b/addons/missileguidance/functions/fnc_doHandoff.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE * Not currently used diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf index de01b476b6..6008725b4c 100644 --- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou, PabstMirror * Do seeker search diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index 8050dfcff5..132af330c3 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Guidance Per Frame Handler diff --git a/addons/missileguidance/functions/fnc_handleHandoff.sqf b/addons/missileguidance/functions/fnc_handleHandoff.sqf index b4bb0052ae..9c6e299d01 100644 --- a/addons/missileguidance/functions/fnc_handleHandoff.sqf +++ b/addons/missileguidance/functions/fnc_handleHandoff.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE-Team * Not currently used diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index 422639c452..1c964c5113 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Fired event handler, starts guidance if enabled for ammo diff --git a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf index 045fffaaa1..d49ade0022 100644 --- a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf +++ b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Handles AI shooting a locking missile diff --git a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf index a3bda11258..20571e3d65 100644 --- a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Active Radar Homing seeker * * Arguments: @@ -30,7 +30,7 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) 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 { @@ -83,7 +83,7 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then { _target = _x; }; } forEach _nearestObjects; - + _expectedTargetPos = _searchPos; }; diff --git a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf index 356ad5c2f1..7fc30fb30b 100644 --- a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Seeker Type: Optic diff --git a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf index 2d0a1e9170..da9549c3ae 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * SACLOS seeker * * Arguments: diff --git a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf index 09e20e7887..4b74d0f7e3 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: jaynus / nou * Seeker Type: SALH (Laser) diff --git a/addons/missileguidance/functions/fnc_wire_onFired.sqf b/addons/missileguidance/functions/fnc_wire_onFired.sqf index cb4020bd0f..0cfa90ff99 100644 --- a/addons/missileguidance/functions/fnc_wire_onFired.sqf +++ b/addons/missileguidance/functions/fnc_wire_onFired.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Sets up wireGuided state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/script_component.hpp b/addons/missileguidance/functions/script_component.hpp deleted file mode 100644 index 7046e9271d..0000000000 --- a/addons/missileguidance/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\missileguidance\script_component.hpp" \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index eb77ee12d4..dc050272b1 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -14,7 +14,7 @@ Продвинутое наведение ракет 高度なミサイルの誘導 고급 미사일 유도 - 进阶飞弹制导 + 进阶导弹制导 進階飛彈制導 Gelişmiş Füze Güdüm Sistemi @@ -30,8 +30,8 @@ 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. 高度なミサイルの誘導、または AMG はミサイルの捕捉と発射に複数の強化をあたえます。これはミサイルの種類によって、枠組みを必要とします。 - 고급 미사일 유도 혹은 AMG 는 표적 획득 및 발사를 위한 여러 기능을 제공합니다. 미사일 종류에따라 체계가 필요합니다. - 进阶飞弹制导增强了多种导弹锁定和射击的能力。此系统适用于所有飞弹类型的武器。 + 고급 미사일 유도 혹은 AMG는 표적 획득 및 발사를 위한 여러 기능을 제공합니다. 미사일 종류에 따라 체계가 필요합니다. + 进阶导弹制导增强了多种导弹锁定和射击的能力。此系统适用于所有导弹类型的武器。 進階飛彈制導增強了多種導彈鎖定和射擊的能力。此系統適用於所有飛彈類型的武器 Gelişmiş füze rehberliği veya AMG, füze kilitleme ve ateşleme için çoklu geliştirmeler sağlar. @@ -47,8 +47,8 @@ Hydra-70 DAGR rakéta Hydra-70 DAGR ハイドラ-70 DAGR ミサイル - Hydra-70 DAGR 미사일 - 九头蛇-70 直接攻击导引飞弹 + 히드라-70 DAGR 미사일 + Hydra-70 DAGR 制导火箭 九頭蛇-70 直接攻擊導引飛彈 Hydra-70 DAGR Füze @@ -65,7 +65,7 @@ DAGR DAGR DAGR - 直接攻击制导火箭弹 + DAGR 直接攻擊導引飛彈 DAGR @@ -81,8 +81,8 @@ Hydra-70 DAGR lézer-irányított rakéta Управляемая ракета лазерного наведения Hydra-70 DAGR ハイドラ-70 DAGR レーザ誘導ミサイル - Hydra-70 DAGR 레이저 유도 미사일 - 九头蛇-70mm 制导航空火箭弹 + 히드라-70 DAGR 레이저 유도 미사일 + Hydra-70 激光制导直接攻击火箭(DAGR) 九頭蛇-70 直接攻擊雷射導引飛彈 Hydra-70 DAGR Lazer Güdümlü Füze @@ -98,8 +98,8 @@ Hellfire II AGM-114K rakéta Hellfire II AGM-114K ヘルファイア II AGM-114K ミサイル - Hellfire II AGM-114K 미사일 - 地狱火II型AGM-114K空地制导破甲弹 + 헬파이어 II AGM-114K 미사일 + AGM-114K 地狱火二型导弹 地獄火II型 AGM-114K 導彈 Hellfire II AGM-114K Füze @@ -116,7 +116,7 @@ AGM-114K AGM-114K AGM-114K - AGM-114K制导破甲弹 + AGM-114K AGM-114K AGM-114K @@ -132,8 +132,8 @@ Hellfire II AGM-114K lézer-irányított rakéta Управляемая ракета лазерного наведения Hellfire II AGM-114K ヘルファイア II AGM-114K レーザ誘導ミサイル - Hellfire II AGM-114K 레이저 유도 미사일 - 地狱火II型AGM-114K空地制导破甲弹 + 헬파이어 II AGM-114K 레이저 유도 미사일 + AGM-114K 地狱火二型激光制导导弹 地獄火II型 AGM-114K 雷射導引飛彈 Hellfire II AGM-114K Lazer Güdümlü Füze @@ -182,8 +182,8 @@ Játékosok és AI Игрок и боты Giocatore ed IA - プレイヤーと AI - 玩家和AI + プレイヤーとAI + 玩家和 AI 玩家和AI 플레이어와 AI Oyuncular ve AI diff --git a/addons/missionmodules/CfgFactionClasses.hpp b/addons/missionmodules/CfgFactionClasses.hpp index fc4abc3606..bf0aea3a10 100644 --- a/addons/missionmodules/CfgFactionClasses.hpp +++ b/addons/missionmodules/CfgFactionClasses.hpp @@ -3,4 +3,4 @@ class CfgFactionClasses { class ACE_missionModules: NO_CATEGORY { displayName = CSTRING(Category_DisplayName); }; -}; \ No newline at end of file +}; diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp index 6a2f74b934..880623d488 100644 --- a/addons/missionmodules/CfgVehicles.hpp +++ b/addons/missionmodules/CfgVehicles.hpp @@ -65,4 +65,4 @@ class CfgVehicles { sync[] = {}; }; }; -}; \ No newline at end of file +}; diff --git a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf index ba20ac0b8d..63465a6588 100644 --- a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf +++ b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Plays synchronized ambiance sounds while the module is alive. diff --git a/addons/missionmodules/functions/script_component.hpp b/addons/missionmodules/functions/script_component.hpp deleted file mode 100644 index 42d34d4801..0000000000 --- a/addons/missionmodules/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index 858b3ac701..0a33a92182 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -10,7 +10,7 @@ ACE Módulo de missões ACE modules de mission ACE küldetési modulok - Модули миссий ACE + ACE Модули миссий Moduli Missione ACE ACE ミッション モジュール ACE 미션 모듈 @@ -27,7 +27,7 @@ Sons ambientes Sons d'ambiance Ambiens hangok - Звук окружения + Звуки окружения Souni Ambientali 環境音 환경 효과음 @@ -64,7 +64,7 @@ Nomi classi dei suoni ambientali da eseguire. Separati da ',' 再生する環境音のクラスネームを記載。','で複数指定できます。 재생되는 환경 효과음의 단위와 이름입니다. ','로 구분됩니다. - 输入想使用的环境声音classname。每个classname用','做区隔 + 输入想使用的环境声音 classname。每个 classname 用','做区隔 輸入想使用的環境聲音classname。每個classname用','做區隔 Çalınacak ambiyans seslerinin sınıf isimleri. @@ -77,7 +77,7 @@ Distância mínima Distance minimale Minimális távolság - Минимальная дистанция + Мин. дистанция Distanza Minimale 最低距離 최소 거리 @@ -97,8 +97,8 @@ Используется для расчета случайной позиции и указывает минимальное расстояние между игроками и источниками звука Usati per calcolare una posizione casuale ed impostare la distanza minima tra i giocatori ed il file suono eseguito 無作為な位置への計算や、プレイヤーと再生されるファイルの間へ最低距離を設定します - 무작위 위치 계산에 사용되며 플레이어와 재생 된 사운드 파일 간의 최소 거리를 설정합니다. - 声音将随机产生在玩家附近,此选项定义该声音最近会距离玩家多少公尺 + 무작위 위치 계산에 사용되며 플레이어와 재생된 사운드 파일 간의 최소 거리를 설정합니다. + 声音将随机产生在玩家附近,此选项定义该声音最近会距离玩家多少米 聲音將隨機產生在玩家附近,此選項定義該聲音最近會距離玩家多少公尺 @@ -110,7 +110,7 @@ Distância máxima Distance maximale Maximális távolság - Максимальная дистанция + Макс. дистанция Distanza Massima 最大距離 최대 거리 @@ -130,8 +130,8 @@ Используется для расчета случайной позиции и указывает максимальное расстояние между игроками и источниками звука Usato per calcolare una posizione casuale ed impostare la distanza massima tra giocatori e il file suono eseguito 無作為な位置への計算や、プレイヤーと再生されるファイルの間へ最大距離を設定します - 무작위 위치 계산에 사용되며 플레이어와 재생 된 사운드 파일 간의 최대 거리를 설정합니다. - 声音将随机产生在玩家附近,此选项定义该声音最远会距离玩家多少公尺 + 무작위 위치 계산에 사용되며 플레이어와 재생된 사운드 파일 간의 최대 거리를 설정합니다. + 声音将随机产生在玩家附近,此选项定义该声音最远会距离玩家多少米 聲音將隨機產生在玩家附近,此選項定義該聲音最遠會距離玩家多少公尺 @@ -143,7 +143,7 @@ Atraso mínimo Délai minimal Minimum késleltetés - Минимальная задержка + Мин. задержка Pausa Minima 最低遅延 최소 지연 @@ -163,7 +163,7 @@ Минимальная задержка между воспроизведением звуков Pausa Minima tra suoni eseguiti 再生されるまでの最低遅延 - 재생된 소리간 최소 지연시간 + 재생된 소리간 최소 지연 시간 设定每个声音档案中间最少间隔多久再进行播放 設定每個聲音檔案中間最少間隔多久再進行播放 Çalınan sesler arasında minimum gecikme @@ -197,7 +197,7 @@ Максимальная задержка между воспроизведением звуков Pausa Massima tra suoni eseguiti 再生されるまでの最大遅延 - 재생된 소리간 최대 지연시간 + 재생된 소리간 최대 지연 시간 设定每个声音档案中间最多间隔多久再进行播放 設定每個聲音檔案中間最多間隔多久再進行播放 Çalınan sesler arasında maksimum gecikme @@ -231,7 +231,7 @@ Следовать за игроками. Если установить в Ложь, звуки будут циклически проигрываться только около позиции Логики. Segui Giocatori. Se impostato su falso, il ciclo eseguirà i suoni solo vicino ad una posizione logica. プレイヤーを追随します。False に設定するとロジックの近くで延々と再生します。 - 플레이어를 따라갑니다. 거짓으로 설정될경우 오직 한 자리에서만 반복해서 소리를 재생합니다. + 플레이어를 따라갑니다. False로 설정될 경우 오직 한 자리에서만 반복해서 소리를 재생합니다. 设定声音是否会在玩家的附近产生。假如关闭此功能,声音只会在模块的位置产生。 設定聲音是否會在玩家的附近產生。假如關閉此功能,聲音只會在模塊的位置產生。 Eğer devde dışı bırakılırsa sesler oyuncuyu takip etmez @@ -283,7 +283,7 @@ Ciclo Suoni Ambientali (sincronizzato in MP) 環境音の繰り返し (MP 間で同期させます) 환경 효과음 반복 (멀티플레이 전반적으로 동기화됨) - 循环的环境声音 (在多人游戏中会同步所有玩家的播放状态) + 循环的环境声音(在多人游戏中会同步所有玩家的播放状态) 循環的環境聲音 (在多人遊戲中會同步所有玩家的播放狀態) Ambiyans sesleri döngüsü (MP üzerinden senkronize edilir) diff --git a/addons/mk6mortar/CfgWeapons.hpp b/addons/mk6mortar/CfgWeapons.hpp index 3e247910fb..c57c9aa2ea 100644 --- a/addons/mk6mortar/CfgWeapons.hpp +++ b/addons/mk6mortar/CfgWeapons.hpp @@ -8,6 +8,7 @@ class CfgWeapons { displayName = CSTRING(rangetable_name); descriptionShort = CSTRING(rangetable_description); picture = QPATHTOF(UI\icon_rangeTable.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 0.5; }; @@ -16,16 +17,19 @@ class CfgWeapons { class CannonCore; class mortar_82mm: CannonCore { class Single1; + class Burst1; }; class ACE_mortar_82mm: mortar_82mm { author = ECSTRING(common,ACETeam); magazines[] = {"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"}; - modes[] = {"Single1","Single2","Single3"}; reloadTime = 0.5; magazineReloadTime = 0.5; class Single1: Single1 { reloadTime = 0.5; }; + class Burst1: Burst1 { + reloadTime = 0.5; + }; }; }; diff --git a/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf b/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf index fd4804b98f..3356e91c11 100644 --- a/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf +++ b/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Compatibility With ACE_CSW (will be called by ace_csw, no dependency) diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 5224aa09a0..c09c96f777 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Called when the mortar is fired. diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 5628ef88b0..216bab43bc 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles player getting into new vehicle. Loads PFEG for mortar display if it is a mortar. diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf index a0186dfb3d..ab4b4e8965 100644 --- a/addons/mk6mortar/functions/fnc_moduleInit.sqf +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Loads settings from the module. diff --git a/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf b/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf index 1a5d5bf9a6..24bd4f9ad3 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Can player open 82mm rangetable. diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index 56ef6a32c5..7b350804f1 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Opens the rangetable and fills the charge listbox. diff --git a/addons/mk6mortar/functions/fnc_toggleMils.sqf b/addons/mk6mortar/functions/fnc_toggleMils.sqf index f010848acf..0207054451 100644 --- a/addons/mk6mortar/functions/fnc_toggleMils.sqf +++ b/addons/mk6mortar/functions/fnc_toggleMils.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Toggles the mortart to show mils or degrees diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index 0a7ad4b928..a800755357 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Called when the mk6's in game UI is loaded. Hides rangefinder data if it is disabled. diff --git a/addons/mk6mortar/functions/script_component.hpp b/addons/mk6mortar/functions/script_component.hpp deleted file mode 100644 index 9980d4fc88..0000000000 --- a/addons/mk6mortar/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\mk6mortar\script_component.hpp" \ No newline at end of file diff --git a/addons/mk6mortar/initSettings.sqf b/addons/mk6mortar/initSettings.sqf index 1b22600cbe..fc90029562 100644 --- a/addons/mk6mortar/initSettings.sqf +++ b/addons/mk6mortar/initSettings.sqf @@ -1,4 +1,3 @@ -// 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)]; diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 15d8f0b4bc..b5b50a4f08 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -14,7 +14,7 @@ Tavola di tiro 82mm 82mm 射表 82mm 사거리표 - 82mm迫击炮射表 + 82 mm 迫击炮射表 82毫米迫擊炮射表 82mm Menzil Tablosu @@ -31,7 +31,7 @@ Tavola di tiro per il mortaio calibro 82mm Mk6 Mk6 82mm 迫撃砲の射表 Mk6 82mm 박격포 사격을 위한 사거리표 - MK6 82mm迫击炮射表 + MK6 82 mm 迫击炮射表 MK6 82毫米迫擊炮射表 Mk6 82mm için Menzil Tablosu @@ -48,7 +48,7 @@ Apri la tavola di tiro 82mm 82mm 射表を開く 82mm 사거리표 열기 - 开启82mm迫击炮射表 + 开启82 mm 迫击炮射表 開啟82毫米迫擊炮射表 82mm Menzil Tablosunu Aç @@ -74,7 +74,7 @@ Mk6 Mörser Mortaio Mk6 MK6迫擊炮 - MK6迫击炮 + MK6 迫击炮 Mk6 迫撃砲 Mortier Mk6 Moździerz Mk6 @@ -83,6 +83,7 @@ Minomet Mk6 Mk6 Havan Mortero MK6 + Mk6 박격포 Mk6 Settings @@ -97,7 +98,7 @@ Impostazioni Mk6 Mk6 設定 Mk6 설정 - MK6设定 + MK6 设定 MK6設定 Mk6 Ayarları @@ -130,7 +131,7 @@ Для выстрелов игрока. Моделирует сопротивление воздуха и эффект ветра Per Proiettili dei Giocatori, simula la Resistenza dell'Aria e gli Effetti del Vento プレイヤが射撃すると、空気抵抗モデルと風による影響をあたえます。 - 플레이어 사격시 공기저항과 바람에 영향을 받습니다 + 플레이어가 사격 시 공기저항과 바람에 영향을 받습니다 设定由玩家射击的迫击炮,将会受到空气阻力与风力的影响 設定由玩家射擊的迫擊砲,將會受到空氣阻力與風力的影響 @@ -147,7 +148,7 @@ Consenti Computer Mk6 Mk6 コンピュータを許可 Mk6 탄도계산컴퓨터 허가 - 允许使用MK6射控电脑 + 允许使用 MK6 弹道计算机 允許使用MK6射控電腦 Mk6 bilgisayarına izin ver @@ -163,8 +164,8 @@ Показывает компьютер и дальномер (это НУЖНО отключить, если вы включаете сопротивление воздуха) Mostra il Computer e Distaziometro (questi DEVONO essere rimossi se vuoi abilitare la resistenza dell'aria) コンピュータと距離を表示します (空気抵抗を有効化している場合は必ず削除してください) - 탄도계산컴퓨터와 거리측정기를 보여줍니다(공기저항을 활성화했을경우 이 항목은 비활성화 되어야만 합니다) - 显示射控电脑和测距仪 (如果有启用空气阻力功能时,须停用此项功能) + 탄도계산컴퓨터와 거리측정기를 보여줍니다(공기저항을 활성화했을 경우 이 항목은 비활성화 되어야 합니다) + 显示弹道计算机和测距仪(如果有启用空气阻力功能时,须停用此项功能) 顯示射控電腦和測距儀 (如果有啟用空氣阻力功能時,須停用此項功能) @@ -180,7 +181,7 @@ Consenti Bussola Mk6 Mk6 への方位磁石を有効化 Mk6 나침반 허용 - 允许使用MK6指北针 + 允许使用 MK6 指南针 允許使用MK6指北針 Mk6 pusulasına izin ver @@ -197,7 +198,7 @@ Mostra la Bussola Digitale Mk6 Mk6 のデジタル方位磁石を表示 Mk6 에서 전자 나침반을 보여줍니다 - 显示MK6的数位指北针 + 显示 MK6 的电子指南针 顯示MK6的數位指北針 Mk6 Dijital Pusulasını göster @@ -213,7 +214,7 @@ Este módulo permite configurar los parámetros del mortero Mk6. Mk6 迫撃砲への設定をできます。 이 모듈은 Mk6 설치 설정을 가능케 합니다. - 这个模块允许你设定MK6迫击炮的相关功能 + 这个模块允许你设定 MK6 迫击炮的相关功能 這個模塊允許你設定MK6迫擊砲的相關功能 @@ -224,7 +225,7 @@ Utiliser la gestion des munitions Utilizza la gestione delle munizioni Usar manejo de munição - Использовать манипуляции с боеприпасами + Манипуляции с боеприпасами 弾薬の取り扱い 탄약 관리 활성화 使用手动弹药装卸 @@ -239,10 +240,10 @@ 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. - Удаляет артиллерийские магазины, требует загрузку отдельных снарядов стрелком или заряжащим. Не влияет на артиллерию ИИ. - 迫撃砲から弾薬を除去します。射手か装填手により予め装填されている必要があります。AI 迫撃砲へ影響を与えません。 - 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야만 합니다. 인공지능은 영향을 받지 않습니다. - 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填。此功能并不影响由AI射击的迫击炮 + Удаляет артиллерийские магазины, требует загрузку отдельных снарядов стрелком или заряжающим. Не влияет на артиллерию ИИ. + 迫撃砲から弾薬を除去します。射手か装填手により予め装填されている必要があります。AI迫撃砲へ影響を与えません。 + 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야 합니다. 인공지능은 영향을 받지 않습니다. + 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填。此功能并不影响由 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. @@ -288,7 +289,7 @@ Descarregar munição Извлечение снаряда 弾薬を除去しています - 탄약 제거중 + 탄약 제거 중 正在卸除弹头 卸除彈頭中 Vybít minomet @@ -305,7 +306,7 @@ Preparar munição Подготовка снаряда 砲弾を事前装填 - 탄약 준비중 + 탄약 준비 중 正在准备弹头 準備彈頭中 Mermi Hazırlanıyor @@ -370,7 +371,7 @@ Зарядить фугасный управляемый 誘導りゅう弾を装填 유도 고폭탄 장전 - 装载导引高爆弹 + 装载制导高爆弹 裝載導引高爆彈 Güdümlü HE Yükle @@ -386,93 +387,93 @@ Зарядить фугасный управляемый по ЛЦУ レーザ誘導りゅう弾を装填 레이저 유도 고폭탄 장전 - 装载雷射导引高爆弹 + 装填激光制导高爆弹 裝載雷射導引高爆彈 Lazer Güdümlü HE Yükle - 82mm HE Round - 82mm Sprengpatrone - Ronda 82mm HE - Pocisk wybuchowy kal. 82mm - Obus de 82 mm HE - Proiettile da 82mm HE - 82mm HE náboj - Munição 82mm HE - Фугасный снаряд 82мм - 82mm りゅう弾 - 82mm 고폭탄 - 82mm高爆弹 - 82毫米高爆彈 - 82mm HE Mermisi + [CSW] 82mm HE Round + [CSW] 82mm Sprengpatrone + [CSW] Ronda 82mm HE + [CSW] Pocisk wybuchowy kal. 82mm + [CSW] Obus de 82 mm HE + [CSW] Proiettile da 82mm HE + [CSW] 82mm HE náboj + [CSW] Munição 82mm HE + [CSW] Фугасный снаряд 82мм + [CSW] 82mm りゅう弾 + [CSW] 82mm 고폭탄 + [班组] 82 mm 高爆弹 + [CSW] 82毫米高爆彈 + [CSW] 82mm HE Mermisi - 82mm Smoke Round - 82mm Nebelpatrone - Ronda 82mm Humo - Pocisk dymny kal. 82mm - Obus de 82 mm fumigène - Proiettile Fumogeno da 82mm - 82mm Kouřový náboj - Munição 82mm Fumaça - Дымовой снаряд 82мм - 82mm 発煙弾 - 82mm 연막탄 - 82mm烟雾弹 - 82毫米煙霧彈 - 82mm Sis Mermisi + [CSW] 82mm Smoke Round + [CSW] 82mm Nebelpatrone + [CSW] Ronda 82mm Humo + [CSW] Pocisk dymny kal. 82mm + [CSW] Obus de 82 mm fumigène + [CSW] Proiettile Fumogeno da 82mm + [CSW] 82mm Kouřový náboj + [CSW] Munição 82mm Fumaça + [CSW] Дымовой снаряд 82мм + [CSW] 82mm 発煙弾 + [CSW] 82mm 연막탄 + [班组] 82 mm 烟雾弹 + [CSW] 82毫米煙霧彈 + [CSW] 82mm Sis Mermisi - 82mm Illumination Round - 82mm Leuchtpatrone - Ronda 82mm Iluminación - Pocisk oświetlający kal. 82mm - Obus de 82 mm éclairant - Proiettile illuminante da 82mm - 82mm Osvětlovací náboj - Munição 82mm Iluminação - Осветительный снаряд 82мм - 82mm 照明弾 - 82mm 조명탄 - 82mm照明弹 - 82毫米照明彈 - 82mm Işık Mermisi + [CSW] 82mm Illumination Round + [CSW] 82mm Leuchtpatrone + [CSW] Ronda 82mm Iluminación + [CSW] Pocisk oświetlający kal. 82mm + [CSW] Obus de 82 mm éclairant + [CSW] Proiettile illuminante da 82mm + [CSW] 82mm Osvětlovací náboj + [CSW] Munição 82mm Iluminação + [CSW] Осветительный снаряд 82мм + [CSW] 82mm 照明弾 + [CSW] 82mm 조명탄 + [班组] 82 mm 照明弹 + [CSW] 82毫米照明彈 + [CSW] 82mm Işık Mermisi - 82mm Guided HE Round - 82mm gelenkte Sprengpatrone - Ronda 82mm Guiada - Kierowany pocisk wybuchowy kal. 82mm - Obus de 82 mm HE guidé - Proiettile HE guidato - 82mm HE náboj (naváděný) - Munição 82mm HE Guiada - Фугасный снаряд управляемый 82мм - 82mm 誘導りゅう弾 - 82mm 유도 고폭탄 - 82mm导引高爆弹 - 82毫米導引高爆彈 - 82mm Güdümlü HE Mermisi + [CSW] 82mm Guided HE Round + [CSW] 82mm gelenkte Sprengpatrone + [CSW] Ronda 82mm Guiada + [CSW] Kierowany pocisk wybuchowy kal. 82mm + [CSW] Obus de 82 mm HE guidé + [CSW] Proiettile HE guidato + [CSW] 82mm HE náboj (naváděný) + [CSW] Munição 82mm HE Guiada + [CSW] Фугасный снаряд управляемый 82мм + [CSW] 82mm 誘導りゅう弾 + [CSW] 82mm 유도 고폭탄 + [班组] 82 mm 制导高爆弹 + [CSW] 82毫米導引高爆彈 + [CSW] 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 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 - Фугасный снаряд управляемый по ЛЦУ 82мм - 82mm レーザ誘導りゅう弾 - 82mm 레이저 유도 고폭탄 - 82mm雷射导引高爆弹 - 82毫米雷射導引高爆彈 - 82mm Lazer Güdümlü HE Mermisi + [CSW] 82mm Laser Guided HE Round + [CSW] 82mm lasergelenkte Sprengpatrone + [CSW] Ronda 82mm Guiada por Laser + [CSW] Laserowo napr. pocisk wybuchowy kal. 82mm + [CSW] Obus de 82 mm HE guidé au laser + [CSW] Proiettile HE a guida laser + [CSW] 82mm HE náboj (naváděný laserem) + [CSW] Munição 82mm HE Guiada por Laser + [CSW] Фугасный снаряд управляемый по ЛЦУ 82мм + [CSW] 82mm レーザ誘導りゅう弾 + [CSW] 82mm 레이저 유도 고폭탄 + [班组] 82 mm 激光制导高爆弹 + [CSW] 82毫米雷射導引高爆彈 + [CSW] 82mm Lazer Güdümlü HE Mermisi - Used in Mk6 mortar - Wird im Mk6 Mörser verwendet + 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. @@ -482,7 +483,7 @@ Использовался в миномете Mk6 Mk6 mortar で使います Mk6 박격포에 사용됨 - 用于Mk6迫击炮 + 用于 Mk6 迫击炮 用於Mk6迫擊砲 @@ -497,7 +498,7 @@ [ACE] Ящик фугасных снарядов 82мм [ACE] 82mm りゅう弾入り弾薬箱 [ACE] 82mm 고폭탄 상자 - [ACE] 82mm高爆弹药箱 + [ACE] 82 mm 高爆弹药箱 [ACE] 82毫米高爆彈藥箱 [ACE] 82mm HE Mermisi Kutusu @@ -513,7 +514,7 @@ [ACE] Ящик дымовых снарядов 82мм [ACE] 82mm 発煙弾入り弾薬箱 [ACE] 82mm 연막탄 상자 - [ACE] 82mm烟雾弹药箱 + [ACE] 82 mm 烟雾弹药箱 [ACE] 82毫米煙霧彈藥箱 [ACE] 82mm Sis Mermisi Kutusu @@ -529,7 +530,7 @@ [ACE] Ящик осветительных снарядов 82мм [ACE] 82mm 照明弾入り弾薬箱 [ACE] 82mm 조명탄 상자 - [ACE] 82mm照明弹药箱 + [ACE] 82 mm 照明弹药箱 [ACE] 82毫米照明彈藥箱 [ACE] 82mm Işık Mermisi Kutusu @@ -545,7 +546,7 @@ [ACE] Ящик снарядов 82мм (стандартный) [ACE] 82mm 保管箱 [ACE] 82mm 기본 장비 상자 - [ACE] 82mm预设弹药箱 + [ACE] 82 mm 预设弹药箱 [ACE] 82毫米預設彈藥箱 [ACE] 82mm Varsayılan Teçhizat Kutusu diff --git a/addons/modules/XEH_postInit.sqf b/addons/modules/XEH_postInit.sqf index c6892046fe..bdc6a9cc40 100644 --- a/addons/modules/XEH_postInit.sqf +++ b/addons/modules/XEH_postInit.sqf @@ -12,7 +12,7 @@ _logic hideObject true; if (_logic getVariable [QGVAR(initalized), false]) exitWith {}; - private _config = (configFile >> "CfgVehicles" >> _logicType); + private _config = configOf _logic; if !(isClass _config) exitWith {}; private _isGlobal = getNumber (_config >> "isGlobal") > 0; diff --git a/addons/modules/functions/fnc_moduleInit.sqf b/addons/modules/functions/fnc_moduleInit.sqf index 5e03aad13c..d722f9a69b 100644 --- a/addons/modules/functions/fnc_moduleInit.sqf +++ b/addons/modules/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * IV Treatment local callback diff --git a/addons/modules/functions/script_component.hpp b/addons/modules/functions/script_component.hpp deleted file mode 100644 index ffd50bc09b..0000000000 --- a/addons/modules/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\modules\script_component.hpp" diff --git a/addons/movement/functions/fnc_addLoadToUnitContainer.sqf b/addons/movement/functions/fnc_addLoadToUnitContainer.sqf index 5910f6c186..11dc6718a5 100644 --- a/addons/movement/functions/fnc_addLoadToUnitContainer.sqf +++ b/addons/movement/functions/fnc_addLoadToUnitContainer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Add (negative numbers to subtract) a virtual mass to a units container. diff --git a/addons/movement/functions/fnc_canClimb.sqf b/addons/movement/functions/fnc_canClimb.sqf index 808a81d582..d197afe4ed 100644 --- a/addons/movement/functions/fnc_canClimb.sqf +++ b/addons/movement/functions/fnc_canClimb.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Tests the the player can climb. diff --git a/addons/movement/functions/fnc_climb.sqf b/addons/movement/functions/fnc_climb.sqf index 2d5eb88786..04cbe7faac 100644 --- a/addons/movement/functions/fnc_climb.sqf +++ b/addons/movement/functions/fnc_climb.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Make the player climb over short walls. diff --git a/addons/movement/functions/fnc_handleClimb.sqf b/addons/movement/functions/fnc_handleClimb.sqf index 6f6c7b536b..1325f2f021 100644 --- a/addons/movement/functions/fnc_handleClimb.sqf +++ b/addons/movement/functions/fnc_handleClimb.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles the climb animation finishing. Called from "AnimDone" event handler. diff --git a/addons/movement/functions/fnc_handleVirtualMass.sqf b/addons/movement/functions/fnc_handleVirtualMass.sqf index f2c0655b5c..6e50cebf00 100644 --- a/addons/movement/functions/fnc_handleVirtualMass.sqf +++ b/addons/movement/functions/fnc_handleVirtualMass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Recalculate the units loadCoef to emulate a mass added to uniform, vest or backpack. @@ -23,9 +23,7 @@ if (isNull _unit) exitWith {}; private _virtualLoad = 0; { - if (!isNull _x) then { - _virtualLoad = _virtualLoad + (_x getVariable [QGVAR(vLoad), 0]); - }; + _virtualLoad = _virtualLoad + (_x getVariable [QGVAR(vLoad), 0]); } forEach [ _unit, uniformContainer _unit, diff --git a/addons/movement/functions/fnc_inventoryDisplayLoad.sqf b/addons/movement/functions/fnc_inventoryDisplayLoad.sqf index cdbc85a895..95299a3b34 100644 --- a/addons/movement/functions/fnc_inventoryDisplayLoad.sqf +++ b/addons/movement/functions/fnc_inventoryDisplayLoad.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Executed every time an inventory display is opened. diff --git a/addons/movement/functions/script_component.hpp b/addons/movement/functions/script_component.hpp deleted file mode 100644 index d33fa99b30..0000000000 --- a/addons/movement/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\movement\script_component.hpp" \ No newline at end of file diff --git a/addons/mx2a/CfgWeapons.hpp b/addons/mx2a/CfgWeapons.hpp index 7ff5943a88..66f775c2d8 100644 --- a/addons/mx2a/CfgWeapons.hpp +++ b/addons/mx2a/CfgWeapons.hpp @@ -15,7 +15,7 @@ class CfgWeapons { opticsZoomInit = 0.1; visionMode[] = {"Ti"}; thermalMode[] = {0,1}; - discretefov[] = {0.33333/1, 0.33333/2}; // 1x/2x -- http://www.drs.com/Products/RSTA/PDF/MX2A.pdf + discretefov[] = {"0.33333/1", "0.33333/2"}; // 1x/2x -- http://www.drs.com/Products/RSTA/PDF/MX2A.pdf discreteInitIndex = 0; discreteDistance[] = {120,400}; discreteDistanceInitIndex = 1; diff --git a/addons/mx2a/stringtable.xml b/addons/mx2a/stringtable.xml index 0836523fde..390a264f3a 100644 --- a/addons/mx2a/stringtable.xml +++ b/addons/mx2a/stringtable.xml @@ -14,7 +14,7 @@ MX-2A MX-2A MX-2A - MX-2A(热成像) + MX-2A(热成像) MX-2A MX-2A diff --git a/addons/nametags/RscTitles.hpp b/addons/nametags/RscTitles.hpp index f0d5678603..0fad69070d 100644 --- a/addons/nametags/RscTitles.hpp +++ b/addons/nametags/RscTitles.hpp @@ -20,8 +20,8 @@ class RscTitles { idc = ACE_CrewInfo_TextIDC; type = CT_STRUCTURED_TEXT; style = ST_LEFT; - x = SafeZonex + SafezoneW - 0.31; - y = SafeZoneY + SafeZoneH * 0.4; + x = "SafeZonex + SafezoneW - 0.31"; + y = "SafeZoneY + SafeZoneH * 0.4"; w = 0.3; h = 0.6; size = 0.018; @@ -34,7 +34,7 @@ class RscTitles { }; text = ""; class Attributes { - align = right; + align = "right"; }; }; }; diff --git a/addons/nametags/XEH_PREP.hpp b/addons/nametags/XEH_PREP.hpp index a27102a4e5..33b21f04ec 100644 --- a/addons/nametags/XEH_PREP.hpp +++ b/addons/nametags/XEH_PREP.hpp @@ -1,9 +1,5 @@ - -PREP(canShow); -PREP(doShow); PREP(drawNameTagIcon); PREP(getCachedFlags); -PREP(getVehicleData); PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onDraw3d); diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index e663274dbd..85115690b4 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -15,7 +15,6 @@ GVAR(showNamesTime) = -10; // Statement GVAR(showNamesTime) = CBA_missionTime; - // if (call FUNC(canShow)) then{ call FUNC(doShow); }; // This code doesn't work (canShow has a nil / has never worked??) // Return false so it doesn't block other actions false }, diff --git a/addons/nametags/functions/common.hpp b/addons/nametags/functions/common.hpp deleted file mode 100644 index ef3706cd32..0000000000 --- a/addons/nametags/functions/common.hpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Author: aeroson - * Images, index in images and order of roles. - * Defined number also implies order, lower number shows more on top of the list. - */ - -#define PILOT 0 -#define DRIVER 1 -#define COPILOT PILOT -#define COMMANDER 2 -#define GUNNER 3 -#define FFV 4 -#define CARGO 5 - -#define ROLE_IMAGES [ \ - "a3\ui_f\data\IGUI\Cfg\Actions\getinpilot_ca.paa", \ - "a3\ui_f\data\IGUI\Cfg\Actions\getindriver_ca.paa", \ - "a3\ui_f\data\IGUI\Cfg\Actions\getincommander_ca.paa", \ - "a3\ui_f\data\IGUI\Cfg\Actions\getingunner_ca.paa", \ - QPATHTOF(UI\icon_position_ffv.paa), \ - "a3\ui_f\data\IGUI\Cfg\Actions\getincargo_ca.paa" \ -] diff --git a/addons/nametags/functions/fnc_canShow.sqf b/addons/nametags/functions/fnc_canShow.sqf deleted file mode 100644 index 9cc83cfd91..0000000000 --- a/addons/nametags/functions/fnc_canShow.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: aeroson - * Checks if crew info can be shown. - * Might be called several times a second. - * - * Arguments: - * None - * - * Return Value: - * Can show Crew Info - * - * Example: - * call ace_nametags_fnc_canShow - * - * Public: No - */ - -((vehicle ACE_player) != ACE_player) && -{GVAR(ShowCrewInfo)} && -{!(vehicle ACE_player isKindOf "ParachuteBase")}; diff --git a/addons/nametags/functions/fnc_doShow.sqf b/addons/nametags/functions/fnc_doShow.sqf deleted file mode 100644 index 12ac1a04cb..0000000000 --- a/addons/nametags/functions/fnc_doShow.sqf +++ /dev/null @@ -1,86 +0,0 @@ -#include "script_component.hpp" -#include "common.hpp" -/* - * Author: aeroson - * Shows the actual text and sets text the crew info. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ace_nametags_fnc_doShow - * - * Public: No - */ - -private _player = ACE_player; -private _vehicle = vehicle _player; -private _type = typeOf _vehicle; -private _config = configFile >> "CfgVehicles" >> _type; -private _text = format[" %2
", getText(_config>>"picture"), getText (_config >> "DisplayName")]; - -private _data = [_type] call FUNC(getVehicleData); - -private _isAir = _data select 0; -private _data = _data select 1; - -private _turretUnits = _data apply {_vehicle turretUnit (_x select 0)}; -private _turretRoles = _data apply {_x select 1}; - -private _roleType = CARGO; -private _toShow = []; -{ - switch (_x) do { - case commander _vehicle: { - _roleType = COMMANDER; - }; - case gunner _vehicle: { - _roleType = GUNNER; - }; - case driver _vehicle: { - _roleType = if(_isAir) then { PILOT } else { DRIVER }; - }; - default { - _index = _turretUnits find _x; - if(_index !=-1 ) then { - _roleType = _turretRoles select _index; - } else { - _roleType = CARGO; - }; - }; - }; - _toShow pushBack [_x, _roleType]; -} forEach crew _vehicle; - -_toShow = [ - _toShow, - [], - { - _x select 1 - }, - "ASCEND", - { - _unit = _x select 0; - alive _unit - } -] call BIS_fnc_sortBy; - -private _roleImages = ROLE_IMAGES; -{ - private _unit = _x select 0; - private _roleType = _x select 1; - _text = _text + format["%1
", [_unit] call EFUNC(common,getName), _roleImages select _roleType]; -} forEach _toShow; - -("ACE_CrewInfo_CrewInfo" call BIS_fnc_rscLayer) cutRsc ["ACE_CrewInfo_dialog", "PLAIN", 1, false]; - -terminate (missionNamespace getVariable [QGVAR(hideCrewInfoHandle), scriptNull]); -GVAR(hideCrewInfoHandle) = 0 spawn { - sleep 2; - ("ACE_CrewInfo_CrewInfo" call BIS_fnc_rscLayer) cutFadeOut 2; -}; - -[_text] call FUNC(setText); diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 338f8b37fc..aa9c900390 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, esteldunedain, Drift_91 * Draw the nametag and rank icon. @@ -29,19 +29,26 @@ _fnc_parameters = { params ["_player", "_target", "_alpha", "_heightOffset", "_drawName", "_drawRank", "_drawSoundwave"]; //Set Icon: - private _icon = ""; - if (_drawSoundwave) then { - _icon = format [QPATHTOF(UI\soundwave%1.paa), floor random 10]; - } else { - if (_drawRank) then { - _icon = _target getVariable "ace_nametags_rankIcon"; - if (isNil "_icon" && {rank _target != ""}) then { - _icon = GVAR(factionRanks) getVariable (_target getVariable [QGVAR(faction), faction _target]); - if (!isNil "_icon") then { - _icon = _icon param [ALL_RANKS find rank _target, ""]; - } else { - _icon = format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target]; - }; + private _targetIcon = _target getVariable QGVAR(rankIcon); + + private _icon = switch true do { + case _drawSoundwave: { + format [QPATHTOF(UI\soundwave%1.paa), floor random 10] + }; + + case !_drawRank: {""}; + case !isNil "_targetIcon": {_targetIcon}; + case (rank _target == ""): {""}; + + default { + private _targetFaction = _target getVariable [QGVAR(faction), faction _target]; + private _customRankIcons = GVAR(factionRanks) getVariable _targetFaction; + + if (!isNil "_customRankIcons") then { + _customRankIcons param [ALL_RANKS find rank _target, ""] // return + } else { + // default rank icons + format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target] // return }; }; }; diff --git a/addons/nametags/functions/fnc_getCachedFlags.sqf b/addons/nametags/functions/fnc_getCachedFlags.sqf index 979517f6a0..806f443e3d 100644 --- a/addons/nametags/functions/fnc_getCachedFlags.sqf +++ b/addons/nametags/functions/fnc_getCachedFlags.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: * Get's flags used for onDraw3D that can be cached diff --git a/addons/nametags/functions/fnc_getVehicleData.sqf b/addons/nametags/functions/fnc_getVehicleData.sqf deleted file mode 100644 index ce7eec49b1..0000000000 --- a/addons/nametags/functions/fnc_getVehicleData.sqf +++ /dev/null @@ -1,103 +0,0 @@ -#include "script_component.hpp" -#include "common.hpp" -/* - * Author: aeroson - * Gathers and caches data needed by ace_nametags_fnc_doShow. - * What really does make difference for the engine is simulation of CfgAmmo. - * Priority of roles is: driver/pilot, gunner, copilot, commander, FFV, cargo. - * - * Arguments: - * None - * - * Return Value: - * Data - * 0: Vehicle inherits from Air - * 1: Categorized vehicle's turrets - * - * Example: - * call ace_nametags_fnc_getVehicleData - * - * Public: No - */ - -params ["_type"]; - -private _varName = format ["ACE_CrewInfo_Cache_%1", _type]; -private _data = + (uiNamespace getVariable _varName); - -if (!isNil "_data") exitWith {_data}; - -_data = []; -private _isAir = _type isKindOf "Air"; - -private _fnc_addTurretUnit = { - params ["_config", "_path"]; - private _role = CARGO; - - private _simulationEmpty = 0; - private _simulationLaserDesignate = 0; - private _simulationOther = 0; - { - { - private _magazine = configFile >> "CfgMagazines" >> _x; - private _ammo = configFile >> "CfgAmmo" >> getText (_magazine >> "ammo"); - private _simulation = getText (_ammo >> "simulation"); - - if(_simulation=="") then { - _simulationEmpty = _simulationEmpty + 1; - } else { - if(_simulation=="laserDesignate") then { - _simulationLaserDesignate = _simulationLaserDesignate + 1; - } else { - _simulationOther = _simulationOther + 1; - }; - }; - - } forEach getArray (configFile >> "CfgWeapons" >> _x >> "magazines"); - } forEach getArray (_config >> "weapons"); - - if(_simulationOther>0) then { - _role = GUNNER; - }; - if (_role == CARGO && {getNumber (_config >> "isCopilot") == 1}) then { - _role = COPILOT; - }; - if (_role == CARGO && {_simulationLaserDesignate>0 || getNumber (_config >> "primaryObserver") == 1}) then { - _role = COMMANDER; - }; - if (_role == CARGO && {getNumber (_config >> "isPersonTurret") == 1}) then { - _role = FFV; - }; - - _data pushBack [_path, _role]; -}; - - -private _fnc_addTurret = { - params ["_config", "_path"]; - - _config = _config >> "Turrets"; - private _count = count _config; - - private _offset = 0; - - for "_index" from 0 to (_count - 1) do { - private _turretPath = _path + [_index - _offset]; - private _turretConfig = _config select _index; - if (isClass _turretConfig) then { - [_turretConfig, _turretPath] call _fnc_addTurretUnit; - [_turretConfig, _turretPath] call _fnc_addTurret; - } else { - _offset = _offset + 1; - }; - }; -}; - - -_config = configFile >> "CfgVehicles" >> _type; -[_config, []] call _fnc_addTurret; - -_data = [_isAir, _data]; -uiNamespace setVariable [_varName, _data]; - -_data diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index a3d7f80ed2..5bae931e60 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, PabstMirror * Starts up a PFEH to monitor the when players are talking. @@ -36,20 +36,22 @@ if (!hasInterface) exitWith {}; }; }] call CBA_fnc_addPlayerEventHandler; -if (isClass (configFile >> "CfgPatches" >> "acre_api")) then { - INFO("ACRE Detected."); - DFUNC(isSpeaking) = { - params ["_unit"]; - ([_unit] call acre_api_fnc_isSpeaking) && {!(_unit getVariable ["ACE_isUnconscious", false])} +switch (true) do { + case (["acre_api"] call EFUNC(common,isModLoaded)): { + INFO("ACRE Detected."); + DFUNC(isSpeaking) = { + params ["_unit"]; + ([_unit] call acre_api_fnc_isSpeaking) && {!(_unit getVariable ["ACE_isUnconscious", false])} + }; }; -} else { - if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { + case (["task_force_radio"] call EFUNC(common,isModLoaded)): { INFO("TFAR Detected."); DFUNC(isSpeaking) = { params ["_unit"]; (_unit getVariable ["tf_isSpeaking", false]) && {!(_unit getVariable ["ACE_isUnconscious", false])} }; - } else { + }; + default { //No Radio Mod - Start a PFEH to watch the internal VON icon //Note: class RscDisplayVoiceChat {idd = 55} - only present when talking diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 03ced478be..4b269033f9 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Initializes the name tags module. diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 3b348fa824..7e9d156014 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: * Draws names and icons. diff --git a/addons/nametags/functions/fnc_setFactionRankIcons.sqf b/addons/nametags/functions/fnc_setFactionRankIcons.sqf index e60c295c7d..88fd880833 100644 --- a/addons/nametags/functions/fnc_setFactionRankIcons.sqf +++ b/addons/nametags/functions/fnc_setFactionRankIcons.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Sets a custom set of icons for a specified faction. diff --git a/addons/nametags/functions/fnc_setText.sqf b/addons/nametags/functions/fnc_setText.sqf index 543b4fc913..836df0a1b6 100644 --- a/addons/nametags/functions/fnc_setText.sqf +++ b/addons/nametags/functions/fnc_setText.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: aeroson * Sets the text on the dialog. diff --git a/addons/nametags/functions/fnc_updateSettings.sqf b/addons/nametags/functions/fnc_updateSettings.sqf index 56ba016064..9fe0dd9908 100644 --- a/addons/nametags/functions/fnc_updateSettings.sqf +++ b/addons/nametags/functions/fnc_updateSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Dynamically adds and removes Draw3D based on settings on run-time. diff --git a/addons/nametags/functions/script_component.hpp b/addons/nametags/functions/script_component.hpp deleted file mode 100644 index b8135e8ecd..0000000000 --- a/addons/nametags/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\nametags\script_component.hpp" diff --git a/addons/nametags/initSettings.sqf b/addons/nametags/initSettings.sqf index 3fd5e5b465..5655be3496 100644 --- a/addons/nametags/initSettings.sqf +++ b/addons/nametags/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_nametags]: - [ QGVAR(showPlayerNames), "LIST", [LSTRING(ShowPlayerNames), LSTRING(ShowPlayerNames_Desc)], diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index f2113e1f6a..791050abef 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -14,7 +14,7 @@ Etichette Nomi 名札 이름표 - 玩家名字 + 玩家名称 玩家名稱 Isım Etiketleri @@ -65,7 +65,7 @@ Показывать имена игроков (включить имена) プレイヤ名を表示 플레이어 이름 표시 - 显示玩家名字 + 显示玩家名称 顯示玩家名稱 Oyuncu isimlerini göster @@ -78,11 +78,11 @@ 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 プレイヤ名の表示と設定を有効化します。標準: 有効 플레이어 이름의 표시와 설정을 활성화합니다. 기본설정: 활성화 - 显示玩家的名字并设置其启动方式。预设: 启用 + 显示玩家的名字并设置其启动方式。预设:启用 顯示玩家的名稱並設置其啟動方式。預設: 啟用 Oyuncu adlarını gösterin ve etkinleştirmelerini ayarlayın. Varsayılan: Etkin @@ -115,7 +115,7 @@ Только по нажатию клавиши Solo quando Premi Tasto キー押下のみ - 키를 누를경우만 + 키를 누를 경우만 只有按按键时 只有按按鍵時 Yalnızca Tuşa Basmada @@ -132,7 +132,7 @@ Под курсором или по нажатию клавиши Solo su Cursore e quando Premi Tasto カーソルとキー押下のみ - 커서와 키를 누를경우만 + 커서와 키를 누를 경우만 只有在准心指到和按按键时 只有在準心指到和按按鍵時 Yalnızca İmleç ve Tuşa Basıldığında @@ -145,7 +145,7 @@ 화면 가장자리에서 사라짐 Estomper sur les bords de l'écran Sfocatura nei bordi dello schermo - 在荧幕边框旁淡出 + 在屏幕边框旁淡出 在螢幕邊框旁淡出 Затухание на границе экрана Ocultar na borda da tela @@ -166,7 +166,7 @@ Показывать звания игроков (при вкл. именах) プレイヤの階級を表示 (プレイヤ名が必要) 플레이어 계급 표시 (플레이어 이름 필요) - 显示玩家军阶 (玩家必须有设定名字) + 显示玩家军阶(玩家必须有设定名字) 顯示玩家軍階 (玩家必須有設定名稱) Oyuncu rütbelerini göster (oyuncu isimleri açılması gerektirir) @@ -196,11 +196,11 @@ 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 車両の乗員を表示します。標準ではプレイヤ各々が選べられます。標準: 強制しない - 승무원 정보를 표시하거나 플레이어가 직접 고르게 냅둡니다. 기본설정: 강제하지 않음 - 显示载具成员讯息。在预设的情况下,系统允许玩家自己决定开关此讯息。预设: 不显示 + 승무원 정보를 표시하거나 플레이어가 직접 고르게 놔둡니다. 기본설정: 강제하지 않음 + 显示载具成员信息。在预设的情况下,系统允许玩家自己决定开关此信息。预设:不显示 顯示載具成員訊息。在預設的情況下,系統允許玩家自己決定開關此訊息。預設: 不顯示 Araç mürettebat bilgilerini gösterin veya varsayılan olarak oyuncuların kendi başlarına seçmelerine izin verir. Varsayılan: Zorlama @@ -215,9 +215,9 @@ Névcímkék mutatása MI-egységeknél Mostra i nomi delle le unità AI Mostrar nomes para unidades de IA - AI ユニットの名札を表示 + AIユニットの名札を表示 인공지능 인원 이름 표시 - 显示AI单位名字 + 显示 AI 单位名字 顯示AI單位名稱 AI birimleri için ad etiketlerini göster @@ -230,11 +230,11 @@ 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的名字和军阶? 预设: 不显示 + 显示友军 AI 的名字和军阶? 预设:不显示 顯示友軍AI的名稱和軍階? 預設: 不顯示 Dost AI birimleri için ad ve rütbe etiketleri gösterilsin mi? Varsayılan: Zorlama @@ -262,12 +262,12 @@ 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 車長の名札をカーソルを当てて表示します (クライアント側で名札を有効化する必要があります) 標準: 無効 - 차량의 사령관의 이름표를 표시합니다 (오직 클라이언트가 이름표를 활성화 할시에만 보입니다) 기본설정: 아니요 - 使载具指挥官能透过准心指到别的单位来显示其名字 (仅当客户端的名字功能已启用)。预设: 关闭 + 차장의 이름표를 표시합니다 (오직 클라이언트가 이름표를 활성화할 시에만 보입니다) 기본설정: 아니요 + 使载具指挥官能透过准心指到别的单位来显示其名字(仅当客户端的名字功能已启用)。预设:关闭 使載具指揮官能透過準心指到別的單位來顯示其名稱 (僅當客戶端的名稱功能已啟用)。預設: 關閉 Araç komutanı için Gösterge İsim Etiketini göster (yalnızca istemcide ad etiketleri etkinse) Varsayılan: Hayır @@ -284,7 +284,7 @@ Mostrar onda sonora (requer nome de jogadores) 音波形を表示 (プレイヤ名が必要) 음파 표시 (플레이어 이름 필요) - 当玩家讲话时,显示声波图案 (玩家必须有设定名字) + 当玩家讲话时,显示声波图案(玩家必须有设定名字) 當玩家講話時,顯示聲波圖案 (玩家必須有設定名稱) Ses Dalgalarını Göster (oyuncu isimleri gerektirir) @@ -297,11 +297,11 @@ 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. + Эффект звуковой волны над головами говорящих игроков при удерживании кнопки 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가 있을 때만 적용됩니다. + 当玩家使用按键发话时,其头上的角色名字旁会显示声波的图案。此功能可搭配 TFAR、ACRE2 等模组使用。 當玩家使用按鍵發話時,其頭上的角色名稱旁會顯示聲波的圖案。此功能可搭配TFAR、ACRE2等模組使用。 Bas Konuş tuşunu basılı tuttuktan sonra ses dalgalarının konuşan oyuncuların başlarının üzerindeki etkisi. Bu seçenek TFAR ve ACRE2 ile çalışır. @@ -318,7 +318,7 @@ Usa impostazioni Etichette Nomi 名札の設定 이름표 설정 사용 - 玩家名字设定 + 玩家名称设定 玩家名稱設定 İsim etiketi ayarlarını kullan @@ -352,7 +352,7 @@ Distanza Visiva Etichette Nomi プレイヤ名が見える範囲 플레이어 이름 표시 거리 - 玩家名字显示距离 + 玩家名称显示距离 玩家名稱顯示距離 Oyuncu Adlarını Görüntüleme Mes. @@ -365,11 +365,11 @@ Distância em metros que os nomes dos jogadores são mostrados. Padrão: 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 + Дистанция в метрах, на которой отображаются имена игроков. По умолчанию: 5 Distanza in metri a cui sono visibili i nomi giocatori. Default: 5 プレイヤの周り何メートルまで名札を表示できます。標準: 5 플레이어 이름이 표시되는 미터. 기본설정: 5 - 设定名字在多少距离以内显示。预设:5公尺 + 设定名字在多少距离以内显示。预设:5米 設定名稱在多少距離以內顯示。預設:5公尺 Oyuncu adlarının gösterildiği metre cinsinden mesafe. Varsayılan: 5 @@ -377,7 +377,7 @@ Player tags transparency Spielernamen Transparenz プレイヤー名札の透明度 - 玩家名字标签透明度 + 玩家名称标签透明度 玩家名稱透明度 Trasparenza Etichette Nome Przezroczystość etykiet gracza @@ -387,6 +387,7 @@ Průhlednost jmenovek Transparencia de etiquetas de jugadores Oyuncu etiketlerinde şeffaflık + 플레이어 이름 투명도 Nametags Size @@ -401,7 +402,7 @@ Dimensione Etichette Nome 名札の大きさ 이름표 크기 - 玩家名字标记大小 + 玩家名称标记大小 玩家名稱標記大小 Isim Etiketi Büyüklüğü @@ -433,9 +434,9 @@ 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) - 標準の名札の色(グループ メンバ以外) - 기본 이름표 색상 (비-그룹 멤버) - 预设名字颜色 (非同小队队友) + 標準の名札の色 (グループメンバー以外) + 기본 이름표 색상 (비그룹 멤버) + 预设名字颜色(非同小队队友) 預設名稱顏色 (非同小隊隊友) Varsayılan İsim Etiketi Rengi (Grup Üyeleri Olmayanlar) @@ -502,7 +503,7 @@ Обязательно: Только по нажатию клавиши Forza Mostra solo quando Premi Tasto キー押下のみに強制する - 키를 누를경우만 강제로 해당 + 키를 누를 경우만 강제로 해당 强制仅显示在按按键时 強制僅顯示在按按鍵時 Gösteriyi Yalnızca Tuşa Basıldığında Zorla @@ -519,20 +520,32 @@ Обязательно: Под курсором или по нажатию клавиши Forza Mostra solo su Cursore e quando Premi Tasto カーソルとキー押下のみに強制する - 커서와 키를 누를경우만 강제로 해당 + 커서와 키를 누를 경우만 강제로 해당 强制显示在准心指到和按按键时 強制顯示在準心指到和按按鍵時 Göstermeyi Yalnızca İmleç ve Tuşa Basmaya Zorla Nametag Ambient Brightness Coefficient - Коэффициент окружающего освещения для меток игроков + Коэф. освещения для меток игроков 環境名札明るさ係数 + Coefficient de luminosité ambiante + Spielernamen Umgebungshelligkeitskoeffizient + Współczynnik jasności otoczenia + 铭牌的环境亮度系数 + 이름표 배경 밝기 계수 + Coeficiente de brillo ambiental de Etiquetas de nombre Adjusts how strongly ambient brightness affects nametag view distance. Определяет как сильно окружающее освещение влияет на дальность отображения меток игроков. 環境光の強さによって名札の描画距離を調整します。 + Définit à quel point le manque de lumière ambiante abaisse la distance de visibilité du nom des joueurs. + Stellt ein, wie stark sich die Umgebungshelligkeit auf die Sichtweite der Spielernamen auswirkt. + Definiuje jak bardzo jasność otoczenia wpływa na zasięg wyświetlania imion postaci. + 调整环境亮度对铭牌查看距离的影响程度。 + 배경 밝기가 이름표를 보는 거리에 얼마나 영향을 끼치는 지를 조절합니다. + Ajusta cómo de fuerte afecta el brillo ambiental a la distancia de visión de las Etiquetas de nombre diff --git a/addons/nightvision/ACE_Arsenal_Stats.hpp b/addons/nightvision/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..0b42d136f6 --- /dev/null +++ b/addons/nightvision/ACE_Arsenal_Stats.hpp @@ -0,0 +1,12 @@ +class EGVAR(arsenal,stats) { + class statBase; + class GVAR(generation): statBase { + scope = 2; + priority = 1.6; + condition = QUOTE('nvg' in (getArray ((_this select 1) >> 'visionMode') apply {toLower _x})); + displayName = CSTRING(NVGeneration); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_NVGeneration)); + tabs[] = {{8}, {}}; + }; +}; diff --git a/addons/nightvision/CfgWeapons.hpp b/addons/nightvision/CfgWeapons.hpp index 52c3d32d18..3c9a98ad53 100644 --- a/addons/nightvision/CfgWeapons.hpp +++ b/addons/nightvision/CfgWeapons.hpp @@ -5,26 +5,48 @@ class CfgWeapons { modelOptics = ""; GVAR(border) = QPATHTOF(data\nvg_mask_binos_4096.paa); GVAR(bluRadius) = 0.15; + NVG_GREEN_PRESET; + }; + class ACE_NVGoggles_WP: NVGoggles { + displayName = CSTRING(NVG_Gen3_brown_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; }; class O_NVGoggles_hex_F: NVGoggles { // APEX NVG with multiple lenses (spider eyes) modelOptics = ""; GVAR(border) = QPATHTOF(data\nvg_mask_quad_4096.paa); // Use quad tube mask GVAR(bluRadius) = 0.26; + GVAR(generation) = 4; }; class NVGogglesB_grn_F: NVGoggles { // APEX NVG/Thermal modelOptics = "\A3\weapons_f_exp\reticle\ENVG.p3d"; // use vanilla modelOptics so it will show in IR mode + GVAR(generation) = 4; + }; + class NVGogglesB_blk_F: NVGoggles { + GVAR(generation) = 4; }; class NVGogglesB_gry_F: NVGoggles { modelOptics = "\A3\weapons_f_exp\reticle\ENVG.p3d"; + GVAR(generation) = 4; }; class NVGoggles_OPFOR: NVGoggles { modelOptics = ""; displayName = CSTRING(NVG_Gen3_black); }; + class ACE_NVGoggles_OPFOR_WP: NVGoggles_OPFOR { + displayName = CSTRING(NVG_Gen3_black_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class NVGoggles_INDEP: NVGoggles { modelOptics = ""; displayName = CSTRING(NVG_Gen3_green); }; + class ACE_NVGoggles_INDEP_WP: NVGoggles_INDEP { + displayName = CSTRING(NVG_Gen3_green_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Gen1: NVGoggles_OPFOR { author = ECSTRING(common,ACETeam); displayName = CSTRING(NVG_Gen1_black); @@ -60,30 +82,63 @@ class CfgWeapons { displayName = CSTRING(NVG_Gen4_black); GVAR(generation) = 4; }; + class ACE_NVG_Gen4_Black_WP: ACE_NVG_Gen4_Black { + displayName = CSTRING(NVG_Gen4_black_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Gen4: NVGoggles { author = ECSTRING(common,ACETeam); displayName = CSTRING(NVG_Gen4_brown); GVAR(generation) = 4; }; + class ACE_NVG_Gen4_WP: ACE_NVG_Gen4 { + displayName = CSTRING(NVG_Gen4_brown_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Gen4_Green: NVGoggles_INDEP { author = ECSTRING(common,ACETeam); displayName = CSTRING(NVG_Gen4_green); GVAR(generation) = 4; }; + class ACE_NVG_Gen4_Green_WP: ACE_NVG_Gen4_Green { + displayName = CSTRING(NVG_Gen4_green_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Wide_Black: NVGoggles_OPFOR { author = ECSTRING(common,ACETeam); modelOptics = QPATHTOF(models\ACE_nvg_wide_optics); displayName = CSTRING(NVG_Wide_black); + GVAR(generation) = 4; + }; + class ACE_NVG_Wide_Black_WP: ACE_NVG_Wide_Black { + displayName = CSTRING(NVG_Wide_black_wP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; }; class ACE_NVG_Wide: NVGoggles { author = ECSTRING(common,ACETeam); modelOptics = QPATHTOF(models\ACE_nvg_wide_optics); displayName = CSTRING(NVG_Wide_brown); + GVAR(generation) = 4; + }; + class ACE_NVG_Wide_WP: ACE_NVG_Wide { + displayName = CSTRING(NVG_Wide_brown_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; }; class ACE_NVG_Wide_Green: NVGoggles_INDEP { author = ECSTRING(common,ACETeam); modelOptics = QPATHTOF(models\ACE_nvg_wide_optics); displayName = CSTRING(NVG_Wide_green); + GVAR(generation) = 4; + }; + class ACE_NVG_Wide_Green_WP: ACE_NVG_Wide_Green { + displayName = CSTRING(NVG_Wide_green_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; }; diff --git a/addons/nightvision/RscTitles.hpp b/addons/nightvision/RscTitles.hpp index 98c2b11cb3..1a4d030e01 100644 --- a/addons/nightvision/RscTitles.hpp +++ b/addons/nightvision/RscTitles.hpp @@ -22,7 +22,7 @@ class RscTitles { class Mask: RscPicture { idc = 1001; }; - + // Add blinders for side monitors for tripple monitors (mask won't cover them) class trippleHeadLeft: RscPicture { idc = 1002; diff --git a/addons/nightvision/XEH_PREP.hpp b/addons/nightvision/XEH_PREP.hpp index 75f9d4613d..abc60b9cc7 100644 --- a/addons/nightvision/XEH_PREP.hpp +++ b/addons/nightvision/XEH_PREP.hpp @@ -11,3 +11,4 @@ PREP(refreshGoggleType); PREP(scaleCtrl); PREP(scotopicEffects); PREP(setupDisplayEffects); +PREP(statTextStatement_NVGeneration); diff --git a/addons/nightvision/XEH_postInit.sqf b/addons/nightvision/XEH_postInit.sqf index 6ad7f5990b..721512c845 100644 --- a/addons/nightvision/XEH_postInit.sqf +++ b/addons/nightvision/XEH_postInit.sqf @@ -33,6 +33,7 @@ GVAR(isUsingMagnification) = false; ["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_controlledUAV", LINKFUNC(refreshGoggleType)] call CBA_fnc_addEventHandler; // handle only brightness if effects are disabled GVAR(ppEffectNVGBrightness) = ppEffectCreate ["ColorCorrections", 1236]; diff --git a/addons/nightvision/config.cpp b/addons/nightvision/config.cpp index f416af9d38..9028e6951e 100644 --- a/addons/nightvision/config.cpp +++ b/addons/nightvision/config.cpp @@ -13,8 +13,11 @@ class CfgPatches { "ACE_NVG_Gen2", /*"ACE_NVG_Gen3",*/ "ACE_NVG_Gen4_Black", + "ACE_NVG_Gen4_Black_WP", "ACE_NVG_Gen4", + "ACE_NVG_Gen4_WP", "ACE_NVG_Gen4_Green", + "ACE_NVG_Gen4_Green_WP", "ACE_NVG_Wide_Black", "ACE_NVG_Wide", "ACE_NVG_Wide_Green" @@ -34,3 +37,4 @@ class CfgPatches { #include "CfgWeapons.hpp" #include "ACE_Settings.hpp" #include "RscTitles.hpp" +#include "ACE_Arsenal_Stats.hpp" diff --git a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf index ffbdc45dea..1697fa907e 100644 --- a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf +++ b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Change the brightness of the unit's NVG. diff --git a/addons/nightvision/functions/fnc_initModule.sqf b/addons/nightvision/functions/fnc_initModule.sqf index 4118360ccc..5c5ad01943 100644 --- a/addons/nightvision/functions/fnc_initModule.sqf +++ b/addons/nightvision/functions/fnc_initModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Initializes the settings for the disable NVGs in sight module. diff --git a/addons/nightvision/functions/fnc_nonDedicatedFix.sqf b/addons/nightvision/functions/fnc_nonDedicatedFix.sqf index 578099846d..63f8919eaf 100644 --- a/addons/nightvision/functions/fnc_nonDedicatedFix.sqf +++ b/addons/nightvision/functions/fnc_nonDedicatedFix.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the client who is the non-dedicated server turning on the fog effects. diff --git a/addons/nightvision/functions/fnc_onCameraViewChanged.sqf b/addons/nightvision/functions/fnc_onCameraViewChanged.sqf index fc4c85a507..2cbec4d16e 100644 --- a/addons/nightvision/functions/fnc_onCameraViewChanged.sqf +++ b/addons/nightvision/functions/fnc_onCameraViewChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut * Disables/re-enables NVGs when the player starts/stops aiming down his sight. diff --git a/addons/nightvision/functions/fnc_onFiredPlayer.sqf b/addons/nightvision/functions/fnc_onFiredPlayer.sqf index 12bca77392..0be73062d2 100644 --- a/addons/nightvision/functions/fnc_onFiredPlayer.sqf +++ b/addons/nightvision/functions/fnc_onFiredPlayer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2, Dslyecxi, PabstMirror * Change the blending when the player fires. Called from the unified fired EH only for the local player and his vehicle. diff --git a/addons/nightvision/functions/fnc_onLoadoutChanged.sqf b/addons/nightvision/functions/fnc_onLoadoutChanged.sqf index 75a1a1ca8a..ff4baadd4b 100644 --- a/addons/nightvision/functions/fnc_onLoadoutChanged.sqf +++ b/addons/nightvision/functions/fnc_onLoadoutChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, PabstMirror * Refreshes nvg effect if switching NVG goggles. diff --git a/addons/nightvision/functions/fnc_onVisionModeChanged.sqf b/addons/nightvision/functions/fnc_onVisionModeChanged.sqf index ecd87f59d1..1913454f3f 100644 --- a/addons/nightvision/functions/fnc_onVisionModeChanged.sqf +++ b/addons/nightvision/functions/fnc_onVisionModeChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, Dslyecxi, PabstMirror * Disables turning on NVGs while the player aims down his sight. diff --git a/addons/nightvision/functions/fnc_pfeh.sqf b/addons/nightvision/functions/fnc_pfeh.sqf index 794fe9b555..3300a7ae28 100644 --- a/addons/nightvision/functions/fnc_pfeh.sqf +++ b/addons/nightvision/functions/fnc_pfeh.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, PabstMirror * PFEH to handle refreshing effects. @@ -140,7 +140,7 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then { // ColorCorrections - Changes brightness, contrast and "green" color of nvg // Params: [brightness(0..2), contrast(0..inf), offset(-x..+x), blendArray, colorizeArray, weightArray] GVAR(ppeffectColorCorrect) = ppEffectCreate ["ColorCorrections", 2003]; - GVAR(ppeffectColorCorrect) ppEffectAdjust [_brightFinal, _contrastFinal, 0, [0.0, 0.0, 0.0, 0.0], [1.3, 1.2, 0.0, 0.9], [6, 1, 1, 0.0]]; + GVAR(ppeffectColorCorrect) ppEffectAdjust [_brightFinal, _contrastFinal, GVAR(nvgOffset), GVAR(nvgBlend), GVAR(nvgColorize), GVAR(nvgWeight)]; GVAR(ppeffectColorCorrect) ppEffectCommit 0; GVAR(ppeffectColorCorrect) ppEffectForceInNVG true; GVAR(ppeffectColorCorrect) ppEffectEnable true; diff --git a/addons/nightvision/functions/fnc_refreshGoggleType.sqf b/addons/nightvision/functions/fnc_refreshGoggleType.sqf index 6bb9e35fdb..a03039d221 100644 --- a/addons/nightvision/functions/fnc_refreshGoggleType.sqf +++ b/addons/nightvision/functions/fnc_refreshGoggleType.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, PabstMirror * Determines night vision source (player/vehicle) - Updates UI based on type. @@ -26,7 +26,9 @@ private _hideHex = true; private _nvgGen = 3; private _blurRadius = -1; -if (alive ACE_player) then { +// Adds Array of Params / Original ACE3's (ST's) by default. (NVG_GREEN_PRESET) +private _preset = getArray (configFile >> "CfgWeapons" >> "NVGoggles" >> "colorPreset"); +if ((alive ACE_player) && {isNull (ACE_controlledUAV select 0)}) then { if (((vehicle ACE_player) == ACE_player) || { // Test if we are using player's nvg or if sourced from vehicle: @@ -61,6 +63,7 @@ if (alive ACE_player) then { TRACE_1("souce: binocular",binocular ACE_player); // Source is from player's binocular (Rangefinder/Vector21bNite) private _config = configFile >> "CfgWeapons" >> (binocular ACE_player); if (isNumber (_config >> QGVAR(generation))) then {_nvgGen = getNumber (_config >> QGVAR(generation));}; + if (isArray (_config >> "colorPreset")) then {_preset = getArray (_config >> "colorPreset");}; }; TRACE_1("source: hmd",GVAR(playerHMD)); // Source is player's HMD (or possibly a NVG scope, but no good way to detect that) @@ -75,7 +78,7 @@ if (alive ACE_player) then { if (isNumber (_config >> QGVAR(bluRadius))) then {_blurRadius = getNumber (_config >> QGVAR(bluRadius));}; }; if (isNumber (_config >> QGVAR(generation))) then {_nvgGen = getNumber (_config >> QGVAR(generation));}; - + if (isArray (_config >> "colorPreset")) then {_preset = getArray (_config >> "colorPreset");}; } else { TRACE_1("source: vehicle - defaults",typeOf vehicle ACE_player); }; @@ -86,9 +89,18 @@ systemChat format ["NVG Refresh - Border: %1", _borderImage]; systemChat format ["EyeCups: %1, HideHex %2, NVGen: %3, BluRadius: %4", _eyeCups, _hideHex, _nvgGen, _blurRadius]; #endif +// Selection cancelled, params added +_preset params ["_offset", "_blend", "_colorize", "_weight"]; + GVAR(nvgBlurRadius) = _blurRadius; GVAR(nvgGeneration) = _nvgGen; +// Additional Global variables for Params transfer & supporting +GVAR(nvgOffset) = _offset; +GVAR(nvgBlend) = _blend; +GVAR(nvgColorize) = _colorize; +GVAR(nvgWeight) = _weight; + // Setup border and hex image based on NVG config: private _scale = (call EFUNC(common,getZoom)) * 1.12513; diff --git a/addons/nightvision/functions/fnc_scaleCtrl.sqf b/addons/nightvision/functions/fnc_scaleCtrl.sqf index e01a798580..97ea69dde5 100644 --- a/addons/nightvision/functions/fnc_scaleCtrl.sqf +++ b/addons/nightvision/functions/fnc_scaleCtrl.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, PabstMirror * Determines night vision source (player/vehicle) - Updates UI based on type. diff --git a/addons/nightvision/functions/fnc_setupDisplayEffects.sqf b/addons/nightvision/functions/fnc_setupDisplayEffects.sqf index 9137419202..5e30fa21ce 100644 --- a/addons/nightvision/functions/fnc_setupDisplayEffects.sqf +++ b/addons/nightvision/functions/fnc_setupDisplayEffects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dslyecxi, PabstMirror * Handles setting up the effects: fog, ppEffects and the RscTittle. diff --git a/addons/nightvision/functions/fnc_statTextStatement_NVGeneration.sqf b/addons/nightvision/functions/fnc_statTextStatement_NVGeneration.sqf new file mode 100644 index 0000000000..08baf28998 --- /dev/null +++ b/addons/nightvision/functions/fnc_statTextStatement_NVGeneration.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Text statement for the NV Generation stat. + * + * Arguments: + * 0: Not used + * 1: Item config path + * + * Return Value: + * Stat Text + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_nvGeneration",_config); + +private _gen = 3; // Default +if (isNumber (_config >> QGVAR(generation))) then { + _gen = getNumber (_config >> QGVAR(generation)); +}; + +format [localize LSTRING(statGen), _gen]; diff --git a/addons/nightvision/functions/script_component.hpp b/addons/nightvision/functions/script_component.hpp deleted file mode 100644 index d79af487d7..0000000000 --- a/addons/nightvision/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\nightvision\script_component.hpp" \ No newline at end of file diff --git a/addons/nightvision/initSettings.sqf b/addons/nightvision/initSettings.sqf index 994e0f2fef..c6caeb2a22 100644 --- a/addons/nightvision/initSettings.sqf +++ b/addons/nightvision/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_nightVision]: - [ QGVAR(effectScaling), "SLIDER", [LSTRING(effectScaling_DisplayName), LSTRING(effectScaling_Description)], diff --git a/addons/nightvision/script_component.hpp b/addons/nightvision/script_component.hpp index 7f80b1b4fa..2bf48a8d05 100644 --- a/addons/nightvision/script_component.hpp +++ b/addons/nightvision/script_component.hpp @@ -19,6 +19,9 @@ // Effect Settings / Magic values to tweak: +#define NVG_GREEN_PRESET colorPreset[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0.0}} +#define NVG_WHITE_PRESET colorPreset[] = {0.0, {0.0, 0.0, 0.0, 0.0}, {1.1, 0.8, 1.9, 0.9}, {1, 1, 6, 0.0}} + // Decreases fog when in air vehicles #define ST_NVG_AIR_FOG_MULTIPLIER 0.5 diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index b54b00d7e7..c7d9e6e913 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -7,7 +7,7 @@ ACE Visione notturna ACE-Nachtsicht ACE夜視鏡 - ACE夜视镜 + ACE 夜视仪 ACE Vision Nocturne ACE Noktowizja ACE ПНВ @@ -15,6 +15,7 @@ ACE Noční vidění ACE Gece Görüşü ACE visión nocturna + ACE 야간투시 NV Goggles (Gen1, Brown) @@ -22,6 +23,10 @@ ПНВ (Gen1, Коричневый) 暗視装置 (第1世代、ブラウン) Gogle noktowizyjne (Gen 1, Brązowe) + NS-Brille (1. Gen., braun) + 夜视仪(一代,棕色) + 아투경 (1세대, 갈색) + Gafas de visión nocturna (Gen1, Marrón) NV Goggles (Gen1, Black) @@ -29,6 +34,10 @@ ПНВ (Gen1, Чёрный) 暗視装置 (第1世代、ブラック) Gogle noktowizyjne (Gen 1, Czarne) + NS-Brille (1. Gen., schwarz) + 夜视仪(一代,黑色) + 아투경 (1세대, 검정색) + Gafas de visión nocturna (Gen1, Negro) NV Goggles (Gen1, Green) @@ -36,6 +45,10 @@ ПНВ (Gen1, Зелёный) 暗視装置 (第1世代、グリーン) Gogle noktowizyjne (Gen 1, Zielone) + NS-Brille (1. Gen., grün) + 夜视仪(一代,绿色) + 아투경 (1세대, 녹색) + Gafas de visión nocturna (Gen1, Verde) NV Goggles (Gen2, Brown) @@ -43,6 +56,10 @@ ПНВ (Gen2, Коричневый) 暗視装置 (第2世代、ブラウン) Gogle noktowizyjne (Gen 2, Brązowe) + NS-Brille (2. Gen., braun) + 夜视仪(二代,棕色) + 아투경 (2세대, 갈색) + Gafas de visión nocturna (Gen2, Marrón) NV Goggles (Gen2, Black) @@ -50,6 +67,10 @@ ПНВ (Gen2, Чёрный) 暗視装置 (第2世代、ブラック) Gogle noktowizyjne (Gen 2, Czarne) + NS-Brille (2. Gen., schwarz) + 夜视仪(二代,黑色) + 아투경 (2세대, 검정색) + Gafas de visión nocturna (Gen2, Negro) NV Goggles (Gen2, Green) @@ -57,6 +78,10 @@ ПНВ (Gen2, Зелёный) 暗視装置 (第2世代、グリーン) Gogle noktowizyjne (Gen 2, Zielone) + NS-Brille (2. Gen., grün) + 夜视仪(二代,绿色) + 아투경 (2세대, 녹색) + Gafas de visión nocturna (Gen2, Verde) NV Goggles (Gen3) @@ -71,7 +96,7 @@ Éjjellátó szemüveg (3. Gen.) 暗視装置 (第3世代) 야투경 (3세대) - 夜视镜 (三代) + 夜视仪(三代) 夜視鏡 (三代) GG Gözlüğü (3. Jen) @@ -81,57 +106,91 @@ JVN (Gen3, marron) NS-Brille (3. Gen., braun) Occhiali notturni (Gen3, Marroni) - Gogle noktowizyjne (Gen3, brązowe) + Gogle noktowizyjne (Gen3, Brązowe) Óculos de visão noturna (Gen3, marrons) ПНВ (Gen3, Коричневый) - Gafas de visión nocturna (Gen3, marrón) + Gafas de visión nocturna (Gen3, Marrón) Éjjellátó szemüveg (3. Gen., barna) 暗視装置 (第3世代、ブラウン) 야투경 (3세대, 갈색) - 夜视镜 (三代, 棕色) + 夜视仪(三代,棕色) 夜視鏡 (三代, 棕色) GG Gözlüğü (3. Jen Kahverengi) + + NV Goggles (Gen3, Brown, WP) + 暗視装置 (第3世代、ブラウン) + Gogle noktowizyjne (Gen3, Brązowe, WP) + NS-Brille (3. Generation, Braun, WP) + + + Night Vision Goggles, White Phosphor + 暗視装置、白色蛍光体 + Gogle noktowizyjne, Biały Fosfor + Nachtsichtbrille, weißer Phosphor + NV Goggles (Gen3, Green) Noktovizor (Gen3, zelený) JVN (Gen3, vertes) NS-Brille (3. Gen., grün) Occhiali notturni (Gen3, Verdi) - Gogle noktowizyjne (Gen3, zielone) + Gogle noktowizyjne (Gen3, Zielone) Óculos de visão noturna (Gen3, verdes) ПНВ (Gen3, Зелёный) - Gafas de visión nocturna (Gen3, verde) + Gafas de visión nocturna (Gen3, Verde) Éjjellátó szemüveg (3. Gen., zöld) 暗視装置 (第3世代、グリーン) 야투경 (3세대, 녹색) - 夜视镜 (三代, 绿色) + 夜视仪(三代,绿色) 夜視鏡 (三代, 綠色) GG Gözlüğü (3. Jen Yeşil) + + NV Goggles (Gen3, Green, WP) + 暗視装置 (第3世代、グリーン、白色蛍光) + Gogle noktowizyjne (Gen3, Zielone, WP) + NS-Brille (3. Generation, Grün, WP) + NV Goggles (Gen3, Black) Noktovizor (Gen3, černý) JVN (Gen3, noires) NS-Brille (3. Gen., schwarz) Occhiali notturni (Gen3, Neri) - Gogle noktowizyjne (Gen3, czarne) + Gogle noktowizyjne (Gen3, Czarne) Óculos de visão noturna (Gen3, pretos) ПНВ (Gen3, Чёрный) - Gafas de visión nocturna (Gen3, negro) + Gafas de visión nocturna (Gen3, Negro) Éjjellátó szemüveg (3. Gen., fekete) 暗視装置 (第3世代、ブラック) 야투경 (3세대, 검정색) - 夜视镜 (三代, 黑色) + 夜视仪(三代,黑色) 夜視鏡 (三代, 黑色) GG Gözlüğü (3. Jen Siyah) + + NV Goggles (Gen3, Black, WP) + 暗視装置 (第3世代、ブラック、白色蛍光) + Gogle noktowizyjne (Gen3, Czarne, WP) + NS-Brille (3. Generation, Schwarz, WP) + NV Goggles (Gen4, Brown) JVN (Gen4, marron) ПНВ (Gen4, Коричневый) 暗視装置 (第4世代、ブラウン) Gogle noktowizyjne (Gen 4, Brązowe) + NS-Brille (4. Gen., braun) + 夜视仪(四代,棕色) + 야투경 (4세대, 갈색) + Gafas de visión nocturna (Gen4, Marrón) + + + NV Goggles (Gen4, Brown, WP) + 暗視装置 (第4世代、ブラウン、白色蛍光) + Gogle noktowizyjne (Gen 4, Brązowe, WP) + NS-Brille (4. Generation, Braun, WP) NV Goggles (Gen4, Black) @@ -139,6 +198,16 @@ ПНВ (Gen4, Чёрный) 暗視装置 (第3世代、ブラック) Gogle noktowizyjne (Gen 4, Czarne) + NS-Brille (4. Gen., schwarz) + 夜视仪(四代,黑色) + 야투경 (4세대, 검정색) + Gafas de visión nocturna (Gen4, Negro) + + + NV Goggles (Gen4, Black, WP) + 暗視装置 (第3世代、ブラック、白色蛍光) + Gogle noktowizyjne (Gen 4, Czarne, WP) + NS-Brille (4. Generation, Schwarz, WP) NV Goggles (Gen4, Green) @@ -146,6 +215,16 @@ ПНВ (Gen4, Зелёный) 暗視装置 (第3世代、グリーン) Gogle noktowizyjne (Gen 4, Zielone) + NS-Brille (4. Gen., grün) + 夜视仪(四代,绿色) + 야투경 (4세대, 녹색) + Gafas de visión nocturna (Gen4, Verde) + + + NV Goggles (Gen4, Green, WP) + 暗視装置 (第3世代、グリーン、白色蛍光) + Gogle noktowizyjne (Gen 4, Zielone, WP) + NS-Brille (4. Generation, Grün, WP) NV Goggles (Wide, Brown) @@ -153,6 +232,16 @@ ПНВ (Широкий, Коричневый) 暗視装置 (ワイド、ブラウン) Gogle noktowizyjne (Szerokie, Brązowe) + NS-Brille (Weit, braun) + 夜视仪(宽,棕色) + 야투경 (넓음, 갈색) + Gafas de visión nocturna (Panorámicas, Marrón) + + + NV Goggles (Wide, Brown, WP) + 暗視装置 (ワイド、ブラウン、白色蛍光) + Gogle noktowizyjne (Szerokie, Brązowe, WP) + NS-Brille (Weit, Braun, WP) NV Goggles (Wide, Black) @@ -160,6 +249,16 @@ ПНВ (Широкий, Чёрный) 暗視装置 (ワイド、ブラック) Gogle noktowizyjne (Szerokie, Czarne) + NS-Brille (Weit, schwarz) + 夜视仪(宽,黑色) + 야투경 (넓음, 검정색) + Gafas de visión nocturna (Panorámicas, Negro) + + + NV Goggles (Wide, Black, WP) + 暗視装置 (ワイド、ブラック、白色蛍光) + Gogle noktowizyjne (Szerokie, Czarne, WP) + NS-Brille (Weit, Schwarz, WP) NV Goggles (Wide, Green) @@ -167,6 +266,16 @@ ПНВ (Широкий, Зелёный) 暗視装置 (ワイド、グリーン) Gogle noktowizyjne (Szerokie, Zielone) + NS-Brille (Weit, grün) + 夜视仪(宽,绿色) + 야투경 (넓음, 녹색) + Gafas de visión nocturna (Panorámicas, Verde) + + + NV Goggles (Wide, Green, WP) + 暗視装置 (ワイド、グリーン、白色蛍光) + Gogle noktowizyjne (Szerokie, Zielone, WP) + NS-Brille (Weit, Grün, WP) Brightness: %1 @@ -181,7 +290,7 @@ Luminosità: %1 明度: %1 밝기: %1 - 亮度: %1 + 亮度:%1 亮度: %1 Parlaklık: %1 @@ -198,7 +307,7 @@ Aumenta la luminosità dell'NVG 暗視装置の明度を上げる 야투경 밝기 높이기 - 增加夜视镜亮度 + 增加夜视仪亮度 增加夜視鏡亮度 Gece Görüşü Parlaklığını Arttır @@ -215,7 +324,7 @@ Riduci la luminosità dell'NVG 暗視装置の明度を下げる 야투경 밝기 줄이기 - 减少夜视镜亮度 + 减少夜视仪亮度 減少夜視鏡亮度 Gece Görüşü Parlaklığını Düşür @@ -231,7 +340,7 @@ Vision nocturne 暗視装置 야간투시경 - 夜视 + 夜视仪 夜視 Gece Görüşü @@ -247,7 +356,7 @@ Réglages pour la vision nocturne. 暗視装置の設定をします。 야간투시경 설정 - 设定夜视选项. + 设置夜视仪选项。 設定夜視選項 Gece görüşü ayarı. @@ -262,8 +371,8 @@ Desactivar NVG en miras Désactiver les JVN dans les viseurs スコープでは暗視装置を無効化 - 조준경 사용시 야투경 비활성화 - 使用瞄准镜时关闭夜视镜 + 조준경 사용 시 야투경 비활성화 + 使用瞄准镜时关闭夜视仪 使用瞄準鏡時關閉夜視鏡 Gece görüşünü dürbünde kapat. @@ -278,8 +387,8 @@ Desactiva el uso de gafas visión nocturna cuando se utilizan miras normales. Bloque l'usage des JVN pendant la visée. スコープで狙いを付けると、暗視装置を無効化します。 - 조준시 야투경의 사용을 제한합니다. - 此功能开启后,当要使用瞄准镜时,为避免夜视镜镜头碰撞到瞄准镜,会先拿开夜视镜后再进行瞄准镜瞄准。 + 조준 시 야투경의 사용을 제한합니다. + 此功能开启后,当要使用瞄准镜时,为避免夜视仪镜头碰撞到瞄准镜,会先拿开夜视仪后再进行瞄准镜瞄准。 此功能開啟後,當要使用瞄準鏡時,為避免夜視鏡鏡頭碰撞到瞄準鏡,會先拿開夜視鏡後再進行瞄準鏡瞄準 @@ -288,13 +397,14 @@ Livello Nebbia NVG Nebel in Nachtsicht 夜視鏡霧氣程度 - 夜视镜雾气程度 + 夜视仪雾气程度 É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. @@ -302,13 +412,14 @@ La nebbia viene utilizzata per limitare la visibilità. Nebel wird genutzt, um die Sichtbarkeit einzuschränken. 透過霧氣來縮減夜視鏡的可視距離 - 透过雾气来缩减夜视镜的可视距离。 + 透过雾气来缩减夜视仪的可视距离。 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 @@ -316,13 +427,14 @@ Effetto livello NVG Nachtsichteffekte 夜視鏡效果程度 - 夜视镜效果程度 + 夜视仪效果程度 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] @@ -330,17 +442,18 @@ Effetti di sfocatura e luminosità [Importare a 0 disabiliterà TUTTI gli effetti della visione notturna] Unschärfe und Helligkeitseffekte [Dies auf 0 zu setzen deaktiviert SÄMTLICHE Nachtsichteffekte] 調整模糊與亮度的效果。[設值為0會關閉所有夜視鏡的特殊效果] - 调整模糊与亮度的效果。[设值为0会关闭所有夜视镜的特殊效果] + 调整模糊与亮度的效果。[设值为0会关闭所有夜视仪的特殊效果] 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] + 흐림과 밝기 효과 [0으로 설정하면 효과를 제거합니다] Aim Down Sights Blur - 照準器を覗く時にぼかし + 照準時のぼかし効果 Visierunschärfe 瞄準具模糊程度 瞄准具模糊程度 @@ -351,12 +464,13 @@ Borrão ao mirar Rozostření při použití mířidel Emborronado al mirar + 조준 시 조준경 흐림 NVG Noise Scale Intensität des Bildrauschens 夜視鏡雜訊程度 - 夜视镜杂讯程度 + 夜视仪噪声强度 暗視装置のノイズ度 Intensité du bruit (JVN) Fattore di Disturbo del NVG @@ -365,12 +479,13 @@ Intensidade de Ruído/Efeito Granulado Míra šumu pro noktovizor Escala de ruido/granulado NVG + 야투경 노이즈 규모 Image noise intensity when wearing NVGs Intensität des Bildrauschens im Nachtsichtgerät 調整配戴夜視鏡時畫面雜訊的多寡。 - 调整配戴夜视镜时画面杂讯的多寡。 + 调整配戴夜视仪时画面噪声的强度。 暗視装置を使用時に起きる画像ノイズの強度です Intensité du bruit de l'image lorsque vous portez des JVN. Intensità del disturbo dell'immagine quando i NVG sono equipaggiati @@ -379,6 +494,7 @@ 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 @@ -393,6 +509,7 @@ Efeito de Obturador Efekt závěrky Efecto de obturador + 셔터효과 Rolling shutter effect from muzzle flashes @@ -407,6 +524,19 @@ 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 + 총구화염에 의한 셔터효과를 구현합니다 + + + Night Vision Generation + 暗視装置の世代 + Generacja gogli noktowizyjnych + Nachtsicht-Generation + + + Gen %1 + 第%1世代 + Gen %1 + Gen %1 diff --git a/addons/nlaw/functions/fnc_attackProfile.sqf b/addons/nlaw/functions/fnc_attackProfile.sqf index 21f77f0ff5..ad7622eadd 100644 --- a/addons/nlaw/functions/fnc_attackProfile.sqf +++ b/addons/nlaw/functions/fnc_attackProfile.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * NLAW missile guidance attack profile. diff --git a/addons/nlaw/functions/fnc_keyDown.sqf b/addons/nlaw/functions/fnc_keyDown.sqf index fcc320360c..60ac4bf3d8 100644 --- a/addons/nlaw/functions/fnc_keyDown.sqf +++ b/addons/nlaw/functions/fnc_keyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the track key being held down. @@ -65,7 +65,7 @@ playSound "ACE_Sound_Click"; _args set [3, false]; } else { // smoothing factor alpha - higher values will be more responsive to change, but also spike higher on jerky mouse movmeent - private _alpha = _deltaT / 3; + private _alpha = _deltaT / 3; GVAR(yawChange) = (_yawChange * _alpha) + GVAR(yawChange) * (1 - _alpha); GVAR(pitchChange) = (_pitchChange * _alpha) + GVAR(pitchChange) * (1 - _alpha); }; diff --git a/addons/nlaw/functions/fnc_onFired.sqf b/addons/nlaw/functions/fnc_onFired.sqf index 0552afcd86..11b38a1da0 100644 --- a/addons/nlaw/functions/fnc_onFired.sqf +++ b/addons/nlaw/functions/fnc_onFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Sets up missile guidance state arrays (called from missileGuidance's onFired). diff --git a/addons/nlaw/functions/fnc_seeker.sqf b/addons/nlaw/functions/fnc_seeker.sqf index af9b349cc2..e5de6d320c 100644 --- a/addons/nlaw/functions/fnc_seeker.sqf +++ b/addons/nlaw/functions/fnc_seeker.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the top down attack seeker for missile guidance. diff --git a/addons/nlaw/functions/script_component.hpp b/addons/nlaw/functions/script_component.hpp deleted file mode 100644 index 50d8cac4c1..0000000000 --- a/addons/nlaw/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\nlaw\script_component.hpp" diff --git a/addons/nlaw/stringtable.xml b/addons/nlaw/stringtable.xml index 6ac169dcc8..93bd236237 100644 --- a/addons/nlaw/stringtable.xml +++ b/addons/nlaw/stringtable.xml @@ -6,11 +6,11 @@ NLAW Zielverfolgung NLAW Traccia Bersaglio (Mantieni) NALW 目標の追跡 (押しっぱ) - 次世代轻型反坦克导弹发射器追踪目标 (按住) + NLAW 追踪目标(按住) 次世代輕型反坦克導彈發射器追蹤目標 (按住) Śledzenie Celu NLAW (Przytrzymaj) NLAW 목표 추적 (누름유지) - NLAW наведение на цель (Удерживать) + NLAW наведение на цель (удерживать) NLAW Rastrear Alvo (Segurar) NLAW suivre la cible (maintenir) NLAW sledování cíle (držet) @@ -25,7 +25,7 @@ 直射模式 直射模式 Bezpośredni atak - 직접 사격 + 직선 공격 Прямая атака Ataque Direto Attaque directe @@ -38,7 +38,7 @@ Überflugangriff Attacco dall'alto オーバーフライ トップ アタック - 攻顶模式 + 飞越攻顶模式 攻頂模式 Atak z góry 탑어택 diff --git a/addons/noradio/XEH_preInit.sqf b/addons/noradio/XEH_preInit.sqf index 48463b70ef..35b9e9ec47 100644 --- a/addons/noradio/XEH_preInit.sqf +++ b/addons/noradio/XEH_preInit.sqf @@ -27,13 +27,4 @@ if (hasInterface) then { }, true] call CBA_fnc_addPlayerEventHandler; }; -[QGVAR(enabled), "CHECKBOX", [LSTRING(setting), LSTRING(setting_tooltip)], format ["ACE %1", localize ELSTRING(common,DisplayName)], true, true, { - params ["_enabled"]; - - if (_enabled) then { - [ACE_player, "isPlayer"] call EFUNC(common,muteUnit); - } else { - [ACE_player, "isPlayer"] call EFUNC(common,unmuteUnit); - }; -}, true // Needs mission restart -] call CBA_fnc_addSetting; +#include "initSettings.sqf" diff --git a/addons/noradio/initSettings.sqf b/addons/noradio/initSettings.sqf new file mode 100644 index 0000000000..5c558064da --- /dev/null +++ b/addons/noradio/initSettings.sqf @@ -0,0 +1,15 @@ +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(setting), LSTRING(setting_tooltip)], + [LELSTRING(Common,CategoryUncategorized), LLSTRING(DisplayName)], + true, + true, { + params ["_enabled"]; + + if (_enabled) then { + [ACE_player, "isPlayer"] call EFUNC(common,muteUnit); + } else { + [ACE_player, "isPlayer"] call EFUNC(common,unmuteUnit); + }; +}, true // Needs mission restart +] call CBA_fnc_addSetting; diff --git a/addons/noradio/stringtable.xml b/addons/noradio/stringtable.xml index affc778e6a..6d9007bcb7 100644 --- a/addons/noradio/stringtable.xml +++ b/addons/noradio/stringtable.xml @@ -1,6 +1,16 @@ + + No Radio + 去无线电 + Kein Funkgerät + 음소거 + Brak Radia + 無線無し + Нет рации + No Radio + Mute Player Spieler stummschalten @@ -15,6 +25,7 @@ Ztlumit hráče Oyuncuyu Sustur Ensordecer jugador + 플레이어 음소거 Mutes the controlled player avatar. @@ -30,6 +41,7 @@ Vypne hlas charakteru hráče. Oyuncuları Susturur Ensordecer el avatar del jugador controlado + 플레이어 아바타를 음소거합니다 diff --git a/addons/novehicleclanlogo/$PBOPREFIX$ b/addons/novehicleclanlogo/$PBOPREFIX$ new file mode 100644 index 0000000000..8232a79524 --- /dev/null +++ b/addons/novehicleclanlogo/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\novehicleclanlogo diff --git a/addons/novehicleclanlogo/CfgEventHandlers.hpp b/addons/novehicleclanlogo/CfgEventHandlers.hpp new file mode 100644 index 0000000000..6c29240403 --- /dev/null +++ b/addons/novehicleclanlogo/CfgEventHandlers.hpp @@ -0,0 +1,18 @@ + +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/novehicleclanlogo/README.md b/addons/novehicleclanlogo/README.md new file mode 100644 index 0000000000..4a058d99ba --- /dev/null +++ b/addons/novehicleclanlogo/README.md @@ -0,0 +1,4 @@ +novehicleclanlogo +============= + +Prevents clan logo from being displayed on vehicles controlled by players. diff --git a/addons/novehicleclanlogo/XEH_PREP.hpp b/addons/novehicleclanlogo/XEH_PREP.hpp new file mode 100644 index 0000000000..a835a8884f --- /dev/null +++ b/addons/novehicleclanlogo/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(removeClanLogo); diff --git a/addons/novehicleclanlogo/XEH_postInit.sqf b/addons/novehicleclanlogo/XEH_postInit.sqf new file mode 100644 index 0000000000..ec2049c4a1 --- /dev/null +++ b/addons/novehicleclanlogo/XEH_postInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +// clan logos are not used in singleplayer +if (!isMultiplayer) exitWith {}; + +["CBA_settingsInitialized", { + TRACE_1("settingsInit eh",GVAR(enabled)); + + if (isServer && {GVAR(enabled)}) then { + ["LandVehicle", "initPost", LINKFUNC(removeClanLogo), true, [], true] call CBA_fnc_addClassEventHandler; + ["Air", "initPost", LINKFUNC(removeClanLogo), true, [], true] call CBA_fnc_addClassEventHandler; + ["Ship", "initPost", LINKFUNC(removeClanLogo), true, [], true] call CBA_fnc_addClassEventHandler; + }; +}] call CBA_fnc_addEventHandler; diff --git a/addons/novehicleclanlogo/XEH_preInit.sqf b/addons/novehicleclanlogo/XEH_preInit.sqf new file mode 100644 index 0000000000..9361d05015 --- /dev/null +++ b/addons/novehicleclanlogo/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/novehicleclanlogo/XEH_preStart.sqf b/addons/novehicleclanlogo/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/novehicleclanlogo/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/novehicleclanlogo/config.cpp b/addons/novehicleclanlogo/config.cpp new file mode 100644 index 0000000000..77c7dce638 --- /dev/null +++ b/addons/novehicleclanlogo/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/novehicleclanlogo/functions/fnc_removeClanLogo.sqf b/addons/novehicleclanlogo/functions/fnc_removeClanLogo.sqf new file mode 100644 index 0000000000..9274172140 --- /dev/null +++ b/addons/novehicleclanlogo/functions/fnc_removeClanLogo.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: veteran29 + * Replaces the vehicle clan logo with an empty texture. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * [vehicle player] call ace_novehicleclanlogo_fnc_removeClanLogo + * + * Public: Yes + */ + +params ["_vehicle"]; + +private _selectionClan = getText (configOf _vehicle >> "selectionClan"); +if !(_selectionClan in selectionNames _vehicle) exitWith { + TRACE_2("vehicle does not have 'selectionClan' selection",_vehicle,_selectionClan); +}; + +if (_vehicle getVariable [QEGVAR(tagging,hasTag), false]) exitWith { + TRACE_1("vehicle has tag applied",_vehicle); +}; + +TRACE_1("replacing clan logo with empty texture",_vehicle); +_vehicle setObjectTextureGlobal [_selectionClan, "#(argb,1,1,1)color(0,0,0,0)"] // return diff --git a/addons/novehicleclanlogo/initSettings.sqf b/addons/novehicleclanlogo/initSettings.sqf new file mode 100644 index 0000000000..471877ca5c --- /dev/null +++ b/addons/novehicleclanlogo/initSettings.sqf @@ -0,0 +1,11 @@ +private _category = [ELSTRING(common,ACEKeybindCategoryVehicles), LSTRING(DisplayName)],; + +[ + QGVAR(enabled), "CHECKBOX", + [LELSTRING(common,Enabled), LSTRING(Enabled_Tooltip)], + _category, + false, + true, + {}, + true +] call CBA_fnc_addSetting; diff --git a/addons/novehicleclanlogo/script_component.hpp b/addons/novehicleclanlogo/script_component.hpp new file mode 100644 index 0000000000..eef91354bd --- /dev/null +++ b/addons/novehicleclanlogo/script_component.hpp @@ -0,0 +1,16 @@ +#define COMPONENT novehicleclanlogo +#define COMPONENT_BEAUTIFIED No Vehicle Clan Logo +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_NOVEHICLECLANLOGO + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_NOVEHICLECLANLOGO + #define DEBUG_SETTINGS DEBUG_ENABLED_NOVEHICLECLANLOGO +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/novehicleclanlogo/stringtable.xml b/addons/novehicleclanlogo/stringtable.xml new file mode 100644 index 0000000000..f911fec7ca --- /dev/null +++ b/addons/novehicleclanlogo/stringtable.xml @@ -0,0 +1,23 @@ + + + + + Remove clan logo from vehicles + Usuń logo klanu z pojazdów + 차량에서 클랜 로고 제거 + Убрать логотип кланов с техники + Suprimir logo del clan de los vehículos + 乗り物から部隊ロゴを削除 + Clan-Logo von Fahrzeugen entfernen + + + Prevents clan logo from being displayed on vehicles controlled by players. + Zapobiega wyświetlaniu logo klanu na pojazdach kontrolowanych przez graczy. + 플레이어가 조종하는 차량에 클랜 로고가 표시되지 않도록 합니다. + Не отображать логотипы кланов на технике контроллируемой игроками. + Previene que se muestre el logo del clan en los vehículos controlados por jugadores. + プレイヤーが操作する乗り物に部隊ロゴが表示されないようにする。 + Verhindert, dass das Clan-Logo auf von Spielern kontrollierten Fahrzeugen angezeigt wird. + + + diff --git a/addons/optics/CfgJointRails.hpp b/addons/optics/CfgJointRails.hpp index 86c962afe5..5489b1c4fe 100644 --- a/addons/optics/CfgJointRails.hpp +++ b/addons/optics/CfgJointRails.hpp @@ -13,3 +13,35 @@ class asdg_OpticRail1913: asdg_OpticRail { ACE_optic_LRPS_PIP = 1; }; }; + +// Vanilla rails +class SlotInfo; +class CowsSlot: SlotInfo { + compatibleItems[] += { + "ACE_optic_Hamr_2D", + "ACE_optic_Hamr_PIP", + "ACE_optic_Arco_2D", + "ACE_optic_Arco_PIP", + "ACE_optic_MRCO_2D", + "ACE_optic_MRCO_PIP", + "ACE_optic_SOS_2D", + "ACE_optic_SOS_PIP", + "ACE_optic_LRPS_2D", + "ACE_optic_LRPS_PIP" + }; +}; + +class CowsSlot_Rail: CowsSlot { + class compatibleItems { + ACE_optic_Hamr_2D = 1; + ACE_optic_Hamr_PIP = 1; + ACE_optic_Arco_2D = 1; + ACE_optic_Arco_PIP = 1; + ACE_optic_MRCO_2D = 1; + ACE_optic_MRCO_PIP = 1; + ACE_optic_SOS_2D = 1; + ACE_optic_SOS_PIP = 1; + ACE_optic_LRPS_2D = 1; + ACE_optic_LRPS_PIP = 1; + }; +}; diff --git a/addons/optics/CfgRscTitles.hpp b/addons/optics/CfgRscTitles.hpp index 3df4632e16..bb01281a22 100644 --- a/addons/optics/CfgRscTitles.hpp +++ b/addons/optics/CfgRscTitles.hpp @@ -68,10 +68,10 @@ class RscInGameUI { text = ""; colorText[] = {1, 1, 1, 0}; colorBackground[] = {0, 0, 0, 0}; - x = safezoneX + 0.5 * safezoneW - 0.5 * SIZEX; - y = safezoneY + 0.5 * safezoneH - 0.5 * SIZEX * (4 / 3); - w = SIZEX; - h = SIZEX * (4 / 3); + x = QUOTE(safezoneX + 0.5 * safezoneW - 0.5 * SIZEX); + y = QUOTE(safezoneY + 0.5 * safezoneH - 0.5 * SIZEX * (4 / 3)); + w = QUOTE(SIZEX); + h = QUOTE(SIZEX * (4 / 3)); }; class ReticleNight: ReticleDay { @@ -84,10 +84,10 @@ class RscInGameUI { class BodyDay: ReticleDay { idc = 1713005; text = ""; - x = safezoneX + 0.5 * safezoneW - 0.5 * SIZEX; - y = safezoneY + 0.5 * safezoneH - 0.5 * SIZEX * (4 / 3); - w = SIZEX; - h = SIZEX * (4 / 3); + x = QUOTE(safezoneX + 0.5 * safezoneW - 0.5 * SIZEX); + y = QUOTE(safezoneY + 0.5 * safezoneH - 0.5 * SIZEX * (4 / 3)); + w = QUOTE(SIZEX); + h = QUOTE(SIZEX * (4 / 3)); }; class BodyNight: BodyDay { @@ -109,7 +109,7 @@ class RscInGameUI { class trippleHeadRight: trippleHeadLeft { idc = 1713011; x = "safeZoneXAbs + safeZoneWAbs - (safezoneX - safeZoneXABS) * ((getResolution select 4) / (16 / 3))"; - colorBackground[] = {0, 0, 0, 1}; + colorBackground[] = {0, 0, 0, 1}; }; }; diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index c9dfbb8d7b..8088a5fcd3 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -307,20 +307,3 @@ class CfgWeapons { }; }; }; - -class SlotInfo; -class CowsSlot: SlotInfo { - compatibleItems[] += { - "ACE_optic_Hamr_2D", - "ACE_optic_Hamr_PIP", - "ACE_optic_Arco_2D", - "ACE_optic_Arco_PIP", - "ACE_optic_MRCO_2D", - "ACE_optic_MRCO_PIP", - "ACE_optic_SOS_2D", - "ACE_optic_SOS_PIP", - "ACE_optic_LRPS_2D", - "ACE_optic_LRPS_PIP" - //"ACE_optic_DMS" - }; -}; diff --git a/addons/optics/functions/fnc_handleFired.sqf b/addons/optics/functions/fnc_handleFired.sqf index fbcb177f2e..5a1ae0eca0 100644 --- a/addons/optics/functions/fnc_handleFired.sqf +++ b/addons/optics/functions/fnc_handleFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Taosenai * Adapted By: KoffeinFlummi, commy2 diff --git a/addons/optics/functions/fnc_onDrawScope.sqf b/addons/optics/functions/fnc_onDrawScope.sqf index 22b9ddc2b2..4b1b9e321d 100644 --- a/addons/optics/functions/fnc_onDrawScope.sqf +++ b/addons/optics/functions/fnc_onDrawScope.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/optics/functions/fnc_onDrawScope2D.sqf b/addons/optics/functions/fnc_onDrawScope2D.sqf index 9031ca8ba7..df431407da 100644 --- a/addons/optics/functions/fnc_onDrawScope2D.sqf +++ b/addons/optics/functions/fnc_onDrawScope2D.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Helper function for updating the 2d and 3d scope controls diff --git a/addons/optics/functions/script_component.hpp b/addons/optics/functions/script_component.hpp deleted file mode 100644 index 5613c1aec3..0000000000 --- a/addons/optics/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\optics\script_component.hpp" \ No newline at end of file diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml index 58763da8d6..85620ac37c 100644 --- a/addons/optics/stringtable.xml +++ b/addons/optics/stringtable.xml @@ -13,8 +13,8 @@ RCO (2D) RCO (2D) RCO (2D) - RCO (2D) - 步枪战斗光学瞄准镜(2D) + 류폴드 마크 4 HAMR (2D) + RCO(2D) 步槍戰鬥光學瞄準鏡(2D) RCO (2D) @@ -30,8 +30,8 @@ RCO (PIP) RCO (PIP) RCO (PIP) - RCO (PIP) - 步枪战斗光学瞄准镜(拟真版) + 류폴드 마크 4 HAMR (PIP) + RCO(画中画) 步槍戰鬥光學瞄準鏡(擬真版) RCO (PIP) @@ -47,8 +47,8 @@ ARCO (2D) ARCO (2D) ARCO (2D) - ARCO (2D) - 先进步枪战斗光学瞄准镜(2D) + 엘칸 스펙터OS (2D) + ARCO(2D) 先進步槍戰鬥光學瞄準鏡(2D) ARCO (2D) @@ -64,8 +64,8 @@ ARCO (PIP) ARCO (PIP) ARCO (PIP) - ARCO (PIP) - 先进步枪战斗光学瞄准镜(拟真版) + 엘칸 스펙터OS (PIP) + ARCO(画中画) 先進步槍戰鬥光學瞄準鏡(擬真版) ARCO (PIP) @@ -81,8 +81,8 @@ MRCO (2D) MRCO (2D) MRCO (2D) - MRCO (2D) - 多距离战斗瞄准镜(2D) + IOR-Valdada 핏불 2 (2D) + MRCO(2D) 多距離戰鬥瞄準鏡(2D) MRCO (2D) @@ -98,8 +98,8 @@ MRCO (PIP) MRCO (PIP) MRCO (PIP) - MRCO (PIP) - 多距离战斗瞄准镜(拟真版) + IOR-Valdada 핏불 2 (PIP) + MRCO(画中画) 多距離戰鬥瞄準鏡(擬真版) MRCO (PIP) @@ -116,7 +116,7 @@ MOS (2D) MOS (2D) MOS (2D) - 精准光学瞄准镜(2D) + MOS(2D) 精準光學瞄準鏡(2D) MOS (2D) @@ -133,7 +133,7 @@ MOS (PIP) MOS (PIP) MOS (PIP) - 精准光学瞄准镜(拟真版) + MOS(画中画) 精準光學瞄準鏡(擬真版) MOS (PIP) @@ -149,8 +149,8 @@ MPLD (2D) LRPS (2D) LRPS (2D) - LRPS (2D) - 长距离精确瞄准镜(2D) + 나이트포스 NXS (2D) + LRPS(2D) 長距離精確瞄準鏡(2D) LRPS (2D) @@ -166,8 +166,8 @@ MPLD (PIP) LRPS (PIP) LRPS (PIP) - LRPS (PIP) - 长距离精确瞄准镜(拟真版) + 나이트포스 NXS (PIP) + LRPS(画中画) 長距離精確瞄準鏡(擬真版) LRPS (PIP) diff --git a/addons/optionsmenu/config.cpp b/addons/optionsmenu/config.cpp index 5661753579..811b1eecec 100644 --- a/addons/optionsmenu/config.cpp +++ b/addons/optionsmenu/config.cpp @@ -38,6 +38,6 @@ class ACE_Extensions { class CfgCommands { allowedHTMLLoadURIs[] += { - "https://ace3mod.com/version.html" + "https://ace3.acemod.org/version.html" }; }; diff --git a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf index 6ed460d2f9..07205dc195 100644 --- a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf +++ b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Dumps debug info to clipboard. diff --git a/addons/optionsmenu/functions/script_component.hpp b/addons/optionsmenu/functions/script_component.hpp deleted file mode 100644 index dd11862f9d..0000000000 --- a/addons/optionsmenu/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\optionsmenu\script_component.hpp" \ No newline at end of file diff --git a/addons/optionsmenu/initSettings.sqf b/addons/optionsmenu/initSettings.sqf index 7a15e892ff..bf77a84fcc 100644 --- a/addons/optionsmenu/initSettings.sqf +++ b/addons/optionsmenu/initSettings.sqf @@ -1,7 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(aceNews)]; + [ QGVAR(showNewsOnMainMenu), "CHECKBOX", LSTRING(showNewsOnMainMenu_name), - "ACE Uncategorized", + _category, true, 0 ] call CBA_fnc_addSetting; diff --git a/addons/optionsmenu/init_loadMainMenuBox.sqf b/addons/optionsmenu/init_loadMainMenuBox.sqf index 5b21d7aabb..78ba6e839d 100644 --- a/addons/optionsmenu/init_loadMainMenuBox.sqf +++ b/addons/optionsmenu/init_loadMainMenuBox.sqf @@ -51,7 +51,7 @@ if (profileNamespace getVariable [QGVAR(showNewsOnMainMenu), true]) then { _versionStr = _versionStr joinString "."; (_display displayCtrl IDC_MAIN_INFO_CURRENT_VERSION_INFO) ctrlSetText format ["Version: %1", _versionStr]; - (_display displayCtrl IDC_MAIN_INFO_NEWEST_VERSION_INFO) htmlLoad "https://ace3mod.com/version.html"; + (_display displayCtrl IDC_MAIN_INFO_NEWEST_VERSION_INFO) htmlLoad "https://ace3.acemod.org/version.html"; } else { _controlsGroup ctrlShow false; }; diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 9fc44b3beb..cdda474cdc 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -13,8 +13,8 @@ Отладка в буфер обмена Debug su Blocco Note クリップボードにデバッグ - 디버그를 클립보드로 - 复制除错讯息至剪贴簿 + 클립보드를 디버그하기 + 复制调试信息至剪贴板 複製除錯訊息至剪貼簿 Panoya Hata Ayıkla @@ -31,7 +31,7 @@ Invia informazioni di debug all'RPT e al Blocco Note デバッグ情報を RPT とクリップボードに送ります。 디버그 정보를 보고하기 및 클립보드에 복사하기 위해 보냅니다. - 复制除错讯息至剪贴簿与RPT报告档中。 + 复制调试信息至剪贴板与 RPT 报告档中。 複製除錯訊息至剪貼簿與RPT報告檔中 Hata ayıklama bilgilerini RPT ve panoya gönderir. @@ -48,7 +48,7 @@ Sistema Bug della Testa ヘッドバグ修正 헤드버그 수정 - 修复动作BUG + 修复动作 BUG 修復動作BUG Animasyon Düzeltme @@ -65,7 +65,7 @@ Resetta il tuo stato animazione 現在のアニメーション状態を初期化します。 자신의 동작 상태 초기화 - 当ACE发生动作BUG时,点此修复。 + 当 ACE 发生动作 BUG 时,点此修复。 當ACE發生動作BUG時,點此修復 Animasyon durumunuzu sıfırlar. @@ -81,8 +81,8 @@ Новости ACE Novità ACE ACE ニュース - ACE 새소식 - ACE新闻 + ACE 새 소식 + ACE 新闻 ACE新聞 ACE Haberler @@ -94,12 +94,12 @@ Pokazuj wiadomości ACE w menu głównym Afficher les nouveautés dans le menu principal Hírek mutatása a főmenüben - Показывать новости в Главном Меню + Показывать новости в главном меню Zobrazit zprávy v hlavním menu Mostra News nel Menù Princinpale メイン画面にニュースを表示します - 메인메뉴에 새소식을 표시합니다 - 显示新闻消息于主选单 + 메인메뉴에 새 소식을 표시합니다 + 显示新闻消息于主菜单 顯示新聞消息於主選單 Ana Menü de Haberleri Göster diff --git a/addons/overheating/CfgVehicles.hpp b/addons/overheating/CfgVehicles.hpp index 5a854699e2..e17f030a2b 100644 --- a/addons/overheating/CfgVehicles.hpp +++ b/addons/overheating/CfgVehicles.hpp @@ -38,7 +38,7 @@ class CfgVehicles { }; class GVAR(CoolWeaponWithItem) { displayName = CSTRING(CoolWeaponWithItem); - condition = QUOTE(GVAR(enabled) && {isClass (configfile >> 'CfgPatches' >> 'acex_field_rations')}); + condition = QUOTE(call FUNC(canCoolWeaponWithItem)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; statement = "true"; showDisabled = 0; @@ -66,7 +66,7 @@ class CfgVehicles { }; class GVAR(CoolWeaponWithItem) { displayName = CSTRING(CoolWeaponWithItem); - condition = QUOTE(GVAR(enabled) && {isClass (configfile >> 'CfgPatches' >> 'acex_field_rations')}); + condition = QUOTE(call FUNC(canCoolWeaponWithItem)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; statement = "true"; showDisabled = 0; diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp index 67a2f0c765..cc0b768934 100644 --- a/addons/overheating/CfgWeapons.hpp +++ b/addons/overheating/CfgWeapons.hpp @@ -99,10 +99,13 @@ class CfgWeapons { }; class ACE_ItemCore; class CBA_MiscItem_ItemInfo; + + // Deprecated, 3.16.0 Arsenal supports showing magazines as misc items class ACE_SpareBarrel_Item: ACE_ItemCore { displayName = CSTRING(SpareBarrelName); author = ECSTRING(common,ACETeam); - scope = 2; + scope = 1; + scopeArsenal = 0; descriptionshort = CSTRING(SpareBarrelDescription); picture = QUOTE(PATHTOF(UI\spare_barrel_ca.paa)); class ItemInfo: CBA_MiscItem_ItemInfo { diff --git a/addons/overheating/XEH_PREP.hpp b/addons/overheating/XEH_PREP.hpp index f4b56c3c3f..865a049569 100644 --- a/addons/overheating/XEH_PREP.hpp +++ b/addons/overheating/XEH_PREP.hpp @@ -3,22 +3,28 @@ PREP(calculateCooling); PREP(canUnjam); PREP(canSwapBarrel); PREP(canCheckSpareBarrelsTemperatures); +PREP(canCoolWeaponWithItem); PREP(checkSpareBarrelsTemperatures); PREP(checkTemperature); PREP(clearJam); +PREP(cookoffWeapon); PREP(coolWeaponWithItem); PREP(coolWeaponWithWaterSource); PREP(displayTemperature); PREP(firedEH); +PREP(getAmmoTemperature); PREP(getBarrelMass); PREP(getConsumableChildren); PREP(getWeaponData); +PREP(getWeaponTemperature); PREP(handleTakeEH); PREP(handleRespawn); PREP(jamWeapon); PREP(loadCoolestSpareBarrel); PREP(overheat); PREP(sendSpareBarrelsTemperaturesHint); +PREP(setAmmoTemperature); +PREP(setWeaponTemperature); PREP(swapBarrel); PREP(swapBarrelAssistant); PREP(swapBarrelCallback); diff --git a/addons/overheating/XEH_postInit.sqf b/addons/overheating/XEH_postInit.sqf index fbd0f94f1c..bbcd9da97f 100644 --- a/addons/overheating/XEH_postInit.sqf +++ b/addons/overheating/XEH_postInit.sqf @@ -44,9 +44,9 @@ if (hasInterface) then { if !(hasInterface) exitWith {}; - GVAR(cacheWeaponData) = call CBA_fnc_createNamespace; - GVAR(cacheAmmoData) = call CBA_fnc_createNamespace; - GVAR(cacheSilencerData) = call CBA_fnc_createNamespace; + GVAR(cacheWeaponData) = createHashMap; + GVAR(cacheAmmoData) = createHashMap; + GVAR(cacheSilencerData) = createHashMap; //Add Take EH if required if (GVAR(unJamOnReload) || {GVAR(cookoffCoef) > 0}) then { @@ -76,13 +76,23 @@ if (hasInterface) then { }] call CBA_fnc_addClassEventHandler; }; + // Reset all weapon heat to ambient on death to prevent cookoffs when a unit respawns. + ["CAManBase", "Killed", { + params ["_unit"]; + { + _unit setVariable [_x, ambientTemperature select 0]; + } forEach (_unit getVariable [QGVAR(trackedWeapons), []]); + _unit setVariable [QGVAR(trackedWeapons), []]; + }] call CBA_fnc_addClassEventHandler; + // Install event handler to display temp when a barrel was swapped [QGVAR(showWeaponTemperature), DFUNC(displayTemperature)] call CBA_fnc_addEventHandler; + // Install event handler to initiate an assisted barrel swap [QGVAR(initiateSwapBarrelAssisted), DFUNC(swapBarrel)] call CBA_fnc_addEventHandler; // Add an action to allow hot weapons to be cooled off in AceX Field Rations water sources - if (isClass (configfile >> "CfgPatches" >> "acex_field_rations")) then { + if (["acex_field_rations"] call EFUNC(common,isModLoaded)) then { [ {EXGVAR(field_rations,enabled) || CBA_missionTime > 1}, { @@ -107,5 +117,4 @@ if (hasInterface) then { [] ] call CBA_fnc_waitUntilAndExecute; }; - }] call CBA_fnc_addEventHandler; diff --git a/addons/overheating/functions/fnc_calculateCooling.sqf b/addons/overheating/functions/fnc_calculateCooling.sqf index 8fd39c7024..f01f3950e7 100644 --- a/addons/overheating/functions/fnc_calculateCooling.sqf +++ b/addons/overheating/functions/fnc_calculateCooling.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Calculate the cooling down of a weapon over a time interval. @@ -19,9 +19,12 @@ params ["_temperature", "_barrelMass", "_totalTime"]; -if (_temperature < 1) exitWith {0}; +// The lowest temperature a weapon can reach is the ambient air temperature. +private _ambientTemperature = ambientTemperature select 0; + // If a long time passed since the last shot, there's no need to calculate anything; the weapon should be cool -if (_totalTime > 1800) exitWith {0}; +if (_totalTime > 1800) exitWith {_ambientTemperature}; +if (_temperature <= _ambientTemperature) exitWith {_ambientTemperature}; //AR-15 (0.00570m bullet diameter) (barrel diameter usually 0.75" or 0.008255m radius) //Steel Denisty = 7850 m^3 / kg @@ -51,9 +54,9 @@ while {true} do { _convectionRate * _barrelSurface * _temperature // Radiative cooling + 0.4 * 5.67e-8 * _barrelSurface * ((_temperature + 273.15) ^ 4 - 273.15 ^ 4) - ) * _deltaTime / (_barrelMass * 466); + ) * GVAR(coolingCoef) * _deltaTime / (_barrelMass * 466); - if (_temperature < 1) exitWith {0}; + if (_temperature <= _ambientTemperature) exitWith {_ambientTemperature}; if (isNil "_temperature") exitWith { diag_log text format ["[ACE] ERROR: _totalTime = %1; _time = %2; _deltaTime = %3;", _totalTime, _time, _deltaTime]; @@ -61,5 +64,5 @@ while {true} do { }; _time = _time + _deltaTime; - if (_time >= _totalTime) exitWith { _temperature max 0 }; + if (_time >= _totalTime) exitWith {_temperature max _ambientTemperature}; }; diff --git a/addons/overheating/functions/fnc_canCheckSpareBarrelsTemperatures.sqf b/addons/overheating/functions/fnc_canCheckSpareBarrelsTemperatures.sqf index 0f8775ae25..c84de1ae6f 100644 --- a/addons/overheating/functions/fnc_canCheckSpareBarrelsTemperatures.sqf +++ b/addons/overheating/functions/fnc_canCheckSpareBarrelsTemperatures.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Grey-Soldierman * Return true if player can check temperatures of spare barrels diff --git a/addons/overheating/functions/fnc_canCoolWeaponWithItem.sqf b/addons/overheating/functions/fnc_canCoolWeaponWithItem.sqf new file mode 100644 index 0000000000..2040502283 --- /dev/null +++ b/addons/overheating/functions/fnc_canCoolWeaponWithItem.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Return true if the target's weapon can be cooled with an item in the player's inventory + * + * Arguments: + * 0: Target + * 1: Player + * + * Return Value: + * Bool + * + * Example: + * [cursorObject, player] call ace_overheating_fnc_canCoolWeaponWithItem + * + * Public: No + */ + +params ["_unit", "_player"]; +TRACE_2("canCoolWeaponWithItem",_unit,_player); + +GVAR(enabled) +&& {["acex_field_rations"] call EFUNC(common,isModLoaded)} +&& {!(_unit getVariable [QEGVAR(captives,isSurrendering), false])} // interaction point will overlap with ace_captives +&& {!(_unit getVariable [QEGVAR(captives,isHandcuffed), false])} +&& {[_unit, currentWeapon _unit] call FUNC(getWeaponTemperature) > (ambientTemperature select 0)} +&& {((_player call EFUNC(common,uniqueItems)) findIf {getNumber (configFile >> "CfgWeapons" >> _x >> QEXGVAR(field_rations,thirstQuenched)) > 0}) != -1} diff --git a/addons/overheating/functions/fnc_canSwapBarrel.sqf b/addons/overheating/functions/fnc_canSwapBarrel.sqf index 38115f6f7a..cddd45aa5b 100644 --- a/addons/overheating/functions/fnc_canSwapBarrel.sqf +++ b/addons/overheating/functions/fnc_canSwapBarrel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Grey-Soldierman * Return true if player can swap barrel diff --git a/addons/overheating/functions/fnc_canUnjam.sqf b/addons/overheating/functions/fnc_canUnjam.sqf index 06511f79cd..f220ce41cd 100644 --- a/addons/overheating/functions/fnc_canUnjam.sqf +++ b/addons/overheating/functions/fnc_canUnjam.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 and esteldunedain * Return true if the unit can unjam it's current weapon diff --git a/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf b/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf index 1c60b1a477..18879292f9 100644 --- a/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf +++ b/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Make the player check the temperature of his spare barrels diff --git a/addons/overheating/functions/fnc_checkTemperature.sqf b/addons/overheating/functions/fnc_checkTemperature.sqf index b771293e6b..59ed85853a 100644 --- a/addons/overheating/functions/fnc_checkTemperature.sqf +++ b/addons/overheating/functions/fnc_checkTemperature.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 and esteldunedain * Make the player check the temperature of his weapon diff --git a/addons/overheating/functions/fnc_clearJam.sqf b/addons/overheating/functions/fnc_clearJam.sqf index 3e63ed5cb7..c8e0a93d68 100644 --- a/addons/overheating/functions/fnc_clearJam.sqf +++ b/addons/overheating/functions/fnc_clearJam.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 * Make the unit clear the jam from a weapon diff --git a/addons/overheating/functions/fnc_cookoffWeapon.sqf b/addons/overheating/functions/fnc_cookoffWeapon.sqf new file mode 100644 index 0000000000..61f74cdf85 --- /dev/null +++ b/addons/overheating/functions/fnc_cookoffWeapon.sqf @@ -0,0 +1,66 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Cookoff loaded round. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Is Weapon Jammed + * 3: Type of Jam + * + * Return Value: + * None + * + * Example: + * [player, currentWeapon player, true, "Fire"] call ace_overheating_fnc_cookoffWeapon + * + * Public: No + */ + +params ["_unit", "_weapon", "_canUnjam", "_jamType"]; +TRACE_4("params",_unit,_weapon,_canUnjam,_jamType); + +// a weapon with a failure to fire or dud type jam will be unjammed from cooking off +// this is first so that the fired event from the cookoff can also cause a jam +if (_canUnjam && {_jamType in ["Fire","Dud"]}) then { + [_unit, currentMuzzle _unit, true] call FUNC(clearJam); + + // clearJam will remove a dud round, but so will the forced fire, so give back the lost round and shoot it + if (_jamType isEqualTo "Dud") then { + _unit setAmmo [_weapon, (_unit ammo _weapon) + 1]; + }; +}; + +// get valid mode and muzzle for the main weapon, we don't want the cookoff to come from an underbarrel launcher +([_weapon] call FUNC(getWeaponData)) params ["", "", "", "_modes", "_muzzle", "_reloadTime"]; + +// get an appropriate firemode and muzzle, cache the current muzzle +// trying to match firemodes and switching back to the cached muzzle will hide the change from the player and prevent unexpected mode/muzzle changes (going from full auto to semi auto, or from underbarrel GL to rifle for example) +private _muzzleCache = currentMuzzle _unit; +private _mode = currentWeaponMode _unit; +if !(_mode in _modes) then { + _mode = _modes select 0; +}; + +// delay cookoff to ensure any previous animation from a fired event is finished +[ + { + params ["_unit", "_mode", "_muzzle", "_muzzleCache"]; + + // fire the cookoff + _unit forceWeaponFire [_muzzle, _mode]; + + // switch back to the cached muzzle if required + if (_muzzle != _muzzleCache) then { + _unit selectWeapon _muzzleCache; + }; + + [ + [localize LSTRING(WeaponCookedOff)], + true // allows the hint to be overwritten by another hint, such as a jam or another cookoff + ] call CBA_fnc_notify; + }, + [_unit, _mode, _muzzle, _muzzleCache], + _reloadTime +] call CBA_fnc_waitAndExecute; diff --git a/addons/overheating/functions/fnc_coolWeaponWithItem.sqf b/addons/overheating/functions/fnc_coolWeaponWithItem.sqf index 8558303829..bc21963fb6 100644 --- a/addons/overheating/functions/fnc_coolWeaponWithItem.sqf +++ b/addons/overheating/functions/fnc_coolWeaponWithItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror, drofseh * Cool a weapon with an item and consume the item being used to cool it. @@ -61,7 +61,7 @@ private _fnc_onSuccess = { }; // cool the weapon - private _barrelMass = _weapon call FUNC(getBarrelMass); + private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; _temperature = [_temperature, _barrelMass, _liquidAmount * 10] call FUNC(calculateCooling); [_target, _tempVarName, _temperature, TEMP_TOLERANCE] call EFUNC(common,setApproximateVariablePublic); }; @@ -95,4 +95,4 @@ private _fnc_condition = { {}, //_fnc_onFailure, _consumeText, _fnc_condition -] call EFUNC(common,progressBar); \ No newline at end of file +] call EFUNC(common,progressBar); diff --git a/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf b/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf index 2e142602ec..acf3286c4a 100644 --- a/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf +++ b/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror, drofseh * Cool a weapon with an AceX water source. @@ -59,7 +59,7 @@ private _fnc_condition = { }; //Cool the weapon down - private _barrelMass = _weapon call FUNC(getBarrelMass); + private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; _temperature = [_temperature, _barrelMass, 20] call FUNC(calculateCooling); [_player, _tempVarName, _temperature, TEMP_TOLERANCE] call EFUNC(common,setApproximateVariablePublic); diff --git a/addons/overheating/functions/fnc_displayTemperature.sqf b/addons/overheating/functions/fnc_displayTemperature.sqf index 006d81f8f5..f45d7d40d9 100644 --- a/addons/overheating/functions/fnc_displayTemperature.sqf +++ b/addons/overheating/functions/fnc_displayTemperature.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 and esteldunedain * Displays the weapon temperature diff --git a/addons/overheating/functions/fnc_firedEH.sqf b/addons/overheating/functions/fnc_firedEH.sqf index 5f43ca1881..9db3a73dd6 100644 --- a/addons/overheating/functions/fnc_firedEH.sqf +++ b/addons/overheating/functions/fnc_firedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 and esteldunedain * Handle weapon fire. Called from the unified fired EH 1- always for the local player 2- and for non local players if dispersion is simulated. @@ -89,8 +89,10 @@ if (_scaledTemperature > 0.1) then { // Only compute jamming for the local player if (_unit != ACE_player) exitWith {END_COUNTER(firedEH);}; +private _ammoCount = _unit ammo _weapon; + // Compute new temperature once every 3 bullets -if ((_unit ammo _weapon) % 3 == 0) then { +if (_ammoCount % 3 == 0) then { _this call FUNC(overheat); }; @@ -102,7 +104,8 @@ if (GVAR(cookoffCoef) > 0) then { // decrease time to next shot as heat increases, value is a coef where 1 is unchanged and 0 is instant, 0.8 is a 25% faster ROF. // this could be filtered by weapon type, but I think the heat gain and rate of fire on non-automatic weapons is low enough not to bother -if (GVAR(overheatingRateOfFire)) then { +// do not set when empty to prevent animation glitches +if (GVAR(overheatingRateOfFire) && {_ammoCount > 0}) then { _unit setWeaponReloadingTime [_unit, _muzzle, linearConversion [0, 0.5, _scaledTemperature, 1, 0.909, true]]; }; diff --git a/addons/overheating/functions/fnc_getAmmoTemperature.sqf b/addons/overheating/functions/fnc_getAmmoTemperature.sqf new file mode 100644 index 0000000000..c1d99e86bc --- /dev/null +++ b/addons/overheating/functions/fnc_getAmmoTemperature.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Get current temperature of weapon's ammo. + * + * Arguments: + * 0: Unit + * 1: Weapon + * + * Return Value: + * Current ammunition temperature + * + * Example: + * [player, currentWeapon player] call ace_overheating_fnc_getAmmoTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon"]; + +private _ammoTempVarName = format [QGVAR(%1_ammoTemp), _weapon]; + +_unit getVariable [_ammoTempVarName, ambientTemperature select 0] diff --git a/addons/overheating/functions/fnc_getBarrelMass.sqf b/addons/overheating/functions/fnc_getBarrelMass.sqf index 1504442a60..43150b4fee 100644 --- a/addons/overheating/functions/fnc_getBarrelMass.sqf +++ b/addons/overheating/functions/fnc_getBarrelMass.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror, drofseh * Get the mass of the weapons barrel. @@ -17,4 +17,6 @@ params ["_weapon"]; -METAL_MASS_RATIO * (getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlotsInfo" >> "mass") / 22.0) max 1.0; +private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; + +_barrelMass diff --git a/addons/overheating/functions/fnc_getConsumableChildren.sqf b/addons/overheating/functions/fnc_getConsumableChildren.sqf index 697b4bccd9..025e9a6939 100644 --- a/addons/overheating/functions/fnc_getConsumableChildren.sqf +++ b/addons/overheating/functions/fnc_getConsumableChildren.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001, Glowbal, PabstMirror * Returns children actions for consumable items in player's inventory. diff --git a/addons/overheating/functions/fnc_getWeaponData.sqf b/addons/overheating/functions/fnc_getWeaponData.sqf index c5cfb40d4a..8edd86bb1a 100644 --- a/addons/overheating/functions/fnc_getWeaponData.sqf +++ b/addons/overheating/functions/fnc_getWeaponData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror and esteldunedain * Get weapon data with caching @@ -7,9 +7,14 @@ * 0: weapon type * * Return Value: - * 0: dispresion + * 0: dispersion * 1: slowdownFactor * 2: jamChance + * 3: modes + * 4: muzzle + * 5: reloadTime + * 6: closedBolt + * 7: barrelMass * * Example: * ["gun"] call ace_overheating_fnc_getWeaponData @@ -20,7 +25,7 @@ params ["_weapon"]; // Look in the cache first -private _weaponData = GVAR(cacheWeaponData) getVariable _weapon; +private _weaponData = GVAR(cacheWeaponData) get _weapon; if (!isNil "_weaponData") exitWith {_weaponData}; // Search the config @@ -71,11 +76,19 @@ private _muzzle = getArray (configFile >> "CfgWeapons" >> _weapon >> "muzzles") if (_muzzle == "this") then { _muzzle = _weapon; }; + private _reloadTime = getNumber (configfile >> "CfgWeapons" >> _weapon >> (_modes select 0) >> "reloadTime"); +private _closedBolt = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(closedBolt)); + +private _barrelMass = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(barrelMass)); +if (_barrelMass <= 0) then { + _barrelMass = METAL_MASS_RATIO * (getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlotsInfo" >> "mass") / 22.0) max 1.0; +}; + // Cache the values -_weaponData = [_dispersion, _slowdownFactor, _jamChance, _modes, _muzzle, _reloadTime]; +_weaponData = [_dispersion, _slowdownFactor, _jamChance, _modes, _muzzle, _reloadTime, _closedBolt, _barrelMass]; TRACE_2("building cache",_weapon,_weaponData); -GVAR(cacheWeaponData) setVariable [_weapon, _weaponData]; +GVAR(cacheWeaponData) set [_weapon, _weaponData]; _weaponData diff --git a/addons/overheating/functions/fnc_getWeaponTemperature.sqf b/addons/overheating/functions/fnc_getWeaponTemperature.sqf new file mode 100644 index 0000000000..e0d13a75d5 --- /dev/null +++ b/addons/overheating/functions/fnc_getWeaponTemperature.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Get current temperature of weapon. + * + * Arguments: + * 0: Unit + * 1: Weapon + * + * Return Value: + * Current ammunition temperature + * + * Example: + * [player, currentWeapon player] call ace_overheating_fnc_getWeaponTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon"]; + +private _weaponTempVarName = format [QGVAR(%1_temp), _weapon]; + +_unit getVariable [_weaponTempVarName, ambientTemperature select 0]; diff --git a/addons/overheating/functions/fnc_handleRespawn.sqf b/addons/overheating/functions/fnc_handleRespawn.sqf index 6de713761a..e55ab7cc9e 100644 --- a/addons/overheating/functions/fnc_handleRespawn.sqf +++ b/addons/overheating/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 10Dozen * Handle respawn events and clears list of jammed weapons. diff --git a/addons/overheating/functions/fnc_handleTakeEH.sqf b/addons/overheating/functions/fnc_handleTakeEH.sqf index 266274e5bf..f6bd4d4323 100644 --- a/addons/overheating/functions/fnc_handleTakeEH.sqf +++ b/addons/overheating/functions/fnc_handleTakeEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 * Handle "take" event diff --git a/addons/overheating/functions/fnc_jamWeapon.sqf b/addons/overheating/functions/fnc_jamWeapon.sqf index ea77e11ba4..9a5b8b1049 100644 --- a/addons/overheating/functions/fnc_jamWeapon.sqf +++ b/addons/overheating/functions/fnc_jamWeapon.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2, based on KK_fnc_playerWeaponMulfunction from KillzoneKid * Jam the weapon @@ -51,7 +51,9 @@ if (_jamTypesAllowed isEqualTo []) then { }; }; -_unit setVariable [format [QGVAR(%1_jamType), _weapon], selectRandomWeighted _jamTypesAllowed]; +private _jamType = selectRandomWeighted _jamTypesAllowed; +_unit setVariable [format [QGVAR(%1_jamType), _weapon], _jamType]; + // Stop current burst _unit setAmmo [_weapon, 0]; @@ -72,7 +74,7 @@ if (_weapon == primaryWeapon _unit) then { // only display the hint once, after you try to shoot an already jammed weapon GVAR(knowAboutJam) = false; -["ace_weaponJammed", [_unit,_weapon]] call CBA_fnc_localEvent; +["ace_weaponJammed", [_unit, _weapon, _jamType]] call CBA_fnc_localEvent; if (_unit getVariable [QGVAR(JammingActionID), -1] == -1) then { diff --git a/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf b/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf index f356fb254b..29b7191471 100644 --- a/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf +++ b/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Collect the temperature of all the spare barrels a unit has and load the diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index f1eb7b16c0..b06fcaf668 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 and esteldunedain * Handle weapon fire, heat up the weapon @@ -26,9 +26,9 @@ TRACE_4("params",_unit,_weapon,_ammo,_projectile); BEGIN_COUNTER(overheat); // Get bullet parameters -private _energyIncrement = GVAR(cacheAmmoData) getVariable _ammo; +private _energyIncrement = GVAR(cacheAmmoData) get _ammo; if (isNil "_energyIncrement") then { - _bulletMass = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_BulletMass"); + private _bulletMass = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_BulletMass"); if (_bulletMass == 0) 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")); @@ -38,28 +38,27 @@ if (isNil "_energyIncrement") then { // 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 - _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); + _energyIncrement = GVAR(heatCoef) * 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); - GVAR(cacheAmmoData) setVariable [_ammo, _energyIncrement]; + GVAR(cacheAmmoData) set [_ammo, _energyIncrement]; }; // Increase overheating depending on how obstrusive is the current supressor, // if any. Typical arma supressors have visibleFire=0.5 and audibleFire=0.3, // so they produce x2.1 overheating -private _silencer = switch (_weapon) do { +private _suppressor = switch (_weapon) do { case (primaryWeapon _unit) : {(primaryWeaponItems _unit) select 0}; case (handgunWeapon _unit) : {(handgunItems _unit) select 0}; default {""}; }; -if (_silencer != "") then { - private _silencerCoef = GVAR(cacheSilencerData) getVariable _silencer; - if (isNil "_silencerCoef") then { - _silencerCoef = 1 + - (1 - getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "audibleFire")) + - (1 - getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire")); - GVAR(cacheSilencerData) setVariable [_silencer, _silencerCoef]; +if (_suppressor != "" && {GVAR(suppressorCoef) > 0}) then { + private _suppressorCoef = GVAR(cacheSilencerData) get _suppressor; + if (isNil "_suppressorCoef") then { + private _config = configFile >> "CfgWeapons" >> _suppressor >> "ItemInfo" >> "AmmoCoef"; + _suppressorCoef = GVAR(suppressorCoef) * (1 + (1 - getNumber (_config >> "audibleFire")) + (1 - getNumber (_config >> "visibleFire"))); + GVAR(cacheSilencerData) set [_suppressor, _suppressorCoef]; }; - _energyIncrement = _energyIncrement * _silencerCoef; + _energyIncrement = _energyIncrement * _suppressorCoef; }; TRACE_1("heat",_energyIncrement); diff --git a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf index 7eaf62d0e7..9204b58124 100644 --- a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf +++ b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Collect the temperature of all the spare barrels a unit has and send a hint diff --git a/addons/overheating/functions/fnc_setAmmoTemperature.sqf b/addons/overheating/functions/fnc_setAmmoTemperature.sqf new file mode 100644 index 0000000000..99e96bd41c --- /dev/null +++ b/addons/overheating/functions/fnc_setAmmoTemperature.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Set weapon's ammo to specific temperature. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Temperature + * + * Return Value: + * None + * + * Example: + * [player, currentWeapon player, 123] call ace_overheating_fnc_setAmmoTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon", "_temp"]; + +private _ammoTempVarName = format [QGVAR(%1_ammoTemp), _weapon]; + +_unit setVariable [_ammoTempVarName, _temp]; diff --git a/addons/overheating/functions/fnc_setWeaponTemperature.sqf b/addons/overheating/functions/fnc_setWeaponTemperature.sqf new file mode 100644 index 0000000000..56a7c4e84b --- /dev/null +++ b/addons/overheating/functions/fnc_setWeaponTemperature.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Set weapon to specific temperature. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Temperature + * + * Return Value: + * None + * + * Example: + * [player, currentWeapon player, 123] call ace_overheating_fnc_setWeaponTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon", "_temp"]; + +private _weaponTempVarName = format [QGVAR(%1_temp), _weapon]; + +_unit setVariable [_weaponTempVarName, _temp]; diff --git a/addons/overheating/functions/fnc_swapBarrel.sqf b/addons/overheating/functions/fnc_swapBarrel.sqf index b24ac39f3c..8c43032a41 100644 --- a/addons/overheating/functions/fnc_swapBarrel.sqf +++ b/addons/overheating/functions/fnc_swapBarrel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2 * Make a unit start swapping it's barrel diff --git a/addons/overheating/functions/fnc_swapBarrelAssistant.sqf b/addons/overheating/functions/fnc_swapBarrelAssistant.sqf index c8fbba6e3c..5141cc1f5a 100644 --- a/addons/overheating/functions/fnc_swapBarrelAssistant.sqf +++ b/addons/overheating/functions/fnc_swapBarrelAssistant.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, Commy2 * Make a unit start swapping the barrel of another unit diff --git a/addons/overheating/functions/fnc_swapBarrelCallback.sqf b/addons/overheating/functions/fnc_swapBarrelCallback.sqf index 1f458bcc26..e09f8d0dbc 100644 --- a/addons/overheating/functions/fnc_swapBarrelCallback.sqf +++ b/addons/overheating/functions/fnc_swapBarrelCallback.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Commy2, esteldunedain * Swap barrel callback @@ -34,7 +34,7 @@ if (GVAR(unJamOnSwapBarrel) && {[_gunner] call FUNC(canUnjam)}) then { [localize LSTRING(SwappedBarrel), QPATHTOF(UI\spare_barrel_ca.paa)] call EFUNC(common,displayTextPicture); private _temp = _gunner getVariable [format [QGVAR(%1_temp), _weapon], 0]; -private _barrelMass = _weapon call FUNC(getBarrelMass); +private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; // Instruct the server to load the coolest spare barrel into the weapon and // store the removed barrel with the former weapon temperature. The server diff --git a/addons/overheating/functions/fnc_updateAmmoTemperature.sqf b/addons/overheating/functions/fnc_updateAmmoTemperature.sqf index 12944774b7..870ebbc331 100644 --- a/addons/overheating/functions/fnc_updateAmmoTemperature.sqf +++ b/addons/overheating/functions/fnc_updateAmmoTemperature.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: drofseh * Update temperature of the round in the chamber and determine if a cookoff should occur. @@ -9,7 +9,7 @@ * 2: Barrel Temperature * * Return Value: - * Current ammunition temperature + * New temperature * * Example: * [player, currentWeapon player, 600] call ace_overheating_fnc_updateAmmoTemperature @@ -20,23 +20,25 @@ params ["_unit", "_weapon", "_barrelTemperature"]; TRACE_3("params",_unit,_weapon,_barrelTemperature); -private _closedBolt = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(closedBolt)); +private _closedBolt = ([_weapon] call FUNC(getWeaponData)) select 6; private _canUnjam = [_unit] call FUNC(canUnjam); +private _jamType = _unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"]; // Skip if no ammo in chamber if ( _unit ammo _weapon < 1 // closed bolt, and jammed and type not failure to fire - || {_closedBolt == 1 && {_canUnjam} && {!(_unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"] in ["Fire","Dud"])}} + || {_closedBolt == 1 && {_canUnjam} && {!(_jamType in ["Fire","Dud"])}} // open bolt, and not jammed, or jammed and type not failure to fire - || {_closedBolt == 0 && {!_canUnjam || {_canUnjam && {!(_unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"] in ["Fire","Dud"])}}}} + || {_closedBolt == 0 && {!_canUnjam || {_canUnjam && {!(_jamType in ["Fire","Dud"])}}}} ) exitWith { - _unit setVariable [format [QGVAR(%1_ammoTemp), _weapon], 0]; - 0 + private _ambientTemperature = ambientTemperature select 0; + _unit setVariable [format [QGVAR(%1_ammoTemp), _weapon], _ambientTemperature]; + _ambientTemperature }; private _ammoTempVarName = format [QGVAR(%1_ammoTemp), _weapon]; -private _ammoTemperature = _unit getVariable [_ammoTempVarName, 0]; +private _ammoTemperature = _unit getVariable [_ammoTempVarName, ambientTemperature select 0]; // heat or cool the ammo if (_ammoTemperature < _barrelTemperature) then { @@ -47,58 +49,12 @@ if (_ammoTemperature < _barrelTemperature) then { _ammoTemperature = _barrelTemperature; }; -// check for cook off +// cookoff if too hot if (_ammoTemperature > (GUNPOWDER_IGNITION_TEMP * GVAR(cookoffCoef))) then { + [_unit, _weapon, _canUnjam, _jamType] call FUNC(cookoffWeapon); - // a weapon with a failure to fire or dud type jam will be unjammed from cooking off - // this is first so that the fired event from the cookoff can also cause a jam - private _jamType = _unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"]; - if (_canUnjam && {_jamType in ["Fire","Dud"]}) then { - - [_unit, currentMuzzle _unit, true] call FUNC(clearJam); - - // clearJam will remove a dud round, but so will the forced fire, so give back the lost round and shoot it - if (_jamType isEqualTo "Dud") then { - private _ammo = _unit ammo _weapon; - _unit setAmmo [_weapon, _ammo + 1]; - }; - }; - - // get valid mode and muzzle for the main weapon, we don't want the cookoff to come from an underbarrel launcher - ([_weapon] call FUNC(getWeaponData)) params ["", "", "", "_modes", "_muzzle", "_reloadTime"]; - - // get an appropriate firemode and muzzle, cache the current muzzle - // trying to match firemodes and switching back to the cached muzzle will hide the change from the player and prevent unexpected mode/muzzle changes (going from full auto to semi auto, or from underbarrel GL to rifle for example) - private _muzzleCache = currentMuzzle _unit; - private _mode = currentWeaponMode _unit; - if !(_mode in _modes) then { - _mode = _modes select 0; - }; - - // delay cookoff to ensure any previous animation from a fired event is finished - [ - { - params ["_unit", "_muzzleCache", "_mode", "_muzzle"]; - - // fire the cookoff - _unit forceWeaponFire [_muzzle, _mode]; - - // switch back to the cached muzzle if required - if (_muzzle != _muzzleCache) then { - _unit selectWeapon _muzzleCache; - }; - - [ - [localize LSTRING(WeaponCookedOff)], - true // allows the hint to be overwritten by another hint, such as a jam or another cookoff - ] call CBA_fnc_notify; - }, - [_unit, _muzzleCache, _mode, _muzzle], - _reloadTime - ] call CBA_fnc_waitAndExecute; - - // if the cookoff happened then the next round should start at 0 - _ammoTemperature = 0; + // since a cookoff happened then the next round should start at the ambient temperature. + _ammoTemperature = ambientTemperature select 0; }; _unit setVariable [_ammoTempVarName, _ammoTemperature]; diff --git a/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf b/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf index 2b191102d5..622fc3de6c 100644 --- a/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf +++ b/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain & drofseh * Update . @@ -15,6 +15,11 @@ * Public: No */ +// If the ace_overheating_cookoffCoef setting is set to 0 mid mission we want to exit right away or it will immediate cause all player weapons to cook off. +if (GVAR(cookoffCoef) isEqualTo 0) exitWith { + WARNING_1("'%1' has been set to 0 mid mission. Changing this setting requires mission restart.",GVAR(cookoffCoef)); +}; + private _currentWeapon = currentWeapon ACE_player; if ((_currentWeapon != "") && {_currentWeapon == primaryWeapon ACE_player || {_currentWeapon == handgunWeapon ACE_player}}) then { private _temperature = ACE_player getVariable [format [QGVAR(%1_temp), _currentWeapon], 0]; diff --git a/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf b/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf index 5fb65366a4..64110b2c76 100644 --- a/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf +++ b/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Calculate cooldown of all the stored spare barrels. diff --git a/addons/overheating/functions/fnc_updateTemperature.sqf b/addons/overheating/functions/fnc_updateTemperature.sqf index 351323d54a..8d5ca5d412 100644 --- a/addons/overheating/functions/fnc_updateTemperature.sqf +++ b/addons/overheating/functions/fnc_updateTemperature.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Update temperature of a weapon. @@ -9,7 +9,7 @@ * 2: Heat increment (J) * * Return Value: - * Current temperature + * New temperature * * Example: * [player, currentWeapon player, 2000] call ace_overheating_fnc_updateTemperature @@ -27,18 +27,23 @@ private _timeVarName = format [QGVAR(%1_time), _weapon]; private _temperature = _unit getVariable [_tempVarName, 0]; private _lastTime = _unit getVariable [_timeVarName, 0]; -private _barrelMass = _weapon call FUNC(getBarrelMass); +// keep track of weapons that have heat, so they can be set to ambient temperaure on killed/respawn +private _trackedWeapons = _unit getVariable [QGVAR(trackedWeapons), []]; +_trackedWeapons pushBackUnique _tempVarName; +_unit setVariable [QGVAR(trackedWeapons), _trackedWeapons]; // Calculate cooling +private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; _temperature = [_temperature, _barrelMass, CBA_missionTime - _lastTime] call FUNC(calculateCooling); TRACE_1("cooledTo",_temperature); // Calculate heating // Steel Heat Capacity = 466 J/(Kg.K) -_temperature = _temperature + _heatIncrement * GVAR(heatCoef) / (_barrelMass * 466); +_temperature = _temperature + _heatIncrement / (_barrelMass * 466); // Publish the temperature variable [_unit, _tempVarName, _temperature, TEMP_TOLERANCE] call EFUNC(common,setApproximateVariablePublic); + // Store the update time locally _unit setVariable [_timeVarName, CBA_missionTime]; diff --git a/addons/overheating/functions/fnc_updateTemperatureThread.sqf b/addons/overheating/functions/fnc_updateTemperatureThread.sqf index 670a330c51..1fd3ddd258 100644 --- a/addons/overheating/functions/fnc_updateTemperatureThread.sqf +++ b/addons/overheating/functions/fnc_updateTemperatureThread.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Update cooldown calculation of all player weapons at regular intervals. diff --git a/addons/overheating/functions/script_component.hpp b/addons/overheating/functions/script_component.hpp deleted file mode 100644 index a8668e5b4f..0000000000 --- a/addons/overheating/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\overheating\script_component.hpp" \ No newline at end of file diff --git a/addons/overheating/initSettings.sqf b/addons/overheating/initSettings.sqf index b351a8bed7..b3eaf24029 100644 --- a/addons/overheating/initSettings.sqf +++ b/addons/overheating/initSettings.sqf @@ -15,7 +15,37 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)]; [LSTRING(heatCoef_displayName), LSTRING(heatCoef_description)], _category, [0, 5, 1, 2], - 1 + 1, + { + if (!GVAR(enabled)) exitWith {}; + TRACE_2("reseting cache",GVAR(heatCoef),count GVAR(cacheAmmoData)); + GVAR(cacheAmmoData) = createHashMap; + }, + false +] call CBA_fnc_addSetting; + +[ + QGVAR(coolingCoef), "SLIDER", + [LSTRING(coolingCoef_displayName), LSTRING(coolingCoef_description)], + _category, + [0, 5, 1, 2], + 1, + {}, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(suppressorCoef), "SLIDER", + [LSTRING(suppressorCoef_displayName), LSTRING(suppressorCoef_description)], + _category, + [0, 5, 1, 2], + 1, + { + if (!GVAR(enabled)) exitWith {}; + TRACE_2("reseting cache",GVAR(suppressorCoef),count GVAR(cacheSilencerData)); + GVAR(cacheSilencerData) = createHashMap; + }, + false ] call CBA_fnc_addSetting; [ diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 1025f14b12..3d0077f78b 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -15,6 +15,7 @@ Túlmelegedés Surchauffe Přehřívání + 과열 Overheating Enabled @@ -40,7 +41,7 @@ 過熱と弾詰まりモジュールを全て有効化します Główny włącznik modułu przegrzewania/zacinania się broni Hauptschalter, um die Überhitzung-/Ladehemmung-Module zu aktivieren - 과열/탄걸림 최종 활성화 + 과열/탄걸림 마스터 활성화 Abilitazione master per il modulo di surriscaldamento / inceppamento 启用枪管过热/干扰模块 啟用槍管過熱/干擾模塊 @@ -49,10 +50,64 @@ Heating Coefficient 過熱係数 + Coefficient de surchauffe + Коэф. нагрева + Erhitzungs-Koeffizient + Współczynnik nagrzewania + 过热系数 + 과열 계수 + Coeficiente de calentamiento Coefficient for the amount of heat a weapon generates per shot.\nHigher value increases heat. 射撃毎に武器が生み出す熱量の係数を設定します。\n高い値であるほど熱量が増加します。 + Coefficient impactant la quantité de chaleur générée par l'arme à chaque tir. + Коэффициент количества тепла, выделяемого оружием за выстрел. \nБольшие значения увеличивают нагрев. + Koeffizient für die Menge an Hitze, die eine Waffe pro Schuss erzeugt.\nHöhere Werte beschleunigen die Erhitzung. + Współczynnik wpływający na ilość ciepła generowanego przez broń przy każdym strzale. + 武器每次射击产生的热量系数。\n数值越高,热量越高。 + 매 발사마다 만들어지는 열에 계수를 적용합니다.\n높은 계수는 더 많은 열을 발생시킵니다. + Coeficiente para la cantidad de calor que genera un arma por disparo.\nValores más altos incrementan el calor + + + Cooling Coefficient + 冷却系数 + 냉각 계수 + Abkühlungskoeffizienten + Współczynnik chłodzenia + 冷却係数 + Коэф. остывания + Coeficiente de enfriado + + + Coefficient for how quickly a weapon cools down.\nHigher value increases cooling speed. + 武器冷却速度系数。\n数值越高,冷却速度越快。 + 무기가 차가워지는 정도를 정합니다.\n높은 계수는 무기가 빨리 차가워지는데 관여합니다. + Koeffizient, der angibt, wie schnell eine Waffe abkühlt.\nEin höherer Wert erhöht die Abkühlgeschwindigkeit. + Współczynnik szybkości chłodzenia broni.\nWiększa wartość zwiększa szybkość chłodzenia. + 武器の冷却速度の係数。\n値を大きくすると冷却速度が速くなります。 + Коэффициент скорости остывания орудия.\nЧем больше значение, тем быстрее остывает. + Coeficiente para cómo de rápido se enfría un arma.\nValores más altos incrementan la velocidad de enfriamiento. + + + Suppressor Coefficient + 消音器系数 + 소음기 계수 + Schalldämpfer-Koeffizient + Współczynnik tłumika + サプレッサー係数 + Коэф. глушителя + Coeficiente del silenciador + + + Coefficient for how much additional heat is added from having a suppressor attached.\nHigher value increases heat, 0 means no additional heat from the suppressor. + 附加了消音器后,产生的额外热量系数。\n数值越高,热量越高,0意味着消音器不产生额外热量。 + 소음기 장착 시 만들어 지는 열에 대한 계수를 적용합니다.\n높을 수록 온도가 높아집니다, 0으로 설정 시 추가적인 열을 얻지 않습니다. + Koeffizient, der angibt, wie viel zusätzliche Wärme durch das Anbringen eines Schalldämpfers hinzugefügt wird. Ein höherer Wert erhöht die Menge an Wärme, 0 bedeutet, dass keine zusätzliche Wärme durch den Schalldämpfer hinzukommt. + Współczynnik określający, ile dodatkowego ciepła jest dodawane z założonego tłumika.\nWyższa wartość zwiększa ciepło, 0 oznacza brak dodatkowego ciepła z tłumika. + サプレッサーを取り付けることで追加される熱量の係数。\n値が大きいほど熱が増加し、0はサプレッサーからの追加の熱がないことを意味します。 + Коэффициент указывающий как много дополнительного тепла будет выделяться прикреплённым глушителем.\nБольшее значение увеличивает выделение тепла, 0 - отсутствие дополнительного тепла. + Coeficiente para cuanto calor adicional es añadido por tener un silenciador montado.\nValores más altos incrementan el calor. 0 significa que el silenciador no añade calor adicional. Display Text on Jam @@ -67,7 +122,7 @@ Visualizza testo in caso di inceppamento 弾詰りを文章で表示 탄걸림의 경우 화면에 표시 - 在卡弹时显示提示讯息 + 在卡弹时显示提示信息 在卡彈時顯示提示訊息 @@ -82,8 +137,8 @@ Mostra uma notificação quando sua arma sofre um travamento. Visualizza una notifica in caso la tua arma si inceppasse 持っている武器が弾詰りをすると、通知を表示します - 총알이 무기에 걸릴경우 화면에 알림을 띄웁니다 - 当武器卡弹时显示提示讯息 + 총알이 무기에 걸릴 경우 화면에 알림을 띄웁니다 + 当武器卡弹时显示提示信息 當武器卡彈時顯示提示訊息 @@ -145,7 +200,7 @@ Показывать эффект частиц, когда оружие других игроков перегревается 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 @@ -177,7 +232,7 @@ Перегретое оружие будет менее точным, а дульная скорость будет снижена. Применяется ко всем игрокам. Přehřátá zbraň bude méně přesná a bude mít menší úsťovou rychlost. Platí pro všechny hráče. 過熱は精度を減少させたり、初速を低下させます。これは全プレイヤに適用します。 - 무기 과열시 무기의 명중률이 저하되고 총구속도가 감소합니다. 이는 모든 플레이어에게 적용됩니다. + 무기 과열 시 무기의 명중률이 저하되고 총구속도가 감소합니다. 이는 모든 플레이어에게 적용됩니다. 过热的武器将会有打不准和减少射击初速的情况。适用于所有玩家 過熱的武器將會有打不準和減少射擊初速的情況。適用於所有玩家 A túlmelegedett fegyverek kevésbé lesznek pontosak és csökkent a lövés sebessége. Minden játékosra vonatkozik. @@ -185,26 +240,68 @@ Distance for Effects and Dispersion エフェクトと分散用距離 + Distance des effets et de la dispersion + Дистанция для эффектов и разброса + Abstand für Effekte und Dispersion + Odległość efektów i rozproszenia + 效果和扩散距离 + 효과와 분산 거리 + Distancia para Efectos y Dispersión The distance, in meters, from the player within which overheating particle effects and dispersion are visible. プレイヤーが過熱パーティクル エフェクトと分散を見えるようになる距離 (m) を設定します。 + Définit la distance en mètres, jusqu'à laquelle les effets de particules et la dispersion sont visibles. + Дистанция в метрах, с которой видны эффекты частиц и разброса при перегреве. + Der Abstand in Metern vom Spieler, in dem Überhitzungspartikeleffekte und Dispersion sichtbar sind. + Określa odległość w metrach, do której widoczne są efekty cząsteczkowe i rozproszenie. + 距离玩家的距离(米),在这个距离内可以看到过热的粒子效应和扩散。 + 미터 단위로, 과열 시 입자효과와 분산 정도가 플레이어로부터 얼마나 떨어진 곳까지 보여지는지를 결정합니다. + La distancia, en metros, desde la cual los efectos de sobrecalentamiento de particulas y dispersión son visibles. Heat Increases Fire Rate 熱による連射速度上昇 + La chaleur augmente la cadence de tir + Нагрев увеличивает темп стрельбы + Hitze erhöht die Feuerrate + Ciepło zwiększa szybkostrzelność + 过热增加射速 + 과열 시 발사속도 증가 + Calentamiento incrementa la cadencia de tiro. As weapons heat up, their rate of fire increases by up to 10%. 武器が熱を帯び始めると、連射速度が 10% 上昇します。 + Lorsqu'une arme chauffe, sa cadence de tir peut augmenter jusqu'à 10%. + При нареве орудия, его темп стрельбы увеличивается до 10%. + Wenn sich Waffen erhitzen, erhöht sich ihre Feuerrate um bis zu 10%. + Gdy broń się nagrzewa, jej szybkostrzelność może wzrosnąć nawet o 10%. + 随着武器的过热,其射速最多增加10%。 + 과열될수록 발사속도가 최대 10%까지 올라갑니다. + Según se calienta el arma, su cadencia de tiro aumenta hasta un 10%. Jam Chance Coefficient 弾詰まり係数 + Coefficient du risque d'enrayement + Шанс заклинивания оружия + Koeffizient für Ladehemmung + Szansa na zacięcie + 卡弹概率系数 + 기능고장 확률 계수 + Coeficiente de posibilidad de encasquillamiento Coefficient for the chance that a weapon will jam from overheating.\nHigher value make jams more likely.\nSet to 0 to disable jamming. 武器が過熱によって弾詰まりする確立係数を設定します。\n高い値では弾詰まりが起こりやすくなり、0 で弾詰まりが無効化されます。 + Coefficient modifiant les chances qu'une arme s'enraye à cause de la surchauffe.\nPlus la valeur est élevée, plus grand est le risque que l'arme s'enraye.\nDéfinir à 0 pour désactiver l'enrayement des armes. + Шанс заклинивания оружия от перегрева.\nБольшие значения повышают шанс заклинивания.\nУстановите 0 для отключения заклинивания. + Koeffizient für die Wahrscheinlichkeit, dass eine Waffe eine Ladehemmung hat.\Höhere Werte erhöhen die Wahrscheinlichkeit.\Auf 0 setzen, um Ladehemmungen zu deaktivieren. + Współczynnik zmieniający szansę na zacięcie się broni z powodu przegrzania.\nIm wyższa wartość, tym większe ryzyko zacięcia się broni.\nUstaw na 0, aby wyłączyć zacinanie się broni. + 武器因过热而卡弹的概率系数。\n数值越高,卡住的可能性越大。\n设置为0以禁用卡弹。 + 과열로 인해 얼마나 고장나는지에 대한 계수를 정합니다.\n높을 수록 더 고장이 잘납니다.\n0으로 설정하면 고장이 일어나지 않습니다. + Coeficiente de posibilidad de que un arma se encasquille debido al sobrecalentamiento.\nValores más altos hacen más posible que se encasquille.\n Establecer a 0 para deshabilitar el encasquillamiento. Unjam Weapon on Reload @@ -217,7 +314,7 @@ Desemperrar arma no recarregamento Исправлять клин при перезарядке 再装填による弾詰りの解消 - 재장전시 탄걸림 해결 + 재장전 시 기능고장 해결 重装弹匣以解决卡弹 重裝彈匣以解決卡彈 Távolítsa el az akadályt újratöltéskor @@ -233,7 +330,7 @@ Recarregar desemperra arma. Перезарядка устраняет заклинивание оружия. 再装填により、弾詰りを除去します。 - 탄걸림이 재장전시 해결됩니다. + 기능고장이 재장전 시 해결됩니다. 利用重装弹匣来解决卡弹 利用重裝彈匣來解決卡彈 Az újratöltés megszünteti a fegyver elakadását. @@ -241,10 +338,24 @@ Unjam on Barrel Swap 銃身交換で弾詰まり解消 + Désenrayer l'arme au changement de canon + Замена ствола устраняет клин оружия + Usuń zacięcie przy wymianie lufy + 更换枪管清除卡弹 + 총열 교환 시 기능고장 해결 + Ladehemmung beim Wechseln des Laufes beheben. + Desencasquillar con el cambio de cañón Controls whether swapping barrels clears a weapon jam. 銃身を交換して弾詰まりの解消をできるようにします。 + Les armes se désenrayent lors d'un remplacement de canon. + Определяет, устраняет ли замена ствола заклинивание оружия. + Bestimmt, ob das Wechseln des Laufes eine Ladehemmung behebt. + Określa, czy wymiana lufy usuwa zacięcie się broni. + 通过更换枪管,以便清除卡弹。 + 총열을 교체하면서 기능고장을 해결합니다. + Controla si cambiar el cañón del arma la desencasquilla. Chance of Unjam Failing @@ -257,7 +368,7 @@ Chance de falha de desemperramento Шанс неудачи при устранении клина 弾詰りの除去を失敗する可能性 - 탄걸림 해결 시도 실패확률 + 기능고장 해결 시도 실패확률 解决卡弹失败机率 解決卡彈失敗機率 Akadály eltávolítás hibájának esélye @@ -273,7 +384,7 @@ Вертоятность того, что устранение заклинивания не сработает, и его придется повторить. Pravděpodobnost, že uvolnění zbraně selže, je proto nutné tuto akci opakovat. 弾詰りの除去を失敗する可能性が生まれ、もう一度動作を行う必要があります。 - 탄걸림 해결 시도시 실패할 확률이 있습니다. 이는 다시 탄걸림 해결을 시도해야함을 의미합니다. + 기능고장 해결 시도시 실패할 확률이 있습니다. 이는 다시 기능고장 해결을 시도해야함을 의미합니다. 清除卡弹时有可能会失败,需要反覆进行清枪。 清除卡彈時有可能會失敗,需要反覆進行清槍。 Valószínűsége annak, hogy egy akadály eltávolítás művelet kudarcot vall, megismétlést igényel. @@ -281,10 +392,24 @@ Overheating Cookoff Coefficient 過熱誘爆係数 + Coefficient de l'auto-inflammation + Коэф. возгорания при перегреве + Selbstzündungskoeffizient bei Überhitzung + Współczynnik samozapłonu + 过热诱发系数 + 과열 쿡오프 계수 + Coeficiente para detonación inducida por calor debido a sobrecalentamiento Coefficient for the heat required for cookoffs to occur.\nHigher values require more heat to cookoff.\nSet to 0 to disable cookoff. 過熱によって誘爆が起きる確立係数を設定します。\n高い値では誘爆までに必要な過熱量が増加し、0 で誘爆が無効化されます。 + Coefficient modifiant la quantité de chaleur requise pour que les munitions s'auto-inflamment dans la chambre de l'arme.\nPlus la valeur est élevée, plus l'arme doit être chaude pour que les munitions s'auto-inflamment.\nDéfinir sur 0 pour désactiver l'auto-inflammation. + Коэффициент нагрева, при котором возникает возгорание. + Koeffizient für die zum Selbstzünden erforderliche Hitze.\nHöhere Werte erfordern mehr Hitze zum Selbstzünden.\nAuf 0 setzen, um das Selbstzünden zu deaktivieren. + Współczynnik modyfikujący ilość ciepła wymaganego do samozapłonu amunicji w komorze broni.\nIm wyższa wartość, tym gorętsza musi być broń, aby amunicja uległa samozapłonowi\nUstaw 0, aby wyłączyć samozapłon. + 发生热诱发的过热系数。\n数值越高,热诱发所需要的过热值越高。\n设置为0禁用热诱发。 + 쿡오프가 되기 위해 얼마나 과열되는가를 결정합니다. \n높을 수록 쿡오프 되기위해 더 뜨거운 열을 필요로 합니다.\n 0으로 설정하면 쿡오프 현상이 없어집니다. + Coeficiente para el calor requerido para que suceda la detonación inducida por calor.\nValores más altos requieren más calor para que se produzca.\nEstablecer a 0 para deshabilitar la detonación inducida por calor. Spare barrel @@ -314,7 +439,7 @@ Use para trocar o cano/estriamento. Usata per cambiare la canna. 予身の交換に使用します。 - 총열을 바꿀때 사용합니다. + 총열을 바꿀 때 사용합니다. 用来更换枪管 用來更換槍管 @@ -330,29 +455,64 @@ Arma travada! Arma inceppata! 武器が詰まった! - 탄걸림! - 武器卡弹! + 기능고장! + 武器卡弹! 武器卡彈! Weapon cooked off! 武器が誘爆した! + Auto-inflammation des munitions ! + Оружие сдетонировало! + Munition durchgezündet! + Samozapłon amunicji! + 武器发生热诱发! + 쿡오프가 일어납니다! + Arma disparada por sobrecalentamiento! Failure to eject. 排莢に失敗しました。 + Défaut d'éjection. + Не удалось достать. + Hülse wurde nicht ausgeworfen. + Nie udało się wyrzucić łuski. + 抛壳失败。 + 탄피가 약실에 낌. + Fallo en la expulsión. Failure to extract. 排出に失敗しました。 + Défaut d'extraction. + Не удалось извлечь. + Hülse wurde nicht ausgezogen. + Nie udało się wyjąć łuski. + 抽壳失败。 + 탄피가 배출되지 않음. + Fallo en la extracción. Failure to feed. 給弾に失敗しました。 + Défaut d'alimentation. + Не удалось подать. + Patrone wurde nicht zugeführt. + Nie udało się załadować naboju. + 供弹失败。 + 탄이 장전 중 걸림. + Fallo en la alimentación. Failure to fire. 撃発に失敗しました。 + Défaut de tir. + Не удалось выстрелить. + Patrone wurde nicht gezündet! + Nie udało się strzelić. + 未能开火。 + 발사가 되지 않음. + Fallo al disparar. Clear jam @@ -366,7 +526,7 @@ Destravar arma Ripulisci l'arma 弾詰りを除去する - 탄걸림 해결 + 기능고장 해결 清除卡弹 清除卡彈 @@ -382,7 +542,7 @@ Arma destravada Arma pronta al fuoco 弾詰りが除去されました - 탄걸림 해결됨 + 기능고장 해결됨 卡弹已清除 卡彈已清除 @@ -397,7 +557,7 @@ Falha no desemperramento Не удалось исправить клин 弾詰りの除去に失敗しました - 탄걸림 해결 실패 + 기능고장 해결 실패 卡弹未能清除 卡彈未能清除 @@ -429,7 +589,7 @@ Substituindo cano... Sostituendo la canna... 銃身を交換しています・・・ - 총열 교체중... + 총열 교체 중... 正在更换枪管... 換槍管中... @@ -493,7 +653,7 @@ Controllando la temperatura... Проверка температуры... 温度を測っています・・・ - 무기 온도 확인중... + 무기 온도 확인 중... 正在检查枪管温度... 檢查槍管溫度中... @@ -522,7 +682,7 @@ 予備銃身の温度を測っています・・・ Sprawdzanie temperatury zapasowych luf... Prüfe Temperatur der Wechselläufe ... - 총열 온도 확인중... + 총열 온도 확인 중... Controllando la temperatura della canna di ricambio... 正在检查枪管温度... 檢查槍管溫度中... @@ -530,26 +690,68 @@ Cool weapon with... 次で武器を冷ます・・・ + Refroidir l'arme avec... + Охладить оружие с... + Waffe mit... kühlen + Schłódź broń za pomocą... + 冷却武器... + 무기 온도 낮추기 + Enfriar arma con... Cooling %1 with %2. %1 を %2 で冷ましています。 + Refroidissement du %1 avec %2... + Охлаждение %1 с %2. + Kühle %1 mit %2. + Chłodzenie %1 za pomocą %2. + 冷却 %1 至 %2。 + %1을 %2로 식히는 중. + Enfriando %1 con %2. Cool weapon in water source. 水源で武器を冷ます + Refroidir l'arme dans la source d'eau. + Охладить оружие в воде. + Kühle Waffe aus Wasserquelle. + Schłódź broń wodą. + 用水源冷却武器。 + 물로 무기 식히기 + Enfriar arma con agua. Cooling weapon in water source. 水源で武器を冷ましています・・・ + Refroidissement de l'arme dans la source d'eau... + Охлаждение оружия в воде. + Waffe wird aus Wasserquelle gekühlt. + Chłodzenie broni wodą. + 在水源中冷却武器。 + 물로 무기 식히는 중. + Enfriando arma con agua... Container doesn't have enough water. 水源には十分な水量がありません。 + Le récipient ne contient pas suffisamment d'eau. + Воды недостаточно для охлаждения. + Behälter beinhaltet nicht genug Wasser. + Zbiornik nie ma wystarczającej ilości wody + 容器里的水不够。 + 물이 충분치 않습니다. + El contenedor no tiene suficiente agua. Weapon is cool enough the water has stopped boiling. 武器が冷まりきり、水が沸騰していません。 + L'arme est suffisamment froide pour que l'eau ait cessé de bouillir. + Оружие достаточно холодное для прекращения кипения воды. + Waffe ist kalt genug, dass Wasser hat aufgehört zu kochen. + Broń jest wystarczająco schłodzona. Woda przestała się gotować. + 武器已经冷却,水已经停止沸腾了。 + 물이 끓지 않는 걸 보아 무기가 식은듯 하다. + El arma está lo suficientemente fría para no hacer hervir el agua. Temperature @@ -639,7 +841,7 @@ Extrem heiße Wechselläufe 엄청나게 뜨거운 예비 총열 Canna/e di Ricambio Rovente - 备用枪管温度超级热 + 备用枪管温度非常热 備用槍管溫度超級熱 diff --git a/addons/overpressure/CfgWeapons.hpp b/addons/overpressure/CfgWeapons.hpp index 1f0814a487..7102e84d1b 100644 --- a/addons/overpressure/CfgWeapons.hpp +++ b/addons/overpressure/CfgWeapons.hpp @@ -7,6 +7,7 @@ class CfgWeapons { GVAR(angle) = 60; GVAR(range) = 10; GVAR(damage) = 0.7; + GVAR(offset) = 1; }; class Launcher_Base_F: Launcher {}; @@ -16,6 +17,7 @@ class CfgWeapons { GVAR(angle) = 40; GVAR(range) = 8; GVAR(damage) = 0.5; + GVAR(offset) = 1; }; class launch_Titan_short_base: launch_Titan_base { @@ -24,6 +26,7 @@ class CfgWeapons { GVAR(angle) = 30; GVAR(range) = 2; GVAR(damage) = 0.5; + GVAR(offset) = 0.85; }; class launch_NLAW_F: Launcher_Base_F { @@ -32,6 +35,7 @@ class CfgWeapons { GVAR(angle) = 30; GVAR(range) = 2; GVAR(damage) = 0.6; + GVAR(offset) = 1.05; }; class launch_RPG32_F: Launcher_Base_F { @@ -39,6 +43,22 @@ class CfgWeapons { GVAR(angle) = 60; GVAR(range) = 15; GVAR(damage) = 0.7; + GVAR(offset) = 1.2; + }; + + class launch_MRAWS_base_F: Launcher_Base_F { + GVAR(range) = 15; + GVAR(offset) = 1.05; + }; + + class launch_Vorona_base_F: Launcher_Base_F { + GVAR(angle) = 50; + GVAR(offset) = 0.88; + }; + + class launch_RPG7_F: Launcher_Base_F { + GVAR(angle) = 40; + GVAR(offset) = 0.9; }; class CannonCore; diff --git a/addons/overpressure/XEH_PREP.hpp b/addons/overpressure/XEH_PREP.hpp index 1efd39d6e5..9d1e8e9725 100644 --- a/addons/overpressure/XEH_PREP.hpp +++ b/addons/overpressure/XEH_PREP.hpp @@ -1,6 +1,5 @@ - PREP(getDistance); PREP(overpressureDamage); -PREP(cacheOverPressureValues); +PREP(getOverPressureValues); PREP(firedEHOP); PREP(firedEHBB); diff --git a/addons/overpressure/XEH_postInit.sqf b/addons/overpressure/XEH_postInit.sqf index bf3758ab3d..46fe460268 100644 --- a/addons/overpressure/XEH_postInit.sqf +++ b/addons/overpressure/XEH_postInit.sqf @@ -9,4 +9,6 @@ // Register fire event handler ["ace_firedPlayer", LINKFUNC(firedEHBB)] call CBA_fnc_addEventHandler; ["ace_firedPlayerVehicle", LINKFUNC(firedEHOP)] call CBA_fnc_addEventHandler; + + GVAR(cacheHash) = createHashMap; }] call CBA_fnc_addEventHandler; diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf deleted file mode 100644 index 7e984f993c..0000000000 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ /dev/null @@ -1,57 +0,0 @@ -#include "script_component.hpp" -/* - * Author: joko // Jonas - * Cache the shot data for a given weapon/mag/ammo combination. - * Will use the config that has the highest priority. - * - * Arguments: - * 0: Weapon - * 1: Magazine - * 2: Ammo - * - * Return Value: - * Shot Config : - * 0: Angle - * 1: Range - * 2: Damage - * - * Example: - * ["cannon_125mm","Sh_125mm_APFSDS_T_Green","24Rnd_125mm_APFSDS_T_Green"] call ace_overpressure_fnc_cacheOverPressureValues - * - * Public: No - */ - -params ["_weapon", "_ammo", "_magazine"]; -TRACE_3("Parameter",_weapon,_magazine,_ammo); - -// get Priority Array from Config -private _array = [ - getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(priority)), - getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(priority)), - getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(priority)) -]; - -(_array call CBA_fnc_findMax) params ["", ["_indexOfMaxPriority", 0, [0]]]; - -TRACE_2("Priority Array",_array,_indexOfMaxPriority); - -// create the Config entry Point -private _config = [ - (configFile >> "CfgWeapons" >> _weapon), - (configFile >> "CfgMagazines" >> _magazine), - (configFile >> "CfgAmmo" >> _ammo) -] select _indexOfMaxPriority; -TRACE_1("ConfigPath",_config); - -// get the Variables out of the Configes and create a array with then -private _return = [ - (getNumber (_config >> QGVAR(angle))), - (getNumber (_config >> QGVAR(range))) * GVAR(distanceCoefficient), - (getNumber (_config >> QGVAR(damage))) -]; - -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -missionNameSpace setVariable [_varName, _return]; -TRACE_2("Return",_varName,_return); - -_return diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 2d1d0f783c..53620da7b2 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas * Handle fire of local launchers. Called from the unified fired EH only for the local player. @@ -18,20 +18,16 @@ //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); -// Bake variable name and check if the variable exists, call the caching function otherwise -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -private _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); -} else { - missionNameSpace getVariable _varName; -}; -_var params ["_backblastAngle","_backblastRange","_backblastDamage"]; -TRACE_3("cache",_backblastAngle,_backblastRange,_backblastDamage); +// Retrieve backblast values +private _bbValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues); + +_bbValues params ["_backblastAngle", "_backblastRange", "_backblastDamage", "_offset"]; +TRACE_4("cache",_backblastAngle,_backblastRange,_backblastDamage,_offset); if (_backblastDamage <= 0) exitWith {}; -private _position = getPosASL _projectile; private _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); +private _position = ((getPosASL _projectile) vectorAdd (_direction vectorMultiply _offset)); // Damage to others private _affected = (ASLtoAGL _position) nearEntities ["CAManBase", _backblastRange]; @@ -45,18 +41,23 @@ private _distance = 2 * ([_position, _direction, _backblastRange, _unit] call FU TRACE_1("Distance",_distance); if (_distance < _backblastRange) then { - private _alpha = sqrt (1 - _distance / _backblastRange); - private _beta = sqrt 0.5; + TRACE_2("",isDamageAllowed _unit,_unit getVariable [ARR_2(QEGVAR(medical,allowDamage),true)]); - private _damage = _alpha * _beta * _backblastDamage; - [_damage * 100] call BIS_fnc_bloodEffect; + // Skip damage if not allowed + if (isDamageAllowed _unit && {_unit getVariable [QEGVAR(medical,allowDamage), true]}) then { + private _alpha = sqrt (1 - _distance / _backblastRange); + private _beta = sqrt 0.5; - 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 - _unit setDamage (damage _unit + _damage); + private _damage = _alpha * _beta * _backblastDamage; + TRACE_1("",_damage); + + [_damage * 100] call BIS_fnc_bloodEffect; + + if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { + [_unit, _damage, "body", "backblast", _unit] call EFUNC(medical,addDamageToUnit); + } else { + _unit setDamage (damage _unit + _damage); + }; }; }; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index 5871fae9b8..7a76f4b2be 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas * Handle fire of Vehicle Weapons. Called from the unified fired EH only for the local player vehicle. @@ -18,20 +18,14 @@ //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); -// Bake variable name and check if the variable exists, call the caching function otherwise -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -private _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); -} else { - missionNameSpace getVariable _varName; -}; -_var params ["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; +// Retrieve overpressure values +private _opValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues); + +_opValues params ["_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; TRACE_3("cache",_dangerZoneAngle,_dangerZoneRange,_dangerZoneDamage); if (_dangerZoneDamage <= 0) exitWith {}; - - // The weapon produces overpressure, calculate private _position = getPosASL _projectile; private _direction = vectorDir _projectile; diff --git a/addons/overpressure/functions/fnc_getDistance.sqf b/addons/overpressure/functions/fnc_getDistance.sqf index 3e36a3ea78..891178cb52 100644 --- a/addons/overpressure/functions/fnc_getDistance.sqf +++ b/addons/overpressure/functions/fnc_getDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 and esteldunedain * Calculate the distance to the first intersection of a line diff --git a/addons/overpressure/functions/fnc_getOverPressureValues.sqf b/addons/overpressure/functions/fnc_getOverPressureValues.sqf new file mode 100644 index 0000000000..4372d4c8e6 --- /dev/null +++ b/addons/overpressure/functions/fnc_getOverPressureValues.sqf @@ -0,0 +1,65 @@ +#include "..\script_component.hpp" +/* + * Author: joko // Jonas + * Cache the shot data for a given weapon/mag/ammo combination. + * Will use the config that has the highest priority. + * + * Arguments: + * 0: Weapon + * 1: Magazine + * 2: Ammo + * + * Return Value: + * Shot Config : + * 0: Angle + * 1: Range + * 2: Damage + * 3: Offset + * + * Example: + * ["cannon_125mm","Sh_125mm_APFSDS_T_Green","24Rnd_125mm_APFSDS_T_Green"] call ace_overpressure_fnc_getOverPressureValues + * + * Public: No + */ + +params ["_weapon", "_ammo", "_magazine"]; +TRACE_3("Parameter",_weapon,_magazine,_ammo); + +// Check cache for weapon/ammo/mag combo +private _return = GVAR(cacheHash) get _this; +if (!isNil "_return") exitWith { + TRACE_3("CacheHit",_weapon,_magazine,_ammo); + _return +}; + +// get Priority Array from Config +private _array = [ + getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(priority)), + getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(priority)), + getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(priority)) +]; + +(_array call CBA_fnc_findMax) params ["", ["_indexOfMaxPriority", 0, [0]]]; + +TRACE_2("Priority Array",_array,_indexOfMaxPriority); + +// create the Config entry Point +private _config = [ + (configFile >> "CfgWeapons" >> _weapon), + (configFile >> "CfgMagazines" >> _magazine), + (configFile >> "CfgAmmo" >> _ammo) +] select _indexOfMaxPriority; +TRACE_1("ConfigPath",_config); + +// get the Variables out of the Configs and populate return array with them +_return = [ + (getNumber (_config >> QGVAR(angle))), + (getNumber (_config >> QGVAR(range))) * GVAR(distanceCoefficient), + (getNumber (_config >> QGVAR(damage))), + (getNumber (_config >> QGVAR(offset))) +]; + +GVAR(cacheHash) set [_this, _return]; +TRACE_2("Return",_this,_return); + +_return diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 119c19ebb2..2fd0c0f7e5 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 and esteldunedain * Calculate and apply backblast damage to potentially affected local units @@ -23,14 +23,10 @@ params ["_firer", "_posASL", "_direction", "_weapon", "_magazine", "_ammo"]; -// Bake variable name and check if the variable exists, call the caching function otherwise -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -private _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); -} else { - missionNameSpace getVariable _varName; -}; -_var params ["_overpressureAngle","_overpressureRange","_overpressureDamage"]; +// Retrieve overpressure values +private _opValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues); + +_opValues params ["_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); { @@ -46,19 +42,22 @@ TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); TRACE_4("Affected:",_x,_axisDistance,_distance,_angle); if (_angle < _overpressureAngle && {_distance < _overpressureRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { + TRACE_2("",isDamageAllowed _unit,_unit getVariable [ARR_2(QEGVAR(medical,allowDamage),true)]); - private _alpha = sqrt (1 - _distance / _overpressureRange); - private _beta = sqrt (1 - _angle / _overpressureAngle); - - private _damage = _alpha * _beta * _overpressureDamage; - TRACE_1("",_damage); - - // If the target is the ACE_player - if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - - TRACE_1("",isDamageAllowed _x); + // Skip damage if not allowed if (isDamageAllowed _x && {_x getVariable [QEGVAR(medical,allowDamage), true]}) then { - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + private _alpha = sqrt (1 - _distance / _overpressureRange); + private _beta = sqrt (1 - _angle / _overpressureAngle); + + private _damage = _alpha * _beta * _overpressureDamage; + TRACE_1("",_damage); + + // If the target is the ACE_player + if (_x isEqualTo ACE_player) then { + [_damage * 100] call BIS_fnc_bloodEffect; + }; + + if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { [_x, _damage, "body", "backblast", _firer] call EFUNC(medical,addDamageToUnit); } else { _x setDamage (damage _x + _damage); diff --git a/addons/overpressure/functions/script_component.hpp b/addons/overpressure/functions/script_component.hpp deleted file mode 100644 index d66ac7aec3..0000000000 --- a/addons/overpressure/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\overpressure\script_component.hpp" \ No newline at end of file diff --git a/addons/overpressure/initSettings.sqf b/addons/overpressure/initSettings.sqf index df93c5ac3a..7fe6401131 100644 --- a/addons/overpressure/initSettings.sqf +++ b/addons/overpressure/initSettings.sqf @@ -1,7 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(DisplayName)]; + [ QGVAR(distanceCoefficient), "SLIDER", [LSTRING(distanceCoefficient_displayName), LSTRING(distanceCoefficient_toolTip)], - "ACE Uncategorized", - [-1, 10, 5, 1], + _category, + [-1, 10, 1, 1], 1 ] call CBA_fnc_addSetting; diff --git a/addons/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml index c5683598e2..ab58e14027 100644 --- a/addons/overpressure/stringtable.xml +++ b/addons/overpressure/stringtable.xml @@ -1,17 +1,27 @@ + + Overpressure + 超压 + Überdruck + 과중압력 + Nadciśnienie + 過圧 + Перегрузка + Sobrepresiòn + Overpressure Distance Coefficient Überdruckentfernungskoeffizient 過圧の距離係数 - 초과압력 거리 계수 + 과중압력 거리 계수 Mnożnik dystansu nadciśnienia 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 @@ -21,11 +31,11 @@ Scales the overpressure effect [Default: 1] Stellt den Koeffizient für die Überdruckentfernung ein [Standard: 1] 過圧効果の範囲 [標準: 1] - 초과압력의 효과 크기 [기본설정: 1] + 과중압력의 효과 크기 [기본설정: 1] Skaluje efekt nadciśnienia [Domyślne: 1] Ajuste l'effet de surpression. Valeur par défaut : 1. Scala l'effetto di sovrapressione [Predefinito: 1] - 高压影响的范围 [预设: 1] + 超压影响的范围 [预设:1] 高壓影響的範圍 [預設: 1] Степень зависимости избыточного давления от расстояния [По умолчанию: 1] Escala o efeito de sobrepressão [Padrão: 1] @@ -47,6 +57,7 @@ Portée du backblast Dosah zpětné tlakové vlny (backblast) Alcance del cono de fuego + 후폭풍 거리 Backblast angle @@ -62,6 +73,7 @@ Angle du backblast Úhel zpětné tlakové vlny (backblast) Ángulo del cono de fuego + 후폭풍 각도 diff --git a/addons/parachute/RscTitles.hpp b/addons/parachute/RscTitles.hpp index 277db4d2f9..9e0a169937 100644 --- a/addons/parachute/RscTitles.hpp +++ b/addons/parachute/RscTitles.hpp @@ -13,37 +13,37 @@ class RscTitles { class AltimeterImage: RscPicture { idc = 1200; text = QPATHTOF(UI\watch_altimeter.paa); - x = 0.118437 * safezoneW + safezoneX; - y = 0.621 * safezoneH + safezoneY; - w = 0.20625 * safezoneW; - h = 0.341 * safezoneH; + x = "0.118437 * safezoneW + safezoneX"; + y = "0.621 * safezoneH + safezoneY"; + w = "0.20625 * safezoneW"; + h = "0.341 * safezoneH"; }; class HeightText: RscText { idc = 1100; text = "----"; - x = 0.200937 * safezoneW + safezoneX; - y = 0.764 * safezoneH + safezoneY; - w = 0.04125 * safezoneW; - h = 0.033 * safezoneH; + x = "0.200937 * safezoneW + safezoneX"; + y = "0.764 * safezoneH + safezoneY"; + w = "0.04125 * safezoneW"; + h = "0.033 * safezoneH"; colorBackground[] = {0,0,0,0}; colorText[] = {0,0,0,1}; }; class DecendRate: RscText { idc = 1000; text = "--"; - x = 0.21125 * safezoneW + safezoneX; - y = 0.742 * safezoneH + safezoneY; - w = 0.020625 * safezoneW; - h = 0.022 * safezoneH; + x = "0.21125 * safezoneW + safezoneX"; + y = "0.742 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.022 * safezoneH"; colorText[] = {0,0,0,1}; }; class TimeText: RscText { idc = 1001; text = "00:00"; - x = 0.206094 * safezoneW + safezoneX; - y = 0.819 * safezoneH + safezoneY; - w = 0.0309375 * safezoneW; - h = 0.022 * safezoneH; + x = "0.206094 * safezoneW + safezoneX"; + y = "0.819 * safezoneH + safezoneY"; + w = "0.0309375 * safezoneW"; + h = "0.022 * safezoneH"; colorText[] = {0,0,0,1}; }; }; diff --git a/addons/parachute/XEH_preInit.sqf b/addons/parachute/XEH_preInit.sqf index ee8e31486b..cb77025b4d 100644 --- a/addons/parachute/XEH_preInit.sqf +++ b/addons/parachute/XEH_preInit.sqf @@ -8,23 +8,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -[ - QGVAR(hideAltimeter), - "CHECKBOX", - [LSTRING(HideAltimeter), LSTRING(HideAltimeter_tooltip)], - ["ACE Uncategorized", localize "str_dn_parachute"], - true, - false, - {[QGVAR(hideAltimeter), _this, false] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_fnc_addSetting; - -[ - QGVAR(failureChance), - "SLIDER", - LSTRING(FailureChance), - ["ACE Uncategorized", localize "str_dn_parachute"], - [0, 1, 0, 2, true], - 1 -] call CBA_fnc_addSetting; +#include "initSettings.sqf" ADDON = true; diff --git a/addons/parachute/functions/fnc_cutParachute.sqf b/addons/parachute/functions/fnc_cutParachute.sqf index 711a8ddb80..564a9e09cd 100644 --- a/addons/parachute/functions/fnc_cutParachute.sqf +++ b/addons/parachute/functions/fnc_cutParachute.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: joko, Jonas, SilentSpike + * Author: joko, Jonas, kymckay * Perform the cut parachute action (move unit out and delete) * * Arguments: diff --git a/addons/parachute/functions/fnc_handleFailureChance.sqf b/addons/parachute/functions/fnc_handleFailureChance.sqf index e5ec0b5cde..a84817eef1 100644 --- a/addons/parachute/functions/fnc_handleFailureChance.sqf +++ b/addons/parachute/functions/fnc_handleFailureChance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: JoramD * Handles percentage chance parachute failure. diff --git a/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf b/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf index f1589e1e04..44bf81deb8 100644 --- a/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf +++ b/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Hides the height and velocity display while freefalling or parachuting on higher difficulties. diff --git a/addons/parachute/functions/fnc_handleReserve.sqf b/addons/parachute/functions/fnc_handleReserve.sqf index 3df8d6607e..dd7ba04213 100644 --- a/addons/parachute/functions/fnc_handleReserve.sqf +++ b/addons/parachute/functions/fnc_handleReserve.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: joko, Jonas, SilentSpike + * Author: joko, Jonas, kymckay * Cache reserve parachute on player unit when their inventory changes and add it when they open their parachute * * Arguments: @@ -16,10 +16,10 @@ */ params ["_unit"]; -private _backpack = backpack _unit; +private _backpack = backpackContainer _unit; if ( - _backpack == "" && + isNull _backpack && {(vehicle _unit) isKindOf "ParachuteBase"} && {GETVAR(_unit,GVAR(hasReserve),false)} ) then { @@ -28,7 +28,7 @@ if ( SETVAR(vehicle _unit,GVAR(canCut),true); // Mark the parachute cuttable since reserve is present } else { // Case where inventory has changed otherwise (including when reserve is added) - private _backpackCfg = configFile >> "CfgVehicles" >> _backpack; + private _backpackCfg = configOf _backpack; private _hasReserve = getNumber (_backpackCfg >> "ace_hasReserveParachute") == 1; // Cache reserve parachute state and class when backpack changes diff --git a/addons/parachute/functions/fnc_hideAltimeter.sqf b/addons/parachute/functions/fnc_hideAltimeter.sqf index 280ee286b4..fc53f533d3 100644 --- a/addons/parachute/functions/fnc_hideAltimeter.sqf +++ b/addons/parachute/functions/fnc_hideAltimeter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Removes the altimeter from the screen. diff --git a/addons/parachute/functions/fnc_showAltimeter.sqf b/addons/parachute/functions/fnc_showAltimeter.sqf index e31d2863eb..47b014f4ab 100644 --- a/addons/parachute/functions/fnc_showAltimeter.sqf +++ b/addons/parachute/functions/fnc_showAltimeter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet * Displays the altimeter on screen. @@ -32,12 +32,12 @@ private _TimeText = _display displayCtrl 1001; _args params ["_unit", "_oldHeight", "_prevTime", "_HeightText", "_DecendRate", "_TimeText"]; if !(GVAR(AltimeterActive)) exitWith { - _pfhID call CBA_fnc_removePerFrameEventHandler; + _pfhID call CBA_fnc_removePerFrameHandler; }; if !("ACE_Altimeter" in assignedItems _unit) exitWith { call FUNC(hideAltimeter); - _pfhID call CBA_fnc_removePerFrameEventHandler; + _pfhID call CBA_fnc_removePerFrameHandler; }; private _hour = floor daytime; diff --git a/addons/parachute/functions/script_component.hpp b/addons/parachute/functions/script_component.hpp deleted file mode 100644 index 29f2e63e07..0000000000 --- a/addons/parachute/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\parachute\script_component.hpp" diff --git a/addons/parachute/initSettings.sqf b/addons/parachute/initSettings.sqf new file mode 100644 index 0000000000..0cfc3f8ca0 --- /dev/null +++ b/addons/parachute/initSettings.sqf @@ -0,0 +1,20 @@ +private _category = [LELSTRING(common,categoryUncategorized), localize "str_dn_parachute"]; + +[ + QGVAR(hideAltimeter), + "CHECKBOX", + [LSTRING(HideAltimeter), LSTRING(HideAltimeter_tooltip)], + _category, + true, + false, + {[QGVAR(hideAltimeter), _this, false] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; + +[ + QGVAR(failureChance), + "SLIDER", + LSTRING(FailureChance), + _category, + [0, 1, 0, 2, true], + 1 +] call CBA_fnc_addSetting; diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index fd937d70e5..90a64ce39d 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -47,7 +47,7 @@ Usato per mostrare l'altitudine, la velocità di discesa e l'ora. Usado para mostrar altura, taxa de descida e o tempo. 高度や降下率、時間を見るのに使います。 - 높이와, 하강속도 그리고 시간을 보여줍니다. + 높이, 하강속도 그리고 시간을 보여줍니다. 用于显示高度,下降率和时间。 用於顯示高度,下降率和時間 Yüksekliği, alçalma hızını ve zamanı göstermek için kullanılır. @@ -64,7 +64,7 @@ Paracadute non manovrabile Para-querdas não controlável 非操作型パラシュート - 비-조종 낙하산 + 비조종 낙하산 非可操控降落伞 非可操控降落傘 Yönlendirilemez Paraşüt @@ -117,6 +117,7 @@ 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. @@ -132,6 +133,7 @@ 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. + 강하 시 고도와 속도를 보여주지 않습니다. Parachute Failure Chance @@ -139,6 +141,10 @@ Chance de défaillance du parachute 開傘失敗率 Szansa na nieotwarcie się spadochronu + Wahrscheinlichkeit, dass ein Fallschirm sich nicht öffnet + 开伞失败率 + 낙하산 펼치기 실패 확률 + Probabilidad de fallo de paracaidas diff --git a/addons/pylons/XEH_postInit.sqf b/addons/pylons/XEH_postInit.sqf index 3e0b9bb4f0..3167c0a838 100644 --- a/addons/pylons/XEH_postInit.sqf +++ b/addons/pylons/XEH_postInit.sqf @@ -14,10 +14,9 @@ GVAR(loadoutAction) = [ // create action 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; + _vehicles findIf {getNumber ((configOf _x) >> "transportAmmo") > 0} != -1; }; - + (_isRearmVehicle && {[ace_player, _target] call FUNC(canConfigurePylons)}) } ] call EFUNC(interact_menu,createAction); @@ -27,7 +26,7 @@ GVAR(loadoutAction) = [ // create action private _typeOf = typeOf _vehicle; if (_typeOf in GVAR(aircraftWithPylons)) exitWith {}; - if (!isClass (configFile >> "CfgVehicles" >> _typeOf >> 'Components' >> 'TransportPylonsComponent')) exitWith {}; + if (!isClass ((configOf _vehicle) >> 'Components' >> 'TransportPylonsComponent')) exitWith {}; GVAR(aircraftWithPylons) pushBack _typeOf; [_typeOf, 0, ["ACE_MainActions"], GVAR(loadoutAction)] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/pylons/functions/fnc_canConfigurePylons.sqf b/addons/pylons/functions/fnc_canConfigurePylons.sqf index 546d3e6766..56584a306b 100644 --- a/addons/pylons/functions/fnc_canConfigurePylons.sqf +++ b/addons/pylons/functions/fnc_canConfigurePylons.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Checks if given unit can access the pylon configuration dialog for the given aircraft. diff --git a/addons/pylons/functions/fnc_configurePylons.sqf b/addons/pylons/functions/fnc_configurePylons.sqf index 81313ce61e..fa3d54f011 100644 --- a/addons/pylons/functions/fnc_configurePylons.sqf +++ b/addons/pylons/functions/fnc_configurePylons.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Recursively shows the progress bar for each configured pylon. diff --git a/addons/pylons/functions/fnc_handleDisconnect.sqf b/addons/pylons/functions/fnc_handleDisconnect.sqf index 9bc3247415..d3a77def59 100644 --- a/addons/pylons/functions/fnc_handleDisconnect.sqf +++ b/addons/pylons/functions/fnc_handleDisconnect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Cleans up pylons on client disconnect. diff --git a/addons/pylons/functions/fnc_onButtonApply.sqf b/addons/pylons/functions/fnc_onButtonApply.sqf index 5603ed8d94..ee397ddd1e 100644 --- a/addons/pylons/functions/fnc_onButtonApply.sqf +++ b/addons/pylons/functions/fnc_onButtonApply.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Starts the pylon configuration. @@ -17,7 +17,7 @@ // Check for FRIES change private _checkbox = CONTROL(ID_DIALOG) ID_CHECKBOX_FRIES; -if (ctrlShown _checkbox && {!((cbChecked _checkbox) isEqualTo (_checkbox getVariable QGVAR(originalState)))}) then { +if (ctrlShown _checkbox && {(cbChecked _checkbox) isNotEqualTo (_checkbox getVariable QGVAR(originalState))}) then { if (cbChecked _checkbox) then { [GVAR(currentAircraft)] call EFUNC(fastroping,equipFRIES); } else { diff --git a/addons/pylons/functions/fnc_onButtonClose.sqf b/addons/pylons/functions/fnc_onButtonClose.sqf index c0f51e634a..95777de0cf 100644 --- a/addons/pylons/functions/fnc_onButtonClose.sqf +++ b/addons/pylons/functions/fnc_onButtonClose.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Handles the closing of the dialog. diff --git a/addons/pylons/functions/fnc_onButtonDelete.sqf b/addons/pylons/functions/fnc_onButtonDelete.sqf index eaf16cd99a..55c5a69ef2 100644 --- a/addons/pylons/functions/fnc_onButtonDelete.sqf +++ b/addons/pylons/functions/fnc_onButtonDelete.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Deletes the selected pylon configuration from profileNamespace. diff --git a/addons/pylons/functions/fnc_onButtonLoad.sqf b/addons/pylons/functions/fnc_onButtonLoad.sqf index f689c8bf82..3604a8273b 100644 --- a/addons/pylons/functions/fnc_onButtonLoad.sqf +++ b/addons/pylons/functions/fnc_onButtonLoad.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Loads selected pylon configuration from either config or profileNamespace. diff --git a/addons/pylons/functions/fnc_onButtonSave.sqf b/addons/pylons/functions/fnc_onButtonSave.sqf index 8f30ad1a58..022c614a80 100644 --- a/addons/pylons/functions/fnc_onButtonSave.sqf +++ b/addons/pylons/functions/fnc_onButtonSave.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Saves the selected pylon configuration to profileNamespace. diff --git a/addons/pylons/functions/fnc_onButtonTurret.sqf b/addons/pylons/functions/fnc_onButtonTurret.sqf index e6828bab99..2e1193e0e4 100644 --- a/addons/pylons/functions/fnc_onButtonTurret.sqf +++ b/addons/pylons/functions/fnc_onButtonTurret.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Handles init and click events of turret switch buttons. diff --git a/addons/pylons/functions/fnc_onComboSelChange.sqf b/addons/pylons/functions/fnc_onComboSelChange.sqf index aa71c65099..badf1a7794 100644 --- a/addons/pylons/functions/fnc_onComboSelChange.sqf +++ b/addons/pylons/functions/fnc_onComboSelChange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Handles various UI changes when a combobox' selection changes. diff --git a/addons/pylons/functions/fnc_onNameChange.sqf b/addons/pylons/functions/fnc_onNameChange.sqf index 70344baa80..653e1f678b 100644 --- a/addons/pylons/functions/fnc_onNameChange.sqf +++ b/addons/pylons/functions/fnc_onNameChange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Called when current loadout name is changed. diff --git a/addons/pylons/functions/fnc_onPylonMirror.sqf b/addons/pylons/functions/fnc_onPylonMirror.sqf index 949668ceb8..0dca961a42 100644 --- a/addons/pylons/functions/fnc_onPylonMirror.sqf +++ b/addons/pylons/functions/fnc_onPylonMirror.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Called when the "mirror" checkbox on the loadout dialog is checked. diff --git a/addons/pylons/functions/fnc_showDialog.sqf b/addons/pylons/functions/fnc_showDialog.sqf index 146238a1b7..a06cb6f114 100644 --- a/addons/pylons/functions/fnc_showDialog.sqf +++ b/addons/pylons/functions/fnc_showDialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Shows the aircraft loadout dialog for given aircraft. @@ -93,6 +93,8 @@ GVAR(comboBoxes) = []; { _combo lbAdd getText (configFile >> "CfgMagazines" >> _x >> "displayName"); _combo lbSetData [_forEachIndex + 1, _x]; + private _description = getText (configFile >> "CfgMagazines" >> _x >> "descriptionShort"); + _combo lbSetTooltip [_forEachIndex + 1, _description]; if (_x == _mag) then { _index = _forEachIndex + 1; diff --git a/addons/pylons/functions/script_component.hpp b/addons/pylons/functions/script_component.hpp deleted file mode 100644 index 62e8ea51a0..0000000000 --- a/addons/pylons/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\pylons\script_component.hpp" diff --git a/addons/pylons/menu.hpp b/addons/pylons/menu.hpp index 85ca6b1c95..143792e566 100644 --- a/addons/pylons/menu.hpp +++ b/addons/pylons/menu.hpp @@ -23,143 +23,143 @@ class GVAR(DialogLoadout) { class TextTitlebar: RscText { idc = ID_TEXT_TITLEBAR; text = CSTRING(AircraftLoadoutTitle); - x = 0.15835 * safezoneW + safezoneX; - y = 0.262 * safezoneH + safezoneY; - w = 0.68304 * safezoneW; - h = 0.028 * safezoneH; + x = "0.15835 * safezoneW + safezoneX"; + y = "0.262 * safezoneH + safezoneY"; + w = "0.68304 * safezoneW"; + h = "0.028 * safezoneH"; colorBackground[] = {"(profileNamespace getVariable ['GUI_BCG_RGB_R', 0.13])","(profileNamespace getVariable ['GUI_BCG_RGB_G', 0.54])","(profileNamespace getVariable ['GUI_BCG_RGB_B', 0.21])",1}; }; class BackgroundDialog: IGUIBack { idc = ID_BACKGROUND_DIALOG; - x = 0.15835 * safezoneW + safezoneX; - y = 0.29 * safezoneH + safezoneY; - w = 0.68304 * safezoneW; - h = 0.448 * safezoneH; + x = "0.15835 * safezoneW + safezoneX"; + y = "0.29 * safezoneH + safezoneY"; + w = "0.68304 * safezoneW"; + h = "0.448 * safezoneH"; colorBackground[] = {0,0,0,0.3}; }; class BackgroundPicture: IGUIBack { idc = ID_BACKGROUND_PICTURE; - x = 0.171616 * safezoneW + safezoneX; - y = 0.318 * safezoneH + safezoneY; - w = 0.440035 * safezoneW; - h = 0.392 * safezoneH; + x = "0.171616 * safezoneW + safezoneX"; + y = "0.318 * safezoneH + safezoneY"; + w = "0.440035 * safezoneW"; + h = "0.392 * safezoneH"; colorBackground[] = {0.3,0.3,0.3,1}; }; class PictureAircraft: RscPictureKeepAspect { idc = ID_PICTURE_AIRCRAFT; - x = 0.171616 * safezoneW + safezoneX; - y = 0.318 * safezoneH + safezoneY; - w = 0.440035 * safezoneW; - h = 0.392 * safezoneH; + x = "0.171616 * safezoneW + safezoneX"; + y = "0.318 * safezoneH + safezoneY"; + w = "0.440035 * safezoneW"; + h = "0.392 * safezoneH"; }; class CheckboxMirror: RscCheckBox { idc = ID_CHECKBOX_MIRROR; - x = 0.171616 * safezoneW + safezoneX; - y = 0.318 * safezoneH + safezoneY; - w = 0.0165 * safezoneW; - h = 0.028 * safezoneH; + x = "0.171616 * safezoneW + safezoneX"; + y = "0.318 * safezoneH + safezoneY"; + w = "0.0165 * safezoneW"; + h = "0.028 * safezoneH"; }; class TextMirror: RscText { idc = ID_TEXT_MIRROR; text = "$STR_3DEN_Object_Attribute_PylonsMirror_displayName"; tooltip="$STR_3DEN_Object_Attribute_PylonsMirror_tooltip"; - x = 0.188116 * safezoneW + safezoneX; - y = 0.318 * safezoneH + safezoneY; - w = 0.0656768 * safezoneW; - h = 0.028 * safezoneH; + x = "0.188116 * safezoneW + safezoneX"; + y = "0.318 * safezoneH + safezoneY"; + w = "0.0656768 * safezoneW"; + h = "0.028 * safezoneH"; colorBackground[] = {0,0,0,0.5}; }; class CheckboxFRIES: RscCheckBox { idc = ID_CHECKBOX_FRIES; - x = 0.171616 * safezoneW + safezoneX; - y = 0.346 * safezoneH + safezoneY; - w = 0.0165 * safezoneW; - h = 0.028 * safezoneH; + x = "0.171616 * safezoneW + safezoneX"; + y = "0.346 * safezoneH + safezoneY"; + w = "0.0165 * safezoneW"; + h = "0.028 * safezoneH"; }; class TextFRIES: RscText { idc = ID_TEXT_FRIES; text = "FRIES"; - x = 0.188116 * safezoneW + safezoneX; - y = 0.346 * safezoneH + safezoneY; - w = 0.0656768 * safezoneW; - h = 0.028 * safezoneH; + x = "0.188116 * safezoneW + safezoneX"; + y = "0.346 * safezoneH + safezoneY"; + w = "0.0656768 * safezoneW"; + h = "0.028 * safezoneH"; colorBackground[] = {0,0,0,0.5}; }; class TextListTitle: RscText { idc = ID_TEXT_LISTTITLE; - x = 0.624786 * safezoneW + safezoneX; - y = 0.318 * safezoneH + safezoneY; - w = 0.203437 * safezoneW; - h = 0.028 * safezoneH; + x = "0.624786 * safezoneW + safezoneX"; + y = "0.318 * safezoneH + safezoneY"; + w = "0.203437 * safezoneW"; + h = "0.028 * safezoneH"; colorBackground[] = {0,0,0,0.5}; }; class ListLoadouts: RscListBox { idc = ID_LIST_LOADOUTS; - x = 0.624786 * safezoneW + safezoneX; - y = 0.346 * safezoneH + safezoneY; - w = 0.203437 * safezoneW; - h = 0.294 * safezoneH; + x = "0.624786 * safezoneW + safezoneX"; + y = "0.346 * safezoneH + safezoneY"; + w = "0.203437 * safezoneW"; + h = "0.294 * safezoneH"; }; class EditLoadoutName: RscEdit { idc = ID_EDIT_LOADOUTNAME; - x = 0.624786 * safezoneW + safezoneX; - y = 0.64 * safezoneH + safezoneY; - w = 0.203437 * safezoneW; - h = 0.028 * safezoneH; + x = "0.624786 * safezoneW + safezoneX"; + y = "0.64 * safezoneH + safezoneY"; + w = "0.203437 * safezoneW"; + h = "0.028 * safezoneH"; colorBackground[] = {0,0,0,0.7}; }; class ButtonSave: RscButtonMenu { idc = ID_BUTTON_SAVE; action = QUOTE(call FUNC(onButtonSave)); text = "$STR_disp_int_save"; - x = 0.624786 * safezoneW + safezoneX; - y = 0.682 * safezoneH + safezoneY; - w = 0.0590625 * safezoneW; - h = 0.028 * safezoneH; + x = "0.624786 * safezoneW + safezoneX"; + y = "0.682 * safezoneH + safezoneY"; + w = "0.0590625 * safezoneW"; + h = "0.028 * safezoneH"; }; class ButtonLoad: RscButtonMenu { idc = ID_BUTTON_LOAD; action = QUOTE(call FUNC(onButtonLoad)); text = "$STR_disp_int_load"; - x = 0.69703 * safezoneW + safezoneX; - y = 0.682 * safezoneH + safezoneY; - w = 0.0590625 * safezoneW; - h = 0.028 * safezoneH; + x = "0.69703 * safezoneW + safezoneX"; + y = "0.682 * safezoneH + safezoneY"; + w = "0.0590625 * safezoneW"; + h = "0.028 * safezoneH"; }; class ButtonDelete: RscButtonMenu { idc = ID_BUTTON_DELETE; action = QUOTE(call FUNC(onButtonDelete)); text = "$STR_disp_delete"; - x = 0.769275 * safezoneW + safezoneX; - y = 0.682 * safezoneH + safezoneY; - w = 0.0590625 * safezoneW; - h = 0.028 * safezoneH; + x = "0.769275 * safezoneW + safezoneX"; + y = "0.682 * safezoneH + safezoneY"; + w = "0.0590625 * safezoneW"; + h = "0.028 * safezoneH"; }; class ButtonApply: RscButtonMenu { idc = ID_BUTTON_APPLY; action = QUOTE(call FUNC(onButtonApply)); text = "$STR_ui_debug_but_apply"; - x = 0.683895 * safezoneW + safezoneX; - y = 0.738 * safezoneH + safezoneY; - w = 0.0721875 * safezoneW; - h = 0.028 * safezoneH; + x = "0.683895 * safezoneW + safezoneX"; + y = "0.738 * safezoneH + safezoneY"; + w = "0.0721875 * safezoneW"; + h = "0.028 * safezoneH"; }; class ButtonClose: RscButtonMenu { idc = ID_BUTTON_CLOSE; text = "$STR_disp_cancel"; action = QUOTE(call FUNC(onButtonClose)); - x = 0.769275 * safezoneW + safezoneX; - y = 0.738 * safezoneH + safezoneY; - w = 0.0721875 * safezoneW; - h = 0.028 * safezoneH; + x = "0.769275 * safezoneW + safezoneX"; + y = "0.738 * safezoneH + safezoneY"; + w = "0.0721875 * safezoneW"; + h = "0.028 * safezoneH"; }; class TextBanner: RscText { idc = ID_TEXT_BANNER; text = CSTRING(BannerText); - x = 0.171616 * safezoneW + safezoneX; - y = 0.738 * safezoneH + safezoneY; - w = 0.440035 * safezoneW; - h = 0.028 * safezoneH; + x = "0.171616 * safezoneW + safezoneX"; + y = "0.738 * safezoneH + safezoneY"; + w = "0.440035 * safezoneW"; + h = "0.028 * safezoneH"; colorBackground[] = {0.5,0,0,0.5}; }; }; diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml index d6f2823643..efdb7ab271 100644 --- a/addons/pylons/stringtable.xml +++ b/addons/pylons/stringtable.xml @@ -18,7 +18,7 @@ Loadouts for %1 - %1の兵装 + %1 の兵装 Armamenti per %1 %1用的武裝配置 %1用的武器配置 @@ -94,10 +94,10 @@ %1 is already configuring this aircraft! - %1はすでにこの機体へ設定されています! + %1 はすでにこの機体へ設定されています! % sta già configurando questo aereo! %1已經正在定義此飛機的武裝配置! - %1已经正在定义此飞机的武器配置! + %1已经正在定义此飞机的武器配置! 이미 이 항공기에 장착되어 있음 (%1) %1 konfiguriert dieses Fluggerät bereits! %1 est déjà en train de configurer cet aéronef ! @@ -109,7 +109,7 @@ Replacing pylon %1 out of %2... - パイロン%1を作業し残り%2・・・ + %2 中 %1 のパイロンを交換しています・・・ Sostituendo pilone %1 al posto di %2... 共有%2個派龍架,正在整補%1號派龍架中... 共有%2个发射架,正在整装%1号挂架... @@ -124,10 +124,10 @@ Stopped at pylon %1! - パイロン%1で停止しました! + パイロン %1 で中断しました! Fermato al pilone %1! 已停止在%1號派龍架! - 已在整装%1号挂架时停止! + 已在整装%1号挂架时停止! %1 파일런이 멈춤 Gestoppt bei Außenlaststation %1 Arrêté au pylône %1 ! @@ -165,6 +165,7 @@ Ativar Menu de Pylon para Zeus Povolit menu s pylony pro Zeuse Habilitar menú de pilones para Zeus + 제우스 파일런 메뉴 활성화 Enables use of the zeus module. @@ -179,6 +180,7 @@ Permite usar o módulo de Zeus Povoluje použití daného Zeus modulu. Habilita el uso del módulo de Zeus. + 제우스 파일런 메뉴를 사용할 수 있게 합니다. Enable Pylons Menu from Ammo Trucks @@ -193,6 +195,7 @@ Ativar Menu de Pylons de Caminhões de Munição Povolit menu s pylony z muničních náklaďáků. Habilitar menú de pilones desde camiones de munición + 탄약 차량 파일런 메뉴 활성화 Enables use of pylons menu from ammo trucks. @@ -207,6 +210,7 @@ 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í. Habilita el uso del menú de pilones desde camiones de munición. + 탄약 차량에서 파일런 메뉴를 불러올 수 있게 합니다. This aircraft doesn't have pylons @@ -221,6 +225,7 @@ Essa aeronave não possui pylons Toto letadlo nemá pylony Esta aeronave no tiene pilones + 이 비행기는 파일런이 없습니다. Configure pylons module is disabled for zeus @@ -235,6 +240,7 @@ O Módulo de configurar pylons está desativado para o Zeus Nastavení pylonů je vypnuto pro Zeuse La configuración del módulo de pilones está deshabilitada para Zeus + 제우스 파일런 모듈 설정이 비활성화 되어있습니다. Rearm New Pylons @@ -242,7 +248,7 @@ Riarma Nuovi Piloni 重新整装新的导弹挂架 重新武装新的派龙架 - 새파일런 재무장 + 새 파일런 재무장 Neue Außenlaststationen. aufmunitionieren Réarmer les nouveaux pylônes Dozbrój Nowe Pylony @@ -271,8 +277,8 @@ パイロンへの時間 Tempo Per Pilone 派龍架整補所需時間(個別) - 导弹挂架整装所需时间(个别) - 파일런당 시간 + 导弹挂架整装所需时间(个别) + 파일런 당 시간 Zeit pro Außenlaststation Durée par pylône Czas na Pylon @@ -286,7 +292,7 @@ 各パイロンの置き換えにかかる時間を設定します。(秒) Il tempo che impiega ogni pilone ad essere sostituito (in secondi). 每個派龍架需花多久時間進行整補(單位為秒) - 每个挂架需花多久时间进行整装单位为秒)。 + 每个挂架需花多久时间进行整装(单位为秒)。 파일런을 재설정 하는데 걸리는 시간 (초) Die benötigte Zeit, um einzelne Außenlaststationen zu ersetzen (in Sekunden). Le temps nécessaire pour remplacer chaque pylône (en secondes). @@ -316,7 +322,7 @@ 航空機と補給車両との間に必要な距離です。 La distanza necessaria per un aereo da un veicolo di riarmo. 設定飛機必須距離整補載具多少公尺才能進行彈藥整補 - 设定飞机必须距离整装载具多少公尺才能进行弹药整装。 + 设定飞机必须距离整装载具多少米才能进行弹药整装。 항공기에서 재보급 가능한 재무장 차량을 찾습니다. Die Distanz, die ein Fahrzeug von einem Munitionsfahrzeug entfernt sein darf. La distance maximale à laquelle un aéronef doit se trouver du véhicule de ravitaillement. @@ -362,7 +368,7 @@ Necessita Kit Riparazione 需要工具包 需要工具包 - 툴킷 요구 + 도구모음 요구 Benötigt Werkzeugkasten Trousse à outils requise Wymaga Narzędzi @@ -377,7 +383,7 @@ Necessita un kit di riparazione nell'inventario 需要工具包才能進行彈藥整補 需要工具包才能进行弹药整装。 - 툴킷이 필요합니다. + 도구모음이 필요합니다. Benötigt einen Werkzeugkasten im Inventar. Requiert une trousse à outils dans l'inventaire. Wymaga narzędzi w ekwipunku. diff --git a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf index a4ccc737e7..e55d498809 100644 --- a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf +++ b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Creates actions for vehicle free seats. diff --git a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf index 94f5ff6de5..865bab4d51 100644 --- a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf +++ b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Checks if Free Seats menu can be shown. @@ -29,6 +29,7 @@ GVAR(enabled) } && {alive _vehicle} && {2 > locked _vehicle} +&& {isNull getConnectedUAVUnit _unit} && {simulationEnabled _vehicle} && { -1 == crew _vehicle findIf {alive _x} diff --git a/addons/quickmount/functions/fnc_getInNearest.sqf b/addons/quickmount/functions/fnc_getInNearest.sqf index 0a1794a4d8..c618681f7e 100644 --- a/addons/quickmount/functions/fnc_getInNearest.sqf +++ b/addons/quickmount/functions/fnc_getInNearest.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Mount the player in the vehicle they are directly looking at based on their distance. diff --git a/addons/quickmount/functions/fnc_moduleInit.sqf b/addons/quickmount/functions/fnc_moduleInit.sqf index 216cda90c0..8544226a32 100644 --- a/addons/quickmount/functions/fnc_moduleInit.sqf +++ b/addons/quickmount/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Initializes the quick-mount module. diff --git a/addons/quickmount/functions/script_component.hpp b/addons/quickmount/functions/script_component.hpp deleted file mode 100644 index a91c3e1665..0000000000 --- a/addons/quickmount/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\quickmount\script_component.hpp" diff --git a/addons/quickmount/stringtable.xml b/addons/quickmount/stringtable.xml index 58c4f56e09..1d8fd480c3 100644 --- a/addons/quickmount/stringtable.xml +++ b/addons/quickmount/stringtable.xml @@ -55,7 +55,7 @@ 载具已满 載具已滿 Pojazd pełny - 만차 + 차량이 꽉 찼습니다 Мест нет Veículo cheio Véhicule plein @@ -67,6 +67,7 @@ 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 この機能により直接見ている車両へすぐさま搭乗できます。 @@ -75,6 +76,8 @@ Tato možnost umožňuje rychle nastoupit do vozidla na které se díváte. Эта опция разрешает быстро залезть в транспорт, на который вы смотрите. Esta opción permite entrar rápidamente al vehículo al que estás mirando + Diese Option erlaubt es, schnell in das Fahrzeug, auf das der Spieler gerade zeigt, einzusteigen. + 보고 있는 차량에 신속히 탑승하게 합니다. Distance @@ -97,7 +100,7 @@ Maximale Entfernung zu Fahrzeugen Distanza massima per controllare i veicoli. 車両を検知できる最大距離を設定します。 - 最大可检查载具的距离. + 最大可检查载具的距离。 最大可檢查載具的距離 Maksymalna odległość do pojazdu. 탑승 가능한 차량과의 거리 @@ -129,7 +132,7 @@ Maximale Geschwindigkeit (km/h) Velocità Massima (km/h) 最高速度 (km/h) - 最高速度 (公里/小时) + 最高速度(km/h) 最高速度 (公里/小時) Maksymalna prędkość (km/h) 최대 속도 (km/h) @@ -197,10 +200,12 @@ Cambia posto Mudar de Assento 換座位 + 换座位 Changer de place Změnit sedadlo Koltuk Değiştir Cambiar asiento + 좌석 변경 diff --git a/addons/rangecard/CfgWeapons.hpp b/addons/rangecard/CfgWeapons.hpp index 659b0ecfcb..851e324346 100644 --- a/addons/rangecard/CfgWeapons.hpp +++ b/addons/rangecard/CfgWeapons.hpp @@ -11,6 +11,7 @@ class CfgWeapons { picture = QPATHTOF(UI\RangeCard_Icon.paa); icon = "iconObject_circle"; mapSize = 0.034; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; diff --git a/addons/rangecard/RscTitles.hpp b/addons/rangecard/RscTitles.hpp index 7c760bd993..720f724be4 100644 --- a/addons/rangecard/RscTitles.hpp +++ b/addons/rangecard/RscTitles.hpp @@ -147,7 +147,7 @@ class ACE_RangeCard_Dialog { y="safezoneY+0.181889+0.091"; w="0.25*1.62727*3/4"; h="0.0909445"; - columns[]={(0.03/2), (0.985/2)}; + columns[]={"0.03/2", "0.985/2"}; idcLeft=770101; idcRight=770102; }; @@ -157,7 +157,7 @@ class ACE_RangeCard_Dialog { y="safezoneY+0.181889+0.125"; w="0.405*1.62727*3/4"; h="0.0909445"; - columns[]={(0/9), (1/9), (2/9), (3/9), (4/9), (5/9), (5.9/9), (6.9/9), (7.8/9)}; + columns[]={"0/9", "1/9", "2/9", "3/9", "4/9", "5/9", "5.9/9", "6.9/9", "7.8/9"}; idcLeft=770201; idcRight=770202; }; @@ -167,7 +167,7 @@ class ACE_RangeCard_Dialog { y="safezoneY+0.181889+0.15"; w="0.25*1.62727*3/4"; h="0.0909445"; - columns[]={(0/6), (0.9/6), (1.8/6), (2.9/6), (3.8/6), (4.8/6)}; + columns[]={"0/6", "0.9/6", "1.8/6", "2.9/6", "3.8/6", "4.8/6"}; idcLeft=770301; idcRight=770302; }; @@ -177,8 +177,8 @@ class ACE_RangeCard_Dialog { y="safezoneY+0.181889+0.194"; w="0.72*1.62727*3/4"; h="1.62727"; - columns[]={(0/16), (1.2/16), (2.2/16), (3.2/16), (4.2/16), (5.1/16), (6.1/16), (7.1/16), (8.1/16), - (9/16), (10.2/16), (11/16), (11.9/16), (12.8/16), (13.7/16), (14.6/16)}; + columns[]={"0/16", "1.2/16", "2.2/16", "3.2/16", "4.2/16", "5.1/16", "6.1/16", "7.1/16", "8.1/16", + "9/16", "10.2/16", "11/16", "11.9/16", "12.8/16", "13.7/16", "14.6/16"}; idcLeft=770401; idcRight=770402; }; diff --git a/addons/rangecard/functions/fnc_calculateRangeCard.sqf b/addons/rangecard/functions/fnc_calculateRangeCard.sqf index ebeadf6b7e..179437eb58 100644 --- a/addons/rangecard/functions/fnc_calculateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_calculateRangeCard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the range card data diff --git a/addons/rangecard/functions/fnc_canCopy.sqf b/addons/rangecard/functions/fnc_canCopy.sqf index ee85bcf096..6600cd5fca 100644 --- a/addons/rangecard/functions/fnc_canCopy.sqf +++ b/addons/rangecard/functions/fnc_canCopy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Checks if the target has a copyable range card diff --git a/addons/rangecard/functions/fnc_canShow.sqf b/addons/rangecard/functions/fnc_canShow.sqf index 4262391d29..8917cf80f1 100644 --- a/addons/rangecard/functions/fnc_canShow.sqf +++ b/addons/rangecard/functions/fnc_canShow.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Tests if the Range Card can be shown diff --git a/addons/rangecard/functions/fnc_canShowCopy.sqf b/addons/rangecard/functions/fnc_canShowCopy.sqf index 134147917e..7ede55823d 100644 --- a/addons/rangecard/functions/fnc_canShowCopy.sqf +++ b/addons/rangecard/functions/fnc_canShowCopy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Tests if the Range Card copy can be shown diff --git a/addons/rangecard/functions/fnc_onCloseDialog.sqf b/addons/rangecard/functions/fnc_onCloseDialog.sqf index 0a93eb897c..3a50f55a82 100644 --- a/addons/rangecard/functions/fnc_onCloseDialog.sqf +++ b/addons/rangecard/functions/fnc_onCloseDialog.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: joko // Jonas * Add the Reserve Parachute to Units or Save Backpack if is a Parachute in Unit diff --git a/addons/rangecard/functions/fnc_openRangeCard.sqf b/addons/rangecard/functions/fnc_openRangeCard.sqf index ed2bb9e241..be1cb821a9 100644 --- a/addons/rangecard/functions/fnc_openRangeCard.sqf +++ b/addons/rangecard/functions/fnc_openRangeCard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Opens the range card dialog diff --git a/addons/rangecard/functions/fnc_updateClassNames.sqf b/addons/rangecard/functions/fnc_updateClassNames.sqf index e13198bcfc..d0a9bbdc32 100644 --- a/addons/rangecard/functions/fnc_updateClassNames.sqf +++ b/addons/rangecard/functions/fnc_updateClassNames.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Updates the ammo and weapon class names diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 89a6ac9e54..d7acd46486 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Authors: Ruthberg * Updates the range card data diff --git a/addons/rangecard/functions/script_component.hpp b/addons/rangecard/functions/script_component.hpp deleted file mode 100644 index d4a493206b..0000000000 --- a/addons/rangecard/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\rangecard\script_component.hpp" diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml index 8290ef9b08..4e1db8954c 100644 --- a/addons/rangecard/stringtable.xml +++ b/addons/rangecard/stringtable.xml @@ -14,7 +14,7 @@ Tavola Balistica 射表 사거리표 - 弹道射表 + 射表 彈道射表 Menzil Kartı @@ -31,7 +31,7 @@ Incrementi per 50 METRI - MRAD/MRAD (reticolo/torrette) 50 メートル増やす -- MRAD/MRAD (照準線/砲塔) 50 미터 늘리기 -- MRAD/MRAD (조준선/포탑) - 50公尺增量 -- 毫弧度/毫弧度 (瞄镜分划线/调整纽) + 50米增量 -- 毫弧度/毫弧度(瞄镜分划线/调整纽) 50公尺增量 -- 毫弧度/毫弧度 (瞄鏡分劃線/調整紐) 50 METER increments -- MRAD/MRAD (reticle/turrets) @@ -48,7 +48,7 @@ Apri Tavola Balistica 射表を開く 사거리표 열기 - 开启弹道射表 + 开启射表 開啟彈道射表 Menzil Kartını Aç @@ -65,7 +65,7 @@ Apri Copia Tavola Balistica 複製された射表を開く 복제 사거리표 열기 - 开启弹道射表副本 + 开启射表副本 開啟彈道射表副本 Menzil Kartının Kopyasını Aç @@ -82,7 +82,7 @@ Apri Tavola Balistica 射表を開く 사거리표 열기 - 开启弹道射表 + 开启射表 開啟彈道射表 Menzil Kartını Aç @@ -99,7 +99,7 @@ Apri Copia Tavola Balistica 複製された射表を開く 복제 사거리표 열기 - 开启弹道射表副本 + 开启射表副本 開啟彈道射表副本 Menzil Kartının Kopyasını Aç @@ -116,7 +116,7 @@ Copia Tavola Balistica 射表を複製する 사거리표 복제 - 复制弹道射表 + 复制射表 複製彈道射表 Menzil Kartını Kopyala diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 394f623f65..efa6a1662f 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -517,6 +517,13 @@ class CfgWeapons { }; }; + class LMG_Minigun_heli: LMG_Minigun { + displayName = "M134 Minigun"; + class manual: manual { + displayName = "M134 Minigun"; + }; + }; + class HMG_127: LMG_RCWS { displayName = "M2"; class manual: MGun { diff --git a/addons/realisticnames/addon.toml b/addons/realisticnames/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/realisticnames/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/realisticnames/config.cpp b/addons/realisticnames/config.cpp index e8f4afae46..e98d18f0b6 100644 --- a/addons/realisticnames/config.cpp +++ b/addons/realisticnames/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\norealisticnames\script_component.hpp") +#define PATCH_SKIP "No Realistic Names" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -20,3 +27,5 @@ class CfgPatches { #include "CfgMagazines.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" + +#endif diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index d8efa1177e..efce83a658 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -15,7 +15,7 @@ XM312 XM312 XM312重機槍 - XM312重机枪 + XM312 XM312 @@ -32,7 +32,7 @@ XM312A XM312A XM312A重機槍 - XM312A重机枪 + XM312A XM312A @@ -49,7 +49,7 @@ XM312 (高) XM312 (높음) XM312重機槍 (高射腳架) - XM312重机枪 (高射脚架) + XM312(高) XM312 (Yüksek) @@ -66,7 +66,7 @@ XM307 XM307 XM307榴彈機槍 - XM307榴弹机枪 + XM307 XM307 @@ -83,7 +83,7 @@ XM307A XM307A XM307A榴彈機槍 - XM307A榴弹机枪 + XM307A XM307A @@ -100,7 +100,7 @@ XM307 (高) XM307 (높음) XM307榴彈機槍 (高射腳架) - XM307榴弹机枪 (高射脚架) + XM307(高) XM307 (Yüksek) @@ -110,14 +110,14 @@ Poste de tir Mini-Spike (AC) Mini-Spike Odpalovač (AT) Wyrzutnia Mini-Spike (AT) - Mini-Spike Пусковое устройство (ПТРК) + Mini-Spike ПУ (ПТРК) Lança-mísseis Mini-Spike (AC) Mini-Spike rakétarendszer (Tankelhárító) Lanciatore Mini-Spike (AC) - ミニスパイク ランチャー (対戦) - Mini-Spike Launcher (대전차) + ミニスパイク ランチャー (対戦車) + 스파이크 미사일 발사기 (대전차) "迷你長釘"導彈發射器 (反坦克) - "迷你长钉"导弹发射器 (反坦克) + "迷你长钉"(反坦) Mini-Spike Launcher (AT) @@ -127,14 +127,14 @@ 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) ミニスパイク ランチャー (対空) - Mini-Spike Launcher (대공) + 스파이크 미사일 발사기 (대공) "迷你長釘"導彈發射器 (防空) - "迷你长钉"导弹发射器 (防空) + "迷你长钉"(防空) Mini-Spike Launcher (AA) @@ -151,7 +151,7 @@ YABHON-R3 YABHON-R3 "亞伯罕-R3型"空中無人載具 - "亚伯罕-R3型"空中无人载具 + "联合"-R3 YABHON-R3 @@ -168,7 +168,7 @@ YABHON-R3 (CAS) YABHON-R3 (근접지원) "亞伯罕-R3型"空中無人載具 (近空支援) - "亚伯罕-R3型"空中无人载具 (近空支援) + "联合"-R3(近空支援) YABHON-R3 (CAS) @@ -185,7 +185,7 @@ M-ATV M-ATV 防地雷反伏擊全地形車 - 防地雷反伏击全地形车 + M-ATV M-ATV @@ -195,14 +195,14 @@ M-ATV (CKM) M-ATV (HMG) M-ATV (HMG) - M-ATV (Пулемёт) + M-ATV (с пулемётом) M-ATV (HMG) M-ATV (nehézgéppuska) M-ATV (HMG) M-ATV (HMG) - M-ATV (HMG) + M-ATV (중기관총) 防地雷反伏擊全地形車 (重機槍) - 防地雷反伏击全地形车 (重机枪) + M-ATV(重机枪) M-ATV (HMG) @@ -212,14 +212,14 @@ M-ATV (GMG) M-ATV (GMG) M-ATV (GMG) - M-ATV (Гранатомёт) + M-ATV (с гранатомётом) M-ATV (GMG) M-ATV (gránátgéppuska) M-ATV (GMG) M-ATV (GMG) - M-ATV (GMG) + M-ATV (유탄기관총) 防地雷反伏擊全地形車 (榴彈機槍) - 防地雷反伏击全地形车 (榴弹机枪) + M-ATV(榴弹发射器) M-ATV (GMG) @@ -234,9 +234,9 @@ Merkava Mk IV M Merkava Mk IV M メルカバ Mk IV M - Merkava Mk IV M + 메르카바 Mk IV M "梅卡瓦4代"主戰坦克 - "梅卡瓦4代"主战坦克 + "梅卡瓦"4M Merkava Mk IV M @@ -251,9 +251,9 @@ Merkava Mk IV LIC Merkava Mk IV LIC メルカバ Mk IV LIC - Merkava Mk IV LIC + 메르카바 Mk IV LIC "梅卡瓦4代"主戰坦克 城市版 - "梅卡瓦4代"主战坦克 城市版 + "梅卡瓦"4M 城市版 Merkava Mk IV LIC @@ -267,10 +267,10 @@ Sholef Sholef Sholef - ショルフ - Sholef + ショレフ + 숄레프 자주포 "神槍"自走炮 - "神枪"自走炮 + "神枪" Sholef @@ -285,9 +285,9 @@ Seara Seara シアラ - Seara + 시아라 다연장로켓 "希拉"多管火箭車 - "希拉"多管火箭车 + "希拉" Seara @@ -301,10 +301,10 @@ Namer Namer Namer - ネイマー - Namer + ナメル + 나메르 병력수송장갑차 "花豹"裝甲運兵車 - "花豹"装甲运兵车 + "花豹" Namer @@ -318,10 +318,10 @@ Bardelas Bardelas Bardelas - バーラデラス - Bardelas + バルデラス + 바델라스 자주대공포 "布萊德斯"防空車 - "布莱德斯"防空车 + "布莱德斯" Bardelas @@ -335,10 +335,10 @@ Badger IFV Badger IFV Badger IFV - バッジ IFV - Badger IFV + バジャー IFV + 뱃져 보병전투차 "蜜獾"步兵戰車 - "蜜獾"步兵战车 + "蜜獾" Badger IFV @@ -353,9 +353,9 @@ Nemmera Nemmera ネマラ - Nemmera + 네메라 공병장갑차 "雌豹"戰鬥工程車 - "雌豹"战斗工程车 + "雌豹" Nemmera @@ -365,14 +365,14 @@ HEMTT Transportowy HEMTT (valník) HEMTT Transport - HEMTT Транспортный + HEMTT (транспортный) HEMTT Transporte HEMTT szállítójármű HEMTT da trasporto - HEMTT 輸送型 + HEMTT 輸送 HEMTT 수송 重型增程機動戰術卡車 (運輸) - 重型增程机动战术卡车 (运输) + HEMTT(运输) HEMTT Nakil @@ -382,14 +382,14 @@ HEMTT Transportowy (zakryty) HEMTT (valník-krytý) HEMTT Transport (bâché) - HEMTT Транспортный (крытый) + HEMTT (транспортный, крытый) HEMTT Transporte (coberto) HEMTT szállítójármű (ponyvás) HEMTT da trasporto (coperto) - HEMTT 輸送型 (幌) + HEMTT 輸送 (幌) HEMTT 수송 (덮개) 重型增程機動戰術卡車 (運輸, 棚布) - 重型增程机动战术卡车 (运输, 棚布) + HEMTT(运输,棚布) HEMTT Nakil (Kapalı) @@ -406,7 +406,7 @@ HEMTT HEMTT 重型增程機動戰術卡車 - 重型增程机动战术卡车 + HEMTT HEMTT @@ -416,14 +416,14 @@ HEMTT Kontener HEMTT (skříňový) HEMTT Conteneur - HEMTT Контейнер + HEMTT (контейнер) HEMTT Contêiner HEMTT (konténer) HEMTT portacontainer - HEMTT コンテナ型 + HEMTT コンテナ HEMTT 컨테이너 重型增程機動戰術卡車 (貨櫃) - 重型增程机动战术卡车 (货柜) + HEMTT(货柜) HEMTT Konteynır @@ -433,14 +433,14 @@ HEMTT Medyczny HEMTT (zdravotnický) HEMTT Médical - HEMTT Медицинский + HEMTT (медицинский) HEMTT Médico HEMTT (egészségügyi) HEMTT Medico - HEMTT 救急車 + HEMTT 衛生 HEMTT 의료 重型增程機動戰術卡車 (醫療) - 重型增程机动战术卡车 (医疗) + HEMTT(医疗) HEMTT Medikal @@ -450,14 +450,14 @@ HEMTT Amunicyjny HEMTT (muniční) HEMTT Munitions - HEMTT Боеприпасы + HEMTT (боеприпасы) HEMTT Munições HEMTT (lőszerszállító) HEMTT di rifornimento munizioni - HEMTT 弾薬給弾型 + HEMTT 弾薬 HEMTT 탄약 重型增程機動戰術卡車 (彈藥) - 重型增程机动战术卡车 (弹药) + HEMTT(弹药) HEMTT Cephane @@ -467,14 +467,14 @@ HEMTT Cysterna HEMTT (cisterna) HEMTT Citerne - HEMTT Заправщик + HEMTT (топливозаправщик) HEMTT Combustível HEMTT (üzemanyag-szállító) HEMTT di rifornimento carburante - HEMTT 燃料給油車 + HEMTT 燃料 HEMTT 연료 重型增程機動戰術卡車 (燃油) - 重型增程机动战术卡车 (燃油) + HEMTT(燃油) HEMTT Yakıt @@ -484,14 +484,14 @@ HEMTT Naprawczy HEMTT (opravárenský) HEMTT Réparation - HEMTT Ремонтный + HEMTT (ремонтный) HEMTT Reparador HEMTT (szerelő-jármű) HEMTT Riparatore - HEMTT 修理型 + HEMTT 修理 HEMTT 수리 重型增程機動戰術卡車 (維修) - 重型增程机动战术卡车 (维修) + HEMTT(维修) HEMTT Tamir @@ -501,14 +501,14 @@ Fennek Fennek Fennek - Феннек + Fennek Fennek Fennek Fennek フェネック - Fennek + 페넥 "非洲小狐"防地雷反伏擊車 - "非洲小狐"防地雷反伏击车 + "非洲小狐" Fennek @@ -518,14 +518,14 @@ Fennek (CKM) Fennek (HMG) Fennek (HMG) - Феннек (Пулемёт) + Fennek (с пулемётом) Fennek (HMG) Fennek (nehézgéppuska) Fennek (HMG) フェネック (HMG) - Fennek (HMG) + 페넥 (중기관총) "非洲小狐"防地雷反伏擊車 (重機槍) - "非洲小狐"防地雷反伏击车 (重机枪) + "非洲小狐"(重机枪) Fennek (HMG) @@ -535,14 +535,14 @@ Fennek (GMG) Fennek (GMG) Fennek (GMG) - Феннек (Гранатомёт) + Fennek (с гранатомётом) Fennek (GMG) Fennek (gránátgéppuska) Fennek (GMG) フェネック (GMG) - Fennek (GMG) + 페넥 (유탄기관총) "非洲小狐"防地雷反伏擊車 (榴彈機槍) - "非洲小狐"防地雷反伏击车 (榴弹机枪) + "非洲小狐"(榴弹发射器) Fennek (GMG) @@ -552,14 +552,14 @@ Leopard 2SG Leopard 2SG Leopard 2SG - Леопард 2SG + Leopard 2SG Leopard 2SG Leopard 2SG Leopard 2SG - レオパルド 2SG - Leopard 2SG + レオパルト 2SG + 레오파르트 2SG "豹2型新加坡版"主戰坦克 - "豹2型新加坡版"主战坦克 + "豹"2 新加坡版 Leopard 2SG @@ -569,14 +569,14 @@ FV510 Warrior FV510 Warrior FV510 Warrior - FV510 Уорриор + FV510 Warrior FV510 Warrior FV510 Warrior FV510 Warrior FV510 ウォーリアー - FV510 Warrior - FV510"戰士"步兵戰車 - FV510"战士"步兵战车 + FV510 워리어 보병전투차 + FV510 "戰士"步兵戰車 + FV510 "战士" FV510 Warrior @@ -591,9 +591,9 @@ Pandur II Pandur II パンデュール II - Pandur II + 판두르 II 병력수송장갑차 "潘德2型"裝甲運兵車 - "潘德2型"装甲运兵车 + "潘德"二型 Pandur II @@ -603,14 +603,14 @@ KamAZ transportowy KamAZ (valník) KamAZ Transport - КамАЗ Транспортный + КамАЗ (транспортный) KamAZ Transporte KamAZ szállítójármű KamAZ da trasporto - KamAZ 輸送型 - KamAZ 수송 + KamAZ 輸送 + 카마즈 수송 "卡瑪斯"卡車 (運輸) - "卡玛斯"卡车 (运输) + "卡玛兹"(运输) KamAZ Nakil @@ -620,14 +620,14 @@ KamAZ Transportowy (zakryty) KamAZ (valník-krytý) KamAZ Transport (bâché) - КамАЗ Транспортный (крытый) + КамАЗ (транспортный, крытый) KamAZ Transporte (coberto) KamAZ szállítójármű (ponyvás) KamAZ da trasporto (coperto) - KamAZ 輸送型 (幌) - KamAZ 수송 (덮개) + KamAZ 輸送 (幌) + 카마즈 수송 (덮개) "卡瑪斯"卡車 (運輸, 棚布) - "卡玛斯"卡车 (运输, 棚布) + "卡玛兹"(运输,棚布) KamAZ Nakil (Kapalı) @@ -637,14 +637,14 @@ KamAZ Amunicyjny KamAZ (muniční) KamAZ Munitions - КамАЗ Боеприпасы + КамАЗ (боеприпасы) KamAZ Munições KamAZ (lőszerszállító) KamAZ di rifornimento munizioni - KamAZ 弾薬給弾型 - KamAZ 탄약 + KamAZ 弾薬 + 카마즈 탄약 "卡瑪斯"卡車 (彈藥) - "卡玛斯"卡车 (弹药) + "卡玛兹"(弹药) KamAZ Cephane @@ -654,14 +654,14 @@ KamAZ cysterna KamAZ (cisterna) KamAZ Citerne - КамАЗ Заправщик + КамАЗ (топливозаправщик) KamAZ Combustível KamAZ (üzemanyag-szállító) KamAZ di rifornimento carburante - KamzAZ 燃料給油車 - KamAZ 연료 + KamAZ 燃料 + 카마즈 연료 "卡瑪斯"卡車 (燃油) - "卡玛斯"卡车 (燃油) + "卡玛兹"(燃油) KamAZ Yakıt @@ -671,14 +671,14 @@ KamAZ Naprawczy KamAZ (opravárenský) KamAZ Réparation - КамАЗ Ремонтный + КамАЗ (ремонтный) KamAZ Reparador KamAZ (szerelő-jármű) KamAZ riparatore - KamzAZ 修理型 - KamAZ 수리 + KamAZ 修理 + 카마즈 수리 "卡瑪斯"卡車 (維修) - "卡玛斯"卡车 (维修) + "卡玛兹"(维修) KamAZ Tamir @@ -688,21 +688,21 @@ KamAZ Medyczny KamAZ (zdravotnický) KamAZ Médical - КамАЗ Медицинский + КамАЗ (медицинский) KamAZ Médico KamAZ (egészségügyi) KamAZ Medico - KamAZ 救急車 - KamAZ 의료 + KamAZ 衛生 + 카마즈 의료 "卡瑪斯"卡車 (醫療) - "卡玛斯"卡车 (医疗) + "卡玛兹"(医疗) KamAZ Medikal KamAZ MRL KamAS MRL "卡瑪斯"卡車 (多管火箭) - "卡玛斯"卡车 (多管火箭) + "卡玛兹"(多管火箭) KamAZ MRL KamAZ MRL KamAZ MRL @@ -712,6 +712,7 @@ KamAZ MRL (raketové dělostřelectvo) KamAZ MRL KamAZ + 카마즈 다연장로켓 Karatel @@ -720,14 +721,14 @@ Karatel Karatel Karatel - Kаратель + Каратель Karatel Karatel Karatel カラテル - Karatel + 카라텔 "懲罰者"防地雷反伏擊車 - "惩罚者"防地雷反伏击车 + "宪兵" Karatel @@ -737,14 +738,14 @@ Karatel (CKM) Karatel (HMG) Karatel (HMG) - Kаратель (Пулемёт) + Каратель (с пулемётом) Karatel (HMG) Karatel (nehézgéppuska) Karatel (HMG) カラテル (HMG) - Karatel (HMG) + 카라텔 (중기관총) "懲罰者"防地雷反伏擊車 (重機槍) - "惩罚者"防地雷反伏击车 (重机枪) + "宪兵"(重机枪) Karatel (HMG) @@ -754,14 +755,14 @@ Karatel (GMG) Karatel (GMG) Karatel (GMG) - Kаратель (Гранатомёт) + Каратель (с гранатомётом) Karatel (GMG) Karatel (gránátgéppuska) Karatel (GMG) カラテル (GMG) - Karatel (GMG) + 카라텔 (유탄기관총) "懲罰者"防地雷反伏擊車 (榴彈機槍) - "惩罚者"防地雷反伏击车 (榴弹机枪) + "宪兵"(榴弹发射器) Karatel (GMG) @@ -776,9 +777,9 @@ T100 Fekete Sas T100 Black Eagle T100 ブラック イーグル - T100 Black Eagle - T100"黑鷹"主戰坦克 - T100"黑鹰"主战坦克 + T-100 블랙 이글 + T100 "黑鷹"主戰坦克 + T-100 "黑鹰" T100 Black Eagle @@ -793,9 +794,9 @@ 2S9 Sochor 2S9 Sochor 2S9 ソーカー - 2S9 Sochor - 2S9"薩克爾"自走砲 - 2S9"萨克尔"自走炮 + 2S9 소코르 + 2S9 "薩克爾"自走砲 + 2S9 "索科尔" 2S9 Sochor @@ -810,9 +811,9 @@ BM-2T Stalker BM-2T Stalker BM-2T ストーカー - BM-2T Stalker + BM-2T 스토커 BM-2T"潛行者"步兵戰車 - BM-2T"潜行者"步兵战车 + BM-2T "潜行者" BM-2T Stalker @@ -827,9 +828,9 @@ ZSU-35 Tigris ZSU-35 Tigris ZSU-35 ティグリス - ZSU-35 Tigris - ZSU-35"虎式"防空車 - ZSU-35"虎式"防空车 + ZSU-35 티그리스 + ZSU-35 "虎式"防空車 + ZSU-35 "底格里斯" ZSU-35 Tigris @@ -844,9 +845,9 @@ Otokar ARMA Otokar ARMA オトカ アルマ - Otokar ARMA - "奧托卡-阿爾默"裝甲運兵車 - "奥托卡-阿尔默"装甲运兵车 + 오토카르 아르마 APC + "奧托卡—阿爾默"裝甲運兵車 + 奥托卡尔 "阿玛" Otokar ARMA @@ -856,14 +857,14 @@ Typhoon Transportowy KamAZ Typhoon (valník) Typhoon Transport - Тайфун Транспортный + Тайфун (транспортный) Typhoon Transporte Typhoon szállítójármű Typhoon da trasporto - タイフーン 輸送型 - Typhoon 수송 + タイフーン 輸送 + 타이푼 수송 "颱風"卡車 (運輸) - "台风"卡车 (运输) + "台风"(运输) Typhoon Nakil @@ -873,14 +874,14 @@ Typhoon Transportowy (przykryty) KamAZ Typhoon (valník-krytý) Typhoon Transport (bâché) - Тайфун Транспортный (крытый) + Тайфун (крытый) Typhoon Transporte (coberto) Typhoon szállítójármű (ponyvás) Typhoon da trasporto (coperto) - タイフーン 輸送型 (幌) - Typhoon 수송 (덮개) + タイフーン 輸送 (幌) + 타이푼 수송 (덮개) "颱風"卡車 (運輸, 棚布) - "台风"卡车 (运输, 棚布) + "台风"(运输,棚布) Typhoon Nakil (Kapalı) @@ -890,14 +891,14 @@ Typhoon Urządzenie KamAZ Typhoon (zařízení) Typhoon Dispositif - Тайфун Устройство + Тайфун (устройство) Typhoon Dispositivo Typhoon (eszköz) Typhoon per dispositivo - タイフーン デバイス型 - Typhoon 장치 + タイフーン デバイス + 타이푼 장치 "颱風"卡車 (精密設備) - "台风"卡车 (精密设备) + "台风"(装置) Typhoon Cihaz @@ -907,14 +908,14 @@ Typhoon Amunicyjny KamAZ Typhoon (muniční) Typhoon Munitions - Тайфун Боеприпасы + Тайфун (боеприпасы) Typhoon Munições Typhoon (lőszerszállító) Typhoon di rifornimento munizioni - タイフーン 弾薬給弾型 - Typhoon 탄약 + タイフーン 弾薬 + 타이푼 탄약 "颱風"卡車 (彈藥) - "台风"卡车 (弹药) + "台风"(弹药) Typhoon Cephane @@ -924,14 +925,14 @@ Typhoon Cysterna KamAZ Typhoon (cisterna) Typhoon Citerne - Тайфун Заправщик + Тайфун (топливозаправщик) Typhoon Combustível Typhoon (üzemanyag-szállító) Typhoon di rifornimento carburante - タイフーン 燃料給油車 - Typhoon 연료 + タイフーン 燃料 + 타이푼 연료 "颱風"卡車 (燃油) - "台风"卡车 (燃油) + "台风"(燃油) Typhoon Yakıt @@ -941,14 +942,14 @@ Typhoon Naprawczy KamAZ Typhoon (opravárenský) Typhoon Réparation - Тайфун Ремонтный + Тайфун (ремонтный) Typhoon Reparador Typhoon (szerelő-jármű) Typhoon riparatore - タイフーン 修理型 - Typhoon 수리 + タイフーン 修理 + 타이푼 수리 "颱風"卡車 (維修) - "台风"卡车 (维修) + "台风"(维修) Typhoon Tamir @@ -958,14 +959,14 @@ Typhoon Medyczny KamAZ Typhoon (zdravotnický) Typhoon Médical - Тайфун Медицинский + Тайфун (медицинский) Typhoon Médico Typhoon (egészségügyi) Typhoon medico - タイフーン 救急車 - Typhoon 의료 + タイフーン 衛生 + 타이푼 의료 "颱風"卡車 (醫療) - "台风"卡车 (医疗) + "台风"(医疗) Typhoon Medikal @@ -975,14 +976,14 @@ RAH-66 Comanche RAH-66 Comanche RAH-66 Comanche - RAH-66 Команч + RAH-66 Comanche RAH-66 Comanche RAH-66 Comanche RAH-66 Comanche RAH-66 コマンチ - RAH-66 Comanche - RAH-66"卡曼契"攻擊直升機 - RAH-66"卡曼契"攻击直升机 + RAH-66 코만치 + RAH-66 "卡曼契"攻擊直升機 + RAH-66 "科曼奇" RAH-66 Comanche @@ -997,9 +998,9 @@ MH-6 Little Bird MH-6 Little Bird MH-6 リトル バード - MH-6 Little Bird - MH-6"小鳥"運輸直升機 - MH-6"小鸟"运输直升机 + MH-6 리틀버드 + MH-6 "小鳥"運輸直升機 + MH-6 "小鸟" MH-6 Little Bird @@ -1014,9 +1015,9 @@ AH-6 Little Bird AH-6 Little Bird AH-6 リトル バード - AH-6 Little Bird - AH-6"小鳥"武裝直升機 - AH-6"小鸟"武装直升机 + AH-6 리틀버드 + AH-6 "小鳥"武裝直升機 + AH-6 "小鸟" AH-6 Little Bird @@ -1031,9 +1032,9 @@ CH-47I Chinook CH-47I Chinook CH-47I チヌーク - CH-47I Chinook + CH-47I 치누크 CH-47I"契努克"運輸直升機 - CH-47I"契努克"运输直升机 + CH-47I "支努干" CH-47I Chinook @@ -1048,9 +1049,9 @@ CH-47I Chinook (disarmato) CH-47I Chinook (desarmado) CH-47I チヌーク (非武装) - CH-47I Chinook (비무장) + CH-47I 치누크 (비무장) CH-47I"契努克"運輸直升機 (無武裝) - CH-47I"契努克"运输直升机 (无武装) + CH-47I "支努干"(无武装) CH-47I Chinook (silahsız) @@ -1060,14 +1061,14 @@ A-10D Thunderbolt II A-10D Thunderbolt II A-10D Thunderbolt II - A-10D Тандерболт II + A-10D Thunderbolt II A-10D Thunderbolt II A-10D Thunderbolt II A-10D Thunderbolt II A-10D サンダーボルト II - A-10D Thunderbolt II + A-10D 썬더볼트 II A-10D"雷霆二式"攻擊機 - A-10D"雷霆二式"攻击机 + A-10D "雷霆"二式 A-10D Thunderbolt II @@ -1082,9 +1083,9 @@ AW159 Wildcat AW159 Wildcat AW159 ワイルドキャット - AW159 Wildcat - AW159"野貓"直升機 - AW159"野猫"直升机 + AW159 와일드캣 + AW159 "野貓"直升機 + AW159 "野猫" AW159 Wildcat @@ -1099,9 +1100,9 @@ AW159 Wildcat (fegyvertelen) AW159 Wildcat (disarmato) AW159 ワイルドキャット (非武装) - AW159 Wildcat (비무장) - AW159"野貓"直升機 (無武裝) - AW159"野猫"直升机 (无武装) + AW159 와일드캣 (비무장) + AW159 "野貓"直升機 (無武裝) + AW159 "野猫"(无武装) AW159 Wildcat (silahsız) @@ -1111,14 +1112,14 @@ AW101 Merlin AW101 Merlin AW101 Merlin - AW101 Мерлин + AW101 Merlin AW101 Merlin AW101 Merlin AW101 Merlin AW101 マーリン - AW101 Merlin - AW101"灰背隼"運輸直升機 - AW101"灰背隼"运输直升机 + AW101 멀린 + AW101 "灰背隼"運輸直升機 + AW101 "灰背隼" AW101 Merlin @@ -1128,14 +1129,14 @@ L-159 ALCA L-159 ALCA L-159 ALCA - L-159 Альбатрос + L-159 ALCA L-159 ALCA L-159 ALCA L-159 ALCA L-159 ALCA L-159 ALCA L-159先進輕型戰鬥機 - L-159先进轻型战斗机 + L-159 ALCA L-159 ALCA @@ -1145,14 +1146,14 @@ L-159 ALCA (CAS) L-159 ALCA (CAS) L-159 ALCA (CAS) - L-159 Альбатрос (CAS) + L-159 ALCA (поддержка) L-159 ALCA (CAS) L-159 ALCA (Légitámogató) L-159 ALCA (CAS) L-159 ALCA (CAS) L-159 ALCA (근접지원) L-159先進輕型戰鬥機 (近空支援) - L-159先进轻型战斗机 (近空支援) + L-159 ALCA(近空支援) L-159 ALCA (CAS) @@ -1162,14 +1163,14 @@ L-159 ALCA (AA) L-159 ALCA (AA) L-159 ALCA (AA) - L-159 Альбатрос (AA) - L-159 ALCA (ВВ) + L-159 ALCA (ВВ) + L-159 ALCA (AA) L-159 ALCA (Repülő-elhárító) L-159 ALCA (AA) L-159 ALCA (対空) L-159 ALCA (대공) L-159先進輕型戰鬥機 (空對空) - L-159先进轻型战斗机 (空对空) + L-159 ALCA(空对空) L-159 ALCA (AA) @@ -1179,13 +1180,13 @@ JAS 39 Gripen JAS 39 Gripen JAS 39 Gripen - JAS 39 Грипен + JAS 39 Gripen JAS 39 Gripen JAS 39 Gripen JAS 39 グリペン JAS 39 그리펜 JAS 39 獅鷲戰鬥機 - JAS 39 狮鹫战斗机 + JAS 39 "狮鹫" JAS 39 Gripen @@ -1200,9 +1201,9 @@ Ka-60 Kasatka Ka-60 Kasatka Ka-60 カサートカ - Ka-60 Kasatka - Ka-60"逆戟鯨"直升機 - Ka-60"逆戟鲸"直升机 + Ka-60 카사트카 + Ka-60 "逆戟鯨"直升機 + Ka-60 "虎鲸" Ka-60 Kasatka @@ -1213,12 +1214,12 @@ Ka-60 Kasatka (bianco e nero) Ka-60 Kasatka (czarno-biały) Ka-60 Kasatka (preto e branco) - Ka-60 Касатка (белый и черный) + Ka-60 Касатка (чёрно-белый) Ka-60 Kasatka (blanco y negro) - Ka-60 カサートカ (黒 & 白) - Ka-60 Kasatka (검정 및 하양) - Ka-60"逆戟鯨"直升機 (黑&白) - Ka-60"逆戟鲸"直升机 (黑&白) + Ka-60 カサートカ (黒 & 白) + Ka-60 카사트카 (검정 및 하양) + Ka-60 "逆戟鯨"直升機 (黑&白) + Ka-60 "虎鲸"(黑白) Ka-60 Kasatka (Siyah & Beyaz) @@ -1233,9 +1234,9 @@ Ka-60 Kasatka (fegyvertelen) Ka-60 Kasatka (disarmato) Ka-60 カサートカ (非武装) - Ka-60 Kasatka (비무장) - Ka-60"逆戟鯨"直升機 (無武裝) - Ka-60"逆戟鲸"直升机 (无武装) + Ka-60 카사트카 (비무장) + Ka-60 "逆戟鯨"直升機 (無武裝) + Ka-60 "虎鲸"(无武装) Ka-60 Kasatka (Silahsız) @@ -1251,8 +1252,8 @@ Yak-130 Yak-130 Yak-130 - Yak-130"手套"攻擊機 - Yak-130"手套"攻击机 + Yak-130 "手套"攻擊機 + Yak-130 Yak-130 @@ -1268,8 +1269,8 @@ MD 500 MD 500 MD 500 - MD 500"防衛者"直升機 - MD 500"防卫者"直升机 + MD 500 "防衛者"直升機 + MD 500 "防卫者" MD 500 @@ -1286,7 +1287,7 @@ M4A1 SLAM M4A1 SLAM M4A1指向性反裝甲地雷 - M4A1指向性反装甲地雷 + M4A1 指向性反装甲地雷 M4A1 SLAM @@ -1302,8 +1303,8 @@ M18A1 Claymore Mina antiuomo M18A1 クレイモア M18A1 클레이모어 - M18A1"闊刀"地雷 - M18A1"阔刀"地雷 + M18A1 "闊刀"地雷 + M18A1 "阔剑" M18A1 Claymore @@ -1313,14 +1314,14 @@ Ładunek burzący M183 Demoliční nálož M183 M183 Charge de démolition - M183 Комплектный подрывной заряд + M183 комплектный подрывной заряд M183 Sacola de Demolição M183 romboló töltet M183 Demolition Charge Assembly M183 梱包爆薬 M183 폭파 장약 조립 M183炸藥包 - M183炸药包 + M183 炸药包 M183 Demolition Charge Assembly @@ -1329,8 +1330,11 @@ M183 梱包爆薬 (投てき仕様) M183 Demolition Charge (Throwable) Carga de demolición M183 (Lanzable) - M183 Комплектный подрывной заряд (Бросаемый) + M183 комплектный подрывной заряд (бросаемый) Ładunek burzący M183 (Rzucany) + M183 Geballte Sprengladung (Werfbar) + M183 炸药包(可投掷) + M183 폭파 장약 (투척) M112 Demolition Block @@ -1346,7 +1350,7 @@ M112 爆薬ブロック M112 폭파 블럭 M112塑性炸藥 - M112塑性炸药 + M112 塑性炸药 M112 Demolition Block @@ -1355,8 +1359,11 @@ M112 爆薬ブロック (投てき仕様) M112 Demolition Charge (Throwable) Bloque de demolición M112 (Lanzable) - M112 подрывной заряд (Бросаемый) + M112 подрывной заряд (бросаемый) Ładunek burzący M112 (Rzucany) + M112 Sprengladung (Werfbar) + M112 塑性炸药(可投掷) + M112 폭파 장약 (투척) M67 Fragmentation Grenade @@ -1372,7 +1379,7 @@ M67 破片手榴弾 M67 세열 수류탄 M67破片手榴彈 - M67破片手榴弹 + M67 破片手榴弹 M67 El Bombası @@ -1381,13 +1388,15 @@ Mini Granata V40 V40 小型手榴弾 Mini-granat V40 - V40 Мини-граната + V40 мини-граната Mini Granada V40 V40 Mini-Grenade V40迷你手榴彈 V40 Mini-Granát Mini Granada V40 V40 Mini-El Bombası + V40 迷你手榴弹 + V40 소형 수류탄 M83 Smoke Grenade (White) @@ -1396,14 +1405,14 @@ Granat dymny M83 (Biały) M83 Kouřový Granát (Bílý) M83 Grenade fumigène (Blanche) - M83 дымовая граната (Белый) + M83 дымовая граната (белый) M83 Granada de fumaça (Branca) M83 füstgránát (Fehér) M83 Granata fumogena (Bianco) - M18 発煙手榴弾 (白) + M83 発煙手榴弾 (白) M83 연막탄 (하양) M83煙霧彈 (白色) - M83烟雾弹 (白色) + M83 烟雾弹(白色) M83 Sis Bombası (Beyaz) @@ -1413,14 +1422,14 @@ Granat dymny M18 (Niebieski) M18 Kouřový Granát (Modrý) M18 Grenade fumigène (Bleue) - M18 дымовая граната (Синий) + M18 дымовая граната (синий) 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) @@ -1430,14 +1439,14 @@ Granat dymny M18 (Zielony) M18 Kouřový Granát (Zelený) M18 Grenade fumigène (Verte) - M18 дымовая граната (Зелёный) + M18 дымовая граната (зелёный) M18 Granada de fumaça (Verde) M18 füstgránát (Zöld) M18 Granata fumogena (Verde) M18 煙幕手榴弾 (緑) M18 연막탄 (초록) M18煙霧彈 (綠色) - M18烟雾弹 (绿色) + M18 烟雾弹(绿色) M83 Sis Bombası (Yeşil) @@ -1447,14 +1456,14 @@ Granat dymny M18 (Pomarańczowy) M18 Kouřový Granát (Oranžový) M18 Grenade fumigène (Orange) - M18 дымовая граната (Оранжевый) + M18 дымовая граната (оранжевый) 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) @@ -1464,14 +1473,14 @@ Granat dymny M18 (Fioletowy) M18 Kouřový Granát (Fialový) M18 Grenade fumigène (Pourpre) - M18 дымовая граната (Пурпурный) + M18 дымовая граната (пурпурный) 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) @@ -1481,14 +1490,14 @@ Granat dymny M18 (Czerwony) M18 Kouřový Granát (Červený) M18 Grenade fumigène (Rouge) - M18 дымовая граната (Красный) + M18 дымовая граната (красный) M18 Granada de fumaça (Vermelha) M18 füstgránát (Piros) M18 Granata fumogena (Rosso) M18 煙幕手榴弾 (赤) M18 연막탄 (빨강) M18煙霧彈 (紅色) - M18烟雾弹 (红色) + M18 烟雾弹(红色) M83 Sis Bombası (Kırmızı) @@ -1498,14 +1507,14 @@ Granat dymny M18 (Żółty) M18 Kouřový Granát (Žlutý) M18 Grenade fumigène (Jaune) - M183 дымовая граната (Жёлтый) + M18 дымовая граната (жёлтый) 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ı) @@ -1522,7 +1531,7 @@ M15 対戦車地雷 M15 대전차지뢰 M15反坦克地雷 - M15反坦克地雷 + M15 反坦克地雷 M15 Anti-Tank Mayını @@ -1532,14 +1541,14 @@ Mina przeciwpiechotna VS-50 VS-50 Protipěchotní mina VS-50 Mine AP - VS-50 Противопехотная мина + VS-50 противопехотная мина VS-50 Mina antipessoal VS-50 gyalogsági taposóakna VS-50 Mine antiuomo VS-50 対人地雷 VS-50 대인지뢰 VS-50反人員地雷 - VS-50反人员地雷 + VS-50 反人员地雷 VS-50 Anti-Personel Mayını @@ -1549,14 +1558,14 @@ Mina przeciwpiechotna M26 M26 Protipěchotní mina M26 Mine AP bondissante - M26 Противопехотная мина + M26 противопехотная мина M26 Mina saltadora antipessoal M26 gyalogsági ugróakna M26 Mine saltanti antiuomo M26 対人跳躍地雷 M26 대인도약지뢰 M26反人員彈跳雷 - M26反人员弹跳雷 + M26 反人员跳雷 M26 Anti Personel Mayını @@ -1566,14 +1575,14 @@ Mina przeciwpiechotna PMR-3 PMR-3 Protipěchotní mina (drát) PMR-3 Mine AP à traction - PMR-3 Противопехотная мина + PMR-3 противопехотная мина PMR-3 Mina antipessoal (armadilha) PMR-3 botlódrótos gyalogsági akna PMR-3 Mine antiuomo PMR-3 仕掛け型対人地雷 PMR-3 대인인계철선지뢰 PMR-3反人員絆線雷 - PMR-3反人员绊线雷 + PMR-3 反人员绊雷 PMR-3 Telli Anti Personel Mayını @@ -1590,7 +1599,7 @@ P99 P99 P99手槍 - P99手枪 + P99 P99 @@ -1601,13 +1610,13 @@ MP-443 Grach MP-443 Grach MP-443 Grach - МР-443 "Грач" + МР-443 Грач MP-443 Grach MP-443 Grach MP-433 グラッチ - MP-443 Grach - MP-443"烏鴉"手槍 - MP-443"乌鸦"手枪 + MP-443 그라치 + MP-443 "烏鴉"手槍 + MP-443 "乌鸦" MP-443 Grach @@ -1621,10 +1630,10 @@ Custom Covert II Custom Covert II ACP-C2 - カスタム コンバート II - Custom Covert II + カスタム コバートⅡ + 커스텀 커버트 II 特裝隱蔽Ⅱ型手槍 - 特装隐蔽Ⅱ型手枪 + 金柏特特装隐蔽二型 Custom Covert II @@ -1640,9 +1649,9 @@ FNX-45 Tactical FNX-45 Tactical FNX-45 タクティカル - FNX-45 Tactical + FNX-45 택티컬 FNX-45戰術型手槍 - FNX-45战术型手枪 + FNX-45 战术型 FNX-45 Tactical (Green) @@ -1652,14 +1661,14 @@ FNX-45 Tactical (Vert) FNX-45 Tactical (Zöld) FNX-45 Tactical (Verde) - FNX-45 Tactical (Зелёный) + 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戰術型手槍 (綠色) - FNX-45战术型手枪 (绿色) + FNX-45 战术型(绿色) Chiappa Rhino 60DS @@ -1673,9 +1682,9 @@ Chiappa Rhino 60DS Chiappa Rhino 6DS チアッパ ライノ 60DS - Chiappa Rhino 60DS + 키아파 라이노 60DS 齊亞帕"犀牛"60DS左輪手槍 - 齐亚帕"犀牛"60DS左轮手枪 + 齐亚帕"犀牛" 60DS Chiappa Rhino 60DS @@ -1690,9 +1699,9 @@ Taurus Judge Taurus Judge タウルス ジャッジ - Taurus Judge + 타우러스 저지 金牛座"法官"信號槍 - 金牛座"法官"信号枪 + 金牛座"法官" Taurus Judge @@ -1709,7 +1718,7 @@ NLAW NLAW 次世代輕型反坦克導彈發射器 - 次世代轻型反坦克导弹发射器 + NLAW NLAW @@ -1726,8 +1735,8 @@ RPG-32 RPG-32 RPG-32 - RPG-32"哈希姆"火箭發射器 - RPG-32"哈希姆"火箭发射器 + RPG-32 "哈希姆"火箭發射器 + RPG-32 RPG-32 (Green) @@ -1737,14 +1746,14 @@ RPG-32 (Vert) RPG-32 (Zöld) RPG-32 (Verde) - РПГ-32 (Зелёный) + РПГ-32 (зелёный) RPG-32 (Verde) RPG-32 (Verde) RPG-32 (Yeşil) RPG-32 (グリーン) RPG-32 (초록) - RPG-32"哈希姆"火箭發射器 (綠色) - RPG-32"哈希姆"火箭发射器 (绿色) + RPG-32 "哈希姆"火箭發射器 (綠色) + RPG-32(绿色) Mini-Spike (AA) @@ -1754,13 +1763,13 @@ Mini-Spike (AA) Mini-Spike (Repülő-elhárító) Mini-Spike (AA) - Mini-Spike (ПВО) + Mini-Spike (ЗРК) Mini-Spike (AA) Mini-Spike (AA) ミニスパイク (対空) - Mini-Spike (대공) + 스파이크 미사일 (대공) "迷你長釘"導彈發射器 (防空) - "迷你长钉"导弹发射器 (防空) + "迷你长钉"(防空) Mini-Spike (AA) @@ -1771,13 +1780,13 @@ Mini-Spike (AC) Mini-Spike (Tankelhárító) Mini-Spike (AT) - Mini-Spike (ПТ) + Mini-Spike (ПТРК) Mini-Spike (AT) Mini-Spike (AT) - ミニスパイク (対地) - Mini-Spike (대전차) + ミニスパイク (対戦車) + 스파이크 미사일 (대전차) "迷你長釘"導彈發射器 (反坦克) - "迷你长钉"导弹发射器 (反坦克) + "迷你长钉"(反坦) Mini-Spike (AT) @@ -1786,7 +1795,7 @@ Metis-M Метис-М "麥士蒂索人"-M型反坦克導彈 - "麦士蒂索人"-M型反坦克导弹 + "麦士蒂索"-M Metis-M メチス-M Metis-M @@ -1794,14 +1803,15 @@ Metis-M Metis-M Metis-M + 메티스-M Metis-M (Brown) Metis-M (Braun) Metis-M (Brun) - Метис-М (Коричневый) + Метис-М (коричневый) "麥士蒂索人"-M型反坦克導彈(棕色) - "麦士蒂索人"-M型反坦克导弹(棕色) + "麦士蒂索"-M(棕色) Metis-M (Marrone) メチス-M (ブラウン) Metis-M (Brązowy) @@ -1809,14 +1819,15 @@ Metis-M (hnědý) Metis-M (Marrón) Metis-M (Kahverengi) + 메티스-M (갈색) Metis-M (Green) Metis-M (Grün) Metis-M (Vert) - Метис-М (Зелёный) + Метис-М (зелёный) "麥士蒂索人"-M型反坦克導彈(綠色) - "麦士蒂索人"-M型反坦克导弹(绿色) + "麦士蒂索"-M(绿色) Metis-M (Verde) メチス-M (グリーン) Metis-M (Zielony) @@ -1824,6 +1835,7 @@ Metis-M (zelený) Metis-M (Verde) Metis-M (Yeşil) + 메티스-M (녹색) MX @@ -1839,7 +1851,7 @@ MX MX MX突擊步槍 - MX突击步枪 + MX MX @@ -1850,13 +1862,13 @@ MX (Noir) MX (Fekete) MX (Negro) - MX (Чёрный) + MX (чёрный) MX (Preto) MX (Nero) MX (ブラック) MX (검정) MX突擊步槍 (黑色) - MX突击步枪 (黑色) + MX(黑色) MX (Siyah) @@ -1872,7 +1884,7 @@ MX (Cáqui) MX (카키) MX(卡其色) - MX(カーキ) + MX (カーキ) MX (Haki) @@ -1889,7 +1901,7 @@ MXC MXC MXC卡賓步槍 - MXC卡宾步枪 + MXC MXC @@ -1900,13 +1912,13 @@ MXC (Noir) MXC (Fekete) MXC (Negro) - MXC (Чёрный) + MXC (чёрный) MXC (Preto) MXC (Nero) MXC (ブラック) MXC (검정) MXC卡賓步槍 (黑色) - MXC卡宾步枪 (黑色) + MXC(黑色) MXC (Siyah) @@ -1922,7 +1934,7 @@ MXC (Cáqui) MXC (카키) MXC(卡其色) - MXC(カーキ) + MXC (カーキ) MXC (Haki) @@ -1939,7 +1951,7 @@ MX 3GL MX 3GL MX突擊步槍 (3連裝榴彈) - MX突击步枪 (3连装榴弹) + MX 3GL MX 3GL @@ -1950,13 +1962,13 @@ MX 3GL (Noir) MX 3GL (Fekete) MX 3GL (Negro) - MX 3GL (Чёрный) + MX 3GL (чёрный) MX 3GL (Preto) MX 3GL (Nero) MX 3GL (ブラック) MX 3GL (검정) - MX突擊步槍 (3連裝榴彈-黑色) - MX突击步枪 (3连装榴弹-黑色) + MX突擊步槍 (3連裝榴彈—黑色) + MX 3GL(黑色) MX 3GL (Siyah) @@ -1972,7 +1984,7 @@ MX 3GL (Cáqui) MX 3GL (카키) MX 3GL(卡其色) - MX 3GL(カーキ) + MX 3GL (カーキ) MX 3GL (Haki) @@ -1989,7 +2001,7 @@ MX LSW MX LSW MX輕型機槍 - MX轻型机枪 + MX LSW MX LSW @@ -2000,13 +2012,13 @@ MX LSW (Noir) MX LSW (Fekete) MX LSW (Negro) - MX LSW (Чёрный) + MX LSW (чёрный) MX LSW (Preto) MX LSW (Nero) MX LSW (ブラック) MX LSW (검정) MX輕型機槍 (黑色) - MX轻型机枪 (黑色) + MX LSW(黑色) MX LSW (Siyah) @@ -2022,7 +2034,7 @@ MX LSW (Cáqui) MX LSW (카키) MX LSW(卡其色) - MX LSW(カーキ) + MX LSW (カーキ) MX LSW (Haki) @@ -2039,7 +2051,7 @@ MXM MXM MXM精準步槍 - MXM精准步枪 + MXM MXM @@ -2050,13 +2062,13 @@ MXM (Noir) MXM (Fekete) MXM (Negro) - MXM (Чёрный) + MXM (чёрный) MXM (Preto) MXM (Nero) MXM (ブラック) MXM (검정) MXM精準步槍 (黑色) - MXM精准步枪 (黑色) + MXM(黑色) MXM (Siyah) @@ -2072,7 +2084,7 @@ MXM (Cáqui) MXM (카키) MXM(卡其色) - MXM(カーキ) + MXM (カーキ) MXM (Haki) @@ -2087,9 +2099,9 @@ KT2002 Sama KT2002 Katiba KH2002 サマ - KH2002 Sama - KH2002"海白爾"突擊步槍 - KH2002"海白尔"突击步枪 + KH2002 사마 + KH2002 "海白爾"突擊步槍 + KH2002 Sama KH2002 Sama @@ -2104,9 +2116,9 @@ KT2002C Sama KT2002C Katiba KH2002C サマ - KH2002C Sama + KH2002C 사마 KH2002C"海白爾"卡賓步槍 - KH2002C"海白尔"卡宾步枪 + KH2002C Sama KH2002C Sama @@ -2121,9 +2133,9 @@ KT2002 Sama KGL KT2002 Katiba KGL KH2002 サマ KGL - KH2002 Sama KGL - KH2002"海白爾"突擊步槍 (榴彈) - KH2002"海白尔"突击步枪 (榴弹) + KH2002 사마 KGL + KH2002 "海白爾"突擊步槍 (榴彈) + KH2002 Sama KGL KH2002 Sama KGL @@ -2134,13 +2146,13 @@ F2000 (Camo) F2000 (Terepmintás) F2000 (Camuflaje) - F2000 (Камо) + F2000 (камуфляжный) F2000 (Camo) F2000 (Camo) F2000 (カモフラージュ) F2000 (위장) F2000突擊步槍 (迷彩) - F2000突击步枪 (迷彩) + F2000(迷彩) F2000 (Kamuflaj) @@ -2157,7 +2169,7 @@ F2000 F2000 F2000突擊步槍 - F2000突击步枪 + F2000 F2000 @@ -2168,13 +2180,13 @@ F2000 Tactical (Camo) F2000 Tactical (Terepmintás) F2000 Tactical (Camuflaje) - F2000 Tactical (Камо) + F2000 Tactical (камуфляжный) F2000 Tactical (Camo) F2000 Tactical (Camo) F2000 タクティカル (カモフラージュ) - F2000 Tactical (위장) + F2000 택티컬 (위장) F2000戰術型突擊步槍 (迷彩) - F2000战术型突击步枪 (迷彩) + F2000 战术型(迷彩) F2000 Tactical (Kamuflaj) @@ -2189,9 +2201,9 @@ F2000 Tactical F2000 Tactical F2000 タクティカル - F2000 Tactical + F2000 택티컬 F2000戰術型突擊步槍 - F2000战术型突击步枪 + F2000 战术型 F2000 Tactical @@ -2202,13 +2214,13 @@ F2000 EGLM (Camo) F2000 EGLM (Terepmintás) F2000 EGLM (Camuflaje) - F2000 EGLM (Камо) + F2000 EGLM (камуфляжный) F2000 EGLM (Camo) F2000 EGLM (Camo) F2000 EGLM (カモフラージュ) F2000 EGLM (위장) - F2000突擊步槍 (榴彈-迷彩) - F2000突击步枪 (榴弹-迷彩) + F2000突擊步槍 (榴彈—迷彩) + F2000 ELGM(迷彩) F2000 EGLM (Kamuflaj) @@ -2225,7 +2237,7 @@ F2000 EGLM F2000 EGLM F2000突擊步槍 (榴彈) - F2000突击步枪 (榴弹) + F2000 ELGM F2000 EGLM @@ -2242,7 +2254,7 @@ TAR-21 TAR-21 TAR-21突擊步槍 - TAR-21突击步枪 + TAR-21 TAR-21 @@ -2259,7 +2271,7 @@ CTAR-21 CTAR-21 CTAR-21卡賓步槍 - CTAR-21卡宾步枪 + CTAR-21 CTAR-21 @@ -2276,7 +2288,7 @@ GTAR-21 EGLM GTAR-21 EGLM GTAR-21突擊步槍 (榴彈) - GTAR-21突击步枪 (榴弹) + GTAR-21 EGLM GTAR-21 EGLM @@ -2291,9 +2303,9 @@ Vector SMG Vector SMG ベクター SMG - Vector SMG + 벡터 SMG "維克特"衝鋒槍 - "维克特"冲锋枪 + Vector 冲锋枪 Vector SMG @@ -2308,9 +2320,9 @@ Scorpion Evo 3 A1 Scorpion Evo 3 A1 スコーピオン エボ 3 A1 - Scorpion Evo 3 A1 + 스콜피온 에보 3 A1 "蠍式"Evo 3 A1衝鋒槍 - "蝎式"Evo 3 A1冲锋枪 + Evo 3 A1 "蝎" Scorpion Evo 3 A1 @@ -2327,7 +2339,7 @@ CPW CPW 緊湊型個人衝鋒槍 - 紧凑型个人冲锋枪 + CPW CPW @@ -2344,7 +2356,7 @@ RFB SDAR RFB SDAR 犢牛式水陸兩用步槍 - 犊牛式水陆两用步枪 + RFB SDAR RFB SDAR @@ -2359,9 +2371,9 @@ Stoner 99 LMG Stoner 99 LMG ストーナー 99 LMG - Stoner 99 LMG + 스토너 99 LMG 斯通納99輕機槍 - 斯通纳99轻机枪 + 斯通纳 99 Stoner 99 LMG @@ -2376,9 +2388,9 @@ Negev NG7 Negev NG7 ネゲフ NG7 - Negev NG7 + 네게브 NG7 內蓋夫NG7機槍 - 内盖夫NG7机枪 + 内格夫 NG7 Negev NG7 @@ -2393,9 +2405,9 @@ Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR - Mk14 Mod 1 EBR + Mk.14 Mod 1 EBR Mk14一型增強型戰鬥步槍 - Mk14一型增强型战斗步枪 + Mk14 Mod 1 EBR Mk14 Mod 1 EBR @@ -2410,9 +2422,9 @@ GM6 Lynx GM6 Lynx GM6 リンクス - GM6 Lynx - GM6"天貓"反器材狙擊步槍 - GM6"天猫"反器材狙击步枪 + GM6 링스 + GM6 "天貓"反器材狙擊步槍 + GM6 "猞猁" GM6 Lynx @@ -2423,13 +2435,13 @@ GM6 Lynx (Camo) GM6 Gepárd (Terepmintás) GM6 Lynx (Camuflaje) - GM6 Lynx (Камо) + GM6 Lynx (камуфляжный) GM6 Lynx (Camo) GM6 Lynx (Camo) GM6 リンクス (カモフラージュ) - GM6 Lynx (위장) - GM6"天貓"反器材狙擊步槍 (迷彩) - GM6"天猫"反器材狙击步枪 (迷彩) + GM6 링스 (위장) + GM6 "天貓"反器材狙擊步槍 (迷彩) + GM6 "猞猁"(迷彩) GM6 Lynx (Kamufulaj) @@ -2444,9 +2456,9 @@ M200 Intervention M200 Intervention M200 インターベンション - M200 Intervention + M200 인터벤션 M200干預型狙擊步槍 - M200干预型狙击步枪 + M200 "干预" M200 Intervention @@ -2457,13 +2469,13 @@ M200 Intervention (Camo) M200 Intervention (Terepmintás) M200 Intervention (Camuflaje) - M200 Intervention (Камо) + M200 Intervention (камуфляжный) M200 Intervention (Camo) M200 Intervention (Camo) M200 インターベンション (カモフラージュ) - M200 Intervention (위장) + M200 인터벤션 (위장) M200干預型狙擊步槍 (迷彩) - M200干预型狙击步枪 (迷彩) + M200 "干预"(迷彩) M200 Intervention (kamuflaj) @@ -2480,7 +2492,7 @@ VS-121 VS-121 VS-121狙擊步槍 - VS-121狙击步枪 + VS-121 VS-121 @@ -2495,9 +2507,9 @@ Noreen "Bad News"ULR Noreen "Bad News" ULR ノレーン "バッド ニュース" ULR - Noreen "Bad News" ULR + 노린 "배드뉴스" ULR 諾琳"壞消息"極距狙擊步槍 - 诺琳"坏消息"极距狙击步枪 + 诺琳 "坏消息" 极距狙击步枪 Noreen "Bad News" ULR @@ -2505,16 +2517,16 @@ Noreen "Bad News" ULR (Černá) Noreen "Bad News" ULR (Noir) Noreen "Bad News" ULR (Negro) - Noreen "Bad News" ULR (Чёрный) + Noreen "Bad News" ULR (чёрный) Noreen "Bad News" ULR (Schwarz) Noreen "Bad News" ULR (czarny) Noreen "Bad News" ULR (Nero) Noreen "Bad News"ULR (Fekete) Noreen "Bad News" ULR (Preto) ノレーン "バッド ニュース" ULR (ブラック) - Noreen "Bad News" ULR (검정) + 노린 "배드뉴스" ULR (검정) 諾琳"壞消息"極距狙擊步槍 (黑色) - 诺琳"坏消息"极距狙击步枪 (黑色) + 诺琳 "坏消息" 极距狙击步枪(黑色) Noreen "Bad News" ULR (Siyah) @@ -2522,16 +2534,16 @@ Noreen "Bad News" ULR (Kamufláž) Noreen "Bad News" ULR (Camo) Noreen "Bad News" ULR (Camuflaje) - Noreen "Bad News" ULR (Камо) + Noreen "Bad News" ULR (камуфляжный) Noreen "Bad News" ULR (Tarnmuster) Noreen "Bad News" ULR (kamuflaż) Noreen "Bad News" ULR (Camo) Noreen "Bad News"ULR (Terepmintás) Noreen "Bad News" ULR (Camuflagem) ノレーン "バッド ニュース" ULR (カモフラージュ) - Noreen "Bad News" ULR (위장) + 노린 "배드뉴스" ULR (위장) 諾琳"壞消息"極距狙擊步槍 (迷彩) - 诺琳"坏消息"极距狙击步枪 (迷彩) + 诺琳 "坏消息" 极距狙击步枪(迷彩) Noreen "Bad News" ULR (Kamufulaj) @@ -2539,16 +2551,16 @@ Noreen "Bad News" ULR (Písková) Noreen "Bad News" ULR (Beige) Noreen "Bad News" ULR (Arena) - Noreen "Bad News" ULR (Песочный) + Noreen "Bad News" ULR (песочный) Noreen "Bad News" ULR (sandfarben) Noreen "Bad News" ULR (piaskowy) Noreen "Bad News" ULR (Sabbia) Noreen "Bad News"ULR (Homok) Noreen "Bad News" ULR (Deserto) ノレーン "バッド ニュース" ULR (砂地) - Noreen "Bad News" ULR (모래) + 노린 "배드뉴스" ULR (모래) 諾琳"壞消息"極距狙擊步槍 (沙色) - 诺琳"坏消息"极距狙击步枪 (沙色) + 诺琳 "坏消息" 极距狙击步枪(沙色) Noreen "Bad News" ULR (Çöl) @@ -2563,9 +2575,9 @@ SIG 556 SIG 556 SIG 556 - SIG 556 + 시그 556 SIG 556精準步槍 - SIG 556精准步枪 + SIG 556 SIG 556 @@ -2573,16 +2585,16 @@ SIG 556 (Černá) SIG 556 (Noir) SIG 556 (Negro) - SIG 556 (Чёрный) + SIG 556 (чёрный) SIG 556 (czarny) SIG 556 (Schwarz) SIG 556 (Nero) SIG 556 (Fekete) SIG 556 (Preto) SIG 556 (ブラック) - SIG 556 (검정) + 시그 556 (검정) SIG 556精準步槍 (黑色) - SIG 556精准步枪 (黑色) + SIG 556(黑色) SIG 556 (Siyah) @@ -2590,16 +2602,16 @@ SIG 556 (Khaki) SIG 556 (Kaki) SIG 556 (Caqui) - SIG 556 (Хаки) + SIG 556 (хаки) SIG 556 (Khaki) SIG 556 (Khaki) SIG 556 (Khaki) SIG 556 (Khaki) SIG 556 (Caqui) SIG 556 (カーキ) - SIG 556 (카키) + 시그 556 (카키) SIG 556精準步槍 (卡其色) - SIG 556精准步枪 (卡其色) + SIG 556(卡其色) SIG 556 (Haki) @@ -2607,16 +2619,16 @@ SIG 556 (Písková) SIG 556 (Beige) SIG 556 (Arena) - SIG 556 (Песочный) + SIG 556 (песочный) SIG 556 (piaskowy) SIG 556 (sandfarben) SIG 556 (Sabbia) SIG 556 (Homok) SIG 556 (Deserto) SIG 556 (サンド) - SIG 556 (모래) + 시그 556 (모래) SIG 556精準步槍 (沙色) - SIG 556精准步枪 (沙色) + SIG 556(沙色) SIG 556 (Kum) @@ -2624,16 +2636,16 @@ SIG 556 (Kamufláž) SIG 556 (Camo) SIG 556 (Camuflaje) - SIG 556 (Камо) + SIG 556 (камуфляжный) SIG 556 (kamuflaż) SIG 556 (Tarnmuster) SIG 556 (Camo) SIG 556 (Terepmintás) SIG 556 (Camuflagem) SIG 556 (カモフラージュ) - SIG 556 (위장) + 시그 556 (위장) SIG 556精準步槍 (迷彩) - SIG 556精准步枪 (迷彩) + SIG 556(迷彩) SIG 556 (Kamufulaj) @@ -2641,16 +2653,16 @@ SIG 556 (Lesní) SIG 556 (Woodland) SIG 556 (Bosque) - SIG 556 (Лесной) + SIG 556 (Woodland) SIG 556 (leśny) SIG 556 (Grünes Tarnmuster) SIG 556 (Woodland) SIG 556 (Erdőmintás) SIG 556 (Floresta) SIG 556 (森林) - SIG 556 (우드랜드) + 시그 556 (수풀) SIG 556精準步槍 (森林迷彩) - SIG 556精准步枪 (森林迷彩) + SIG 556(森林迷彩) SIG 556 (Orman) @@ -2665,9 +2677,9 @@ ASP-1 Kir ASP-1 Kir ASP-1 キール - ASP-1 キール - ASP-1"基爾"消音狙擊步槍 - ASP-1"基尔"消音狙击步枪 + ASP-1 키르 + ASP-1 "基爾"消音狙擊步槍 + ASP-1 "基尔" ASP-1 Kir @@ -2675,16 +2687,16 @@ ASP-1 Kir (Černá) ASP-1 Kir (Noir) ASP-1 Kir (Negro) - ASP-1 Kir (Чёрный) + ASP-1 Kir (чёрный) ASP-1 Kir (Schwarz) ASP-1 Kir (czarny) ASP-1 Kir (Nero) ASP-1 Kir (Fekete) ASP-1 Kir (Preto) ASP-1 キール (ブラック) - ASP-1 Kir (검정) - ASP-1"基爾"消音狙擊步槍 (黑色) - ASP-1"基尔"消音狙击步枪 (黑色) + ASP-1 키르 (검정) + ASP-1 "基爾"消音狙擊步槍 (黑色) + ASP-1 "基尔"(黑色) ASP-1 Kir (Siyah) @@ -2692,16 +2704,16 @@ ASP-1 Kir (Žlutohnědá) ASP-1 Kir (Tan) ASP-1 Kir (Tan) - ASP-1 Kir (Бронзовый) + ASP-1 Kir (пустынный) ASP-1 Kir (Hellbraun) ASP-1 Kir (Tan) ASP-1 Kir (Tan) ASP-1 Kir (Cserszín) ASP-1 Kir (Deserto) ASP-1 キール (タン) - ASP-1 Kir (황갈) - ASP-1"基爾"消音狙擊步槍 (黃褐色) - ASP-1"基尔"消音狙击步枪 (黄褐色) + ASP-1 키르 (황갈) + ASP-1 "基爾"消音狙擊步槍 (黃褐色) + ASP-1 "基尔"(沙色) ASP-1 Kir (Tan) @@ -2716,9 +2728,9 @@ Cyrus Cyrus サイラス - Cyrus + 사이러스 "居鲁士"狙擊步槍 - "居鲁士"狙击步枪 + "居鲁士" Cyrus @@ -2726,16 +2738,16 @@ Cyrus (Černá) Cyrus (Noir) Cyrus (Negro) - Cyrus (Чёрный) + Cyrus (чёрный) Cyrus (Schwarz) Cyrus (czarny) Cyrus (Nero) Cyrus (Fekete) Cyrus (Preto) サイラス (ブラック) - Cyrus (검정) + 사이러스 (검정) "居鲁士"狙擊步槍 (黑色) - "居鲁士"狙击步枪 (黑色) + "居鲁士"(黑色) Cyrus (Siyah) @@ -2743,16 +2755,16 @@ Cyrus (Hex) Cyrus (Hex) Cyrus (Hex) - Cyrus (Гекс) + Cyrus (гекс) Cyrus (Hex) Cyrus (hex) Cyrus (Hex) Cyrus (Hex) Cyrus (Hex) サイラス (ヘックス) - Cyrus (육각) + 사이러스 (육각) "居鲁士"狙擊步槍 (數位蜂巢迷彩) - "居鲁士"狙击步枪 (数位蜂巢迷彩) + "居鲁士"(蜂巢迷彩) Cyrus (Hex) @@ -2760,16 +2772,16 @@ Cyrus (Žlutohnědá) Cyrus (Tan) Cyrus (Tan) - Cyrus (Бронза) + Cyrus (пустынный) Cyrus (Hellbraun) Cyrus (podpalany) Cyrus (Tan) Cyrus (Cserszín) Cyrus (Deserto) サイラス (タン) - Cyrus (황갈) + 사이러스 (황갈) "居鲁士"狙擊步槍 (黃褐色) - "居鲁士"狙击步枪 (黄褐色) + "居鲁士"(沙色) Cyrus (Tan) @@ -2786,7 +2798,7 @@ M14 M14 M14精準步槍 - M14精准步枪 + M14 M14 @@ -2794,7 +2806,7 @@ M14 (Kamufláž) M14 (Camo) M14 (Camuflaje) - M14 (Камо) + M14 (камуфляжный) M14 (kamuflaż) M14 (Tarnmuster) M14 (Camo) @@ -2803,7 +2815,7 @@ M14 (カモフラージュ) M14 (위장) M14精準步槍 (迷彩) - M14精准步枪 (迷彩) + M14(迷彩) M14 (Kamufulaj) @@ -2811,7 +2823,7 @@ M14 (Olivová) M14 (Olive) M14 (Oliva) - M14 (Олива) + M14 (олива) M14 (oliwkowy) M14 (Olivgrün) M14 (Olive) @@ -2820,7 +2832,7 @@ M14 (オリーブド ラブ) M14 (올리브) M14精準步槍 (橄欖色) - M14精准步枪 (橄榄色) + M14(橄榄色) M14 (Zeytin Yeşili) @@ -2837,7 +2849,7 @@ HK 121 HK121 HK121中型機槍 - HK121中型机枪 + HK121 HK121 @@ -2845,7 +2857,7 @@ HK121 (Hex) HK121 (Hex) HK121 (Hex) - HK121 (Гекс) + HK121 (гекс) HK121 (Hex) HK121 (hex) HK121 (Hex) @@ -2854,7 +2866,7 @@ HK 121 (ヘックス) HK121 (육각) HK121中型機槍 (數位蜂巢迷彩) - HK121中型机枪 (数位蜂巢迷彩) + HK121(蜂巢迷彩) HK121 (Hex) @@ -2862,7 +2874,7 @@ HK121 (Žlutohnědá) HK121 (Tan) HK121 (Tan) - HK121 (Бронза) + HK121 (пустынный) HK121 (Hellbraun) HK121 (podpalany) HK121 (Tan) @@ -2871,7 +2883,7 @@ HK 121 (タン) HK121 (황갈) HK121機槍 (黃褐色) - HK121机枪 (黄褐色) + HK121(沙色) HK121 (Tan) @@ -2888,7 +2900,7 @@ LWMMG LWMMG 輕量化中型機槍 - 轻量化中型机枪 + LWMMG LWMMG @@ -2905,7 +2917,7 @@ LWMMG (マルチカモ) LWMMG (MTP) 輕量化中型機槍 (多地形迷彩) - 轻量化中型机枪 (多地形迷彩) + LWMMG(多地形迷彩) LWMMG (MTP) @@ -2913,7 +2925,7 @@ LWMMG (Černá) LWMMG (Noir) LWMMG (Negro) - LWMMG (Чёрный) + LWMMG (чёрный) LWMMG (czarny) LWMMG (Schwarz) LWMMG (Nero) @@ -2922,7 +2934,7 @@ LWMMG (ブラック) LWMMG (검정) 輕量化中型機槍 (黑色) - 轻量化中型机枪 (黑色) + LWMMG(黑色) LWMMG (Siyah) @@ -2930,7 +2942,7 @@ LWMMG (Písková) SPMG (Beige) LWMMG (Arena) - LWMMG (Песочный) + LWMMG (песочный) LWMMG (piaskowy) LWMMG (sandfarben) LWMMG (Sabbia) @@ -2939,7 +2951,7 @@ LWMMG (サンド) LWMMG (모래) 輕量化中型機槍 (沙色) - 轻量化中型机枪 (沙色) + LWMMG(沙色) LWMMG (Kum) @@ -2954,7 +2966,7 @@ Jeep Wrangler Jeep Wrangler ジープ ラングラー - Jeep Wrangler + 지프 랭글러 "牧馬人"吉普車 "牧马人"吉普车 Jeep Wrangler @@ -2962,7 +2974,7 @@ Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) - "牧马人"吉普车(SPG-9火箭筒) + "牧马人"吉普车(SPG-9火箭筒) "牧馬人"吉普車 (SPG-9火箭筒) ジープ ラングラー (SPG-9) Jeep Wrangler (SPG-9) @@ -2973,21 +2985,23 @@ Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) + 지프 랭글러 (SPG-9) Jeep Wrangler (LMG) Jeep Wrangler (LMG) - "牧马人"吉普车(轻机枪) + "牧马人"吉普车(轻机枪) "牧馬人"吉普車 (輕機槍) ジープ ラングラー (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) - Jeep Wrangler (Пулемет) + Jeep Wrangler (с пулемётом) Jeep Wrangler (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) + 지프 랭글러 (경기관총) Cessna TTx @@ -3001,9 +3015,9 @@ Cessna TTx Cessna TTx セスナ TTx - Cessna TTx + 세스나 TTx "賽斯納"TTx單引擎飛機 - "赛斯纳"TTx单引擎飞机 + "赛斯纳"TTx 单引擎飞机 Cessna TTx @@ -3018,9 +3032,9 @@ Cessna TTx (Racing) Cessna TTx (Racing) セスナ TTx (レース仕様) - Cessna TTx (경주용) + 세스나 TTx (경주용) "賽斯納"TTx單引擎飛機 (競速) - "赛斯纳"TTx单引擎飞机 (竞速) + "赛斯纳"TTx 单引擎飞机(竞速) Cessna TTx (Racing) @@ -3034,10 +3048,10 @@ Burraq UCAV Burraq UCAV Burraq UCAV - ブラーク UCAV - Burraq UCAV + ブラク UCAV + 부라크 UCAV "柏拉格"空中無人戰鬥載具 - "柏拉格"空中无人战斗载具 + "柏拉格" 战斗无人机 Burraq UCAV @@ -3045,7 +3059,7 @@ QBZ-95-1 (Černá) QBZ-95-1 (Noir) QBZ-95-1 (Negro) - QBZ-95-1 (Чёрный) + QBZ-95-1 (чёрный) QBZ-95-1 (czarny) QBZ-95-1 (Schwarz) QBZ-95-1 (Nero) @@ -3054,7 +3068,7 @@ QBZ-95-1 (ブラック) QBZ-95-1 (검정) QBZ-95-1式自動步槍 (黑色) - QBZ-95-1式自动步枪 (黑色) + 95-1式自动步枪(黑色) QBZ-95-1 (Siyah) @@ -3064,14 +3078,14 @@ QBZ-95-1 (zielony hex) QBZ-95-1 (Zelený Hex) QBZ-95-1 (Hex Vert) - QBZ-95-1 (Зелёный Гекс) + 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式自动步枪 (绿色数位蜂巢迷彩) + 95-1式自动步枪(绿色蜂巢迷彩) QBZ-95-1 (Yeşil Hex) @@ -3081,14 +3095,14 @@ QBZ-95-1 (hex) QBZ-95-1 (Hex) QBZ-95-1 (Hex) - QBZ-95-1 (Гекс) + 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式自动步枪 (数位蜂巢迷彩) + 95-1式自动步枪(蜂巢迷彩) QBZ-95-1 (Hex) @@ -3096,7 +3110,7 @@ QBZ-95-1 GL (Černá) QBZ-95-1 GL (Noir) QBZ-95-1 GL (Negro) - QBZ-95-1 GL (Чёрный) + QBZ-95-1 GL (чёрный) QBZ-95-1 GL (czarny) QBZ-95-1 GL (Schwarz) QBZ-95-1 GL (Nero) @@ -3104,8 +3118,8 @@ QBZ-95-1 GL (Preto) QBZ-95-1 GL (ブラック) QBZ-95-1 GL (검정) - QBZ-95-1式自動步槍 (榴彈-黑色) - QBZ-95-1式自动步枪 (榴弹-黑色) + QBZ-95-1式自動步槍 (榴彈—黑色) + 95-1式自动步枪 10A式榴弹(黑色) QBZ-95-1 GL (Siyah) @@ -3115,14 +3129,14 @@ QBZ-95-1 GL (zielony hex) QBZ-95-1 GL (Zelený Hex) QBZ-95-1 GL (Hex Vert) - QBZ-95-1 GL (Зелёный Гекс) + 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式自動步槍 (榴彈-綠色數位蜂巢迷彩) - QBZ-95-1式自动步枪 (榴弹-绿色数位蜂巢迷彩) + QBZ-95-1式自動步槍 (榴彈—綠色數位蜂巢迷彩) + 95-1式自动步枪 10A式榴弹(绿色蜂巢迷彩) QBZ-95-1 GL (Yeşil Hex) @@ -3132,14 +3146,14 @@ 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 (Hex) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) QBZ-95-1 GL (ヘックス) QBZ-95-1 GL (육각) - QBZ-95-1式自動步槍 (榴彈-數位蜂巢迷彩) - QBZ-95-1式自动步枪 (榴弹-数位蜂巢迷彩) + QBZ-95-1式自動步槍 (榴彈—數位蜂巢迷彩) + 95-1式自动步枪 10A式榴弹(蜂巢迷彩) QBZ-95-1 GL (Hex) @@ -3147,7 +3161,7 @@ QBZ-95-1 LSW (Černá) QBZ-95-1 LSW (Noir) QBZ-95-1 LSW (Negro) - QBZ-95-1 LSW (Чёрный) + QBZ-95-1 LSW (чёрный) QBZ-95-1 LSW (czarny) QBZ-95-1 LSW (Schwarz) QBZ-95-1 LSW (Nero) @@ -3156,7 +3170,7 @@ QBZ-95-1 LSW (ブラック) QBZ-95-1 LSW (검정) QBZ-95-1式輕機槍 (黑色) - QBZ-95-1式轻机枪 (黑色) + 95-1式班用机枪(黑色) QBZ-95-1 LSW (Siyah) @@ -3166,14 +3180,14 @@ QBZ-95-1 LSW (zielony hex) QBZ-95-1 LSW (Zelený Hex) QBZ-95-1 LSW (Hex Vert) - QBZ-95-1 LSW (Зелёный Гекс) + 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式輕機槍 (綠色數位蜂巢迷彩) - QBZ-95-1式轻机枪 (绿色数位蜂巢迷彩) + 95-1式班用机枪(绿色蜂巢迷彩) QBZ-95-1 LSW (Yeşil Hex) @@ -3183,14 +3197,14 @@ 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 (Hex) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (ヘックス) QBZ-95-1 LSW (육각) QBZ-95-1式輕機槍 (數位蜂巢迷彩) - QBZ-95-1式轻机枪 (数位蜂巢迷彩) + 95-1式班用机枪(蜂巢迷彩) QBZ-95-1 LSW (Hex) @@ -3198,7 +3212,7 @@ QBU-88 (Černá) QBU-88 (Noir) QBU-88 (Negro) - QBU-88 (Чёрный) + QBU-88 (чёрный) QBU-88 (czarny) QBU-88 (Schwarz) QBU-88 (Nero) @@ -3207,7 +3221,7 @@ QBU-88 (ブラック) QBU-88 (검정) QBU-88式狙擊步槍 (黑色) - QBU-88式狙击步枪 (黑色) + 88式狙击步枪(黑色) QBU-88 (Siyah) @@ -3217,14 +3231,14 @@ QBU-88 (zielony hex) QBU-88 (Zelený Hex) QBU-88 (Hex Vert) - QBU-88 (Зелёный Гекс) + QBU-88 (зелёный гекс) QBU-88 (Verde Hex) QBU-88 (Zöld Hex) QBU-88 (Hex Verde) QBU-88 (緑ヘックス) QBU-88 (초록육각) QBU-88式狙擊步槍 (綠色數位蜂巢迷彩) - QBU-88式狙击步枪 (绿色数位蜂巢迷彩) + 88式狙击步枪(绿色蜂巢迷彩) QBU-88 (Yeşil Hex) @@ -3234,14 +3248,14 @@ QBU-88 (hex) QBU-88 (Hex) QBU-88 (Hex) - QBU-88 (Гекс) + QBU-88 (гекс) QBU-88 (Hex) QBU-88 (Hex) QBU-88 (Hex) QBU-88 (ヘックス) QBU-88 (육각) QBU-88式狙擊步槍 (數位蜂巢迷彩) - QBU-88式狙击步枪 (数位蜂巢迷彩) + 88式狙击步枪(蜂巢迷彩) QBU-88 (Hex) @@ -3251,14 +3265,14 @@ GM6 Lynx (Zielony hex) GM6 Lynx (Zelený Hex) GM6 Lynx (Hex Vert) - GM6 Lynx (Зелёный Гекс) + GM6 Lynx (зелёный гекс) GM6 Lynx (Verde Hex) GM6 Lynx (Zöld Hex) GM6 Lynx (Hex Verde) GM6 リンクス (緑ヘックス) - GM6 Lynx (초록육각) - GM6"天貓"反器材狙擊步槍 (綠色數位蜂巢迷彩) - GM6"天猫"反器材狙击步枪 (绿色数位蜂巢迷彩) + GM6 링스 (초록육각) + GM6 "天貓"反器材狙擊步槍 (綠色數位蜂巢迷彩) + GM6 "猞猁"(绿色蜂巢迷彩) GM6 Lynx (Yeşil Hex) @@ -3273,9 +3287,9 @@ FN Minimi SPW FN Minimi SPW FN ミニミ SPW - FN Minimi SPW + FN 미니미 SPW FN Minimi班用自動機槍 - FN Minimi班用自动机枪 + FN Minimi 班用自动机枪 FN Minimi SPW @@ -3290,9 +3304,9 @@ M200 Intervention (Trópico) M200 Intervention (Tropico) M200 インターベンション (熱帯) - M200 Intervention (열대) + M200 인터벤션 (열대) M200干預型狙擊步槍 (熱帶迷彩) - M200干预型狙击步枪 (热带迷彩) + M200 "干预"(热带迷彩) M200 Intervention (Tropic) @@ -3309,212 +3323,212 @@ MP5K MP5K MP5K衝鋒槍 - MP5K冲锋枪 + MP5K MP5K - HK416A5 11" (Black) - HK416A5 11" (Černá) - HK416A5 11" (Noir) - HK416A5 11" (Negro) - HK416A5 11" (Чёрный) - HK416A5 11" (czarny) - HK416A5 11" (Schwarz) - HK416A5 11" (Nero) - HK416A5 11" (Fekete) - HK416A5 11" (Preto) - HK416A5 11" (ブラック) - HK416A5 11" (검정) - HK416A5 11"突擊步槍 (黑色) - HK416A5 11"突击步枪 (黑色) - HK416A5 11" (Siyah) + HK416A5 11 " (Black) + HK416A5 11 " (Černá) + HK416A5 11 " (Noir) + HK416A5 11 " (Negro) + HK416A5 11 " (чёрный) + HK416A5 11 " (czarny) + HK416A5 11 " (Schwarz) + HK416A5 11 " (Nero) + HK416A5 11 " (Fekete) + HK416A5 11 " (Preto) + HK416A5 11 " (ブラック) + HK416A5 11인치 (검정) + HK416A5 11 "突擊步槍 (黑色) + HK416A5 11英寸(黑色) + HK416A5 11 " (Siyah) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Kaki) - HK416A5 11" (Caqui) - HK416A5 11" (Хаки) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Caqui) - HK416A5 11" (カーキ) - HK416A5 11" (카키) - HK416A5 11"突擊步槍 (卡其色) - HK416A5 11"突击步枪 (卡其色) - HK416A5 11" (Haki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Kaki) + HK416A5 11 " (Caqui) + HK416A5 11 " (хаки) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Caqui) + HK416A5 11 " (カーキ) + HK416A5 11인치 (카키) + HK416A5 11 "突擊步槍 (卡其色) + HK416A5 11英寸(卡其色) + HK416A5 11 " (Haki) - HK416A5 11" (Sand) - HK416A5 11" (Písková) - HK416A5 11" (Beige) - HK416A5 11" (Arena) - HK416A5 11" (Песочный) - HK416A5 11" (sandfarben) - HK416A5 11" (piaskowy) - HK416A5 11" (Sabbia) - HK416A5 11" (Homok) - HK416A5 11" (Deserto) - HK416A5 11" (サンド) - HK416A5 11" (모래) - HK416A5 11"突擊步槍 (沙色) - HK416A5 11"突击步枪 (沙色) - HK416A5 11" (Kum) + HK416A5 11 " (Sand) + HK416A5 11 " (Písková) + HK416A5 11 " (Beige) + HK416A5 11 " (Arena) + HK416A5 11 " (песочный) + HK416A5 11 " (sandfarben) + HK416A5 11 " (piaskowy) + HK416A5 11 " (Sabbia) + HK416A5 11 " (Homok) + HK416A5 11 " (Deserto) + HK416A5 11 " (サンド) + HK416A5 11인치 (모래) + HK416A5 11 "突擊步槍 (沙色) + HK416A5 11英寸(沙色) + HK416A5 11 " (Kum) - HK416A5 11" GL (Black) - HK416A5 11" GL (Černá) - HK416A5 11" GL (Noir) - HK416A5 11" GL (Negro) - HK416A5 11" GL (Чёрный) - HK416A5 11" GL (czarny) - HK416A5 11" GL (Schwarz) - HK416A5 11" GL (Nero) - HK416A5 11" GL (Fekete) - HK416A5 11" GL (Preto) - HK416A5 11" GL (ブラック) - HK416A5 11" GL (검정) - HK416A5 11"突擊步槍 (榴彈-黑色) - HK416A5 11"突击步枪 (榴弹-黑色) - HK416A5 11" GL (Siyah) + HK416A5 11 " GL (Black) + HK416A5 11 " GL (Černá) + HK416A5 11 " GL (Noir) + HK416A5 11 " GL (Negro) + HK416A5 11 " GL (чёрный) + HK416A5 11 " GL (czarny) + HK416A5 11 " GL (Schwarz) + HK416A5 11 " GL (Nero) + HK416A5 11 " GL (Fekete) + HK416A5 11 " GL (Preto) + HK416A5 11 " GL (ブラック) + HK416A5 11인치 GL (검정) + HK416A5 11 "突擊步槍 (榴彈—黑色) + HK416A5 11英寸 GLM(黑色) + HK416A5 11 " GL (Siyah) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Kaki) - HK416A5 11" GL (Caqui) - HK416A5 11" GL (Хаки) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Caqui) - HK416A5 11" GL (カーキ) - HK416A5 11" GL (카키) - HK416A5 11"突擊步槍 (榴彈-卡其色) - HK416A5 11"突击步枪 (榴弹-卡其色) - HK416A5 11" GL (Hakii) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Kaki) + HK416A5 11 " GL (Caqui) + HK416A5 11 " GL (хаки) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Caqui) + HK416A5 11 " GL (カーキ) + HK416A5 11인치 GL (카키) + HK416A5 11 "突擊步槍 (榴彈—卡其色) + HK416A5 11英寸 GLM(卡其色) + HK416A5 11 " GL (Hakii) - HK416A5 11" GL (Sand) - HK416A5 11" GL (Písková) - HK416A5 11" GL (Beige) - HK416A5 11" GL (Arena) - HK416A5 11" GL (Песочный) - HK416A5 11" GL (sandfarben) - HK416A5 11" GL (piaskowy) - HK416A5 11" GL (Sabbia) - HK416A5 11" GL (Homok) - HK416A5 11" GL (Deserto) - HK416A5 11" GL (サンド) - HK416A5 11" GL (모래) - HK416A5 11"突擊步槍 (榴彈-沙色) - HK416A5 11"突击步枪 (榴弹-沙色) - HK416A5 11" GL (Çöl) + HK416A5 11 " GL (Sand) + HK416A5 11 " GL (Písková) + HK416A5 11 " GL (Beige) + HK416A5 11 " GL (Arena) + HK416A5 11 " GL (песочный) + HK416A5 11 " GL (sandfarben) + HK416A5 11 " GL (piaskowy) + HK416A5 11 " GL (Sabbia) + HK416A5 11 " GL (Homok) + HK416A5 11 " GL (Deserto) + HK416A5 11 " GL (サンド) + HK416A5 11인치 GL (모래) + HK416A5 11 "突擊步槍 (榴彈—沙色) + HK416A5 11英寸 GLM(沙色) + HK416A5 11 " GL (Çöl) - HK416A5 14.5" (Black) - HK416A5 14.5" (Černá) - HK416A5 14.5" (Noir) - HK416A5 14.5" (Negro) - HK416A5 14.5" (Чёрный) - HK416A5 14.5" (czarny) - HK416A5 14.5" (Schwarz) - HK416A5 14.5" (Nero) - HK416A5 14.5" (Fekete) - HK416A5 14.5" (Preto) - HK416A5 14.5" (ブラック) - HK416A5 14.5" (검정) - HK416A5 14.5"突擊步槍 (黑色) - HK416A5 14.5"突击步枪 (黑色) - HK416A5 14.5" (Siyah) + HK416A5 14.5 " (Black) + HK416A5 14.5 " (Černá) + HK416A5 14.5 " (Noir) + HK416A5 14.5 " (Negro) + HK416A5 14.5 " (чёрный) + HK416A5 14.5 " (czarny) + HK416A5 14.5 " (Schwarz) + HK416A5 14.5 " (Nero) + HK416A5 14.5 " (Fekete) + HK416A5 14.5 " (Preto) + HK416A5 14.5 " (ブラック) + HK416A5 14.5인치 (검정) + HK416A5 14.5 "突擊步槍 (黑色) + HK416A5 14.5英寸(黑色) + HK416A5 14.5 " (Siyah) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Kaki) - HK416A5 14.5" (Caqui) - HK416A5 14.5" (Хаки) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Khaki) - 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" (Haki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Kaki) + HK416A5 14.5 " (Caqui) + HK416A5 14.5 " (хаки) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Khaki) + 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 " (Haki) - HK416A5 14.5" (Sand) - HK416A5 14.5" (Písková) - HK416A5 14.5" (Beige) - HK416A5 14.5" (Arena) - HK416A5 14.5" (Песочный) - HK416A5 14.5" (sandfarben) - HK416A5 14.5" (piaskowy) - 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" (Kum) + HK416A5 14.5 " (Sand) + HK416A5 14.5 " (Písková) + HK416A5 14.5 " (Beige) + HK416A5 14.5 " (Arena) + HK416A5 14.5 " (песочный) + HK416A5 14.5 " (sandfarben) + HK416A5 14.5 " (piaskowy) + 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 " (Kum) - HK417A2 20" (Black) - HK417A2 20" (Černá) - HK417A2 20" (Noir) - HK417A2 20" (Negro) - HK417A2 20" (Чёрный) - HK417A2 20" (czarny) - HK417A2 20" (Schwarz) - HK417A2 20" (Nero) - HK417A2 20" (Fekete) - HK417A2 20" (Preto) - HK417A2 20" (ブラック) - HK417A2 20" (검정) - HK417A2 20"突擊步槍 (黑色) - HK417A2 20"突击步枪 (黑色) - HK417A2 20" (Siyah) + HK417A2 20 " (Black) + HK417A2 20 " (Černá) + HK417A2 20 " (Noir) + HK417A2 20 " (Negro) + HK417A2 20 " (чёрный) + HK417A2 20 " (czarny) + HK417A2 20 " (Schwarz) + HK417A2 20 " (Nero) + HK417A2 20 " (Fekete) + HK417A2 20 " (Preto) + HK417A2 20 " (ブラック) + HK417A2 20인치 (검정) + HK417A2 20 "突擊步槍 (黑色) + HK417A2 20英寸(黑色) + HK417A2 20 " (Siyah) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Kaki) - HK417A2 20" (Caqui) - HK417A2 20" (Хаки) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Caqui) - HK417A2 20" (カーキ) - HK417A2 20" (카키) - HK417A2 20"突擊步槍 (卡其色) - HK417A2 20"突击步枪 (卡其色) - HK417A2 20" (Haki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Kaki) + HK417A2 20 " (Caqui) + HK417A2 20 " (хаки) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Caqui) + HK417A2 20 " (カーキ) + HK417A2 20인치 (카키) + HK417A2 20 "突擊步槍 (卡其色) + HK417A2 20英寸(卡其色) + HK417A2 20 " (Haki) - HK417A2 20" (Sand) - HK417A2 20" (Písková) - HK417A2 20" (Beige) - HK417A2 20" (Arena) - HK417A2 20" (Песочный) - HK417A2 20" (sandfarben) - HK417A2 20" (piaskowy) - HK417A2 20" (Sabbia) - HK417A2 20" (Homok) - HK417A2 20" (Deserto) - HK417A2 20" (サンド) - HK417A2 20" (모래) - HK417A2 20"突擊步槍 (沙色) - HK417A2 20"突击步枪 (沙色) - HK417A2 20" (Kum) + HK417A2 20 " (Sand) + HK417A2 20 " (Písková) + HK417A2 20 " (Beige) + HK417A2 20 " (Arena) + HK417A2 20 " (песочный) + HK417A2 20 " (sandfarben) + HK417A2 20 " (piaskowy) + HK417A2 20 " (Sabbia) + HK417A2 20 " (Homok) + HK417A2 20 " (Deserto) + HK417A2 20 " (サンド) + HK417A2 20인치 (모래) + HK417A2 20 "突擊步槍 (沙色) + HK417A2 20英寸(沙色) + HK417A2 20 " (Kum) RPG-32 (Green Hex) @@ -3523,14 +3537,14 @@ RPG-32 (zielony hex) RPG-32 (Zelený Hex) RPG-32 (Hex Vert) - RPG-32 (Зелёный Гекс) + 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) @@ -3538,7 +3552,7 @@ P99 (Khaki) P99 (Kaki) P99 (Caqui) - P99 (Хаки) + P99 (хаки) P99 (Khaki) P99 (Khaki) P99 (Khaki) @@ -3547,7 +3561,7 @@ P99 (カーキ) P99 (카키) P99半自動手槍 (卡其色) - P99半自动手枪 (卡其色) + P99(卡其色) P99 (Haki) @@ -3555,7 +3569,7 @@ P99 (Černá) P99 (Noir) P99 (Negro) - P99 (Чёрный) + P99 (чёрный) P99 (czarny) P99 (Schwarz) P99 (Nero) @@ -3564,7 +3578,7 @@ P99 (ブラック) P99 (검정) P99半自動手槍 (黑色) - P99半自动手枪 (黑色) + P99(黑色) P99 (Siyah) @@ -3574,14 +3588,14 @@ Makarowa PM Makarov PM Makarov PM - Макарова ПМ + ПМ Makarov PM Makarov PM Makarov PM マカロフ PM - Makarov PM + 마카로프 PM "馬卡洛夫"手槍 - "马卡洛夫"手枪 + "马卡洛夫" Makarov PM @@ -3589,7 +3603,7 @@ Polaris DAGOR (XM312) ポラリス DAGOR (XM312) "北極星"先進佈署越野車 (XM312重機槍) - "北极星"先进布署越野车 (XM312重机枪) + "北极星"(XM312) Polaris DAGOR (XM312) Polaris DAGOR (XM312) Polaris DAGOR (XM312) @@ -3598,14 +3612,15 @@ Polaris DAGOR (XM312) Polaris DAGOR (XM312) Polaris DAGOR (XM312) + 폴라리스 DAGOR (XM312) Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (Mini-Spike PzAbw) - "北极星"先进布署越野车("迷你长钉"反坦克导弹发射器) + "北极星"("迷你长钉"反坦) "北極星"先進佈署越野車("迷你長釘"反坦克導彈發射器) Polaris DAGOR (Mini-Spike AT) - ポラリス DAGOR (ミニスパイク対戦) + ポラリス DAGOR (ミニスパイク 対戦車) Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (ПТ Mini-Spike) Polaris DAGOR (Mini-Spike AT) @@ -3613,13 +3628,14 @@ Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (Mini-Spike AT) + 폴라리스 DAGOR (스파이크 미사일 대전차) Polaris DAGOR Polaris DAGOR ポラリス DAGOR "北極星"先進佈署越野車 - "北极星"先进布署越野车 + "北极星" Polaris DAGOR Polaris DAGOR Polaris DAGOR @@ -3628,27 +3644,29 @@ Polaris DAGOR Polaris DAGOR Polaris DAGOR + 폴라리스 DAGOR Polaris DAGOR (light) Polaris DAGOR (leicht) ポラリス DAGOR (軽) "北極星"先進佈署越野車 (輕型) - "北极星"先进布署越野车 (轻型) + "北极星"(轻型) Polaris DAGOR (leggero) Polaris DAGOR (light) - Polaris DAGOR (легкий) + Polaris DAGOR (лёгкий) Polaris DAGOR (leve) Polaris DAGOR (léger) Polaris DAGOR (lehký) Polaris DAGOR (light) Polaris DAGOR (ligero) + 폴라리스 DAGOR (경량) LSV Mk. II (M134) LSV Mk. II (M134) 輕型突擊車2式 (M134迷你機炮) - 轻型突击车2式 (M134迷你机炮) + 轻型突击车二型(M134) LSV Mk. II (M134) LSV Mk. II (M134) LSV Mk. II (M134) @@ -3658,11 +3676,12 @@ LSV Mk. II (M134) LSV Mk. II (M134) LSV Mk. II (M134) + LSV Mk.II (M134) LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) - 轻型突击车2式 ("麦士蒂索人"-M型反坦克导弹) + 轻型突击车二型("麦士蒂索"-M) 輕型突擊車2式 ("麥士蒂索人"-M型反坦克導彈) LSV Mk. II (メチス-M) LSV Mk. II (Metis-M) @@ -3673,12 +3692,13 @@ LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) + LSV Mk.II (메티스-M) LSV Mk. II LSV Mk. II 輕型突擊車2式 - 轻型突击车2式 + 轻型突击车二型 LSV Mk. II LSV Mk. II LSV Mk. II @@ -3688,11 +3708,12 @@ LSV Mk. II LSV Mk. II LSV Mk. II + LSV Mk.II Rooikat 120 Rooikat 120 - "狞猫"120主炮轮式装甲车 + "狞猫" 120 "獰貓"120主炮輪式裝甲車 ルーイカット 120 Rooikat 120 @@ -3703,11 +3724,12 @@ Rooikat 120 Rooikat 120 Rooikat 120 + 루이캇트 120 Rooikat 120 UP Rooikat 120 UP - "狞猫"120主炮轮式装甲车 (城市版) + "狞猫" 120 城市版 "獰貓"120主炮輪式裝甲車 (城市版) ルーイカット 120 UP Rooikat 120 UP @@ -3718,13 +3740,14 @@ Rooikat 120 UP Rooikat 120 UP Rooikat 120 UP + 루이캇트 120 시가전형 T-14 Armata T-14 Armata Т-14 Армата - T-14"阿玛塔"主战坦克 - T-14"阿瑪塔"主戰坦克 + T-14 "阿玛塔" + T-14 "阿瑪塔"主戰坦克 T-14 アルマータ T-14 Armata T-14 Armata @@ -3733,12 +3756,13 @@ T-14 Armata T-14 Armata T-14 Armata + T-14 아르마타 T-14K Armata T-14K Armata Т-14К Армата - T-14K"阿玛塔"主战坦克 + T-14K "阿玛塔" T-14K"阿瑪塔"主戰坦克 T-14K アルマータ T-14K Armata @@ -3748,41 +3772,44 @@ T-14K Armata T-14K Armata T-14K Armata + T-14K 아르마타 Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (LeFlaSys) - "鼬鼠"2装甲车 (防空) + "鼬鼠"2(防空) "鼬鼠"2裝甲車 (防空) ウィーゼル 2 オゼロット (対空) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) - Wiesel 2 Ozelot (ПВО) + Wiesel 2 Ozelot (ЗРК) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) + 비젤 2 오셀롯 (대공) Wiesel 2 (ATGM) Wiesel 2 (PzAbw) - "鼬鼠"2装甲车 (反坦导弹) + "鼬鼠"2(反坦) "鼬鼠"2裝甲車 (反坦導彈) ウィーゼル 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) - Wiesel 2 (ПТ) + Wiesel 2 (ПТРК) Wiesel 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) + 비젤 2 (대전차유도) Wiesel 2 (MK20) Wiesel 2 (MK20) - "鼬鼠"2装甲车 (MK20机炮) + "鼬鼠"2(MK20) "鼬鼠"2裝甲車 (MK20機炮) ウィーゼル 2 (MK20) Wiesel 2 (MK20) @@ -3793,21 +3820,23 @@ Wiesel 2 (MK20) Wiesel 2 (MK20) Wiesel 2 (MK20) + 비젤 2 (MK20) Wiesel 2 RFCV (Radar) Wiesel 2 AFF (Radar) - "鼬鼠"2装甲车 (雷达) + "鼬鼠"2(雷达) "鼬鼠"2裝甲車 (雷達) - ウィーゼル 2 (レーダー) + ウィーゼル 2 RFCV (レーダー) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) - Wiesel 2 RFCV (Радар) + Wiesel 2 RFCV (радар) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) + 비젤 2 RFCV (레이더) Leupold Mark 4 HAMR @@ -3823,27 +3852,29 @@ Leupold Mark 4 HAMR Leupold Mark 4 HAMR Leupold Mark 4 HAMR + 류폴드 마크 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 (хаки) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Kaki) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Haki) Leupold Mark 4 HAMR (Caqui) + 류폴드 마크 4 HAMR (카키) 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) @@ -3853,12 +3884,13 @@ Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) + 류폴드 마크 4 HAMR (2D) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) - Leupold Mark 4 HAMR (PIP) + Leupold Mark 4 HAMR(画中画) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) @@ -3868,56 +3900,61 @@ Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) + 류폴드 마크 4 HAMR (PIP) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Beige) ELCAN SpecterOS (黃褐色) - ELCAN SpecterOS (黄褐色) + ELCAN SpecterOS(沙色) ELCAN SpecterOS (タン) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Tan) - ELCAN SpecterOS (Бронза) + ELCAN SpecterOS (пустынный) ELCAN SpecterOS (Bege) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Žlutohnědá) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Tan) + 엘칸 스펙터OS (황갈) ELCAN SpecterOS (Black) ELCAN SpecterOS (Schwarz) ELCAN SpecterOS (黑色) - ELCAN SpecterOS (黑色) + ELCAN SpecterOS(黑色) ELCAN SpecterOS (ブラック) ELCAN SpecterOS (Nero) ELCAN SpecterOS (Czarny) - ELCAN SpecterOS (Черный) + ELCAN SpecterOS (чёрный) ELCAN SpecterOS (Preto) ELCAN SpecterOS (Noire) ELCAN SpecterOS (Černá) ELCAN SpecterOS (Siyah) ELCAN SpecterOS (Negra) + 엘칸 스펙터OS (검정) ELCAN SpecterOS (Green Hex) ELCAN SpecterOS (綠色數位蜂巢迷彩) - ELCAN SpecterOS (绿色数位蜂巢迷彩) + ELCAN SpecterOS(绿色蜂巢迷彩) ELCAN SpecterOS (緑ヘックス) ELCAN SpecterOS (Verde Hex) ELCAN SpecterOS (Zielony Hex) - ELCAN SpecterOS (Зеленый Гекс) + ELCAN SpecterOS (зелёный гекс) ELCAN SpecterOS (Verde Hex) ELCAN SpecterOS (Hex Verte) ELCAN SpecterOS (Zelený Hex) ELCAN SpecterOS (Yeşil Hex) ELCAN SpecterOS (Verde Hex) + ELCAN SpecterOS (Hex Grün) + 엘칸 스펙터OS (초록육각) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) - ELCAN SpecterOS (2D) + ELCAN SpecterOS(2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) @@ -3927,12 +3964,13 @@ ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) + 엘칸 스펙터OS (2D) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) - ELCAN SpecterOS (PIP) + ELCAN SpecterOS(画中画) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) @@ -3942,76 +3980,110 @@ ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) + 엘칸 스펙터OS (PIP) ELCAN SpecterOS (Lush) ELCAN SpecterOS (Leśny) + ELCAN SpecterOS (Forêt) ELCAN SpecterOS (緑地) + ELCAN SpecterOS (Grün) + ELCAN SpecterOS(繁茂) + 엘칸 스펙터OS (초목) + ELCAN SpecterOS (обильная растительность) + ELCAN SpecterOS (Exuberante) ELCAN SpecterOS (Arid) ELCAN SpecterOS (Jałowy) + ELCAN SpecterOS (Désert) ELCAN SpecterOS (乾燥地帯) + ELCAN SpecterOS (Trocken) + ELCAN SpecterOS(干旱) + 엘칸 스펙터OS (건조) + ELCAN SpecterOS (сухая местность) + ELCAN SpecterOS (Árido) ELCAN SpecterOS 7.62 (Black) ELCAN SpecterOS 7.62 (Czarny) + ELCAN SpecterOS 7.62 (Noire) ELCAN SpecterOS 7.62 (ブラック) + ELCAN SpecterOS 7.62 (Schwarz) + ELCAN SpecterOS 7.62(黑色) + 엘칸 스펙터OS 7.62 (검정) + ELCAN SpecterOS 7.62 (чёрный) + ELCAN SpecterOS 7.62 (Negro) ELCAN SpecterOS 7.62 (Lush) ELCAN SpecterOS 7.62 (Leśny) + ELCAN SpecterOS 7.62 (Forêt) ELCAN SpecterOS 7.62 (緑地) + ELCAN SpecterOS 7.62 (Grün) + ELCAN SpecterOS 7.62(繁茂) + 엘칸 스펙터OS 7.62 (초목) + ELCAN SpecterOS 7.62 (обильная растительность) + ELCAN SpecterOS 7.62 (Exuberante) ELCAN SpecterOS 7.62 (Arid) ELCAN SpecterOS 7.62 (Jałowy) + ELCAN SpecterOS 7.62 (Désert) ELCAN SpecterOS 7.62 (乾燥地帯) + ELCAN SpecterOS 7.62 (Trocken) + ELCAN SpecterOS 7.62(干旱) + 엘칸 스펙터OS 7.62 (건조) + ELCAN SpecterOS 7.62 (сухая местность) + ELCAN SpecterOS 7.62 (Árido) 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 (чёрный) SIG BRAVO4 / ROMEO3 (Preto) SIG BRAVO4 / ROMEO3 (Noire) SIG BRAVO4 / ROMEO3 (Černá) SIG BRAVO4 / ROMEO3 (Siyah) SIG BRAVO4 / ROMEO3 (Negra) + 시그 브라보4 / 로미오3 (검정) 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 (хаки) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Kaki) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Haki) SIG BRAVO4 / ROMEO3 (Caqui) + 시그 브라보4 / 로미오3 (카키) 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 (песочный) SIG BRAVO4 / ROMEO3 (Areia) SIG BRAVO4 / ROMEO3 (Beige) SIG BRAVO4 / ROMEO3 (Písková) SIG BRAVO4 / ROMEO3 (Kum) SIG BRAVO4 / ROMEO3 (Arena) + 시그 브라보4 / 로미오3 (사막) Nightforce NXS @@ -4026,40 +4098,45 @@ Nightforce NXS Nightforce NXS Nightforce NXS + Nightforce NXS + 나이트포스 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 (зелёный гекс) Nightforce NXS (Verde Hex) Nightforce NXS (Hex Verte) Nightforce NXS (Zelený Hex) Nightforce NXS (Yeşil Hex) Nightforce NXS (Verde Hex) + Nightforce NXS (Hex Grün) + 나이트포스 NXS (초록육각) 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 (джунгли) Nightforce NXS (Selva) Nightforce NXS (Jungle) Nightforce NXS (Džungle) Nightforce NXS (Orman) Nightforce NXS (Jungla) + 나이트포스 NXS (정글) Nightforce NXS (2D) Nightforce NXS (2D) - Nightforce NXS (2D) + Nightforce NXS(2D) Nightforce NXS (2D) Nightforce NXS (2D) Nightforce NXS (2D) @@ -4069,11 +4146,13 @@ Nightforce NXS (2D) Nightforce NXS (2D) Nightforce NXS (2D) + Nightforce NXS (2D) + 나이트포스 NXS (2D) Nightforce NXS (PIP) Nightforce NXS (PIP) - Nightforce NXS (PIP) + Nightforce NXS(画中画) Nightforce NXS (PIP) Nightforce NXS (PIP) Nightforce NXS (PIP) @@ -4083,104 +4162,120 @@ Nightforce NXS (PIP) Nightforce NXS (PIP) Nightforce NXS (PIP) + Nightforce NXS (BIB) + 나이트포스 NXS (PIP) 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 (чёрный) US Optics MR-10 (Preto) US Optics MR-10 (Noire) US Optics MR-10 (Černá) US Optics MR-10 (Siyah) US Optics MR-10 (Negra) + US Optics MR-10 (Schwarz) + US 옵틱스 MR-10 (검정) 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 (хаки) US Optics MR-10 (Khaki) US Optics MR-10 (Kaki) US Optics MR-10 (Khaki) US Optics MR-10 (Haki) US Optics MR-10 (Caqui) + US Optics MR-10 (Khaki) + US 옵틱스 MR-10 (카키) 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 (песочный) US Optics MR-10 (Areia) US Optics MR-10 (Beige) US Optics MR-10 (Písková) US Optics MR-10 (Kum) US Optics MR-10 (Arena) + US Optics MR-10 (Sand) + US 옵틱스 MR-10 (사막) KAHLES Helia (Black) KAHLES Helia (Black) - KAHLES Helia (Black) + KAHLES Helia(黑色) KAHLES ヘリア (ブラック) KAHLES Helia (Czarny) KAHLES Helia (nero) - KAHLES Helia (Черный) + KAHLES Helia (чёрный) KAHLES Helia (Preto) KAHLES Helia (Noire) KAHLES Helia (Černá) KAHLES Helia (Siyah) KAHLES Helia (Negra) + KAHLES Helia (Schwarz) + 칼레스 헬리아 (검정) KAHLES Helia (Hex) KAHLES Helia (Hex) - KAHLES Helia (Hex) + KAHLES Helia(蜂巢迷彩) KAHLES ヘリア (ヘックス) KAHLES Helia (Hex) KAHLES Helia (esagonale) - KAHLES Helia (Гекс) + KAHLES Helia (гекс) KAHLES Helia (Hex) KAHLES Helia (Hex) KAHLES Helia (Hex) KAHLES Helia (Hex) KAHLES Helia (Hex) + KAHLES Helia (Hex) + 칼레스 헬리아 (육각) KAHLES Helia (Old) KAHLES Helia (Old) - KAHLES Helia (Old) + KAHLES Helia(旧) KAHLES ヘリア (使い古し) KAHLES Helia (Stary) KAHLES Helia (vecchio) - KAHLES Helia (Старый) + KAHLES Helia (старый) KAHLES Helia (Velho) KAHLES Helia (Usée) KAHLES Helia (Stará) KAHLES Helia (Eski) KAHLES Helia (Vieja) + KAHLES Helia (Alt) + 칼레스 헬리아 (낡음) KAHLES Helia (Tan) KAHLES Helia (Tan) - KAHLES Helia (Tan) + KAHLES Helia(沙色) KAHLES Helia (タン) KAHLES Helia (Tan) KAHLES Helia (marroncino) - KAHLES Helia (Бронза) + KAHLES Helia (пустынный) KAHLES Helia (Bege) KAHLES Helia (Tan) KAHLES Helia (Žlutohnědá) KAHLES Helia (Tan) KAHLES Helia (Tan) + KAHLES Helia (Tan) + 칼레스 헬리아 (황갈) Burris XTR II @@ -4195,130 +4290,164 @@ Burris XTR II Burris XTR II Burris XTR II + Burris XTR II + 버리스 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 (зелёный гекс) Burris XTR II (Verde Hex) Burris XTR II (Hex Verte) Burris XTR II (Zelený Hex) Burris XTR II (Yeşil Hex) Burris XTR II (Verde Hex) + Burris XTR II (Hex Grün) + 버리스 XTR II (초록육각) Burris XTR II (Old) Burris XTR II (Stary) + Burris XTR II (Usée) Burris XTR II (使い古し) + Burris XTR II (Alt) + Burris XTR II(陈旧) + 버리스 XTR II (낡음) + Burris XTR II (старый) + Burris XTR II (Viejo) Burris XTR II (ASP-1 Kir) Burris XTR II (ASP-1 Kir) + Burris XTR II (ASP-1 Kir) Burris XTR II (ASP-1 Kir) + Burris XTR II (ASP-1 Kir) + Burris XTR II(ASP-1 Kir) + 버리스 XTR II (ASP-1 키르) + Burris XTR II (ASP-1 Kir) + Burris XTR II (ASP-1 Kir) EOTech XPS3 (Tan) EOTech XPS3 (Beige) EOTech XPS3 (黃褐色) - EOTech XPS3 (黄褐色) + EOTech XPS3(沙色) EOTech XPS3 (タン) EOTech XPS3 (Tan) EOTech XPS3 (Tan) - EOTech XPS3 (Бронза) + EOTech XPS3 (пустынный) EOTech XPS3 (Bege) EOTech XPS3 (Tan) EOTech XPS3 (Žlutohnědá) EOTech XPS3 (Tan) EOTech XPS3 (Tan) + 이오텍 XPS3 (황갈) EOTech XPS3 (Black) EOTech XPS3 (Schwarz) EOTech XPS3 (黑色) - EOTech XPS3 (黑色) + EOTech XPS3(黑色) EOTech XPS3 (ブラック) EOTech XPS3 (Black) EOTech XPS3 (Czarny) - EOTech XPS3 (Черный) + EOTech XPS3 (чёрный) EOTech XPS3 (Preto) EOTech XPS3 (Noire) EOTech XPS3 (Černá) EOTech XPS3 (Siyah) EOTech XPS3 (Negra) + 이오텍 XPS3 (검정) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) EOTech XPS3 (卡其色) - EOTech XPS3 (卡其色) + EOTech XPS3(卡其色) EOTech XPS3 (カーキ) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) - EOTech XPS3 (Хаки) + EOTech XPS3 (хаки) EOTech XPS3 (Khaki) EOTech XPS3 (Kaki) EOTech XPS3 (Khaki) EOTech XPS3 (Haki) EOTech XPS3 (Caqui) + 이오텍 XPS3 (카키) EOTech XPS3 (Lush) EOTech XPS3 (Leśny) + EOTech XPS3 (Forêt) EOTech XPS3 (緑地) + EOTech XPS3 (Grün) + EOTech XPS3(繁茂) + 이오텍 XPS3 (초목) + EOTech XPS3 (обильная растительность) + EOTech XPS3 (Exuberante) EOTech XPS3 (Arid) EOTech XPS3 (Jałowy) + EOTech XPS3 (Désert) EOTech XPS3 (乾燥地帯) + EOTech XPS3 (Trocken) + EOTech XPS3(干旱) + 이오텍 XPS3 (건조) + EOTech XPS3 (сухая местность) + EOTech XPS3 (Árido) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Beige) EOTech XPS3 SMG (黃褐色) - EOTech XPS3 SMG (黄褐色) + EOTech XPS3(冲锋枪用,沙色) EOTech XPS3 SMG (タン) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Tan) - EOTech XPS3 SMG (Бронза) + EOTech XPS3 SMG (пустынный) EOTech XPS3 SMG (Bege) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Žlutohnědá) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Tan) + 이오텍 XPS3 SMG (황갈) EOTech XPS3 SMG (Black) EOTech XPS3 SMG (Schwarz) EOTech XPS3 SMG (黑色) - EOTech XPS3 SMG (黑色) + EOTech XPS3(冲锋枪用,黑色) EOTech XPS3 SMG (ブラック) EOTech XPS3 SMG (Nero) EOTech XPS3 SMG (Czarny) - EOTech XPS3 SMG (Черный) + EOTech XPS3 SMG (чёрный) EOTech XPS3 SMG (Preto) EOTech XPS3 SMG (Noire) EOTech XPS3 SMG (Černá) EOTech XPS3 SMG (Siyah) EOTech XPS3 SMG (Negra) + 이오텍 XPS3 SMG (검정) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (卡其色) - EOTech XPS3 SMG (卡其色) + EOTech XPS3(冲锋枪用,卡其色) EOTech XPS3 SMG (カーキ) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) - EOTech XPS3 SMG (Хаки) + EOTech XPS3 SMG (хаки) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Kaki) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Hakii) EOTech XPS3 SMG (Caqui) + 이오텍 XPS3 SMG (카키) IOR-Valdada Pitbull 2 @@ -4333,11 +4462,13 @@ IOR-Valdada Pitbull 2 IOR-Valdada Pitbull 2 IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 + IOR-Valdada 핏불 2 IOR-Valdada Pitbull 2 (2D) 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) @@ -4347,11 +4478,13 @@ IOR-Valdada Pitbull 2 (2D) IOR-Valdada Pitbull 2 (2D) IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2 (2D) + IOR-Valdada 핏불 2 (2D) IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) - IOR-Valdada Pitbull 2 (PIP) + IOR-Valdada Pitbull 2(画中画) IOR-Valdada ピットブル 2 (PIP) IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) @@ -4361,6 +4494,8 @@ IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) + IOR-Valdada Pitbull 2 (BIB) + IOR-Valdada 핏불 2 (PIP) Burris FastFire 2 @@ -4375,73 +4510,79 @@ Burris FastFire 2 Burris FastFire 2 Burris FastFire 2 + Burris FastFire 2 + 버리스 패스트파이어 2 C-More Railway (Red) C-More Railway (Rot) C-More Railway (紅色) - C-More Railway (红色) + C-More Railway(红色) C-More レイルウェイ (レッド) C-More Railway (Rosso) C-More Railway (Czerwony) - C-More Railway (Красный) + C-More Railway (красный) C-More Railway (Vermelho) C-More Railway (Rouge) C-More Railway (Červený) C-More Railway (Kırmızı) C-More Railway (Roja) + 씨모어 레일웨이 (빨강) C-More Railway (Green) C-More Railway (Grün) C-More Railway (綠色) - C-More Railway (绿色) + C-More Railway(绿色) C-More レイルウェイ (グリーン) C-More Railway (Verde) C-More Railway (Zielony) - C-More Railway (Зеленый) + C-More Railway (зелёный) C-More Railway (Verde) C-More Railway (Verte) C-More Railway (Zelený) C-More Railway (Yeşil) C-More Railway (Verde) + 씨모어 레일웨이 (초록) C-More Railway SMG (Red) C-More Railway SMG (Rot) C-More Railway SMG (紅色) - C-More Railway SMG (红色) + C-More Railway(冲锋枪用,红色) C-More レイルウェイ SMG (レッド) C-More Railway SMG (Rosso) C-More Railway SMG (Czerwony) - C-More Railway SMG (Красный) + 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 (Roja) + 씨모어 레일웨이 SMG (빨강) C-More Railway SMG (Green) C-More Railway SMG (Grün) C-More Railway SMG (綠色) - C-More Railway SMG (绿色) + C-More Railway(冲锋枪用,绿色) C-More レイルウェイ SMG (グリーン) C-More Railway SMG (Verde) C-More Railway SMG (Zielony) - C-More Railway SMG (Зеленый) + 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) C-More Railway SMG (Verde) + 씨모어 레일웨이 SMG (초록) P90 TR (Black) P90 TR (Černá) P90 TR (Noir) P90 TR (Negro) - P90 TR (Чёрный) + P90 TR (чёрный) P90 TR (czarny) P90 TR (Schwarz) P90 TR (Nero) @@ -4449,8 +4590,8 @@ P90 TR (Preto) P90 TR (ブラック) P90 TR (黑色) - P90 TR (黑色) - P90 TR (Black) + P90 TR(黑色) + P90 TR (검정) P90 TR (Siyah) @@ -4458,7 +4599,7 @@ P90 TR (Khaki) P90 TR (Kaki) P90 TR (Caqui) - P90 TR (Хаки) + P90 TR (хаки) P90 TR (Khaki) P90 TR (Khaki) P90 TR (Khaki) @@ -4466,8 +4607,8 @@ P90 TR (Caqui) P90 TR (カーキ) P90 TR (沙色) - P90 TR (沙色) - P90 TR (Khaki) + P90 TR(沙色) + P90 TR (카키) P90 TR (Haki) @@ -4475,7 +4616,7 @@ P90 TR (Kamufláž) P90 TR (Camo) P90 TR (Camuflaje) - P90 TR (Камо) + P90 TR (камуфляжный) P90 TR (kamuflaż) P90 TR (Camo) P90 TR (Camo) @@ -4483,8 +4624,8 @@ P90 TR (Camuflagem) P90 TR (カモフラージュ) P90 TR (迷彩) - P90 TR (迷彩) - P90 TR (Camo) + P90 TR(迷彩) + P90 TR (위장) P90 TR (Kamufulaj) @@ -4492,7 +4633,7 @@ P90 TR (Hex) P90 TR (Hex) P90 TR (Hex) - P90 TR (Гекс) + P90 TR (гекс) P90 TR (Hex) P90 TR (hex) P90 TR (Hex) @@ -4500,8 +4641,8 @@ P90 TR (Hex) P90 TR (ヘックス) P90 TR (數位蜂巢迷彩) - P90 TR (数位蜂巢迷彩) - P90 TR (Hex) + P90 TR(蜂巢迷彩) + P90 TR (육각) P90 TR (Hex) @@ -4509,7 +4650,7 @@ P90 (Černá) P90 (Noir) P90 (Negro) - P90 (Чёрный) + P90 (чёрный) P90 (czarny) P90 (Schwarz) P90 (Nero) @@ -4517,8 +4658,8 @@ P90 (Preto) P90 (ブラック) P90 (黑色) - P90 (黑色) - P90 (Black) + P90(黑色) + P90 (검정) P90 (Siyah) @@ -4526,7 +4667,7 @@ P90 (Khaki) P90 (Kaki) P90 (Caqui) - P90 (Хаки) + P90 (хаки) P90 (Khaki) P90 (Khaki) P90 (Khaki) @@ -4534,8 +4675,8 @@ P90 (Caqui) P90 (カーキ) P90 (沙色) - P90 (沙色) - P90 (Khaki) + P90(沙色) + P90 (카키) P90 (Haki) @@ -4543,7 +4684,7 @@ P90 (Kamufláž) P90 (Camo) P90 (Camuflaje) - P90 (Камо) + P90 (камуфляжный) P90 (kamuflaż) P90 (Camo) P90 (Camo) @@ -4551,8 +4692,8 @@ P90 (Camuflagem) P90 (カモフラージュ) P90 (迷彩) - P90 (迷彩) - P90 (Camo) + P90(迷彩) + P90 (위장) P90 (Kamufulaj) @@ -4560,7 +4701,7 @@ P90 (Hex) P90 (Hex) P90 (Hex) - P90 (Гекс) + P90 (гекс) P90 (Hex) P90 (hex) P90 (Hex) @@ -4568,8 +4709,8 @@ P90 (Hex) P90 (ヘックス) P90 (數位蜂巢迷彩) - P90 (数位蜂巢迷彩) - P90 (Hex) + P90(蜂巢迷彩) + P90 (육각) P90 (Hex) @@ -4577,7 +4718,7 @@ PS90 TR (Černá) PS90 TR (Noir) PS90 TR (Negro) - PS90 TR (Чёрный) + PS90 TR (чёрный) PS90 TR (czarny) PS90 TR (Schwarz) PS90 TR (Nero) @@ -4585,8 +4726,8 @@ PS90 TR (Preto) PS90 TR (ブラック) PS90 TR (黑色) - PS90 TR (黑色) - PS90 TR (Black) + PS90 TR(黑色) + PS90 TR (검정) PS90 TR (Siyah) @@ -4594,7 +4735,7 @@ PS90 TR (Khaki) PS90 TR (Kaki) PS90 TR (Caqui) - PS90 TR (Хаки) + PS90 TR (хаки) PS90 TR (Khaki) PS90 TR (Khaki) PS90 TR (Khaki) @@ -4602,8 +4743,8 @@ PS90 TR (Caqui) PS90 TR (カーキ) PS90 TR (沙色) - PS90 TR (沙色) - PS90 TR (Khaki) + PS90 TR(沙色) + PS90 TR (카키) PS90 TR (Haki) @@ -4611,7 +4752,7 @@ PS90 TR (Kamufláž) PS90 TR (Camo) PS90 TR (Camuflaje) - PS90 TR (Камо) + PS90 TR (камуфляжный) PS90 TR (kamuflaż) PS90 TR (Camo) PS90 TR (Camo) @@ -4619,8 +4760,8 @@ PS90 TR (Camuflagem) PS90 TR (カモフラージュ) PS90 TR (迷彩) - PS90 TR (迷彩) - PS90 TR (Camo) + PS90 TR(迷彩) + PS90 TR (위장) PS90 TR (Kamufulaj) @@ -4628,7 +4769,7 @@ PS90 TR (Hex) PS90 TR (Hex) PS90 TR (Hex) - PS90 TR (Гекс) + PS90 TR (гекс) PS90 TR (Hex) PS90 TR (hex) PS90 TR (Hex) @@ -4636,8 +4777,8 @@ PS90 TR (Hex) PS90 TR (ヘックス) PS90 TR (數位蜂巢迷彩) - PS90 TR (数位蜂巢迷彩) - PS90 TR (Hex) + PS90 TR(蜂巢迷彩) + PS90 TR (육각) PS90 TR (Hex) @@ -4645,7 +4786,7 @@ PS90 (Černá) PS90 (Noir) PS90 (Negro) - PS90 (Чёрный) + PS90 (чёрный) PS90 (czarny) PS90 (Schwarz) PS90 (Nero) @@ -4653,8 +4794,8 @@ PS90 (Preto) PS90 (ブラック) PS90 (黑色) - PS90 (黑色) - PS90 (Black) + PS90(黑色) + PS90 (검정) PS90 (Siyah) @@ -4662,7 +4803,7 @@ PS90 (Khaki) PS90 (Kaki) PS90 (Caqui) - PS90 (Хаки) + PS90 (хаки) PS90 (Khaki) PS90 (Khaki) PS90 (Khaki) @@ -4670,8 +4811,8 @@ PS90 (Caqui) PS90 (カーキ) PS90 (沙色) - PS90 (沙色) - PS90 (Khaki) + PS90(沙色) + PS90 (카키) PS90 (Haki) @@ -4679,7 +4820,7 @@ PS90 (Kamufláž) PS90 (Camo) PS90 (Camuflaje) - PS90 (Камо) + PS90 (камуфляжный) PS90 (kamuflaż) PS90 (Camo) PS90 (Camo) @@ -4687,8 +4828,8 @@ PS90 (Camuflagem) PS90 (カモフラージュ) PS90 (迷彩) - PS90 (迷彩) - PS90 (Camo) + PS90(迷彩) + PS90 (위장) PS90 (Kamufulaj) @@ -4696,7 +4837,7 @@ PS90 (Hex) PS90 (Hex) PS90 (Hex) - PS90 (Гекс) + PS90 (гекс) PS90 (Hex) PS90 (hex) PS90 (Hex) @@ -4704,8 +4845,8 @@ PS90 (Hex) PS90 (ヘックス) PS90 (數位蜂巢迷彩) - PS90 (数位蜂巢迷彩) - PS90 (Hex) + PS90(蜂巢迷彩) + PS90 (육각) PS90 (Hex) @@ -4720,9 +4861,9 @@ Caricatore 5.7mm 50Rnd Магазин из 50-ти 5,7 мм 5.7mm 50 発入り弾倉 - 5.7mm 50發 彈匣 - 5.7mm 50发 弹匣 - 5.7mm 50Rnd Mag + 5.7mm 50發 彈匣 + 5.7 mm 50发 弹匣 + 5.7mm 50발 들이 탄창 5.7mm 50Rnd Şarjör @@ -4738,8 +4879,8 @@ Kaliber: 5,7mm<br />Lövedékek: 50<br />Használható: 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 + 口径:5.7 mm<br />发数:50<br />使用于:P90 + 구경: 5.7mm<br />장탄수: 50<br />사용처: P90 Kalibre: 5.7mm<br />Mermi: 50<br />Kullanıyor: P90 @@ -4805,7 +4946,7 @@ AK-15 (bujný porost) AK-15 (Exuberante) AK-15 (초목) - AK-15 (繁茂) + AK-15(繁茂) AK-15 (緑地) AK-15 (Gür) AK-15 (esőerdő) @@ -4817,12 +4958,12 @@ AK-15 (árido) AK-15 (arido) AK-15 (region suchy) - AK-15 (засушливая местность) + AK-15 (сухая местность) AK-15 (Trocken) AK-15 (suchý porost) AK-15 (Árido) AK-15 (건조) - AK-15 (干旱) + AK-15(干旱) AK-15 (乾燥地帯) AK-15 (Kurak) AK-15 (sivatag) @@ -4839,7 +4980,7 @@ AK-15 GL AK-15 GL AK-15 GL - AK-15 GL + AK-15 GP-34 AK-15 GL AK-15 GL AK-15 GL @@ -4856,7 +4997,7 @@ AK-15 GL (bujný porost) AK-15 GL (Exuberante) AK-15 GL (초목) - AK-15 GL (繁茂) + AK-15 GP-34(繁茂) AK-15 GL (緑地) AK-15 GL (Gür) AK-15 GL (esőerdő) @@ -4868,12 +5009,12 @@ AK-15 GL (árido) AK-15 GL (arido) AK-15 GL (region suchy) - AK-15 GL (засушливая местность) + AK-15 GL (сухая местность) AK-15 GL (Trocken) AK-15 GL (suchý porost) AK-15 GL (Árido) AK-15 GL (건조) - AK-15 GL (干旱) + AK-15 GP-34(干旱) AK-15 GL (乾燥地帯) AK-15AK-15 GL (Kurak) AK-15 GL (sivatag) @@ -4907,7 +5048,7 @@ AK-15K (bujný porost) AK-15K (Exuberante) AK-15K (초목) - AK-15K (繁茂) + AK-15K(繁茂) AK-15K (緑地) AK-15K (Gür) AK-15K (esőerdő) @@ -4919,12 +5060,12 @@ AK-15K (árido) AK-15K (arido) AK-15K (region suchy) - AK-15K (засушливая местность) + AK-15K (сухая местность) AK-15K (Trocken) AK-15K (suchý porost) AK-15K (Árido) AK-15K (건조) - AK-15K (干旱) + AK-15K(干旱) AK-15K (乾燥地帯) AK-15K (Kurak) AK-15K (sivatag) @@ -4958,7 +5099,7 @@ RPK (bujný porost) RPK (Exuberante) RPK (초목) - RPK (繁茂) + RPK(繁茂) RPK (緑地) RPK (Gür) RPK (esőerdő) @@ -4970,12 +5111,12 @@ RPK (árido) RPK (arido) RPK (region suchy) - RPK (засушливая местность) + RPK (сухая местность) RPK (Trocken) RPK (suchý porost) RPK (Árido) RPK (건조) - RPK (干旱) + RPK(干旱) RPK (乾燥地帯) RPK (Kurak) RPK (sivatag) @@ -4991,8 +5132,8 @@ M14 (klassisch) M14 (klasický) M14 (clássico) - M14 (표준) - M14 (經典) + M14 (클래식) + M14(经典) M14 (クラシック) M14 (klasik) M14 (klasszikus) @@ -5004,12 +5145,12 @@ Stoner 99 LMG (Negro) Stoner 99 LMG (Nero) Stoner 99 LMG (Czarny) - Stoner 99 LMG (Чёрный) + Stoner 99 LMG (чёрный) Stoner 99 LMG (Schwarz) Stoner 99 LMG (Černá) Stoner 99 LMG (Preto) - Stoner 99 LMG (검정) - 斯通纳99轻机枪(黑色) + 스토너 99 LMG (검정) + 斯通纳 99(黑色) ストーナー 99 LMG(ブラック) Stoner 99 LMG (Siyah) Stoner 99 Könnyűgéppuska (Fekete) @@ -5025,7 +5166,7 @@ MSBS Grot MSBS Grot MSBS Grot - MSBS Grot + MSBS 그롯 MSBS Grot MSBS グロート MSBS Grot @@ -5038,12 +5179,12 @@ MSBS Grot (Negro) MSBS Grot (Nero) MSBS Grot (Czarny) - MSBS Grot (Чёрный) + MSBS Grot (чёрный) MSBS Grot (Schwarz) MSBS Grot (Černá) MSBS Grot (Preto) - MSBS Grot (검정) - MSBS Grot(黑色) + MSBS 그롯 (검정) + MSBS Grot(黑色) MSBS グロート (ブラック) MSBS Grot (Siyah) MSBS Grot (Fekete) @@ -5055,12 +5196,12 @@ MSBS Grot (Camuflaje) MSBS Grot (Camo) MSBS Grot (Kamuflaż) - MSBS Grot (Камо) + MSBS Grot (камуфляжный) MSBS Grot (Tarnmuster) MSBS Grot (Kamufláž) MSBS Grot (Camo) - MSBS Grot (위장) - MSBS Grot(迷彩) + MSBS 그롯 (위장) + MSBS Grot(迷彩) MSBS グロート (カモフラージュ) MSBS Grot (Kamuflaj) MSBS Grot (Terepmintás) @@ -5072,12 +5213,12 @@ MSBS Grot (Arena) MSBS Grot (Sabbia) MSBS Grot (Piaskowy) - MSBS Grot (Песочный) + MSBS Grot (песочный) MSBS Grot (Sandfarben) MSBS Grot (Písková) MSBS Grot (Deserto) - MSBS Grot (모래) - MSBS Grot(沙色) + MSBS 그롯 (모래) + MSBS Grot(沙色) MSBS グロート (サンド) MSBS Grot (Kum) MSBS Grot (Homok) @@ -5093,8 +5234,8 @@ MSBS Grot GL MSBS Grot GL MSBS Grot GL - MSBS Grot GL - MSBS Grot GL + MSBS 그롯 GL + MSBS Grot GPBO-40 MSBS グロート GL MSBS Grot GL MSBS Grot GL @@ -5106,12 +5247,12 @@ MSBS Grot GL (Negro) MSBS Grot GL (Nero) MSBS Grot GL (Czarny) - MSBS Grot GL (Чёрный) + MSBS Grot GL (чёрный) MSBS Grot GL (Schwarz) MSBS Grot GL (Černá) MSBS Grot GL (Preto) - MSBS Grot GL (검정) - MSBS Grot GL(黑色) + MSBS 그롯 GL (검정) + MSBS Grot GPBO-40(黑色) MSBS グロート GL(ブラック) MSBS Grot GL (Siyah) MSBS Grot GL (Fekete) @@ -5123,12 +5264,12 @@ MSBS Grot GL (Camuflaje) MSBS Grot GL (Camo) MSBS Grot GL (Kamuflaż) - MSBS Grot GL (Камо) + MSBS Grot GL (камуфляжный) MSBS Grot GL (Tarnmuster) MSBS Grot GL (Kamufláž) MSBS Grot GL (Camo) - MSBS Grot GL (위장) - MSBS Grot GL(迷彩) + MSBS 그롯 GL (위장) + MSBS Grot GPBO-40(迷彩) MSBS グロート GL (カモフラージュ) MSBS Grot GL (Kamuflaj) MSBS Grot GL (Terepmintás) @@ -5140,12 +5281,12 @@ MSBS Grot GL (Arena) MSBS Grot GL (Sabbia) MSBS Grot GL (Piaskowy) - MSBS Grot GL (Песочный) + MSBS Grot GL (песочный) MSBS Grot GL (Sandfarben) MSBS Grot GL (Písková) MSBS Grot GL (Deserto) - MSBS Grot GL (모래) - MSBS Grot GL(沙色) + MSBS 그롯 GL (모래) + MSBS Grot GPBO-40(沙色) MSBS グロート GL (サンド) MSBS Grot GL (Kum) MSBS Grot GL (Homok) @@ -5161,7 +5302,7 @@ MSBS Grot MR MSBS Grot MR MSBS Grot MR - MSBS Grot MR + MSBS 그롯 MR MSBS Grot MR MSBS グロート MR MSBS Grot MR @@ -5174,12 +5315,12 @@ MSBS Grot MR (Negro) MSBS Grot MR (Nero) MSBS Grot MR (Czarny) - MSBS Grot MR (Чёрный) + MSBS Grot MR (чёрный) MSBS Grot MR (Schwarz) MSBS Grot MR (Černá) MSBS Grot MR (Preto) - MSBS Grot MR (검정) - MSBS Grot MR(黑色) + MSBS 그롯 MR (검정) + MSBS Grot MR(黑色) MSBS グロート MR (ブラック) MSBS Grot MR (Siyah) MSBS Grot MR (Fekete) @@ -5191,12 +5332,12 @@ MSBS Grot MR (Camuflaje) MSBS Grot MR (Camo) MSBS Grot MR (Kamuflaż) - MSBS Grot MR (Камо) + MSBS Grot MR (камуфляжный) MSBS Grot MR (Tarnmuster) MSBS Grot MR (Kamufláž) MSBS Grot MR (Camo) - MSBS Grot MR (위장) - MSBS Grot MR(迷彩) + MSBS 그롯 MR (위장) + MSBS Grot MR(迷彩) MSBS グロート MR (カモフラージュ) MSBS Grot MR (Kamuflaj) MSBS Grot MR (Terepmintás) @@ -5208,12 +5349,12 @@ MSBS Grot MR (Arena) MSBS Grot MR (Sabbia) MSBS Grot MR (Piaskowy) - MSBS Grot MR (Песочный) + MSBS Grot MR (песочный) MSBS Grot MR (Sandfarben) MSBS Grot MR (Písková) MSBS Grot MR (Deserto) - MSBS Grot MR (모래) - MSBS Grot MR(沙色) + MSBS 그롯 MR (모래) + MSBS Grot MR(沙色) MSBS グロート MR (サンド) MSBS Grot MR (Kum) MSBS Grot MR (Homok) @@ -5229,7 +5370,7 @@ MSBS Grot SG MSBS Grot SG MSBS Grot SG - MSBS Grot SG + MSBS 그롯 SG MSBS Grot SG MSBS グロート SG MSBS Grot SG @@ -5242,12 +5383,12 @@ MSBS Grot SG (Negro) MSBS Grot SG (Nero) MSBS Grot SG (Czarny) - MSBS Grot SG (Чёрный) + MSBS Grot SG (чёрный) MSBS Grot SG (Schwarz) MSBS Grot SG (Černá) MSBS Grot SG (Preto) - MSBS Grot SG (검정) - MSBS Grot SG(黑色) + MSBS 그롯 SG (검정) + MSBS Grot SG(黑色) MSBS グロート SG (ブラック) MSBS Grot SG (Siyah) MSBS Grot SG (Fekete) @@ -5259,12 +5400,12 @@ MSBS Grot SG (Camuflaje) MSBS Grot SG (Camo) MSBS Grot SG (Kamuflaż) - MSBS Grot SG (Камо) + MSBS Grot SG (камуфляжный) MSBS Grot SG (Tarnmuster) MSBS Grot SG (Kamufláž) MSBS Grot SG (Camo) - MSBS Grot SG (위장) - MSBS Grot SG(迷彩) + MSBS 그롯 SG (위장) + MSBS Grot SG(迷彩) MSBS グロート SG (カモフラージュ) MSBS Grot SG (Kamuflaj) MSBS Grot SG (Terepmintás) @@ -5276,12 +5417,12 @@ MSBS Grot SG (Arena) MSBS Grot SG (Sabbia) MSBS Grot SG (Piaskowy) - MSBS Grot SG (Песочный) + MSBS Grot SG (песочный) MSBS Grot SG (Sandfarben) MSBS Grot SG (Písková) MSBS Grot SG (Deserto) - MSBS Grot SG (모래) - MSBS Grot SG(沙色) + MSBS 그롯 SG (모래) + MSBS Grot SG(沙色) MSBS グロート SG (サンド) MSBS Grot SG (Kum) MSBS Grot SG (Homok) diff --git a/addons/realisticweights/CfgWeapons.hpp b/addons/realisticweights/CfgWeapons.hpp index 02b44bbcc2..771b32b96f 100644 --- a/addons/realisticweights/CfgWeapons.hpp +++ b/addons/realisticweights/CfgWeapons.hpp @@ -202,7 +202,7 @@ class CfgWeapons { // - Stoner LMG ----------------------------------------------------------- class LMG_Mk200_F: Rifle_Long_Base_F { class WeaponSlotsInfo: WeaponSlotsInfo { - mass = 100; + mass = 114; }; }; diff --git a/addons/rearm/Cfg3DEN.hpp b/addons/rearm/Cfg3DEN.hpp index 05581e7206..e5e52dbcd0 100644 --- a/addons/rearm/Cfg3DEN.hpp +++ b/addons/rearm/Cfg3DEN.hpp @@ -1,6 +1,6 @@ +#define VANILLA_REARMCARGO (if (getAmmoCargo _this > 0) then {getAmmoCargo _this} else {-1}) #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) -#define DEFAULT_REARMCARGO GET_NUMBER(configOf _this >> QQGVAR(defaultSupply),-1) - +#define DEFAULT_REARMCARGO GET_NUMBER(configOf _this >> 'GVAR(defaultSupply)',VANILLA_REARMCARGO) class Cfg3DEN { class Object { diff --git a/addons/rearm/CfgVehicles.hpp b/addons/rearm/CfgVehicles.hpp index 221b01b249..9d36d5baae 100644 --- a/addons/rearm/CfgVehicles.hpp +++ b/addons/rearm/CfgVehicles.hpp @@ -102,66 +102,51 @@ class CfgVehicles { class Truck_03_base_F; class O_Truck_03_ammo_F: Truck_03_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Truck_02_base_F; class Truck_02_Ammo_base_F: Truck_02_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class B_Truck_01_mover_F; class B_Truck_01_ammo_F: B_Truck_01_mover_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class B_APC_Tracked_01_base_F; class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Heli_Transport_04_base_F; class O_Heli_Transport_04_ammo_F: Heli_Transport_04_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Pod_Heli_Transport_04_base_F; class Land_Pod_Heli_Transport_04_ammo_F: Pod_Heli_Transport_04_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Slingload_01_Base_F; class B_Slingload_01_Ammo_F: Slingload_01_Base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class ReammoBox_F; - class NATO_Box_Base: ReammoBox_F {}; + class NATO_Box_Base; class Box_NATO_AmmoVeh_F: NATO_Box_Base { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class EAST_Box_Base: ReammoBox_F {}; + class EAST_Box_Base; class Box_East_AmmoVeh_F: EAST_Box_Base { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class IND_Box_Base: ReammoBox_F {}; + class IND_Box_Base; class Box_IND_AmmoVeh_F: IND_Box_Base { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class Box_IND_AmmoOrd_F; - class Box_IDAP_AmmoOrd_F: Box_IND_AmmoOrd_F { - transportAmmo = 0; // not sure why this one has 240 - }; // Dummy Vehicles class ThingX; diff --git a/addons/rearm/XEH_postInit.sqf b/addons/rearm/XEH_postInit.sqf index d85104e84f..f156fb71d6 100644 --- a/addons/rearm/XEH_postInit.sqf +++ b/addons/rearm/XEH_postInit.sqf @@ -2,33 +2,44 @@ GVAR(hardpointGroupsCache) = [] call CBA_fnc_createNamespace; GVAR(configTypesAdded) = []; -["CBA_settingsInitialized", { - TRACE_2("settingsInit",GVAR(level),GVAR(supply)); - ["LandVehicle", "Init", {_this call FUNC(initSupplyVehicle)}, true, ["StaticWeapon"], true] call CBA_fnc_addClassEventHandler; - ["ReammoBox_F", "Init", {_this call FUNC(initSupplyVehicle)}, true, [], true] call CBA_fnc_addClassEventHandler; -}] call CBA_fnc_addEventHandler; +GVAR(magazineNameCache) = [] call CBA_fnc_createNamespace; +GVAR(originalMagazineNames) = []; -["ace_unconscious", LINKFUNC(handleUnconscious)] call CBA_fnc_addEventHandler; [QGVAR(initSupplyVehicle), { TRACE_1("initSupplyVehicle EH",_this); // Warning: this can run before settings are init [FUNC(initSupplyVehicle), _this] call EFUNC(common,runAfterSettingsInit); }] call CBA_fnc_addEventHandler; -["vehicle", { - params ["_unit"]; - [_unit] call FUNC(dropAmmo); -}] call CBA_fnc_addPlayerEventHandler; +["CBA_settingsInitialized", { + TRACE_3("settingsInit",GVAR(enabled),GVAR(level),GVAR(supply)); -if (isServer) then { - addMissionEventHandler ["HandleDisconnect", {params ["_unit"]; [_unit] call FUNC(dropAmmo)}]; -}; + // need these events before enabled check for zeus rearm + [QGVAR(rearmEntireVehicleSuccessEH), LINKFUNC(rearmEntireVehicleSuccess)] call CBA_fnc_addEventHandler; + [QGVAR(rearmEntireVehicleSuccessLocalEH), LINKFUNC(rearmEntireVehicleSuccessLocal)] call CBA_fnc_addEventHandler; + [QGVAR(makeDummyEH), LINKFUNC(makeDummy)] call CBA_fnc_addEventHandler; + [QGVAR(rearmSuccessEH), LINKFUNC(rearmSuccess)] call CBA_fnc_addEventHandler; + [QGVAR(rearmSuccessLocalEH), LINKFUNC(rearmSuccessLocal)] call CBA_fnc_addEventHandler; -[QGVAR(makeDummyEH), LINKFUNC(makeDummy)] call CBA_fnc_addEventHandler; -[QGVAR(rearmEntireVehicleSuccessEH), LINKFUNC(rearmEntireVehicleSuccess)] call CBA_fnc_addEventHandler; -[QGVAR(rearmEntireVehicleSuccessLocalEH), LINKFUNC(rearmEntireVehicleSuccessLocal)] call CBA_fnc_addEventHandler; -[QGVAR(rearmSuccessEH), LINKFUNC(rearmSuccess)] call CBA_fnc_addEventHandler; -[QGVAR(rearmSuccessLocalEH), LINKFUNC(rearmSuccessLocal)] call CBA_fnc_addEventHandler; + if (!GVAR(enabled)) exitWith {}; + ["AllVehicles", "Init", LINKFUNC(initSupplyVehicle), true, ["Man", "StaticWeapon"], true] call CBA_fnc_addClassEventHandler; + ["ReammoBox_F", "Init", LINKFUNC(initSupplyVehicle), true, [], true] call CBA_fnc_addClassEventHandler; + ["House", "Init", LINKFUNC(initSupplyVehicle), true, [], true] call CBA_fnc_addClassEventHandler; -GVAR(magazineNameCache) = [] call CBA_fnc_createNamespace; -GVAR(originalMagazineNames) = []; + // placed in editor static objects don't trigger init + { + _x call FUNC(initSupplyVehicle); + } forEach allMissionObjects "Static"; + + ["ace_unconscious", LINKFUNC(handleUnconscious)] call CBA_fnc_addEventHandler; + + ["vehicle", { + params ["_unit"]; + [_unit] call FUNC(dropAmmo); + }] call CBA_fnc_addPlayerEventHandler; + + if (isServer) then { + addMissionEventHandler ["HandleDisconnect", {params ["_unit"]; [_unit] call FUNC(dropAmmo)}]; + }; + +}] call CBA_fnc_addEventHandler; diff --git a/addons/rearm/XEH_preStart.sqf b/addons/rearm/XEH_preStart.sqf index 022888575e..b092699f9b 100644 --- a/addons/rearm/XEH_preStart.sqf +++ b/addons/rearm/XEH_preStart.sqf @@ -1,3 +1,9 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +// Test binarization one time at startup - ref https://github.com/acemod/ACE3/pull/8093 +private _test = getText (configFile >> "Cfg3DEN" >> "Object" >> "AttributeCategories" >> "ace_attributes" >> "Attributes" >> "ace_rearm_rearmCargo" >> "defaultValue"); +if (!("else {" in _test)) then { + ERROR("3den attribute has ERROR [check binarization]"); +}; diff --git a/addons/rearm/dev/test_debugConfigs.sqf b/addons/rearm/dev/test_debugConfigs.sqf index 8b61bf195f..be287686ca 100644 --- a/addons/rearm/dev/test_debugConfigs.sqf +++ b/addons/rearm/dev/test_debugConfigs.sqf @@ -1,14 +1,21 @@ // ["vehicleTransportAmmo"] call ace_common_fnc_runTests; // execVM "z\ace\addons\rearm\dev\test_debugConfigs.sqf"; -#include "\z\ace\addons\rearm\script_component.hpp" +#include "..\script_component.hpp" private _testPass = true; -INFO("Showing CfgVehicles with vanilla transportAmmo"); +INFO("Showing CfgVehicles with vanilla transportAmmo and without XEH"); + +private _badCfgVehicles = toString { + getNumber (_x >> "scope") == 2 + && {getNumber (_x >> "transportAmmo") > 0} + && {!isText (_x >> "EventHandlers" >> "CBA_Extended_EventHandlers" >> "init")} +}; + { - WARNING_2("Type [%1] needs config [transportAmmo: %2]", configName _x, getNumber (_x >> 'transportAmmo')); + diag_log text format ["Class %1: %2 [%3] needs XEH", configName _x, configName inheritsFrom _x, configSourceMod _x]; _testPass = false; -} forEach (configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'transportAmmo')) > 0}", true]); +} forEach (_badCfgVehicles configClasses (configFile >> "CfgVehicles")); _testPass diff --git a/addons/rearm/functions/fnc_addMagazineToSupply.sqf b/addons/rearm/functions/fnc_addMagazineToSupply.sqf index cb9156ef9a..a143a22592 100644 --- a/addons/rearm/functions/fnc_addMagazineToSupply.sqf +++ b/addons/rearm/functions/fnc_addMagazineToSupply.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Adds magazines to the supply. [Global Effects] diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index 86db3eef78..e71cab8f0c 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Show the resupplyable ammunition of all surrounding vehicles. @@ -19,7 +19,12 @@ params ["_truck", "_player"]; private _vehicles = nearestObjects [_truck, ["AllVehicles"], GVAR(distance)]; -_vehicles = _vehicles select {(_x != _truck) && {!(_x isKindOf "CAManBase")} && {!(_x getVariable [QGVAR(disabled), false])}}; +_vehicles = _vehicles select { + _x != _truck + && {!(_x isKindOf "CAManBase")} + && {alive _x} + && {!(_x getVariable [QGVAR(disabled), false])} +}; private _cswCarryMagazines = []; private _vehicleActions = []; diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index 1ab5377aad..f218276350 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Adds all magazines of a vehicle to the supply. @@ -27,7 +27,7 @@ TRACE_2("addVehicleMagazinesToSupply",_truck,_vehicle); if (isNull _truck) exitWith {}; if (_vehicle isEqualType objNull) then {_vehicle = typeOf _vehicle}; if (_vehicle == "") exitWith { - ERROR_1("VehicleType [%1] is empty in ace_rearm_fnc_addVehicleMagazinesToSupply",_string); + ERROR_1("VehicleType [%1] is empty in ace_rearm_fnc_addVehicleMagazinesToSupply",_vehicle); }; private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); { @@ -36,10 +36,8 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); TRACE_2("",_turretPath,_magazines); { [_truck, _x] call FUNC(addMagazineToSupply); - false - } count _magazines; - false -} count _turrets; + } forEach _magazines; +} forEach _turrets; // 1.70 pylons private _pylonConfigs = configProperties [configFile >> "CfgVehicles" >> _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; diff --git a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf index 824eb07f78..85c23f27d9 100644 --- a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Checks if unit can read supply counter. [Only for GVAR(supply) > 0] diff --git a/addons/rearm/functions/fnc_canRearm.sqf b/addons/rearm/functions/fnc_canRearm.sqf index bda5d8088c..8d2b0b58e5 100644 --- a/addons/rearm/functions/fnc_canRearm.sqf +++ b/addons/rearm/functions/fnc_canRearm.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Check if a unit can rearm. diff --git a/addons/rearm/functions/fnc_canStoreAmmo.sqf b/addons/rearm/functions/fnc_canStoreAmmo.sqf index b0f22b6e07..5eb954fe34 100644 --- a/addons/rearm/functions/fnc_canStoreAmmo.sqf +++ b/addons/rearm/functions/fnc_canStoreAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check if a unit can store ammo in an ammo truck. @@ -17,7 +17,7 @@ */ params ["_truck", "_unit"]; - + (alive _unit) && {!isNull (_unit getVariable [QGVAR(dummy), objNull])} && {alive _truck} diff --git a/addons/rearm/functions/fnc_canTakeAmmo.sqf b/addons/rearm/functions/fnc_canTakeAmmo.sqf index 5b0a41f9b2..6d4e9d4492 100644 --- a/addons/rearm/functions/fnc_canTakeAmmo.sqf +++ b/addons/rearm/functions/fnc_canTakeAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check if a unit can pick up ammo. diff --git a/addons/rearm/functions/fnc_createDummy.sqf b/addons/rearm/functions/fnc_createDummy.sqf index 05f6f3505b..45318cd13f 100644 --- a/addons/rearm/functions/fnc_createDummy.sqf +++ b/addons/rearm/functions/fnc_createDummy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Creates a carryable ammunition dummy object. diff --git a/addons/rearm/functions/fnc_disable.sqf b/addons/rearm/functions/fnc_disable.sqf index 4812c34cfb..82b3c39839 100644 --- a/addons/rearm/functions/fnc_disable.sqf +++ b/addons/rearm/functions/fnc_disable.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Disables being able to rearm a vehicle's turrets. [Global Effects] * * Arguments: * 0: Vehicle - * 1: Disable (optional) + * 1: Disable (default: true) * * Return Value: * None diff --git a/addons/rearm/functions/fnc_dropAmmo.sqf b/addons/rearm/functions/fnc_dropAmmo.sqf index d4c68ea34b..af4b74ee77 100644 --- a/addons/rearm/functions/fnc_dropAmmo.sqf +++ b/addons/rearm/functions/fnc_dropAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Drops a magazine, optionally deletes it and optionally unholsters the wepaon. diff --git a/addons/rearm/functions/fnc_getAllRearmTurrets.sqf b/addons/rearm/functions/fnc_getAllRearmTurrets.sqf index 95f773e1bb..41edfeaabf 100644 --- a/addons/rearm/functions/fnc_getAllRearmTurrets.sqf +++ b/addons/rearm/functions/fnc_getAllRearmTurrets.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Tuupertunut * Returns all turrets in a vehicle. diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf index c43c0ecbf2..2d58ef0344 100644 --- a/addons/rearm/functions/fnc_getCaliber.sqf +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Get the caliber of the ammo in a magazine and return its parameters. diff --git a/addons/rearm/functions/fnc_getMagazineName.sqf b/addons/rearm/functions/fnc_getMagazineName.sqf index f83d71e470..2ee4a988ed 100644 --- a/addons/rearm/functions/fnc_getMagazineName.sqf +++ b/addons/rearm/functions/fnc_getMagazineName.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Gets a non-ambigious display name for a magazine using displayNameShort (AP/HE) diff --git a/addons/rearm/functions/fnc_getMaxMagazines.sqf b/addons/rearm/functions/fnc_getMaxMagazines.sqf index 45f90d6579..9cf262d59d 100644 --- a/addons/rearm/functions/fnc_getMaxMagazines.sqf +++ b/addons/rearm/functions/fnc_getMaxMagazines.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Calculates the maximum number of magazines a turret can hold according to config. diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index e49729eac7..078af4d887 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Tuupertunut * Returns information about every magazine that can be rearmed in the vehicle. Multiple mags of @@ -66,7 +66,7 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); if (_turretPath isEqualTo _turretCurrent) then { _magazineClasses pushBackUnique _className; }; - } forEach (magazinesAllTurrets _vehicle); + } forEach (magazinesAllTurrets _vehicle); } else { _magazineClasses = [_vehicle, _turretPath] call FUNC(getTurretConfigMagazines); _magazineClasses = _magazineClasses arrayIntersect _magazineClasses; diff --git a/addons/rearm/functions/fnc_getSupplyCount.sqf b/addons/rearm/functions/fnc_getSupplyCount.sqf index 87a1dd1ee8..867328751f 100644 --- a/addons/rearm/functions/fnc_getSupplyCount.sqf +++ b/addons/rearm/functions/fnc_getSupplyCount.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Get the supply count. diff --git a/addons/rearm/functions/fnc_getTurretConfigMagazines.sqf b/addons/rearm/functions/fnc_getTurretConfigMagazines.sqf index 56a2fbdf05..e253d13e64 100644 --- a/addons/rearm/functions/fnc_getTurretConfigMagazines.sqf +++ b/addons/rearm/functions/fnc_getTurretConfigMagazines.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Returns all magazines a turret of a vehicle object can hold according to config. diff --git a/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf b/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf index fa73b59d84..1daa4ca722 100644 --- a/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf +++ b/addons/rearm/functions/fnc_getTurretMagazineAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Tuupertunut * Returns the current ammo counts in all magazines of given class in turret. diff --git a/addons/rearm/functions/fnc_grabAmmo.sqf b/addons/rearm/functions/fnc_grabAmmo.sqf index 8a72ec2cf1..d355485309 100644 --- a/addons/rearm/functions/fnc_grabAmmo.sqf +++ b/addons/rearm/functions/fnc_grabAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Grabs an dummy ammo. diff --git a/addons/rearm/functions/fnc_handleKilled.sqf b/addons/rearm/functions/fnc_handleKilled.sqf index 6ba6e4f4ee..1909980b1f 100644 --- a/addons/rearm/functions/fnc_handleKilled.sqf +++ b/addons/rearm/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Handles medical on set dead event. diff --git a/addons/rearm/functions/fnc_handleRespawn.sqf b/addons/rearm/functions/fnc_handleRespawn.sqf index a1ddd97301..3261501955 100644 --- a/addons/rearm/functions/fnc_handleRespawn.sqf +++ b/addons/rearm/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: unknown * Called when a unit is Respawned diff --git a/addons/rearm/functions/fnc_handleUnconscious.sqf b/addons/rearm/functions/fnc_handleUnconscious.sqf index 18a8af4b56..3ff341a85c 100644 --- a/addons/rearm/functions/fnc_handleUnconscious.sqf +++ b/addons/rearm/functions/fnc_handleUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Handles medical on unconscious event. diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf index 1af5d96a50..c7efb7eca6 100644 --- a/addons/rearm/functions/fnc_hasEnoughSupply.sqf +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check whether enough supply is left to take the magazine. diff --git a/addons/rearm/functions/fnc_initSupplyVehicle.sqf b/addons/rearm/functions/fnc_initSupplyVehicle.sqf index 72b807d810..7749f0b609 100644 --- a/addons/rearm/functions/fnc_initSupplyVehicle.sqf +++ b/addons/rearm/functions/fnc_initSupplyVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Githawk, PabstMirror * Adds rearm supply actions to a vehicle or ammo container. @@ -15,17 +15,28 @@ * Public: No */ -if (!hasInterface) exitWith {}; // For now we just add actions, so no need non-clients +if (!GVAR(enabled)) exitWith {}; params ["_vehicle"]; + private _typeOf = typeOf _vehicle; +private _configOf = configOf _vehicle; TRACE_2("initSupplyVehicle",_vehicle,_typeOf); +if (local _vehicle && {getAmmoCargo _vehicle > 0}) then { + _vehicle setAmmoCargo 0; +}; + +if (!hasInterface) exitWith {}; // For now we just add actions, so no need non-clients + if (!alive _vehicle) exitWith {}; -private _configSupply = getNumber (configFile >> "CfgVehicles" >> _typeOf >> QGVAR(defaultSupply)); +private _configSupply = getNumber (_configOf >> QGVAR(defaultSupply)); +if (_configSupply == 0) then { + _configSupply = getNumber (_config >> "transportAmmo"); +}; private _isSupplyVehicle = _vehicle getVariable [QGVAR(isSupplyVehicle), false]; -private _oldRearmConfig = isClass (configFile >> "CfgVehicles" >> _typeOf >> "ACE_Actions" >> "ACE_MainActions" >> QGVAR(takeAmmo)); +private _oldRearmConfig = isClass (_configOf >> "ACE_Actions" >> "ACE_MainActions" >> QGVAR(takeAmmo)); TRACE_3("",_configSupply,_isSupplyVehicle,_oldRearmConfig); if ((_configSupply <= 0) && {!_isSupplyVehicle} && {!_oldRearmConfig}) exitWith {}; // Ignore if not enabled @@ -75,4 +86,3 @@ if (_oldRearmConfig || {_configSupply > 0}) then { [_vehicle, 0, ["ACE_MainActions"], _actionTakeAmmo] call EFUNC(interact_menu,addActionToObject); [_vehicle, 0, ["ACE_MainActions"], _actionStoreAmmo] call EFUNC(interact_menu,addActionToObject); }; - diff --git a/addons/rearm/functions/fnc_isSource.sqf b/addons/rearm/functions/fnc_isSource.sqf index c79c78308c..f4bffa3191 100644 --- a/addons/rearm/functions/fnc_isSource.sqf +++ b/addons/rearm/functions/fnc_isSource.sqf @@ -1,11 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: shukari * Returns if vehicle or object is a rearm source. * * Arguments: - * 0: target - * 1: check for vanilla rearm vehicle (default: false) + * 0: Target * * Return Value: * None @@ -15,16 +14,13 @@ * * Public: Yes */ -params [ - ["_target", objNull, [objNull]], - ["_testVanillaRearm", false, [false]] - ]; +params [["_target", objNull, [objNull]]]; if ((_target getVariable [QGVAR(currentSupply), 0]) < 0) exitWith {false}; - + private _vehCfg = configOf _target; private _vanillaCargoConfig = getNumber (_vehCfg >> "transportAmmo"); private _rearmCargoConfig = getNumber (_vehCfg >> QGVAR(defaultSupply)); private _supplyVehicle = _target getVariable [QGVAR(isSupplyVehicle), false]; -_rearmCargoConfig > 0 || {_supplyVehicle} || {_testVanillaRearm && _vanillaCargoConfig > 0} +_rearmCargoConfig > 0 || {_supplyVehicle} || {_vanillaCargoConfig > 0} diff --git a/addons/rearm/functions/fnc_makeDummy.sqf b/addons/rearm/functions/fnc_makeDummy.sqf index d319d3587e..b79d2b96ac 100644 --- a/addons/rearm/functions/fnc_makeDummy.sqf +++ b/addons/rearm/functions/fnc_makeDummy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Make a dummy object by disabling collision and turning it. diff --git a/addons/rearm/functions/fnc_makeSource.sqf b/addons/rearm/functions/fnc_makeSource.sqf index 36f3fba553..85acbfa43a 100644 --- a/addons/rearm/functions/fnc_makeSource.sqf +++ b/addons/rearm/functions/fnc_makeSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: shukari (template from refuel makeSource) * Makes an object into a rearm source. @@ -30,7 +30,7 @@ params [ ["_addToCurrent", false, [false]] ]; TRACE_3("makeSource",_source,_rearmCargo,_addToCurrent); - + if (isNull _source) exitWith {}; private _currentSupply = if (_addToCurrent) then { @@ -41,16 +41,22 @@ private _currentSupply = if (_addToCurrent) then { _source setVariable [QGVAR(currentSupply), _currentSupply + _rearmCargo, true]; -private _rearmCargoConfig = getNumber (configOf _source >> QGVAR(defaultSupply)); +private _config = configOf _source; +private _rearmCargoConfig = getNumber (_config >> QGVAR(defaultSupply)); +if (_rearmCargoConfig == 0) then { + _rearmCargoConfig = getNumber (_config >> "transportAmmo"); +}; -// already initialized because this is a config rearm vehicle -if (_rearmCargoConfig > 0 || _source getVariable [QGVAR(isSupplyVehicle), false]) exitWith {}; +// initialize if it's not a config rearm vehicle +if (!(_rearmCargoConfig > 0 && _source getVariable [QGVAR(isSupplyVehicle), false])) then { + _source setVariable [QGVAR(isSupplyVehicle), true, true]; -_source setVariable [QGVAR(isSupplyVehicle), true, true]; + // only add if menu does not already exist + if (isNil {_source getVariable QGVAR(initSupplyVehicle_jipID)}) then { + private _jipID = [QGVAR(initSupplyVehicle), [_source]] call CBA_fnc_globalEventJIP; + [_jipID, _source] call CBA_fnc_removeGlobalEventJIP; + _source setVariable [QGVAR(initSupplyVehicle_jipID), _jipID]; + }; +}; -// check if menu already exists -if (!isNil {_source getVariable QGVAR(initSupplyVehicle_jipID)}) exitWith {}; - -private _jipID = [QGVAR(initSupplyVehicle), [_source]] call CBA_fnc_globalEventJIP; -[_jipID, _source] call CBA_fnc_removeGlobalEventJIP; -_source setVariable [QGVAR(initSupplyVehicle_jipID), _jipID]; +[QGVAR(rearmSourceInitalized), [_source]] call CBA_fnc_globalEvent; diff --git a/addons/rearm/functions/fnc_moduleRearmSettings.sqf b/addons/rearm/functions/fnc_moduleRearmSettings.sqf index 4b61cfa2ee..c241078474 100644 --- a/addons/rearm/functions/fnc_moduleRearmSettings.sqf +++ b/addons/rearm/functions/fnc_moduleRearmSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Module for adjusting the rearm settings. diff --git a/addons/rearm/functions/fnc_pickUpAmmo.sqf b/addons/rearm/functions/fnc_pickUpAmmo.sqf index a47885e716..f080015a5e 100644 --- a/addons/rearm/functions/fnc_pickUpAmmo.sqf +++ b/addons/rearm/functions/fnc_pickUpAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Starts progress bar for picking up a specific kind of magazine from the ground. diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index 238e618dd2..7526fd013a 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Get the remaining ammunition amount. diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf index 779ebf2d51..81f467a5ca 100644 --- a/addons/rearm/functions/fnc_rearm.sqf +++ b/addons/rearm/functions/fnc_rearm.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Starts progress bar for rearming a vehicle. diff --git a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf index 945a0c0632..74de2afe56 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Starts progress bar for rearming an entire vehicle. diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf index 699b37ed40..d014e9d58d 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Rearm an entire vehicle. diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf index 8bf8244dd7..b734f0db13 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Tuupertunut * Rearm an entire turret locally. diff --git a/addons/rearm/functions/fnc_rearmSuccess.sqf b/addons/rearm/functions/fnc_rearmSuccess.sqf index d0610dbb5a..5be575bed1 100644 --- a/addons/rearm/functions/fnc_rearmSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmSuccess.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Rearms a vehicle, after progress bar finishes, pass args to machine where turret is local. diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index 141fe3d60d..71802451b7 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Rearms a vehicle on the turret owner. diff --git a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf index af18dd8c47..3398254057 100644 --- a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf +++ b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Removes a magazine from the supply. diff --git a/addons/rearm/functions/fnc_setSupplyCount.sqf b/addons/rearm/functions/fnc_setSupplyCount.sqf index 41b3016dba..e6eae13a7b 100644 --- a/addons/rearm/functions/fnc_setSupplyCount.sqf +++ b/addons/rearm/functions/fnc_setSupplyCount.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Sets the supply count. [Global Effects] diff --git a/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf b/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf index a999077d57..9744986f97 100644 --- a/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf +++ b/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Tuupertunut * Sets the ammo counts of all magazines of given class in turret. diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf index f693724323..e9f57369f3 100644 --- a/addons/rearm/functions/fnc_storeAmmo.sqf +++ b/addons/rearm/functions/fnc_storeAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Stores ammo in an ammo truck. diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf index 12678b48c6..6a53e4dfdd 100644 --- a/addons/rearm/functions/fnc_takeAmmo.sqf +++ b/addons/rearm/functions/fnc_takeAmmo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Starts progress bar for picking up a specific kind of magazine from an ammo truck. diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf index e00d430f99..717d549b86 100644 --- a/addons/rearm/functions/fnc_takeSuccess.sqf +++ b/addons/rearm/functions/fnc_takeSuccess.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Takes a magazine from an ammo truck. diff --git a/addons/rearm/functions/script_component.hpp b/addons/rearm/functions/script_component.hpp deleted file mode 100644 index 515b56ddc7..0000000000 --- a/addons/rearm/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\rearm\script_component.hpp" diff --git a/addons/rearm/initSettings.sqf b/addons/rearm/initSettings.sqf index 08494ae582..d83ac3c760 100644 --- a/addons/rearm/initSettings.sqf +++ b/addons/rearm/initSettings.sqf @@ -1,9 +1,19 @@ -// CBA Settings [ADDON: ace_rearm]: +private _category = [LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(DisplayName)]; + +[ + QGVAR(enabled), "CHECKBOX", + ELSTRING(common,Enabled), + _category, + true, + true, + {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true +] call CBA_fnc_addSetting; [ QGVAR(level), "LIST", [LSTRING(RearmSettings_level_DisplayName), LSTRING(RearmSettings_level_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + _category, [[0,1,2],[LSTRING(RearmSettings_vehicle), LSTRING(RearmSettings_magazine), LSTRING(RearmSettings_caliber)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(level), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -12,7 +22,7 @@ [ QGVAR(supply), "LIST", [LSTRING(RearmSettings_supply_DisplayName), LSTRING(RearmSettings_supply_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + _category, [[0,1,2],[LSTRING(RearmSettings_unlimited), LSTRING(RearmSettings_limited), LSTRING(RearmSettings_magazineSupply)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -20,8 +30,8 @@ [ QGVAR(distance), "SLIDER", - [localize LSTRING(RearmSettings_distance_DisplayName), localize LSTRING(RearmSettings_distance_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + [LLSTRING(RearmSettings_distance_DisplayName), LLSTRING(RearmSettings_distance_Description)], + _category, [10, 50, 20, 0], true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index 4aae2a1aeb..88be22aae3 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -14,6 +14,7 @@ Rearme Přezbrojení Rearmar + 재보급 Rearm Settings @@ -41,7 +42,7 @@ Este módulo permite cambiar los parámetros de rearme. Ce module vous permet d'ajuster les paramètres du système de réarmement. 再武装システムの設定を微調整します。 - 이 모듈은 재보급시의 설정을 바꿀수 있게해줍니다. + 이 모듈은 재보급시의 설정을 바꿀수 있게 해줍니다. 此模块允许你调整整装系统设定 此模塊允許你調整整裝系統設定 @@ -72,7 +73,7 @@ Définit la vitesse à laquelle s'effectue le réarmement. 車両を再武装する早さを設定します。 차량을 얼마나 빨리 재보급 시킵니까? - 载具多快会整装完毕? + 载具多快会整装完毕? 載具多快會整裝完畢? @@ -140,10 +141,10 @@ Wie viel Munition transportiert ein Munitionslaster? Quante munizioni può trasportare un camion? 弾薬トラックの運搬量を設定します。 - 弹药卡车会携带多少的弹药? + 弹药卡车会携带多少的弹药? 彈藥卡車會攜帶多少的彈藥? Ile amunicji przewozi ciężarówka? - 탄약 차량은 얼마나 많은 양의 탄약을 가질 수 있음? + 탄약 차량은 얼마나 많은 양의 탄약을 가질 수 있습니까? Définit la quantité de munitions que le camion de ravitaillement transporte. Какой боезапас перевозит грузовик с боеприпасами? Quanta munição um caminhão de munições carrega? @@ -158,7 +159,7 @@ 无限弹药 無限彈藥 Nielimitowany zapas amunicji - 무한의 탄약 + 무한 탄약 보급 Munitions illimitées Неограниченный боезапас Suprimento Ilimitado de Munição @@ -173,7 +174,7 @@ 基于口径限制弹药数量 基於口徑限制彈藥數量 Zapas amunicji zależny od kalibru - 구경에 따라 제한된 탄약 + 구경에 따라 제한된 탄약 보급 En fonction du calibre Ограниченный боезапас в зависимости от калибра Munição Limitada ao Calibre @@ -214,11 +215,11 @@ Checking remaining ammunition... Überprüfe verbleibende Munition... Controllando le munizioni rimanenti - 残弾薬を確認中… + 残弾薬を確認中・・・ 正在检查剩余的弹药... 正在檢查剩餘的彈藥中... Sprawdzanie ilości amunicji... - 남은 탄약 확인중... + 남은 탄약 확인 중... Vérification des munitions restantes... Проверка остатка боекомплекта... Checando Munição... @@ -229,11 +230,11 @@ There is ammunition worth %1 points left. Es ist noch Munition für %1 Punkte übrig. E' presente una penalità delle munizioni %1 punti rimanenti. - 弾薬は%1残っています。 - 还剩下%1多的弹药. + 弾薬は %1 残っています。 + 还剩下%1多的弹药。 還剩下%1多的彈藥. Pozostało %1 punktów amunicji. - 여기에는 최소 %1 포인트의 탄약이 남았습니다. + %1 의 탄약이 남아 있습니다. Il reste des munitions d'une valeur de %1 points. Остаток единиц БК: %1 Possui munição equivalente a %1 pontos restantes. @@ -244,8 +245,8 @@ The following ammunition is left:%1 Folgende Munition ist übrig:%1 Mancano le seguenti:%1 - この弾薬の残りは:%1 - 以下剩余的弹药:%1 + この弾薬の残りは: %1 + 以下剩余的弹药:%1 以下剩餘的彈藥:%1 Pozostała amunicja: %1 다음의 탄약이 남음 : %1 @@ -260,10 +261,10 @@ Es ist keine Munition übrig. Non ci sono munizioni rimanenti. 弾薬は残っていない - 已经没有剩余的弹药了. + 已经没有剩余的弹药了。 已經沒有剩餘的彈藥了. Brak amunicji w zapasie. - 여기에는 탄약이 남지 않았습니다. + 탄약이 남지 않았습니다. Il n'y a plus de munitions. Запас боекомплекта пуст Não há munição sobrando. @@ -296,8 +297,8 @@ Riarmando %1 con %2... Rearmando %1 con %2... Réarmement de %1 avec %2... - %1に%2を再武装中… - %2을 %1에 재보급중... + %1 に %2 を再武装中・・・ + %2을 %1에 재보급 중... 正在整装%2到%1... %2正整裝到%1中... @@ -311,8 +312,8 @@ Riarmando %1... Rearmando %1... Réarmement de %1... - %1を再武装中… - %1 재보급중... + %1 を再武装中・・・ + %1 재보급 중... 正在整装%1... 整裝%1中... @@ -326,8 +327,8 @@ Sto prendendo %1 per %2... Tomando %1 para %2... Prise de %1 pour %2... - %1を%2用として取得中… - %2를 위해 %1 가져오는중... + %1 を %2 用として取得中・・・ + %2를 위해 %1 가져오는 중... 正在拿取%1给%2... 拿取%1給%2中... @@ -388,8 +389,8 @@ Sto riponendo %1 in %2... Guardando %1 en %2... Stocke %1 dans %2... - %1を%2へ格納中… - %2에 %1 보관중... + %1 を %2 へ格納中・・・ + %2에 %1 보관 중... 正在储存%1到%2... 儲存%1到%2中... @@ -402,8 +403,8 @@ Sto raccogliendo le munizioni... Levantando munición... Ramassage des munitions... - 弾薬を拾得中… - 탄약 줍는중... + 弾薬を拾得中・・・ + 탄약 줍는 중... 正在捡起弹药... 撿起彈藥中... Sbírám munici... @@ -467,7 +468,7 @@ 30 mm HEI 30mm HEI 30mm 고폭소이탄 - 30mm 高爆燃烧弹 + 30 mm 高爆燃烧 30mm 高爆燃燒彈 30mm HEI @@ -483,7 +484,7 @@ 30 mm HEI-T 30mm HEI-T 30mm 고폭소이예광탄 - 30mm 高爆燃烧曳光弹 + 30 mm 高爆燃烧曳光 30mm 高爆燃燒曳光彈 30mm HEI-T @@ -498,7 +499,7 @@ AIM-9 Sidewinder AIM-9 Sidewinder AIM-9 サイドワインダー - AIM-9 Sidewinder + AIM-9 사이드와인더 AIM-9 响尾蛇 AIM-9 響尾蛇 AIM-9 Sidewinder @@ -514,7 +515,7 @@ Wympel R-73 Wympel R-73 ヴィンペル R-73 - Vympel R-73 + 빔펠 R-73 Wympel R-73 Wympel R-73 Wympel R-73 @@ -530,7 +531,7 @@ AGM-65 Maverick AGM-65 Maverick AGM-65 マーベリック - AGM-65 Maverick + AGM-65 매버릭 AGM-65 小牛 AGM-65 小牛 AGM-65 Maverick @@ -562,7 +563,7 @@ Hydra 70 HE Hydra 70 HE ハイドラ 70 HE - Hydra 70 고폭탄 + 히드라 70 고폭탄 九头蛇 70 高爆弹 九頭蛇 70 高爆彈 Hydra 70 HE @@ -594,7 +595,7 @@ Hydra 70 AP Hydra 70 AP ハイドラ 70 AP - Hydra 70 철갑탄 + 히드라 70 철갑탄 九头蛇 70 反人员弹 九頭蛇 70 反人員彈 Hydra 70 AP @@ -656,9 +657,11 @@ Боеприпасы для перевооружения Carga de Rearme 整裝用貨物 + 重整军备货物 Stock de munitions Sklad munice Cargar munición + 화물 재무장 The cargo for rearming (-1 disable) @@ -669,9 +672,11 @@ Объем боеприпасов для перевооружения (-1 для отмены) A Carga para Rearmamento (-1 para desativar) 貨物可以提高多少次整裝(-1為停用) + 重新武装的货物(-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í) Cantidad de munición restante para rearmado (-1 para deshabilitar) + 화물을 재무장합니다 (-1 설정시 비활성화) Rearm distance @@ -680,11 +685,13 @@ Distância para Rearmar 再武装距離 整裝距離 + 整装距离 Distanza di riarmo Přezbrojovací vzdálenost Odległość przezbrojenia Дистанция перевооружения Distancia de rearmado + 재무장 거리 The maximum distance a vehicle can be rearmed at @@ -693,11 +700,13 @@ 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 Максимальная дистанция для перевооружения Máxima distancia a la que un vehículo puede ser rearmado + 차량이 재무장 할 수 있는 최대 거리를 설정합니다. diff --git a/addons/recoil/CfgRecoils.hpp b/addons/recoil/CfgRecoils.hpp index 4b473919d5..c6482937ae 100644 --- a/addons/recoil/CfgRecoils.hpp +++ b/addons/recoil/CfgRecoils.hpp @@ -14,242 +14,558 @@ class CfgRecoils { class Default { // doc: http://forums.bistudio.com/showthread.php?188999-Recoil-Overhaul-Feedback&s=dba8590ec07adb5ffa87f72d38dde6fc&p=2886744&viewfull=1#post2886744 // {horizontal axis position, vertical axis position, horizontal magnitude, vertical magnitude} - muzzleOuter[] = {0*MUZZLERIGHT_POS,0.4*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG}; + muzzleOuter[] = { + QUOTE(0*MUZZLERIGHT_POS), + QUOTE(0.4*MUZZLECLIMB_POS), + QUOTE(0.5*MUZZLERIGHT_MAG), + QUOTE(0.6*MUZZLECLIMB_MAG) + }; // restricted area inside the outer ellipse where the recoil cannot end muzzleInner[] = {0,0.05,0.2,0.2}; // minimum and maximum interval for backward force - kickBack[] = {0.05*KICKBACK,0.1*KICKBACK}; - permanent = 0.1*MUZZLEPERM; - temporary = 0.01*MUZZLETEMP; + kickBack[] = { + QUOTE(0.05*KICKBACK), + QUOTE(0.1*KICKBACK) + }; + permanent = QUOTE(0.1*MUZZLEPERM); + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_default: Default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - muzzleInner[] = {0,0,0.1,0.1}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - permanent = 0.1*MUZZLEPERM; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + muzzleInner[] = {0, + 0, + 0.1, + 0.1 + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + permanent = QUOTE(0.1*MUZZLEPERM); + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_mk20: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.01*KICKBACK,0.03*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(0.6*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.01*KICKBACK), + QUOTE(0.03*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_mk20c: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(0.8*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_trg20: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_trg21: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.01*KICKBACK,0.03*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(0.8*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.01*KICKBACK), + QUOTE(0.03*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_mx: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.4*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_mxc: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(1.2*MUZZLECLIMB_POS), + QUOTE(0.4*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_sw: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(0.8*MUZZLECLIMB_POS), + QUOTE(0.5*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP; }; class recoil_mxm: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(0.8*MUZZLECLIMB_POS), + QUOTE(0.4*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_ktb: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_ktbc: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(1.2*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_smg_01: recoil_default { - muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.01*KICKBACK,0.03*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.1*MUZZLERIGHT_POS), + QUOTE(0.8*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.01*KICKBACK), + QUOTE(0.03*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_smg_02: recoil_default { - muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.01*KICKBACK,0.02*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.1*MUZZLERIGHT_POS), + QUOTE(0.6*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.01*KICKBACK), + QUOTE(0.02*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_pdw: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.02*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.02*MUZZLETEMP); }; class recoil_sdar: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.3*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_pistol_p07: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.03*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + temporary = QUOTE(0.03*MUZZLETEMP); }; class recoil_pistol_rook40: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.02*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + temporary = QUOTE(0.02*MUZZLETEMP); }; class recoil_pistol_acpc2: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; - temporary = 0.04*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.04*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.04*MUZZLETEMP); }; class recoil_pistol_4five: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; - temporary = 0.06*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.04*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.06*MUZZLETEMP); }; class recoil_pistol_zubr: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; - temporary = 0.08*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.04*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.08*MUZZLETEMP); }; class recoil_pistol_signal: recoil_default { - muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.02*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.2*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.2*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.02*MUZZLETEMP); }; class recoil_rpg: recoil_default { - muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.08*KICKBACK,0.1*KICKBACK}; - temporary = 0.1*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(2*MUZZLERIGHT_POS), + QUOTE(3*MUZZLECLIMB_POS), + QUOTE(1*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.08*KICKBACK), + QUOTE(0.1*KICKBACK) + }; + temporary = QUOTE(0.1*MUZZLETEMP); }; class recoil_nlaw: recoil_default { - muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.06*KICKBACK,0.08*KICKBACK}; - temporary = 0.08*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(2*MUZZLERIGHT_POS), + QUOTE(3*MUZZLECLIMB_POS), + QUOTE(1*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.06*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.08*MUZZLETEMP); }; class recoil_titan_long: recoil_default { - muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.1*KICKBACK,0.12*KICKBACK}; - temporary = 0.15*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(2*MUZZLERIGHT_POS), + QUOTE(3*MUZZLECLIMB_POS), + QUOTE(1*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.1*KICKBACK), + QUOTE(0.12*KICKBACK) + }; + temporary = QUOTE(0.15*MUZZLETEMP); }; class recoil_titan_short: recoil_default { - muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.1*KICKBACK,0.12*KICKBACK}; - temporary = 0.12*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(2*MUZZLERIGHT_POS), + QUOTE(3*MUZZLECLIMB_POS), + QUOTE(1*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.1*KICKBACK), + QUOTE(0.12*KICKBACK) + }; + temporary = QUOTE(0.12*MUZZLETEMP); }; class recoil_mk200: recoil_default { - muzzleOuter[] = {0.4*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.4*MUZZLERIGHT_POS), + QUOTE(0.6*MUZZLECLIMB_POS), + QUOTE(0.6*MUZZLERIGHT_MAG), + QUOTE(0.2*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP; }; class recoil_zafir: recoil_default { - muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.08*KICKBACK}; - temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.5*MUZZLERIGHT_POS), + QUOTE(1*MUZZLECLIMB_POS), + QUOTE(0.7*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP; }; class recoil_m320: recoil_default { - muzzleOuter[] = {1*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG}; - kickBack[] = {0.08*KICKBACK,0.1*KICKBACK}; - temporary = 0.02*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(1*MUZZLERIGHT_POS), + QUOTE(3*MUZZLECLIMB_POS), + QUOTE(0.5*MUZZLERIGHT_MAG), + QUOTE(0.6*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.08*KICKBACK), + QUOTE(0.1*KICKBACK) + }; + temporary = QUOTE(0.02*MUZZLETEMP); }; class recoil_gm6: recoil_default { - muzzleOuter[] = {1.4*MUZZLERIGHT_POS,3.5*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.8*MUZZLECLIMB_MAG}; - kickBack[] = {0.1*KICKBACK,0.12*KICKBACK}; - temporary = 0.025*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(1.4*MUZZLERIGHT_POS), + QUOTE(3.5*MUZZLECLIMB_POS), + QUOTE(0.7*MUZZLERIGHT_MAG), + QUOTE(0.8*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.1*KICKBACK), + QUOTE(0.12*KICKBACK) + }; + temporary = QUOTE(0.025*MUZZLETEMP); }; class recoil_ebr: recoil_default { - muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; - kickBack[] = {0.04*KICKBACK,0.07*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.4*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.6*MUZZLERIGHT_MAG), + QUOTE(0.4*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.04*KICKBACK), + QUOTE(0.07*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_dmr_01: recoil_default { - muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.08*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.5*MUZZLERIGHT_POS), + QUOTE(2*MUZZLECLIMB_POS), + QUOTE(0.5*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_dmr_02: recoil_default { - muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.06*KICKBACK,0.08*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.5*MUZZLERIGHT_POS), + QUOTE(2.5*MUZZLECLIMB_POS), + QUOTE(0.6*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.06*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_dmr_03: recoil_default { - muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; - kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.005*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.3*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.5*MUZZLERIGHT_MAG), + QUOTE(0.4*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.03*KICKBACK), + QUOTE(0.06*KICKBACK) + }; + temporary = QUOTE(0.005*MUZZLETEMP); }; class recoil_dmr_04: recoil_default { - muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.015*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.4*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.5*MUZZLERIGHT_MAG), + QUOTE(0.4*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.04*KICKBACK) + }; + temporary = QUOTE(0.015*MUZZLETEMP); }; class recoil_dmr_05: recoil_default { - muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG}; - kickBack[] = {0.08*KICKBACK,0.1*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.5*MUZZLERIGHT_POS), + QUOTE(2.5*MUZZLECLIMB_POS), + QUOTE(0.8*MUZZLERIGHT_MAG), + QUOTE(0.6*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.08*KICKBACK), + QUOTE(0.1*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_dmr_06: recoil_default { - muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; - kickBack[] = {0.05*KICKBACK,0.1*KICKBACK}; - temporary = 0.01*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.5*MUZZLERIGHT_POS), + QUOTE(2*MUZZLECLIMB_POS), + QUOTE(0.7*MUZZLERIGHT_MAG), + QUOTE(0.5*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.05*KICKBACK), + QUOTE(0.1*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); }; class recoil_mmg_01: recoil_default { - muzzleOuter[] = {0.6*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; - kickBack[] = {0.02*KICKBACK,0.08*KICKBACK}; - temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.6*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.8*MUZZLERIGHT_MAG), + QUOTE(0.3*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.02*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP; }; class recoil_mmg_02: recoil_default { - muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; - kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; - temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; + muzzleOuter[] = { + QUOTE(0.5*MUZZLERIGHT_POS), + QUOTE(1.5*MUZZLECLIMB_POS), + QUOTE(0.6*MUZZLERIGHT_MAG), + QUOTE(0.4*MUZZLECLIMB_MAG) + }; + kickBack[] = { + QUOTE(0.04*KICKBACK), + QUOTE(0.08*KICKBACK) + }; + temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP; }; }; diff --git a/addons/recoil/functions/fnc_camshake.sqf b/addons/recoil/functions/fnc_camshake.sqf index 72b9bcd060..8ffa0eb755 100644 --- a/addons/recoil/functions/fnc_camshake.sqf +++ b/addons/recoil/functions/fnc_camshake.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Orginal by Ryan Schultz, edited by KoffeinFlummi, commy2 * Adds camera shake when firing. Called from the unified fired EH only for the local player. diff --git a/addons/recoil/functions/script_component.hpp b/addons/recoil/functions/script_component.hpp deleted file mode 100644 index 24cb1ba776..0000000000 --- a/addons/recoil/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\recoil\script_component.hpp" \ No newline at end of file diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp index 41c4f12625..5fba336943 100644 --- a/addons/refuel/CfgVehicles.hpp +++ b/addons/refuel/CfgVehicles.hpp @@ -1,47 +1,16 @@ -#define MACRO_NOZZLE_ACTIONS \ - class ACE_Actions { \ - class ACE_MainActions { \ - displayName = CSTRING(Refuel); \ - distance = REFUEL_ACTION_DISTANCE; \ - position = "[0,-0.025,0.125]"; \ - condition = "true"; \ - statement = ""; \ - exceptions[] = {INTERACT_EXCEPTIONS}; \ - showDisabled = 0; \ - icon = QPATHTOF(ui\icon_refuel_interact.paa); \ - class GVAR(PickUpNozzle) { \ - displayName = CSTRING(TakeNozzle); \ - condition = QUOTE([ARR_2(_player,_target)] call FUNC(canTakeNozzle)); \ - statement = QUOTE([ARR_2(_player,_target)] call FUNC(takeNozzle)); \ - exceptions[] = {INTERACT_EXCEPTIONS_REFUELING}; \ - icon = QPATHTOF(ui\icon_refuel_interact.paa); \ - }; \ - class GVAR(TurnOn) { \ - displayName = CSTRING(TurnOn); \ - condition = QUOTE([ARR_2(_player,_target)] call FUNC(canTurnOn)); \ - statement = QUOTE([ARR_2(_player,_target)] call DFUNC(turnOn)); \ - exceptions[] = {INTERACT_EXCEPTIONS}; \ - icon = QPATHTOF(ui\icon_refuel_interact.paa); \ - }; \ - class GVAR(TurnOff) { \ - displayName = CSTRING(TurnOff); \ - condition = QUOTE([ARR_2(_player,_target)] call FUNC(canTurnOff)); \ - statement = QUOTE([ARR_2(_player,_target)] call DFUNC(turnOff)); \ - exceptions[] = {INTERACT_EXCEPTIONS}; \ - icon = QPATHTOF(ui\icon_refuel_interact.paa); \ - }; \ - class GVAR(Disconnect) { \ - displayName = CSTRING(Disconnect); \ - condition = QUOTE([ARR_2(_player,_target)] call FUNC(canDisconnect)); \ - statement = QUOTE([ARR_2(_player,_target)] call DFUNC(disconnect)); \ - exceptions[] = {INTERACT_EXCEPTIONS_REFUELING}; \ - icon = QPATHTOF(ui\icon_refuel_interact.paa); \ - }; \ - }; \ - }; - class CBA_Extended_EventHandlers; +class CfgNonAIVehicles { + class GVAR(fuelHoseSegment) { + scope = 2; + displayName = "Fuel Hose"; + simulation = "ropesegment"; + autocenter = 0; + animated = 0; + model = QPATHTOF(data\hose.p3d); + }; +}; + class CfgVehicles { class ACE_Module; class ACE_moduleRefuelSettings: ACE_Module { @@ -66,6 +35,11 @@ class CfgVehicles { typeName = "NUMBER"; defaultValue = 12; }; + class progressDuration { + displayName = CSTRING(RefuelSettings_progressDuration_DisplayName); + typeName = "NUMBER"; + defaultValue = 2; + }; }; }; @@ -75,12 +49,67 @@ class CfgVehicles { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; }; - MACRO_NOZZLE_ACTIONS displayName = QGVAR(fuelNozzle); scope = 1; scopeCurator = 1; model = QPATHTOF(data\nozzle.p3d); destrType = "DestructNo"; + + class ACE_Actions { + class ACE_MainActions { + displayName = CSTRING(Refuel); + distance = REFUEL_ACTION_DISTANCE; + position = "[0,-0.025,0.125]"; + condition = "true"; + statement = ""; + exceptions[] = {INTERACT_EXCEPTIONS}; + showDisabled = 0; + icon = QPATHTOF(ui\icon_refuel_interact.paa); + class GVAR(PickUpNozzle) { + displayName = CSTRING(TakeNozzle); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canTakeNozzle)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(takeNozzle)); + exceptions[] = {INTERACT_EXCEPTIONS_REFUELING}; + icon = QPATHTOF(ui\icon_refuel_interact.paa); + }; + class GVAR(TurnOn) { + displayName = CSTRING(TurnOn); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canTurnOn)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(turnOn)); + exceptions[] = {INTERACT_EXCEPTIONS}; + icon = QPATHTOF(ui\icon_refuel_interact.paa); + }; + class GVAR(TurnOn_Container) { + displayName = CSTRING(TurnOn_Container); + condition = QUOTE([ARR_3(_player,_target,true)] call FUNC(canTurnOn)); + statement = QUOTE([ARR_3(_player,_target,true)] call FUNC(turnOn)); + exceptions[] = {INTERACT_EXCEPTIONS}; + icon = QPATHTOF(ui\icon_refuel_interact.paa); + }; + class GVAR(TurnOff) { + displayName = CSTRING(TurnOff); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canTurnOff)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(turnOff)); + exceptions[] = {INTERACT_EXCEPTIONS}; + icon = QPATHTOF(ui\icon_refuel_interact.paa); + }; + class GVAR(Disconnect) { + displayName = CSTRING(Disconnect); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canDisconnect)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(disconnect)); + exceptions[] = {INTERACT_EXCEPTIONS_REFUELING}; + icon = QPATHTOF(ui\icon_refuel_interact.paa); + }; + }; + }; + }; + + class Rope; + class GVAR(fuelHose): Rope { + hiddenSelections[] = {"rope"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.009,0.009,0.009,1.0,co)"}; + segmentType = QGVAR(fuelHoseSegment); + model = QPATHTOF(data\hose.p3d); }; class All; @@ -243,7 +272,7 @@ class CfgVehicles { }; class Van_01_fuel_base_F: Van_01_base_F { - GVAR(hooks)[] = {{0.38,-3.17,-.7},{-0.41,-3.17,-.7}}; + GVAR(hooks)[] = {{0.38,-3.17,-0.7},{-0.41,-3.17,-0.7}}; GVAR(fuelCargo) = 2000; }; class C_Van_01_fuel_F: Van_01_fuel_base_F { @@ -267,7 +296,7 @@ class CfgVehicles { class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { transportFuel = 0; //3k - GVAR(hooks)[] = {{-1.08,-4.81,-.8}}; + GVAR(hooks)[] = {{-1.08,-4.81,-0.8}}; GVAR(fuelCargo) = 1000; }; @@ -388,13 +417,13 @@ class CfgVehicles { class B_Truck_01_fuel_F: B_Truck_01_mover_F { transportFuel = 0; //3k - GVAR(hooks)[] = {{.28,-4.99,-.3},{-.25,-4.99,-.3}}; + GVAR(hooks)[] = {{0.28,-4.99,-0.3},{-0.25,-4.99,-0.3}}; GVAR(fuelCargo) = 10000; }; class O_Truck_03_fuel_F: Truck_03_base_F { transportFuel = 0; //3k - GVAR(hooks)[] = {{1.3,-1.59,-.62},{-1.16,-1.59,-.62}}; + GVAR(hooks)[] = {{1.3,-1.59,-0.62},{-1.16,-1.59,-0.62}}; GVAR(fuelCargo) = 10000; }; @@ -408,7 +437,7 @@ class CfgVehicles { class Pod_Heli_Transport_04_base_F: Slingload_base_F {}; class Land_Pod_Heli_Transport_04_fuel_F: Pod_Heli_Transport_04_base_F { transportFuel = 0; //3k - GVAR(hooks)[] = {{-1.49,1.41,-.3}}; + GVAR(hooks)[] = {{-1.49,1.41,-0.3}}; GVAR(fuelCargo) = 10000; }; @@ -471,7 +500,7 @@ class CfgVehicles { class Land_fs_feed_F: House_Small_F { transportFuel = 0; //50k - GVAR(hooks)[] = {{-0.4,0.022,-.23}}; + GVAR(hooks)[] = {{-0.4,0.022,-0.23}}; GVAR(fuelCargo) = REFUEL_INFINITE_FUEL; }; diff --git a/addons/refuel/XEH_PREP.hpp b/addons/refuel/XEH_PREP.hpp index e4c5298036..077c8f1aed 100644 --- a/addons/refuel/XEH_PREP.hpp +++ b/addons/refuel/XEH_PREP.hpp @@ -1,4 +1,5 @@ PREP(canCheckFuel); +PREP(canConnectNozzle); PREP(canDisconnect); PREP(canReturnNozzle); PREP(canTakeNozzle); @@ -8,6 +9,7 @@ PREP(checkFuel); PREP(connectNozzleAction); PREP(disconnect); PREP(dropNozzle); +PREP(getCapacity); PREP(getFuel); PREP(handleDisconnect); PREP(handleRespawn); diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index 14e9b439c9..c826efd3d4 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -20,7 +20,7 @@ GVAR(mainAction) = [ { alive _target && {[_player, _target, [INTERACT_EXCEPTIONS]] call EFUNC(common,canInteractWith)} - && {REFUEL_DISABLED_FUEL != [_target] call FUNC(getFuel)} + && {REFUEL_DISABLED_FUEL != ([_target] call FUNC(getCapacity))} }, {}, [], [0,0,0], REFUEL_ACTION_DISTANCE diff --git a/addons/refuel/config.cpp b/addons/refuel/config.cpp index 2697b53a09..b39b665059 100644 --- a/addons/refuel/config.cpp +++ b/addons/refuel/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); - authors[] = {"GitHawk"}; + authors[] = {"GitHawk", "QuantX"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/refuel/data/hose.cfg b/addons/refuel/data/hose.cfg new file mode 100644 index 0000000000..a49123a444 --- /dev/null +++ b/addons/refuel/data/hose.cfg @@ -0,0 +1,7 @@ +class CfgModels { + class hose { + sectionsInherit = ""; + sections[] = {"rope"}; + skeletonName = ""; + }; +}; \ No newline at end of file diff --git a/addons/refuel/data/hose.p3d b/addons/refuel/data/hose.p3d new file mode 100644 index 0000000000..cc233eacf6 Binary files /dev/null and b/addons/refuel/data/hose.p3d differ diff --git a/addons/refuel/defines.hpp b/addons/refuel/defines.hpp new file mode 100644 index 0000000000..761eb08641 --- /dev/null +++ b/addons/refuel/defines.hpp @@ -0,0 +1,4 @@ +#define REFUEL_INFINITE_FUEL -10 +#define REFUEL_DISABLED_FUEL -1 +#define REFUEL_ACTION_DISTANCE 7 +#define REFUEL_NOZZLE_ACTION_DISTANCE 2 diff --git a/addons/refuel/dev/test_debugConfigs.sqf b/addons/refuel/dev/test_debugConfigs.sqf index 834d3626bf..f427f07d28 100644 --- a/addons/refuel/dev/test_debugConfigs.sqf +++ b/addons/refuel/dev/test_debugConfigs.sqf @@ -1,7 +1,7 @@ // ["vehicleTransportFuel"] call ace_common_fnc_runTests; // execVM "z\ace\addons\refuel\dev\test_debugConfigs.sqf"; -#include "\z\ace\addons\refuel\script_component.hpp" +#include "..\script_component.hpp" private _testPass = true; diff --git a/addons/refuel/functions/fnc_canCheckFuel.sqf b/addons/refuel/functions/fnc_canCheckFuel.sqf index f7bb8a4aa8..97aadaf91b 100644 --- a/addons/refuel/functions/fnc_canCheckFuel.sqf +++ b/addons/refuel/functions/fnc_canCheckFuel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas, GitHawk * Checks if unit can check fuel. @@ -23,4 +23,4 @@ params [["_unit", objNull, [objNull]], ["_source", objNull, [objNull]]]; {!local _unit} || {!alive _source} || {([_unit, _source] call EFUNC(interaction,getInteractionDistance)) > REFUEL_ACTION_DISTANCE} || - {(_source call FUNC(getFuel) == REFUEL_INFINITE_FUEL)}) + {(_source call FUNC(getCapacity)) in [REFUEL_INFINITE_FUEL, REFUEL_DISABLED_FUEL]}) diff --git a/addons/refuel/functions/fnc_canConnectNozzle.sqf b/addons/refuel/functions/fnc_canConnectNozzle.sqf new file mode 100644 index 0000000000..b1a85a2868 --- /dev/null +++ b/addons/refuel/functions/fnc_canConnectNozzle.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: QuantX + * Checks if an object can have a nozzle connected to it. + * + * Arguments: + * 0: Object + * + * Return Value: + * Can nozzle be connected + * + * Example: + * [myVehicle] call ace_refuel_fnc_canConnectNozzle; + * [myJerryCan] call ace_refuel_fnc_canConnectNozzle; + * + * Public: No + */ + +params [["_object", objNull, [objNull]]]; + +// Make sure object doesn't already have a nozzle connected +if (isNull _object || {!isNull (_object getVariable [QGVAR(nozzle), objNull])} ) exitWith {false}; + +// Can't fuel a jerry can that is connected to another object +if (_object getVariable [QGVAR(jerryCan), false]) exitWith {!(_object getVariable [QGVAR(isConnected), false])}; + +// We need to check "canReceive" before we check if the tank can be filled +// This handles the edge case where a fuel truck has an infintite supply (i.e. the truck can be refueled, but the tank cannot) +(getNumber ((configOf _object) >> QGVAR(canReceive)) == 1) || + {!(([_object] call FUNC(getCapacity)) in [REFUEL_INFINITE_FUEL, REFUEL_DISABLED_FUEL])} diff --git a/addons/refuel/functions/fnc_canDisconnect.sqf b/addons/refuel/functions/fnc_canDisconnect.sqf index 1288d9f103..813706431a 100644 --- a/addons/refuel/functions/fnc_canDisconnect.sqf +++ b/addons/refuel/functions/fnc_canDisconnect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check if a unit can disconnect a fuel nozzle diff --git a/addons/refuel/functions/fnc_canReturnNozzle.sqf b/addons/refuel/functions/fnc_canReturnNozzle.sqf index aef2e96fa0..ad74d9c962 100644 --- a/addons/refuel/functions/fnc_canReturnNozzle.sqf +++ b/addons/refuel/functions/fnc_canReturnNozzle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check if a unit can return a fuel nozzle diff --git a/addons/refuel/functions/fnc_canTakeNozzle.sqf b/addons/refuel/functions/fnc_canTakeNozzle.sqf index 82ca8452bc..a2dc39b815 100644 --- a/addons/refuel/functions/fnc_canTakeNozzle.sqf +++ b/addons/refuel/functions/fnc_canTakeNozzle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check if a unit can take a fuel nozzle @@ -22,7 +22,8 @@ if (isNull _unit || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {!alive _object} || - {!isNull (_unit getVariable [QGVAR(nozzle), objNull])} || + {!isNull (_unit getVariable [QGVAR(nozzle), objNull])} || // Not already carrying a nozzle + {(_object getVariable [QGVAR(jerryCan), false]) && {!isNull (_object getVariable [QGVAR(nozzle), objNull])}} || // Prevent jerry cans from being picked up if they have a nozzle connected {typeOf _object == QGVAR(fuelNozzle) && {!isNull (attachedTo _object)}} || // Not carried by someone else {([_unit, _object] call EFUNC(interaction,getInteractionDistance)) > REFUEL_ACTION_DISTANCE}) exitWith {false}; diff --git a/addons/refuel/functions/fnc_canTurnOff.sqf b/addons/refuel/functions/fnc_canTurnOff.sqf index 624cfde552..2e141fd2db 100644 --- a/addons/refuel/functions/fnc_canTurnOff.sqf +++ b/addons/refuel/functions/fnc_canTurnOff.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Check if a unit can turn off a fuel nozzle diff --git a/addons/refuel/functions/fnc_canTurnOn.sqf b/addons/refuel/functions/fnc_canTurnOn.sqf index 855837d97c..a33861c754 100644 --- a/addons/refuel/functions/fnc_canTurnOn.sqf +++ b/addons/refuel/functions/fnc_canTurnOn.sqf @@ -1,11 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk - * Check if a unit can turn on a fuel nozzle + * Check if a unit can turn on a fuel nozzle. * * Arguments: * 0: Unit * 1: Nozzle + * 2: Refuel container (default: false) * * Return Value: * Can turn on @@ -16,7 +17,7 @@ * Public: No */ -params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; +params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_refuelContainer", false, [false]]]; if (isNull _unit || {isNull _nozzle} || @@ -24,7 +25,18 @@ if (isNull _unit || {!local _unit} || {(_nozzle distance _unit) > REFUEL_ACTION_DISTANCE}) exitWith {false}; +private _source = _nozzle getVariable [QGVAR(source), objNull]; +private _sink = _nozzle getVariable [QGVAR(sink), objNull]; + +if (isNull _source || {isNull _sink}) exitWith {false}; + +private _isSinkFull = if (_refuelContainer) then { + ([_sink] call FUNC(getCapacity)) in [REFUEL_DISABLED_FUEL, REFUEL_INFINITE_FUEL, [_sink] call FUNC(getFuel)] +} else { + fuel _sink == 1 +}; + !(_nozzle getVariable [QGVAR(isRefueling), false]) && - {[_nozzle getVariable QGVAR(source)] call FUNC(getFuel) != 0} && - {!isNull (_nozzle getVariable [QGVAR(sink), objNull])} && - {(fuel (_nozzle getVariable QGVAR(sink))) < 1} + {(([_source] call FUNC(getCapacity)) == REFUEL_INFINITE_FUEL) || {[_source] call FUNC(getFuel) > 0}} && // Make sure the source has fuel + {!_isSinkFull} && // Make sure the sink isn't full + {!(_refuelContainer && {_source == _sink})}; // No endless container ot itself loop diff --git a/addons/refuel/functions/fnc_checkFuel.sqf b/addons/refuel/functions/fnc_checkFuel.sqf index 275ad7999b..9a4bcbab86 100644 --- a/addons/refuel/functions/fnc_checkFuel.sqf +++ b/addons/refuel/functions/fnc_checkFuel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Get the remaining fuel amount @@ -21,7 +21,7 @@ params [["_unit", objNull, [objNull]], ["_source", objNull, [objNull]]]; private _fuel = [_source] call FUNC(getFuel); [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION * 2), + GVAR(progressDuration) * 2, [_unit, _source, _fuel], { params ["_args"]; diff --git a/addons/refuel/functions/fnc_connectNozzleAction.sqf b/addons/refuel/functions/fnc_connectNozzleAction.sqf index f2e38c34a0..a5827325ac 100644 --- a/addons/refuel/functions/fnc_connectNozzleAction.sqf +++ b/addons/refuel/functions/fnc_connectNozzleAction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk et.al. * Calculates a connection for refueling. @@ -65,13 +65,15 @@ _bestPosASL = _bestPosASL vectorAdd ((_bestPosASL vectorFromTo _startingPosASL) private _attachPosModel = _sink worldToModel (ASLtoAGL _bestPosASL); [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION), + GVAR(progressDuration), [_unit, _nozzle, _sink, _attachPosModel], { params ["_args"]; _args params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_sink", objNull, [objNull]], ["_endPosTestOffset", [0,0,0], [[]], 3]]; _unit setVariable [QGVAR(nozzle), nil, true]; _unit setVariable [QGVAR(isRefueling), false]; + + private _source = _nozzle getVariable QGVAR(source); detach _nozzle; _nozzle attachTo [_sink, _endPosTestOffset]; @@ -111,21 +113,34 @@ private _attachPosModel = _sink worldToModel (ASLtoAGL _bestPosASL); _nozzle setVariable [QGVAR(isConnected), true, true]; _sink setVariable [QGVAR(nozzle), _nozzle, true]; - _source = _nozzle getVariable QGVAR(source); - private _fuel = [_source] call FUNC(getFuel); - if (_fuel == REFUEL_INFINITE_FUEL) then { - _source setVariable [QGVAR(fuelCounter), 0, true]; - } else { - _source setVariable [QGVAR(fuelCounter), _fuel, true]; - }; + // Reset fuel counter + _source setVariable [QGVAR(fuelCounter), 0, true]; [_unit, _sink, _nozzle, _endPosTestOffset] call FUNC(refuel); - if ([_unit, _nozzle] call FUNC(canTurnOn)) then { - _unit setVariable [QGVAR(tempFuel), nil]; - [_unit, _nozzle] call FUNC(turnOn); - } else { - [localize LSTRING(CouldNotTurnOn)] call EFUNC(common,displayText); + private _canReceive = getNumber ((configOf _sink) >> QGVAR(canReceive)) == 1; + private _isContainer = ([_sink] call FUNC(getCapacity)) != REFUEL_DISABLED_FUEL; + + // Decide if cargo or vehicle will be refueled + switch (true) do { + case (_canReceive && {!_isContainer || {_sink == _source}}): { + // is not a refueling vehicle or refueling vehicle tries to refuel itself + if ([_unit, _nozzle, false] call FUNC(canTurnOn)) then { + [_unit, _nozzle, false] call FUNC(turnOn); + } else { + [localize LSTRING(CouldNotTurnOn)] call EFUNC(common,displayText); + }; + }; + case (!_canReceive && _isContainer): { + if ([_unit, _nozzle, true] call FUNC(canTurnOn)) then { + [_unit, _nozzle, true] call FUNC(turnOn); + } else { + [localize LSTRING(CouldNotTurnOn)] call EFUNC(common,displayText); + }; + }; + default { + /* Target is a refueling vehicle, let user manually decide if he wants to refuel cargo or vehicle itself */ + }; }; }, "", diff --git a/addons/refuel/functions/fnc_disconnect.sqf b/addons/refuel/functions/fnc_disconnect.sqf index b227b9fcc9..1bc1b2b8e8 100644 --- a/addons/refuel/functions/fnc_disconnect.sqf +++ b/addons/refuel/functions/fnc_disconnect.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk - * Disconnect a fuel nozzle. + * Disconnects a fuel nozzle and makes unit pick it up. * * Arguments: - * 0: Unit + * 0: Unit (default: objNull) * 1: Nozzle * * Return Value: @@ -27,4 +27,6 @@ _nozzle setVariable [QGVAR(sink), nil, true]; _nozzle setVariable [QGVAR(isConnected), false, true]; [objNull, _nozzle, true] call FUNC(dropNozzle); -[_unit, _nozzle] call FUNC(takeNozzle); +if (!isNull _unit) then { + [_unit, _nozzle] call FUNC(takeNozzle); +}; diff --git a/addons/refuel/functions/fnc_dropNozzle.sqf b/addons/refuel/functions/fnc_dropNozzle.sqf index 69b08b9026..5ca375dc29 100644 --- a/addons/refuel/functions/fnc_dropNozzle.sqf +++ b/addons/refuel/functions/fnc_dropNozzle.sqf @@ -1,10 +1,10 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Detaches the fuel nozzle, drops it and removes player variables. * * Arguments: - * 0: Unit (optional) + * 0: Unit (default: objNull) * 1: Nozzle * 2: Disconnect Only * diff --git a/addons/refuel/functions/fnc_getCapacity.sqf b/addons/refuel/functions/fnc_getCapacity.sqf new file mode 100644 index 0000000000..c2956b588e --- /dev/null +++ b/addons/refuel/functions/fnc_getCapacity.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" +/* + * Author: QuantX + * Gets the capacity of a fuel source's tank. + * + * Arguments: + * 0: Fuel Source + * + * Return Value: + * Fuel capacity (-10 means infinte fuel, -1 means not a fuel source, >0 is a capacity in liters) + * + * Example: + * [fuelTruck] call ace_refuel_fnc_getCapacity + * + * Public: Yes + */ + +params [["_source", objNull, [objNull]]]; + +if (isNull _source) exitWith {REFUEL_DISABLED_FUEL}; + +private _capacity = _source getVariable QGVAR(capacity); + +// Initialize fuel truck if needed +if (isNil "_capacity") then { + // Check if this object has a fuelCargo config entry + private _fuelCargo = configOf _source >> QGVAR(fuelCargo); + _capacity = if (isNumber _fuelCargo) then {getNumber _fuelCargo} else {REFUEL_DISABLED_FUEL}; + + // Set capacity even if this isn't a fuel source to save on config lookup time in the event this function is used in a loop + _source setVariable [QGVAR(capacity), _capacity, true]; + [_source, _capacity] call FUNC(setFuel); +}; + +_capacity; diff --git a/addons/refuel/functions/fnc_getFuel.sqf b/addons/refuel/functions/fnc_getFuel.sqf index a51b6df411..6bc82ee2d7 100644 --- a/addons/refuel/functions/fnc_getFuel.sqf +++ b/addons/refuel/functions/fnc_getFuel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Get the remaining fuel amount. @@ -22,8 +22,8 @@ if (isNull _source) exitWith {0}; private _fuel = _source getVariable QGVAR(currentFuelCargo); if (isNil "_fuel") then { - _fuel = getNumber (configOf _source >> QGVAR(fuelCargo)); - _source setVariable [QGVAR(currentFuelCargo), _fuel, true]; + // Calling getCapacity will initialize the fuel source and return the amount of fuel in the tank + _fuel = [_source] call FUNC(getCapacity); }; _fuel diff --git a/addons/refuel/functions/fnc_handleDisconnect.sqf b/addons/refuel/functions/fnc_handleDisconnect.sqf index ebf0d729ea..cf4b37cce9 100644 --- a/addons/refuel/functions/fnc_handleDisconnect.sqf +++ b/addons/refuel/functions/fnc_handleDisconnect.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Cleans up refuel on client disconnect. diff --git a/addons/refuel/functions/fnc_handleRespawn.sqf b/addons/refuel/functions/fnc_handleRespawn.sqf index 893f893724..e82421626c 100644 --- a/addons/refuel/functions/fnc_handleRespawn.sqf +++ b/addons/refuel/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Clean variables on unit respawn. diff --git a/addons/refuel/functions/fnc_initSource.sqf b/addons/refuel/functions/fnc_initSource.sqf index c484c151f4..5d5d6f2ea4 100644 --- a/addons/refuel/functions/fnc_initSource.sqf +++ b/addons/refuel/functions/fnc_initSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Adds refuel menu to object. diff --git a/addons/refuel/functions/fnc_makeJerryCan.sqf b/addons/refuel/functions/fnc_makeJerryCan.sqf index 4c4cd22aa1..d1a662d12f 100644 --- a/addons/refuel/functions/fnc_makeJerryCan.sqf +++ b/addons/refuel/functions/fnc_makeJerryCan.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Makes an object into a jerry can. @@ -22,11 +22,14 @@ if (isNull _target || {_target isKindOf "AllVehicles"} || {_target getVariable [QGVAR(jerryCan), false]}) exitWith {}; -if (isServer) then { - [_target, _fuelAmount] call FUNC(setFuel); // has global effects -}; _target setVariable [QGVAR(jerryCan), true]; _target setVariable [QGVAR(source), _target]; +_target setVariable [QGVAR(capacity), _fuelAmount]; + +if (isServer) then { + [_target, _fuelAmount] call FUNC(setFuel); // has global effects + [QGVAR(jerryCanInitalized), [_target]] call CBA_fnc_globalevent; +}; // Main Action private _action = [QGVAR(Refuel), @@ -64,6 +67,30 @@ _action = [QGVAR(TurnOn), REFUEL_ACTION_DISTANCE] call EFUNC(interact_menu,createAction); [_target, 0, ["ACE_MainActions", QGVAR(Refuel)], _action] call EFUNC(interact_menu,addActionToObject); +// Add turnOn container +_action = [QGVAR(TurnOn_Container), + localize LSTRING(TurnOn_Container), + QPATHTOF(ui\icon_refuel_interact.paa), + {[_player, _target, true] call FUNC(turnOn)}, + {[_player, _target, true] call FUNC(canTurnOn)}, + {}, + [], + [0, 0, 0], + REFUEL_ACTION_DISTANCE] call EFUNC(interact_menu,createAction); +[_target, 0, ["ACE_MainActions", QGVAR(Refuel)], _action] call EFUNC(interact_menu,addActionToObject); + +// Add check fuel +_action = [QGVAR(CheckFuel), + localize LSTRING(CheckFuel), + QPATHTOF(ui\icon_refuel_interact.paa), + {[_player, _target] call FUNC(checkFuel)}, + {[_player, _target] call FUNC(canCheckFuel)}, + {}, + [], + [0,0,0], + REFUEL_ACTION_DISTANCE] call EFUNC(interact_menu,createAction), +[_target, 0, ["ACE_MainActions", QGVAR(Refuel)], _action] call EFUNC(interact_menu,addActionToObject); + // Add turnOff _action = [QGVAR(TurnOff), localize LSTRING(TurnOff), diff --git a/addons/refuel/functions/fnc_makeSource.sqf b/addons/refuel/functions/fnc_makeSource.sqf index 5553e1a906..38b2d8a261 100644 --- a/addons/refuel/functions/fnc_makeSource.sqf +++ b/addons/refuel/functions/fnc_makeSource.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Makes an object into a refuel source. @@ -40,10 +40,14 @@ if ( || {_fuelCargo != 0 && {_fuelCargo == _fuelCargoConfig}} ) exitWith {}; -[_source, _fuelCargo] call FUNC(setFuel); +private _capacity = if (_fuelCargo < 0) then {_fuelCargo} else {_fuelCargoConfig max _fuelCargo}; + +_source setVariable [QGVAR(capacity), _capacity, true]; if (_fuelCargo == REFUEL_DISABLED_FUEL) exitWith {}; +[_source, _fuelCargo] call FUNC(setFuel); + if ( !isNil "_hooks" && {_hooks isEqualTypeAll []} @@ -52,9 +56,11 @@ if ( _source setVariable [QGVAR(hooks), _hooks, true]; }; -// check if menu already exists -if (_fuelCargoConfig != 0 || {!isNil {_source getVariable QGVAR(initSource_jipID)}}) exitWith {}; +// only add if menu doesn't already exist +if (!(_fuelCargoConfig != 0 && {!isNil {_source getVariable QGVAR(initSource_jipID)}})) then { + private _jipID = [QGVAR(initSource), [_source]] call CBA_fnc_globalEventJIP; + [_jipID, _source] call CBA_fnc_removeGlobalEventJIP; + _source setVariable [QGVAR(initSource_jipID), _jipID]; +}; -private _jipID = [QGVAR(initSource), [_source]] call CBA_fnc_globalEventJIP; -[_jipID, _source] call CBA_fnc_removeGlobalEventJIP; -_source setVariable [QGVAR(initSource_jipID), _jipID]; +[QGVAR(sourceInitialized), [_source]] call CBA_fnc_globalEvent; diff --git a/addons/refuel/functions/fnc_moduleRefuelSettings.sqf b/addons/refuel/functions/fnc_moduleRefuelSettings.sqf index fabdad1706..4ab654dd66 100644 --- a/addons/refuel/functions/fnc_moduleRefuelSettings.sqf +++ b/addons/refuel/functions/fnc_moduleRefuelSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Module for adjusting the refuel settings. @@ -23,5 +23,6 @@ if !(_activated) exitWith {}; [_logic, QGVAR(rate), "rate"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(hoseLength), "hoseLength"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(progressDuration), "progressDuration"] call EFUNC(common,readSettingFromModule); -INFO_2("Refuel Module Initialized with flow rate: %1 - hoseLength: %2",GVAR(rate), GVAR(hoseLength)) +INFO_3("Refuel Module Initialized with flow rate: %1 - hoseLength: %2 - progressDuration: %3",GVAR(rate),GVAR(hoseLength),GVAR(progressDuration)) diff --git a/addons/refuel/functions/fnc_onMouseButtonDown.sqf b/addons/refuel/functions/fnc_onMouseButtonDown.sqf index 184ede22eb..b103cedff7 100644 --- a/addons/refuel/functions/fnc_onMouseButtonDown.sqf +++ b/addons/refuel/functions/fnc_onMouseButtonDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Mouse button down event. @@ -42,10 +42,11 @@ private _virtualPosASL = (eyePos _unit) vectorAdd (positionCameraToWorld [0,0,0. if (cameraView == "EXTERNAL") then { _virtualPosASL = _virtualPosASL vectorAdd ((positionCameraToWorld [0.3,0,0]) vectorDiff (positionCameraToWorld [0,0,0])); }; + if ( !isNull _cursorObject && {_distance < REFUEL_NOZZLE_ACTION_DISTANCE} - && {1 == getNumber (configOf _cursorObject >> QGVAR(canReceive))} + && {[_cursorObject] call FUNC(canConnectNozzle)} && {isNull (_cursorObject getVariable [QGVAR(nozzle), objNull])} && {!lineIntersects [eyePos _unit, _virtualPosASL, _unit]} ) then { diff --git a/addons/refuel/functions/fnc_readFuelCounter.sqf b/addons/refuel/functions/fnc_readFuelCounter.sqf index cc851a549f..5ed8e20a62 100644 --- a/addons/refuel/functions/fnc_readFuelCounter.sqf +++ b/addons/refuel/functions/fnc_readFuelCounter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Reads the fuel counter. @@ -18,12 +18,6 @@ params [["_unit", objNull, [objNull]], ["_source", objNull, [objNull]]]; -private _currentFuel = [_source] call FUNC(getFuel); -private _fuelCounter = if (_currentFuel == REFUEL_INFINITE_FUEL) then { - _source getVariable [QGVAR(fuelCounter), 0] -} else { - (_source getVariable [QGVAR(fuelCounter), _currentFuel]) - _currentFuel -}; - -private _fuelCounter = 0.01 * round (100 * _fuelCounter); +private _fuelCounter = _source getVariable [QGVAR(fuelCounter), 0]; +_fuelCounter = 0.01 * round (100 * _fuelCounter); [[LSTRING(Hint_FuelCounter), _fuelCounter], 1.5, _unit] call EFUNC(common,displayTextStructured); diff --git a/addons/refuel/functions/fnc_refuel.sqf b/addons/refuel/functions/fnc_refuel.sqf index 92a654e295..1cf7b4377a 100644 --- a/addons/refuel/functions/fnc_refuel.sqf +++ b/addons/refuel/functions/fnc_refuel.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: GitHawk + * Author: GitHawk, QuantX * Refuels the vehicle. * * Arguments: @@ -21,93 +21,111 @@ params [["_unit", objNull, [objNull]], ["_sink", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_connectToPoint", [0,0,0], [[]], 3]]; private _config = configOf _sink; +private _rate = if (isNumber (_config >> QGVAR(flowRate))) then { + getNumber (_config >> QGVAR(flowRate)) * GVAR(rate) +} else { + // Jerry cans for example have no flow rate defined, default to 1 + GVAR(rate) +}; -private _rate = getNumber (_config >> QGVAR(flowRate)) * GVAR(rate); -private _maxFuel = getNumber (_config >> QGVAR(fuelCapacity)); - +// How much fuel is in a vehicle's fuel tank +private _maxFuelTank = getNumber (_config >> QGVAR(fuelCapacity)); // Fall back to vanilla fuelCapacity value (only air and sea vehicles don't have this defined by default by us) // Air and sea vehicles have that value properly defined in liters, unlike ground vehicles which is is formula of (range * tested factor) - different fuel consumption system than ground vehicles -if (_maxFuel == 0) then { - _maxFuel = getNumber (_config >> "fuelCapacity"); +if (_maxFuelTank == 0) then { + _maxFuelTank = getNumber (_config >> "fuelCapacity"); }; [{ params ["_args", "_pfID"]; - _args params [["_source", objNull, [objNull]], ["_sink", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_rate", 1, [0]], ["_startFuel", 0, [0]], ["_maxFuel", 0, [0]], ["_connectFromPoint", [0,0,0], [[]], 3], ["_connectToPoint", [0,0,0], [[]], 3]]; + _args params [["_source", objNull, [objNull]], ["_sink", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_rate", 1, [0]], ["_maxFuelTank", 1, [0]], ["_connectFromPoint", [0,0,0], [[]], 3], ["_connectToPoint", [0,0,0], [[]], 3]]; if !(_nozzle getVariable [QGVAR(isConnected), false]) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; }; + // Quit if target or fuel tank got destroyed if (!alive _source || {!alive _sink}) exitWith { - [objNull, _nozzle] call FUNC(dropNozzle); - _nozzle setVariable [QGVAR(isConnected), false, true]; - if (_nozzle isKindOf "Land_CanisterFuel_F") then { _nozzle setVariable [QEGVAR(cargo,canLoad), true, true]; }; - _nozzle setVariable [QGVAR(sink), nil, true]; - _sink setVariable [QGVAR(nozzle), nil, true]; + [objNull, _nozzle] call FUNC(disconnect); [_pfID] call CBA_fnc_removePerFrameHandler; }; + + // Quit if hose distance was exceeded private _hoseLength = _source getVariable [QGVAR(hoseLength), GVAR(hoseLength)]; private _tooFar = ((_sink modelToWorld _connectToPoint) distance (_source modelToWorld _connectFromPoint)) > (_hoseLength - 2); if (_tooFar && {!(_nozzle getVariable [QGVAR(jerryCan), false])}) exitWith { [LSTRING(Hint_TooFar), 2, _unit] call EFUNC(common,displayTextStructured); - - [objNull, _nozzle] call FUNC(dropNozzle); - _nozzle setVariable [QGVAR(isConnected), false, true]; - if (_nozzle isKindOf "Land_CanisterFuel_F") then { _nozzle setVariable [QEGVAR(cargo,canLoad), true, true]; }; - _nozzle setVariable [QGVAR(sink), nil, true]; - _sink setVariable [QGVAR(nozzle), nil, true]; + [objNull, _nozzle] call FUNC(disconnect); [_pfID] call CBA_fnc_removePerFrameHandler; }; + // Main fueling process private _finished = false; private _fueling = _nozzle getVariable [QGVAR(isRefueling), false]; if (_fueling) then { - private _fuelInSource = [_source] call FUNC(getFuel); - if (_fuelInSource == 0) exitWith { - [LSTRING(Hint_SourceEmpty), 2, _unit] call EFUNC(common,displayTextStructured); - _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; - _nozzle setVariable [QGVAR(isRefueling), false, true]; - }; - + private _refuelContainer = _nozzle getVariable [QGVAR(refuelContainer), false]; + + // Use special cargo refuel rate when refueling containers + // TODO: Add flow dedicated input/output flow rates for every container and use the lower of the two instead + if (_refuelContainer) then {_rate = GVAR(cargoRate)}; + // Calculate rate using mission time to take time acceleration and pause into account - private _rateTime = _rate * (CBA_missionTime - (_nozzle getVariable [QGVAR(lastTickMissionTime), CBA_missionTime])); + private _addedFuel = _rate * (CBA_missionTime - (_nozzle getVariable [QGVAR(lastTickMissionTime), CBA_missionTime])); _nozzle setVariable [QGVAR(lastTickMissionTime), CBA_missionTime]; - if (_fuelInSource != REFUEL_INFINITE_FUEL) then { - if (_rateTime > _fuelInSource) then { - _rateTime = _fuelInSource; + // Figure out exactly how much fuel to transfer while being sure not to take too much from source + private _fuelInSource = [_source] call FUNC(getFuel); + if (([_source] call FUNC(getCapacity)) != REFUEL_INFINITE_FUEL) then { + if (_addedFuel > _fuelInSource) then { + _addedFuel = _fuelInSource; _fuelInSource = 0; + _finished = true; + [LSTRING(Hint_SourceEmpty), 2, _unit] call EFUNC(common,displayTextStructured); } else { - _fuelInSource = _fuelInSource - _rateTime; + _fuelInSource = _fuelInSource - _addedFuel; }; + }; + + private _fuelInSink = (if (_refuelContainer) then { + [_sink] call FUNC(getFuel) } else { - _source setVariable [QGVAR(fuelCounter), (_source getVariable [QGVAR(fuelCounter), 0]) + _rateTime, true]; - }; - if (_fuelInSource <= 0 && {_fuelInSource != REFUEL_INFINITE_FUEL}) then { - _fuelInSource = 0; - [_source, _fuelInSource] call FUNC(setFuel); - _finished = true; - [LSTRING(Hint_SourceEmpty), 2, _unit] call EFUNC(common,displayTextStructured); - }; - - private _fuelInSink = (_unit getVariable [QGVAR(tempFuel), _startFuel]) + ( _rateTime / _maxFuel); - if (_fuelInSink > 1) then { - _fuelInSink = 1; + // How full the gas tank is. We keep our own record, since `fuel _sink` doesn't update quick enough + (_nozzle getVariable [QGVAR(tempFuel), fuel _sink]) * _maxFuelTank + }) + _addedFuel; + + // Add fuel to target while being sure not to put too much into sink + private _maxFuelContainer = [_sink] call FUNC(getCapacity); + private _maxFuel = [_maxFuelTank, _maxFuelContainer] select _refuelContainer; + if (_fuelInSink >= _maxFuel) then { + // Put any extra fuel back + _fuelInSource = _fuelInSource + (_fuelInSink - _maxFuel); + _addedFuel = _maxFuel - _fuelInSink; + // We're done + _fuelInSink = _maxFuel; _finished = true; [LSTRING(Hint_Completed), 2, _unit] call EFUNC(common,displayTextStructured); }; - _unit setVariable [QGVAR(tempFuel), _fuelInSink]; + + if (_refuelContainer) then { + [_sink, _fuelInSink] call FUNC(setFuel); + } else { + private _fillRatio = _fuelInSink / _maxFuelTank; + [QEGVAR(common,setFuel), [_sink, _fillRatio], _sink] call CBA_fnc_targetEvent; + _nozzle setVariable [QGVAR(tempFuel), _fillRatio]; + }; + + // Increment fuel counter + _source setVariable [QGVAR(fuelCounter), (_source getVariable [QGVAR(fuelCounter), 0]) + _addedFuel, true]; - [QGVAR(tick), [_source, _sink, _rateTime]] call CBA_fnc_localEvent; + [QGVAR(tick), [_source, _sink, _addedFuel, _refuelContainer]] call CBA_fnc_localEvent; - [QEGVAR(common,setFuel), [_sink, _fuelInSink], _sink] call CBA_fnc_targetEvent; [_source, _fuelInSource] call FUNC(setFuel); } else { - _unit setVariable [QGVAR(tempFuel), fuel _sink]; + _nozzle setVariable [QGVAR(tempFuel), fuel _sink]; }; - if (_finished) exitWith { + // Reset variables when done + if (_finished) then { [QGVAR(stopped), [_source, _sink]] call CBA_fnc_localEvent; _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; @@ -118,8 +136,7 @@ if (_maxFuel == 0) then { _unit, _nozzle, _rate, - fuel _sink, - _maxFuel, + _maxFuelTank, _nozzle getVariable [QGVAR(attachPos), [0,0,0]], _connectToPoint ]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/refuel/functions/fnc_returnNozzle.sqf b/addons/refuel/functions/fnc_returnNozzle.sqf index 3cc2f773f0..ea84f6a518 100644 --- a/addons/refuel/functions/fnc_returnNozzle.sqf +++ b/addons/refuel/functions/fnc_returnNozzle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk, Jonpas * Returns the nozzle back to source vehicle. @@ -23,7 +23,7 @@ private _nozzle = _unit getVariable [QGVAR(nozzle), objNull]; if (isNull _nozzle || {_source != _nozzle getVariable QGVAR(source)}) exitWith {}; [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION), + GVAR(progressDuration), [_unit, _nozzle, _source], { params ["_args"]; @@ -43,6 +43,10 @@ if (isNull _nozzle || {_source != _nozzle getVariable QGVAR(source)}) exitWith { deleteVehicle _helper; }; deleteVehicle _nozzle; + + // Restore ability to drag and carry this object + _source setVariable [QEGVAR(dragging,canCarry), _source getVariable [QGVAR(canCarryLast), false], true]; + _source setVariable [QEGVAR(dragging,canDrag), _source getVariable [QGVAR(canDragLast), false], true]; [_source, "blockEngine", "ACE_Refuel", false] call EFUNC(common,statusEffect_set); }, diff --git a/addons/refuel/functions/fnc_setFuel.sqf b/addons/refuel/functions/fnc_setFuel.sqf index f95596f4f1..b458dba80f 100644 --- a/addons/refuel/functions/fnc_setFuel.sqf +++ b/addons/refuel/functions/fnc_setFuel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Set the remaining fuel amount. @@ -18,7 +18,12 @@ params [["_source", objNull, [objNull]], ["_fuel", nil, [0]]]; -if (isNull _source || - {isNil "_fuel"}) exitWith {}; +// Ensure valid fuel quantity +if (isNull _source || {isNil "_fuel"}) exitWith {}; -_source setVariable [QGVAR(currentFuelCargo), _fuel, true]; +// Make sure this is actually a finite fuel source +private _capacity = [_source] call FUNC(getCapacity); +if (_capacity in [REFUEL_INFINITE_FUEL, REFUEL_DISABLED_FUEL]) exitWith {}; + +// Don't overfill or underfill tank +_source setVariable [QGVAR(currentFuelCargo), (_fuel min _capacity) max 0, true]; diff --git a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf index 7922a9cb91..29db88dda6 100644 --- a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf +++ b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * PFH while nozzle is in hands. @@ -95,10 +95,7 @@ TRACE_2("start",_unit,_nozzle); getCursorObjectParams params ["_cursorObject", "", "_distance"]; if (!isNull _cursorObject && {_distance < REFUEL_NOZZLE_ACTION_DISTANCE}) then { - if ( - 1 == getNumber (configOf _cursorObject >> QGVAR(canReceive)) - && {isNull (_cursorObject getVariable [QGVAR(nozzle), objNull])} - ) then { + if ([_cursorObject] call FUNC(canConnectNozzle)) then { _hintLMB = localize LSTRING(Connect); }; if ([_unit, _cursorObject] call FUNC(canReturnNozzle)) then { diff --git a/addons/refuel/functions/fnc_takeNozzle.sqf b/addons/refuel/functions/fnc_takeNozzle.sqf index 7ce0a9d808..f60ec9243d 100644 --- a/addons/refuel/functions/fnc_takeNozzle.sqf +++ b/addons/refuel/functions/fnc_takeNozzle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Take a fuel nozzle either from a fuel truck/station or from the ground. @@ -22,7 +22,7 @@ params [ ]; [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION), + GVAR(progressDuration), [_unit, _object], { params ["_args"]; @@ -69,7 +69,7 @@ params [ _attachPos = _attachPos select (_hookDistances find selectMin _hookDistances); }; private _hoseLength = _source getVariable [QGVAR(hoseLength), GVAR(hoseLength)]; - private _rope = ropeCreate [_ropeTarget, _attachPos, _nozzle, [0, -0.20, 0.12], _hoseLength]; + private _rope = ropeCreate [_ropeTarget, _attachPos, _nozzle, [0, -0.20, 0.12], _hoseLength, [], [], QGVAR(fuelHose)]; _nozzle setVariable [QGVAR(rope), _rope, true]; _nozzle setVariable [QGVAR(attachPos), _attachPos, true]; _nozzle setVariable [QGVAR(source), _source, true]; @@ -77,6 +77,13 @@ params [ [_source, "blockEngine", "ACE_Refuel", true] call EFUNC(common,statusEffect_set); _source setVariable [QGVAR(isConnected), true, true]; _source setVariable [QGVAR(ownedNozzle), _nozzle, true]; + + // Prevent moving the fuel source while the hose is out + _source setVariable [QGVAR(canCarryLast), _source getVariable [QEGVAR(dragging,canCarry), false], true]; + _source setVariable [QGVAR(canDragLast), _source getVariable [QEGVAR(dragging,canDrag), false], true]; + + _source setVariable [QEGVAR(dragging,canCarry), false, true]; + _source setVariable [QEGVAR(dragging,canDrag), false, true]; }; _unit setVariable [QGVAR(nozzle), _nozzle, true]; diff --git a/addons/refuel/functions/fnc_turnOff.sqf b/addons/refuel/functions/fnc_turnOff.sqf index 6b5f17a95d..8d2a5b83df 100644 --- a/addons/refuel/functions/fnc_turnOff.sqf +++ b/addons/refuel/functions/fnc_turnOff.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Turn off a fuel nozzle. diff --git a/addons/refuel/functions/fnc_turnOn.sqf b/addons/refuel/functions/fnc_turnOn.sqf index b96cc6cda4..6fc88c85ad 100644 --- a/addons/refuel/functions/fnc_turnOn.sqf +++ b/addons/refuel/functions/fnc_turnOn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: GitHawk * Turn on a fuel nozzle. @@ -6,6 +6,7 @@ * Arguments: * 0: Unit * 1: Nozzle + * 2: Refuel container (default: false) * * Return Value: * None @@ -16,9 +17,10 @@ * Public: No */ -params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; +params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_refuelContainer", false, [false]]]; _nozzle setVariable [QGVAR(lastTickMissionTime), CBA_missionTime]; +_nozzle setVariable [QGVAR(refuelContainer), _refuelContainer]; _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/functions/script_component.hpp b/addons/refuel/functions/script_component.hpp deleted file mode 100644 index 167c1e614a..0000000000 --- a/addons/refuel/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\refuel\script_component.hpp" diff --git a/addons/refuel/initSettings.sqf b/addons/refuel/initSettings.sqf index deb6c2adee..087e253dc4 100644 --- a/addons/refuel/initSettings.sqf +++ b/addons/refuel/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_refuel]: - [ QGVAR(rate), "SLIDER", [LSTRING(RefuelSettings_speed_DisplayName), LSTRING(RefuelSettings_speed_Description)], @@ -9,6 +7,15 @@ {[QGVAR(rate), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; +[ + QGVAR(cargoRate), "SLIDER", + [LSTRING(RefuelSettings_speedCargo_DisplayName), LSTRING(RefuelSettings_speedCargo_Description)], + [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_refuel"], + [0,250,10,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(cargoRate), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; + [ QGVAR(hoseLength), "SLIDER", [LSTRING(RefuelSettings_hoseLength_DisplayName)], @@ -17,3 +24,12 @@ true, // isGlobal {[QGVAR(hoseLength), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; + +[ + QGVAR(progressDuration), "TIME", + [LSTRING(RefuelSettings_progressDuration_DisplayName), LSTRING(RefuelSettings_progressDuration_Description)], + [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_refuel"], + [0, 10, 2], // [min, max, default value] + true, // isGlobal + {[QGVAR(progressDuration), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; diff --git a/addons/refuel/script_component.hpp b/addons/refuel/script_component.hpp index be346e0cca..76d9b67819 100644 --- a/addons/refuel/script_component.hpp +++ b/addons/refuel/script_component.hpp @@ -2,7 +2,6 @@ #define COMPONENT_BEAUTIFIED Refuel #include "\z\ace\addons\main\script_mod.hpp" -// #define FAST_PROGRESSBARS // #define DRAW_HOOKS_POS // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE @@ -18,17 +17,7 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define REFUEL_INFINITE_FUEL -10 -#define REFUEL_DISABLED_FUEL -1 -#define REFUEL_ACTION_DISTANCE 7 -#define REFUEL_NOZZLE_ACTION_DISTANCE 2 -#define REFUEL_PROGRESS_DURATION 2 - -#ifdef FAST_PROGRESSBARS - #define TIME_PROGRESSBAR(X) ((X) * 0.075) -#else - #define TIME_PROGRESSBAR(X) (X) -#endif +#include "\z\ace\addons\refuel\defines.hpp" #define INTERACT_EXCEPTIONS_REFUELING "isNotInside", "isNotOnLadder", "isNotSwimming" #define INTERACT_EXCEPTIONS INTERACT_EXCEPTIONS_REFUELING, "isNotRefueling" diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml index 01459451d2..0bc7a09ca1 100644 --- a/addons/refuel/stringtable.xml +++ b/addons/refuel/stringtable.xml @@ -45,10 +45,26 @@ Définit la vitesse de ravitaillement en carburant des véhicules. どのくらいの速さで車両へ給油しますか? 차량이 얼마나 빨리 재급유될 수 있습니까? - 载具多快会加油完毕? + 载具多快会加油完毕? 載具多快會加油完畢? Bir araca ne kadar hızlı yakıt ikmali yapılmalıdır? + + Cargo Flow Rate + 화물 주유량 + Caudal de llenado de la carga + 貨物流量 + Prędkość Tankowania Ładunku + Frachtflussrate + + + How fast should a fuel source's tank be filled? + 연료 공급처의 저장 탱크를 얼마나 빨리 채웁니까? + Cómo de rápido puede llenarse una fuente de combustible. + どのくらいの速さで給油源へ給油しますか? + Jak szybko zbiornik paliwa powinien być napełniany? + Wie schnell sollte der Tank einer Kraftstoffquelle gefüllt werden? + Refuel Betankung @@ -77,7 +93,7 @@ Prendre le pistolet 給油ノズルを取る 주유기 획득 - 拿取燃料喷嘴 + 拿取加油枪 拿取燃料噴嘴 Yakıt Pompasını Al @@ -92,8 +108,8 @@ Tomando surtidor... Prise du pistolet... 給油ノズルを取っています・・・ - 주유기 획득중... - 正在拿取燃料喷嘴... + 주유기 획득 중... + 正在拿取加油枪... 拿取燃料噴嘴中... Yakıt Pompası Alınıyor... @@ -109,7 +125,7 @@ Introduire le pistolet 給油ノズルを接続する 주유기 꼽기 - 连接燃料喷嘴 + 连接加油枪 連接燃料噴嘴 Yakıt Pompasını Bağla @@ -124,8 +140,8 @@ Conectando surtidor... Introduction du pistolet... 給油ノズルを接続しています・・・ - 주유기 꼽는중... - 正在连结燃料喷嘴... + 주유기 꼽는 중... + 正在连接加油枪... 連結燃料噴嘴中... Yakıt Pompası Bağlanıyor... @@ -141,7 +157,7 @@ Retirer le pistolet 給油ノズルを外す 주유기 뽑기 - 断开燃料喷嘴 + 断开加油枪 斷開燃料噴嘴 Yakıt Pompası Çıkar @@ -157,7 +173,7 @@ Raccorder 接続 꼽기 - 连结 + 连接 連結 Bağlan @@ -205,7 +221,7 @@ Il reste %1 litres. 後 %1 リットル残っています。 %1 리터 남음 - 剩下%1公升的燃料。 + 剩下%1升的燃料。 剩下%1公升的燃料。 %1 litre kaldı. @@ -289,13 +305,21 @@ 開始加油 Yakıt Doldurmayı Başlat + + Start fueling (container) + Betankung beginnen (Container) + 연료 재급유 시작 (컨테이너) + Iniciando repostado (contenedor) + 給油を始める (コンテナ) + Rozpocznij tankowanie (zbiornik) + Couldn't turn on fuel nozzle Kann Zapfpistole nicht anschalten Impossibile iniziare il rifornimento 給油を始められませんでした 無法開啟燃料噴嘴 - 无法开启燃料喷嘴 + 无法开启加油枪 주유기를 켤 수 없습니다. Nie można włączyć dyszy paliwowej Не удалось включить топливный пистолет @@ -317,7 +341,7 @@ %1 litres pompés. %1 リッターを給油しました %1 리터 재급유됨 - 已加入%1公升的燃料 + 已加入%1升的燃料 已加入%1公升的燃料 %1 Litre Dolduruldu @@ -332,7 +356,7 @@ La fuente de combustible está vacía. La source de carburant est vide. 給油元は空です。 - 燃料来源已空. + 燃料来源已空。 燃料來源已空. 연료공급처가 비었음. Yakıt tankı boş. @@ -413,7 +437,7 @@ Ranger le pistolet 給油ノズルを戻す 주유기 반환 - 放回燃料喷嘴 + 放回加油枪 放回燃料噴嘴 Yakıt Pompasını Geri Koy @@ -428,8 +452,8 @@ Devolviendo el surtidor... Rangement du pistolet... 給油ノズルを戻しています・・・ - 주유기 반환중 - 正在放回燃料喷嘴... + 주유기 반환 중 + 正在放回加油枪... 放回燃料噴嘴中... Yakıt Pompası Geri Koyuluyor @@ -444,7 +468,7 @@ Verificar el contador de combustible Vérifier le compteur 燃料計を見る - 연로카운터 확인 + 연료카운터 확인 检查燃料表 檢查燃料表 Yakıt tankını kontrol et @@ -461,7 +485,7 @@ %1 litres ont été pompés. %1 リッターが給油されました。 %1 리터가 재급유되었습니다. - 已加入%1公升 + 已加入%1升 已加入%1公升 %1 litre dolduruldu @@ -479,7 +503,27 @@ Comprimento da Mangueira de Combustível Longueur du tuyau Délka hadice na palivo - Yakıt poması uzunluğu + Yakıt hortumu uzunluğu + + + Pump/Hose Interaction Time + Pompa/Hortum Etkileşim Süresi + 펌프/호스 상호작용 시간 + Время взаимодействия со шлангом + Tiempo de interacción con la Bomba/Manguera + ポンプとホースのインタラクション時間 + Czas Interakcji z Pompą/Wężem + Interaktionszeit zwischen Pumpe und Schlauch + + + How long refuel interactions take in seconds. + Saniye biriminde yakıt ikmali etkileşimlerinin süresi. + 연료 재보급 상호작용에 걸리는 시간(초)입니다. + Время в секундах, которое занимает взаимодействие со шлангом. + Cuanto tiempo en segundos tardan las interacciones de repostado. + 燃料補給にかかる時間 (秒) + Jak długo powinna trwać interakcja tankowania w sekundach. + Wie lange Auftank-Interaktionen in Sekunden dauern. Fuel Cargo Volume @@ -505,8 +549,8 @@ 給油用の貯油量を設定できます (-1で無効、-10で無限) La capacità del carburante disponibile per il rifornimento (-1 disabilita, -10 se infinito) 設定有多少油料可供載具進行加油(-1時關閉,-10為無限油量) - 设定有多少油料可供载具进行加油(-1时关闭,-10为无限油量) - 재급유에 사용 할 수 있는 연료량 (-1=비활성, -10=무한) + 设定有多少油料可供载具进行加油(-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). diff --git a/addons/reload/ACE_UI.hpp b/addons/reload/ACE_UI.hpp index cfc2a26f9c..6dae3e5147 100644 --- a/addons/reload/ACE_UI.hpp +++ b/addons/reload/ACE_UI.hpp @@ -1,7 +1,7 @@ class ACE_UI { class ammoCount { class conditions { - ADDON = "cameraOn == (getConnectedUAV ACE_player)"; + ADDON = "false"; }; }; }; diff --git a/addons/reload/CfgEventHandlers.hpp b/addons/reload/CfgEventHandlers.hpp index 13d082c8bf..f76ea983d1 100644 --- a/addons/reload/CfgEventHandlers.hpp +++ b/addons/reload/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); diff --git a/addons/reload/CfgMagazines.hpp b/addons/reload/CfgMagazines.hpp index 965bc3c225..e7a7d8e041 100644 --- a/addons/reload/CfgMagazines.hpp +++ b/addons/reload/CfgMagazines.hpp @@ -12,6 +12,9 @@ class CfgMagazines { class 150Rnd_93x64_Mag: CA_Magazine { // Mag for HK121 (MMG_01) [DLC Opfor Heavy Gunner] ACE_isBelt = 1; }; + class 10Rnd_93x64_DMR_05_Mag: 150Rnd_93x64_Mag { // Mag for Cyrus (DMR_05) [DLC Opfor Sharpshooter] + ACE_isBelt = 0; + }; class 130Rnd_338_Mag: CA_Magazine { // Mag for LWMMG (MMG_02) [DLC Blufor Heavy Gunner] ACE_isBelt = 1; }; diff --git a/addons/reload/CfgVehicles.hpp b/addons/reload/CfgVehicles.hpp index f6723510e0..ff0df195d3 100644 --- a/addons/reload/CfgVehicles.hpp +++ b/addons/reload/CfgVehicles.hpp @@ -14,16 +14,16 @@ class CfgVehicles { class ACE_Actions { class ACE_Weapon { - class GVAR(LinkBelt) { - displayName = CSTRING(LinkBelt); - distance = 2.0; + class GVAR(linkBelt) { + displayName = CSTRING(linkBelt); + distance = 2; condition = QUOTE(([ARR_2(_player, _target)] call FUNC(getAmmoToLinkBelt)) > 0); statement = QUOTE([ARR_2(_player, _target)] call FUNC(startLinkingBelt)); exceptions[] = {"isNotInside"}; }; - class GVAR(CheckAmmo) { + class GVAR(checkAmmo) { displayName = CSTRING(checkAmmo); - distance = 2.0; + distance = 2; condition = QUOTE(call FUNC(canCheckAmmo)); statement = QUOTE(call FUNC(checkAmmo)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; @@ -36,9 +36,9 @@ class CfgVehicles { class StaticWeapon: LandVehicle { class ACE_Actions { class ACE_MainActions { - class GVAR(CheckAmmo) { + class GVAR(checkAmmo) { displayName = CSTRING(checkAmmo); - distance = 2.0; + distance = 2; 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 20fc53724e..578bc2ce9f 100644 --- a/addons/reload/XEH_PREP.hpp +++ b/addons/reload/XEH_PREP.hpp @@ -1,4 +1,3 @@ - PREP(canCheckAmmo); PREP(canCheckAmmoSelf); PREP(getAmmoToLinkBelt); diff --git a/addons/reload/XEH_postInit.sqf b/addons/reload/XEH_postInit.sqf index 26f7f303ff..65ce1d0b4b 100644 --- a/addons/reload/XEH_postInit.sqf +++ b/addons/reload/XEH_postInit.sqf @@ -1,63 +1,55 @@ // by esteldunedain #include "script_component.hpp" -if (!hasInterface) exitWith {}; - -// Add keybinds -["ACE3 Weapons", QGVAR(checkAmmo), localize LSTRING(checkAmmo), { - // Conditions: canInteract - if !([ACE_player, vehicle ACE_player, ["isNotInside", "isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - 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, ACE_player] call FUNC(checkAmmo); - true -}, {false}, [19, [false, true, false]], false] call CBA_fnc_addKeybind; - +// To propagate the setAmmo change, do it on all clients +// See https://github.com/acemod/ACE3/issues/1119 and https://feedback.bistudio.com/T167015 [QGVAR(syncAmmo), { - //To propagate the setAmmo change, do it on all clients params ["_unit", "_weapon", "_ammo"]; TRACE_3("syncAmmo EH",_unit,_weapon,_ammo); - _unit setAmmo [_weapon, _ammo]; }] call CBA_fnc_addEventHandler; // Listen for attempts to link ammo [QGVAR(ammoLinked), { - params ["_receiver", "_giver", "_magazine"]; - - private _magazineType = currentMagazine _receiver; - private _magazineCfg = configFile >> "CfgMagazines" >> _magazineType; + params ["_target", "_unit", "_magazineInfo"]; + _magazineInfo params ["_magazine", "_ammo"]; // Return the magazine if it's the wrong type - if (_magazineType != (_magazine select 0)) exitWith { - [QGVAR(ammoReturned), [_giver,_receiver,_magazine], [_giver]] call CBA_fnc_targetEvent; + if (currentMagazine _target != _magazine) exitWith { + [QGVAR(ammoReturned), [_unit, _target, _magazineInfo, false], _unit] call CBA_fnc_targetEvent; }; - private _ammoCount = _receiver ammo currentWeapon _receiver; - private _ammoMissing = getNumber (_magazineCfg >> "count") - _ammoCount; + private _currentWeapon = currentWeapon _target; + private _currentAmmo = _target ammo _currentWeapon; + private _magazineCfg = configFile >> "CfgMagazines" >> _magazine; + private _ammoMissing = getNumber (_magazineCfg >> "count") - _currentAmmo; // Return the magazine if the belt is full or empty - if ((_ammoCount == 0) || _ammoMissing == 0) exitWith { - [QGVAR(ammoReturned), [_giver,_receiver,_magazine], [_giver]] call CBA_fnc_targetEvent; + if (_currentAmmo == 0 || {_ammoMissing == 0}) exitWith { + [QGVAR(ammoReturned), [_unit, _target, _magazineInfo, false], _unit] call CBA_fnc_targetEvent; }; // Add the ammo - private _ammoAdded = _ammoMissing min (_magazine select 1); - [QGVAR(syncAmmo), [_receiver, currentWeapon _receiver, _ammoCount + _ammoAdded]] call CBA_fnc_globalEvent; + private _ammoAdded = _ammoMissing min _ammo; + [QGVAR(syncAmmo), [_target, _currentWeapon, _currentAmmo + _ammoAdded]] call CBA_fnc_globalEvent; - if ((_magazine select 1) - _ammoAdded > 0) then { - [QGVAR(ammoReturned), [_giver, _receiver, [_magazineType, (_magazine select 1) - _ammoAdded]], [_giver]] call CBA_fnc_targetEvent; + // Return left over ammo to reloading unit + if (_ammo - _ammoAdded > 0) then { + [QGVAR(ammoReturned), [_unit, _target, [_magazine, _ammo - _ammoAdded], true], _unit] call CBA_fnc_targetEvent; }; }] call CBA_fnc_addEventHandler; // Listen for returned magazines [QGVAR(ammoReturned), { - params ["_receiver", "", "_magazine"]; - TRACE_2("ammoReturned EH",_receiver,_magazine); + params ["_unit", "_target", "_magazineInfo", "_success"]; + TRACE_3("ammoReturned EH",_unit,_target,_magazineInfo); - _receiver addMagazine _magazine; + // If inventory is full, magazine will be dropped on the ground + [_unit, _magazineInfo select 0, _magazineInfo select 1, true] call CBA_fnc_addMagazine; + + [[LSTRING(BeltNotLinked), LSTRING(BeltLinked)] select _success] call EFUNC(common,displayTextStructured); }] call CBA_fnc_addEventHandler; + +if (!hasInterface) exitWith {}; + +#include "initKeybinds.sqf" diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf index 9632d0b4b1..96b9f88d50 100644 --- a/addons/reload/functions/fnc_canCheckAmmo.sqf +++ b/addons/reload/functions/fnc_canCheckAmmo.sqf @@ -1,13 +1,13 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: CAA-Picard - * Check if the player can check the ammo of the target. + * Author: CAA-Picard, johnb43 + * Check if a unit can check the ammo of the target. * * Arguments: - * 0: Target + * 0: Unit equipped with the weapon * * Return Value: - * Can link belt + * Can check ammo * * Example: * [cursorObject] call ace_reload_fnc_canCheckAmmo @@ -17,26 +17,18 @@ params ["_target"]; -// Return true for static weapons if they have been fired once, @todo 1.40 this work-around doesn't work anymore +// Static weapons if (_target isKindOf "StaticWeapon") exitWith { - if (currentMagazine _target != "") exitWith {true}; - - // no check ammo action on destroyed static weapons + // No check ammo action on destroyed static weapons if (!alive _target) exitWith {false}; - private _found = false; + if (currentMagazine _target != "") exitWith {true}; - { - if (_x select 2) exitWith { - _found = true; - }; - false - } count magazinesAmmoFull _target; - - _found + // Check for loaded magazines + (magazinesAmmoFull _target) findIf {_x select 2} != -1 }; -// Return false for all other vehicles +// All other vehicles if !(_target isKindOf "CAManBase") exitWith {false}; // For men diff --git a/addons/reload/functions/fnc_canCheckAmmoSelf.sqf b/addons/reload/functions/fnc_canCheckAmmoSelf.sqf index 2c8c03dcce..b554833fb0 100644 --- a/addons/reload/functions/fnc_canCheckAmmoSelf.sqf +++ b/addons/reload/functions/fnc_canCheckAmmoSelf.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Check if the player can check his own ammo. @@ -7,10 +7,10 @@ * 0: Player * * Return Value: - * Can check ammo + * Can check ammo for self * * Example: - * [cursorObject] call ace_reload_fnc_canCheckAmmoSelf + * [player] call ace_reload_fnc_canCheckAmmoSelf * * Public: No */ diff --git a/addons/reload/functions/fnc_checkAmmo.sqf b/addons/reload/functions/fnc_checkAmmo.sqf index 995e72dc3f..f558d91769 100644 --- a/addons/reload/functions/fnc_checkAmmo.sqf +++ b/addons/reload/functions/fnc_checkAmmo.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 and esteldunedain - * Count the ammo of the currently loaded magazine or count rifle grenades. Play animation and display message. + * Author: commy2, esteldunedain + * Play animation and display message. * * Arguments: - * 0: Target. - * 1: Player + * 0: Unit equipped with the weapon + * 1: Unit wanting to check the ammo * * Return Value: * None @@ -16,13 +16,14 @@ * Public: No */ -params ["_target", "_player"]; +params ["_target", "_unit"]; -if (_player == _target) then { +if (_unit == _target) then { if ((vehicle _target) isKindOf "StaticWeapon") then { _target = vehicle _target; }; - [_player, "Gear", 1] call EFUNC(common,doGesture); + + [_unit, "Gear", 1] call EFUNC(common,doGesture); }; -[FUNC(displayAmmo), [_target], 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 329c385935..68e176587a 100644 --- a/addons/reload/functions/fnc_displayAmmo.sqf +++ b/addons/reload/functions/fnc_displayAmmo.sqf @@ -1,16 +1,16 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 and esteldunedain + * Author: commy2, esteldunedain * Display the ammo of the currently loaded magazine of the target or count rifle grenades. * * Arguments: - * 0: Target + * 0: Unit equipped with the weapon * * Return Value: * None * * Example: - * player call ace_reload_fnc_displayAmmo + * [player] call ace_reload_fnc_displayAmmo * * Public: No */ @@ -21,59 +21,58 @@ params ["_target"]; private _isStaticWeapon = _target isKindOf "StaticWeapon"; -if (_isStaticWeapon) then { - [currentWeapon _target, currentMuzzle _target, "", currentMagazine _target] -} else { - weaponState _target -} params ["_weapon", "_muzzle", "", "_magazine"]; +// currentWeapon, currentMagazine and weaponState return "" for static weapons before they have been entered once +(if (_isStaticWeapon) then { + private _weapon = currentWeapon _target; -// currentWeapon returns "" for static weapons before they are shot once -if (_isStaticWeapon) then { if (_weapon == "") then { - if (count (weapons _target) == 1) then { - _weapon = (weapons _target) select 0; - _muzzle = _weapon; + private _weapons = weapons _target; + + if (count _weapons == 1) then { + _weapon = _weapons select 0; }; }; + private _magazine = currentMagazine _target; + if (_magazine == "") then { // Try to get magazine using magazinesAmmoFull - private _magazines = magazinesAmmoFull _target; - { if (_x select 2) exitWith { _magazine = _x select 0; }; - } forEach _magazines; + } forEach magazinesAmmoFull _target; }; - // For static weapons the muzzle seemingly never returns anything for static weapons with/without people inside - if (_muzzle == "") then { - _muzzle = _weapon; - }; -}; + // currentMuzzle always returns "" + [_weapon, _weapon, "", _magazine] +} else { + weaponState _target +}) params ["_weapon", "_muzzle", "", "_magazine"]; TRACE_3("",_weapon,_muzzle,_magazine); -if ("" in [_weapon, _magazine]) exitWith {}; +if ("" == _weapon) exitWith {}; private _ammo = _target ammo _muzzle; -private _magazineConfig = configFile >> "CfgMagazines" >> _magazine; -private _maxRounds = getNumber (_magazineConfig >> "count") max 1; +private _magazineCfg = configFile >> "CfgMagazines" >> _magazine; +private _maxRounds = getNumber (_magazineCfg >> "count") max 1; private _count = -1; // Show a count instead of ammo bars (ignore if -1) -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 - }; +// If secondary muzzle is selected or no magazine in current muzzle +if (_muzzle != _weapon || {_magazine == ""}) then { + // Check if no or empty magazine; If true, just show count of compatible magazines + if (_ammo == 0) exitWith { + _magazine = ""; // Make sure, as it could also be secondary muzzle being selected + + private _compatibleMagazines = compatibleMagazines [_weapon, _muzzle]; + + _count = {_x in _compatibleMagazines} count (magazines _target); + }; + + // singleShot, so show count of identical mags available instead of ammo bars + if (_ammo > 0 && {_maxRounds == 1}) exitWith { + _count = 1 + ({_x == _magazine} count (magazines _target)); }; }; @@ -83,21 +82,29 @@ private _ammoBarsStructuredText = if (_count >= 0) then { if (_maxRounds >= COUNT_BARS) then { _count = round (COUNT_BARS * _ammo / _maxRounds); - if (_ammo > 0) then {_count = _count max 1}; - if (_ammo < _maxRounds) then {_count = _count min (COUNT_BARS - 1)}; + if (_ammo > 0) then { + _count = _count max 1; + }; + + if (_ammo < _maxRounds) then { + _count = _count min (COUNT_BARS - 1); + }; } else { _count = _ammo; }; - private _color = [((2 * (1 - _ammo / _maxRounds)) min 1), ((2 * _ammo / _maxRounds) min 1), 0]; + private _color = [(2 * (1 - _ammo / _maxRounds)) min 1, (2 * _ammo / _maxRounds) min 1, 0]; private _string = ""; + for "_a" from 1 to _count do { _string = _string + "|"; }; + private _text = [_string, _color] call EFUNC(common,stringToColoredText); _string = ""; + for "_a" from (_count + 1) to (_maxRounds min COUNT_BARS) do { _string = _string + "|"; }; @@ -105,16 +112,21 @@ private _ammoBarsStructuredText = if (_count >= 0) then { composeText [_text, [_string, "#808080"] call EFUNC(common,stringToColoredText)]; }; - if (_isStaticWeapon) then { - //Vehicle mags (usualy) don't have pictures, so just show the text above ammo count - private _loadedName = getText (_magazineConfig >> "displaynameshort"); + // Vehicle mags usually don't have pictures, so just show the text above ammo count + private _loadedName = getText (_magazineCfg >> "displayNameShort"); + + if (_loadedName == "") then { + _loadedName = getText (_magazineCfg >> "displayName"); + }; + _loadedName = parseText format ["%1", _loadedName]; + private _text = composeText [_loadedName, linebreak, _ammoBarsStructuredText]; [_text] call EFUNC(common,displayTextStructured); } else { if (_magazine != "") then { - private _picture = getText (_magazineConfig >> "picture"); + private _picture = getText (_magazineCfg >> "picture"); [_ammoBarsStructuredText, _picture] call EFUNC(common,displayTextPicture); } else { [_ammoBarsStructuredText, 1] call EFUNC(common,displayTextStructured); diff --git a/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf b/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf index 3701b32d8b..60bfdd918a 100644 --- a/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf +++ b/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf @@ -1,11 +1,11 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, phyma - * Check if the target has an MG equiped with belt system that the player can link + * Check if the target has an MG equipped with belt system that a unit can link. * * Arguments: - * 0: Player - * 1: Target + * 0: Unit wanting to link the belt + * 1: Unit equipped with the weapon * * Return Value: * Maximum ammo of magazine (-1 on error) @@ -16,12 +16,12 @@ * Public: No */ -params ["_player", "_target"]; +params ["_unit", "_target"]; -if (vehicle _target != _target) exitWith {-1}; +if !(isNull objectParent _target) exitWith {-1}; -private _magazineType = currentMagazine _target; -private _magazineCfg = configFile >> "CfgMagazines" >> _magazineType; +private _magazine = currentMagazine _target; +private _magazineCfg = configFile >> "CfgMagazines" >> _magazine; if (getNumber (_magazineCfg >> "ACE_isBelt") == 0) exitWith {-1}; @@ -29,14 +29,13 @@ if (getNumber (_magazineCfg >> "ACE_isBelt") == 0) exitWith {-1}; private _ammoCount = _target ammo currentWeapon _target; // Exit if the belt is full or empty -if (_ammoCount == 0 || getNumber (_magazineCfg >> "count") - _ammoCount == 0) exitWith {-1}; +if (_ammoCount == 0 || {getNumber (_magazineCfg >> "count") - _ammoCount == 0}) exitWith {-1}; -// Check if the player has any of the same magazines -// Calculate max ammo +// Check if the unit has any of the same magazines and calculate max ammo private _maxAmmo = 0; { _maxAmmo = _maxAmmo max (_x select 1); -} forEach (magazinesAmmo _player select {_x select 0 == _magazineType}); +} forEach (magazinesAmmo _unit select {(_x select 0) == _magazine}); _maxAmmo diff --git a/addons/reload/functions/fnc_onTake.sqf b/addons/reload/functions/fnc_onTake.sqf index 9f379ff643..b3312c888c 100644 --- a/addons/reload/functions/fnc_onTake.sqf +++ b/addons/reload/functions/fnc_onTake.sqf @@ -1,6 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: ? + * Author: jokoho48 + * Called from "Take" EH. * * Arguments: * 0: Unit @@ -11,17 +12,18 @@ * None * * Example: - * [bob, backpackContainer bob, "ACE_Banana"] call ace_reload_fnc_onTake + * [player, backpackContainer player, "ACE_Banana"] call ace_reload_fnc_onTake * * Public: No */ params ["_unit", "_container", "_item"]; + if ( - _unit == ACE_player - && {GVAR(DisplayText)} - && {_item == currentMagazine _unit} - && {_container in [uniformContainer _unit, vestContainer _unit, backpackContainer _unit]} + _unit == ACE_player && + {GVAR(displayText)} && + {_item == currentMagazine _unit} && + {_container in [uniformContainer _unit, vestContainer _unit, backpackContainer _unit]} ) then { _unit call FUNC(displayAmmo); }; diff --git a/addons/reload/functions/fnc_startLinkingBelt.sqf b/addons/reload/functions/fnc_startLinkingBelt.sqf index 54fc1921d7..3c116c1532 100644 --- a/addons/reload/functions/fnc_startLinkingBelt.sqf +++ b/addons/reload/functions/fnc_startLinkingBelt.sqf @@ -1,58 +1,59 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: esteldunedain - * Start linking the belt + * Author: esteldunedain, johnb43 + * Start linking the belt. * * Arguments: - * 0: Player - * 1: Target + * 0: Unit linking the belt + * 1: Unit equipped with the weapon * * Return Value: * None * * Example: - * [bob, kevin] call ace_reload_fnc_startLinkingBelt + * [player, cursorTarget] call ace_reload_fnc_startLinkingBelt * * Public: No */ -params ["_player", "_target"]; +params ["_unit", "_target"]; -if (vehicle _target != _target) exitWith {false}; +if !(isNull objectParent _target) exitWith {false}; -private _magazineType = currentMagazine _target; +private _magazine = currentMagazine _target; +private _ammo = [_unit, _target] call FUNC(getAmmoToLinkBelt); - -private _maxAmmo = [_player, _target] call FUNC(getAmmoToLinkBelt); - -//if _maxAmmo is below 0 we quit -if (_maxAmmo <= 0) exitWith {}; +// If _ammo is below 0 we quit +if (_ammo <= 0) exitWith {}; // Condition to call each frame private _condition = { - (_this select 0) params ["_player", "_target"]; - ([_player, _target, []] call EFUNC(common,canInteractWith)) && ((_player distance _target) < 3) && ((speed _target) < 1) + (_this select 0) params ["_unit", "_target"]; + + ([_unit, _target, []] call EFUNC(common,canInteractWith)) && {(_unit distance _target) < 3} && {(speed _target) < 1} }; private _onFinish = { - (_this select 0) params ["_player", "_target", "_magazine"]; + (_this select 0) params ["_unit", "_target", "_magazineInfo"]; + + // Remove the magazine with given remaining ammo; If not possible, quit + if !([_unit, _magazineInfo select 0, _magazineInfo select 1] call EFUNC(common,removeSpecificMagazine)) exitWith { + [LSTRING(BeltNotLinked)] call EFUNC(common,displayTextStructured); + }; // Raise event on remote unit - [QGVAR(ammoLinked), [_target, _player, _magazine], [_target]] call CBA_fnc_targetEvent; + [QGVAR(ammoLinked), [_target, _unit, _magazineInfo], _target] call CBA_fnc_targetEvent; }; private _onFailure = { - (_this select 0) params ["_player", "_target", "_magazine"]; - [_player, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); + (_this select 0) params ["_unit"]; - // Add back the magazine with the former ammo count - _player addMagazine _magazine; + [_unit, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); + + [LSTRING(BeltNotLinked)] call EFUNC(common,displayTextStructured); }; -[_player, "PutDown"] call EFUNC(common,doGesture); - -// Remove the magazine with maximum remaining ammo -[_player, _magazineType, _maxAmmo] call EFUNC(common,removeSpecificMagazine); +[_unit, "PutDown"] call EFUNC(common,doGesture); // Call progress bar -[4, [_player, _target, [_magazineType, _maxAmmo]], _onFinish, _onFailure, (localize LSTRING(LinkingBelt)), _condition, ["isNotInside"]] call EFUNC(common,progressBar); +[4, [_unit, _target, [_magazine, _ammo]], _onFinish, _onFailure, LLSTRING(LinkingBelt), _condition, ["isNotInside"]] call EFUNC(common,progressBar); diff --git a/addons/reload/functions/script_component.hpp b/addons/reload/functions/script_component.hpp deleted file mode 100644 index 572f1fca84..0000000000 --- a/addons/reload/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\reload\script_component.hpp" \ No newline at end of file diff --git a/addons/reload/initKeybinds.sqf b/addons/reload/initKeybinds.sqf new file mode 100644 index 0000000000..cf2ae07ffb --- /dev/null +++ b/addons/reload/initKeybinds.sqf @@ -0,0 +1,16 @@ +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +// Add Keybinds +["ACE3 Weapons", QGVAR(checkAmmo), LSTRING(checkAmmo), { + // Conditions: canInteract + if !([ACE_player, vehicle ACE_player, ["isNotInside", "isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Ignore if controlling UAV (blocks radar keybind) + if (!isNull (ACE_controlledUAV param [0, objNull])) exitWith {false}; + // Conditions: specific + if !(ACE_player call FUNC(canCheckAmmoSelf)) exitWith {false}; + + // Statement + [ACE_player, ACE_player] call FUNC(checkAmmo); + + true +}, {false}, [DIK_R, [false, true, false]], false] call CBA_fnc_addKeybind; // Ctrl + R diff --git a/addons/reload/initSettings.sqf b/addons/reload/initSettings.sqf index 23856d6668..1110ee125b 100644 --- a/addons/reload/initSettings.sqf +++ b/addons/reload/initSettings.sqf @@ -1,18 +1,15 @@ - [ QGVAR(displayText), "CHECKBOX", [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], - localize ELSTRING(common,ACEKeybindCategoryWeapons), - true, - 0 + ELSTRING(common,ACEKeybindCategoryWeapons), + true // default value ] call CBA_fnc_addSetting; [ QGVAR(showCheckAmmoSelf), "CHECKBOX", [LSTRING(SettingShowCheckAmmoSelf), LSTRING(SettingShowCheckAmmoSelfDesc)], - localize ELSTRING(common,ACEKeybindCategoryWeapons), - false, // default value - 0 // isGlobal + ELSTRING(common,ACEKeybindCategoryWeapons), + false // default value ] call CBA_fnc_addSetting; diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 07d8cd605a..7747f5c3a2 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -13,7 +13,7 @@ Controlla le munizioni durante il ricaricamento Conferir munição ao recarregar a arma 再装填された武器の弾薬を確認 - 재장전시 장탄수 확인 + 재장전 시 장탄수 확인 在重新装填时检查弹药 在重新裝填時檢查彈藥 @@ -29,8 +29,8 @@ Controlla le munizioni rimanenti nel caricatore in fase di cambio caricatore. Confere a munição no seu novo carregador ao recarregar a arma 新しく装填された弾倉の弾薬を確認します。 - 재장전시 새탄창에 있는 탄약을 확인합니다. - 在重新装填时检查新弹匣上的弹药. + 재장전 시 새 탄창에 있는 탄약을 확인합니다. + 在重新装填时检查新弹匣上的弹药。 在重新裝填時檢查新彈匣上的彈藥. @@ -40,10 +40,13 @@ 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 - Всегда показывать проверку боеприпасов в меню взаимодействия с собой + Всегда показывать проверку боеприпасов Mostrar siempre la autointeracción de comprobar munición + Zeige immer die Selbstinteraktion zur Prüfung der Munition an. + 상호작용에 탄약 확인을 항상 띄우기 Shows check ammo self interaction even when not in static weapons. @@ -52,10 +55,13 @@ 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. Показывать проверку боеприпасов даже вне стационарного орудия Mostrar la comprobación de la munición incluso cuando no está en armas estáticas + Zeigt die Selbstinteraktion der Munitionsüberprüfung an, auch wenn nicht in statischen Waffen. + 탄약 확인을 상호작용에서 할 수 있도록 합니다. Check Ammo @@ -119,9 +125,23 @@ Attaccando la tracolla... Ligando cintos... ベルトを繋げています・・・ - 벨트 연결중... + 벨트 연결 중... 正在连接弹链... 連接彈鏈中... + + Belt was linked + Bande a été attachée + Gurt wurde angehängt + ベルトがリンクされた + Taśma została połączona + + + Belt could not be linked + Bande n'a pas pu être attachée + Gurt konnte nicht angehängt werden + ベルトはリンクされなかった + Taśma nie mogła być połączona + diff --git a/addons/reloadlaunchers/CfgEventHandlers.hpp b/addons/reloadlaunchers/CfgEventHandlers.hpp index 6c29240403..f6503c2479 100644 --- a/addons/reloadlaunchers/CfgEventHandlers.hpp +++ b/addons/reloadlaunchers/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); diff --git a/addons/reloadlaunchers/CfgVehicles.hpp b/addons/reloadlaunchers/CfgVehicles.hpp index eccd30d1f7..6ce2f4b852 100644 --- a/addons/reloadlaunchers/CfgVehicles.hpp +++ b/addons/reloadlaunchers/CfgVehicles.hpp @@ -1,4 +1,3 @@ - class CfgVehicles { class Man; class CAManBase: Man { diff --git a/addons/reloadlaunchers/CfgWeapons.hpp b/addons/reloadlaunchers/CfgWeapons.hpp index 678528502e..75a688bf28 100644 --- a/addons/reloadlaunchers/CfgWeapons.hpp +++ b/addons/reloadlaunchers/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class Launcher_Base_F; class launch_Titan_base: Launcher_Base_F { @@ -7,6 +6,9 @@ class CfgWeapons { class launch_RPG32_F: Launcher_Base_F { GVAR(enabled) = 1; }; + class launch_RPG7_F: Launcher_Base_F { + GVAR(enabled) = 1; + }; class launch_MRAWS_base_F: Launcher_Base_F { GVAR(enabled) = 1; }; diff --git a/addons/reloadlaunchers/XEH_PREP.hpp b/addons/reloadlaunchers/XEH_PREP.hpp index b730d2780e..4d63905e75 100644 --- a/addons/reloadlaunchers/XEH_PREP.hpp +++ b/addons/reloadlaunchers/XEH_PREP.hpp @@ -1,4 +1,3 @@ - PREP(addMissileReloadActions); PREP(canLoad); PREP(getLoadableMissiles); diff --git a/addons/reloadlaunchers/XEH_postInit.sqf b/addons/reloadlaunchers/XEH_postInit.sqf index 8c18d430c4..af5fba3bf5 100644 --- a/addons/reloadlaunchers/XEH_postInit.sqf +++ b/addons/reloadlaunchers/XEH_postInit.sqf @@ -1,4 +1,26 @@ // by commy2 #include "script_component.hpp" -[QGVAR(reloadLauncher), {_this call DFUNC(reloadLauncher)}] call CBA_fnc_addEventHandler; +[QGVAR(reloadStarted), { + params ["_unit", "_target"]; + + // Don't show notification if target is local AI + if (GVAR(displayStatusText) && {!local _unit} && {_target call EFUNC(common,isPlayer)}) then { + private _message = format [LLSTRING(LoadingStarted), _unit call EFUNC(common,getName)]; + + [_message] call EFUNC(common,displayTextStructured); + }; +}] call CBA_fnc_addEventHandler; + +[QGVAR(reloadAborted), { + params ["_unit", "_target"]; + + // Don't show notification if target is local AI + if (GVAR(displayStatusText) && {!local _unit} && {_target call EFUNC(common,isPlayer)}) then { + private _message = format [LLSTRING(LoadingAborted), _unit call EFUNC(common,getName)]; + + [_message] call EFUNC(common,displayTextStructured); + }; +}] call CBA_fnc_addEventHandler; + +[QGVAR(reloadLauncher), LINKFUNC(reloadLauncher)] call CBA_fnc_addEventHandler; diff --git a/addons/reloadlaunchers/XEH_preInit.sqf b/addons/reloadlaunchers/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/reloadlaunchers/XEH_preInit.sqf +++ b/addons/reloadlaunchers/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/reloadlaunchers/config.cpp b/addons/reloadlaunchers/config.cpp index 09f01e0594..bf9a5fa928 100644 --- a/addons/reloadlaunchers/config.cpp +++ b/addons/reloadlaunchers/config.cpp @@ -15,6 +15,5 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" - #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf index 42af3e5027..1d54ba0fde 100644 --- a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf +++ b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf @@ -1,17 +1,17 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 - * Create one action per reloadable missile + * Create one action per reloadable missile. * * Arguments: - * 1: Target - * 0: Player + * 0: Unit equipped with the launcher + * 1: Unit wanting to execute the reload * * Return Value: * Children actions * * Example: - * [bob, kevin] call ace_reloadlaunchers_fnc_addMissileReloadActions + * [cursorTarget, player] call ace_reloadlaunchers_fnc_addMissileReloadActions * * Public: No * @@ -20,8 +20,9 @@ params ["_target", "_unit"]; TRACE_2("params",_target,_unit); -//Fast exit for common case: +// Fast exit for common cases private _weapon = secondaryWeapon _target; + if ((_weapon == "") || {(getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(enabled))) == 0}) exitWith { TRACE_1("weapon not supported",_weapon); [] @@ -32,16 +33,18 @@ private _actions = []; private _loadableMissiles = [_unit, _weapon] call FUNC(getLoadableMissiles); TRACE_2("",_weapon,_loadableMissiles); +private _cfgMagazines = configFile >> "CfgMagazines"; + { private _name = format [QGVAR(Missile_%1), _x]; - private _displayName = format [localize LSTRING(LoadMagazine), getText (configFile >> "CfgMagazines" >> _x >> "displayName")]; + private _displayName = format [LLSTRING(LoadMagazine), getText (_cfgMagazines >> _x >> "displayName")]; private _statement = { - (_this select 2) call DFUNC(load); + (_this select 2) call FUNC(load); }; private _condition = { - (_this select 2) call DFUNC(canLoad) + (_this select 2) call FUNC(canLoad) }; private _action = [_name, _displayName, "", _statement, _condition, {}, [_unit, _target, _weapon, _x], "", 4] call EFUNC(interact_menu,createAction); diff --git a/addons/reloadlaunchers/functions/fnc_canLoad.sqf b/addons/reloadlaunchers/functions/fnc_canLoad.sqf index af08ed8013..3e5d6303d1 100644 --- a/addons/reloadlaunchers/functions/fnc_canLoad.sqf +++ b/addons/reloadlaunchers/functions/fnc_canLoad.sqf @@ -1,19 +1,19 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 - * Check of the unit can reload the launcher of target unit. + * Author: commy2, johnb43 + * Check if the unit can reload the launcher of the target unit. * * Arguments: - * 0: Unit to do the reloading - * 1: Unit eqipped with launcher - * 2: weapon name - * 3: missile name + * 0: Unit wanting to execute the reload + * 1: Unit equipped with the launcher + * 2: Launcher name + * 3: Missile name * * Return Value: * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_canLoad + * [player, cursorTarget, "launch_RPG32_F", "RPG32_F"] call ace_reloadlaunchers_fnc_canLoad * * Public: No */ @@ -21,21 +21,24 @@ params ["_unit", "_target", "_weapon", "_magazine"]; TRACE_4("params",_unit,_target,_weapon,_magazine); -if (!alive _target) exitWith {false}; -if (vehicle _target != _target) exitWith {false}; +// Target must be awake +if !(_target call EFUNC(common,isAwake)) exitWith {false}; + +// Target must not be in a vehicle +if !(isNull objectParent _target) exitWith {false}; if !([_unit, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; -// target is awake -if (_target getVariable ["ACE_isUnconscious", false]) exitWith {false}; +// Target must not be captive +if (_target getVariable [QEGVAR(captives,isHandcuffed), false] || {_target getVariable [QEGVAR(captives,isSurrendering), false]}) exitWith {false}; -// has secondary weapon equipped -if !(_weapon in weapons _target) exitWith {false}; - -// check if the target really needs to be reloaded -if (count secondaryWeaponMagazine _target > 0) exitWith {false}; - -// check if the launcher is compatible +// Check if the launcher is compatible if (getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(enabled)) == 0) exitWith {false}; -// check if the magazine compatible with targets launcher +// Check if target has its secondary weapon equipped +if !(_weapon in weapons _target) exitWith {false}; + +// Check if the target's launcher's primary muzzle really needs to be reloaded +if (_target ammo _weapon != 0) exitWith {false}; + +// Check if the magazine is compatible with target's launcher _magazine in ([_unit, _weapon] call FUNC(getLoadableMissiles)) diff --git a/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf b/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf index 6bded89110..271fcf5a0d 100644 --- a/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf +++ b/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf @@ -1,17 +1,17 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 - * Return all magazine types from reloaders inventory that are compatible with given weapon. + * Author: commy2, johnb43 + * Return all magazine types from reloader's inventory that are compatible with the given launcher. * * Arguments: - * 0: Unit to to the reload - * 1: A launcher + * 0: Unit wanting to execute the reload + * 1: Launcher name * * Return Value: * Reloable magazines * * Example: - * [bob, launcher] call ace_reloadlaunchers_fnc_getLoadableMissiles + * [player, "launch_RPG32_F"] call ace_reloadlaunchers_fnc_getLoadableMissiles * * Public: No */ @@ -19,11 +19,5 @@ params ["_unit", "_weapon"]; TRACE_2("params",_unit,_weapon); -// get available magazines of reloader, Note: "magazines" does not include currently loaded magazines -private _magazines = magazines _unit; - -// case sensitvity -_magazines = _magazines apply {toLower _x}; - -// get reloaders magazine types compatible with targets launcher. No duplicates. -getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines") select {toLower _x in _magazines} // return +// Look for primary muzzle magazines only +(compatibleMagazines [_weapon, "this"]) arrayIntersect (magazines _unit) diff --git a/addons/reloadlaunchers/functions/fnc_load.sqf b/addons/reloadlaunchers/functions/fnc_load.sqf index 27d4cafbf2..6ef32e4539 100644 --- a/addons/reloadlaunchers/functions/fnc_load.sqf +++ b/addons/reloadlaunchers/functions/fnc_load.sqf @@ -1,19 +1,19 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 - * Reload a launcher + * Author: commy2, johnb43, drofseh + * Start reloading a launcher, reload started by the unit who has the missile. * * Arguments: - * 0: Unit with magazine - * 1: Unit with launcher - * 2: weapon name - * 3: missile name + * 0: Unit executing the reload + * 1: Unit equipped with the launcher + * 2: Launcher name + * 3: Missile name * * Return Value: * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_load + * [player, cursorTarget, "launch_RPG32_F", "RPG32_F"] call ace_reloadlaunchers_fnc_load * * Public: No */ @@ -21,30 +21,67 @@ params ["_unit", "_target", "_weapon", "_magazine"]; TRACE_4("params",_unit,_target,_weapon,_magazine); -private _reloadTime = if (isNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(buddyReloadTime))) then { - getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(buddyReloadTime)) +private _config = configFile >> "CfgWeapons" >> _weapon >> QGVAR(buddyReloadTime); + +private _reloadTime = if (isNumber _config) then { + getNumber _config } else { - 2.5 + getNumber (configFile >> "CfgWeapons" >> _weapon >> "magazineReloadTime") min 2.5 }; -// do animation +// Play animation [_unit] call EFUNC(common,goKneeling); -// show progress bar +// Notify unit that is being reloaded that reload has been started +[QGVAR(reloadStarted), [_unit, _target], _target] call CBA_fnc_targetEvent; +// Show progress bar private _onSuccess = { - (_this select 0 select 0) removeMagazine (_this select 0 select 3); - [QGVAR(reloadLauncher), _this select 0, _this select 0 select 1] call CBA_fnc_targetEvent; + (_this select 0) params ["_unit", "_target", "_weapon", "_magazine"]; - [localize LSTRING(LauncherLoaded)] call DEFUNC(common,displayTextStructured); + // Check if the unit has any of the same magazines and calculate max ammo + private _maxAmmo = 0; + + { + _maxAmmo = _maxAmmo max (_x select 1); + } forEach (magazinesAmmo _unit select {(_x select 0) == _magazine}); + + // Check if the launcher can still be loaded; If possible, then try to remove magazine + if !(_maxAmmo > 0 && {[_unit, _target, _weapon, _magazine] call FUNC(canLoad)} && {[_unit, _magazine, _maxAmmo] call EFUNC(common,removeSpecificMagazine)}) exitWith { + // Notify unit that was being reloaded that reload has been stopped + [QGVAR(reloadAborted), [_unit, _target], _target] call CBA_fnc_targetEvent; + + // Notify reloading unit about failure + if (GVAR(displayStatusText)) then { + [LSTRING(LauncherNotLoaded)] call EFUNC(common,displayTextStructured); + }; + }; + + // Reload target's launcher + [QGVAR(reloadLauncher), [_unit, _target, _weapon, _magazine, _maxAmmo], _target] call CBA_fnc_targetEvent; + + // Notify reloading unit about success + if (GVAR(displayStatusText)) then { + [LSTRING(LauncherLoaded)] call EFUNC(common,displayTextStructured); + }; }; private _onFailure = { - [localize ELSTRING(common,ActionAborted)] call DEFUNC(common,displayTextStructured); + (_this select 0) params ["_unit", "_target"]; + + // Notify unit that was being reloaded that reload has been stopped + [QGVAR(reloadAborted), [_unit, _target], _target] call CBA_fnc_targetEvent; + + // Notify reloading unit about failure + if (GVAR(displayStatusText)) then { + [LSTRING(LauncherNotLoaded)] call EFUNC(common,displayTextStructured); + }; }; private _condition = { - (_this select 0) call DFUNC(canLoad) && {(_this select 0 select 0) distance (_this select 0 select 1) < 4} + (_this select 0) params ["_unit", "_target"]; + + (_this select 0) call FUNC(canLoad) && {_unit distance _target < 4} }; -[_reloadTime, [_unit, _target, _weapon, _magazine], _onSuccess, _onFailure, localize LSTRING(LoadingLauncher), _condition, ["isNotInside", "isNotSwimming"]] call EFUNC(common,progressBar); +[_reloadTime, [_unit, _target, _weapon, _magazine], _onSuccess, _onFailure, LLSTRING(LoadingLauncher), _condition, ["isNotInside", "isNotSwimming"]] call EFUNC(common,progressBar); diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index b0e5a9c332..592c3af283 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -1,30 +1,32 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2 - * Reload a launcher + * Author: commy2, johnb43, drofseh + * Reload a launcher for the unit who has the launcher. + * If the ammo argument is nil, a full magazine will be given. * * Arguments: - * 0: Unit to do the reloading - * 1: Target to rload - * 2: weapon name - * 3: missile name + * 0: Unit executing the reload + * 1: Unit equipped with the launcher + * 2: Launcher name + * 3: Missile name + * 4: Ammo count * * Return Value: * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_reloadLauncher + * [player, cursorTarget, "launch_RPG32_F", "RPG32_F"] call ace_reloadlaunchers_fnc_reloadLauncher * * Public: No */ -params ["_unit","_target","_weapon","_magazine"]; -TRACE_4("params",_unit,_target,_weapon,_magazine); +params ["_unit", "_target", "_weapon", "_magazine", "_ammo"]; +TRACE_5("params",_unit,_target,_weapon,_magazine,_ammo); -_target selectWeapon _weapon; +// Add magazine to launcher immediately +_target addWeaponItem [_weapon, [_magazine, _ammo], true]; -if (currentWeapon _target != _weapon) exitWith {}; -if (currentMagazine _target != "") exitWith {}; - -// command is wip, reload time for launchers is not intended. -_target addWeaponItem [_weapon, _magazine, true]; +// Don't show notification if target is local AI +if (GVAR(displayStatusText) && {!local _unit} && {_target call EFUNC(common,isPlayer)}) then { + [LSTRING(LauncherLoaded)] call EFUNC(common,displayTextStructured); +}; diff --git a/addons/reloadlaunchers/functions/script_component.hpp b/addons/reloadlaunchers/functions/script_component.hpp deleted file mode 100644 index 9c129f36b1..0000000000 --- a/addons/reloadlaunchers/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\reloadlaunchers\script_component.hpp" \ No newline at end of file diff --git a/addons/reloadlaunchers/initSettings.sqf b/addons/reloadlaunchers/initSettings.sqf new file mode 100644 index 0000000000..687a74ef37 --- /dev/null +++ b/addons/reloadlaunchers/initSettings.sqf @@ -0,0 +1,8 @@ +[ + QGVAR(displayStatusText), + "CHECKBOX", + [LSTRING(SettingDisplayStatusTextName), LSTRING(SettingDisplayStatusTextDesc)], + ELSTRING(common,ACEKeybindCategoryWeapons), + true, + 2 +] call CBA_fnc_addSetting; diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index 80a7dce947..a74f33fdb0 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -1,6 +1,18 @@ + + Display notifications for buddy loading + バディ装填時の通知表示 + Wyświetlanie powiadomień o ładowaniu przez asystenta + Buddy Nachlade Nachricht anzeigen + + + Displays notifications when an assistant loads a gunner's launcher. + 助手が射手のランチャーを装填した際に通知を表示します。 + Wyświetla powiadomienie, gdy asystent ładuje wyrzutnię. + Zeigt Benachrichtigungen an, wenn ein Assistent den Werfer eines Richtschützen lädt. + Load launcher Panzerabwehr laden @@ -12,12 +24,26 @@ Kilövö betöltése Carica lanciamissili Recarregar lançador - ランチャーに装填 + ランチャーを装填 무기 재장전 - 装载发射器 + 装填发射器 裝載發射器 Fırlatıcıyı Yükle + + %1 is loading your launcher + %1 lädt deine Panzerabwehr + %1 charge ton lanceur + %1 がランチャーを装填しています + %1 ładuje twoją wyrzutnię + + + %1 stopped loading your launcher + %1 hat aufgehört, deine Panzerabwehr zu laden + %1 a arrêté de charger ton lanceur + %1 がランチャーの装填を中断しました + %1 przestał ładować twoją wyrzutnię + Loading launcher... Chargement du lanceur... @@ -29,9 +55,9 @@ Kilövő betöltés alatt... Caricando il lanciamissili... Recarregando lançador... - ランチャーに装填中・・・ - 무기 재장전중... - 正在装载发射器... + ランチャーを装填中・・・ + 무기 재장전 중... + 正在装填发射器... 裝載發射器中... Fırlatıcı Yükleniyor... @@ -46,9 +72,9 @@ Kilövő betöltve Lanciamissili caricato Lançador Carregado - ランチャーに装填完了 + ランチャーの装填完了 무기 재장전됨 - 发射器装载完毕 + 发射器装填完毕 發射器裝載完畢 Fırlatıcı Yüklendi @@ -63,11 +89,18 @@ %1 betöltése Caricato %1 Recarregar %1 - %1 を装填 + %1 を装填します %1 장전 - 装载%1 + 装填%1 裝載%1 %1 Yüklendi + + Launcher could not be loaded + Panzerabwehr konnte nicht geladen werden + Lanceur n'a pas pu être chargé + ランチャーを装填できませんでした + Wyrzutnia nie mogła być załadowana + diff --git a/addons/repair/ACE_Repair.hpp b/addons/repair/ACE_Repair.hpp index 3a3be9213c..344c509b2f 100644 --- a/addons/repair/ACE_Repair.hpp +++ b/addons/repair/ACE_Repair.hpp @@ -3,10 +3,11 @@ class ACE_Repair { class ReplaceWheel { displayName = CSTRING(ReplaceWheel); displayNameProgress = CSTRING(ReplacingWheel); + forceDisplayName = 0; repairLocations[] = {"All"}; requiredEngineer = QGVAR(engineerSetting_Wheel); - repairingTime = 10; + repairingTime = QGVAR(wheelChangeTime); repairingTimeSelfCoef = 1; items = QGVAR(wheelRepairRequiredItems); condition = QFUNC(canReplaceWheel); @@ -21,6 +22,7 @@ class ACE_Repair { animationCallerProne = "Acts_carFixingWheel"; animationCallerSelf = "Acts_carFixingWheel"; animationCallerSelfProne = "Acts_carFixingWheel"; + loopAnimation = 0; litter[] = {}; }; class RemoveWheel: ReplaceWheel { @@ -30,12 +32,23 @@ class ACE_Repair { callbackSuccess = QFUNC(doRemoveWheel); claimObjects[] = {}; }; + class PatchWheel: ReplaceWheel { + displayName = CSTRING(PatchWheel); + displayNameProgress = CSTRING(PatchingWheel); + condition = QFUNC(canPatchWheel); + repairingTime = QFUNC(getPatchWheelTime); + callbackProgress = QFUNC(doPatchWheelProgress); + items = QGVAR(patchWheelRequiredItems); + requiredEngineer = QGVAR(engineerSetting_Wheel); + callbackSuccess = ""; + claimObjects[] = {}; + }; class MiscRepair: ReplaceWheel { displayName = CSTRING(Repairing); // let's make empty string an auto generated string displayNameProgress = CSTRING(RepairingHitPoint); condition = QFUNC(canMiscRepair); requiredEngineer = QGVAR(engineerSetting_Repair); - repairingTime = 15; + repairingTime = QGVAR(miscRepairTime); callbackSuccess = QFUNC(doRepair); items = QGVAR(miscRepairRequiredItems); itemConsumed = QGVAR(consumeItem_ToolKit); @@ -69,11 +82,14 @@ class ACE_Repair { class FullRepair: MiscRepair { displayName = CSTRING(fullRepair); displayNameProgress = CSTRING(fullyRepairing); + forceDisplayName = 1; + loopAnimation = 1; requiredEngineer = QGVAR(engineerSetting_fullRepair); repairLocations[] = {QGVAR(fullRepairLocation)}; - repairingTime = 30; - condition = "-1 != ((getAllHitPointsDamage _target param [2,[]]) findIf {_x > 0})"; + repairingTime = QFUNC(getFullRepairTime); + condition = "((getAllHitPointsDamage _target) select 2) findIf {_x > 0} != -1"; callbackSuccess = QFUNC(doFullRepair); + callbackProgress = QFUNC(fullRepairProgress); items = QGVAR(fullRepairRequiredItems); itemConsumed = QGVAR(consumeItem_ToolKit); }; diff --git a/addons/repair/CfgActions.hpp b/addons/repair/CfgActions.hpp deleted file mode 100644 index 5dbd0ca7a6..0000000000 --- a/addons/repair/CfgActions.hpp +++ /dev/null @@ -1,9 +0,0 @@ -class CfgActions { - class None; - class Repair: None { - show = 0; - }; - class RepairVehicle: None { - show = 0; - }; -}; diff --git a/addons/repair/CfgEden.hpp b/addons/repair/CfgEden.hpp index d9df86a036..2cd1ed9e2e 100644 --- a/addons/repair/CfgEden.hpp +++ b/addons/repair/CfgEden.hpp @@ -1,7 +1,8 @@ +#define VANILLA_ISREPAIRVEHICLE (parseNumber (getRepairCargo _this > 0)) #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) #define DEFAULT_ISENGINEER ([ARR_2(0,1)] select (_this getUnitTrait 'engineer')) -#define DEFAULT_ISREPAIRVEHICLE GET_NUMBER(configOf _this >> QQGVAR(canRepair),0) +#define DEFAULT_ISREPAIRVEHICLE GET_NUMBER(configOf _this >> QQGVAR(canRepair),VANILLA_ISREPAIRVEHICLE) class ctrlToolbox; @@ -69,7 +70,7 @@ class Cfg3DEN { property = QGVAR(editorLoadedTracks); control = "Edit"; expression = "_this setVariable ['%s',_value];"; - defaultValue = "[0,1] select (_this isKindOf 'Tank')"; // must match pre init script + defaultValue = "parseNumber (_this isKindOf 'Tank')"; // must match post init script validate = "number"; condition = "objectHasInventoryCargo"; typeName = "NUMBER"; @@ -78,7 +79,7 @@ class Cfg3DEN { displayName = CSTRING(editorLoadedWheels); tooltip = CSTRING(editorLoadedWheels_tooltip); property = QGVAR(editorLoadedWheels); - defaultValue = "[0,1] select (_this isKindOf 'Car')"; // must match pre init script + defaultValue = "parseNumber (_this isKindOf 'Car')"; // must match post init script }; }; }; diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index 1c9a44d4e5..6a58e07a6f 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -3,10 +3,6 @@ class ACE_MainActions { \ class GVAR(Repair) { \ displayName = CSTRING(Repair); \ - condition = "true"; \ - statement = ""; \ - runOnHover = 1; \ - showDisabled = 0; \ icon = "\A3\ui_f\data\igui\cfg\actions\repair_ca.paa"; \ distance = 4; \ exceptions[] = {"isNotSwimming", "isNotOnLadder"}; \ @@ -106,7 +102,6 @@ class CfgVehicles { class values { class None { name = "None"; value = 0; default = 1;}; class ToolKit { name = "ToolKit"; value = 1; }; - class gm_repairkit_01 { name = "GM Repair Kit"; value = 1; }; }; }; }; @@ -328,6 +323,7 @@ class CfgVehicles { class ACE_Track: ACE_RepairItem_Base { EGVAR(cargo,size) = 2; EGVAR(cargo,canLoad) = 1; + EGVAR(cargo,noRename) = 1; author = "Hawkins"; scope = 2; model = QPATHTOF(data\ace_track.p3d); @@ -358,6 +354,7 @@ class CfgVehicles { class ACE_Wheel: ACE_RepairItem_Base { EGVAR(cargo,size) = 1; EGVAR(cargo,canLoad) = 1; + EGVAR(cargo,noRename) = 1; author = "Hawkins"; scope = 2; model = QPATHTOF(data\ace_wheel.p3d); @@ -402,40 +399,19 @@ class CfgVehicles { }; editorPreview = QPATHTOF(data\preview_wheel.jpg); - }; - // disable vanilla repair - // "getNumber (_x >> ""transportRepair"") > 0" configClasses (configFile >> "CfgVehicles") - class ReammoBox_F; - class Land_RepairDepot_01_base_F: ReammoBox_F { // TanksDLC - Repair Depo Thing - GVAR(canRepair) = 1; - transportRepair = 0; - }; - class Van_02_base_F; - class Van_02_service_base_F: Van_02_base_F { // OrangeDLC - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Slingload_01_Base_F; - class B_Slingload_01_Repair_F: Slingload_01_Base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Helicopter_Base_H; - class Heli_Transport_04_base_F: Helicopter_Base_H { - GVAR(hitpointGroups)[] = { {"HitEngine", {"HitEngine1", "HitEngine2"}} }; - }; - class O_Heli_Transport_04_repair_F: Heli_Transport_04_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Pod_Heli_Transport_04_base_F; - class Land_Pod_Heli_Transport_04_repair_F: Pod_Heli_Transport_04_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class GVAR(Patch) { + displayName = CSTRING(PatchWheel); + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canPatchRemovedWheel)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(patchRemovedWheel)); + exceptions[] = {"isNotDragging", "isNotCarrying", "isNotOnLadder", "isNotSwimming", "isNotSitting"}; + icon = QPATHTOF(ui\patch_ca.paa); + }; + }; + }; }; class Heli_Transport_02_base_F; @@ -449,41 +425,10 @@ class CfgVehicles { }; class B_APC_Tracked_01_base_F; - class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F { GVAR(hitpointPositions)[] = {{"HitTurret", {0,-2,0}}}; }; - class Offroad_01_base_F; - class Offroad_01_repair_base_F: Offroad_01_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class B_Truck_01_mover_F; - class B_Truck_01_Repair_F: B_Truck_01_mover_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class B_Truck_01_fuel_F: B_Truck_01_mover_F { // the fuel hemet apparently can repair. GJ BI - transportRepair = 0; - }; - - class Truck_02_base_F; - class Truck_02_box_base_F: Truck_02_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Truck_02_medical_base_F: Truck_02_box_base_F { - GVAR(canRepair) = 0; - }; - class Car_F: Car { class HitPoints; }; @@ -503,10 +448,6 @@ class CfgVehicles { }; }; }; - class O_Truck_03_repair_F: Truck_03_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; class Quadbike_01_base_F: Car_F { GVAR(hitpointPositions)[] = { {"HitEngine", {0, 0.5, -0.7}}, {"HitFuel", {0, 0, -0.5}} }; diff --git a/addons/repair/XEH_PREP.hpp b/addons/repair/XEH_PREP.hpp index 7c2e5a1f15..ea9e40a4e7 100644 --- a/addons/repair/XEH_PREP.hpp +++ b/addons/repair/XEH_PREP.hpp @@ -2,21 +2,29 @@ PREP(addRepairActions); PREP(addSpareParts); PREP(canMiscRepair); +PREP(canPatchRemovedWheel); +PREP(canPatchWheel); PREP(canRemove); PREP(canRepair); PREP(canRepairTrack); PREP(canReplaceTrack); PREP(canReplaceWheel); PREP(doFullRepair); +PREP(doPatchWheelProgress); PREP(doRemoveTrack); PREP(doRemoveWheel); PREP(doRepair); PREP(doRepairTrack); PREP(doReplaceTrack); PREP(doReplaceWheel); +PREP(fullRepairProgress); PREP(getClaimObjects); +PREP(getFullRepairTime); PREP(getHitPointString); +PREP(getHitPointsToIgnore); +PREP(getPatchWheelTime); PREP(getPostRepairDamage); +PREP(getRepairItems); PREP(getWheelHitPointsWithSelections); PREP(hasItems); PREP(isEngineer); @@ -31,6 +39,7 @@ PREP(moduleAssignRepairVehicle); PREP(moduleAssignRepairFacility); PREP(moduleRepairSettings); PREP(normalizeHitPoints); +PREP(patchRemovedWheel); PREP(repair); PREP(repair_failure); PREP(repair_success); diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index 2cbbd8c3e1..f717e56651 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -1,20 +1,86 @@ #include "script_component.hpp" -[QGVAR(setVehicleDamage), {_this call FUNC(setDamage)}] call CBA_fnc_addEventHandler; -[QGVAR(setVehicleHitPointDamage), {_this call FUNC(setHitPointDamage)}] call CBA_fnc_addEventHandler; +["CBA_settingsInitialized", { -// wheels -[QGVAR(setWheelHitPointDamage), { - params ["_object", "_hitPoint", "_damage"]; - private _damageDisabled = !isDamageAllowed _object; + if !GVAR(enabled) exitWith {}; - if (_damageDisabled) then { - _object allowDamage true; + [QGVAR(setVehicleDamage), {_this call FUNC(setDamage)}] call CBA_fnc_addEventHandler; + [QGVAR(setVehicleHitPointDamage), {_this call FUNC(setHitPointDamage)}] 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; + + + // placed in editor static objects don't trigger init + { + if (local _x && {getRepairCargo _x > 0}) then { + _x setRepairCargo 0; + TRACE_3("setRepairCargo static",_x,typeOf _x,getRepairCargo _x); + }; + } forEach allMissionObjects "Static"; + + ["All", "InitPost", { + params ["_vehicle"]; + if !(local _vehicle && {getRepairCargo _vehicle > 0}) exitWith {}; + _vehicle setRepairCargo 0; + TRACE_3("setRepairCargo vehicle",_vehicle,typeOf _vehicle,getRepairCargo _vehicle); + }, true, ["Man"], true] call CBA_fnc_addClassEventHandler; + + ["CAManBase", "InitPost", { + params ["_unit"]; + if !(local _unit && {_unit getUnitTrait "engineer"}) exitWith {}; + _unit setUnitTrait ["engineer", false]; + if (_unit getVariable ["ACE_IsEngineer", -1] isEqualTo -1) then { + _unit setVariable ["ACE_IsEngineer", true, true]; + }; + TRACE_3("setUnitTrait",_unit,typeOf _unit,_unit getUnitTrait "engineer"); + }, true, [], true] call CBA_fnc_addClassEventHandler; + + + GVAR(allToolKits) = call (uiNamespace getVariable QGVAR(allToolKits)); + + ["ACE_RepairItem_Base", "killed", { + params ["_object"]; + + [{deleteVehicle _this}, _object, 5] call CBA_fnc_waitAndExecute; + }, true, [], true] call CBA_fnc_addClassEventHandler; + + // load tracks and wheels + if (isServer) then { + private _fnc_addSpareItems = { + if (!GVAR(addSpareParts)) exitWith {}; + params ["_vehicle"]; + + private _spareTracks = _vehicle getVariable QGVAR(editorLoadedTracks); + if (isNil "_spareTracks") then { + _spareTracks = parseNumber (_vehicle isKindOf "Tank"); // must match eden attribute default + }; + if (_spareTracks > 0) then { + [_vehicle, _spareTracks, "ACE_Track"] call FUNC(addSpareParts); + }; + + private _spareWheels = _vehicle getVariable QGVAR(editorLoadedWheels); + if (isNil "_spareWheels") then { + _spareWheels = parseNumber (_vehicle isKindOf "Car"); // must match eden attribute default + }; + if (_spareWheels > 0) then { + [_vehicle, _spareWheels, "ACE_Wheel"] call FUNC(addSpareParts); + }; + }; + + ["Tank", "initPost", _fnc_addSpareItems, true, [], true] call CBA_fnc_addClassEventHandler; + ["Car", "initPost", _fnc_addSpareItems, true, [], true] call CBA_fnc_addClassEventHandler; }; - _object setHitPointDamage [_hitPoint, _damage]; - - if (_damageDisabled) then { - _object allowDamage false; - }; }] call CBA_fnc_addEventHandler; diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index 216a16fcf7..9361d05015 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -8,37 +8,4 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" -["ACE_RepairItem_Base", "killed", { - params ["_object"]; - - [{deleteVehicle _this}, _object, 5] call CBA_fnc_waitAndExecute; -}] call CBA_fnc_addClassEventHandler; - -// load tracks and wheels -if (isServer) then { - private _fnc_addSpareItems = { - if (!GVAR(addSpareParts)) exitWith {}; - params ["_vehicle"]; - - private _spareTracks = _vehicle getVariable QGVAR(editorLoadedTracks); - if (isNil "_spareTracks") then { - _spareTracks = [0, 1] select (_vehicle isKindOf "Tank"); // must match eden attribute default - }; - if (_spareTracks > 0) then { - [_vehicle, _spareTracks, "ACE_Track"] call FUNC(addSpareParts); - }; - - private _spareWheels = _vehicle getVariable QGVAR(editorLoadedWheels); - if (isNil "_spareWheels") then { - _spareWheels = [0, 1] select (_vehicle isKindOf "Car"); // must match eden attribute default - }; - if (_spareWheels > 0) then { - [_vehicle, _spareWheels, "ACE_Wheel"] call FUNC(addSpareParts); - }; - }; - - ["Tank", "initPost", _fnc_addSpareItems] call CBA_fnc_addClassEventHandler; - ["Car", "initPost", _fnc_addSpareItems] call CBA_fnc_addClassEventHandler; -}; - ADDON = true; diff --git a/addons/repair/XEH_preStart.sqf b/addons/repair/XEH_preStart.sqf index 022888575e..a01df24b79 100644 --- a/addons/repair/XEH_preStart.sqf +++ b/addons/repair/XEH_preStart.sqf @@ -1,3 +1,8 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +uiNamespace setVariable [ + QGVAR(allToolKits), + compileFinal str (QUOTE(getNumber (_x >> 'ItemInfo' >> 'type') == TYPE_TOOLKIT) configClasses (configFile >> "CfgWeapons") apply {configName _x}) +]; diff --git a/addons/repair/config.cpp b/addons/repair/config.cpp index 1dbe9b46b1..05ee4bac01 100644 --- a/addons/repair/config.cpp +++ b/addons/repair/config.cpp @@ -16,7 +16,6 @@ class CfgPatches { #include "ACE_Repair.hpp" #include "ACE_Settings.hpp" -#include "CfgActions.hpp" #include "CfgEden.hpp" #include "CfgEventHandlers.hpp" #include "CfgMoves.hpp" diff --git a/addons/repair/dev/draw_showRepairInfo.sqf b/addons/repair/dev/draw_showRepairInfo.sqf index b5516d6b98..f516e14ef9 100644 --- a/addons/repair/dev/draw_showRepairInfo.sqf +++ b/addons/repair/dev/draw_showRepairInfo.sqf @@ -1,7 +1,7 @@ // PabstMirror // [] execVM "\z\ace\addons\repair\dev\draw_showRepairInfo.sqf"; -#include "\z\ace\addons\repair\script_component.hpp" +#include "..\script_component.hpp" addMissionEventHandler ["Draw3D", { if !((cursorObject isKindOf "Car") || (cursorObject isKindOf "Tank") || (cursorObject isKindOf "Air")) exitWith {}; @@ -14,7 +14,7 @@ addMissionEventHandler ["Draw3D", { ([cursorObject] call FUNC(getWheelHitPointsWithSelections)) params ["_wheelHitPoints", "_wheelHitSelections"]; private _output = []; - + { private _selection = _x; private _hitpoint = _hitPoints select _forEachIndex; diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf index b3d2bb91df..19191c9c49 100644 --- a/addons/repair/functions/fnc_addRepairActions.sqf +++ b/addons/repair/functions/fnc_addRepairActions.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: commy2, SilentSpike + * Author: commy2, kymckay * Checks if the vehicles class already has the actions initialized, otherwise add all available repair options. Calleed from init EH. * * Arguments: @@ -15,7 +15,11 @@ * Public: No */ -if (!hasInterface) exitWith {}; +if !(EGVAR(common,settingsInitFinished)) exitWith { + EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(addRepairActions), _this]; +}; + +if !(hasInterface && {GVAR(enabled)}) exitWith {}; params ["_vehicle"]; private _type = typeOf _vehicle; @@ -25,6 +29,9 @@ TRACE_2("addRepairActions", _vehicle,_type); private _initializedClasses = GETMVAR(GVAR(initializedClasses),[]); if (_type in _initializedClasses) exitWith {}; +// get hitPoints to ignore +private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); + // get all hitpoints and selections (getAllHitPointsDamage _vehicle) params [["_hitPoints", []], ["_hitSelections", []]]; // Since 1.82 these are all lower case @@ -40,8 +47,6 @@ private _icon = ["a3\ui_f\data\igui\cfg\actions\repair_ca.paa", "#FFFFFF"]; private _vehCfg = configOf _vehicle; // Custom position can be defined via config for associated hitpoint private _hitpointPositions = getArray (_vehCfg >> QGVAR(hitpointPositions)); -// Associated hitpoints can be grouped via config to produce a single repair action -private _hitpointGroups = getArray (_vehCfg >> QGVAR(hitpointGroups)); // Get turret paths private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehicle, "commander", true])) apply {_x # 3}; @@ -52,18 +57,10 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi // Wheels should always be unique if (_selection in _processedSelections) exitWith {TRACE_3("Duplicate Wheel",_hitpoint,_forEachIndex,_selection);}; - private _position = compile format ["_target selectionPosition ['%1', 'HitPoints'];", _selection]; + private _position = compile format ["_target selectionPosition ['%1', 'HitPoints', 'AveragePoint'];", _selection]; TRACE_3("Adding Wheel Actions",_hitpoint,_forEachIndex,_selection); - // An action to remove the wheel is required - private _name = format ["Remove_%1_%2", _forEachIndex, _hitpoint]; - private _text = localize LSTRING(RemoveWheel); - private _condition = {[_this select 1, _this select 0, _this select 2 select 0, "RemoveWheel"] call DFUNC(canRepair)}; - private _statement = {[_this select 1, _this select 0, _this select 2 select 0, "RemoveWheel"] call DFUNC(repair)}; - private _action = [_name, _text, _icon, _statement, _condition, {}, [_hitpoint], _position, 2, nil, FUNC(modifySelectionInteraction)] call EFUNC(interact_menu,createAction); - [_type, 0, [], _action] call EFUNC(interact_menu,addActionToClass); - // An action to replace the wheel is required _name = format ["Replace_%1_%2", _forEachIndex, _hitpoint]; _text = localize LSTRING(ReplaceWheel); @@ -72,61 +69,56 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi _action = [_name, _text, _icon, _statement, _condition, {}, [_hitpoint], _position, 2] call EFUNC(interact_menu,createAction); [_type, 0, [], _action] call EFUNC(interact_menu,addActionToClass); + // Create a wheel interaction + private _root = format ["Wheel_%1_%2", _forEachIndex, _hitpoint]; + private _action = [_root, localize LSTRING(Wheel), ["","#FFFFFF"], {}, {true}, {}, [_hitpoint], _position, 2, nil, LINKFUNC(modifySelectionInteraction)] call EFUNC(interact_menu,createAction); + [_type, 0, [], _action] call EFUNC(interact_menu,addActionToClass); + + // An action to remove the wheel is required + private _name = format ["Remove_%1_%2", _forEachIndex, _hitpoint]; + private _text = localize LSTRING(RemoveWheel); + private _condition = {[_this select 1, _this select 0, _this select 2 select 0, "RemoveWheel"] call DFUNC(canRepair)}; + private _statement = {[_this select 1, _this select 0, _this select 2 select 0, "RemoveWheel"] call DFUNC(repair)}; + private _action = [_name, _text, _icon, _statement, _condition, {}, [_hitpoint], _position, 2] call EFUNC(interact_menu,createAction); + [_type, 0, [_root], _action] call EFUNC(interact_menu,addActionToClass); + + // An action to patch the wheel is required. + private _name = format ["Patch_%1_%2", _forEachIndex, _hitpoint]; + private _patchIcon = QPATHTOF(ui\patch_ca.paa); + private _text = localize LSTRING(PatchWheel); + private _condition = {("vehicle" in GVAR(patchWheelLocation)) && {[_this select 1, _this select 0, _this select 2 select 0, "PatchWheel"] call DFUNC(canRepair)}}; + private _statement = {[_this select 1, _this select 0, _this select 2 select 0, "PatchWheel"] call DFUNC(repair)}; + private _action = [_name, _text, _patchIcon, _statement, _condition, {}, [_hitpoint], _position, 2] call EFUNC(interact_menu,createAction); + [_type, 0, [_root], _action] call EFUNC(interact_menu,addActionToClass); + _processedSelections pushBack _selection; } else { - // 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); }; - // 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); }; + // Skip ignored hitpoints + if (_hitpoint in _hitPointsToIgnore) exitWith { + TRACE_3("Skipping ignored hitpoint",_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 isNotEqualTo []) exitWith { - TRACE_2("turret hitpoint configFound",_hitpoint,_x); - // only do turret hitpoints or stuff linked to visuals for now or we apparently get some weird stuff - if ((_hitpoint in ["hitturret", "hitgun"]) || {(getNumber (_hitpointsCfg # 0 >> "isGun")) == 1} || {(getNumber (_hitpointsCfg # 0 >> "isTurret")) == 1} || {(getText (_hitpointsCfg # 0 >> "visual")) != ""}) then { + private _hitpointsCfg = "configName _x == _hitpoint" configClasses (_vehCfg >> "HitPoints"); + if (_hitpointsCfg isNotEqualTo []) then { + _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); + }; + if (_armorComponent == "") then { + { + private _turretHitpointCfg = ([_vehCfg, _x] call CBA_fnc_getTurret) >> "HitPoints"; + private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg; + if (_hitpointsCfg isNotEqualTo []) exitWith { + TRACE_2("turret hitpoint configFound",_hitpoint,_x); _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); }; - }; - } forEach _turretPaths; - if (_armorComponent == "") then { - private _hitpointsCfg = "configName _x == _hitpoint" configClasses (_vehCfg >> "HitPoints"); - if ((getText (_hitpointsCfg # 0 >> "visual")) != "") 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 (_vehCfg >> "HitPoints" >> _hitpoint >> "depends")) in ["", "0"])) exitWith { - TRACE_3("Skip Depends",_hitpoint,_forEachIndex,_selection); - }; - - private _childHitPoint = false; - { - { - if (_hitpoint == _x) exitWith { - _childHitPoint = true; - }; - } forEach (_x select 1); - } forEach _hitpointGroups; - // If the current selection is associated with a child hitpoint, then skip - if (_childHitPoint) exitWith { TRACE_3("childHitpoint",_hitpoint,_forEachIndex,_selection); }; // Find the action position private _position = compile format ["_target selectionPosition ['%1', 'HitPoints'];", _selection]; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index c83397ed4b..0f2a5c26cc 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds spare parts to the vehicle. Before SettingsInitialized only collect for later execution. diff --git a/addons/repair/functions/fnc_canMiscRepair.sqf b/addons/repair/functions/fnc_canMiscRepair.sqf index 2fc4c2b3d6..d5e55c5a13 100644 --- a/addons/repair/functions/fnc_canMiscRepair.sqf +++ b/addons/repair/functions/fnc_canMiscRepair.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Check if misc repair action can be done, called from callbackSuccess. diff --git a/addons/repair/functions/fnc_canPatchRemovedWheel.sqf b/addons/repair/functions/fnc_canPatchRemovedWheel.sqf new file mode 100644 index 0000000000..261b3e5699 --- /dev/null +++ b/addons/repair/functions/fnc_canPatchRemovedWheel.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: commy2, Brett Mayson + * Check if the unit can patch a wheel not on a vehicle. + * + * Arguments: + * 0: Unit that does the patching + * 1: Wheel to patch + * + * Return Value: + * Can patch wheel? + * + * Example: + * [unit, vehicle] call ace_repair_fnc_canPatchRemovedWheel + * + * Public: No + */ + +params ["_unit", "_target"]; +TRACE_2("params",_unit,_target); + +if (GVAR(patchWheelEnabled) == -1) exitWith {false}; +if !("ground" in GVAR(patchWheelLocation)) exitWith {false}; +if ((GVAR(patchWheelRequiredItems) isEqualTo [ANY_TOOLKIT_FAKECLASS]) && {!([_unit, [GVAR(allToolKits)]] call FUNC(hasItems))}) exitWith {false}; +if !([_unit, GVAR(patchWheelEnabled)] call FUNC(isEngineer)) exitWith {false}; + +(damage _target > GVAR(patchWheelMaximumRepair)) diff --git a/addons/repair/functions/fnc_canPatchWheel.sqf b/addons/repair/functions/fnc_canPatchWheel.sqf new file mode 100644 index 0000000000..0338f05729 --- /dev/null +++ b/addons/repair/functions/fnc_canPatchWheel.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" +/* + * Author: commy2, Brett Mayson + * Check if the unit can patch given wheel of the vehicle. + * + * Arguments: + * 0: Unit that does the patching + * 1: Vehicle to patch + * 2: Selected wheel hitpoint + * + * Return Value: + * Can patch wheel? + * + * Example: + * [unit, vehicle, "hitpoint"] call ace_repair_fnc_canPatchWheel + * + * Public: No + */ + +params ["_unit", "_target", "_hitPoint"]; +TRACE_3("params",_unit,_target,_hitPoint); + +if (GVAR(patchWheelEnabled) == -1) exitWith {false}; + +private _damage = _target getHitPointDamage _hitPoint; + +if (_damage == 1) exitWith {false}; + +if !([_unit, _target, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith {false}; + +(_damage > GVAR(patchWheelMaximumRepair)) diff --git a/addons/repair/functions/fnc_canRemove.sqf b/addons/repair/functions/fnc_canRemove.sqf index 77fc7b0eb4..b487964535 100644 --- a/addons/repair/functions/fnc_canRemove.sqf +++ b/addons/repair/functions/fnc_canRemove.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can remove given wheel/track of the vehicle. diff --git a/addons/repair/functions/fnc_canRepair.sqf b/addons/repair/functions/fnc_canRepair.sqf index e6873649cb..264baf9ef0 100644 --- a/addons/repair/functions/fnc_canRepair.sqf +++ b/addons/repair/functions/fnc_canRepair.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if the repair action can be performed. @@ -37,12 +37,7 @@ 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 missionNamespace variable -private _items = if (isArray (_config >> "items")) then { - getArray (_config >> "items"); -} else { - missionNamespace getVariable [getText (_config >> "items"), []] -}; +private _items = _config call FUNC(getRepairItems); if (count _items > 0 && {!([_caller, _items] call FUNC(hasItems))}) exitWith {false}; private _return = true; diff --git a/addons/repair/functions/fnc_canRepairTrack.sqf b/addons/repair/functions/fnc_canRepairTrack.sqf index 8559ff1a9c..1ee88d373e 100644 --- a/addons/repair/functions/fnc_canRepairTrack.sqf +++ b/addons/repair/functions/fnc_canRepairTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can replace given track of the vehicle. diff --git a/addons/repair/functions/fnc_canReplaceTrack.sqf b/addons/repair/functions/fnc_canReplaceTrack.sqf index d975c60efb..abafa79835 100644 --- a/addons/repair/functions/fnc_canReplaceTrack.sqf +++ b/addons/repair/functions/fnc_canReplaceTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can replace given track of the vehicle. diff --git a/addons/repair/functions/fnc_canReplaceWheel.sqf b/addons/repair/functions/fnc_canReplaceWheel.sqf index 54e8e8cdf6..dae0a0e9d4 100644 --- a/addons/repair/functions/fnc_canReplaceWheel.sqf +++ b/addons/repair/functions/fnc_canReplaceWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Check if the unit can replace given wheel of the vehicle. diff --git a/addons/repair/functions/fnc_doFullRepair.sqf b/addons/repair/functions/fnc_doFullRepair.sqf index fb248e6a2f..5027fcf280 100644 --- a/addons/repair/functions/fnc_doFullRepair.sqf +++ b/addons/repair/functions/fnc_doFullRepair.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Fully repairs vehicle. diff --git a/addons/repair/functions/fnc_doPatchWheelProgress.sqf b/addons/repair/functions/fnc_doPatchWheelProgress.sqf new file mode 100644 index 0000000000..4d9b84ebc2 --- /dev/null +++ b/addons/repair/functions/fnc_doPatchWheelProgress.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" +/* + * Author: commy2, Brett Mayson + * Called by repair action / progress bar. Raise events to set the new hitpoint damage. + * + * Arguments: + * 0: Unit that does the patching + * 1: Vehicle to patch + * 2: Selected wheel hitpoint + * + * Return Value: + * Should patching continue? + * + * Example: + * [unit, vehicle, "hitpoint"] call ace_repair_fnc_doPatchWheelProgress + * + * Public: No + */ + +params ["_args", "_elapsedTime", "_totalTime"]; +_args params ["_unit", "_vehicle", "_hitPoint"]; +TRACE_3("params",_unit,_vehicle,_hitPoint); + +// get current hitpoint damage +private _hitPointDamage = _vehicle getHitPointDamage _hitPoint; + +private _iterationsRemaining = ceil ((_hitPointDamage - GVAR(patchWheelMaximumRepair)) / PATCH_WHEEL_STEP_TIME) - 1; +if ((_totalTime - _elapsedTime) > _iterationsRemaining * GVAR(patchWheelTime)) exitWith {true}; + +_hitPointDamage = (_hitPointDamage - PATCH_WHEEL_STEP_TIME) max GVAR(patchWheelMaximumRepair); + +// raise event to set the new hitpoint damage +[QGVAR(setWheelHitPointDamage), [_vehicle, _hitPoint, _hitPointDamage], _vehicle] call CBA_fnc_targetEvent; + +(_hitPointDamage > GVAR(patchWheelMaximumRepair)) diff --git a/addons/repair/functions/fnc_doRemoveTrack.sqf b/addons/repair/functions/fnc_doRemoveTrack.sqf index d15993752f..6e882061ce 100644 --- a/addons/repair/functions/fnc_doRemoveTrack.sqf +++ b/addons/repair/functions/fnc_doRemoveTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called by repair action / progress bar. Raise events to set the new hitpoint damage. diff --git a/addons/repair/functions/fnc_doRemoveWheel.sqf b/addons/repair/functions/fnc_doRemoveWheel.sqf index 127859a5b9..4715bf080f 100644 --- a/addons/repair/functions/fnc_doRemoveWheel.sqf +++ b/addons/repair/functions/fnc_doRemoveWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called by repair action / progress bar. Raise events to set the new hitpoint damage. diff --git a/addons/repair/functions/fnc_doRepair.sqf b/addons/repair/functions/fnc_doRepair.sqf index 1b6f497d8e..d02ab33fb7 100644 --- a/addons/repair/functions/fnc_doRepair.sqf +++ b/addons/repair/functions/fnc_doRepair.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called by repair action / progress bar. Raise events to set the new hitpoint damage. @@ -7,6 +7,7 @@ * 0: Unit that does the repairing * 1: Vehicle to repair * 2: Selected hitpointIndex + * 3: Repair action classname * * Return Value: * None @@ -17,10 +18,11 @@ * Public: No */ -params ["_unit", "_vehicle", "_hitPointIndex"]; -TRACE_3("params",_unit,_vehicle,_hitPointIndex); +params ["_unit", "_vehicle", "_hitPointIndex", "_action"]; +TRACE_4("params",_unit,_vehicle,_hitPointIndex,_action); -private _postRepairDamageMin = [_unit] call FUNC(getPostRepairDamage); +// override minimum damage if doing full repair +private _postRepairDamageMin = [_unit, _action isEqualTo "fullRepair"] call FUNC(getPostRepairDamage); (getAllHitPointsDamage _vehicle) params ["_allHitPoints"]; private _hitPointClassname = _allHitPoints select _hitPointIndex; diff --git a/addons/repair/functions/fnc_doRepairTrack.sqf b/addons/repair/functions/fnc_doRepairTrack.sqf index 71d06b60f2..a970488268 100644 --- a/addons/repair/functions/fnc_doRepairTrack.sqf +++ b/addons/repair/functions/fnc_doRepairTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Called by repair action / progress bar. Raise events to set the new hitpoint damage. diff --git a/addons/repair/functions/fnc_doReplaceTrack.sqf b/addons/repair/functions/fnc_doReplaceTrack.sqf index 60dd486f44..d52072b647 100644 --- a/addons/repair/functions/fnc_doReplaceTrack.sqf +++ b/addons/repair/functions/fnc_doReplaceTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Replaces a track. diff --git a/addons/repair/functions/fnc_doReplaceWheel.sqf b/addons/repair/functions/fnc_doReplaceWheel.sqf index e42c7cabf2..98c3d95cf9 100644 --- a/addons/repair/functions/fnc_doReplaceWheel.sqf +++ b/addons/repair/functions/fnc_doReplaceWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Repairs a vehicle's wheel with a ACE_wheel spare part object. diff --git a/addons/repair/functions/fnc_fullRepairProgress.sqf b/addons/repair/functions/fnc_fullRepairProgress.sqf new file mode 100644 index 0000000000..b5b11b4d9b --- /dev/null +++ b/addons/repair/functions/fnc_fullRepairProgress.sqf @@ -0,0 +1,50 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Handles full repair by periodically repairing damaged hitpoints. + * + * Arguments: + * 0: Arguments + * 0: Engineer + * 1: Vehicle + * 2: Hitpoint (unused) + * 3: Repair action classname + * 1: Elapsed Time + * 2: Total Time + * + * Return Value: + * Continue Repair + * + * Example: + * [[objNull, player], 5, 10] call ace_repair_fnc_fullRepairProgress + * + * Public: No + */ + +params ["_args", "_elapsedTime", "_totalTime"]; +_args params ["_engineer", "_vehicle", "", "_action"]; + +if !((alive _vehicle) && {(abs speed _vehicle) < 1}) exitWith {false}; // make sure vehicle doesn't drive off + +// Not enough time has elapsed to repair a hitpoint +if (_totalTime - _elapsedTime > ([_engineer, _vehicle] call FUNC(getFullRepairTime)) - (GVAR(miscRepairTime) * GVAR(timeCoefficientFullRepair))) exitWith {true}; + +private _allHitPointsDamage = getAllHitPointsDamage _vehicle; +_allHitPointsDamage params ["_hitPoints", "", "_damageValues"]; + +private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); + +private _firstDamagedIndex = { + private _hitPoint = _hitPoints select _forEachIndex; + if (_x > 0 && {!(_hitPoint in _hitPointsToIgnore)}) exitWith {_forEachIndex}; + -1 +} forEach _damageValues; + +// Stop repairing if there are no more damaged hitpoints +// callBackSuccess to FUNC(doFullRepair) for ignored hitpoints +if (_firstDamagedIndex == -1) exitWith {true}; + +// Repair the first damaged hitpoint +[_engineer, _vehicle, _firstDamagedIndex, _action] call FUNC(doRepair); + +true diff --git a/addons/repair/functions/fnc_getClaimObjects.sqf b/addons/repair/functions/fnc_getClaimObjects.sqf index 2348cd82ce..be294d89db 100644 --- a/addons/repair/functions/fnc_getClaimObjects.sqf +++ b/addons/repair/functions/fnc_getClaimObjects.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns array of required nearby repair objects (wheels/tracks). diff --git a/addons/repair/functions/fnc_getFullRepairTime.sqf b/addons/repair/functions/fnc_getFullRepairTime.sqf new file mode 100644 index 0000000000..4c55ab940a --- /dev/null +++ b/addons/repair/functions/fnc_getFullRepairTime.sqf @@ -0,0 +1,42 @@ +#include "..\script_component.hpp" +/* + * Author: LinkIsGrim + * Calculates the Full Repair time based on the amount of hitpoints to repair + * + * Arguments: + * 0: Engineer + * 1: Vehicle + * + * Return Value: + * Repair Time + * + * Example: + * [player, vehicle] call ace_repair_fnc_getFullRepairTime + * + * Public: No + */ + +params ["_engineer", "_vehicle"]; + +private _allHitPointsDamage = getAllHitPointsDamage _vehicle; +_allHitPointsDamage params ["_hitPoints", "", "_damageValues"]; + +private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); + +private _repairsNeeded = 0; +private _doExtraRepair = false; +{ + if (_x <= 0) then {continue}; // skip hitpoints that don't need repairs + private _hitPoint = _hitPoints select _forEachIndex; + if (_hitPoint in _hitPointsToIgnore) then { // only add extra repair for ignore hitpoints if they're damaged + _doExtraRepair = true; + continue + }; + _repairsNeeded = _repairsNeeded + ceil (_x / 0.5); // repair is capped at 0.5 in FUNC(doRepair) +} forEach _damageValues; + +if (_doExtraRepair) then { + _repairsNeeded = _repairsNeeded + 1; +}; + +_repairsNeeded * GVAR(miscRepairTime) * GVAR(timeCoefficientFullRepair) // return diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf index 7439d35c12..7845dc7208 100644 --- a/addons/repair/functions/fnc_getHitPointString.sqf +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Finds the localized string of the given hitpoint name or uses default text if none found. diff --git a/addons/repair/functions/fnc_getHitPointsToIgnore.sqf b/addons/repair/functions/fnc_getHitPointsToIgnore.sqf new file mode 100644 index 0000000000..0db46db76f --- /dev/null +++ b/addons/repair/functions/fnc_getHitPointsToIgnore.sqf @@ -0,0 +1,139 @@ +#include "..\script_component.hpp" +/* + * Author: commy2, kymckay, LinkIsGrim + * Get list of vehicle hitpoints to ignore + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * HitPoints to ignore + * + * Example: + * [vehicle] call ace_repair_fnc_getHitpointsToIgnore + * + * Public: No + */ + +params ["_vehicle"]; + +private _type = typeOf _vehicle; +TRACE_2("getHitPointsToIgnore",_vehicle,_type); +private _initializedClasses = missionNamespace getVariable [QGVAR(hitPointsToIgnoreInitializedClasses), createHashMap]; +if (_type in _initializedClasses) exitWith {_initializedClasses get _type}; + +private _vehCfg = configOf _vehicle; +private _hitpointGroups = getArray (_vehCfg >> QGVAR(hitpointGroups)); +private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehicle, "commander", true])) apply {_x # 3}; + +(getAllHitPointsDamage _vehicle) params [["_hitPoints", []], ["_hitSelections", []]]; +// get hitpoints of wheels with their selections +([_vehicle] call FUNC(getWheelHitPointsWithSelections)) params ["_wheelHitPoints", "_wheelHitSelections"]; + +private _hitPointsToIgnore = [""]; // always ignore empty hitpoints +private _processedSelections = []; + +{ + private _selection = _x; + private _hitpoint = toLower (_hitPoints select _forEachIndex); + private _isWheelOrTrack = _selection in _wheelHitSelections || {_hitpoint in _wheelHitPoints} || {_hitpoint in TRACK_HITPOINTS}; + + if (_hitpoint isEqualTo "") then { // skip empty hitpoint + continue + }; + + if (_isWheelOrTrack && {_selection in _processedSelections || {_selection isEqualTo ""}}) then { // skip duplicate or empty selection wheel/track + TRACE_3("Skipping duplicate Wheel/Track or empty selection",_hitpoint,_forEachIndex,_selection); + /*#ifdef DEBUG_MODE_FULL + systemChat format ["Skipping duplicate wheel, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; + #endif*/ + _hitPointsToIgnore pushBackUnique _hitpoint; + _processedSelections pushBack _selection; + continue + }; + + if ("glass" in _hitpoint) then { // skip glass + TRACE_3("Skipping glass",_hitpoint,_forEachIndex,_selection); + /*#ifdef DEBUG_MODE_FULL + systemChat format ["Skipping glass, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; + #endif*/ + _hitPointsToIgnore pushBackUnique _hitpoint; + _processedSelections pushBack _selection; + continue + }; + + if (_hitpoint select [0,7] isEqualTo "hitera_" || {_hitpoint select [0,8] isEqualTo "hitslat_"} || {_hitpoint select [0,4] isEqualTo "era_"}) then { // skip era/slat + TRACE_3("Skipping ERA/Slat HitPoint",_hitpoint,_forEachIndex,_selection); + /*#ifdef DEBUG_MODE_FULL + systemChat format ["Skipping ERA/SLAT, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; + #endif*/ + _hitPointsToIgnore pushBackUnique _hitpoint; + _processedSelections pushBack _selection; + continue + }; + + private _armorComponent = ""; + if (_selection == "") then { // some hitpoints have empty selection but defined armor component (mostly RHS) + { + private _turretHitpointCfg = ([_vehCfg, _x] call CBA_fnc_getTurret) >> "HitPoints"; + private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg; + if (_hitpointsCfg isNotEqualTo []) exitWith { + TRACE_2("turret hitpoint configFound",_hitpoint,_x); + // only do turret hitpoints and stuff linked to visuals + if ((_hitpoint in ["hitturret", "hitgun"]) || {(getNumber (_hitpointsCfg # 0 >> "isGun")) == 1} || {(getNumber (_hitpointsCfg # 0 >> "isTurret")) == 1} || {(getText (_hitpointsCfg # 0 >> "visual")) != ""}) then { + _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); + }; + }; + } forEach _turretPaths; + if (_armorComponent == "") then { + private _hitpointsCfg = "configName _x == _hitpoint" configClasses (_vehCfg >> "HitPoints"); + if (_hitpointsCfg isNotEqualTo [] && {(getText (_hitpointsCfg # 0 >> "visual")) != ""}) then { + _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); + }; + }; + }; + + if ((_selection == "") && {_armorComponent == ""}) then { + TRACE_3("Skipping no selection OR armor component",_hitpoint,_forEachIndex,_selection); + /*#ifdef DEBUG_MODE_FULL + systemChat format ["Skipping no selection OR armor component, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; + #endif*/ + _hitPointsToIgnore pushBackUnique _hitpoint; + _processedSelections pushBack _selection; + continue + }; + + if (!(getText (_vehCfg >> "HitPoints" >> _hitpoint >> "depends") in ["", "0"])) then { // skip depends hitpoints, should be normalized by engine + TRACE_3("Skipping depends hitpoint",_hitpoint,_forEachIndex,_selection); + /*#ifdef DEBUG_MODE_FULL + systemChat format ["Skipping depends hitpoint, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; + #endif*/ + + private _groupIndex = _hitpointGroups findIf {_x # 0 == _hitpoint}; + if (_groupIndex != -1) then { + ERROR_2("[%1] hitpoint [%2] is both a group-parent and a depends and will be unrepairable",_type,_hitpoint); + ERROR_1("group: %1",_hitpointGroups # _groupIndex); + }; + + _hitPointsToIgnore pushBackUnique _hitpoint; + _processedSelections pushBack _selection; + continue + }; + + if (ANY_OF(_hitpointGroups, ANY_OF(_x select 1, _x == _hitpoint))) then { // skip child hitpoints + TRACE_3("Skipping child hitpoint",_hitpoint,_forEachIndex,_selection); + /*#ifdef DEBUG_MODE_FULL + systemChat format ["Skipping child hitpoint, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; + #endif*/ + _hitPointsToIgnore pushBackUnique _hitpoint; + _processedSelections pushBack _selection; + continue + }; + + _processedSelections pushBack _selection; +} forEach _hitSelections; + +_initializedClasses set [_type, _hitPointsToIgnore]; +missionNamespace setVariable [QGVAR(hitPointsToIgnoreInitializedClasses), _initializedClasses]; + +_hitPointsToIgnore diff --git a/addons/repair/functions/fnc_getPatchWheelTime.sqf b/addons/repair/functions/fnc_getPatchWheelTime.sqf new file mode 100644 index 0000000000..7406261e79 --- /dev/null +++ b/addons/repair/functions/fnc_getPatchWheelTime.sqf @@ -0,0 +1,25 @@ +#include "..\script_component.hpp" +/* + * Author: Brett Mayson + * Calculate the time to patch the wheel + * + * Arguments: + * 0: Unit that does the patching + * 1: Vehicle to patch + * 2: Selected wheel hitpoint + * + * Return Value: + * Patching time + * + * Example: + * [unit, vehicle, "hitpoint"] call ace_repair_fnc_getPatchWheelTime + * + * Public: No + */ + +params ["_unit", "_vehicle", "_hitPoint"]; + +// get current hitpoint damage +private _hitPointDamage = (_vehicle getHitPointDamage _hitPoint) - GVAR(patchWheelMaximumRepair); + +ceil (_hitPointDamage / PATCH_WHEEL_STEP_TIME) * GVAR(patchWheelTime) diff --git a/addons/repair/functions/fnc_getPostRepairDamage.sqf b/addons/repair/functions/fnc_getPostRepairDamage.sqf index cf0ff923bd..5135ba25a7 100644 --- a/addons/repair/functions/fnc_getPostRepairDamage.sqf +++ b/addons/repair/functions/fnc_getPostRepairDamage.sqf @@ -1,13 +1,14 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the damage threshold based on settings and unit type. * * Arguments: * 0: Unit that does the repairing + * 1: Override for full repair (default: false) * * Return Value: - * 0: Rpair Damage Threshold + * 0: Repair Damage Threshold * * Example: * [unit] call ace_repair_fnc_getPostRepairDamage @@ -15,11 +16,11 @@ * Public: No */ -params ["_unit"]; -TRACE_1("params",_unit); +params ["_unit", ["_override", false]]; +TRACE_2("params",_unit,_override); -//If in facility or near vehicle then complete repair of hitpoint: -if (([_unit] call FUNC(isInRepairFacility) || {[_unit] call FUNC(isNearRepairVehicle)})) exitWith {0}; +//If in facility, near vehicle, or doing full repair then complete repair of hitpoint: +if ((_override || {[_unit] call FUNC(isInRepairFacility)} || {[_unit] call FUNC(isNearRepairVehicle)})) exitWith {0}; private _class = _unit getVariable ["ACE_IsEngineer", getNumber (configOf _unit >> "engineer")]; //If advanced or more qualified than min, then use engineer threshold: diff --git a/addons/repair/functions/fnc_getRepairItems.sqf b/addons/repair/functions/fnc_getRepairItems.sqf new file mode 100644 index 0000000000..95eaffcf02 --- /dev/null +++ b/addons/repair/functions/fnc_getRepairItems.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" +/* + * Author: veteran29 + * Returns the items required for repair. + * + * Arguments: + * 0: Repair config + * + * Return Value: + * 0: Required items + * + * Example: + * [_config] call ace_repair_fnc_getRepairItems + * + * Public: No + */ + +params [["_config", configNull]]; + +// 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 { + missionNamespace getVariable [getText (_config >> "items"), []] +}; + +// handle "any toolkit" setting +if (_items isEqualTo [ANY_TOOLKIT_FAKECLASS]) then { + TRACE_1("any toolkit",_items); + + // array element inside items array means "any of these items" + _items = [GVAR(allToolKits)]; +}; + +TRACE_2("get repair items",_config,_items); + +_items diff --git a/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf b/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf index 9a5d32fdd9..1952707204 100644 --- a/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf +++ b/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Returns the wheel hitpoints and their selections. diff --git a/addons/repair/functions/fnc_hasItems.sqf b/addons/repair/functions/fnc_hasItems.sqf index 9b54647c8d..0eff622d20 100644 --- a/addons/repair/functions/fnc_hasItems.sqf +++ b/addons/repair/functions/fnc_hasItems.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if the engineer has all items. @@ -29,4 +29,4 @@ private _return = true; }; } forEach _items; -_return; +_return diff --git a/addons/repair/functions/fnc_isEngineer.sqf b/addons/repair/functions/fnc_isEngineer.sqf index 061c5addb1..2a013bccda 100644 --- a/addons/repair/functions/fnc_isEngineer.sqf +++ b/addons/repair/functions/fnc_isEngineer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, KoffeinFlummi, commy2 * Check if a unit is any engineer class. diff --git a/addons/repair/functions/fnc_isInRepairFacility.sqf b/addons/repair/functions/fnc_isInRepairFacility.sqf index 1693297494..7ea8ace60f 100644 --- a/addons/repair/functions/fnc_isInRepairFacility.sqf +++ b/addons/repair/functions/fnc_isInRepairFacility.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Checks if a unit is in a repair facility. @@ -10,33 +10,32 @@ * Is inside a repair facility * * Example: - * [unit] call ace_repair_fnc_isInRepairFacility + * player call ace_repair_fnc_isInRepairFacility * * Public: Yes */ -params [["_object", objNull, [objNull]]]; -TRACE_1("params",_object); +#define CHECK_OBJECTS(var) ((var) findIf _checkObject != -1) -private _position = getPosASL _object; -private _isInBuilding = false; +params [["_unit", objNull, [objNull]]]; +TRACE_1("params",_unit); private _checkObject = { - if ( - _x getVariable ["ACE_isRepairFacility", getNumber (configOf _x >> QGVAR(canRepair))] > 0 - && {!(_x isKindOf "AllVehicles")} // check if it's not repair vehicle - && {alive _x} - ) exitWith { - _isInBuilding = true; + private _config = configOf _x; + private _canRepair = getNumber (_config >> QGVAR(canRepair)); + if (_canRepair == 0) then { + _canRepair = getNumber (_config >> "transportRepair"); }; + + _x getVariable ["ACE_isRepairFacility", _canRepair > 0] in [1, true] // can be integer or boolean + && {!(_x isKindOf "AllVehicles")} // check if it's not repair vehicle + && {alive _x} }; -private _objects = (lineIntersectsWith [_object modelToWorldVisual [0, 0, (_position select 2)], _object modelToWorldVisual [0, 0, (_position select 2) +10], _object]); -_checkObject forEach _objects; +private _fnc_check = { + private _position = _unit modelToWorldVisual [0, 0, eyePos _unit select 2]; + CHECK_OBJECTS(lineIntersectsWith [ARR_3(_position, _position vectorAdd [ARR_3(0, 0, 10)], _unit)]) + || {CHECK_OBJECTS(_unit nearObjects 7.5)} +}; -if (_isInBuilding) exitWith {true}; - -_objects = _object nearObjects 7.5; -_checkObject forEach _objects; - -_isInBuilding +[[], _fnc_check, _unit, QGVAR(inRepairFacilityCache), IN_REPAIR_FACILITY_CACHE_EXPIRY] call EFUNC(common,cachedCall); diff --git a/addons/repair/functions/fnc_isNearRepairVehicle.sqf b/addons/repair/functions/fnc_isNearRepairVehicle.sqf index 1243c0f95b..d319273e64 100644 --- a/addons/repair/functions/fnc_isNearRepairVehicle.sqf +++ b/addons/repair/functions/fnc_isNearRepairVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi * Checks if a unit is near an engineering vehicle. @@ -15,14 +15,14 @@ * Public: Yes */ +#define CHECK_OBJECTS(var) ((var) findIf {alive _x && {[_x] call FUNC(isRepairVehicle)}} != -1) + params ["_unit"]; TRACE_1("params",_unit); -private _nearObjects = nearestObjects [_unit, ["Air", "LandVehicle", "Slingload_base_F"], 20]; +private _fnc_check = { + private _nearObjects = nearestObjects [_unit, ["Air", "LandVehicle", "Slingload_base_F"], 20]; + CHECK_OBJECTS(_nearObjects) +}; -private _return = false; -{ - if (alive _x && {[_x] call FUNC(isRepairVehicle)}) exitWith {_return = true;}; -} forEach _nearObjects; - -_return; +[[], _fnc_check, _unit, QGVAR(nearRepairVehicleCache), NEAR_REPAIR_VEHICLE_CACHE_EXPIRY] call EFUNC(common,cachedCall); diff --git a/addons/repair/functions/fnc_isRepairVehicle.sqf b/addons/repair/functions/fnc_isRepairVehicle.sqf index dd2f69f34c..0d89f1b8e8 100644 --- a/addons/repair/functions/fnc_isRepairVehicle.sqf +++ b/addons/repair/functions/fnc_isRepairVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Check if vehicle is a engineering vehicle. @@ -10,7 +10,7 @@ * Is engineering vehicle * * Example: - * [vehicle] call ace_repair_fnc_isRepairVehicle + * cursorObject call ace_repair_fnc_isRepairVehicle * * Public: Yes */ @@ -20,6 +20,11 @@ TRACE_1("params",_vehicle); if (_vehicle isKindOf "CAManBase") exitWith {false}; +private _config = configOf _vehicle; +private _canRepair = getNumber (_config >> QGVAR(canRepair)); +if (_canRepair == 0) then { + _canRepair = getNumber (_config >> "transportRepair"); +}; // Value can be integer or boolean -private _value = _vehicle getVariable ["ACE_isRepairVehicle", getNumber (configOf _vehicle >> QGVAR(canRepair))]; +private _value = _vehicle getVariable ["ACE_isRepairVehicle", _canRepair > 0]; _value in [1, true] // return diff --git a/addons/repair/functions/fnc_modifyInteraction.sqf b/addons/repair/functions/fnc_modifyInteraction.sqf index 235afd9223..7bf77d462d 100644 --- a/addons/repair/functions/fnc_modifyInteraction.sqf +++ b/addons/repair/functions/fnc_modifyInteraction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Modifies the base interaction point for repair items to show its current damage. @@ -24,4 +24,4 @@ params ["_target", "", "", "_actionData"]; private _color = ceil linearConversion [0, 1, damage _target, 0, 8, true]; TRACE_2("Modifying icon color",_target,_color); (_actionData select 2) set [1, DAMAGE_COLOR_SCALE select _color]; - + diff --git a/addons/repair/functions/fnc_modifySelectionInteraction.sqf b/addons/repair/functions/fnc_modifySelectionInteraction.sqf index 66d7ae5e4b..6e7d2af41a 100644 --- a/addons/repair/functions/fnc_modifySelectionInteraction.sqf +++ b/addons/repair/functions/fnc_modifySelectionInteraction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654, mharis001 * Modifies interaction icon color of vehicle selection to show its current damage. diff --git a/addons/repair/functions/fnc_moduleAddSpareParts.sqf b/addons/repair/functions/fnc_moduleAddSpareParts.sqf index a70f821ffc..bccccdcc22 100644 --- a/addons/repair/functions/fnc_moduleAddSpareParts.sqf +++ b/addons/repair/functions/fnc_moduleAddSpareParts.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds spare parts to a vehicle. diff --git a/addons/repair/functions/fnc_moduleAssignEngineer.sqf b/addons/repair/functions/fnc_moduleAssignEngineer.sqf index 1949da087a..2789d4da07 100644 --- a/addons/repair/functions/fnc_moduleAssignEngineer.sqf +++ b/addons/repair/functions/fnc_moduleAssignEngineer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Assign an engineer role to a unit. diff --git a/addons/repair/functions/fnc_moduleAssignRepairFacility.sqf b/addons/repair/functions/fnc_moduleAssignRepairFacility.sqf index c071058ad6..71e5ad0d74 100644 --- a/addons/repair/functions/fnc_moduleAssignRepairFacility.sqf +++ b/addons/repair/functions/fnc_moduleAssignRepairFacility.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Assign a repair facility. diff --git a/addons/repair/functions/fnc_moduleAssignRepairVehicle.sqf b/addons/repair/functions/fnc_moduleAssignRepairVehicle.sqf index 4f5c601cce..c2bbb7db48 100644 --- a/addons/repair/functions/fnc_moduleAssignRepairVehicle.sqf +++ b/addons/repair/functions/fnc_moduleAssignRepairVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Assign a repair vehicle. diff --git a/addons/repair/functions/fnc_moduleRepairSettings.sqf b/addons/repair/functions/fnc_moduleRepairSettings.sqf index 831b9a2619..66c372e146 100644 --- a/addons/repair/functions/fnc_moduleRepairSettings.sqf +++ b/addons/repair/functions/fnc_moduleRepairSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Adjusts repair damage settings. diff --git a/addons/repair/functions/fnc_normalizeHitPoints.sqf b/addons/repair/functions/fnc_normalizeHitPoints.sqf index aef2b7ae21..9abeec718c 100644 --- a/addons/repair/functions/fnc_normalizeHitPoints.sqf +++ b/addons/repair/functions/fnc_normalizeHitPoints.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Used to normalize dependant hitpoints. May overwrite some global variables that are named like hitpoints or "Total" though... diff --git a/addons/repair/functions/fnc_patchRemovedWheel.sqf b/addons/repair/functions/fnc_patchRemovedWheel.sqf new file mode 100644 index 0000000000..b0978013d5 --- /dev/null +++ b/addons/repair/functions/fnc_patchRemovedWheel.sqf @@ -0,0 +1,39 @@ +#include "..\script_component.hpp" +/* + * Author: Brett Mayson + * Patch a wheel that is not on a vehicle + * + * Arguments: + * 0: Unit that does the patching + * 1: Wheel to patch + * + * Return Value: + * None + * + * Example: + * [unit, vehicle] call ace_repair_fnc_patchRemovedWheel + * + * Public: No + */ + +params ["_unit", "_target"]; + +[_unit, "Acts_carFixingWheel"] call EFUNC(common,doAnimation); + +private _wheelDamage = (damage _target) - GVAR(patchWheelMaximumRepair); + +[ceil (_wheelDamage / 0.05) * GVAR(patchWheelTime), [_target], {}, {}, LLSTRING(PatchingWheel), { + params ["_args"]; + _args params ["_target"]; + private _damage = damage _target; + + private _iterationsRemaining = ceil ((_damage - GVAR(patchWheelMaximumRepair)) / 0.05) - 1; + if ((_totalTime - _elapsedTime) > _iterationsRemaining * GVAR(patchWheelTime)) exitWith {true}; + + _damage = (_damage - 0.05) max GVAR(patchWheelMaximumRepair); + + _target setDamage _damage; + + _damage > GVAR(patchWheelMaximumRepair) +}] call ace_common_fnc_progressBar; + diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 12cc2c3946..23e5172426 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, KoffeinFlummi * Starts the repair process. @@ -43,12 +43,7 @@ if ((isEngineOn _target) && {!GVAR(autoShutOffEngineWhenStartingRepair)}) exitWi false }; -// 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 { - missionNamespace getVariable [getText (_config >> "items"), []] -}; +private _items = _config call FUNC(getRepairItems); if (count _items > 0 && {!([_caller, _items] call FUNC(hasItems))}) exitWith {false}; private _return = true; @@ -137,7 +132,7 @@ if (_callbackProgress == "") then { _callbackProgress = { (_this select 0) params ["_caller", "_target", "", "", "", "", "_claimObjectsAvailable"]; ( - (alive _target) && + (alive _target) && {(abs speed _target) < 1} && // make sure vehicle doesn't drive off {_claimObjectsAvailable findIf {!alive _x || {_x getVariable [QEGVAR(common,owner), objNull] isNotEqualTo _caller}} == -1} // make sure claim objects are still available ) @@ -153,6 +148,7 @@ if (_callbackProgress == "") then { // Player Animation private _callerAnim = [getText (_config >> "animationCaller"), getText (_config >> "animationCallerProne")] select (stance _caller == "PRONE"); +private _loopAnim = (getNumber (_config >> "loopAnimation")) isEqualTo 1; _caller setVariable [QGVAR(selectedWeaponOnrepair), currentWeapon _caller]; // Cannot use secondairy weapon for animation @@ -176,10 +172,27 @@ if (vehicle _caller == _caller && {_callerAnim != ""}) then { } else { _caller setVariable [QGVAR(repairPrevAnimCaller), animationState _caller]; }; + _caller setVariable [QGVAR(repairCurrentAnimCaller), toLower _callerAnim]; [_caller, _callerAnim] call EFUNC(common,doAnimation); }; }; +if (_loopAnim) then { + private _animDoneEh = _caller addEventHandler ["AnimDone", { + params ["_caller", "_anim"]; + if (_anim isEqualTo (_caller getVariable [QGVAR(repairCurrentAnimCaller), ""])) then { + [{ + params ["_caller", "_anim"]; + if !(isNil {_caller getVariable QGVAR(repairCurrentAnimCaller)}) then { + TRACE_2("loop",_caller,_anim); + _this call EFUNC(common,doAnimation) + }; + }, [_caller, _anim], 2.5] call CBA_fnc_waitAndExecute; + }; + }]; + _caller setVariable [QGVAR(repairLoopAnimEh), _animDoneEh]; +}; + private _soundPosition = _caller modelToWorldVisualWorld (_caller selectionPosition "RightHand"); ["Acts_carFixingWheel", _soundPosition, nil, 50] call EFUNC(common,playConfigSound3D); @@ -218,7 +231,10 @@ private _hitPointClassname = if (_hitPoint isEqualType "") then { }; private _processText = getText (_config >> "displayNameProgress"); private _backupText = format [localize LSTRING(RepairingHitPoint), _hitPointClassname]; -([_hitPointClassname, _processText, _backupText] call FUNC(getHitPointString)) params ["_text"]; +private _text = _processText; +if (getNumber (_config >> "forceDisplayName") isNotEqualTo 1) then { + _text = ([_hitPointClassname, _processText, _backupText] call FUNC(getHitPointString)) select 0; +}; TRACE_4("display",_hitPoint,_hitPointClassname,_processText,_text); diff --git a/addons/repair/functions/fnc_repair_failure.sqf b/addons/repair/functions/fnc_repair_failure.sqf index 83cce85e0d..ce8d29b25d 100644 --- a/addons/repair/functions/fnc_repair_failure.sqf +++ b/addons/repair/functions/fnc_repair_failure.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Glowbal * Callback when repair fails. @@ -29,9 +29,13 @@ TRACE_5("params",_caller,_target,_selectionName,_className,_usersOfItems); if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; }; + +_caller removeEventHandler ["AnimDone", _caller getVariable [QGVAR(repairLoopAnimEh), -1]]; +_caller setVariable [QGVAR(repairLoopAnimEh), nil]; if (vehicle _caller == _caller && {!(_caller call EFUNC(common,isSwimming))}) then { [_caller, _caller getVariable [QGVAR(repairPrevAnimCaller), ""], 2] call EFUNC(common,doAnimation); }; +_caller setVariable [QGVAR(repairCurrentAnimCaller), nil]; _caller setVariable [QGVAR(repairPrevAnimCaller), nil]; private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnrepair), ""]); diff --git a/addons/repair/functions/fnc_repair_success.sqf b/addons/repair/functions/fnc_repair_success.sqf index a86be84244..083daa6cc7 100644 --- a/addons/repair/functions/fnc_repair_success.sqf +++ b/addons/repair/functions/fnc_repair_success.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Glowbal * Callback when repair completes. @@ -29,9 +29,13 @@ TRACE_4("params",_caller,_target,_selectionName,_className); if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; }; + +_caller removeEventHandler ["AnimDone", _caller getVariable [QGVAR(repairLoopAnimEh), -1]]; +_caller setVariable [QGVAR(repairLoopAnimEh), nil]; if (vehicle _caller == _caller && {!(_caller call EFUNC(common,isSwimming))}) then { [_caller, _caller getVariable [QGVAR(repairPrevAnimCaller), ""], 2] call EFUNC(common,doAnimation); }; +_caller setVariable [QGVAR(repairCurrentAnimCaller), nil]; _caller setVariable [QGVAR(repairPrevAnimCaller), nil]; private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnrepair), ""]); diff --git a/addons/repair/functions/fnc_setDamage.sqf b/addons/repair/functions/fnc_setDamage.sqf index 13549ca54d..3c7e23dc76 100644 --- a/addons/repair/functions/fnc_setDamage.sqf +++ b/addons/repair/functions/fnc_setDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Sets the structural damage of a vehicle without altering the hitPoints, requires local vehicle. @@ -6,7 +6,7 @@ * Arguments: * 0: Local Vehicle to Damage * 1: Total Damage - # 2: Use destruction effects + * 2: Use destruction effects * * Return Value: * None diff --git a/addons/repair/functions/fnc_setHitPointDamage.sqf b/addons/repair/functions/fnc_setHitPointDamage.sqf index 197918ffe3..9a28adc211 100644 --- a/addons/repair/functions/fnc_setHitPointDamage.sqf +++ b/addons/repair/functions/fnc_setHitPointDamage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Set the hitpoint damage and change the structural damage acordingly, requires local vehicle. diff --git a/addons/repair/functions/fnc_spawnObject.sqf b/addons/repair/functions/fnc_spawnObject.sqf index 9dce6a7e01..7dc5f96219 100644 --- a/addons/repair/functions/fnc_spawnObject.sqf +++ b/addons/repair/functions/fnc_spawnObject.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Spawns an object of specified string, at specified position with specified damage taken. diff --git a/addons/repair/functions/fnc_useItem.sqf b/addons/repair/functions/fnc_useItem.sqf index 760be7a39b..2827d7afb9 100644 --- a/addons/repair/functions/fnc_useItem.sqf +++ b/addons/repair/functions/fnc_useItem.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Use Equipment if any is available. diff --git a/addons/repair/functions/fnc_useItems.sqf b/addons/repair/functions/fnc_useItems.sqf index b6da87aecc..edc18bcb16 100644 --- a/addons/repair/functions/fnc_useItems.sqf +++ b/addons/repair/functions/fnc_useItems.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Use Equipment items if any is available. diff --git a/addons/repair/functions/script_component.hpp b/addons/repair/functions/script_component.hpp deleted file mode 100644 index 80a7b2eb74..0000000000 --- a/addons/repair/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\repair\script_component.hpp" diff --git a/addons/repair/initSettings.sqf b/addons/repair/initSettings.sqf index 5f2f98a763..3ba13e9ee6 100644 --- a/addons/repair/initSettings.sqf +++ b/addons/repair/initSettings.sqf @@ -1,7 +1,19 @@ +private _category = format ["ACE %1", LLSTRING(Repair)]; + +[ + QGVAR(enabled), "CHECKBOX", + ELSTRING(common,Enabled), + _category, + true, + true, + {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true +] call CBA_fnc_addSetting; + [ QGVAR(displayTextOnRepair), "CHECKBOX", [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, true, // default value false, // isGlobal {[QGVAR(displayTextOnRepair), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -10,7 +22,7 @@ [ QGVAR(engineerSetting_repair), "LIST", [LSTRING(engineerSetting_Repair_name), LSTRING(engineerSetting_Repair_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],1], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(engineerSetting_repair), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -19,17 +31,43 @@ [ QGVAR(engineerSetting_wheel), "LIST", [LSTRING(engineerSetting_Wheel_name), LSTRING(engineerSetting_Wheel_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(engineerSetting_wheel), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; +[ + QGVAR(patchWheelEnabled), "LIST", + [LSTRING(patchWheelEnabled_name), LSTRING(patchWheelEnabled_description)], + _category, + [[-1,0,1,2],["str_player_none", LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],1], // default value + true // isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(patchWheelRequiredItems), + "LIST", + [LSTRING(patchWheelRequiredItems_DisplayName), LSTRING(patchWheelRequiredItems_Description)], + _category, + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(patchWheelLocation), + "LIST", + [LSTRING(patchWheelLocation_DisplayName), LSTRING(patchWheelLocation_Description)], + _category, + [[["ground", "vehicle"], ["vehicle"], ["ground"]], ["str_difficulty_any", LSTRING(patchWheelOnVehicle), LSTRING(patchWheelOnGround)], 0], + true +] call CBA_fnc_addSetting; + [ QGVAR(repairDamageThreshold), "SLIDER", [LSTRING(repairDamageThreshold_name), LSTRING(repairDamageThreshold_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [0,1,0.6,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + _category, + [0, 1, 0.6, 1, true], true, // isGlobal {[QGVAR(repairDamageThreshold), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; @@ -37,8 +75,8 @@ [ QGVAR(repairDamageThreshold_engineer), "SLIDER", [LSTRING(repairDamageThreshold_Engineer_name), LSTRING(repairDamageThreshold_Engineer_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [0,1,0.4,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + _category, + [0, 1, 0.4, 1, true], true, // isGlobal {[QGVAR(repairDamageThreshold_engineer), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; @@ -46,7 +84,7 @@ [ QGVAR(consumeItem_toolKit), "LIST", // fnc_repair expects number [LSTRING(consumeItem_ToolKit_name), LSTRING(consumeItem_ToolKit_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, [[0,1],[ELSTRING(common,No), ELSTRING(common,Yes)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(consumeItem_toolKit), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -56,7 +94,7 @@ QGVAR(locationsBoostTraining), "CHECKBOX", [ELSTRING(common,LocationsBoostTraining_DisplayName), LSTRING(LocationsBoostTraining_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, false, true ] call CBA_fnc_addSetting; @@ -64,7 +102,7 @@ [ QGVAR(fullRepairLocation), "LIST", [LSTRING(fullRepairLocation), LSTRING(fullRepairLocation_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, [[0,1,2,3,4],[LSTRING(useAnywhere), LSTRING(repairVehicleOnly), LSTRING(repairFacilityOnly), LSTRING(vehicleAndFacility), ELSTRING(common,Disabled)],2], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(fullRepairLocation), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -73,16 +111,24 @@ [ QGVAR(engineerSetting_fullRepair), "LIST", [LSTRING(engineerSetting_fullRepair_name), LSTRING(engineerSetting_fullRepair_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],2], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(engineerSetting_fullRepair), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; +[ + QGVAR(timeCoefficientFullRepair), "SLIDER", + [LSTRING(timeCoefficientFullRepair_name), LSTRING(timeCoefficientFullRepair_description)], + _category, + [0,3,1.5,2], + true +] call CBA_fnc_addSetting; + [ QGVAR(addSpareParts), "CHECKBOX", [LSTRING(addSpareParts_name), LSTRING(addSpareParts_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, true, // default value true, // isGlobal {[QGVAR(addSpareParts), _this] call EFUNC(common,cbaSettings_settingChanged)}, @@ -93,8 +139,8 @@ QGVAR(wheelRepairRequiredItems), "LIST", [LSTRING(WheelRepairRequiredItems_DisplayName), LSTRING(WheelRepairRequiredItems_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 0], + _category, + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 0], true ] call CBA_fnc_addSetting; @@ -102,8 +148,8 @@ 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], + _category, + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], true ] call CBA_fnc_addSetting; @@ -111,16 +157,50 @@ 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], + _category, + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], true ] call CBA_fnc_addSetting; [ QGVAR(autoShutOffEngineWhenStartingRepair), "CHECKBOX", [LSTRING(autoShutOffEngineWhenStartingRepair_name), LSTRING(autoShutOffEngineWhenStartingRepair_description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], + _category, false, // default value true, // isGlobal {[QGVAR(autoShutOffEngineWhenStartingRepair), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; + +[ + QGVAR(miscRepairTime), "SLIDER", + [LSTRING(miscRepairTime_name), LSTRING(miscRepairTime_description)], + _category, + [0,60,15,-1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true +] call CBA_fnc_addSetting; + +[ + QGVAR(wheelChangeTime), "SLIDER", + [LSTRING(wheelChangeTime_name), LSTRING(wheelChangeTime_description)], + _category, + [0,60,10,-1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true +] call CBA_fnc_addSetting; + +[ + QGVAR(patchWheelTime), + "SLIDER", + [LSTRING(patchWheelTime_DisplayName), LSTRING(patchWheelTime_Description)], + _category, + [0.1, 60, 5, 1], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(patchWheelMaximumRepair), + "SLIDER", + [LSTRING(patchWheelMaximumRepair_DisplayName), LSTRING(patchWheelMaximumRepair_Description)], + _category, + [0, 1, 0.3, 1, true], + true +] call CBA_fnc_addSetting; diff --git a/addons/repair/script_component.hpp b/addons/repair/script_component.hpp index 7ec3be3233..9fab647079 100644 --- a/addons/repair/script_component.hpp +++ b/addons/repair/script_component.hpp @@ -19,3 +19,11 @@ #define TRACK_HITPOINTS ["hitltrack", "hitrtrack"] #define DAMAGE_COLOR_SCALE ["#FFFFFF", "#FFFF7E", "#FFEC4D", "#FFD52C", "#FCB121", "#FF9916", "#FF7D16", "#FF4400", "#FF0000"] + +#define IN_REPAIR_FACILITY_CACHE_EXPIRY 1 + +#define NEAR_REPAIR_VEHICLE_CACHE_EXPIRY 1 + +#define ANY_TOOLKIT_FAKECLASS QGVAR(anyToolKit) + +#define PATCH_WHEEL_STEP_TIME 0.05 diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 57e149999e..ff9139d73f 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -35,6 +35,13 @@ 備用輪胎 Yedek Tekerlek + + Wheel + Rad + Rueda + タイヤ + Koło + Change Wheel Reifen wechseln @@ -63,7 +70,7 @@ Sostituendo la ruota... Remplacement de la roue... タイヤを交換しています・・・ - 바퀴 교체중... + 바퀴 교체 중... 正在更换轮胎... 更換輪胎中... Tekerlek Takılıyor @@ -112,7 +119,7 @@ Rimuovendo la ruota... Démontage de la roue... タイヤを外しています・・・ - 바퀴 제거중... + 바퀴 제거 중... 正在卸下轮胎... 卸下輪胎中... Tekerlek Sökülüyor @@ -160,7 +167,7 @@ Sostituendo il cingolo... Remplacement de la chenille... 履帯を交換しています・・・ - 궤도 교체중... + 궤도 교체 중... 正在更换履带... 更換履帶中... Parça Değişiyor... @@ -208,7 +215,7 @@ Rimuovendo il cingolo... Démontage de la chenille... 履帯を外しています・・・ - 궤도 제거중... + 궤도 제거 중... 正在卸下履带... 卸下履帶中... Parça Sökülüyor... @@ -256,14 +263,33 @@ Riparando il veicolo... Réparation du véhicule... 車両を修理しています・・・ - 차량 수리중... + 차량 수리 중... 正在维修载具... 維修載具中... Tamir Ediliyor... + + Full Repair Time Coefficient + 完全修理時間係数 + Współczynnik Czasu Pełnej Naprawy + Vollständiger Reparaturzeitkoeffizient + + + Modifies how long it takes to perform a Full Repair.\nThe repair time is based on the amount of repairs needed for each part, including those normally inaccessible. + 完全修復にかかる時間を変更します。\n修理時間は、通常アクセスできない部品も含め、各部品に必要な修理量に基づいて決定されます。 + Modyfikuje czas potrzebny do wykonania Pełnej Naprawy. Czas naprawy jest oparty na ilości napraw potrzebnych dla każdej części, w tym tych normalnie niedostępnych. + Ändert, wie lange es dauert, eine vollständige Reparatur durchzuführen.\nDie Reparaturzeit basiert auf der Menge der erforderlichen Reparaturen für jedes Teil, einschließlich derjenigen, die normalerweise nicht zugänglich sind. + Boost engineer training when in repair vehicles or facilities. Untrained becomes engineer, engineer becomes advanced engineer. + Améliore les compétences en ingénierie des unités en fonction du lieu où elles se trouvent ; notamment dans les véhicules de réparation ou les ateliers.\nUn soldat non formé devient ingénieur, un ingénieur devient ingénieur avancé. 修理車両か施設内では工兵能力を上昇させます。兵士は工兵になり、工兵は上級工兵になります。 + Повысьте подготовку инженеров при ремонте транспортных средств или объектов. Нетренированный становится инженером, инженер становится продвинутым инженером. + Steigert die Ausbildung von Pionieren, wenn Sie sich in Reparaturfahrzeugen oder -einrichtungen befinden. Aus Ungelerntem wird Pionier, aus Pionier wird ein fortgeschrittener Pionier. + Zwiększ wyszkolenie inżynierów w pojazdach i budynkach naprawczych. Niewyszkoleni zostają inżynierami, inżynierowie zostają zaawansowanymi inżynierami. + 在修理车辆或设施时,提升工程师训练。未受过训练的变成工程师,工程师晋升为高级工程师。 + 수리 차량이나 시설 주위에 있으면 수리 수준을 높입니다. 정비병이 아닌 사람은 정비병이 되고, 정비병은 정비사가 됩니다. + Aumenta las capacidades del ingeniero cuando se encuentra en un vehículo o instalacion de raparacion de vehículos. Quien no es ingeniero, pasa a serlo, y quien es ingeniero, pasa a ser ingeniero avanzado. Full Repair Locations @@ -293,7 +319,7 @@ Définit les lieux permettant de réparer intégralement un véhicule. どのような場所で車両の完全な修理を出来るようにしますか? 어느 구역에서 차량을 완전히 수리할 수 있게 합니까? - 什么位置可以完整维修载具? + 什么位置可以完整维修载具? 什麼位置可以完整維修載具? @@ -324,7 +350,7 @@ Définit qui peut effectuer une réparation complète sur un véhicule. 誰が車両の完全な修理を出来るようにしますか? 누가 완전 수리를 할 수 있습니까? - 谁可以完整维修载具? + 谁可以完整维修载具? 誰可以完整維修載具? Kimler araçta tam onarım yapabilir? @@ -354,9 +380,9 @@ Přidat náhradní díly do vozidla (vyžaduje úložný prostor)? Aggiungi parti di ricambio ai veicoli (richiede componente Cargo)? Ajoute des pièces de rechange aux véhicules (nécessite le système de cargaison). - 車両へ予備部品を追加しますか(カーゴ コンポーネントが必要)? + 車両へ予備部品を追加しますか? (カーゴ コンポーネントが必要) 차량에 예비 부품을 더합니까?(짐칸 요소 필요) - 添加载具备件 (需相关货物组件)? + 添加载具备件(需相关货物组件)? 添加載具備件 (需相關貨物組件)? @@ -418,7 +444,7 @@ javítása... Ремонтируем... 修理しています・・・ - 수리중... + 수리 중... 正在维修... 維修中... Tamir Ediliyor... @@ -435,7 +461,7 @@ %1 javítása... Ремонтируем %1... %1 を修理しています・・・ - %1 수리중... + %1 수리 중... 正在维修%1... 維修%1中... Tamir Ediliyor %1... @@ -468,7 +494,7 @@ Parte riparata completamente Pièce entièrement réparée. 完全に修理された部品 - 부분 완벽히 수리됨 + 완전수리된 부품 完整维修部分 完整維修部分 @@ -774,7 +800,7 @@ Пушку - + Silah @@ -1067,7 +1093,7 @@ Стекло (справа) ガラス (右) 유리 (오른쪽) - 玻璃 (右) + 玻璃(右) 玻璃 (右) Cam(Sağ) @@ -1084,7 +1110,7 @@ Стекло (слава) ガラス (左) 유리 (왼쪽) - 玻璃 (左) + 玻璃(左) 玻璃 (左) Cam (sol) @@ -1187,7 +1213,7 @@ Instandsetzer Solo Geniere avanzato 上級工兵のみ - 只有维修专精兵 + 只有维修专业兵 只有維修專精兵 Tylko zaawansowani mechanicy 고급 정비공만 @@ -1199,19 +1225,11 @@ Sadece Gelişmiş Mühendis - Allow Wheel + Allow Wheel Replacement Erlaube Radwechsel Wymiana kół - Permite rodas Разрешить замену колес - Možnost Výměny Kol - Permitir rueda - Consenti Ruota - Roues autorisées pour - タイヤを許可 - 바퀴 허가 - 允许轮胎 - 允許輪胎 + タイヤ交換の許可 Who can remove and replace wheels? @@ -1225,9 +1243,21 @@ Définit qui peut démonter et remplacer des roues. 誰がタイヤの除去と交換を出来るようにしますか? 누가 바퀴를 제거 및 교체할 수 있습니까? - 谁可维修轮胎? + 谁可维修轮胎? 誰可維修輪胎? + + Allow Wheel Patching + Erlaube Radflicken + タイヤ補修を許可 + Zezwól na Łatanie Kół + + + Who can patch wheels? + Wer kann Radflicken durchführen? + 誰がタイヤの補修を出来るようにしますか? + Kto może łatać koła? + Allow Repair Erlaube Reperatur @@ -1255,7 +1285,7 @@ Définit qui peut effectuer des réparations. 誰が修理を出来るようににしますか? 누가 수리를 할 수 있습니까? - 谁可以进行维修操作? + 谁可以进行维修操作? 誰可以進行維修操作? @@ -1274,7 +1304,7 @@ 維修門檻 - What is the maximum damage that can be repaired with a toolkit? + Maximum damage to which a part can be repaired with a toolkit.\n0% means all damage can be repaired. Der maximale Schaden, der von einem Reperatursatz behoben werden kann? Jaki jest maksymalny poziom uszkodzeń jaki może zostać naprawiony przy pomocy narzędzi? Qual é o dano máximo que pode ser reparado com um kit de ferramentas? @@ -1285,7 +1315,7 @@ Définit la quantité maximale de dégâts pouvant être réparés avec une trousse à outils. ツールキットで修理できる、最大の損傷許容範囲を設定しますか? 어느정도의 피해까지 툴킷으로 수리가 가능합니까? - 工具包可以修复的最大损坏值? + 工具包可以修复的最大损坏值? 工具包可以修復的最大損壞值? @@ -1300,11 +1330,11 @@ Seuil de réparabilité (ingénieurs) 修理のしきい値 (工兵) 정비 한계치 (정비공) - 维修门槛 (工兵) + 维修门槛(工兵) 維修門檻 (工兵) - What is the maximum damage that can be repaired by an engineer? + Maximum damage to which a part can be repaired by an engineer above the minimum level required for the repair.\n0% means all damage can be repaired. Der maximale Schaden, der von einem Pionier behoben werden kann? Jaki jest maksymalny poziom uszkodzeń jaki może zostać naprawiony przez mechanika? Qual é o dano máximo que pode ser reparado com um engenheiro? @@ -1315,7 +1345,7 @@ Définit la quantité maximale de dégâts qu'un ingénieur peut réparer. 工兵が修理できる、最大の損傷許容範囲を設定しますか? 정비공은 어느정도의 피해까지 수리할 수 있습니까? - 工兵可以修复的最大损坏值? + 工兵可以修复的最大损坏值? 工兵可以修復的最大損壞值? @@ -1345,7 +1375,7 @@ Définit si la trousse à outils doit être retirée après usage. ツールキットを使うと削除しますか? 툴킷을 사용하면 제거를 합니까? - 要在使用后删除工具包吗? + 要在使用后删除工具包吗? 要在使用後刪除工具包嗎? @@ -1449,7 +1479,7 @@ Lista di unità che verranno classificate come genieri, separate da virgole. Liste d'unités qui seront classées comme ingénieurs, séparées par des virgules. 一覧に記載されたユニット名を、工兵として指定します。コンマで複数を指定できます。 - 목록내 보직이름은 정비공으로 분류됩니다. 쉼표로 구분합니다. + 목록 내 보직이름은 정비공으로 분류됩니다. 쉼표로 구분합니다. 工兵名单,把单位名称输入在这边即可定义其为工兵。每个单位使用逗号以做区隔。 工兵名單,把單位名稱輸入在這邊即可定義其為工兵。每個單位使用逗號以做區隔。 @@ -1521,7 +1551,7 @@ Instandsetzer Adv. Geniere 上級工兵 - 专精 + 高级工兵 專精 Zaaw. mechanik 고급 정비공 @@ -1619,7 +1649,7 @@ Définit s'il s'agit d'un véhicule de réparation. 車両を修理車両と指定しますか? 이 차량을 정비 차량으로 분류합니까? - 此载具是维修载具吗? + 此载具是维修载具吗? 此載具是維修載具嗎? @@ -1709,7 +1739,7 @@ Définit l'objet comme étant un atelier de réparation. オブジェクトを修理施設として指定しますか? 이 시설을 정비 시설로 분류합니까? - 此设施是维修设施吗? + 此设施是维修设施吗? 此設施是維修設施嗎? @@ -1724,7 +1754,7 @@ Assigne un ou plusieurs objets en tant qu'atelier de réparation. ひとつ、または複数オブジェクトに予備部品を追加 하나 혹은 여러 시설을 정비 시설로 등록합니다 - 指定一个或多个对象作为维修设施 + 指定一个或多个物体作为维修设施 指定一個或多個對象作為維修設施 @@ -1754,7 +1784,7 @@ Ajoute des pièces de rechange à un ou plusieurs objets. 一覧に追加されたオブジェクトへ予備部品を与えます。コンマで複数を指定できます。 하나 혹은 여러 물체가 예비 부품을 더합니다 - 添加备件到一个或多个对象上 + 添加备件到一个或多个物体上 添加備件到一個或多個對象上 @@ -1849,7 +1879,7 @@ 選擇的備件數量 - Wheel Repair Requirements + Wheel Change Requirements Bedingungen für die Reifenreperatur Wym. naprawy kół Requisitos de reparación de ruedas @@ -1858,7 +1888,7 @@ Vyžaduje opravu kol Requisiti riparazione ruote Exigences pour réparation des roues - タイヤの修理を必要 + タイヤ修理の要求 바퀴 교체 요구사항 维修轮胎限制 維修輪胎限制 @@ -1874,15 +1904,28 @@ Oggetti richiesti per riparare/rimuovere ruote Outils nécessaires pour le démontage ou le remplacement des roues. タイヤの除去と交換にアイテムを必要としますか? - 바퀴를 제거/교체하는데 필요한 물건 + 바퀴를 제거/교체하는데 필요한 물건을 정합니다. 需要特定物品来移除/更换车轮 需要特定物品來移除/更換車輪 + + Wheel Patch Requirements + Bedingungen für die Radflicken + タイヤ補修の要求 + Wymagania do Łatania Koła + + + Items required to patch a wheel. + Gegenstänge, die zum Reifenflicken benötigt werden. + タイヤ補修にアイテムを必要としますか? + Przedmioty wymagane do załatania koła + Misc Repair Requirements Sonstige Reparaturbedingungen 部分修理条件 額外修理條件 + 部分全面维修条件 Exigences pour réparations diverses Requisiti di riparazione vari Požadavky pro částečnou opravu @@ -1890,12 +1933,14 @@ 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. @@ -1903,12 +1948,14 @@ 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 @@ -1916,12 +1963,14 @@ 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. @@ -1929,6 +1978,7 @@ Objetos requeridos para una reparación completa Elementi necessari per eseguire una riparazione completa del veicolo. Предметы, необходимые для полного ремонта техники. + 차량 완전 수리 시 필요한 아이템을 정합니다. Engine must be off to repair @@ -1958,6 +2008,7 @@ Chenilles de rechange Náhradní pásy Orugas de repuesto + 여분 궤도 Number of spare tracks in cargo. @@ -1972,6 +2023,7 @@ 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 @@ -1986,6 +2038,7 @@ Roues de secours Náhradní kola Ruedas de repuesto + 여분 바퀴 Number of spare wheels in cargo. @@ -2000,12 +2053,13 @@ 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 @@ -2014,6 +2068,7 @@ 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. @@ -2028,6 +2083,91 @@ 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 + 수리 시 엔진을 자동으로 끕니다. + + + Part Repair Time + 部分修理時間 + Czas Naprawy Części + Teilreparaturzeit + + + Time in seconds to complete a repair. + 修理完了までの時間 + Czas w sekundach do przeprowadzenia naprawy + Zeit in Sekunden, um eine Reparatur abzuschließen. + + + Wheel Change Time + タイヤ交換時間 + Czas Zmiany Koła + Radwechselzeit + + + Time in seconds to remove or change a wheel. + タイヤの取り外しまたは交換にかかる時間。 + Czas w sekundach do zdjęcia lub zmienienia koła. + Zeit in Sekunden, um ein Rad zu entfernen oder zu wechseln. + + + Patch Wheel + Rad flicken + タイヤを補修する + Załataj Koło + + + Patching Wheel... + Rad flicken... + タイヤを補修しています・・・ + Łatanie Koła... + + + Wheel Patch Time + タイヤ補修時間 + Czas Łatania Koła + Zeit um Räder zu flicken + + + Time it takes to patch a wheel by 5%. + タイヤを5%補修するのにかかる時間。 + Czas potrzebny na załatanie koła o 5%. + Zeit, die benötigt wird, um ein Rad um 5 % zu flicken. + + + Patch Wheel Threshold + タイヤ補修しきい値 + Próg Łatania Koła + Rad flicken Schwellenwert + + + Maximum level to which a wheel can be patched. + タイヤを補修できる最大の度合い。 + Maksymalny poziom, do którego koło może zostać załatane. + Maximales Level, bis zu dem ein Rad geflickt werden kann. + + + Wheel Patch Location + タイヤ補修場所 + Miejsce Łatania Koła + Räder Flick Ort + + + Where the wheel can be patched. + タイヤを補修できる場所。 + Gdzie można załatać koło. + Wo das Rad geflickt werden kann. + + + On the ground + Auf dem Boden + 地上 + Na ziemi + + + On a vehicle + An einem Fahrzeug + 車両上 + Na pojeździe diff --git a/addons/repair/ui/patch_ca.paa b/addons/repair/ui/patch_ca.paa new file mode 100644 index 0000000000..4aadbc2174 Binary files /dev/null and b/addons/repair/ui/patch_ca.paa differ diff --git a/addons/respawn/functions/fnc_canMoveRallypoint.sqf b/addons/respawn/functions/fnc_canMoveRallypoint.sqf index f37ad34265..1f9a3637bc 100644 --- a/addons/respawn/functions/fnc_canMoveRallypoint.sqf +++ b/addons/respawn/functions/fnc_canMoveRallypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Checks if a unit can move a rally point. diff --git a/addons/respawn/functions/fnc_handleInitPostServer.sqf b/addons/respawn/functions/fnc_handleInitPostServer.sqf index 4de502a9ea..8ac8bd76b6 100644 --- a/addons/respawn/functions/fnc_handleInitPostServer.sqf +++ b/addons/respawn/functions/fnc_handleInitPostServer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle XEH Init Post on Server. diff --git a/addons/respawn/functions/fnc_handleKilled.sqf b/addons/respawn/functions/fnc_handleKilled.sqf index 905cd7987b..1383561f2c 100644 --- a/addons/respawn/functions/fnc_handleKilled.sqf +++ b/addons/respawn/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Handles the XEH killed event. @@ -20,7 +20,7 @@ params ["_unit"]; // Saves the gear when the player! (and only him) is killed if (ACE_player == _unit && {GVAR(SavePreDeathGear)}) then { - _unit setVariable [QGVAR(unitGear), getUnitLoadout _unit]; + _unit setVariable [QGVAR(unitGear), [_unit] call CBA_fnc_getLoadout]; _unit setVariable [QGVAR(activeWeaponAndMuzzle), [currentWeapon _unit, currentMuzzle _unit, currentWeaponMode _unit]]; [QGVAR(saveGear), _unit] call CBA_fnc_localEvent; }; diff --git a/addons/respawn/functions/fnc_handlePlayerChanged.sqf b/addons/respawn/functions/fnc_handlePlayerChanged.sqf index 9fc71af9b7..f94e14d644 100644 --- a/addons/respawn/functions/fnc_handlePlayerChanged.sqf +++ b/addons/respawn/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle player changed event. Updates visibility of Rallypoint markers. diff --git a/addons/respawn/functions/fnc_handleRespawn.sqf b/addons/respawn/functions/fnc_handleRespawn.sqf index a8c65056b3..7194d6ee0f 100644 --- a/addons/respawn/functions/fnc_handleRespawn.sqf +++ b/addons/respawn/functions/fnc_handleRespawn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Handles the XEH Respawn event. diff --git a/addons/respawn/functions/fnc_initRallypoint.sqf b/addons/respawn/functions/fnc_initRallypoint.sqf index 0286813cef..50931a87f4 100644 --- a/addons/respawn/functions/fnc_initRallypoint.sqf +++ b/addons/respawn/functions/fnc_initRallypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Init code for rallypoints. diff --git a/addons/respawn/functions/fnc_module.sqf b/addons/respawn/functions/fnc_module.sqf index 72b4003bbc..acd9ae53e8 100644 --- a/addons/respawn/functions/fnc_module.sqf +++ b/addons/respawn/functions/fnc_module.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, bux578, esteldunedain, commy2 * Initializes the respawn module. diff --git a/addons/respawn/functions/fnc_moduleFriendlyFire.sqf b/addons/respawn/functions/fnc_moduleFriendlyFire.sqf index 2801e26b26..7d9a2eccbd 100644 --- a/addons/respawn/functions/fnc_moduleFriendlyFire.sqf +++ b/addons/respawn/functions/fnc_moduleFriendlyFire.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Initializes the friendly fire module. diff --git a/addons/respawn/functions/fnc_moduleRallypoint.sqf b/addons/respawn/functions/fnc_moduleRallypoint.sqf index a06220fec8..0af3357201 100644 --- a/addons/respawn/functions/fnc_moduleRallypoint.sqf +++ b/addons/respawn/functions/fnc_moduleRallypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Initializes the Rallypoint module. diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index d0e191829e..3c4d8b6441 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Moves a rallypoint to the players location. diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 990fa77ea8..e0823fe6e0 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578, commy2 * Restores previously saved gear. @@ -21,13 +21,7 @@ TRACE_3("restoreGear",_unit, count _allGear, _activeWeaponAndMuzzle); // restore all gear if (!isNil "_allGear") then { - _allGear params ["_primaryWeaponArray"]; - if ((_primaryWeaponArray param [0, ""]) == "ACE_FakePrimaryWeapon") then { - TRACE_1("Ignoring fake gun",_primaryWeaponArray); - _allGear set [0, []]; - _activeWeaponAndMuzzle = nil; - }; - _unit setUnitLoadout _allGear; + [_unit, _allGear] call CBA_fnc_setLoadout; }; // restore the last active weapon, muzzle and weaponMode diff --git a/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf b/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf index 4b1f7e44d8..a2a672d3f6 100644 --- a/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf +++ b/addons/respawn/functions/fnc_showFriendlyFireMessage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Shows a message in system chat of who killed whom. diff --git a/addons/respawn/functions/fnc_teleportToRallypoint.sqf b/addons/respawn/functions/fnc_teleportToRallypoint.sqf index 6c8a697279..abecc26465 100644 --- a/addons/respawn/functions/fnc_teleportToRallypoint.sqf +++ b/addons/respawn/functions/fnc_teleportToRallypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Teleports a unit to a rallypoint diff --git a/addons/respawn/functions/fnc_updateRallypoint.sqf b/addons/respawn/functions/fnc_updateRallypoint.sqf index 363e12972b..a0e14a4ed2 100644 --- a/addons/respawn/functions/fnc_updateRallypoint.sqf +++ b/addons/respawn/functions/fnc_updateRallypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Updates marker position and texts. @@ -17,7 +17,8 @@ * Public: No */ -params ["_rallypoint", "_side", "_position"]; +params ["_rallypoint", "_side"]; +private _position = param [2, getpos _rallypoint]; if (!hasInterface) exitWith {}; diff --git a/addons/respawn/functions/script_component.hpp b/addons/respawn/functions/script_component.hpp deleted file mode 100644 index eeb32a47bd..0000000000 --- a/addons/respawn/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\respawn\script_component.hpp" \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 558a47df02..16ceb790be 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -15,6 +15,7 @@ Znovuzrození Yeniden Doğma Reaparición + 재투입 Deploy in 5 seconds... @@ -28,8 +29,8 @@ Dispiegamento in 5 secondi... Será posicionado em 5 segundos... 設置まであと 5 秒・・・ - 5초 후 재배치... - 5秒后完成布署... + 5초 후 재투입... + 5秒后完成部署... 5秒後完成佈署... @@ -45,7 +46,7 @@ Rallypoints posicionado ラリーポイントを設置しました 집결지 배치됨 - 集合点布署完成 + 集合点部署完成 集合點佈署完成 @@ -126,7 +127,7 @@ Bod shromáždění Západ (Základna) Ponto de encontro Oeste (Base) ラリーポイント 同盟軍 (ベース) - 蓝方集合点 (基地) + 蓝方集合点(基地) 藍方集合點 (基地) 청군 집결지 (기지) @@ -142,7 +143,7 @@ Bod shromáždění Východ (Základna) Ponto de encontro Lest (Base) ラリーポイント OPFOR軍 (ベース) - 红方集合点 (基地) + 红方集合点(基地) 紅方集合點 (基地) 대항군 집결지 (기지) @@ -158,9 +159,9 @@ Bod shromáždění Nezávislý (Základna) Ponto de encontro Independente (Base) ラリーポイント 独立軍 (ベース) - 独立方集合点 (基地) + 独立方集合点(基地) 獨立方集合點 (基地) - 독립군 집결지 (기지) + 무소속군 집결지 (기지) Rallypoint West @@ -208,7 +209,7 @@ ラリーポイント 独立軍 独立方集合点 獨立方集合點 - 독립군 집결지 + 무소속군 집결지 Respawn System @@ -222,7 +223,7 @@ Возрождение Sistema Respawn リスポン システム - 재배치 시스템 + 재투입 시스템 重生系统 重生系統 @@ -239,7 +240,7 @@ Salva Equipaggiamento? 装備保存を有効化 장비를 저장합니까? - 储存装备? + 储存装备? 儲存裝備? Kıyafetleri Kaydet? @@ -255,8 +256,8 @@ Возрождать солдата с тем же снаряжением, которое было на нем при смерти? Respawna con l'equipaggiamento che il soldato aveva appena prima di morire? ユニットが死ぬ前に持っていた装備でリスポーンできるように設定できます。 - 죽기 전에 가지고 있던 장비로 재배치합니까? - 是否在重生时载入死亡前的装备? + 죽기 전에 가지고 있던 장비로 재투입합니까? + 是否在重生时载入死亡前的装备? 是否在重生時載入死亡前的裝備? @@ -272,7 +273,7 @@ Rimuovi corpi? 死体を削除 시체를 제거합니까? - 删除尸体? + 删除尸体? 刪除屍體? Bedeni Sil ? @@ -289,7 +290,7 @@ Rimuovi i corpi dei giocatori quando si disconnettono? 切断後はプレイヤーの死体を削除するかどうかを設定できます。 접속이 끊긴 플레이어의 시체를 제거합니까? - 要删除已离线的玩家尸体吗? + 要删除已离线的玩家尸体吗? 要刪除已離線的玩家屍體嗎? @@ -306,6 +307,7 @@ Časovač odstranění mrtvol Bedenin Silinme Süresi Temporizador para eliminar cuerpos + 시체 제거 타이머 This module enables you to configure ACE functionality specific to respawns. @@ -318,8 +320,8 @@ 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 機能を設定できます。 - 이 모듈은 ACE 재배치의 자세한 설정을 변결할 수 있게 해줍니다. - 该模块使您可以设定ACE的重生功能 + 이 모듈은 ACE 재투입의 자세한 설정을 변경할 수 있게 해줍니다. + 该模块使您可以设定 ACE 的重生功能 該模塊使您可以設定ACE的重生功能 @@ -334,8 +336,8 @@ Сообщения об огне по своим Messaggi Fuoco Amico 友軍誤射の表示 - 아군사격 메세지 - 友军误击讯息 + 아군 오인사격 메시지 + 友军误击信息 友軍誤擊訊息 @@ -349,8 +351,8 @@ 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. もし友軍誤射による死者が出た場合は、チャットにてその旨を表示します。 - 이 모듈은 미션 중 아군사격으로 인한 사망자 발생시 채팅창에 메세지를 표시해줍니다. - 摆放此模块后,当有发生友军误击致死的事件,会显示提示讯息在聊天视窗中。 + 이 모듈은 미션 중 아군 오인사격으로 인한 사망자 발생 시 채팅창에 메시지를 표시해줍니다. + 摆放此模块后,当有发生友军误击致死的事件,会显示提示信息在聊天视窗中。 擺放此模塊後,當有發生友軍誤擊致死的事件,會顯示提示訊息在聊天視窗中 @@ -380,8 +382,8 @@ 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 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 重生里面的基地与旗帜。 + 이 모듈은 미션 중에 기지 깃발에서 집결지로 빠르게 텔레포트 시켜주는 역할을 합니다. 지도 상에 기지 및 깃발이 필요합니다. 두 가지 모두 Empty->ACE Respawn 카테고리에서 찾을 수 있습니다. + 摆放此模块后,你将能在任务中部署集合点,使你可以快速往返基地与前线。要使用本功能,请记得放上空物体->ACE 重生里面的基地与旗帜。 擺放此模塊後,你將能在任務中佈署集合點,使你可以快速往返基地與前線。要使用本功能,請記得放上空物件->ACE 重生裡面的基地與旗幟 @@ -412,7 +414,7 @@ ACE Возрождение Rigenerazione ACE ACE リスポン - ACE 재배치 + ACE 재투입 ACE 重生 ACE 重生 ACE Yeniden Doğma diff --git a/addons/safemode/functions/fnc_lockSafety.sqf b/addons/safemode/functions/fnc_lockSafety.sqf index 44c7208b43..6c617c1898 100644 --- a/addons/safemode/functions/fnc_lockSafety.sqf +++ b/addons/safemode/functions/fnc_lockSafety.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Put weapon on safety, or take it off safety if safety is already put on. @@ -7,6 +7,7 @@ * 0: Unit * 1: Weapon * 2: Muzzle + * 3: Show hint * * Return Value: * None @@ -17,7 +18,7 @@ * Public: No */ -params ["_unit", "_weapon", "_muzzle"]; +params ["_unit", "_weapon", "_muzzle", ["_hint", true, [true]]]; private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []]; @@ -75,6 +76,9 @@ if (_muzzle isEqualType "") then { // play fire mode selector sound [_unit, _weapon, _muzzle] call FUNC(playChangeFiremodeSound); -// show info box -private _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); -[localize LSTRING(PutOnSafety), _picture] call EFUNC(common,displayTextPicture); +// show info box unless disabled +if (_hint) then { + private _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); + [localize LSTRING(PutOnSafety), _picture] call EFUNC(common,displayTextPicture); +}; + diff --git a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf index 829c21e7fd..30c4dfd59c 100644 --- a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf +++ b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Play weapon firemode change sound. diff --git a/addons/safemode/functions/fnc_setSafeModeVisual.sqf b/addons/safemode/functions/fnc_setSafeModeVisual.sqf index 587ac882d3..d62a542b9d 100644 --- a/addons/safemode/functions/fnc_setSafeModeVisual.sqf +++ b/addons/safemode/functions/fnc_setSafeModeVisual.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Show firemode indicator, representing safety lock diff --git a/addons/safemode/functions/fnc_setWeaponSafety.sqf b/addons/safemode/functions/fnc_setWeaponSafety.sqf index 54732857af..d80e1d8c38 100644 --- a/addons/safemode/functions/fnc_setWeaponSafety.sqf +++ b/addons/safemode/functions/fnc_setWeaponSafety.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Brostrom.A * Safe or unsafe the given weapon based on weapon state; locked or unlocked. @@ -7,6 +7,7 @@ * 0: Unit * 1: Weapon * 2: State + * 3: Show hint (default: true) * * Return Value: * None @@ -20,7 +21,8 @@ params [ ["_unit", objNull, [objNull]], ["_weapon", "", [""]], - ["_state", true, [true]] + ["_state", true, [true]], + ["_hint", true, [true]] ]; if (_weapon == "") exitWith {}; @@ -32,5 +34,5 @@ _weapon = configName (configFile >> "CfgWeapons" >> _weapon); private _muzzle = currentMuzzle _unit; if (_state isNotEqualTo (_weapon in _safedWeapons)) then { - [_unit, _weapon, _muzzle] call FUNC(lockSafety); + [_unit, _weapon, _muzzle, _hint] call FUNC(lockSafety); }; diff --git a/addons/safemode/functions/fnc_unlockSafety.sqf b/addons/safemode/functions/fnc_unlockSafety.sqf index 3194de6f14..8afc6802c1 100644 --- a/addons/safemode/functions/fnc_unlockSafety.sqf +++ b/addons/safemode/functions/fnc_unlockSafety.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Take weapon of safety lock. @@ -7,6 +7,7 @@ * 0: Unit * 1: Weapon * 2: Muzzle + * 3: Show hint * * Return Value: * None @@ -17,7 +18,7 @@ * Public: No */ -params ["_unit", "_weapon", "_muzzle"]; +params ["_unit", "_weapon", "_muzzle", ["_hint", true, [true]]]; private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []]; _safedWeapons deleteAt (_safedWeapons find _weapon); @@ -77,6 +78,8 @@ if (inputAction "nextWeapon" > 0) then { // player hud [true] call FUNC(setSafeModeVisual); -// show info box -private _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); -[localize LSTRING(TookOffSafety), _picture] call EFUNC(common,displayTextPicture); +// show info box unless disabled +if (_hint) then { + private _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); + [localize LSTRING(TookOffSafety), _picture] call EFUNC(common,displayTextPicture); +}; diff --git a/addons/safemode/functions/script_component.hpp b/addons/safemode/functions/script_component.hpp deleted file mode 100644 index a25fbfa4c7..0000000000 --- a/addons/safemode/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\safemode\script_component.hpp" \ No newline at end of file diff --git a/addons/safemode/stringtable.xml b/addons/safemode/stringtable.xml index 9cabffca46..ebeb50a63f 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -14,7 +14,7 @@ Modo de segurança 安全装置 안전 모드 - 保险模式 + 保险 保險模式 Emniyet Modu diff --git a/addons/sandbag/functions/fnc_canDeploy.sqf b/addons/sandbag/functions/fnc_canDeploy.sqf index 88ecd03093..bc0751d6b0 100644 --- a/addons/sandbag/functions/fnc_canDeploy.sqf +++ b/addons/sandbag/functions/fnc_canDeploy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg, commy2 * Checks if the player can deploy a sandbag. diff --git a/addons/sandbag/functions/fnc_deploy.sqf b/addons/sandbag/functions/fnc_deploy.sqf index b336cee0a0..1ef8485112 100644 --- a/addons/sandbag/functions/fnc_deploy.sqf +++ b/addons/sandbag/functions/fnc_deploy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support * Starts the deploy process for sandbags. diff --git a/addons/sandbag/functions/fnc_deployCancel.sqf b/addons/sandbag/functions/fnc_deployCancel.sqf index 6c5fb1e88a..aa2c2419a3 100644 --- a/addons/sandbag/functions/fnc_deployCancel.sqf +++ b/addons/sandbag/functions/fnc_deployCancel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support * Cancels sandbag deployment diff --git a/addons/sandbag/functions/fnc_deployConfirm.sqf b/addons/sandbag/functions/fnc_deployConfirm.sqf index e8abb586ee..20b821b3b5 100644 --- a/addons/sandbag/functions/fnc_deployConfirm.sqf +++ b/addons/sandbag/functions/fnc_deployConfirm.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support * Confirms sandbag deployment diff --git a/addons/sandbag/functions/fnc_handleInteractMenuOpened.sqf b/addons/sandbag/functions/fnc_handleInteractMenuOpened.sqf index 7683520c84..cb6cb4ddf1 100644 --- a/addons/sandbag/functions/fnc_handleInteractMenuOpened.sqf +++ b/addons/sandbag/functions/fnc_handleInteractMenuOpened.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle opening of interaction menu. diff --git a/addons/sandbag/functions/fnc_handleKilled.sqf b/addons/sandbag/functions/fnc_handleKilled.sqf index b778de6cc6..100ed2e930 100644 --- a/addons/sandbag/functions/fnc_handleKilled.sqf +++ b/addons/sandbag/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle death. diff --git a/addons/sandbag/functions/fnc_handlePlayerChanged.sqf b/addons/sandbag/functions/fnc_handlePlayerChanged.sqf index 2ba996f760..6882ed553e 100644 --- a/addons/sandbag/functions/fnc_handlePlayerChanged.sqf +++ b/addons/sandbag/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle player changes. diff --git a/addons/sandbag/functions/fnc_handlePlayerInventoryChanged.sqf b/addons/sandbag/functions/fnc_handlePlayerInventoryChanged.sqf index 53674d8e86..1e557cba1f 100644 --- a/addons/sandbag/functions/fnc_handlePlayerInventoryChanged.sqf +++ b/addons/sandbag/functions/fnc_handlePlayerInventoryChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle the InventoryChanged event. diff --git a/addons/sandbag/functions/fnc_handleScrollWheel.sqf b/addons/sandbag/functions/fnc_handleScrollWheel.sqf index 515e40053b..3a4f00a502 100644 --- a/addons/sandbag/functions/fnc_handleScrollWheel.sqf +++ b/addons/sandbag/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg * Handles sandbag rotation diff --git a/addons/sandbag/functions/fnc_handleUnconscious.sqf b/addons/sandbag/functions/fnc_handleUnconscious.sqf index 9b514007fb..3ad90a0cc5 100644 --- a/addons/sandbag/functions/fnc_handleUnconscious.sqf +++ b/addons/sandbag/functions/fnc_handleUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle unconsciousness. diff --git a/addons/sandbag/functions/fnc_pickup.sqf b/addons/sandbag/functions/fnc_pickup.sqf index 7db56cdfbe..7c21656ca0 100644 --- a/addons/sandbag/functions/fnc_pickup.sqf +++ b/addons/sandbag/functions/fnc_pickup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Pick up sandbag diff --git a/addons/sandbag/functions/script_component.hpp b/addons/sandbag/functions/script_component.hpp deleted file mode 100644 index 1d6f10c806..0000000000 --- a/addons/sandbag/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\sandbag\script_component.hpp" \ No newline at end of file diff --git a/addons/sandbag/stringtable.xml b/addons/sandbag/stringtable.xml index 15e10d39c4..b8f48606b0 100644 --- a/addons/sandbag/stringtable.xml +++ b/addons/sandbag/stringtable.xml @@ -31,7 +31,7 @@ Saco de Areia (vazio) 土のう (空) 모래주머니(비어있음) - 沙包 (空) + 沙包(空) 沙包 (空) Kum Torbası (Boş) @@ -133,7 +133,7 @@ Confirmar implantação ここで作る 설치 확인 - 确认布署 + 确认部署 確認佈署 Yerleştirmeyi Onayla @@ -150,7 +150,7 @@ Cancelar implantação 作るのを止める 설치 취소 - 取消布署 + 取消部署 取消佈署 Yerleştirmeyi İptal Et @@ -167,7 +167,7 @@ Implantar saco de areia 土のうを設置 모래주머니 설치 - 布署沙包 + 部署沙包 佈署沙包 Kum Torbasını Yerleştir diff --git a/addons/scopes/ACE_Settings.hpp b/addons/scopes/ACE_Settings.hpp index c1f767f1ae..c3aa151de7 100644 --- a/addons/scopes/ACE_Settings.hpp +++ b/addons/scopes/ACE_Settings.hpp @@ -6,7 +6,7 @@ class ACE_Settings { class GVAR(forceUseOfAdjustmentTurrets) { movedToSQF = 1; }; - + // Auto corrects the zeroing in both vanilla- and advanced ballistics class GVAR(correctZeroing) { movedToSQF = 1; @@ -19,7 +19,7 @@ class ACE_Settings { class GVAR(defaultZeroRange) { movedToSQF = 1; }; - + // Only relevant when advanced ballistics is enabled class GVAR(zeroReferenceTemperature) { movedToSQF = 1; @@ -33,11 +33,11 @@ class ACE_Settings { class GVAR(deduceBarometricPressureFromTerrainAltitude) { movedToSQF = 1; }; - + class GVAR(useLegacyUI) { movedToSQF = 1; }; - + class GVAR(simplifiedZeroing) { movedToSQF = 1; }; diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index de712b378f..b2d2b14d31 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -5,55 +5,59 @@ class Mode_FullAuto; class CfgWeapons { class ItemCore; class InventoryOpticsItem_Base_F; - + class optic_Yorris: ItemCore { ACE_ScopeHeightAboveRail = 2.77224; }; - + class optic_MRD: ItemCore { ACE_ScopeHeightAboveRail = 2.8; }; - + class optic_Aco: ItemCore { ACE_ScopeHeightAboveRail = 3.69248; }; - + class optic_ACO_grn: ItemCore { ACE_ScopeHeightAboveRail = 3.69248; }; - + class optic_ACO_grn_smg: ItemCore { ACE_ScopeHeightAboveRail = 3.69248; }; - + class optic_ACO_smg: ItemCore { ACE_ScopeHeightAboveRail = 3.69248; }; - + class optic_Holosight: ItemCore { ACE_ScopeHeightAboveRail = 4.66933; }; - + class optic_Holosight_smg: ItemCore { ACE_ScopeHeightAboveRail = 4.66933; }; - + class optic_Arco: ItemCore { ACE_ScopeHeightAboveRail = 4.89287; }; - + class optic_ERCO_blk_F: optic_Arco { ACE_ScopeHeightAboveRail = 3.48836; }; - + class optic_Hamr: ItemCore { ACE_ScopeHeightAboveRail = 4.48584; }; - + class optic_MRCO: ItemCore { ACE_ScopeHeightAboveRail = 3.88405; }; - + + class optic_ico_01_base_f: ItemCore { + ACE_ScopeHeightAboveRail = 5.41148; + }; + class optic_Nightstalker: ItemCore { ACE_ScopeHeightAboveRail = 5.54325; ACE_ScopeAdjust_Vertical[] = {-4, 30}; @@ -69,7 +73,7 @@ class CfgWeapons { }; }; }; - + class optic_NVS: ItemCore { ACE_ScopeHeightAboveRail = 5.54325; ACE_ScopeAdjust_Vertical[] = {-4, 30}; @@ -85,7 +89,7 @@ class CfgWeapons { }; }; }; - + class optic_TWS: ItemCore { ACE_ScopeHeightAboveRail = 5.52874; ACE_ScopeAdjust_Vertical[] = {-4, 30}; @@ -101,7 +105,22 @@ class CfgWeapons { }; }; }; - + class optic_tws_mg: ItemCore { + ACE_ScopeHeightAboveRail = 5.52874; + ACE_ScopeAdjust_Vertical[] = {-4, 30}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class TWS { + discreteDistance[] = {300}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class optic_LRPS: ItemCore { ACE_ScopeHeightAboveRail = 4.2098; ACE_ScopeAdjust_Vertical[] = {0, 27}; @@ -308,7 +327,7 @@ class CfgWeapons { }; class arifle_katiba_Base_F: Rifle_Base_F {}; - + class arifle_Katiba_F: arifle_katiba_Base_F { ACE_RailHeightAboveBore = 5.75468; ACE_IronSightBaseAngle = 0.011459; @@ -337,7 +356,7 @@ class CfgWeapons { }; class SDAR_base_F: Rifle_Base_F {}; - + class arifle_SDAR_F: SDAR_base_F { ACE_RailHeightAboveBore = 0; ACE_IronSightBaseAngle = -0.042972; @@ -448,7 +467,7 @@ class CfgWeapons { class MMG_01_hex_F: MMG_01_base_F { ACE_RailHeightAboveBore = 4.73961; ACE_IronSightBaseAngle = -0.003438; - }; + }; class MMG_02_camo_F: MMG_02_base_F { ACE_RailHeightAboveBore = 5.01913; ACE_IronSightBaseAngle = 0.010886; diff --git a/addons/scopes/RscTitles.hpp b/addons/scopes/RscTitles.hpp index 4dd1b7addf..c108caaf4d 100644 --- a/addons/scopes/RscTitles.hpp +++ b/addons/scopes/RscTitles.hpp @@ -18,7 +18,7 @@ class RscTitles { idc = 11; type = 0; text = QPATHTOF(UI\scopes_bg.paa); - style = 48 + 0x800; + style = "48 + 0x800"; scale = 1; sizeEx = 1; font = "RobotoCondensed"; @@ -26,10 +26,10 @@ class RscTitles { colorBackground[] = { 1, 1, 1, 1 }; shadow = 1; - x = (0.5 - 0.4 / 2) * safezoneW + safezoneX; - y = 0 * safezoneH + safezoneY; - w = 0.4 * safezoneW; - h = 0.3 * safezoneH; + x = "(0.5 - 0.4 / 2) * safezoneW + safezoneX"; + y = "0 * safezoneH + safezoneY"; + w = "0.4 * safezoneW"; + h = "0.3 * safezoneH"; }; class ACE_Scopes_Zeroing_Vertical: RscText { idc = 12; @@ -43,10 +43,10 @@ class RscTitles { colorBackground[] = { 1, 0, 0, 0 }; shadow = 0; - x = (0.5 - 0.4 / 2 + 0.45*0.4) * safezoneW + safezoneX; - y = (0 + 0.19*0.3) * safezoneH + safezoneY; - w = 0.04 * safezoneW; - h = 0.025 * safezoneH; + x = "(0.5 - 0.4 / 2 + 0.45*0.4) * safezoneW + safezoneX"; + y = "(0 + 0.19*0.3) * safezoneH + safezoneY"; + w = "0.04 * safezoneW"; + h = "0.025 * safezoneH"; }; class ACE_Scopes_Zeroing_Horizontal: RscText { idc = 13; @@ -60,10 +60,10 @@ class RscTitles { colorBackground[] = { 1, 0, 0, 0 }; shadow = 0; - x = (0.5 - 0.4 / 2 + 0.6*0.4) * safezoneW + safezoneX; - y = (0 + 0.47*0.3) * safezoneH + safezoneY; - w = 0.019 * safezoneW; - h = 0.025 * safezoneH; + x = "(0.5 - 0.4 / 2 + 0.6*0.4) * safezoneW + safezoneX"; + y = "(0 + 0.47*0.3) * safezoneH + safezoneY"; + w = "0.019 * safezoneW"; + h = "0.025 * safezoneH"; }; }; }; diff --git a/addons/scopes/XEH_PREP.hpp b/addons/scopes/XEH_PREP.hpp index 58b4e494f2..70af49a716 100644 --- a/addons/scopes/XEH_PREP.hpp +++ b/addons/scopes/XEH_PREP.hpp @@ -6,7 +6,7 @@ PREP(calculateZeroAngleCorrection); PREP(canAdjustZero); PREP(canResetZero); PREP(firedEH); -PREP(getBaseAngle); +PREP(getBaseAngle); PREP(getBoreHeight); PREP(getCurrentZeroRange); PREP(getOptics); diff --git a/addons/scopes/dev/checkScopes.sqf b/addons/scopes/dev/checkScopes.sqf new file mode 100644 index 0000000000..f166844ac9 --- /dev/null +++ b/addons/scopes/dev/checkScopes.sqf @@ -0,0 +1,78 @@ +// [] call compileScript ["\z\ace\addons\scopes\dev\checkScopes.sqf"]; + + +private _optics = "getNumber (_x >> 'scope') > 0" configClasses (configFile >> "CfgWeapons"); +_optics = _optics select {(getNumber (_x >> 'ItemInfo' >> 'type')) == 201}; +diag_log text format ["** Checking %1 scopes **", count _optics]; + +private _fnc_checkConfig = { + params ["_config", ["_diag", false]]; + + private _model = getText (_config >> "model"); + private _weaponObj = createSimpleObject [_model, [0, 0, 0], true]; + private _bestZoom = 1e6; + private _bestOffset = 0; + { + private _xZoom = getNumber (_x >> "opticsZoomMin"); + private _xMem = getText (_x >> "memoryPointCamera"); + private _xOffset = 100 * ((_weaponObj selectionPosition _xMem) select 2); // convert to centimeters + if (_xZoom < _bestZoom) then { // get offset for optic with highest magnification (lowest fov) + _bestZoom = _xZoom; + _bestOffset = _xOffset; + }; + if (_diag) then { + diag_log text format [" %1[%2] = %3 (%4)",configName _x, _xZoom, _xMem, _xOffset]; + }; + } forEach configProperties [_config >> "ItemInfo" >> "OpticsModes", "isClass _x"]; + deleteVehicle _weaponObj; + _bestOffset +}; +{ + private _config = _x; + private _actualOffset = [_config, false] call _fnc_checkConfig; + private _configOffset = getNumber (_config >> "ACE_ScopeHeightAboveRail"); + + if ((abs (_actualOffset - _configOffset)) > 0.1) then { + diag_log text format ["Mismatch %1 - Actual %2 vs Config %3", configName _config, _actualOffset, _configOffset]; + [_config, true] call _fnc_checkConfig; + }; +} forEach _optics; + + + + +private _rifles = "getNumber (_x >> 'scope') > 0" configClasses (configFile >> "CfgWeapons"); +_rifles = _rifles select {(getNumber (_x >> 'type')) == 1}; +_rifles = _rifles select {(configName _x) == (getText (_x >> 'baseWeapon'))}; +diag_log text format ["** Checking %1 weapons **", count _rifles]; + +private _fnc_checkConfig = { + params ["_config", ["_diag", false]]; + private _model = getText (_config >> "model"); + private _weaponObj = createSimpleObject [_model, [0, 0, 0], true]; + private _lod = (allLODs _weaponObj) # 0 # 2; + private _xMemMuzzle = getText (_config >> "muzzlePos"); + private _xMemOptic = "proxy:\a3\data_f\proxies\weapon_slots\top.001"; + private _xPosMuzzle = _weaponObj selectionPosition _xMemMuzzle; + private _xPosOptic = _weaponObj selectionPosition [_xMemOptic, _lod]; + if (_xPosOptic isEqualTo [0,0,0]) exitWith { -999 }; // e.g. akm has no proxy + + private _xOffset = 100 * ((_xPosOptic vectorDiff _xPosMuzzle) select 2); + if (_diag) then { + diag_log text format [" Muzzle %1 - Top %2", _xPosMuzzle, _xPosOptic]; + }; + deleteVehicle _weaponObj; + _xOffset +}; +{ + private _config = _x; + if ((compatibleItems [configName _config, "CowsSlot"]) isEqualTo []) then { continue }; // e.g. arifle_SDAR_F has no scopes + private _actualOffset = [_config, false] call _fnc_checkConfig; + if (_actualOffset == -999) then { continue }; + private _configOffset = getNumber (_config >> "ACE_RailHeightAboveBore"); + + if ((abs (_actualOffset - _configOffset)) > 0.1) then { + diag_log text format ["Mismatch %1 - Actual %2 vs Config %3", configName _config, _actualOffset, _configOffset]; + [_config, true] call _fnc_checkConfig; + }; +} forEach _rifles; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 1d99e3605f..bd2d2d1da6 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Ruthberg * Changes the adjustment for the current scope diff --git a/addons/scopes/functions/fnc_adjustZero.sqf b/addons/scopes/functions/fnc_adjustZero.sqf index 56c3404a7c..1a130840ed 100644 --- a/addons/scopes/functions/fnc_adjustZero.sqf +++ b/addons/scopes/functions/fnc_adjustZero.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Ruthberg * Updates the zero adjustment of the current scope diff --git a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf index e64abb30fc..b813dde9ef 100644 --- a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf +++ b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Ruthberg * Applies the adjustment for the current scope diff --git a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf index 017c617ebc..6cb53c3898 100644 --- a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf +++ b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the zero angle correction for the new zero range based on current zero range and bore height (distance between bore- and sight axis) diff --git a/addons/scopes/functions/fnc_canAdjustZero.sqf b/addons/scopes/functions/fnc_canAdjustZero.sqf index d9c2903cbd..58a8807480 100644 --- a/addons/scopes/functions/fnc_canAdjustZero.sqf +++ b/addons/scopes/functions/fnc_canAdjustZero.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Ruthberg * Checks if the unit can change the zero adjustment of the current scope diff --git a/addons/scopes/functions/fnc_canResetZero.sqf b/addons/scopes/functions/fnc_canResetZero.sqf index c398294684..cd3f1fb4eb 100644 --- a/addons/scopes/functions/fnc_canResetZero.sqf +++ b/addons/scopes/functions/fnc_canResetZero.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Ruthberg * Checks if the unit can reset the zero adjustment of the current scope diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 8870592885..86d9848162 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, esteldunedain, Ruthberg * Adjusts the flight path of the bullet according to the zeroing. Called from the unified fired EH only for local and non-local players on foot. @@ -30,7 +30,7 @@ TRACE_1("Adjusting With",_zeroing); if (GVAR(correctZeroing) || GVAR(simplifiedZeroing)) then { private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; private _baseAngle = (_unit getVariable [QGVAR(baseAngle), [0,0,0]]) select _weaponIndex; - private _boreHeight = (_unit getVariable [QGVAR(boreHeight), [0,0,0]]) select _weaponIndex; + private _boreHeight = (_unit getVariable [QGVAR(boreHeight), [0,0,0]]) select _weaponIndex; private _oldZeroRange = currentZeroing _unit; private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; diff --git a/addons/scopes/functions/fnc_getBaseAngle.sqf b/addons/scopes/functions/fnc_getBaseAngle.sqf index da5e965938..14da9d252a 100644 --- a/addons/scopes/functions/fnc_getBaseAngle.sqf +++ b/addons/scopes/functions/fnc_getBaseAngle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Gets the base angle of the weapon & optic combination with the given weapon index @@ -18,10 +18,10 @@ params ["_unit", "_weaponIndex"]; -if (_weaponIndex < 0 || {_weaponIndex > 2}) exitWith { 0 }; +if (_weaponIndex < 0 || {_weaponIndex > 2}) exitWith { 0 }; -private _weaponClass = [primaryWeapon _unit, secondaryWeapon _unit, handgunWeapon _unit] select _weaponIndex; -private _opticsClass = ([_unit] call FUNC(getOptics)) select _weaponIndex; +private _weaponClass = [primaryWeapon _unit, secondaryWeapon _unit, handgunWeapon _unit] select _weaponIndex; +private _opticsClass = ([_unit] call FUNC(getOptics)) select _weaponIndex; private _weaponConfig = configFile >> "CfgWeapons" >> _weaponClass; private _baseAngle = getNumber(_weaponConfig >> "ACE_IronSightBaseAngle"); diff --git a/addons/scopes/functions/fnc_getBoreHeight.sqf b/addons/scopes/functions/fnc_getBoreHeight.sqf index 8926585989..37c62d111e 100644 --- a/addons/scopes/functions/fnc_getBoreHeight.sqf +++ b/addons/scopes/functions/fnc_getBoreHeight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Gets the bore height of the weapon & optic combination with the given weapon index @@ -18,10 +18,10 @@ params ["_unit", "_weaponIndex"]; -if (_weaponIndex < 0 || {_weaponIndex > 2}) exitWith { 0 }; +if (_weaponIndex < 0 || {_weaponIndex > 2}) exitWith { 0 }; -private _weaponClass = [primaryWeapon _unit, secondaryWeapon _unit, handgunWeapon _unit] select _weaponIndex; -private _opticsClass = ([_unit] call FUNC(getOptics)) select _weaponIndex; +private _weaponClass = [primaryWeapon _unit, secondaryWeapon _unit, handgunWeapon _unit] select _weaponIndex; +private _opticsClass = ([_unit] call FUNC(getOptics)) select _weaponIndex; if (_opticsClass == "") then { _opticsClass = _weaponClass; }; diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf index 6425fe047a..001e5e8b79 100644 --- a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf +++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Gets the zero range of the currently used optic diff --git a/addons/scopes/functions/fnc_getOptics.sqf b/addons/scopes/functions/fnc_getOptics.sqf index c9c1216d99..6be1952b6f 100644 --- a/addons/scopes/functions/fnc_getOptics.sqf +++ b/addons/scopes/functions/fnc_getOptics.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Gets the optic classnames of all currently equipped weapons. diff --git a/addons/scopes/functions/fnc_initModuleSettings.sqf b/addons/scopes/functions/fnc_initModuleSettings.sqf index b0bf38492d..92bf22e87e 100644 --- a/addons/scopes/functions/fnc_initModuleSettings.sqf +++ b/addons/scopes/functions/fnc_initModuleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * Module for adjusting the scopes settings diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index f295103d03..a3302230cc 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Commy2, Ruthberg * Check if weapon optics changed and reset zeroing if needed diff --git a/addons/scopes/functions/fnc_resetZero.sqf b/addons/scopes/functions/fnc_resetZero.sqf index 4f4510a55d..76ee6355a8 100644 --- a/addons/scopes/functions/fnc_resetZero.sqf +++ b/addons/scopes/functions/fnc_resetZero.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, Ruthberg * Resets the zero adjustment of the current scope diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index 679ebdb08a..3deb1c4836 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: KoffeinFlummi, esteldunedain * Display the adjustment knobs, update their value and fade them out later diff --git a/addons/scopes/functions/script_component.hpp b/addons/scopes/functions/script_component.hpp deleted file mode 100644 index acca51b4b5..0000000000 --- a/addons/scopes/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\scopes\script_component.hpp" diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index eae39deffd..28130bc037 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -25,9 +25,9 @@ Włącz ustawienia celowników optycznych ACE Activer le réglage ACE des lunettes Abilita Regolazione mirino ACE - 开启ACE瞄准镜归零调节 + 开启 ACE 瞄准镜归零调节 開啟ACE瞄準鏡歸零調節 - Включить настройку прицелов ACE + Вкл. настройку прицелов ACE Permitir ajustes de Mira do ACE Povolit ACE náměr puškohledů Activar ACE Ajuste de visores @@ -57,7 +57,7 @@ Forza la regolazione delle torrette 强制使用归零调节 強制使用歸零調節 - Включить регулировку ненастроенных прицелов + Регулировка ненастроенных прицелов Força ajustes ACE para Miras Vynutit použití komínků Forzar torretas de ajuste @@ -126,7 +126,7 @@ Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes Nutzt die Einstellung 'defaultZeroRange' um Zielfernrohre anzupassen 'defaultZeroRange'設定を使う高倍率スコープのゼロイン距離を上書きします - 기존 고성능 조준경의 영점거리에 '기본설정 영점거리' 를 덮어씌웁니다 + 기존 고성능 조준경의 영점거리에 'defaultZeroRange'를 덮어씌웁니다 Używa 'defaultZeroRange' zamiast ustawionej odległości zerowania dla celowników o duzym przybliżeniu 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 @@ -171,7 +171,7 @@ Reference temperature Bezugstemperatur 温度の参照 - 온도 기준 + 기준 온도 Referencyjna temperatura Température de référence Temperatura di riferimento @@ -190,7 +190,7 @@ Temperatura, przy której celownik został wyzerowany 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. @@ -201,7 +201,7 @@ Reference barometric pressure Bezugsluftdruck 気圧の参照 - 기압 기준 + 기준 기압 Referencyjne ciśnienie barometryczne Pression barométrique de référence Pressione barometrica di riferimento @@ -231,7 +231,7 @@ Reference humidity Bezugsluftfeuchtigkeit 湿度の参照 - 습도 기준 + 기준 습도 Referencyjna wilgotność Humidité de référence Umidità di riferimento @@ -292,7 +292,7 @@ Vorheriges UI verwenden Usa UI precedente 使用舊版介面 - 使用旧版介面 + 使用旧版界面 昔の UI を使用 기존 UI 사용 Wykorzystaj legacy UI @@ -322,7 +322,7 @@ Vereinfachte Nullung 簡略なゼロイン Azzeramento semplificato - 단순화 된 영점 조정 + 단순화된 영점 조정 簡單歸零 简单归零 Uproszczone zerowanie @@ -337,9 +337,9 @@ Repliziert das Vanilla-Zeroing-System für Zielfernrohre. 標準で使われるライフルスコープ用のゼロイン システムを複製します。 Replica il sistema di azzeramento vanilla per le ottiche. - 라이플스코프 용 바닐라 영점조정 시스템을 복제합니다. + 라이플 스코프용 바닐라 영점조정 시스템을 복제합니다. 使用原版的歸零系統來取代ACE複雜的歸零模擬。 - 使用原版的归零系统来取代ACE复杂的归零模拟。 + 使用原版的归零系统来取代 ACE 复杂的归零模拟。 Replikuje system zerowania, dla celowników karabinowych, z domyślnej gry. Использует ванильную систему прицеливания для прицелов Imita o sistema de zeramento vanilla para miras de rifle. @@ -391,7 +391,7 @@ Pequeno ajuste para direita Korekce doprava (mírně) 僅かに右へ調節 - 오론쪽으로 조절 + 오른쪽으로 조절 向右微调 向右微調 @@ -529,7 +529,7 @@ %1D %1D %1D - %1D + %1하 %1D %1D %1D @@ -545,7 +545,7 @@ %1L %1L %1L - %1L + %1좌 %1L %1L %1L @@ -561,7 +561,7 @@ %1R %1R %1R - %1R + %1우 %1R %1R %1R @@ -573,6 +573,7 @@ Horizontal limits Horizontale Grenzen 水平限制 + 水平限制 水平制限 Limite orrizontale Limit poziomy @@ -581,11 +582,13 @@ Limites horizontales Horizontální limity Límites horizontales + 수평 한계 Vertical limits Vertikale Grenzen 垂直限制 + 垂直限制 垂直制限 Limite verticale Limit pionowy @@ -594,6 +597,7 @@ Limites verticales Vertikální limity Límites verticales + 수직 한계 diff --git a/addons/sitting/CfgVehicles.hpp b/addons/sitting/CfgVehicles.hpp index 6b71101b44..ad2e7db2d2 100644 --- a/addons/sitting/CfgVehicles.hpp +++ b/addons/sitting/CfgVehicles.hpp @@ -2,7 +2,7 @@ class CfgVehicles { class ACE_Module; class ACEX_ModuleSitting: ACE_Module { author = ECSTRING(common,ACETeam); - category = "ACEX"; + category = "ACE"; displayName = CSTRING(ModuleDisplayName); function = QFUNC(moduleInit); scope = 1; diff --git a/addons/sitting/functions/fnc_addSitActions.sqf b/addons/sitting/functions/fnc_addSitActions.sqf index 99f7145cf4..a705ca21e6 100644 --- a/addons/sitting/functions/fnc_addSitActions.sqf +++ b/addons/sitting/functions/fnc_addSitActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds sit actions. @@ -25,7 +25,7 @@ if (_seat isEqualType objNull) then { private _configFile = configFile >> "CfgVehicles" >> _type; // Exit if sitting disabled or the object is not specified as a seat -if (!XGVAR(enable) || {getNumber (_configFile >> QGVAR(canSit)) != 1}) exitWith {}; +if (!XGVAR(enable) || {getNumber (_configFile >> QXGVAR(canSit)) != 1}) exitWith {}; // Exit if class already initialized if (_type in GVAR(initializedClasses)) exitWith {}; @@ -33,8 +33,8 @@ GVAR(initializedClasses) pushBack _type; TRACE_1("Adding Sit Action",_type); -private _sitPosition = getArray (_configFile >> QGVAR(sitPosition)); -private _interactPosition = getArray (_configFile >> QGVAR(interactPosition)); +private _sitPosition = getArray (_configFile >> QXGVAR(sitPosition)); +private _interactPosition = getArray (_configFile >> QXGVAR(interactPosition)); if (count _sitPosition != count _interactPosition) exitWith { WARNING_1("Invalid sitting configuration of %1!",_type); diff --git a/addons/sitting/functions/fnc_canSit.sqf b/addons/sitting/functions/fnc_canSit.sqf index 6250b30bec..4328234bd9 100644 --- a/addons/sitting/functions/fnc_canSit.sqf +++ b/addons/sitting/functions/fnc_canSit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas, vabene1111 * Check if the player can sit down. diff --git a/addons/sitting/functions/fnc_canStand.sqf b/addons/sitting/functions/fnc_canStand.sqf index bdc0211af7..fafe4f2cd8 100644 --- a/addons/sitting/functions/fnc_canStand.sqf +++ b/addons/sitting/functions/fnc_canStand.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Check if the player can stand up (is in sitting position). diff --git a/addons/sitting/functions/fnc_getRandomAnimation.sqf b/addons/sitting/functions/fnc_getRandomAnimation.sqf index 8ccd8d0620..ac8bd9e68d 100644 --- a/addons/sitting/functions/fnc_getRandomAnimation.sqf +++ b/addons/sitting/functions/fnc_getRandomAnimation.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Gets a random animations from the list. diff --git a/addons/sitting/functions/fnc_handleInterrupt.sqf b/addons/sitting/functions/fnc_handleInterrupt.sqf index 907cea1a32..ce1ec9fb6a 100644 --- a/addons/sitting/functions/fnc_handleInterrupt.sqf +++ b/addons/sitting/functions/fnc_handleInterrupt.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Handles interruptions of sitting, like killed or unconsciousness. diff --git a/addons/sitting/functions/fnc_moduleInit.sqf b/addons/sitting/functions/fnc_moduleInit.sqf index c03cefac61..d2b8feefa0 100644 --- a/addons/sitting/functions/fnc_moduleInit.sqf +++ b/addons/sitting/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the Sitting module. diff --git a/addons/sitting/functions/fnc_sit.sqf b/addons/sitting/functions/fnc_sit.sqf index cbf7b7141f..98ece0c62f 100644 --- a/addons/sitting/functions/fnc_sit.sqf +++ b/addons/sitting/functions/fnc_sit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas, vabene1111 * Sits down the player. @@ -37,9 +37,9 @@ private _actionID = _player addAction [ ]; // Read config -private _configFile = configFile >> "CfgVehicles" >> typeOf _seat; -private _sitDirection = (getDir _seat) + (_seat getVariable [QGVAR(sitDirection), getNumber (_configFile >> QGVAR(sitDirection))]); -private _sitPositionAll = _seat getVariable [QGVAR(sitPosition), getArray (_configFile >> QGVAR(sitPosition))]; +private _configFile = configOf _seat; +private _sitDirection = (getDir _seat) + (_seat getVariable [QXGVAR(sitDirection), getNumber (_configFile >> QXGVAR(sitDirection))]); +private _sitPositionAll = _seat getVariable [QXGVAR(sitPosition), getArray (_configFile >> QXGVAR(sitPosition))]; private _multiSitting = (_sitPositionAll select 0) isEqualType []; private _sitPosition = _sitPositionAll; diff --git a/addons/sitting/functions/fnc_stand.sqf b/addons/sitting/functions/fnc_stand.sqf index 80ef06a2c2..b25c7a5ee1 100644 --- a/addons/sitting/functions/fnc_stand.sqf +++ b/addons/sitting/functions/fnc_stand.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Stands up the player. diff --git a/addons/sitting/functions/script_component.hpp b/addons/sitting/functions/script_component.hpp deleted file mode 100644 index 19e51509b3..0000000000 --- a/addons/sitting/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\sitting\script_component.hpp" diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index ac11613dfd..9ec35ef8b8 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -81,7 +81,7 @@ Этот модуль позволяет вам запретить возможность садиться на стулья и туалеты. Questo modulo ti permette di disabilitare la possibilità di sederti sulle sedie. モジュールでは椅子に着席するのを無効化できます。 - 이 모듈을 사용하여 의자에 앉을 수 있는 기능을 비활성 할 수 있습니다. + 이 모듈을 사용하여 의자에 앉을 수 있는 기능을 비활성화할 수 있습니다. 此模块可以让你开关在椅子上坐下的能力。 此模塊可以讓你開關在椅子上坐下的能力。 Bu modül, sandalyelere oturma özelliğini devre dışı bırakmanıza izin verir. diff --git a/addons/slideshow/CfgVehicles.hpp b/addons/slideshow/CfgVehicles.hpp index 6c11ba866c..c7c0687913 100644 --- a/addons/slideshow/CfgVehicles.hpp +++ b/addons/slideshow/CfgVehicles.hpp @@ -47,6 +47,12 @@ class CfgVehicles { typeName = "NUMBER"; defaultValue = 0; }; + class Selection { + displayName = CSTRING(Selection_DisplayName); + description = CSTRING(Selection_Description); + typeName = "NUMBER"; + defaultValue = 0; + }; }; class ModuleDescription { description = CSTRING(Description); diff --git a/addons/slideshow/GUI.hpp b/addons/slideshow/GUI.hpp new file mode 100644 index 0000000000..87b42aa570 --- /dev/null +++ b/addons/slideshow/GUI.hpp @@ -0,0 +1,35 @@ +class GVAR(mapDisplay) { + onLoad = QUOTE(call FUNC(mapImage_init)); + idd = -1; + class Controls {}; +}; + +class ctrlMap; +class GVAR(mapNormal): ctrlMap { + maxSatelliteAlpha = 0; + sizeExLabel = 0; + sizeExUnits = 0; + sizeExInfo = 0; + sizeExLevel = 0; + sizeEx = 0; + scaleMin = 0.005; + scaleMax = 10; + showCountourInterval = 0; + drawShaded = 0.15; + shadedSea = 0.15; + showMarkers = 0; +}; +class GVAR(mapTopo): GVAR(mapNormal) { + drawShaded = 0.35; + shadedSea = 0.35; + sizeExLevel = 0.02; + colorCountlines[] = {0.647059, 0.533333, 0.286275, 0.5}; + colorMainCountlines[] = {0.858824, 0, 0,0.5}; + ptsPerSquareObj = 2000; // don't show buildings +}; +class GVAR(mapSat): GVAR(mapNormal) { + // ref https://feedback.bistudio.com/T170918 - may have problems loading sat textures + maxSatelliteAlpha = 0.95; + colorForest[] = {0, 1, 0, 0}; + colorForestBorder[] = {0, 1, 0, 0}; +}; diff --git a/addons/slideshow/XEH_PREP.hpp b/addons/slideshow/XEH_PREP.hpp index ca31404b53..52c5cb4217 100644 --- a/addons/slideshow/XEH_PREP.hpp +++ b/addons/slideshow/XEH_PREP.hpp @@ -1,5 +1,6 @@ - PREP(addSlideActions); PREP(autoTransition); PREP(createSlideshow); +PREP(mapImage); +PREP(mapImage_init); PREP(moduleInit); diff --git a/addons/slideshow/config.cpp b/addons/slideshow/config.cpp index 93378a3e82..8b375b7f74 100644 --- a/addons/slideshow/config.cpp +++ b/addons/slideshow/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" +#include "GUI.hpp" diff --git a/addons/slideshow/functions/fnc_addSlideActions.sqf b/addons/slideshow/functions/fnc_addSlideActions.sqf index 6416c35748..8ec804d577 100644 --- a/addons/slideshow/functions/fnc_addSlideActions.sqf +++ b/addons/slideshow/functions/fnc_addSlideActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds controller slide actions. @@ -9,6 +9,7 @@ * 2: Names * 3: Controller * 4: Current Slideshow + * 5: Texture Selection (default: 0) * * Return Value: * List of actions @@ -19,7 +20,7 @@ * Public: No */ -params ["_objects", "_images", "_names", "_controller", "_currentSlideshow"]; +params ["_objects", "_images", "_names", "_controller", "_currentSlideshow", ["_selection", 0]]; private _actions = []; { @@ -30,15 +31,15 @@ private _actions = []; _names select _forEachIndex, "", { - (_this select 2) params ["_objects", "_image", "_currentSlideshow"]; + (_this select 2) params ["_objects", "_image", "_currentSlideshow", "_selection"]; { - _x setObjectTextureGlobal [0, _image] + _x setObjectTextureGlobal [_selection, _image] } count _objects; [QGVAR(slideChanged), [_image, _currentSlideshow]] call CBA_fnc_localEvent; }, {true}, {}, - [_objects, _x, _currentSlideshow] + [_objects, _x, _currentSlideshow, _selection] ] call EFUNC(interact_menu,createAction), [], _controller diff --git a/addons/slideshow/functions/fnc_autoTransition.sqf b/addons/slideshow/functions/fnc_autoTransition.sqf index 87fe488754..793b8baf1b 100644 --- a/addons/slideshow/functions/fnc_autoTransition.sqf +++ b/addons/slideshow/functions/fnc_autoTransition.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Handles automatic slide transitions using waitAndExecute in a PFH-like manner resulting in no performance loss. @@ -9,17 +9,18 @@ * 2: State Variable Name * 3: Current Slideshow * 4: Duration (0 disables automatic transitions) + * 5: Texture Selection * * Return Value: * None * * Example: - * [objects, images, "ace_slideshow_slideshow1", duration] call ace_slideshow_fnc_autoTransition + * [objects, images, "ace_slideshow_slideshow1", duration, selection] call ace_slideshow_fnc_autoTransition * * Public: No */ -params ["_objects", "_images", "_varString", "_currentSlideshow", "_duration"]; +params ["_objects", "_images", "_varString", "_currentSlideshow", "_duration", "_selection"]; // Get current slide number of this slideshow private _currentSlide = missionNamespace getVariable [_varString, 0]; @@ -34,11 +35,11 @@ private _image = _images select _currentSlide; // Set slide { - _x setObjectTextureGlobal [0, _image]; + _x setObjectTextureGlobal [_selection, _image]; } count _objects; [QGVAR(slideChanged), [_image, _currentSlideshow]] call CBA_fnc_localEvent; // Log current slide and execute Next slide TRACE_4("Auto-transition",_image,_currentSlide,count _images,_duration); -[FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration], _duration] call CBA_fnc_waitAndExecute; +[FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration, _selection], _duration] call CBA_fnc_waitAndExecute; diff --git a/addons/slideshow/functions/fnc_createSlideshow.sqf b/addons/slideshow/functions/fnc_createSlideshow.sqf index 0d84fa969b..87fd40bbbe 100644 --- a/addons/slideshow/functions/fnc_createSlideshow.sqf +++ b/addons/slideshow/functions/fnc_createSlideshow.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas, DaC * Prepares necessary variables and default image. @@ -8,8 +8,9 @@ * 1: Controller Objects * 2: Image Paths * 3: Action Names - * 4: Slide Duration (0 disables automatic transitions) + * 4: Slide Duration, 0 disables automatic transitions * 5: Set Name (default: localized "Slides") + * 6: Texture Selection (default: 0) * * Return Value: * Slideshow ID @@ -26,7 +27,8 @@ params [ ["_images", [], [[]] ], ["_names", [], [[]] ], ["_duration", 0, [0]], - ["_setName", localize LSTRING(Interaction), [""]] + ["_setName", localize LSTRING(Interaction), [""]], + ["_selection", 0, [0]] ]; // Verify data @@ -47,7 +49,7 @@ TRACE_5("Information",_objects,_controllers,_images,_names,_setName); if (isServer) then { // Default images on whiteboards (first image) { - _x setObjectTextureGlobal [0, _images select 0]; + _x setObjectTextureGlobal [_selection, _images select 0]; } count _objects; }; @@ -82,7 +84,7 @@ if (_duration == 0) then { {}, {true}, {(_this select 2) call FUNC(addSlideActions)}, - [_objects, _images, _names, _x, _currentSlideshow], + [_objects, _images, _names, _x, _currentSlideshow, _selection], [0, 0, 0], 2 ] call EFUNC(interact_menu,createAction); @@ -100,7 +102,7 @@ if (_duration == 0) then { missionNamespace setVariable [_varString, 0]; // Automatic transitions handler - [FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration], _duration] call CBA_fnc_waitAndExecute; + [FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration, _selection], _duration] call CBA_fnc_waitAndExecute; }; _currentSlideshow diff --git a/addons/slideshow/functions/fnc_mapImage.sqf b/addons/slideshow/functions/fnc_mapImage.sqf new file mode 100644 index 0000000000..8703da1256 --- /dev/null +++ b/addons/slideshow/functions/fnc_mapImage.sqf @@ -0,0 +1,67 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Returns a procedural texture that will display a custom map. + * Needs to be run on all machines. + * + * Arguments: + * 0: Position (default: center of map) + * 1: Scale (1.0 fits entire map in x-dimension) (default: 1.25) + * 2: Markers (default: []) + * - 0: Position 2D/3D (default: [0, 0, 0]) + * - 1: Text (default: "") + * - 2: Marker Type or Icon Name (default: "mil_dot") + * - 3: Color (default: [1, 0, 0, 1]) + * 3: Map Type (0: Normal, 1: Topographic, 2: Satellite) or any custom class (even mission config) (default: 0) + * 4: Code to run on init (will be passed [_map, _display, _displayID]) (default: {}) + * 5: Resolution (default: 4096) + * + * Return Value: + * Procedural Texture + * + * Example: + * [] call ace_slideshow_fnc_mapImage + * [getPos player, 0.3, [], 1] call ace_slideshow_fnc_mapImage + * [[5000, 5000], 0.5, [[getpos player, "obj"]], 2, {}] call ace_slideshow_fnc_mapImage + * + * Public: Yes + */ + +params [ + ["_pos", [worldSize / 2, worldSize / 2], [[]]], + ["_scale", 1.25, [0]], + ["_markers", [], [[]]], + ["_mapType", 0, [0, ""]], // 2.14 may allow config type as well + ["_userCode", {}, [{}]], + ["_resolution", 4096, [0]] +]; +TRACE_6("",_pos,_scale,count _markers,_mapType,_userCode isEqualTo {},_resolution); + +_markers = _markers apply { // convert marker array to draw command + _x params [["_xPos", [0,0,0], [[]]], ["_xText", "", [""]], ["_xIcon", "mil_dot", [""]], ["_xColor", [1,0,0,1], [[]]]]; + private _size = 0; + private _config = configFile >> "CfgMarkers" >> _xIcon; + if (isClass _config) then { + _size = 0.5 * getNumber (_config >> "size"); + _xIcon = getText (_config >> "icon"); // don't swap order + } else { + if (_xIcon != "") then { _size = 16 }; // could be a file or a CfgVehicleIcons class + }; + [_xIcon, _xColor, _xPos, _size, _size, 0, _xText, 0, 0.08] +}; + +if (_mapType isEqualType 0) then { + _mapType = [QGVAR(mapNormal), QGVAR(mapTopo), QGVAR(mapSat)] select _mapType; +}; +if ((!isClass (configFile >> _mapType)) && {(!isClass (missionConfigFile >> _mapType))}) then { + ERROR_1("bad map type %1",_mapType); +}; + +// set data in hash +if (isNil QGVAR(mapData)) then { GVAR(mapData) = createHashMap; }; +private _displayID = format ["ace_s_%1", count GVAR(mapData)]; +TRACE_1("setting hash",_displayID); +GVAR(mapData) set [_displayID, [_pos, _scale, _markers, _mapType, _userCode]]; + +// return texture name +format ['#(rgb,%1,%1,1)ui("%2","%3")', _resolution, QGVAR(mapDisplay), _displayID] diff --git a/addons/slideshow/functions/fnc_mapImage_init.sqf b/addons/slideshow/functions/fnc_mapImage_init.sqf new file mode 100644 index 0000000000..5235315bd0 --- /dev/null +++ b/addons/slideshow/functions/fnc_mapImage_init.sqf @@ -0,0 +1,67 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Initializes the map texture display. + * + * Arguments: + * 0: Display (default: displayNull) + * 1: Disply ID (default: "") + * + * Return Value: + * None + * + * Example: + * [findDisplay "ace_s_0"] call ace_slideshow_fnc_mapImage_init + * + * Public: No + */ + +params [["_display", displayNull], ["_displayID", ""]]; // only one of these will be valid +// On primary call from the display's onload we will only have the actual display +if (_displayID == "") then { _displayID = displayUniqueName _display; }; +// On the delayed call (due to hash missing) we will only have the displayID +if (isNull _display) then { _display = findDisplay _displayID; }; +TRACE_2("mapImage_init",_display,_displayID); + +// seems like display can sometimes not exist even though it does +// it won't be updated correctly, seems to depend on resolution, seems to be fixed mostly by the 2nd update run +if (isNull findDisplay _displayID) then { WARNING_1("possible problem with texture %1",_displayID); }; + +// make sure data exists in hash, there can be a race if server broadcasts texture before client can finish init.sqf +if (isNil QGVAR(mapData) || {!(_displayID in GVAR(mapData))}) exitWith { + WARNING_1("texture %1 has no data in hash",_displayID); + if (!isNull (param [0, displayNull])) then { // not a retry, checking using value from _this + [FUNC(mapImage_init), [displayNull, _displayID], 5] call CBA_fnc_waitAndExecute; + }; +}; + +(GVAR(mapData) get _displayID) params ["_posCenter", "_scale", "_markers", "_mapType", "_userCode"]; +TRACE_4("data",_posCenter,_scale,count _markers,_mapType); + +private _map = _display ctrlCreate [_mapType, -1]; +_map ctrlSetPosition [0, 0, 1, 1]; +_map ctrlCommit 0; +_map ctrlMapSetPosition []; + +_map ctrlMapAnimAdd [0, _scale, _posCenter]; +ctrlMapAnimCommit _map; + +[_map, _display, _displayID] call _userCode; + +// add drawEH to draw markers next update (they will get drawn 3 times total) +_map setVariable ["markers", _markers]; +_map ctrlAddEventHandler ["draw", { + params ["_map"]; + private _markers = _map getVariable ["markers", []]; + TRACE_2("drawing markers",_map,count _markers); + { _map drawIcon _x } forEach _markers; +}]; + +private _update = { + private _display = findDisplay _this; + if (isNull _display) exitWith {}; + TRACE_2("updating",_display,displayUniqueName _display); + displayUpdate _display; +}; +[_update, _displayID] call CBA_fnc_execNextFrame; // update after a frame so the map anim has time to take effect +[_update, _displayID, 2] call CBA_fnc_waitAndExecute; // update a bit later so textures hopefully have time to load diff --git a/addons/slideshow/functions/fnc_moduleInit.sqf b/addons/slideshow/functions/fnc_moduleInit.sqf index a8cf27ceec..896c64eb50 100644 --- a/addons/slideshow/functions/fnc_moduleInit.sqf +++ b/addons/slideshow/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the module. @@ -32,6 +32,7 @@ private _images = [_logic getVariable ["Images", ""], false, false] call EFUNC(c private _names = [_logic getVariable ["Names", ""], false, false] call EFUNC(common,parseList); private _setName = _logic getVariable ["SetName", ""]; private _duration = _logic getVariable ["Duration", 0]; +private _selection = _logic getVariable ["Selection", 0]; // Objects synced to the module { @@ -40,6 +41,6 @@ private _duration = _logic getVariable ["Duration", 0]; } count (synchronizedObjects _logic); // Prepare with actions -[_objects, _controllers, _images, _names, _duration, _setName] call FUNC(createSlideshow); +[_objects, _controllers, _images, _names, _duration, _setName, _selection] call FUNC(createSlideshow); INFO_1("Slideshow Module Initialized on %1 Objects",(count _objects)); diff --git a/addons/slideshow/functions/script_component.hpp b/addons/slideshow/functions/script_component.hpp deleted file mode 100644 index c4c2d6d966..0000000000 --- a/addons/slideshow/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\slideshow\script_component.hpp" diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 10adfc6457..d5d55b934e 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -30,9 +30,9 @@ Tento modul umožňuje nastavit prezentaci na různé objekty. Jeden modul na seznam s obrázky. Podporované jsou pouze objekty s hiddenSelection 0. Questo modulo ti permette di creare una presentazione con diapositive su vari oggetti. Un modulo per lista immagini. Solo oggetti con hiddenSelection 0 sono supportati. さまざまなオブジェクトへスライドショーを設定することができます。1つのモジュールは各画像リストになっています。オブジェクトが hiddenSelection 0へ対応している必要があります。 - 이 모듈은 다른 물체에 대해 슬라이드 쇼를 놓을 수 있게 해줍니다. 한 모듈당 한 이미지목록만 가능합니다. 또한 물체가 hiddenSelection 0 를 지원해야만합니다. + 이 모듈은 다른 물체에 대해 슬라이드 쇼를 놓을 수 있게 해줍니다. 한 모듈 당 한 이미지 목록만 가능합니다. 또한 hiddenSelection 0가 있는 물체만 지원됩니다. 此模塊可讓圖片以幻燈片的形式顯示在物件上,每個模塊都能設定一串幻燈片清單,被設定的物件不能有隱藏部位(hiddenSelection) - 此模块可让图片以幻灯片的形式显示在物件上,每个模块都能设定一串幻灯片清单,被设定的物件不能有隐藏部位(hiddenSelection) + 此模块可让图片以幻灯片的形式显示在物体上,每个模块都能设定一串幻灯片清单,被设定的物件不能有隐藏部位(hiddenSelection) Objects @@ -48,7 +48,7 @@ オブジェクト 물체 物件 - 物件 + 物体 Objeler @@ -65,7 +65,7 @@ スライドショーを表示するオブジェクト名 (オブジェクトとの同期も可)。複数ある場合はコンマで区切れます 슬라이드 쇼가 보여질 물체(동기화 되는 물체도 가능합니다) 명칭, 다수의 경우 쉼표로 구분합니다. 物件名稱 (也可使用同步線來設定),幻燈片將會顯示在該物件上,如有多個物件,請以逗號作區隔 - 物件名称 (也可使用同步线来设定),幻灯片将会显示在该物件上,如有多个物件,请以逗号作区隔 + 物体名称(也可使用同步线来设定),幻灯片将会显示在该物件上,如有多个物件,请以逗号作区隔 Controllers @@ -97,7 +97,7 @@ コントローラに指定するオブジェクト名を記入し、複数ある場合はコンマで区切れます。 조종 장치 물체 명칭, 다수의 경우 쉼표로 구분됩니다. 指定是控制器的物件名稱,如有多個物件,請以逗號作區隔 - 指定是控制器的物件名称,如有多个物件,请以逗号作区隔 + 指定是控制器的物体名称,如有多个物件,请以逗号作区隔 Jména kontrolních objektů, v případě více oddělená čárkami. @@ -131,7 +131,7 @@ 完全なパスでスライドショーに使う画像一覧を入力してください。コンマで区別できます。(例: images\image.paa) 슬라이드 쇼에 쓰일 사진목록입니다, 쉼표로 구분됩니다, 경로설정을 정확히 하십시요. (예: 사진\사진.ppa) 要做為幻燈片的圖片清單,每個圖片請已逗號區隔,並輸入完整路徑位址 (例如:images\image.paa) - 要做为幻灯片的图片清单,每个图片请已逗号区隔,并输入完整路径位址 (例如:images\image.paa) + 要做为幻灯片的图片清单,每个图片请已逗号区隔,并输入完整路径位址(例如:images\image.paa) Interaction Names @@ -160,7 +160,7 @@ Lista di nomi che verranno usati per per le interazioni, separati da virgole, in ordine per immagini. Liste aller Namen, die für Interaktionseinträge genutzt werden. Mit Kommata getrennt, in Reihenfolge der Bilder. 画像を操作できるインタラクション エントリ名の一覧を入力してください。コンマで区切り複数を指定できます。 - 상호작용 메세지에 쓰일 명칭입니다, 쉼표로 구분합니다, 이미지의 순서입니다. + 상호작용 메시지에 쓰일 명칭입니다, 쉼표로 구분합니다, 이미지의 순서입니다. 設定互動鍵切換圖片時的按鈕名稱,多個按鈕請以逗號做區隔,有多少圖片就輸入多少個按鈕,以利切換圖片 设定互动键切换图片时的按钮名称,多个按钮请以逗号做区隔,有多少图片就输入多少个按钮,以利切换图片 Seznam jmen které budou použity pro interakce, oddělené čárkami, v pořadí obrázků. @@ -188,8 +188,8 @@ 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" Имя, которое будет использоваться для основных взаимодействий (для различения нескольких слайдов). По умолчанию: «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 @@ -207,7 +207,7 @@ Durata Diapositiva Länge der Diavorführung pro Bild スライドの持続時間 - 슬라이드 지속시간 + 슬라이드 지속 시간 幻燈片顯示時間 幻灯片显示时间 @@ -217,15 +217,37 @@ 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) - Длительность каждого слайда. По-умолчанию: 0 (автоматический переход отключен) + Длительность каждого слайда. По умолчанию: 0 (автоматический переход отключен) Duración de cada diapositiva. Por defecto: 0 (Transiciones automáticas desactivadas) Doba trvání každého snímku. Výchozí: 0 (Automatické posouvání je zakázáno) Durata di ogni diapositiva. Default: 0 (Transizioni Automatiche Disabilitate) Länge der Diavorführung pro Bild. Standard: 0 (Automatischer Wechsel deaktiviert) - 各スライドの持続時間。標準:0 (自動的な切り替えは無効) - 매 슬라이드의 지속시간. 기본설정: 0 (자동 전환 비활성화) + 各スライドの持続時間。標準:0 (自動的な切り替えは無効) + 매 슬라이드의 지속 시간. 기본설정: 0 (자동 전환 비활성화) 每張幻燈片顯示的時間。 預設:0 (自動換圖已禁用) - 每张幻灯片显示的时间。 预设:0 (自动换图已禁用) + 每张幻灯片显示的时间。 预设:0(自动换图已禁用) + + + Texture Selection + 纹理选择 + 텍스쳐 선택 + 텍스쳐 선택 + Auswahl der Textur + Wybór Tekstury + テクスチャの選択 + Выбор текстуры + Selección de texturas + + + Object texture selection. Default: 0 + 物体纹理选择(默认:0) + 개체 텍스처 선택(기본값: 0) + 물체의 텍스쳐를 선택합니다. 기본: 0 + Auswahl der Objekttextur. Standard: 0 + Wybór tekstury obiektu. Domyślnie: 0 + オブジェクトテクスチャの選択。デフォルト: 0 + Выбор текстуры объекта. По умолчанию: 0 + Selección de textura de objeto. Defecto: 0 Slides diff --git a/addons/smallarms/stringtable.xml b/addons/smallarms/stringtable.xml index 2277426d78..71a1ecb615 100644 --- a/addons/smallarms/stringtable.xml +++ b/addons/smallarms/stringtable.xml @@ -13,7 +13,7 @@ 9 mm, 17ks zásobník Carregador 17Mun. 9 mm 9mm 17발 탄창 - 9 毫米 17 发弹匣 + 9 mm 17发 弹匣 9mm 17Rnd マガジン 9 mm 17 Merm. Şarjör @@ -27,6 +27,8 @@ .45 ACP, 25ks zásobník .45 ACP 25 Merm. Şarjör .45 ACP 25Rnd マガジン + .45 ACP 25发 弹匣 + .45 ACP 25발 탄창 .45 ACP 25Rnd Tracers (Green) Mag @@ -38,6 +40,8 @@ .45 ACP, 25ks zásobník stopovky (zelené) .45 ACP 25 Merm. İzli (Yeşil) Şarjör .45 ACP 25Rnd 曳光弾 (緑) マガジン + .45 ACP 25发 弹匣(曳光,绿) + .45 ACP 25발 예광탄 (초록) 탄창 .45 ACP 25Rnd Tracers (Red) Mag @@ -49,6 +53,8 @@ .45 ACP, 25ks zásobník stopovky (červené) .45 ACP 25 Merm. İzli (Kırmızı) Şarjör .45 ACP 25Rnd 曳光弾 (赤) マガジン + .45 ACP 25发 弹匣(曳光,红) + .45 ACP 25발 예광탄 (빨강) 탄창 .45 ACP 25Rnd Tracers (Yellow) Mag @@ -60,6 +66,8 @@ .45 ACP, 25ks zásobník stopovky (žluté) .45 ACP 25 Merm. İzli (Sarı) Şarjör .45 ACP 25Rnd 曳光弾 (黄) マガジン + .45 ACP 25发 弹匣(曳光,黄) + .45 ACP 25발 예광탄 (노랑) 탄창 .45 ACP 8Rnd Mag @@ -71,6 +79,8 @@ .45 ACP, 8ks zásobník .45 ACP 8 Merm. Şarjör .45 ACP 8Rnd マガジン + .45 ACP 8发 弹匣 + .45 ACP 8발 탄창 .45 ACP 15Rnd Mag @@ -82,6 +92,8 @@ .45 ACP, 15ks zásobník .45 ACP 15 Merm. Şarjör .45 ACP 15Rnd マガジン + .45 ACP 15发 弹匣 + .45 ACP 15발 탄창 diff --git a/addons/spectator/README.md b/addons/spectator/README.md index 17d0c7b1f5..18cf2e585d 100644 --- a/addons/spectator/README.md +++ b/addons/spectator/README.md @@ -5,5 +5,5 @@ A flexible spectator framework for mission makers to use. Includes a public API for integration into custom respawn frameworks and a template for use with the vanilla respawn framework. -For more information, see: http://ace3mod.com/wiki/feature/spectator.html +For more information, see: http://ace3.acemod.org/wiki/feature/spectator.html diff --git a/addons/spectator/config.cpp b/addons/spectator/config.cpp index 44f98b6931..a50e3f34ed 100644 --- a/addons/spectator/config.cpp +++ b/addons/spectator/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); - authors[] = {"F3 Project","Head","SilentSpike","voiper"}; + authors[] = {"F3 Project","Head","kymckay","voiper"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/spectator/functions/fnc_cam.sqf b/addons/spectator/functions/fnc_cam.sqf index d61fff40c1..d63a3c24a8 100644 --- a/addons/spectator/functions/fnc_cam.sqf +++ b/addons/spectator/functions/fnc_cam.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Handles camera initialisation and destruction * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_prepareTarget.sqf b/addons/spectator/functions/fnc_cam_prepareTarget.sqf index 21ced5addd..559b7b20db 100644 --- a/addons/spectator/functions/fnc_cam_prepareTarget.sqf +++ b/addons/spectator/functions/fnc_cam_prepareTarget.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Moves the spectator camera to a position relative to the camera focus. * Used for 3PP camera and teleporting, etc. * diff --git a/addons/spectator/functions/fnc_cam_resetTarget.sqf b/addons/spectator/functions/fnc_cam_resetTarget.sqf index 5286d944e3..dd0dd6fc31 100644 --- a/addons/spectator/functions/fnc_cam_resetTarget.sqf +++ b/addons/spectator/functions/fnc_cam_resetTarget.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Removes the current camera interest and detaches dummy target. * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_setCameraMode.sqf b/addons/spectator/functions/fnc_cam_setCameraMode.sqf index 3943823f8a..2b0af6a80b 100644 --- a/addons/spectator/functions/fnc_cam_setCameraMode.sqf +++ b/addons/spectator/functions/fnc_cam_setCameraMode.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to select the camera mode * * Intended to run even if new mode == old mode, as it handles focus diff --git a/addons/spectator/functions/fnc_cam_setTarget.sqf b/addons/spectator/functions/fnc_cam_setTarget.sqf index 4587af8c34..9fbd51a64b 100644 --- a/addons/spectator/functions/fnc_cam_setTarget.sqf +++ b/addons/spectator/functions/fnc_cam_setTarget.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Sets the current camera interest using dummy target. * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_setVisionMode.sqf b/addons/spectator/functions/fnc_cam_setVisionMode.sqf index ccc761934d..5bcf8710b6 100644 --- a/addons/spectator/functions/fnc_cam_setVisionMode.sqf +++ b/addons/spectator/functions/fnc_cam_setVisionMode.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Function used to select the camera vision mode * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_tick.sqf b/addons/spectator/functions/fnc_cam_tick.sqf index 3ec0dbe5e6..1e7e1b9913 100644 --- a/addons/spectator/functions/fnc_cam_tick.sqf +++ b/addons/spectator/functions/fnc_cam_tick.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to perform camera ticks * * Updates camera position in follow mode diff --git a/addons/spectator/functions/fnc_cam_toggleSlow.sqf b/addons/spectator/functions/fnc_cam_toggleSlow.sqf index e6b8732cdb..758598829c 100644 --- a/addons/spectator/functions/fnc_cam_toggleSlow.sqf +++ b/addons/spectator/functions/fnc_cam_toggleSlow.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Function used to set camera slow speed mode * * Arguments: diff --git a/addons/spectator/functions/fnc_compat_counter.sqf b/addons/spectator/functions/fnc_compat_counter.sqf index 158bcbd0a5..00bd176732 100644 --- a/addons/spectator/functions/fnc_compat_counter.sqf +++ b/addons/spectator/functions/fnc_compat_counter.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles integrating the counter respawn template into the spectator UI * * Should be called from both RscRespawnCounter XEH and spectator init to account for arbitrary order diff --git a/addons/spectator/functions/fnc_compat_spectatorBI.sqf b/addons/spectator/functions/fnc_compat_spectatorBI.sqf index f8817468f1..3d982830a0 100644 --- a/addons/spectator/functions/fnc_compat_spectatorBI.sqf +++ b/addons/spectator/functions/fnc_compat_spectatorBI.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles "compatibility" (i.e. override) for BI spectator respawn types 1, 4 & 5 * * Called from the RscDisplayEGSpectator XEH diff --git a/addons/spectator/functions/fnc_compat_zeus.sqf b/addons/spectator/functions/fnc_compat_zeus.sqf index a8f190bdd4..8cd0b3e464 100644 --- a/addons/spectator/functions/fnc_compat_zeus.sqf +++ b/addons/spectator/functions/fnc_compat_zeus.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles compatibility with curator interface (i.e. re-opens spectator if applicable) * * Called from the RscDisplayCurator XEH diff --git a/addons/spectator/functions/fnc_getCameraAttributes.sqf b/addons/spectator/functions/fnc_getCameraAttributes.sqf index 9998d37431..b4da802276 100644 --- a/addons/spectator/functions/fnc_getCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_getCameraAttributes.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Returns the current spectator camera attributes (see setCameraAttributes for details). * * Arguments: diff --git a/addons/spectator/functions/fnc_getGroupIcon.sqf b/addons/spectator/functions/fnc_getGroupIcon.sqf index a408df73dc..64db9e7297 100644 --- a/addons/spectator/functions/fnc_getGroupIcon.sqf +++ b/addons/spectator/functions/fnc_getGroupIcon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Function used to get an appropriate icon for provided group. Approximate. * * Arguments: diff --git a/addons/spectator/functions/fnc_getTargetEntities.sqf b/addons/spectator/functions/fnc_getTargetEntities.sqf index 162967a1aa..352f3f9c18 100644 --- a/addons/spectator/functions/fnc_getTargetEntities.sqf +++ b/addons/spectator/functions/fnc_getTargetEntities.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Gets the possible entities to spectate based on settings. * Optionally includes dead units for the list and switching. * diff --git a/addons/spectator/functions/fnc_handleFired.sqf b/addons/spectator/functions/fnc_handleFired.sqf index b2efb97a5d..f8683af947 100644 --- a/addons/spectator/functions/fnc_handleFired.sqf +++ b/addons/spectator/functions/fnc_handleFired.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to add projectiles to be drawn when a unit fires * * Arguments: diff --git a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf index 267ce5615f..05b780539c 100644 --- a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf +++ b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Read spectator settings from module * * Arguments: diff --git a/addons/spectator/functions/fnc_players.sqf b/addons/spectator/functions/fnc_players.sqf index f79c6ce5e9..9dc2fa7d1f 100644 --- a/addons/spectator/functions/fnc_players.sqf +++ b/addons/spectator/functions/fnc_players.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Return all of the player entities who are currently in ace spectator * * Arguments: diff --git a/addons/spectator/functions/fnc_respawnTemplate.sqf b/addons/spectator/functions/fnc_respawnTemplate.sqf index 9cd54ac005..f93ac60ce0 100644 --- a/addons/spectator/functions/fnc_respawnTemplate.sqf +++ b/addons/spectator/functions/fnc_respawnTemplate.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * The ace_spectator respawn template, compatible with types 1,2,3,4 & 5 * * Handles killed and respawned events as per BI's respawn framework: diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf index 91db9c70c7..f33f23c09a 100644 --- a/addons/spectator/functions/fnc_setCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Sets the spectator camera attributes as desired. Local effect. * All values are optional and default to no change. * diff --git a/addons/spectator/functions/fnc_setFocus.sqf b/addons/spectator/functions/fnc_setFocus.sqf index f524341a1f..6a897506b6 100644 --- a/addons/spectator/functions/fnc_setFocus.sqf +++ b/addons/spectator/functions/fnc_setFocus.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: AACO, SilentSpike + * Author: AACO, kymckay * Function used to set the camera focus * * Arguments: diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index d9942cc3ab..441baa7ab4 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Enter/exit spectator mode for the local player * * Client will be able to communicate in ACRE/TFAR as appropriate diff --git a/addons/spectator/functions/fnc_switchFocus.sqf b/addons/spectator/functions/fnc_switchFocus.sqf index 8083a15e0f..c501ac4bb4 100644 --- a/addons/spectator/functions/fnc_switchFocus.sqf +++ b/addons/spectator/functions/fnc_switchFocus.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Function used to switch to next or previous camera focus * * Arguments: diff --git a/addons/spectator/functions/fnc_ui.sqf b/addons/spectator/functions/fnc_ui.sqf index f97dea3eb8..70e079105a 100644 --- a/addons/spectator/functions/fnc_ui.sqf +++ b/addons/spectator/functions/fnc_ui.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles UI initialisation and destruction * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_draw3D.sqf b/addons/spectator/functions/fnc_ui_draw3D.sqf index 6affd3f8b6..066df4a69f 100644 --- a/addons/spectator/functions/fnc_ui_draw3D.sqf +++ b/addons/spectator/functions/fnc_ui_draw3D.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to draw the 3D icons and track the cursor object * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_fadeList.sqf b/addons/spectator/functions/fnc_ui_fadeList.sqf index c365ca4824..59c1728375 100644 --- a/addons/spectator/functions/fnc_ui_fadeList.sqf +++ b/addons/spectator/functions/fnc_ui_fadeList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to fade/unfade the entitiy list diff --git a/addons/spectator/functions/fnc_ui_getTreeDataIndex.sqf b/addons/spectator/functions/fnc_ui_getTreeDataIndex.sqf index 73d6cf8e89..04c29b5808 100644 --- a/addons/spectator/functions/fnc_ui_getTreeDataIndex.sqf +++ b/addons/spectator/functions/fnc_ui_getTreeDataIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to find the tree path of an entity diff --git a/addons/spectator/functions/fnc_ui_handleChildDestroyed.sqf b/addons/spectator/functions/fnc_ui_handleChildDestroyed.sqf index abebcbc69f..0d878da7e1 100644 --- a/addons/spectator/functions/fnc_ui_handleChildDestroyed.sqf +++ b/addons/spectator/functions/fnc_ui_handleChildDestroyed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte * Function used to handle child destroyed event diff --git a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf index 25a50d140b..c26a06786d 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle key down event * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf index cf08d4caf6..d43db403c2 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Function used to handle key up event * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleListClick.sqf b/addons/spectator/functions/fnc_ui_handleListClick.sqf index 225623668d..600b7e711c 100644 --- a/addons/spectator/functions/fnc_ui_handleListClick.sqf +++ b/addons/spectator/functions/fnc_ui_handleListClick.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle list single/double clicks * * Expected behaviour: diff --git a/addons/spectator/functions/fnc_ui_handleLoad.sqf b/addons/spectator/functions/fnc_ui_handleLoad.sqf index bc6493e3f5..bc1942437d 100644 --- a/addons/spectator/functions/fnc_ui_handleLoad.sqf +++ b/addons/spectator/functions/fnc_ui_handleLoad.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, Jonpas + * Author: kymckay, Jonpas * Function used to handle load event. * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleMapClick.sqf b/addons/spectator/functions/fnc_ui_handleMapClick.sqf index 6d4e17e401..6dc7719bf3 100644 --- a/addons/spectator/functions/fnc_ui_handleMapClick.sqf +++ b/addons/spectator/functions/fnc_ui_handleMapClick.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to handle map mouse click events diff --git a/addons/spectator/functions/fnc_ui_handleMapDraw.sqf b/addons/spectator/functions/fnc_ui_handleMapDraw.sqf index 676774df2d..eeb7ea22f3 100644 --- a/addons/spectator/functions/fnc_ui_handleMapDraw.sqf +++ b/addons/spectator/functions/fnc_ui_handleMapDraw.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to handle map draw diff --git a/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf b/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf index ec7632e207..b154eb868a 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle mouse button double clicks * * Expected behaviour: diff --git a/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf b/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf index da74c071ba..eaf1ea3817 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle mouse down event * * Expected behaviour: diff --git a/addons/spectator/functions/fnc_ui_handleMouseMoving.sqf b/addons/spectator/functions/fnc_ui_handleMouseMoving.sqf index de652f8845..2bc234cd9b 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseMoving.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseMoving.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to handle mouse moving event diff --git a/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf b/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf index b402d9830e..b58e290cf3 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseZChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to handle mouse scroll event diff --git a/addons/spectator/functions/fnc_ui_handleUnload.sqf b/addons/spectator/functions/fnc_ui_handleUnload.sqf index 8d9f92a262..0bf76b86b9 100644 --- a/addons/spectator/functions/fnc_ui_handleUnload.sqf +++ b/addons/spectator/functions/fnc_ui_handleUnload.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Function used to handle unload event. diff --git a/addons/spectator/functions/fnc_ui_toggleMap.sqf b/addons/spectator/functions/fnc_ui_toggleMap.sqf index c968f39512..d9863663f1 100644 --- a/addons/spectator/functions/fnc_ui_toggleMap.sqf +++ b/addons/spectator/functions/fnc_ui_toggleMap.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Nelson Duarte, AACO * Function used to toggle the map diff --git a/addons/spectator/functions/fnc_ui_toggleUI.sqf b/addons/spectator/functions/fnc_ui_toggleUI.sqf index 7e6716ba5e..ff34798c69 100644 --- a/addons/spectator/functions/fnc_ui_toggleUI.sqf +++ b/addons/spectator/functions/fnc_ui_toggleUI.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to toggle the whole user interface * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateCamButtons.sqf b/addons/spectator/functions/fnc_ui_updateCamButtons.sqf index 77a8b3ca17..dc41422c17 100644 --- a/addons/spectator/functions/fnc_ui_updateCamButtons.sqf +++ b/addons/spectator/functions/fnc_ui_updateCamButtons.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Used to update the docked camera buttons * Disables unavailable, highlights current * diff --git a/addons/spectator/functions/fnc_ui_updateHelp.sqf b/addons/spectator/functions/fnc_ui_updateHelp.sqf index d1187ae355..1ddbbacad9 100644 --- a/addons/spectator/functions/fnc_ui_updateHelp.sqf +++ b/addons/spectator/functions/fnc_ui_updateHelp.sqf @@ -1,7 +1,7 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Updates spectator UI help element * * Note that there are some redundant conditions in this file diff --git a/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf b/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf index db3065c360..6093467d63 100644 --- a/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf +++ b/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used update the things to 3D draw * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateListEntities.sqf b/addons/spectator/functions/fnc_ui_updateListEntities.sqf index 228dd86a27..000f9a4b22 100644 --- a/addons/spectator/functions/fnc_ui_updateListEntities.sqf +++ b/addons/spectator/functions/fnc_ui_updateListEntities.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Updates spectator UI list of units/groups * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateListFocus.sqf b/addons/spectator/functions/fnc_ui_updateListFocus.sqf index 3ac112e2cb..db82787098 100644 --- a/addons/spectator/functions/fnc_ui_updateListFocus.sqf +++ b/addons/spectator/functions/fnc_ui_updateListFocus.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to update the list current selection * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateWidget.sqf b/addons/spectator/functions/fnc_ui_updateWidget.sqf index 68a0c1fe4f..78128d3b00 100644 --- a/addons/spectator/functions/fnc_ui_updateWidget.sqf +++ b/addons/spectator/functions/fnc_ui_updateWidget.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Updates spectator UI unit info widget * * Arguments: diff --git a/addons/spectator/functions/fnc_updateCameraModes.sqf b/addons/spectator/functions/fnc_updateCameraModes.sqf index c3adf327da..b188f5d747 100644 --- a/addons/spectator/functions/fnc_updateCameraModes.sqf +++ b/addons/spectator/functions/fnc_updateCameraModes.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds or removes spectator camera modes from the selection available to the local player. * Possible camera modes are: * - 0: Free diff --git a/addons/spectator/functions/fnc_updateSides.sqf b/addons/spectator/functions/fnc_updateSides.sqf index 1f612a3080..ca6107d0ed 100644 --- a/addons/spectator/functions/fnc_updateSides.sqf +++ b/addons/spectator/functions/fnc_updateSides.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds or removes sides from the selection available to spectate. Local effect. * * Default selection is [west,east,resistance,civilian] diff --git a/addons/spectator/functions/fnc_updateUnits.sqf b/addons/spectator/functions/fnc_updateUnits.sqf index a32198c3de..19522e29d8 100644 --- a/addons/spectator/functions/fnc_updateUnits.sqf +++ b/addons/spectator/functions/fnc_updateUnits.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds and removed units from the spectator list. Local effect. * * Arguments: diff --git a/addons/spectator/functions/fnc_updateVisionModes.sqf b/addons/spectator/functions/fnc_updateVisionModes.sqf index ba19bca86b..1265ff12fc 100644 --- a/addons/spectator/functions/fnc_updateVisionModes.sqf +++ b/addons/spectator/functions/fnc_updateVisionModes.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds or removes spectator vision modes from the selection available to the local player. * * Possible vision modes are: diff --git a/addons/spectator/functions/script_component.hpp b/addons/spectator/functions/script_component.hpp deleted file mode 100644 index d5034cb39c..0000000000 --- a/addons/spectator/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\spectator\script_component.hpp" \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 5467eb6cc3..5b92878c98 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -38,7 +38,7 @@ Konfiguriert den Zuschauermodus Skonfiguruj domyślne ustawienia obserwatora. Configura como o sistema de espectador operará por padrão. - Определяют, как система спектатора будет функционировать по-умолчанию. + Определяют, как система спектатора будет функционировать по умолчанию. Configurar cómo el sistema de espectador funcionará por defecto. Konfigurovat výchozí nastavení pozorovatele Configura come il sistema spettatore si comporterà di default. @@ -51,10 +51,10 @@ AI Enabled KI Sichtbarkeit - AI にも有効化 + AIにも有効化 AI Abilitate 可觀察AI - 可观察AI + 可观察 AI AI 활성 IA visible SI Aktywowane @@ -67,11 +67,11 @@ Make AI viewable in spectator Macht KI-Einheiten den Zuschauern sichtbar - スペクテイターで AI 視点を可能に + スペクテイターでAI視点を可能に Permette la visibilità delle AI in spettatore 開啟此功能後可在觀察者模式下觀察AI單位 - 开启此功能后可在观察者模式下观察AI单位。 - 관전자가 AI를 관전 할 수 있습니다. + 开启此功能后可在观察者模式下观察 AI 单位。 + 관전자가 AI를 관전할 수 있습니다. Rend les unités IA visibles en spectateur. Spraw, aby SI było widoczne jako obserwator Сделать ИИ видимыми в режиме зрителя @@ -136,7 +136,7 @@ 1PP und 3PP 1. a 3. osoby 1ª e 3ª pessoa - 1PP 과 3PP 카메라 + 1인칭과 3인칭 카메라 一人称と三人称 第一人稱與第三人稱 第一人称与第三人称 @@ -212,11 +212,13 @@ 最大追随距離 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 Distancia máxima de seguimiento + 최대 추적 거리 Maximum distance the follow camera can be from the target @@ -225,11 +227,13 @@ カメラが目標へ追随できる最大距離を決定できます。 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 Distancia máxima que la cámara de seguimiento puede estar del objetivo + 카메라가 목표를 따라갈 수 있는 최대 거리를 설정합니다. @@ -259,7 +263,7 @@ Libera Libre 自由視点 - 자유 + 자유시점 自由模式 自由模式 Serbest @@ -275,7 +279,7 @@ Normale Normale 通常 - 정상 + 일반 正常 正常 Normal diff --git a/addons/spectator/ui.hpp b/addons/spectator/ui.hpp index 8ffd1b5ebd..f61e7749ee 100644 --- a/addons/spectator/ui.hpp +++ b/addons/spectator/ui.hpp @@ -55,9 +55,9 @@ class GVAR(display) { onTreeDblClick = QUOTE([ARR_2(true,_this)] call FUNC(ui_handleListClick)); x = "safeZoneX"; - y = safeZoneY + H_PART(1.5); - w = W_PART(13.5); - h = safeZoneH - H_PART(1.5); + y = QUOTE(safeZoneY + H_PART(1.5)); + w = QUOTE(W_PART(13.5)); + h = QUOTE(safeZoneH - H_PART(1.5)); disableKeyboardSearch = 1; multiselectEnabled = 0; @@ -83,30 +83,30 @@ class GVAR(display) { x = "safeZoneX"; y = "safezoneY"; - w = W_PART(13.5); - h = H_PART(1.5); + w = QUOTE(W_PART(13.5)); + h = QUOTE(H_PART(1.5)); fade = 0.5; rows = 1; columns = 1; strings[] = {"$STR_A3_Spectator_Entities"}; values[] = {0}; - sizeEx = H_PART(1); + sizeEx = QUOTE(H_PART(1)); colorBackground[] = {0,0,0,0.75}; colorSelectedBg[] = {0,0,0,0.65}; }; class CameraTypesGroup: RscControlsGroupNoScrollbars { idc = IDC_CAM_TYPES; - x = X_PART(15.5); - y = safezoneY + safezoneH - H_PART(2.38); - w = W_PART(8.6); + x = QUOTE(X_PART(15.5)); + y = QUOTE(safezoneY + safezoneH - H_PART(2.38)); + w = QUOTE(W_PART(8.6)); h = 2.6; class controls { class CameraTypesBackground: RscText { - x = W_PART(0.6); - y = H_PART(0.4); - w = W_PART(7.5); - h = H_PART(2); + x = QUOTE(W_PART(0.6)); + y = QUOTE(H_PART(0.4)); + w = QUOTE(W_PART(7.5)); + h = QUOTE(H_PART(2)); colorBackground[] = {0,0,0,0.75}; }; class Free: RscButton { @@ -115,10 +115,10 @@ class GVAR(display) { onButtonClick = QUOTE([MODE_FREE] call FUNC(cam_setCameraMode)); - x = W_PART(1.3); - y = H_PART(0.8); - w = W_PART(1.63); - h = H_PART(1.37); + x = QUOTE(W_PART(1.3)); + y = QUOTE(H_PART(0.8)); + w = QUOTE(W_PART(1.63)); + h = QUOTE(H_PART(1.37)); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; @@ -133,10 +133,10 @@ class GVAR(display) { onButtonClick = QUOTE([MODE_FOLLOW] call FUNC(cam_setCameraMode)); - x = W_PART(3.6); - y = H_PART(0.8); - w = W_PART(1.63); - h = H_PART(1.37); + x = QUOTE(W_PART(3.6)); + y = QUOTE(H_PART(0.8)); + w = QUOTE(W_PART(1.63)); + h = QUOTE(H_PART(1.37)); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; @@ -151,10 +151,10 @@ class GVAR(display) { onButtonClick = QUOTE([MODE_FPS] call FUNC(cam_setCameraMode)); - x = W_PART(5.8); - y = H_PART(0.8); - w = W_PART(1.63); - h = H_PART(1.37); + x = QUOTE(W_PART(5.8)); + y = QUOTE(H_PART(0.8)); + w = QUOTE(W_PART(1.63)); + h = QUOTE(H_PART(1.37)); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; @@ -189,7 +189,7 @@ class GVAR(display) { text = ""; style = 2; colorBackground[] = {0,0,0,0.75}; - sizeEx = H_PART(1); + sizeEx = QUOTE(H_PART(1)); }; class GameTimeText: RscText { idc = IDC_TIME; @@ -198,7 +198,7 @@ class GVAR(display) { w = 0.29; h = 0.03; text = "00:00:00"; - sizeEx = H_PART(1); + sizeEx = QUOTE(H_PART(1)); }; class MapTitle: RscText { idc = IDC_MAP_TITLE; @@ -208,7 +208,7 @@ class GVAR(display) { h = 0.03; text = ""; colorText[] = {1,1,1,1}; - sizeEx = H_PART(1); + sizeEx = QUOTE(H_PART(1)); }; class SpectatorsCount: RscText { idc = IDC_MAP_SPEC_NUM; @@ -218,7 +218,7 @@ class GVAR(display) { h = 0.03; text = ""; colorText[] = {1,1,1,1}; - sizeEx = H_PART(1); + sizeEx = QUOTE(H_PART(1)); }; class SpectatorsIcon: RscPictureKeepAspect { x = 0.94; @@ -245,214 +245,214 @@ class GVAR(display) { }; class HelpBackground: RscText { idc = IDC_HELP_BACK; - x = safezoneX + safezoneW - W_PART(12); - y = safezoneY + safezoneH - H_PART(8); - w = W_PART(12); - h = H_PART(8); + x = QUOTE(safezoneX + safezoneW - W_PART(12)); + y = QUOTE(safezoneY + safezoneH - H_PART(8)); + w = QUOTE(W_PART(12)); + h = QUOTE(H_PART(8)); colorBackground[] = {0,0,0,0.75}; }; class Help: RscListNBox { class ListScrollBar: ScrollBar {}; disableOverflow = 0; - rowHeight = H_PART(1); + rowHeight = QUOTE(H_PART(1)); idc = IDC_HELP; - x = safezoneX + safezoneW - W_PART(12); - y = safezoneY + safezoneH - H_PART(12); - w = W_PART(12); - h = H_PART(12); + x = QUOTE(safezoneX + safezoneW - W_PART(12)); + y = QUOTE(safezoneY + safezoneH - H_PART(12)); + w = QUOTE(W_PART(12)); + h = QUOTE(H_PART(12)); }; class FocusInfo: RscControlsGroupNoScrollbars { idc = IDC_WIDGET; - x = X_PART(12.9); - y = Y_PART(24); - w = W_PART(14.2); - h = H_PART(3.5); + x = QUOTE(X_PART(12.9)); + y = QUOTE(Y_PART(24)); + w = QUOTE(W_PART(14.2)); + h = QUOTE(H_PART(3.5)); class controls { class UpperBackground: RscText { x = 0; y = 0; - w = W_PART(14.2); - h = H_PART(1.4); + w = QUOTE(W_PART(14.2)); + h = QUOTE(H_PART(1.4)); colorBackground[] = {0,0,0,0.75}; }; class StatsBackground: RscText { x = 0; - y = H_PART(1.5); - w = W_PART(6); - h = H_PART(2); + y = QUOTE(H_PART(1.5)); + w = QUOTE(W_PART(6)); + h = QUOTE(H_PART(2)); colorBackground[] = {0,0,0,0.75}; }; class WeaponBackground: RscText { - x = W_PART(6.1); - y = H_PART(1.5); - w = W_PART(6); - h = H_PART(2); + x = QUOTE(W_PART(6.1)); + y = QUOTE(H_PART(1.5)); + w = QUOTE(W_PART(6)); + h = QUOTE(H_PART(2)); colorBackground[] = {1,1,1,0.4}; }; class ThrowableBackground: RscText { - x = W_PART(12.2); - y = H_PART(1.5); - w = W_PART(2); - h = H_PART(2); + x = QUOTE(W_PART(12.2)); + y = QUOTE(H_PART(1.5)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(2)); colorBackground[] = {1,1,1,0.4}; }; class Name: RscText { shadow = 0; idc = IDC_WIDGET_NAME; text = ""; - x = W_PART(0.1); - y = H_PART(0.1); - w = W_PART(10.8); - h = H_PART(1.2); - sizeEx = H_PART(1); + x = QUOTE(W_PART(0.1)); + y = QUOTE(H_PART(0.1)); + w = QUOTE(W_PART(10.8)); + h = QUOTE(H_PART(1.2)); + sizeEx = QUOTE(H_PART(1)); }; class VehiclePos: RscPictureKeepAspect { idc = IDC_WIDGET_VEHICLE_POS; text = ""; - x = W_PART(11); - y = H_PART(0.2); - w = W_PART(1); - h = H_PART(1); + x = QUOTE(W_PART(11)); + y = QUOTE(H_PART(0.2)); + w = QUOTE(W_PART(1)); + h = QUOTE(H_PART(1)); }; class VehicleType: RscPicture { idc = IDC_WIDGET_VEHICLE; text = ""; - x = W_PART(12.1); - y = H_PART(0.2); - w = W_PART(2); - h = H_PART(1); + x = QUOTE(W_PART(12.1)); + y = QUOTE(H_PART(0.2)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(1)); }; class UnitType: RscPictureKeepAspect { idc = IDC_WIDGET_UNIT; text = ""; - x = W_PART(13.1); - y = H_PART(0.2); - w = W_PART(1); - h = H_PART(1); + x = QUOTE(W_PART(13.1)); + y = QUOTE(H_PART(0.2)); + w = QUOTE(W_PART(1)); + h = QUOTE(H_PART(1)); }; class Kills: RscPictureKeepAspect { text = "a3\Ui_f\data\IGUI\Cfg\MPTable\infantry_ca.paa"; - x = W_PART(0.1); - y = H_PART(1.6); - w = W_PART(0.8); - h = H_PART(0.8); + x = QUOTE(W_PART(0.1)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.8)); }; class LandKills: RscPictureKeepAspect { text = "a3\Ui_f\data\IGUI\Cfg\MPTable\soft_ca.paa"; - x = W_PART(1.1); - y = H_PART(1.6); - w = W_PART(0.8); - h = H_PART(0.8); + x = QUOTE(W_PART(1.1)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.8)); }; class ArmoredKills: RscPictureKeepAspect { text = "a3\Ui_f\data\IGUI\Cfg\MPTable\armored_ca.paa"; - x = W_PART(2.1); - y = H_PART(1.6); - w = W_PART(0.8); - h = H_PART(0.8); + x = QUOTE(W_PART(2.1)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.8)); }; class AirKills: RscPictureKeepAspect { text = "a3\Ui_f\data\IGUI\Cfg\MPTable\air_ca.paa"; - x = W_PART(3.1); - y = H_PART(1.6); - w = W_PART(0.8); - h = H_PART(0.8); + x = QUOTE(W_PART(3.1)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.8)); }; class Deaths: RscPictureKeepAspect { text = "a3\Ui_f\data\IGUI\Cfg\MPTable\killed_ca.paa"; - x = W_PART(4.1); - y = H_PART(1.6); - w = W_PART(0.8); - h = H_PART(0.8); + x = QUOTE(W_PART(4.1)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.8)); }; class Total: RscPictureKeepAspect { text = "a3\Ui_f\data\IGUI\Cfg\MPTable\total_ca.paa"; - x = W_PART(5.1); - y = H_PART(1.6); - w = W_PART(0.8); - h = H_PART(0.8); + x = QUOTE(W_PART(5.1)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.8)); }; class Kills_Count: RscText { style = 2; shadow = 0; idc = IDC_WIDGET_KILLS; text = ""; - x = W_PART(0.1); - y = H_PART(2.5); - w = W_PART(0.8); - h = H_PART(0.9); - sizeEx = H_PART(0.7); + x = QUOTE(W_PART(0.1)); + y = QUOTE(H_PART(2.5)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.9)); + sizeEx = QUOTE(H_PART(0.7)); }; class LandKills_Count: RscText { style = 2; shadow = 0; idc = IDC_WIDGET_LAND; text = ""; - x = W_PART(1.1); - y = H_PART(2.5); - w = W_PART(0.8); - h = H_PART(0.9); - sizeEx = H_PART(0.7); + x = QUOTE(W_PART(1.1)); + y = QUOTE(H_PART(2.5)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.9)); + sizeEx = QUOTE(H_PART(0.7)); }; class ArmoredKills_Count: RscText { style = 2; shadow = 0; idc = IDC_WIDGET_ARMORED; text = ""; - x = W_PART(2.1); - y = H_PART(2.5); - w = W_PART(0.8); - h = H_PART(0.9); - sizeEx = H_PART(0.7); + x = QUOTE(W_PART(2.1)); + y = QUOTE(H_PART(2.5)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.9)); + sizeEx = QUOTE(H_PART(0.7)); }; class AirKills_Count: RscText { style = 2; shadow = 0; idc = IDC_WIDGET_AIR; text = ""; - x = W_PART(3.1); - y = H_PART(2.5); - w = W_PART(0.8); - h = H_PART(0.9); - sizeEx = H_PART(0.7); + x = QUOTE(W_PART(3.1)); + y = QUOTE(H_PART(2.5)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.9)); + sizeEx = QUOTE(H_PART(0.7)); }; class Deaths_Count: RscText { style = 2; shadow = 0; idc = IDC_WIDGET_DEATHS; text = ""; - x = W_PART(4.1); - y = H_PART(2.5); - w = W_PART(0.8); - h = H_PART(0.9); - sizeEx = H_PART(0.7); + x = QUOTE(W_PART(4.1)); + y = QUOTE(H_PART(2.5)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.9)); + sizeEx = QUOTE(H_PART(0.7)); }; class Total_Count: RscText { style = 2; shadow = 0; idc = IDC_WIDGET_TOTAL; text = ""; - x = W_PART(5.1); - y = H_PART(2.5); - w = W_PART(0.8); - h = H_PART(0.9); - sizeEx = H_PART(0.7); + x = QUOTE(W_PART(5.1)); + y = QUOTE(H_PART(2.5)); + w = QUOTE(W_PART(0.8)); + h = QUOTE(H_PART(0.9)); + sizeEx = QUOTE(H_PART(0.7)); }; class WeaponPicture: RscPictureKeepAspect { idc = IDC_WIDGET_WEAPON; text = ""; - x = W_PART(6.2); - y = H_PART(1.6); - w = W_PART(5.8); - h = H_PART(1.8); + x = QUOTE(W_PART(6.2)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(5.8)); + h = QUOTE(H_PART(1.8)); }; class ThrowablePicture: RscPictureKeepAspect { idc = IDC_WIDGET_THROWABLE; text = ""; - x = W_PART(12.3); - y = H_PART(1.6); - w = W_PART(1.8); - h = H_PART(1.8); + x = QUOTE(W_PART(12.3)); + y = QUOTE(H_PART(1.6)); + w = QUOTE(W_PART(1.8)); + h = QUOTE(H_PART(1.8)); }; }; }; diff --git a/addons/spottingscope/CfgWeapons.hpp b/addons/spottingscope/CfgWeapons.hpp index 2949920602..73af3b9cde 100644 --- a/addons/spottingscope/CfgWeapons.hpp +++ b/addons/spottingscope/CfgWeapons.hpp @@ -9,6 +9,7 @@ class CfgWeapons { descriptionShort = ""; picture = QPATHTOF(UI\w_spottingscope_ca.paa); model = QPATHTOF(data\ace_spottingscope.p3d); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 40; @@ -25,11 +26,11 @@ class CfgWeapons { 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)} + {0, QPATHTOF(data\ace_spottingscope_reticle_b1_ca.paa), 1, QPATHTOF(data\ace_spottingscope_reticle_b1_ca.paa)}, + {9, QPATHTOF(data\ace_spottingscope_reticle_b2_ca.paa), "1/2", QPATHTOF(data\ace_spottingscope_reticle_b2_ca.paa)}, + {14, QPATHTOF(data\ace_spottingscope_reticle_b3_ca.paa), "1/3", QPATHTOF(data\ace_spottingscope_reticle_b3_ca.paa)}, + {19, QPATHTOF(data\ace_spottingscope_reticle_b4_ca.paa), "1/4", QPATHTOF(data\ace_spottingscope_reticle_b4_ca.paa)}, + {24, QPATHTOF(data\ace_spottingscope_reticle_b5_ca.paa), "1/5", QPATHTOF(data\ace_spottingscope_reticle_b5_ca.paa)} }; fadeReticleInterval[] = {10.5,9.5}; diff --git a/addons/spottingscope/XEH_preInit.sqf b/addons/spottingscope/XEH_preInit.sqf index 79c7ec515b..568b6c2e4a 100644 --- a/addons/spottingscope/XEH_preInit.sqf +++ b/addons/spottingscope/XEH_preInit.sqf @@ -11,7 +11,7 @@ PREP_RECOMPILE_END; private _tube = "ACE_SpottingScope_tube" createVehicle [0,0,0]; _tube setDir (getDir _wreck - 180); - _tube setPosASL _wreck modelToWorldWorld (_wreck selectionPosition "destructionEffect"); + _tube setPosASL (_wreck modelToWorldWorld (_wreck selectionPosition "destructionEffect")); _tube setVelocity [1 - random 2, 1 - random 2, 4]; _tube addTorque (vectorNormalized [1 - random 2, 1 - random 2, 1 - random 2] vectorMultiply 4); }] call CBA_fnc_addClassEventHandler; diff --git a/addons/spottingscope/functions/fnc_pickup.sqf b/addons/spottingscope/functions/fnc_pickup.sqf index 2e8a5cc9e2..1b0e6b1a05 100644 --- a/addons/spottingscope/functions/fnc_pickup.sqf +++ b/addons/spottingscope/functions/fnc_pickup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Pick up spotting scope diff --git a/addons/spottingscope/functions/fnc_place.sqf b/addons/spottingscope/functions/fnc_place.sqf index ddf02d7e1e..b15656aca3 100644 --- a/addons/spottingscope/functions/fnc_place.sqf +++ b/addons/spottingscope/functions/fnc_place.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Place down spotting scope diff --git a/addons/spottingscope/functions/script_component.hpp b/addons/spottingscope/functions/script_component.hpp deleted file mode 100644 index 504cde2ca6..0000000000 --- a/addons/spottingscope/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\spottingscope\script_component.hpp" \ No newline at end of file diff --git a/addons/spottingscope/stringtable.xml b/addons/spottingscope/stringtable.xml index 1eb19396b6..e6afd17003 100644 --- a/addons/spottingscope/stringtable.xml +++ b/addons/spottingscope/stringtable.xml @@ -47,7 +47,7 @@ Megfigy. távcső elhelyezése Colocar luneta de observador 観測用スコープを置く - 감적 망원경 배치 + 감적 망원경 놓기 放置观测镜 放置觀測鏡 Gözcü Dürbününü Yerleştir diff --git a/addons/switchunits/CfgVehicles.hpp b/addons/switchunits/CfgVehicles.hpp index bb07eb541c..74d51db44e 100644 --- a/addons/switchunits/CfgVehicles.hpp +++ b/addons/switchunits/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { author = ECSTRING(common,ACETeam); category = "ACE"; displayName = CSTRING(DisplayName); - function = FUNC(module); + function = QFUNC(module); scope = 1; isGlobal = 1; icon = QPATHTOF(UI\Icon_Module_SwitchUnits_ca.paa); diff --git a/addons/switchunits/functions/fnc_addMapFunction.sqf b/addons/switchunits/functions/fnc_addMapFunction.sqf index fc8c181925..46d4ce9e8f 100644 --- a/addons/switchunits/functions/fnc_addMapFunction.sqf +++ b/addons/switchunits/functions/fnc_addMapFunction.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Adds a mapClick Eventhandler diff --git a/addons/switchunits/functions/fnc_handleMapClick.sqf b/addons/switchunits/functions/fnc_handleMapClick.sqf index dfd7ac686b..fbb1e3d349 100644 --- a/addons/switchunits/functions/fnc_handleMapClick.sqf +++ b/addons/switchunits/functions/fnc_handleMapClick.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Switches to a unit close to a clicked map position diff --git a/addons/switchunits/functions/fnc_initPlayer.sqf b/addons/switchunits/functions/fnc_initPlayer.sqf index 1174331ae1..ffc0f7ad63 100644 --- a/addons/switchunits/functions/fnc_initPlayer.sqf +++ b/addons/switchunits/functions/fnc_initPlayer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Initializes the player diff --git a/addons/switchunits/functions/fnc_isValidAi.sqf b/addons/switchunits/functions/fnc_isValidAi.sqf index 39fd0db94d..e78e990924 100644 --- a/addons/switchunits/functions/fnc_isValidAi.sqf +++ b/addons/switchunits/functions/fnc_isValidAi.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Checks if AI is a valid target for switching. diff --git a/addons/switchunits/functions/fnc_markAiOnMap.sqf b/addons/switchunits/functions/fnc_markAiOnMap.sqf index 2de13634e8..8c7dc4924c 100644 --- a/addons/switchunits/functions/fnc_markAiOnMap.sqf +++ b/addons/switchunits/functions/fnc_markAiOnMap.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Creates markers for AI units for given sides. diff --git a/addons/switchunits/functions/fnc_module.sqf b/addons/switchunits/functions/fnc_module.sqf index a2346ff2f4..d243715875 100644 --- a/addons/switchunits/functions/fnc_module.sqf +++ b/addons/switchunits/functions/fnc_module.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Initializes the SwitchUnits module diff --git a/addons/switchunits/functions/fnc_nearestPlayers.sqf b/addons/switchunits/functions/fnc_nearestPlayers.sqf index 1d649d0843..de1fda7e08 100644 --- a/addons/switchunits/functions/fnc_nearestPlayers.sqf +++ b/addons/switchunits/functions/fnc_nearestPlayers.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Returns an array of alive players in a given radius around a given location diff --git a/addons/switchunits/functions/fnc_startSwitchUnits.sqf b/addons/switchunits/functions/fnc_startSwitchUnits.sqf index f9c3a5e1de..46fbb7e476 100644 --- a/addons/switchunits/functions/fnc_startSwitchUnits.sqf +++ b/addons/switchunits/functions/fnc_startSwitchUnits.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Starts the SwitchUnits functionality diff --git a/addons/switchunits/functions/fnc_switchBack.sqf b/addons/switchunits/functions/fnc_switchBack.sqf index 9762547545..454d9001b1 100644 --- a/addons/switchunits/functions/fnc_switchBack.sqf +++ b/addons/switchunits/functions/fnc_switchBack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Switches back to the original player unit diff --git a/addons/switchunits/functions/fnc_switchUnit.sqf b/addons/switchunits/functions/fnc_switchUnit.sqf index ab2867c3ef..6fc8fa35c9 100644 --- a/addons/switchunits/functions/fnc_switchUnit.sqf +++ b/addons/switchunits/functions/fnc_switchUnit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux578 * Switches to the new given player unit diff --git a/addons/switchunits/functions/script_component.hpp b/addons/switchunits/functions/script_component.hpp deleted file mode 100644 index d03116f2f8..0000000000 --- a/addons/switchunits/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\switchunits\script_component.hpp" diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index c343718f13..a9172cfbed 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -5,9 +5,9 @@ Switch Units Cambia Unità 切換單位 - 切换单位 + 单位切换 ユニット切り替え - 병력 전환 + 유닛 변경 Einheitenwechsel Przełącz Jednostki Переключение юнитов @@ -31,7 +31,7 @@ ユニットを切り替え 切换单位 切換單位 - 인원 전환 + 유닛 변경됨 Birlik Değiştirildi @@ -71,12 +71,14 @@ Ermögliche Seitenwechsel Permettre le changement de camp 啟用陣營切換 + 启用阵营切换 Povolit změnu strany Włącz zmiane strony Habilita troca de time 陣営切り替えを有効化 Включить смену стороны Habilitar cambio de bando + 진영 변경 활성화 Switch to West? @@ -90,9 +92,9 @@ На синих? Cambia per BLUFOR? 同盟軍へ切り替え許可 - 切换至蓝方? + 切换至蓝方? 切換至藍方? - 청군으로 전환합니까? + 청군으로 변경합니까? Batıya Geç? @@ -107,9 +109,9 @@ Разрешить переключаться на синих юнитов? Consenti passaggio ad unità BLUFOR? 同盟軍側ユニットへ切り替えられるようにします。 - 允许切换至蓝方? + 允许切换至蓝方? 允許切換至藍方? - 청군 인원으로 전환합니까? + 청군 인원으로 변경하는 것을 허락합니까? Switch to East? @@ -123,9 +125,9 @@ На красных? Cambia per OPFOR? OPFOR軍側へ切り替え許可 - 切换至红方? + 切换至红方? 切換至紅方? - 대항군으로 전환합니까? + 대항군으로 변경합니까? Doğuya Geç ? @@ -140,9 +142,9 @@ Разрешить переключаться на красных юнитов? Consenti passaggio ad unità OPFOR? OPFOR軍側ユニットへ切り替えられるようにします。 - 允许切换至红方? + 允许切换至红方? 允許切換至紅方? - 대항군 인원으로 전환합니까? + 대항군 인원으로 변경하는 것을 허락합니까? Switch to Independent? @@ -156,9 +158,9 @@ На независимых? Cambia per INDFOR? 独立軍へ切り替え許可 - 切换至独立方? + 切换至独立方? 切換至獨立方? - 독립군 으로 전환합니까? + 무소속군으로 전환합니까? Bağımsıza Geç? @@ -173,9 +175,9 @@ Разрешить переключаться на независимых юнитов? Consenti passaggio ad unità INDFOR? 独立軍側ユニットへ切り替えられるようにします。 - 允许切换至独立方? + 允许切换至独立方? 允許切換至獨立方? - 독립군 인원으로 전환합니까? + 무소속군 인원으로 변경하는 것을 허락합니까? Switch to Civilian? @@ -190,7 +192,7 @@ Cambia per Civili? 市民へ切り替え許可 민간인으로 전환합니까? - 切换至平民方? + 切换至平民方? 切換至平民方? Sivillere Geç? @@ -206,8 +208,8 @@ Разрешить переключаться на гражданских юнитов? Consenti passaggio ad unità civili? 市民側ユニットへ切り替えられるようにします。 - 민간인으로 전환하는걸 허가합니까? - 允许切换至平民方? + 민간인으로 변경하는걸 허가합니까? + 允许切换至平民方? 允許切換至平民方? @@ -222,8 +224,8 @@ Безопасная зона Abilita Zona Sicura? 安全地帯を有効化 - 안전 지대 활성화? - 启用安全区? + 안전지대 활성화 + 启用安全区? 啟用安全區? @@ -238,8 +240,8 @@ Включить безопасную зону вокруг вражеских юнитов? Игроки не могут переключаться на юнитов, находящихся в безопасной зоне. Abilita una zona sicura attorno ad unità nemiche? I giocatori non possono cambiare ad unità dentro la zona sicura. 敵ユニットから逃れる安全地帯を生成できます。プレイヤーは安全地帯内のユニットへ切り替えできません。 - 적 주위로 안전 지대를 활성화합니까? 안전 지대 내에서는 플레이어가 인원 전환을 할 수 없습니다. - 启用敌方周围安全地带? 玩家不能切换到安全区内的单位 + 적 주위로 안전지대를 활성화합니까? 안전지대 내에서는 플레이어가 인원 전환을 할 수 없습니다. + 启用敌方周围安全地带? 玩家不能切换到安全区内的单位 啟用敵方周圍安全地帶? 玩家不能切換到安全區內的單位 @@ -254,7 +256,7 @@ Радиус безопасной зоны Raggio Zona Sicura 安全地帯の半径 - 안전 지대 반경 + 안전지대 반경 安全区半径 安全區半徑 @@ -267,7 +269,7 @@ A zona segura ao redor dos jogadores de diferentes equipes. Padrão: 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 + Радиус безопасной зоны вокруг ироков из противоположной команды. По умолчанию: 100 La zona sicura attorno ai giocatori di un team diverso. Default: 100 別のチームへのプレイヤーの周囲にある安全地帯の範囲。標準: 100 다른 진영으로 부터의 플레이어 안전 지대. 기본설정: 100 diff --git a/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf b/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf index f8e2ce9f3a..7c05cbbe63 100644 --- a/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf +++ b/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg, commy2 * Cancel tactical ladder deployment diff --git a/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf b/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf index 715fcba588..9fe13e4e65 100644 --- a/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf +++ b/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg, commy2 * Confirm tactical ladder deployment diff --git a/addons/tacticalladder/functions/fnc_deployTL.sqf b/addons/tacticalladder/functions/fnc_deployTL.sqf index 1005cf5100..85804e091f 100644 --- a/addons/tacticalladder/functions/fnc_deployTL.sqf +++ b/addons/tacticalladder/functions/fnc_deployTL.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Deploy tactical ladder diff --git a/addons/tacticalladder/functions/fnc_handleInteractMenuOpened.sqf b/addons/tacticalladder/functions/fnc_handleInteractMenuOpened.sqf index 54963d00ae..ef3c35be86 100644 --- a/addons/tacticalladder/functions/fnc_handleInteractMenuOpened.sqf +++ b/addons/tacticalladder/functions/fnc_handleInteractMenuOpened.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle opening of interaction menu. diff --git a/addons/tacticalladder/functions/fnc_handleKilled.sqf b/addons/tacticalladder/functions/fnc_handleKilled.sqf index a67b41368e..f5b87bfaaf 100644 --- a/addons/tacticalladder/functions/fnc_handleKilled.sqf +++ b/addons/tacticalladder/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle death. diff --git a/addons/tacticalladder/functions/fnc_handlePlayerChanged.sqf b/addons/tacticalladder/functions/fnc_handlePlayerChanged.sqf index 25be5fe7bf..be8a74c456 100644 --- a/addons/tacticalladder/functions/fnc_handlePlayerChanged.sqf +++ b/addons/tacticalladder/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle player changes. diff --git a/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf b/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf index 4e46b61d4e..821f62d708 100644 --- a/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf +++ b/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Handles lengthening and tilting of the ladder diff --git a/addons/tacticalladder/functions/fnc_handleUnconscious.sqf b/addons/tacticalladder/functions/fnc_handleUnconscious.sqf index ed966a9f72..b555b069ac 100644 --- a/addons/tacticalladder/functions/fnc_handleUnconscious.sqf +++ b/addons/tacticalladder/functions/fnc_handleUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle unconsciousness. diff --git a/addons/tacticalladder/functions/fnc_isLadderEmpty.sqf b/addons/tacticalladder/functions/fnc_isLadderEmpty.sqf index 5af9ecaafd..13ab990f39 100644 --- a/addons/tacticalladder/functions/fnc_isLadderEmpty.sqf +++ b/addons/tacticalladder/functions/fnc_isLadderEmpty.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Checks if Tactical Ladder is empty (no one climbing it). diff --git a/addons/tacticalladder/functions/fnc_pickupTL.sqf b/addons/tacticalladder/functions/fnc_pickupTL.sqf index 76cbea27d6..4c0890eb4b 100644 --- a/addons/tacticalladder/functions/fnc_pickupTL.sqf +++ b/addons/tacticalladder/functions/fnc_pickupTL.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg, commy2 * Pick up tactical ladder diff --git a/addons/tacticalladder/functions/fnc_positionTL.sqf b/addons/tacticalladder/functions/fnc_positionTL.sqf index bbfd877c2f..1ea19e737b 100644 --- a/addons/tacticalladder/functions/fnc_positionTL.sqf +++ b/addons/tacticalladder/functions/fnc_positionTL.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Position tactical ladder diff --git a/addons/tacticalladder/functions/script_component.hpp b/addons/tacticalladder/functions/script_component.hpp deleted file mode 100644 index 53bdb8be62..0000000000 --- a/addons/tacticalladder/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\tacticalladder\script_component.hpp" \ No newline at end of file diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml index 190616685e..8cd2f5266d 100644 --- a/addons/tacticalladder/stringtable.xml +++ b/addons/tacticalladder/stringtable.xml @@ -12,8 +12,8 @@ Scala Telescopica Teleszkopikus létra Escada telescópica - タクティカル ラダー - 로프 사다리 + 伸縮はしご + 접이식 사다리 伸缩梯子 伸縮梯子 Katlanabilir Merdiven @@ -29,9 +29,9 @@ Piazza scala Létra lerakása Implantar escada - ラダーを設置 + はしごを設置 사다리 배치 - 布署梯子 + 部署梯子 佈署梯子 Merdiveni Konuşlandır @@ -46,8 +46,8 @@ Lascia scala Létra eldobása Derrubar escada - ラダーを落とす - 사다리 놓기 + はしごを落とす + 사다리 내려놓기 降下梯子 降下梯子 Merdiveni Bırak @@ -79,7 +79,7 @@ +Ctrl incliner +Ctrl per inclinare +Ctrl で傾ける - +컨트롤키 기울이기 + +컨트롤 키 기울이기 +Ctrl 倾斜 +Ctrl 傾斜 @@ -94,8 +94,8 @@ Posiziona scala Létra elhelyezése Posicionar escada - ラダーの位置 - 사다리 위치 + はしごの位置 + 사다리 설치 梯子位置 梯子位置 Merdiveni Taşı @@ -111,7 +111,7 @@ Prendi scala Létra felvétele Pegar escada - ラダーを拾う + はしごを拾う 사다리 줍기 捡起梯子 撿起梯子 diff --git a/addons/tagging/ACE_Tags.hpp b/addons/tagging/ACE_Tags.hpp index 78762cf888..ce4df78f51 100644 --- a/addons/tagging/ACE_Tags.hpp +++ b/addons/tagging/ACE_Tags.hpp @@ -1,26 +1,78 @@ +#define GLUE(g1,g2) g1##g2 +#define TAG(name,col) class TRIPLES(ACE,name,col) { \ + displayName = CSTRING(name); \ + requiredItem = QUOTE(GLUE(ACE_Spraypaint,col)); \ + textures[] = {QPATHTOF(UI\tags\col\name.paa)}; \ + icon = QPATHTOF(UI\tags\col\name.paa); \ + } + class ACE_Tags { class ACE_XBlack { displayName = CSTRING(XBlack); requiredItem = "ACE_SpraypaintBlack"; textures[] = {QPATHTOF(UI\tags\black\0.paa), QPATHTOF(UI\tags\black\1.paa), QPATHTOF(UI\tags\black\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingBlack.paa); + icon = QPATHTOF(UI\tags\black\0.paa); }; class ACE_XRed { displayName = CSTRING(XRed); requiredItem = "ACE_SpraypaintRed"; textures[] = {QPATHTOF(UI\tags\red\0.paa), QPATHTOF(UI\tags\red\1.paa), QPATHTOF(UI\tags\red\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingRed.paa); + icon = QPATHTOF(UI\tags\red\0.paa); }; class ACE_XGreen { displayName = CSTRING(XGreen); requiredItem = "ACE_SpraypaintGreen"; textures[] = {QPATHTOF(UI\tags\green\0.paa), QPATHTOF(UI\tags\green\1.paa), QPATHTOF(UI\tags\green\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingGreen.paa); + icon = QPATHTOF(UI\tags\green\0.paa); }; class ACE_XBlue { displayName = CSTRING(XBlue); requiredItem = "ACE_SpraypaintBlue"; textures[] = {QPATHTOF(UI\tags\blue\0.paa), QPATHTOF(UI\tags\blue\1.paa), QPATHTOF(UI\tags\blue\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingBlue.paa); + icon = QPATHTOF(UI\tags\blue\0.paa); }; + + TAG(arrow_up,Black); + TAG(arrow_down,Black); + TAG(arrow_left,Black); + TAG(arrow_right,Black); + TAG(circle,Black); + TAG(cross,Black); + TAG(diamond,Black); + TAG(square,Black); + TAG(triangle,Black); + TAG(triangle_inverted,Black); + + TAG(arrow_up,Blue); + TAG(arrow_down,Blue); + TAG(arrow_left,Blue); + TAG(arrow_right,Blue); + TAG(circle,Blue); + TAG(cross,Blue); + TAG(diamond,Blue); + TAG(square,Blue); + TAG(triangle,Blue); + TAG(triangle_inverted,Blue); + + TAG(arrow_up,Green); + TAG(arrow_down,Green); + TAG(arrow_left,Green); + TAG(arrow_right,Green); + TAG(circle,Green); + TAG(cross,Green); + TAG(diamond,Green); + TAG(square,Green); + TAG(triangle,Green); + TAG(triangle_inverted,Green); + + TAG(arrow_up,Red); + TAG(arrow_down,Red); + TAG(arrow_left,Red); + TAG(arrow_right,Red); + TAG(circle,Red); + TAG(cross,Red); + TAG(diamond,Red); + TAG(square,Red); + TAG(triangle,Red); + TAG(triangle_inverted,Red); }; diff --git a/addons/tagging/CfgEden.hpp b/addons/tagging/CfgEden.hpp new file mode 100644 index 0000000000..fbb40ab7a9 --- /dev/null +++ b/addons/tagging/CfgEden.hpp @@ -0,0 +1,20 @@ +class Cfg3DEN { + class Object { + class AttributeCategories { + class ace_attributes { + class Attributes { + class GVAR(stencilVehicle) { + property = QGVAR(stencilVehicle); + control = "Edit"; + displayName = CSTRING(stencilVehicle); + tooltip = CSTRING(stencilVehicle_tooltip); + expression = QUOTE( [ARR_2(_this,_value)] call FUNC(stencilVehicle); ); + condition = "objectVehicle"; + defaultValue = "''"; + typeName = "STRING"; + }; + }; + }; + }; + }; +}; diff --git a/addons/tagging/CfgVehicles.hpp b/addons/tagging/CfgVehicles.hpp index 204e902641..8eef5c004c 100644 --- a/addons/tagging/CfgVehicles.hpp +++ b/addons/tagging/CfgVehicles.hpp @@ -53,6 +53,17 @@ class CfgVehicles { }; }; + class LandVehicle; + class Car: LandVehicle { + GVAR(canTag) = 1; + }; + class Tank: LandVehicle { + GVAR(canTag) = 1; + }; + class Air; + class Helicopter: Air { + GVAR(canTag) = 1; + }; class Item_Base_F; class ACE_Item_SpraypaintBlack: Item_Base_F { diff --git a/addons/tagging/CfgWeapons.hpp b/addons/tagging/CfgWeapons.hpp index dbb8340e1d..05200dd3ef 100644 --- a/addons/tagging/CfgWeapons.hpp +++ b/addons/tagging/CfgWeapons.hpp @@ -14,20 +14,24 @@ class CfgWeapons { class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; + GVAR(textColor) = "000000FE"; }; class ACE_SpraypaintRed: ACE_SpraypaintBlack { displayname = CSTRING(spraypaintRed); picture = QPATHTOF(UI\items\itemSpraypaintRed.paa); hiddenSelectionsTextures[] = {QPATHTOF(data\spraycanRed_co.paa)}; + GVAR(textColor) = "FF0000FE"; }; class ACE_SpraypaintGreen: ACE_SpraypaintBlack { displayname = CSTRING(spraypaintGreen); picture = QPATHTOF(UI\items\itemSpraypaintGreen.paa); hiddenSelectionsTextures[] = {QPATHTOF(data\spraycanGreen_co.paa)}; + GVAR(textColor) = "00FF00FE"; }; class ACE_SpraypaintBlue: ACE_SpraypaintBlack { displayname = CSTRING(spraypaintBlue); picture = QPATHTOF(UI\items\itemSpraypaintBlue.paa); hiddenSelectionsTextures[] = {QPATHTOF(data\spraycanBlue_co.paa)}; + GVAR(textColor) = "0000FFFE"; }; }; diff --git a/addons/tagging/UI/tags/black/arrow_down.paa b/addons/tagging/UI/tags/black/arrow_down.paa new file mode 100644 index 0000000000..cdaabc04ee Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/black/arrow_left.paa b/addons/tagging/UI/tags/black/arrow_left.paa new file mode 100644 index 0000000000..caa40c3c51 Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/black/arrow_right.paa b/addons/tagging/UI/tags/black/arrow_right.paa new file mode 100644 index 0000000000..da015c37cf Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/black/arrow_up.paa b/addons/tagging/UI/tags/black/arrow_up.paa new file mode 100644 index 0000000000..575aeaea92 Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/black/circle.paa b/addons/tagging/UI/tags/black/circle.paa new file mode 100644 index 0000000000..c89cf93306 Binary files /dev/null and b/addons/tagging/UI/tags/black/circle.paa differ diff --git a/addons/tagging/UI/tags/black/cross.paa b/addons/tagging/UI/tags/black/cross.paa new file mode 100644 index 0000000000..a784b63211 Binary files /dev/null and b/addons/tagging/UI/tags/black/cross.paa differ diff --git a/addons/tagging/UI/tags/black/diamond.paa b/addons/tagging/UI/tags/black/diamond.paa new file mode 100644 index 0000000000..8d158348f9 Binary files /dev/null and b/addons/tagging/UI/tags/black/diamond.paa differ diff --git a/addons/tagging/UI/tags/black/square.paa b/addons/tagging/UI/tags/black/square.paa new file mode 100644 index 0000000000..0d288a3002 Binary files /dev/null and b/addons/tagging/UI/tags/black/square.paa differ diff --git a/addons/tagging/UI/tags/black/triangle.paa b/addons/tagging/UI/tags/black/triangle.paa new file mode 100644 index 0000000000..5a29bcdfb3 Binary files /dev/null and b/addons/tagging/UI/tags/black/triangle.paa differ diff --git a/addons/tagging/UI/tags/black/triangle_inverted.paa b/addons/tagging/UI/tags/black/triangle_inverted.paa new file mode 100644 index 0000000000..46eaf69487 Binary files /dev/null and b/addons/tagging/UI/tags/black/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_down.paa b/addons/tagging/UI/tags/blue/arrow_down.paa new file mode 100644 index 0000000000..bbd6eb63ac Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_left.paa b/addons/tagging/UI/tags/blue/arrow_left.paa new file mode 100644 index 0000000000..9b70ebfb00 Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_right.paa b/addons/tagging/UI/tags/blue/arrow_right.paa new file mode 100644 index 0000000000..7c7ac2af6b Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_up.paa b/addons/tagging/UI/tags/blue/arrow_up.paa new file mode 100644 index 0000000000..976151c245 Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/blue/circle.paa b/addons/tagging/UI/tags/blue/circle.paa new file mode 100644 index 0000000000..f841ac9caa Binary files /dev/null and b/addons/tagging/UI/tags/blue/circle.paa differ diff --git a/addons/tagging/UI/tags/blue/cross.paa b/addons/tagging/UI/tags/blue/cross.paa new file mode 100644 index 0000000000..0235a9361a Binary files /dev/null and b/addons/tagging/UI/tags/blue/cross.paa differ diff --git a/addons/tagging/UI/tags/blue/diamond.paa b/addons/tagging/UI/tags/blue/diamond.paa new file mode 100644 index 0000000000..d66fc599ee Binary files /dev/null and b/addons/tagging/UI/tags/blue/diamond.paa differ diff --git a/addons/tagging/UI/tags/blue/square.paa b/addons/tagging/UI/tags/blue/square.paa new file mode 100644 index 0000000000..6eec9cd3ed Binary files /dev/null and b/addons/tagging/UI/tags/blue/square.paa differ diff --git a/addons/tagging/UI/tags/blue/triangle.paa b/addons/tagging/UI/tags/blue/triangle.paa new file mode 100644 index 0000000000..80674f1495 Binary files /dev/null and b/addons/tagging/UI/tags/blue/triangle.paa differ diff --git a/addons/tagging/UI/tags/blue/triangle_inverted.paa b/addons/tagging/UI/tags/blue/triangle_inverted.paa new file mode 100644 index 0000000000..161404bc1a Binary files /dev/null and b/addons/tagging/UI/tags/blue/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_down.paa b/addons/tagging/UI/tags/green/arrow_down.paa new file mode 100644 index 0000000000..c3c256beb2 Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_left.paa b/addons/tagging/UI/tags/green/arrow_left.paa new file mode 100644 index 0000000000..b5c3f1cdaa Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_right.paa b/addons/tagging/UI/tags/green/arrow_right.paa new file mode 100644 index 0000000000..4cd445cad9 Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_up.paa b/addons/tagging/UI/tags/green/arrow_up.paa new file mode 100644 index 0000000000..949378dafc Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/green/circle.paa b/addons/tagging/UI/tags/green/circle.paa new file mode 100644 index 0000000000..74e79b1d45 Binary files /dev/null and b/addons/tagging/UI/tags/green/circle.paa differ diff --git a/addons/tagging/UI/tags/green/cross.paa b/addons/tagging/UI/tags/green/cross.paa new file mode 100644 index 0000000000..db4a57222d Binary files /dev/null and b/addons/tagging/UI/tags/green/cross.paa differ diff --git a/addons/tagging/UI/tags/green/diamond.paa b/addons/tagging/UI/tags/green/diamond.paa new file mode 100644 index 0000000000..4ab45168d2 Binary files /dev/null and b/addons/tagging/UI/tags/green/diamond.paa differ diff --git a/addons/tagging/UI/tags/green/square.paa b/addons/tagging/UI/tags/green/square.paa new file mode 100644 index 0000000000..8cb639ed85 Binary files /dev/null and b/addons/tagging/UI/tags/green/square.paa differ diff --git a/addons/tagging/UI/tags/green/triangle.paa b/addons/tagging/UI/tags/green/triangle.paa new file mode 100644 index 0000000000..bc570882fe Binary files /dev/null and b/addons/tagging/UI/tags/green/triangle.paa differ diff --git a/addons/tagging/UI/tags/green/triangle_inverted.paa b/addons/tagging/UI/tags/green/triangle_inverted.paa new file mode 100644 index 0000000000..ce6d43b692 Binary files /dev/null and b/addons/tagging/UI/tags/green/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_down.paa b/addons/tagging/UI/tags/red/arrow_down.paa new file mode 100644 index 0000000000..7929adf188 Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_left.paa b/addons/tagging/UI/tags/red/arrow_left.paa new file mode 100644 index 0000000000..6788c48858 Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_right.paa b/addons/tagging/UI/tags/red/arrow_right.paa new file mode 100644 index 0000000000..afd12bff4f Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_up.paa b/addons/tagging/UI/tags/red/arrow_up.paa new file mode 100644 index 0000000000..81e15bdf1b Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/red/circle.paa b/addons/tagging/UI/tags/red/circle.paa new file mode 100644 index 0000000000..fb76c8f01f Binary files /dev/null and b/addons/tagging/UI/tags/red/circle.paa differ diff --git a/addons/tagging/UI/tags/red/cross.paa b/addons/tagging/UI/tags/red/cross.paa new file mode 100644 index 0000000000..882e79a57a Binary files /dev/null and b/addons/tagging/UI/tags/red/cross.paa differ diff --git a/addons/tagging/UI/tags/red/diamond.paa b/addons/tagging/UI/tags/red/diamond.paa new file mode 100644 index 0000000000..4f9b583af4 Binary files /dev/null and b/addons/tagging/UI/tags/red/diamond.paa differ diff --git a/addons/tagging/UI/tags/red/square.paa b/addons/tagging/UI/tags/red/square.paa new file mode 100644 index 0000000000..ec83e52244 Binary files /dev/null and b/addons/tagging/UI/tags/red/square.paa differ diff --git a/addons/tagging/UI/tags/red/triangle.paa b/addons/tagging/UI/tags/red/triangle.paa new file mode 100644 index 0000000000..7f2b431201 Binary files /dev/null and b/addons/tagging/UI/tags/red/triangle.paa differ diff --git a/addons/tagging/UI/tags/red/triangle_inverted.paa b/addons/tagging/UI/tags/red/triangle_inverted.paa new file mode 100644 index 0000000000..8d2f818fd0 Binary files /dev/null and b/addons/tagging/UI/tags/red/triangle_inverted.paa differ diff --git a/addons/tagging/XEH_PREP.hpp b/addons/tagging/XEH_PREP.hpp index 449a0a6cb2..37898f31e9 100644 --- a/addons/tagging/XEH_PREP.hpp +++ b/addons/tagging/XEH_PREP.hpp @@ -1,11 +1,15 @@ PREP(addCustomTag); +PREP(addStencilTag); PREP(addTagActions); PREP(applyCustomTag); PREP(checkTaggable); PREP(compileConfigTags); +PREP(compileTagAction); PREP(createTag); +PREP(generateStencilTexture); PREP(moduleInit); PREP(parseConfigTag); PREP(quickTag); +PREP(stencilVehicle); PREP(tag); PREP(tagTestingThread); diff --git a/addons/tagging/XEH_preInit.sqf b/addons/tagging/XEH_preInit.sqf index 2f0e3158a6..34b4928b2a 100644 --- a/addons/tagging/XEH_preInit.sqf +++ b/addons/tagging/XEH_preInit.sqf @@ -7,7 +7,7 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; GVAR(cachedTags) = []; -GVAR(cachedRequiredItems) = []; +GVAR(itemActions) = createHashMap; #include "initSettings.sqf" diff --git a/addons/tagging/XEH_preStart.sqf b/addons/tagging/XEH_preStart.sqf index f1abf9e8a5..9303bdb135 100644 --- a/addons/tagging/XEH_preStart.sqf +++ b/addons/tagging/XEH_preStart.sqf @@ -30,3 +30,7 @@ private _cfgBase = configFile >> "CfgNonAIVehicles"; uiNamespace setVariable [QGVAR(cacheStaticModels), compileFinal str _cacheStaticModels]; TRACE_1("compiled",count _cacheStaticModels); + +// force preload of stencil texture to avoid error popup +// Warning Message: Cannot load mipmap z\ace\addons\fonts\sairastencilone\ace_stencil64-01.paa +"Test" getTextWidth ["ACE_Stencil", 0.3]; diff --git a/addons/tagging/config.cpp b/addons/tagging/config.cpp index 6ec32da0a6..ef24a9d2d3 100644 --- a/addons/tagging/config.cpp +++ b/addons/tagging/config.cpp @@ -19,3 +19,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgEden.hpp" diff --git a/addons/tagging/functions/fnc_addCustomTag.sqf b/addons/tagging/functions/fnc_addCustomTag.sqf index 4de0fc016c..c99d1f4409 100644 --- a/addons/tagging/functions/fnc_addCustomTag.sqf +++ b/addons/tagging/functions/fnc_addCustomTag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds custom tag. Has to be executed on one machine only. @@ -9,11 +9,11 @@ * 2: Required Item * 3: Textures Paths * 4: Icon Path (default: "") - * 5: Material Paths (optional) - * 6: Tag Model (optional) + * 5: Material Paths (default: []) + * 6: Tag Model (default: "UserTexture1m_F") * * Return Value: - * Sucessfully Added Tag + * Successfully Added Tag * * Example: * ["ace_victoryRed", "Victory Red", "ACE_SpraypaintRed", ["path\to\texture1.paa", "path\to\texture2.paa"], "path\to\icon.paa"] call ace_tagging_fnc_addCustomTag @@ -33,25 +33,27 @@ params [ // Verify if (_identifier == "") exitWith { - ERROR("Failed adding custom tag - missing identifier"); + ERROR("Failed adding custom tag - missing identifier"); false }; if (_displayName == "") exitWith { - ERROR_1("Failed adding custom tag: %1 - missing displayName",_identifier); + ERROR_1("Failed adding custom tag: %1 - missing displayName",_identifier); false }; if (_requiredItem == "") exitWith { - ERROR_1("Failed adding custom tag: %1 - missing requiredItem",_identifier); + ERROR_1("Failed adding custom tag: %1 - missing requiredItem",_identifier); false }; if (!isClass (configFile >> "CfgWeapons" >> _requiredItem)) exitWith { - ERROR_2("Failed adding custom tag: %1 - requiredItem %2 does not exist",_identifier,_requiredItem); + ERROR_2("Failed adding custom tag: %1 - requiredItem %2 does not exist",_identifier,_requiredItem); false }; if (_textures isEqualTo []) exitWith { - ERROR_1("Failed adding custom tag: %1 - missing textures",_identifier); + ERROR_1("Failed adding custom tag: %1 - missing textures",_identifier); false }; _identifier = [_identifier] call CBA_fnc_removeWhitespace; // Add [QGVAR(applyCustomTag), [_identifier, _displayName, _requiredItem, _textures, _icon, _materials, _tagModel]] call CBA_fnc_globalEventJIP; + +true diff --git a/addons/tagging/functions/fnc_addStencilTag.sqf b/addons/tagging/functions/fnc_addStencilTag.sqf new file mode 100644 index 0000000000..f6613856a9 --- /dev/null +++ b/addons/tagging/functions/fnc_addStencilTag.sqf @@ -0,0 +1,50 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Adds custom text tag. Has to be executed on one machine only. + * + * Arguments: + * 0: Display Text + * 1: Text Size (default: 0.3) + * 2: Required Item (default: "ACE_SpraypaintBlack") + * 3: Text Color (in HEX 6 or 8) (default: based on spray item) + * 4: Background Color (in HEX 6 or 8) (default: "00000000" - transparent) + * 5: Auto newlines (default: true) + * + * Return Value: + * Sucessfully Added Tag + * + * Example: + * ["Orcs Go Home", 0.22] call ace_tagging_fnc_addStencilTag + * ["LOGI-2", 0.3, "ACE_SpraypaintBlack", "f7e9e1"] call ace_tagging_fnc_addStencilTag + * + * Public: Yes + */ + +params [ + ["_text", "", [""]], + ["_textSize", 0.3, [0]], + ["_requiredItem", "ACE_SpraypaintBlack", [""]], + ["_textColor", "", [""]], + ["_backgroundColor", "00000000", [""]], + ["_autoMultiline", true, [false]] +]; +TRACE_6("",_text,_textSize,_requiredItem,_textColor,_backgroundColor,_autoMultiline); + +if (_text == "") exitWith { ERROR_1("bad text %1",_text); false }; +// Check required item exists +if (!isClass (configFile >> "CfgWeapons" >> _requiredItem)) exitWith { ERROR_1("bad item %1",_requiredItem); false }; +// Get color from spray item used +if (_textColor == "") then { + _textColor = getText (configFile >> "CfgWeapons" >> _requiredItem >> QGVAR(textColor)); + if (_textColor == "") then { _textColor = "000000" }; +}; + + +private _identifier = format ["%1_%2_%3",_text,_textColor,_backgroundColor]; +private _interactionText = _text regexReplace ["\\n", " "]; +private _texture = [_text, _textSize, _textColor, _backgroundColor, _autoMultiline] call FUNC(generateStencilTexture); +TRACE_2("",_identifier,_texture); +if (_texture == "") exitWith { ERROR_1("bad texture params %1",_this); false }; + +[_identifier, _interactionText, _requiredItem, [_texture]] call FUNC(addCustomTag) // return diff --git a/addons/tagging/functions/fnc_addTagActions.sqf b/addons/tagging/functions/fnc_addTagActions.sqf index f9add50829..9c720e1f6c 100644 --- a/addons/tagging/functions/fnc_addTagActions.sqf +++ b/addons/tagging/functions/fnc_addTagActions.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Compiles tags from ACE_Tags and returns children actions. @@ -19,38 +19,18 @@ params ["_unit"]; private _actions = []; { - _x params ["_class", "_displayName", "_requiredItem", "_textures", "_icon", "_materials"]; - _actions pushBack [ [ - format ["ACE_ConfigTag_%1", _class], - _displayName, - _icon, - { - (_this select 2) params ["_unit", "_class", "_textures", "", "_materials"]; - - ( - if (count _textures == count _materials) then { - private _textureIndex = floor random count _textures; - [_textures select _textureIndex, _materials select _textureIndex] - } else { - [selectRandom _textures, selectRandom _materials] - } - ) params ["_randomTexture", "_randomMaterial"]; - - [_unit, _randomTexture, _randomMaterial] call FUNC(tag); - _unit setVariable [QGVAR(lastUsedTag), _class]; - }, - { - (_this select 2) params ["_unit", "", "", "_requiredItem"]; - _requiredItem in (_unit call EFUNC(common,uniqueItems)) - }, + format ["ACE_TagItem_%1", _x], + getText (configFile >> "CfgWeapons" >> _x >> "displayName"), + getText (configFile >> "CfgWeapons" >> _x >> "picture"), {}, - [_unit, _class, _textures, _requiredItem, _materials] + {(_this select 2) in (_player call EFUNC(common,uniqueItems))}, + {}, + _x ] call EFUNC(interact_menu,createAction), - [], + _y apply { [_x, [], _unit] }, //sub-actions for each individual tag _unit - ]; -} forEach GVAR(cachedTags); - + ] +} forEach GVAR(itemActions); _actions diff --git a/addons/tagging/functions/fnc_applyCustomTag.sqf b/addons/tagging/functions/fnc_applyCustomTag.sqf index 63ae9836ac..5aaf4c4b8f 100644 --- a/addons/tagging/functions/fnc_applyCustomTag.sqf +++ b/addons/tagging/functions/fnc_applyCustomTag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Applies custom tag to the cache. @@ -24,7 +24,7 @@ params ["_identifier", "_displayName", "_requiredItem"]; // Add only if tag not already added (compare identifiers) -if !(GVAR(cachedTags) select {_x select 0 == _identifier} isEqualTo []) exitWith { +if ((GVAR(cachedTags) select {_x select 0 == _identifier}) isNotEqualTo []) exitWith { INFO_2("Tag with selected identifier already exists: %1 (%2)",_identifier,_displayName) }; @@ -36,5 +36,5 @@ _requiredItem = configName (configFile >> "CfgWeapons" >> _requiredItem); // Con _this set [2, _requiredItem]; GVAR(cachedTags) pushBack _this; -GVAR(cachedRequiredItems) pushBackUnique _requiredItem; +_this call FUNC(compileTagAction); TRACE_1("Added custom script tag",_this); diff --git a/addons/tagging/functions/fnc_checkTaggable.sqf b/addons/tagging/functions/fnc_checkTaggable.sqf index 3a022ca2b7..7eab60c1ba 100644 --- a/addons/tagging/functions/fnc_checkTaggable.sqf +++ b/addons/tagging/functions/fnc_checkTaggable.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, esteldunedain * Checks if there is a taggable surface within 2.5m in front of the player. @@ -20,7 +20,7 @@ // Exit if no required item in inventory if ([_unit, { - GVAR(cachedRequiredItems) arrayIntersect (_unit call EFUNC(common,uniqueItems)) isEqualTo [] + (keys GVAR(itemActions)) arrayIntersect (_unit call EFUNC(common,uniqueItems)) isEqualTo [] }, _unit, QGVAR(checkRequiredItemsCache), 9999, "cba_events_loadoutEvent"] call EFUNC(common,cachedCall)) exitWith {false}; private _startPosASL = eyePos _unit; @@ -42,6 +42,12 @@ // If the class is alright, do not exit if (_object isKindOf "Static") exitWith {false}; + // Taggable vehicle, do not exit + if (((_object getVariable [QGVAR(canTag), getNumber (configOf _object >> QGVAR(canTag))]) in [1, true]) + && {getText (configOf _object >> "selectionClan") in selectionNames _object}) exitWith { + false + }; + // If the class is not categorized correctly search the cache private _modelName = (getModelInfo _object) select 0; private _isStatic = GVAR(cacheStaticModels) getVariable [_modelName, false]; diff --git a/addons/tagging/functions/fnc_compileConfigTags.sqf b/addons/tagging/functions/fnc_compileConfigTags.sqf index 0fea0693b8..d2f096d067 100644 --- a/addons/tagging/functions/fnc_compileConfigTags.sqf +++ b/addons/tagging/functions/fnc_compileConfigTags.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Compiles and caches tags from ACE_Tags config. @@ -23,7 +23,7 @@ _result params ["_tagInfo", "_requiredItem"]; GVAR(cachedTags) pushBack _tagInfo; - GVAR(cachedRequiredItems) pushBackUnique _requiredItem; + _tagInfo call FUNC(compileTagAction); }; } forEach ("true" configClasses (configFile >> "ACE_Tags")); @@ -35,6 +35,6 @@ _result params ["_tagInfo", "_requiredItem"]; GVAR(cachedTags) pushBack _tagInfo; - GVAR(cachedRequiredItems) pushBackUnique _requiredItem; + _tagInfo call FUNC(compileTagAction); }; } forEach ("true" configClasses (missionConfigFile >> "ACE_Tags")); diff --git a/addons/tagging/functions/fnc_compileTagAction.sqf b/addons/tagging/functions/fnc_compileTagAction.sqf new file mode 100644 index 0000000000..a49de10f47 --- /dev/null +++ b/addons/tagging/functions/fnc_compileTagAction.sqf @@ -0,0 +1,46 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Compiles tags from ACE_Tags and returns children actions. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [unit] call ace_tagging_fnc_compileTagAction + * + * Public: No + */ + +params ["_class", "_displayName", "_requiredItem", "_textures", "_icon", "_materials", "_tagModel"]; + +private _actions = GVAR(itemActions) getOrDefault [_requiredItem, []]; + +_actions pushBack ([ + _class, + _displayName, + _icon, + { + (_this select 2) params ["_class", "_textures", "_materials", "_tagModel"]; + + ( + if (count _textures == count _materials) then { + private _textureIndex = floor random count _textures; + [_textures select _textureIndex, _materials select _textureIndex] + } else { + [selectRandom _textures, selectRandom _materials] + } + ) params ["_randomTexture", "_randomMaterial"]; + + [_player, _randomTexture, _randomMaterial, _tagModel] call FUNC(tag); + _player setVariable [QGVAR(lastUsedTag), _class]; + }, + {true}, // required item is checked at an upper level + {}, + [_class, _textures, _materials, _tagModel] +] call EFUNC(interact_menu,createAction)); + +GVAR(itemActions) set [_requiredItem, _actions]; diff --git a/addons/tagging/functions/fnc_createTag.sqf b/addons/tagging/functions/fnc_createTag.sqf index a993e6675f..90923cc803 100644 --- a/addons/tagging/functions/fnc_createTag.sqf +++ b/addons/tagging/functions/fnc_createTag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, esteldunedain * Creates a tag and handle its destruction. Only execute on the server. @@ -10,6 +10,7 @@ * 3: Object it should be tied to * 4: Unit that created the tag * 5: Material of the tag (Optional) + * 6: Vehicle Tag (Optional) * * Return Value: * Tag created @@ -20,7 +21,7 @@ * Public: No */ -params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_object", "_unit", ["_material","",[""]], ["_tagModel", "UserTexture1m_F", [""]]]; +params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_object", "_unit", ["_material","",[""]], ["_tagModel", "UserTexture1m_F", [""]], ["_isVehicleTag", false, [false]]]; TRACE_5("createTag:",_tagPosASL,_vectorDirAndUp,_texture,_object,_unit); if (_texture == "") exitWith { @@ -28,6 +29,14 @@ if (_texture == "") exitWith { false }; +if (_isVehicleTag) exitWith { + TRACE_3("tagging vehicle",_object,typeOf _object,_texture); + _object setObjectTextureGlobal [getText (configOf _object >> "selectionClan"), _texture]; + _object setVariable [QGVAR(hasTag), true, true]; + // if (_material != "") then { _object setObjectMaterialGlobal ["clan", _material] }; // ?? + ["ace_tagCreated", [objNull, _texture, _object, _unit]] call CBA_fnc_globalEvent; +}; + private _tag = createSimpleObject [_tagModel, _tagPosASL]; _tag setObjectTextureGlobal [0, _texture]; if (_material != "") then { _tag setObjectMaterialGlobal [0, _material] }; diff --git a/addons/tagging/functions/fnc_generateStencilTexture.sqf b/addons/tagging/functions/fnc_generateStencilTexture.sqf new file mode 100644 index 0000000000..1870d67114 --- /dev/null +++ b/addons/tagging/functions/fnc_generateStencilTexture.sqf @@ -0,0 +1,55 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Generate a "Text to Texture" + * + * Arguments: + * 0: Display Text + * 1: Text Size (default: 0.3) + * 2: Text Color (in HEX 6 or 8) (default: "000000" - black) + * 3: Background Color (in HEX 6 or 8) (default: "00000000" - transparent) + * 4: Auto newlines (default: true) + * 4: Texture Dimensions (default: 512) + * + * Return Value: + * Texture + * + * Example: + * ["your text"] call ace_tagging_fnc_generateStencilTexture + * + * Public: No + */ + +params [ + ["_text", "", [""]], + ["_textSize", 0.3, [0]], + ["_textColor", "000000", [""]], + ["_backgroundColor", "00000000", [""]], + ["_autoMultiline", true, [false]], + ["_dimension", 512, [0]] +]; + +if (_textColor select [0, 1] == "#") then { _textColor = _textColor select [1]; }; +if (_backgroundColor select [0, 1] == "#") then { _backgroundColor = _backgroundColor select [1]; }; +if (!((count _textColor) in [6,8])) exitWith { ERROR_1("bad Tcolor %1",_textColor); "" }; +if (!((count _backgroundColor) in [6,8])) exitWith { ERROR_1("bad Bcolor %1",_textColor); "" }; + +if (_autoMultiline) then { + private _magicWidth = 0.75; + private _words = _text splitString " "; + private _lines = []; + while {_words isNotEqualTo []} do { + private _size = count _words; + while {_size > 1} do { + private _testLine = (_words select [0, _size]) joinString " "; + if ((_testLine getTextWidth ["ACE_Stencil", _textSize]) < _magicWidth) exitWith {}; + _size = _size - 1; + }; + _lines pushBack ((_words select [0, _size]) joinString " "); + _words = _words select [_size, (count _words) - _size]; + }; + _text = _lines joinString "\n"; +}; + +// return +format ['#(rgb,%1,%1,3)text(1,1,"ACE_Stencil",%2,"#%3","#%4","%5")', _dimension, _textSize, _backgroundColor, _textColor, _text] diff --git a/addons/tagging/functions/fnc_moduleInit.sqf b/addons/tagging/functions/fnc_moduleInit.sqf index 3f1048e1e5..d7c42ea8b9 100644 --- a/addons/tagging/functions/fnc_moduleInit.sqf +++ b/addons/tagging/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the Tagging module. diff --git a/addons/tagging/functions/fnc_parseConfigTag.sqf b/addons/tagging/functions/fnc_parseConfigTag.sqf index 41242529ee..5526b2fed0 100644 --- a/addons/tagging/functions/fnc_parseConfigTag.sqf +++ b/addons/tagging/functions/fnc_parseConfigTag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas, Dedmen * Parses tags from ACE_Tags config. diff --git a/addons/tagging/functions/fnc_quickTag.sqf b/addons/tagging/functions/fnc_quickTag.sqf index 0ba5cbb338..3e8c51218d 100644 --- a/addons/tagging/functions/fnc_quickTag.sqf +++ b/addons/tagging/functions/fnc_quickTag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Selects random tag and applies it. diff --git a/addons/tagging/functions/fnc_stencilVehicle.sqf b/addons/tagging/functions/fnc_stencilVehicle.sqf new file mode 100644 index 0000000000..b2ee99c241 --- /dev/null +++ b/addons/tagging/functions/fnc_stencilVehicle.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Handles 3den attribute for vehicle ID markings + * + * Arguments: + * 0: Vehicle + * 1: Display Text + * 2: Text Size (Optional) + * 3: Text Color (Optional) + * + * Return Value: + * None + * + * Example: + * [truck, "BARVO-1 Bastards"] call ace_tagging_fnc_stencilVehicle + * + * Public: No + */ + +params [ + ["_vehicle", objNull, [objNull]], + ["_text", "", [""]], + ["_textSize", 0.3, [0]], // Fits about 7-8 chars in width + ["_textcolor", "f7e9e1f8", [""]] // making text color slightly transparent (f8) fixes a "shimmering" problem (possibly related to HBAO) +]; +TRACE_2("",_vehicle,_text); + +if (!isServer) exitWith {}; +if (_text == "") exitWith {}; +private _clanSel = getText (configOf _vehicle >> "selectionClan"); +if (!(_clanSel in selectionNames _vehicle)) exitWith { TRACE_1("no tag",_clanSel); }; + +private _texture = [_text, _textSize, _textColor, "00000000", true] call FUNC(generateStencilTexture); +TRACE_1("",_texture); +if (_texture == "") exitWith { ERROR_1("bad texture params %1",_this); }; +[[], [], _texture, _vehicle, objNull, "", "", true] call FUNC(createTag); // apply texture and send event diff --git a/addons/tagging/functions/fnc_tag.sqf b/addons/tagging/functions/fnc_tag.sqf index b476145c57..4e4310a0cf 100644 --- a/addons/tagging/functions/fnc_tag.sqf +++ b/addons/tagging/functions/fnc_tag.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: BaerMitUmlaut, esteldunedain * Creates a tag on a wall that is on the closest surface within 2m on front of the unit. @@ -6,11 +6,11 @@ * Arguments: * 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) + * 2: Material of the tag (default: "") + * 3: Tag Model (default: "UserTexture1m_F") * * Return Value: - * Sucess + * Success * * Example: * success = [player, "z\ace\addons\tagging\UI\tags\black\0.paa"] call ace_tagging_fnc_tag @@ -29,6 +29,7 @@ if (isNull _unit || {_texture == ""}) exitWith { ERROR_2("Tag parameters invalid. Unit: %1, Texture: %2",_unit,_texture); }; +private _isVehicleTag = false; private _startPosASL = eyePos _unit; private _cameraPosASL = AGLToASL positionCameraToWorld [0, 0, 0]; private _cameraDir = (AGLToASL positionCameraToWorld [0, 0, 1]) vectorDiff _cameraPosASL; @@ -51,6 +52,13 @@ if ((!isNull _object) && { // If the class is alright, do not exit if (_object isKindOf "Static") exitWith {false}; + // Taggable vehicle, do not exit and tell server to change "clan" tag + if (((_object getVariable [QGVAR(canTag), getNumber (configOf _object >> QGVAR(canTag))]) in [1, true]) + && {getText (configOf _object >> "selectionClan") in selectionNames _object}) exitWith { + _isVehicleTag = true; + false + }; + // If the class is not categorized correctly search the cache private _modelName = (getModelInfo _object) select 0; private _isStatic = GVAR(cacheStaticModels) getVariable [_modelName, false]; @@ -100,10 +108,11 @@ private _fnc_isOk = { true }; -if ( !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || +if ( (!_isVehicleTag) && { + !([ 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 { + {!([-0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk)}}}}) exitWith { TRACE_1("Unsuitable location:",_touchingPoint); false }; @@ -120,6 +129,6 @@ if ( !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || // 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, _tagModel], 0.6] call CBA_fnc_waitAndExecute; +}, [_touchingPoint vectorAdd (_surfaceNormal vectorMultiply 0.06), _vectorDirAndUp, _texture, _object, _unit, _material, _tagModel, _isVehicleTag], 0.6] call CBA_fnc_waitAndExecute; true diff --git a/addons/tagging/functions/fnc_tagTestingThread.sqf b/addons/tagging/functions/fnc_tagTestingThread.sqf index dcfb5e0bac..f6d5209e3c 100644 --- a/addons/tagging/functions/fnc_tagTestingThread.sqf +++ b/addons/tagging/functions/fnc_tagTestingThread.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain * Checks if tags are still leaning on an object periodically. diff --git a/addons/tagging/functions/script_component.hpp b/addons/tagging/functions/script_component.hpp deleted file mode 100644 index bc860f2283..0000000000 --- a/addons/tagging/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\tagging\script_component.hpp" \ No newline at end of file diff --git a/addons/tagging/initSettings.sqf b/addons/tagging/initSettings.sqf index 72672032ff..4fc35b83d1 100644 --- a/addons/tagging/initSettings.sqf +++ b/addons/tagging/initSettings.sqf @@ -1,7 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(Tagging)]; + [ QGVAR(quickTag), "LIST", [LLSTRING(QuickTag), LLSTRING(QuickTagDesc)], - ["ACE Uncategorized", LLSTRING(Tagging)], + _category, [[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)}, diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml index 56c1346932..797e1c9918 100644 --- a/addons/tagging/stringtable.xml +++ b/addons/tagging/stringtable.xml @@ -7,7 +7,7 @@ タグ付け Tagowanie Markieren (Spraydose) - 뿌리기 + 태그하기 Marquage Marcamento 喷漆 @@ -19,11 +19,11 @@ Configure how the tagging system will operate by default. - Настройка работы системы спрей-маркеров по-умолчанию. + Настройка работы системы спрей-маркеров по умолчанию. 標準で開くタグ付けシステムの設定を行います。 Skonfiguruj zachowanie systemu tagowania. 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. 定义喷漆系统预设设定 @@ -38,7 +38,7 @@ クイック タグ Szybkie tagowanie Schnelle Markierung (Spraydose) - 빠른 뿌리기 + 스프레이 페인트 - 빠른 태그 Peinture en spray - Marquage rapide Marcamento Rapido 快速喷漆 @@ -54,10 +54,10 @@ インタラクション ポイントにむけてタグ付けをします。 Akcja wykonywana na głównym punkcie interakcji tagu. Aktion, die am Haupt-Interaktionspunkt ausgeführt werden soll. - 이 동작은 상호작용에서 뿌리기를 할 수 있게 해준다 + 상호작용 시 표시할 낙서를 고릅니다. 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. @@ -121,7 +121,7 @@ Marcar Маркер タグ - 뿌리기 + 태그 Tag 喷漆 噴漆 @@ -137,7 +137,7 @@ X černě X em preto Черный Х - 黒のX印 + X印 검정 X 黑色X标记 黑色X標記 @@ -153,7 +153,7 @@ X červeně X em vermelho Красный Х - 赤のX印 + X印 빨간 X 红色X标记 紅色X標記 @@ -168,8 +168,8 @@ X verde X zeleně X em verde - Зеленый Х - 緑のX印 + Зелёный Х + X印 초록 X 绿色X标记 綠色X標記 @@ -185,12 +185,102 @@ X modře X em azul Синий Х - 青のX印 + X印 파랑 X 蓝色X标记 藍色X標記 X Mavi + + Up Arrow + 上矢印 + Strzałka w górę + 화살표(위) + Стрелка вверх + Flecha Arriba + Pfeil Hoch + + + Down Arrow + 下矢印 + Strzałka w dół + 화살표(아래) + Стрелка вниз + Flecha Abajo + Pfeil Runter + + + Left Arrow + 左矢印 + Strzałka w lewo + 화살표(왼쪽) + Стрелка влево + Flecha Izquierda + Pfeil Links + + + Right Arrow + 右矢印 + Strzałka w prawo + 화살표(오른쪽) + Стрелка вправо + Flecha Derecha + Pfeil Rechts + + + Circle + + Okrąg + + Круг + Círculo + Kreis + + + Cross + 十字 + Krzyż + 십자 + Перекрестие + Cruz + Kreuz + + + Diamond + ひし形 + Diament + 마름모 + Алмаз + Diamante + Diamant + + + Square + 四角 + Kwadrat + 사각형 + Квадрат + Cuadrado + Quadrat + + + Triangle + 三角形 + Trójkąt + 삼각형 + Треугольник + Triángulo + Dreieck + + + Triangle Inverted + 三角形 (反転) + Odwrócony trójkąt + 역삼각형 + Обратный треугольник + Triángulo invertido + Invertiertes Dreieck + Spray Paint (Black) Sprühfarbe (Schwarz) @@ -201,7 +291,7 @@ Černý sprej Spray de tinta preta Черный спрей - 黒のスプレー缶 + スプレー缶 (黒) 검정 스프레이 黑色喷漆 黑色噴漆 @@ -217,7 +307,7 @@ Červený sprej Spray de tinta vermelha Красный спрей - 赤のスプレー缶 + スプレー缶 (赤) 빨강 스프레이 红色喷漆 紅色噴漆 @@ -232,8 +322,8 @@ Bomboletta spray verde Zelený sprej Spray de tinta verde - Зеленый спрей - 緑のスプレー缶 + Зелёный спрей + スプレー缶 (緑) 초록 스프레이 绿色喷漆 綠色噴漆 @@ -249,7 +339,7 @@ Modrý sprej Spray de tinta azul Синий спрей - 青のスプレー缶 + スプレー缶 (青) 파랑 스프레이 蓝色喷漆 藍色噴漆 @@ -266,9 +356,21 @@ Uma lata de tinta spray para marcar paredes. Балончик спрея для рисования маркеров на стенах. スプレー缶は壁にタグ付できます。 - 벽에 뿌릴 수 있는 스프레이캔 입니다. + 벽에 낙서할 수 있는 스프레이캔 입니다. 喷漆可喷涂在墙壁上 噴漆可噴塗在牆壁上 + + Vehicle ID Marking + 車両IDマーキング + Oznaczenie identyfikacyjne pojazdu + Fahrzeug ID Markierung + + + Replaces clan tag with stenciled text + 部隊タグをステンシルテキストに置き換える + Zastępuje tag klanu tekstem z szablonu + Ersetzt das Clan-Tag durch Schablonentext + diff --git a/addons/towing/XEH_PREP.hpp b/addons/towing/XEH_PREP.hpp index f3937e01c3..d26b29e5f0 100644 --- a/addons/towing/XEH_PREP.hpp +++ b/addons/towing/XEH_PREP.hpp @@ -1,3 +1,4 @@ +PREP(addRopeToVehicle); PREP(attachRopePFH); PREP(canStartTow); PREP(detach); diff --git a/addons/towing/XEH_preInit.sqf b/addons/towing/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/towing/XEH_preInit.sqf +++ b/addons/towing/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/towing/config.cpp b/addons/towing/config.cpp index 32b80109ea..d4d1b5e854 100644 --- a/addons/towing/config.cpp +++ b/addons/towing/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_logistics_rope"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/towing/functions/fnc_addRopeToVehicle.sqf b/addons/towing/functions/fnc_addRopeToVehicle.sqf new file mode 100644 index 0000000000..4ff0fce62d --- /dev/null +++ b/addons/towing/functions/fnc_addRopeToVehicle.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Dystopian + * Adds rope to vehicle inventory. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * cursorObject call ace_towing_fnc_addRopeToVehicle + * + * Public: No + */ + +if (!GVAR(addRopeToVehicleInventory)) exitWith {}; +params ["_vehicle"]; + +if (0 == getNumber (configOf _vehicle >> QEGVAR(cargo,hasCargo))) exitWith {}; + +private _ropeType = if ( + -1 < ["Tank", "Wheeled_APC_F", "Truck_F"] findIf {_vehicle isKindOf _x} +) then {"ACE_rope12"} else {"ACE_rope6"}; + +_vehicle addItemCargoGlobal [_ropeType, 1]; diff --git a/addons/towing/functions/fnc_attachRopePFH.sqf b/addons/towing/functions/fnc_attachRopePFH.sqf index 5fd9fd6f32..e8336ecc25 100644 --- a/addons/towing/functions/fnc_attachRopePFH.sqf +++ b/addons/towing/functions/fnc_attachRopePFH.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * PFH which allows the user to attach a rope to the given target vehicle * * Arguments: @@ -50,7 +50,7 @@ if (_intersections isNotEqualTo []) then { GVAR(attachHelper) setVariable [QGVAR(object), _intersectObject]; }; - + }; if (_source isNotEqualTo [0, 0, 0]) then { diff --git a/addons/towing/functions/fnc_canStartTow.sqf b/addons/towing/functions/fnc_canStartTow.sqf index 593762c68c..1ffca3df86 100644 --- a/addons/towing/functions/fnc_canStartTow.sqf +++ b/addons/towing/functions/fnc_canStartTow.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Condition for whether or not we can tow from this object * * Arguments: diff --git a/addons/towing/functions/fnc_detach.sqf b/addons/towing/functions/fnc_detach.sqf index e7cd95e079..92494eae0e 100644 --- a/addons/towing/functions/fnc_detach.sqf +++ b/addons/towing/functions/fnc_detach.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Detaches child from parent, and gives rope item back * * Arguments: diff --git a/addons/towing/functions/fnc_isSuitableSimulation.sqf b/addons/towing/functions/fnc_isSuitableSimulation.sqf index 076b7933c3..c808dc20c4 100644 --- a/addons/towing/functions/fnc_isSuitableSimulation.sqf +++ b/addons/towing/functions/fnc_isSuitableSimulation.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Condition for whether or not this object is a simulation type which can be a tow parent (TankX or CarX) * * Arguments: diff --git a/addons/towing/functions/fnc_onMouseButtonDown.sqf b/addons/towing/functions/fnc_onMouseButtonDown.sqf index a20c2cf38c..401cf8c8a1 100644 --- a/addons/towing/functions/fnc_onMouseButtonDown.sqf +++ b/addons/towing/functions/fnc_onMouseButtonDown.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Handles mouse interaction for attaching rope * * Arguments: diff --git a/addons/towing/functions/fnc_onMouseButtonUp.sqf b/addons/towing/functions/fnc_onMouseButtonUp.sqf index ff0bac85d3..04a406e9f2 100644 --- a/addons/towing/functions/fnc_onMouseButtonUp.sqf +++ b/addons/towing/functions/fnc_onMouseButtonUp.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Handles mouse interaction for attaching rope * * Arguments: diff --git a/addons/towing/functions/fnc_startTow.sqf b/addons/towing/functions/fnc_startTow.sqf index d216576499..57cb38c416 100644 --- a/addons/towing/functions/fnc_startTow.sqf +++ b/addons/towing/functions/fnc_startTow.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Start rope attach PFH * * Arguments: @@ -28,6 +28,8 @@ if (_ropeLength == 0) then { _unit removeItem _ropeClass; +GVAR(cancel) = false; GVAR(canAttach) = false; [LINKFUNC(towStateMachinePFH), 0, [TOW_STATE_ATTACH_PARENT, _unit, _target, objNull, _ropeLength, _ropeClass]] call CBA_fnc_addPerFrameHandler; +[QGVAR(ropeDeployed), [_unit, _target, _ropeClass]] call CBA_fnc_localEvent; diff --git a/addons/towing/functions/fnc_towStateMachinePFH.sqf b/addons/towing/functions/fnc_towStateMachinePFH.sqf index 326a9aeee5..aa211c7a8c 100644 --- a/addons/towing/functions/fnc_towStateMachinePFH.sqf +++ b/addons/towing/functions/fnc_towStateMachinePFH.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Called per frame. Handles current unit state for attaching a rope to two vehicles * * Arguments: @@ -25,10 +25,11 @@ private _exitCondition = !( { "" isEqualTo currentWeapon _unit || { _unit call EFUNC(common,isSwimming) }} && { [_unit, objNull, [INTERACTION_EXCEPTIONS]] call EFUNC(common,canInteractWith) } && { "unconscious" isNotEqualTo toLower animationState _unit } && - { !(_unit getVariable ["ACE_isUnconscious", false]) } + { !(_unit getVariable ["ACE_isUnconscious", false]) } && + { ACE_player == _unit } ); -if (_exitCondition) then { +if (_exitCondition && {_state < TOW_STATE_CANCEL}) then { _state = TOW_STATE_CANCEL; }; @@ -45,8 +46,9 @@ switch (_state) do { _args set [3, _rope]; }; - if (GVAR(mouseRight)) then { + if (GVAR(mouseRight) || GVAR(cancel)) then { _args set [0, TOW_STATE_CANCEL]; + GVAR(cancel) = false; }; }; case TOW_STATE_ATTACH_CHILD: { @@ -74,6 +76,11 @@ switch (_state) do { ERROR_MSG("_child isEqualTo _parent"); }; + if (GVAR(cancel)) exitWith { + _args set [0, TOW_STATE_CANCEL]; + GVAR(cancel) = false; + }; + [QGVAR(setTowParent), [_parent, _child], _parent] call CBA_fnc_targetEvent; GVAR(attachHelper) ropeDetach _rope; @@ -127,10 +134,13 @@ switch (_state) do { }; case TOW_STATE_CANCEL: { TRACE_1("state cancel",_rope); - ropeDestroy _rope; + if !(isNull _rope) then { + ropeDestroy _rope; + }; [_unit, _ropeClass, true] call CBA_fnc_addItem; _args set [0, TOW_STATE_CLEANUP]; - + GVAR(cancel) = false; + [QGVAR(ropeDeployCanceled), [_unit, _ropeClass]] call CBA_fnc_localEvent; (localize LSTRING(canceled)) call CBA_fnc_notify; }; case TOW_STATE_CLEANUP: { diff --git a/addons/towing/functions/script_component.hpp b/addons/towing/functions/script_component.hpp deleted file mode 100644 index cb87a08576..0000000000 --- a/addons/towing/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\towing\script_component.hpp" \ No newline at end of file diff --git a/addons/towing/initSettings.sqf b/addons/towing/initSettings.sqf new file mode 100644 index 0000000000..8361dccccd --- /dev/null +++ b/addons/towing/initSettings.sqf @@ -0,0 +1,13 @@ +[ + QGVAR(addRopeToVehicleInventory), "CHECKBOX", + LSTRING(Setting_addRopeToVehicleInventory_DisplayName), + LELSTRING(OptionsMenu,CategoryLogistics), + true, + true, + { + if !(_this && {isServer} && {isNil QGVAR(addRopeToVehicleInventory_initialized)}) exitWith {}; + GVAR(addRopeToVehicleInventory_initialized) = true; + ["Tank", "initPost", LINKFUNC(addRopeToVehicle), true, [], true] call CBA_fnc_addClassEventHandler; + ["Car", "initPost", LINKFUNC(addRopeToVehicle), true, [], true] call CBA_fnc_addClassEventHandler; + } +] call CBA_fnc_addSetting; diff --git a/addons/towing/script_component.hpp b/addons/towing/script_component.hpp index d3c12463c9..2d9790ac20 100644 --- a/addons/towing/script_component.hpp +++ b/addons/towing/script_component.hpp @@ -17,7 +17,7 @@ #include "\z\ace\addons\main\script_macros.hpp" #define TOW_ACTION_DISTANCE 3 -#define INTERACTION_EXCEPTIONS "isNotInside", "isNotOnLadder", "isNotSwimming" +#define INTERACTION_EXCEPTIONS "isNotOnLadder", "isNotSwimming" #define TOW_STATE_ATTACH_PARENT 0 #define TOW_STATE_ATTACH_CHILD 1 diff --git a/addons/towing/stringtable.xml b/addons/towing/stringtable.xml index 91f189d4e0..4dd29ac78d 100644 --- a/addons/towing/stringtable.xml +++ b/addons/towing/stringtable.xml @@ -4,46 +4,132 @@ Towing けん引 + Remorquage + Буксирование + Abschleppen + Holowanie + 牵引 + 견인 + Remolcado Attach Tow Rope けん引ロープを取り付け + Attacher la corde de remorquage + Прикрепить буксировочный канат + Abschleppseil befestigen + Przypnij linkę holowniczą + 系上牵引绳 + 견인줄 부착 + Sujetar cuerda de remolcado Attaching Cancelled 取り付けを中止しました + Attachage annulé + Прикрепление отменено + Befestigen Abgebrochen + Przyczepianie anulowane + 取消系上绳索 + 견인 취소됨 + Sujección cancelada Attach Tow Rope (3.2m) けん引ロープ (3.2m) を取り付け + Attacher la corde (3,2 m) + Прикрепить буксировочный канат (3.2м) + Befestige Seil (3.2m) + Przypnij linkę holowniczą (3,2m) + 系上牵引绳(3.2米) + 견인줄 부착(3.2M) + Sujetar cuerda de remolcado (3.2m) Attach Tow Rope (6.2m) けん引ロープ (6.2m) を取り付け + Attacher la corde (6,2 m) + Прикрепить буксировочный канат (6.2м) + Befestige Seil (6.2m) + Przypnij linkę holowniczą (6,2m) + 系上牵引绳(6.2米) + 견인줄 부착(6.2M) + Sujetar cuerda de remolcado (6.2m) Attach Tow Rope (12.2m) けん引ロープ (12.2m) を取り付け + Attacher la corde (12,2 m) + Прикрепить буксировочный канат (12.2м) + Befestige Seil (12.2m) + Przypnij linkę holowniczą (12,2m) + 系上牵引绳(12.2米) + 견인줄 부착(12.2M) + Sujetar cuerda de remolcado (12.2m) Attach Tow Rope (15.2m) けん引ロープ (15.2m) を取り付け + Attacher la corde (15,2 m) + Прикрепить буксировочный канат (15.2м) + Befestige Seil (15.2m) + Przypnij linkę holowniczą (15,2m) + 系上牵引绳(15.2米) + 견인줄 부착(15.2M) + Sujetar cuerda de remolcado (15.2m) - Attach Tow Rope (18.2m) - けん引ロープ (18.2m) を取り付け + Attach Tow Rope (18.3m) + けん引ロープ (18.3m) を取り付け + Attacher la corde (18,3 m) + Прикрепить буксировочный канат (18.3м) + Befestige Seil (18.3m) + Przypnij linkę holowniczą (18,3m) + 系上牵引绳(18.3米) + 견인줄 부착(18.2M) + Sujetar cuerda de remolcado (18.3m) - Attach Tow Rope (27.2m) - けん引ロープ (28.2m) を取り付け + Attach Tow Rope (27.4m) + けん引ロープ (27.4m) を取り付け + Attacher la corde (27,4 m) + Прикрепить буксировочный канат (27.4м) + Befestige Seil (27.4m) + Przypnij linkę holowniczą (27,4m) + 系上牵引绳(27.4米) + 견인줄 부착(27.4M) + Sujetar cuerda de remolcado (27.4m) - Attach Tow Rope (36.2m) - けん引ロープ (36.2m) を取り付け + Attach Tow Rope (36.6m) + けん引ロープ (36.6m) を取り付け + Attacher la corde (36,6 m) + Прикрепить буксировочный канат (36.6м) + Befestige Seil (36.6m) + Przypnij linkę holowniczą (36,6m) + 系上牵引绳(36.6米) + 견인줄 부착(36.6M) + Sujetar cuerda de remolcado (36.6m) Detach Tow Rope けん引ロープを外す + Détacher la corde + Отцепить буксировочный канат + Entferne Abschleppseil + Odepnij linkę holowniczą + 解开牵引绳 + 견인줄 분리 + Desmontar cuerda de remolcado + + + Add Tow Rope to Vehicle Inventory + Добавить буксировочный трос в инвентарь машин + Dodaj linkę holowniczą do ekwipunku pojazdów + 차량 소지품에 견인줄 추가 + Añadir cuerda de remolcado al inventario del vehículo + 車両のインベントリに牽引ロープを追加する + Abschleppseil zum Fahrzeuginventar hinzufügen diff --git a/addons/trenches/ACE_Arsenal_Stats.hpp b/addons/trenches/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..d8f79f3e5c --- /dev/null +++ b/addons/trenches/ACE_Arsenal_Stats.hpp @@ -0,0 +1,13 @@ +class EGVAR(arsenal,stats) { + class statBase; + class GVAR(entrenchingTool): statBase { + scope = 2; + priority = -1; + stats[] = {QGVAR(entrenchingTool)}; + displayName = CSTRING(EntrenchingToolName); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(common,yes))); + condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + tabs[] = {{0,1,5}, {7}}; + }; +}; diff --git a/addons/trenches/CfgVehicles.hpp b/addons/trenches/CfgVehicles.hpp index 478243345d..d34886f2ae 100644 --- a/addons/trenches/CfgVehicles.hpp +++ b/addons/trenches/CfgVehicles.hpp @@ -16,6 +16,11 @@ class CBA_Extended_EventHandlers; condition = QUOTE([ARR_2(_target,_player)] call FUNC(canRemoveTrench)); \ statement = QUOTE([ARR_2(_target,_player)] call FUNC(removeTrench);); \ }; \ + class ACE_CamouflageTrench { \ + displayName = CSTRING(CamouflageTrench); \ + condition = QUOTE([ARR_2(_target,_player)] call FUNC(canCamouflageTrench)); \ + statement = QUOTE([ARR_2(_target,_player)] call FUNC(camouflageTrench)); \ + }; \ }; \ } @@ -62,6 +67,8 @@ class CfgVehicles { class EventHandlers { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; }; + hiddenSelections[] = {"velka"}; + hiddenSelectionsTextures[] = {"a3\map_data\gdt_mud_co.paa"}; }; class ACE_envelope_big: BagFence_base_F { author = ECSTRING(common,ACETeam); @@ -78,6 +85,8 @@ class CfgVehicles { class EventHandlers { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; }; + hiddenSelections[] = {"velka"}; + hiddenSelectionsTextures[] = {"a3\map_data\gdt_mud_co.paa"}; }; class ACE_envelope_small_NoGeo: ACE_envelope_small { diff --git a/addons/trenches/CfgWeapons.hpp b/addons/trenches/CfgWeapons.hpp index de79bc277f..c4548606db 100644 --- a/addons/trenches/CfgWeapons.hpp +++ b/addons/trenches/CfgWeapons.hpp @@ -9,8 +9,11 @@ class CfgWeapons { model = QPATHTOEF(apl,ace_entrchtool.p3d); picture = QPATHTOF(ui\w_entrchtool_ca.paa); scope = 2; + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; + + GVAR(entrenchingTool) = 1; }; }; diff --git a/addons/trenches/README.md b/addons/trenches/README.md index 0d33527da4..cd19758221 100644 --- a/addons/trenches/README.md +++ b/addons/trenches/README.md @@ -1,17 +1,7 @@ ace_trenches ================= -Adds item 'ACE_entrenchingtool' +Provides players with the capability of digging trenches. + +Adds item 'ACE_EntrenchingTool' Adds 2 trenches; Envelope - Small & Envelop - Big - -### Whitelist surfaces for digging -Single surfaces can be whitelisted by adding `ACE_canDig = 1` into `CfgSurfaces`. -Example: -```cpp -class CfgSurfaces { - class myAwesomeSurface { - ACE_canDig = 1; - }; -}; -``` - diff --git a/addons/trenches/XEH_PREP.hpp b/addons/trenches/XEH_PREP.hpp index 2e671acb85..05eb403fd8 100644 --- a/addons/trenches/XEH_PREP.hpp +++ b/addons/trenches/XEH_PREP.hpp @@ -1,4 +1,6 @@ +PREP(camouflageTrench); +PREP(canCamouflageTrench); PREP(canContinueDiggingTrench); PREP(canDigTrench); PREP(canRemoveTrench); @@ -9,6 +11,7 @@ PREP(handlePlayerChanged); PREP(handlePlayerInventoryChanged); PREP(handleScrollWheel); PREP(handleUnconscious); +PREP(hasEntrenchingTool); PREP(placeCancel); PREP(placeConfirm); PREP(placeTrench); diff --git a/addons/trenches/XEH_preInit.sqf b/addons/trenches/XEH_preInit.sqf index 9361d05015..47d20d7c2b 100644 --- a/addons/trenches/XEH_preInit.sqf +++ b/addons/trenches/XEH_preInit.sqf @@ -8,4 +8,6 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +GVAR(entrenchingTools) = call (uiNamespace getVariable QGVAR(entrenchingTools)); + ADDON = true; diff --git a/addons/trenches/XEH_preStart.sqf b/addons/trenches/XEH_preStart.sqf index 022888575e..c966b2c9b6 100644 --- a/addons/trenches/XEH_preStart.sqf +++ b/addons/trenches/XEH_preStart.sqf @@ -1,3 +1,9 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _entrenchingTools = (QUOTE(getNumber (_x >> QQGVAR(entrenchingTool)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x}); +_entrenchingTools append (QUOTE(getNumber (_x >> QQGVAR(entrenchingTool)) > 0) configClasses (configFile >> "CfgVehicles") apply {configName _x}); +TRACE_1("",_entrenchingTools); + +uiNamespace setVariable [QGVAR(entrenchingTools), compileFinal str _entrenchingTools]; diff --git a/addons/trenches/config.cpp b/addons/trenches/config.cpp index 3f76f012ed..18d5e4a3d6 100644 --- a/addons/trenches/config.cpp +++ b/addons/trenches/config.cpp @@ -14,6 +14,7 @@ class CfgPatches { }; }; +#include "ACE_Arsenal_Stats.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/trenches/functions/fnc_camouflageTrench.sqf b/addons/trenches/functions/fnc_camouflageTrench.sqf new file mode 100644 index 0000000000..efdfe82d5f --- /dev/null +++ b/addons/trenches/functions/fnc_camouflageTrench.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: Cyruz + * Apply surfaceTexture to a completed trench. + * + * Arguments: + * 0: Trench + * 1: Unit + * + * Return Value: + * None + * + * Example: + * [TrenchObj, ACE_player] call ace_trenches_fnc_camouflageTrench + * + * Public: No + */ + +params ["_trench", "_unit"]; + +_unit playActionNow "PutDown"; + +[{ + _this setObjectTextureGlobal [0, surfaceTexture getPosATL _this]; + _this setVariable [QGVAR(camouflaged), true, true]; +}, _trench, 2] call CBA_fnc_waitAndExecute; diff --git a/addons/trenches/functions/fnc_canCamouflageTrench.sqf b/addons/trenches/functions/fnc_canCamouflageTrench.sqf new file mode 100644 index 0000000000..074fd910a7 --- /dev/null +++ b/addons/trenches/functions/fnc_canCamouflageTrench.sqf @@ -0,0 +1,29 @@ +#include "..\script_component.hpp" +/* + * Author: Cyruz + * Checks if a unit can camouflage a trench. + * + * Arguments: + * 0: Trench + * 1: Unit + * + * Return Value: + * Can camouflage + * + * Example: + * [TrenchObj, ACE_player] call ace_trenches_fnc_canCamouflageTrench + * + * Public: No + */ + +params ["_trench", "_unit"]; + +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; + +// Prevent camouflage if not fully dug +if ((_trench getVariable [QGVAR(progress), 0]) != 1) exitWith {false}; + +// Prevent camouflage being applied once already camouflaged +if (_trench getVariable [QGVAR(camouflaged), false]) exitWith {false}; + +true diff --git a/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf b/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf index 740b34df7c..0074c21082 100644 --- a/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Checks if a unit can continue digging a trench @@ -18,7 +18,7 @@ params ["_trench", "_unit"]; -if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; if ((_trench getVariable [QGVAR(progress), 1]) >= 1) exitWith {false}; // Prevent removing/digging trench by more than one person diff --git a/addons/trenches/functions/fnc_canDigTrench.sqf b/addons/trenches/functions/fnc_canDigTrench.sqf index d6bf05993d..3ef8e2ee74 100644 --- a/addons/trenches/functions/fnc_canDigTrench.sqf +++ b/addons/trenches/functions/fnc_canDigTrench.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg, commy2, esteldunedain * Checks if a unit can dig a trench. @@ -17,6 +17,6 @@ params ["_unit"]; -if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; _unit call EFUNC(common,canDig) diff --git a/addons/trenches/functions/fnc_canRemoveTrench.sqf b/addons/trenches/functions/fnc_canRemoveTrench.sqf index 23347fc310..8d1ec7578f 100644 --- a/addons/trenches/functions/fnc_canRemoveTrench.sqf +++ b/addons/trenches/functions/fnc_canRemoveTrench.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: SzwedzikPL * Checks if a unit can remove a trench @@ -18,7 +18,7 @@ params ["_trench", "_unit"]; -if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; // Prevent removing/digging trench by more than one person 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 4c6c6f9546..78047c189e 100644 --- a/addons/trenches/functions/fnc_continueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_continueDiggingTrench.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support, esteldunedain * Continue process of digging trench. @@ -48,6 +48,8 @@ private _fnc_onFinish = { private _progress = _trench getVariable [QGVAR(progress), 0]; _trench setVariable [QGVAR(progress), _progress, true]; + [QGVAR(finished), [_unit, _trench]] call CBA_fnc_globalEvent; + // Reset animation [_unit, "", 1] call EFUNC(common,doAnimation); }; @@ -65,7 +67,7 @@ private _fnc_onFailure = { }; private _fnc_condition = { (_this select 0) params ["_unit"]; - "ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems)) + _unit call FUNC(hasEntrenchingTool) }; [(_digTimeLeft + 0.5), [_unit, _trench], _fnc_onFinish, _fnc_onFailure, localize LSTRING(DiggingTrench), _fnc_condition] call EFUNC(common,progressBar); diff --git a/addons/trenches/functions/fnc_handleInteractMenuOpened.sqf b/addons/trenches/functions/fnc_handleInteractMenuOpened.sqf index 1a27e28d60..6b242c7918 100644 --- a/addons/trenches/functions/fnc_handleInteractMenuOpened.sqf +++ b/addons/trenches/functions/fnc_handleInteractMenuOpened.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle opening of interaction menu. diff --git a/addons/trenches/functions/fnc_handleKilled.sqf b/addons/trenches/functions/fnc_handleKilled.sqf index 1142ad0f3b..bcdbd48580 100644 --- a/addons/trenches/functions/fnc_handleKilled.sqf +++ b/addons/trenches/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle death. diff --git a/addons/trenches/functions/fnc_handlePlayerChanged.sqf b/addons/trenches/functions/fnc_handlePlayerChanged.sqf index 77a152e421..28f1dea5e9 100644 --- a/addons/trenches/functions/fnc_handlePlayerChanged.sqf +++ b/addons/trenches/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle player changes. diff --git a/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf b/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf index 3873e40b4a..2f341a0b86 100644 --- a/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf +++ b/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle the InventoryChanged event. @@ -19,7 +19,7 @@ params ["_unit"]; if (_unit getVariable [QGVAR(isPlacing), false]) then { - if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) then { + if !(_unit call FUNC(hasEntrenchingTool)) then { [_unit] call FUNC(placeCancel); }; }; diff --git a/addons/trenches/functions/fnc_handleScrollWheel.sqf b/addons/trenches/functions/fnc_handleScrollWheel.sqf index 5fc202db8a..29a35b3674 100644 --- a/addons/trenches/functions/fnc_handleScrollWheel.sqf +++ b/addons/trenches/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg * Handles sandbag rotation diff --git a/addons/trenches/functions/fnc_handleUnconscious.sqf b/addons/trenches/functions/fnc_handleUnconscious.sqf index 6f600cecdf..ba808625ce 100644 --- a/addons/trenches/functions/fnc_handleUnconscious.sqf +++ b/addons/trenches/functions/fnc_handleUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle unconsciousness. diff --git a/addons/trenches/functions/fnc_hasEntrenchingTool.sqf b/addons/trenches/functions/fnc_hasEntrenchingTool.sqf new file mode 100644 index 0000000000..5a1127d007 --- /dev/null +++ b/addons/trenches/functions/fnc_hasEntrenchingTool.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: veteran29 + * Checks if unit has entrenching tool. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Has entrenching tool + * + * Example: + * [bob] call ace_trenches_fnc_hasEntrenchingTool + * + * Public: Yes +*/ + +params [ + ["_unit", objNull, [objNull]] +]; + +private _uniqueItems = _unit call EFUNC(common,uniqueItems); +_uniqueItems append weapons _unit; +_uniqueItems pushBack backpack _unit; + +GVAR(entrenchingTools) findIf {_x in _uniqueItems} != -1 // return diff --git a/addons/trenches/functions/fnc_placeCancel.sqf b/addons/trenches/functions/fnc_placeCancel.sqf index c3d555ffe8..a06ecff459 100644 --- a/addons/trenches/functions/fnc_placeCancel.sqf +++ b/addons/trenches/functions/fnc_placeCancel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support * Cancels trench dig diff --git a/addons/trenches/functions/fnc_placeConfirm.sqf b/addons/trenches/functions/fnc_placeConfirm.sqf index 867b034679..03d4791e02 100644 --- a/addons/trenches/functions/fnc_placeConfirm.sqf +++ b/addons/trenches/functions/fnc_placeConfirm.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support and esteldunedain * Confirms trench dig @@ -44,6 +44,8 @@ GVAR(trenchPlacementData) params ["_dx", "_dy", "_offset"]; private _basePos = GVAR(trenchPos); private _angle = (GVAR(digDirection) + getDir _unit); +[QGVAR(placed), [_unit, _trench]] call CBA_fnc_globalEvent; + // _v1 forward from the player, _v2 to the right, _v3 points away from the ground private _v3 = surfaceNormal _basePos; private _v2 = [sin _angle, +cos _angle, 0] vectorCrossProduct _v3; diff --git a/addons/trenches/functions/fnc_placeTrench.sqf b/addons/trenches/functions/fnc_placeTrench.sqf index 0f52786561..f49aef4a38 100644 --- a/addons/trenches/functions/fnc_placeTrench.sqf +++ b/addons/trenches/functions/fnc_placeTrench.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support, esteldunedain * Starts the place process for trench. diff --git a/addons/trenches/functions/fnc_removeTrench.sqf b/addons/trenches/functions/fnc_removeTrench.sqf index 2cdb874846..0e9870eb8b 100644 --- a/addons/trenches/functions/fnc_removeTrench.sqf +++ b/addons/trenches/functions/fnc_removeTrench.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support and esteldunedain * Removes trench @@ -66,7 +66,7 @@ private _fnc_onFailure = { }; private _fnc_condition = { (_this select 0) params ["_unit"]; - "ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems)) + _unit call FUNC(hasEntrenchingTool) }; [(_removeTimeLeft + 0.5), [_unit, _trench], _fnc_onFinish, _fnc_onFailure, localize LSTRING(RemovingTrench), _fnc_condition] call EFUNC(common,progressBar); diff --git a/addons/trenches/functions/fnc_setTrenchPlacement.sqf b/addons/trenches/functions/fnc_setTrenchPlacement.sqf index c314914efe..d222de1326 100644 --- a/addons/trenches/functions/fnc_setTrenchPlacement.sqf +++ b/addons/trenches/functions/fnc_setTrenchPlacement.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg, edited by commy2 for better MP and eventual AI support and esteldunedain * Sets trench placement diff --git a/addons/trenches/functions/script_component.hpp b/addons/trenches/functions/script_component.hpp deleted file mode 100644 index 3747e01219..0000000000 --- a/addons/trenches/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\trenches\script_component.hpp" \ No newline at end of file diff --git a/addons/trenches/initSettings.sqf b/addons/trenches/initSettings.sqf index 7abce22295..13e373d25d 100644 --- a/addons/trenches/initSettings.sqf +++ b/addons/trenches/initSettings.sqf @@ -1,36 +1,36 @@ // Trenches dig/remove durations [ - QGVAR(smallEnvelopeDigDuration), - "TIME", + QGVAR(smallEnvelopeDigDuration), + "TIME", [LSTRING(SmallEnvelopeDigDuration_DisplayName), LSTRING(SmallEnvelopeDigDuration_Description)], LSTRING(Category), - [5, 600, 20], + [5, 600, 20], true ] call CBA_fnc_addSetting; [ - QGVAR(smallEnvelopeRemoveDuration), - "TIME", + QGVAR(smallEnvelopeRemoveDuration), + "TIME", [LSTRING(SmallEnvelopeRemoveDuration_DisplayName), LSTRING(SmallEnvelopeRemoveDuration_Description)], LSTRING(Category), - [5, 600, 12], + [5, 600, 12], true ] call CBA_fnc_addSetting; [ - QGVAR(bigEnvelopeDigDuration), - "TIME", + QGVAR(bigEnvelopeDigDuration), + "TIME", [LSTRING(BigEnvelopeDigDuration_DisplayName), LSTRING(BigEnvelopeDigDuration_Description)], LSTRING(Category), - [5, 600, 25], + [5, 600, 25], true ] call CBA_fnc_addSetting; [ - QGVAR(bigEnvelopeRemoveDuration), - "TIME", + QGVAR(bigEnvelopeRemoveDuration), + "TIME", [LSTRING(BigEnvelopeRemoveDuration_DisplayName), LSTRING(BigEnvelopeRemoveDuration_Description)], LSTRING(Category), - [5, 600, 15], + [5, 600, 15], true ] call CBA_fnc_addSetting; diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml index bcbf18e942..bb2ea2ced1 100644 --- a/addons/trenches/stringtable.xml +++ b/addons/trenches/stringtable.xml @@ -11,7 +11,7 @@ Polní lopatka Ferramenta de trincheira Саперная лопата - シャベル + 塹壕ツール 야전삽 战备锹 戰備鍬 @@ -19,7 +19,7 @@ Entrenching Tool - Saperka, używana do budowy wnęk + Saperka, używana do budowy okopów Mit dem Klappspaten können Erdwälle oder Gräben ausgehoben werden. Pala da Trincea Pala para trincheras @@ -27,8 +27,8 @@ Polní lopatky se používají k zákopovým a jiným pracem. Ferramenta de trincheira Саперная лопата - シャベル - 야전용 삽. 군인들의 영원한 친구 + 塹壕ツール + 야전삽 战备锹 戰備鍬 Kürek @@ -36,7 +36,7 @@ Envelope - Small Rund - Klein - Wnęka - mała + Okop - mały Fascia - Piccola Trinchera pequeña Tranchée individuelle @@ -44,7 +44,7 @@ Окоп - Малый 塹壕 - 小型 참호 - 소형 - 掩体 - 小 + 掩体—小 掩體 - 小 Obálka - Malá Zarf - Küçük @@ -52,7 +52,7 @@ Small Personal Trench Kleiner Schützengraben - Mała jednoosobowa wnęka + Mały jednoosobowy okop Piccola Trincea Personale Trinchera personal pequeña Petite tranchée personnelle @@ -68,7 +68,7 @@ Dig Small Trench Grabe kleinen Schützengraben - Kop małą wnękę + Kop mały okop Scava Trincea Piccola Cavar trinchera pequeña Creuser une petite tranchée @@ -77,14 +77,14 @@ Вырыть малый окоп 小型塹壕を掘る 소형참호 파기 - 盖小掩体 + 挖掘小掩体 蓋小掩體 Küçük Siper Envelope - Big Rund - Groß - Wnęka - duża + Okop - duży Fascia - Grande Trinchera grande Grande tranchée @@ -92,7 +92,7 @@ Окоп - Большой 塹壕 - 大型 참호 - 대형 - 掩体 - 大 + 掩体—大 掩體 - 大 Obálka - Velká Zarf - Büyük @@ -100,7 +100,7 @@ Large Personal Trench Großer Schützengraben - Duża jednoosobowa wnęka + Duży jednoosobowy okop Grande Trincea Personale Trinchera personal grande Grande tranchée personnelle @@ -116,7 +116,7 @@ Dig Big Trench Grabe großen Schützengraben - Kop dużą wnękę + Kop duży okop Scava Trincea Grande Cavar trinchera grande Creuser une grande tranchée @@ -125,7 +125,7 @@ Вырыть большой окоп 大型の塹壕を掘る 대형참호 파기 - 盖大掩体 + 挖掘大掩体 蓋大掩體 Büyük Siper @@ -181,7 +181,7 @@ Digging Trench Grabe Schützengraben - Kopanie wnęki + Kopanie okopu Scavando la Trincea Cavando trinchera Excavation de la tranchée @@ -189,14 +189,14 @@ Cavando trincheira Копание окопа 塹壕を掘っている - 참호 파는중 - 正在盖掩体 + 참호 파는 중 + 正在挖掘掩体 正在蓋掩體中 Siper Kazılıyor Continue Digging Trench - Wzów kopanie wnęki + Wzów kopanie okopu Continuar cavando trincheira Poursuivre l'excavation de la tranchée Продолжить копание окопа @@ -205,7 +205,7 @@ Graben fortsetzen 계속해서 참호파기 Continuando a Scavare la Trincea - 继续盖掩体 + 继续挖掘掩体 繼續蓋掩體 Kazmaya Devam Et Continuar cavando trinchera @@ -226,16 +226,26 @@ Siperi Kaldır Eliminar trinchera + + Camouflage Trench + Zakamufluj okop + 伪装掩体 + 참호 위장시키기 + Камуфлировать окоп + Camuflar trinchera + 塹壕を偽装 + Graben tarnen + Removing Trench - Usuwanie wnęki + Usuwanie okopu Removendo tricnheira Retrait de la tranchée Убирание окопа Odstraňuji zákop 塹壕を消しています Entferne Schützengraben - 참호 제거중... + 참호 제거 중 Rimuovendo la Trincea 正在移除掩体 移除掩體中 @@ -249,14 +259,20 @@ ACE 塹壕 ACETrincheras ACE Okopy + ACE Gräben + ACE 战壕 + ACE 참호 Small Trench Dig Duration - Продолжительность копания малого окопа + Время копания малого окопа Petites tranchées - durée d'excavation 小型塹壕の完成時間 Tiempo de cavar trinchera pequeña Czas kopania małego okopu + Kleiner Graben - Aushebungsdauer + 小型战壕挖掘时间 + 소형참호 건설 시간 Time, in seconds, required to dig a small trench. @@ -265,14 +281,20 @@ 小型塹壕が完成するまでの時間 (秒) を設定できます。 Tiempo, en segundos, requerido para cavar una trinchera pequeña. Czas, w sekundach wymagany do wykopania małego okopu + Zeit in Sekunden, um einen kleinen Graben auszuheben. + 挖一条小型战壕所需的时间(秒)。 + 소형 참호를 팔 때 필요한 시간을 설정합니다. (초 단위) Small Trench Remove Duration - Продолжительность удаления малого окопа + Время удаления малого окопа Petites tranchées - durée de retrait 小型塹壕の削除時間 Tiempo de eliminar trinchera pequeña Czas usuwania małego okopu + Kleiner Graben - Aufschüttdauer + 小型战壕回填时间 + 소형참호 제거 시간 Time, in seconds, required to remove a small trench. @@ -281,14 +303,20 @@ 小型塹壕が削除されるまでの時間 (秒) を設定できます。 Tiempo, en segundos, requerido para eliminar una trinchera pequeña. Czas, w sekundach wymagany do usunięcia małego okopu + Zeit in Sekunden, um einen kleinen Graben aufzuschütten. + 回填一条小型战壕所需的时间(秒)。 + 소형 참호를 제거할때 필요한 시간을 설정합니다. (초 단위) Big Trench Dig Duration - Продолжительность рытья большого окопа + Время рытья большого окопа Grandes tranchées - durée d'excavation 大型塹壕の完成時間 Tiempo de cavar trinchera grande Czas kopania dużego okopu + Große Graben - Aushebungsdauer + 大型战壕挖掘时间 + 대형참호 건설 시간 Time, in seconds, required to dig a big trench. @@ -297,14 +325,20 @@ 大型塹壕が完成するまでの時間 (秒) を設定できます。 Tiempo, en segundos, requerido para cavar una trinchera grande Czas, w sekundach wymagany do wykopania dużego okopu + Zeit in Sekunden, um einen großen Graben auszuheben. + 挖一条大型战壕所需的时间(秒)。 + 대형 참호를 팔때 필요한 시간을 설정합니다. (초 단위) Big Trench Remove Duration - Продолжительность удаления большого окопа + Время удаления большого окопа Grandes tranchées - durée de retrait 大型塹壕の削除時間 Tiempo de eliminar trinchera grande Czas usuwania dużego okopu + Kleiner Graben - Aufschüttdauer + 大型战壕回填时间 + 대형참호 제거 시간 Time, in seconds, required to remove a big trench. @@ -313,6 +347,9 @@ 大型塹壕が削除されるまでの時間 (秒) を設定できます。 Tiempo, en segundos, requerido para eliminar una trinchera grande Czas, w sekundach wymagany do usunięcia dużego okopu + Zeit in Sekunden, um einen großen Graben aufzuschütten. + 回填一条大型战壕所需的时间(秒)。 + 대형 참호를 제거할때 필요한 시간을 설정합니다. (초 단위) diff --git a/addons/tripod/CfgWeapons.hpp b/addons/tripod/CfgWeapons.hpp index 4e609f4f3d..27c6ea8525 100644 --- a/addons/tripod/CfgWeapons.hpp +++ b/addons/tripod/CfgWeapons.hpp @@ -9,6 +9,7 @@ class CfgWeapons { descriptionShort = ""; model = QPATHTOF(data\w_sniper_tripod.p3d); picture = QPATHTOF(UI\w_sniper_tripod_ca.paa); + ACE_isTool = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 40; diff --git a/addons/tripod/functions/fnc_adjust.sqf b/addons/tripod/functions/fnc_adjust.sqf index 2dd6964768..db31a0733f 100644 --- a/addons/tripod/functions/fnc_adjust.sqf +++ b/addons/tripod/functions/fnc_adjust.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Adjust tripod height diff --git a/addons/tripod/functions/fnc_handleInteractMenuOpened.sqf b/addons/tripod/functions/fnc_handleInteractMenuOpened.sqf index 0103c0a590..abb9efe304 100644 --- a/addons/tripod/functions/fnc_handleInteractMenuOpened.sqf +++ b/addons/tripod/functions/fnc_handleInteractMenuOpened.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle opening of interaction menu. diff --git a/addons/tripod/functions/fnc_handleKilled.sqf b/addons/tripod/functions/fnc_handleKilled.sqf index 1ce7ce5e0b..01fb5ddd67 100644 --- a/addons/tripod/functions/fnc_handleKilled.sqf +++ b/addons/tripod/functions/fnc_handleKilled.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle death. diff --git a/addons/tripod/functions/fnc_handlePlayerChanged.sqf b/addons/tripod/functions/fnc_handlePlayerChanged.sqf index 506699c293..0d01a138af 100644 --- a/addons/tripod/functions/fnc_handlePlayerChanged.sqf +++ b/addons/tripod/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle player changes. diff --git a/addons/tripod/functions/fnc_handleScrollWheel.sqf b/addons/tripod/functions/fnc_handleScrollWheel.sqf index d1cc67272c..67b4e00946 100644 --- a/addons/tripod/functions/fnc_handleScrollWheel.sqf +++ b/addons/tripod/functions/fnc_handleScrollWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Garth 'L-H' de Wet, Ruthberg * Handles sandbag rotation diff --git a/addons/tripod/functions/fnc_handleUnconscious.sqf b/addons/tripod/functions/fnc_handleUnconscious.sqf index 632be51e0d..96ed5bdce0 100644 --- a/addons/tripod/functions/fnc_handleUnconscious.sqf +++ b/addons/tripod/functions/fnc_handleUnconscious.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handle unconsciousness. diff --git a/addons/tripod/functions/fnc_pickup.sqf b/addons/tripod/functions/fnc_pickup.sqf index 931efaddfa..0ff72a2b98 100644 --- a/addons/tripod/functions/fnc_pickup.sqf +++ b/addons/tripod/functions/fnc_pickup.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Pick up tripod diff --git a/addons/tripod/functions/fnc_place.sqf b/addons/tripod/functions/fnc_place.sqf index c903c0148d..ecefe12784 100644 --- a/addons/tripod/functions/fnc_place.sqf +++ b/addons/tripod/functions/fnc_place.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Rocko, Ruthberg * Place down tripod diff --git a/addons/tripod/functions/script_component.hpp b/addons/tripod/functions/script_component.hpp deleted file mode 100644 index 4fa165afc7..0000000000 --- a/addons/tripod/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\tripod\script_component.hpp" \ No newline at end of file diff --git a/addons/ui/CfgInGameUI.hpp b/addons/ui/CfgInGameUI.hpp new file mode 100644 index 0000000000..b9a1c447dc --- /dev/null +++ b/addons/ui/CfgInGameUI.hpp @@ -0,0 +1,5 @@ +class CfgInGameUI { + class DefaultAction { + size = QUOTE(profileNamespace getVariable [ARR_2('GVAR(hideDefaultActionIcon)', (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8))]); + }; +}; diff --git a/addons/ui/RscInGameUI.hpp b/addons/ui/RscInGameUI.hpp index a3e7d2263a..404eaba7f7 100644 --- a/addons/ui/RscInGameUI.hpp +++ b/addons/ui/RscInGameUI.hpp @@ -2,16 +2,21 @@ #define SPEED_INDICATOR_H (IGUI_GRID_STANCE_HAbs / 3.5) #define SPEED_INDICATOR_Y_OFFSET (IGUI_GRID_STANCE_HAbs / 4.25) +#undef IGUI_GRID_STANCE_X +#undef IGUI_GRID_STANCE_Y +#define ace_IGUI_GRID_STANCE_X (profilenamespace getvariable ['IGUI_GRID_STANCE_X',IGUI_GRID_STANCE_XDef]) +#define ace_IGUI_GRID_STANCE_Y (profilenamespace getvariable ['IGUI_GRID_STANCE_Y',IGUI_GRID_STANCE_YDef]) + class RscPictureKeepAspect; class RscInGameUI { class RscStanceInfo { controls[] += {QGVAR(speedIndicator)}; class GVAR(speedIndicator): RscPictureKeepAspect { onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(speedIndicator),_this select 0)]); - x = IGUI_GRID_STANCE_X + IGUI_GRID_STANCE_WAbs / 2 - SPEED_INDICATOR_W / 2; - y = IGUI_GRID_STANCE_Y + IGUI_GRID_STANCE_HAbs - SPEED_INDICATOR_Y_OFFSET; - w = SPEED_INDICATOR_W; - h = SPEED_INDICATOR_H; + x = QUOTE(ace_IGUI_GRID_STANCE_X + IGUI_GRID_STANCE_WAbs / 2 - SPEED_INDICATOR_W / 2); + y = QUOTE(ace_IGUI_GRID_STANCE_Y + IGUI_GRID_STANCE_HAbs - SPEED_INDICATOR_Y_OFFSET); + w = QUOTE(SPEED_INDICATOR_W); + h = QUOTE(SPEED_INDICATOR_H); }; }; }; diff --git a/addons/ui/config.cpp b/addons/ui/config.cpp index 6dfeba4cfb..0a04e1fccb 100644 --- a/addons/ui/config.cpp +++ b/addons/ui/config.cpp @@ -15,6 +15,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgInGameUI.hpp" #include "CfgVehicles.hpp" #include "ACE_Settings.hpp" #include "ACE_UI.hpp" diff --git a/addons/ui/functions/fnc_compileConfigUI.sqf b/addons/ui/functions/fnc_compileConfigUI.sqf index 0baaa8ca5c..17eaa27308 100644 --- a/addons/ui/functions/fnc_compileConfigUI.sqf +++ b/addons/ui/functions/fnc_compileConfigUI.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Compiles and caches UI from ACE_UI config. diff --git a/addons/ui/functions/fnc_handlePlayerChanged.sqf b/addons/ui/functions/fnc_handlePlayerChanged.sqf index 1abc39efcb..94f317a18c 100644 --- a/addons/ui/functions/fnc_handlePlayerChanged.sqf +++ b/addons/ui/functions/fnc_handlePlayerChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Handles switching units. diff --git a/addons/ui/functions/fnc_handleSpeedIndicator.sqf b/addons/ui/functions/fnc_handleSpeedIndicator.sqf index e6b8718b0d..5f8c360322 100644 --- a/addons/ui/functions/fnc_handleSpeedIndicator.sqf +++ b/addons/ui/functions/fnc_handleSpeedIndicator.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Handles visual changes of the speed indicator. diff --git a/addons/ui/functions/fnc_moduleInit.sqf b/addons/ui/functions/fnc_moduleInit.sqf index b1295a6c10..82c63d4e00 100644 --- a/addons/ui/functions/fnc_moduleInit.sqf +++ b/addons/ui/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the UI module. diff --git a/addons/ui/functions/fnc_onAnimChanged.sqf b/addons/ui/functions/fnc_onAnimChanged.sqf index d241c30bd4..d7a647e9ca 100644 --- a/addons/ui/functions/fnc_onAnimChanged.sqf +++ b/addons/ui/functions/fnc_onAnimChanged.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: veteran29 * Handle player unit animation changes. diff --git a/addons/ui/functions/fnc_setAdvancedElement.sqf b/addons/ui/functions/fnc_setAdvancedElement.sqf index 96453f1cfb..3771bf840b 100644 --- a/addons/ui/functions/fnc_setAdvancedElement.sqf +++ b/addons/ui/functions/fnc_setAdvancedElement.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Sets advanced visible element of the UI using displays and controls. @@ -33,9 +33,10 @@ _cachedElement params ["_idd", "_elements", "_location", "_conditions"]; // Exit if main vehicle type condition not fitting private _canUseWeaponOrInCargo = ACE_player call CBA_fnc_canUseWeapon || {-1 < vehicle ACE_player getCargoIndex ACE_player}; +private _inUAVCamera = !isNull getConnectedUAVUnit player; // explictly using player if ( - (_canUseWeaponOrInCargo && {_location == VEHICLE_ONLY}) - || {!_canUseWeaponOrInCargo && {_location == GROUND_ONLY}} + (_canUseWeaponOrInCargo && {!_inUAVCamera} && {_location == VEHICLE_ONLY}) + || {(!_canUseWeaponOrInCargo || {_inUAVCamera}) && {_location == GROUND_ONLY}} ) exitWith { TRACE_3("skip location",_this,_canUseWeaponOrInCargo,_location); false @@ -51,7 +52,7 @@ if ( }; _show = false; }; -} count _conditions; +} forEach _conditions; // Get setting from scripted API if (!_force) then { @@ -85,8 +86,7 @@ private _success = false; _control ctrlSetFade _fade; _control ctrlCommit 0; - } count _displays; - nil -} count _elements; + } forEach _displays; +} forEach _elements; _success diff --git a/addons/ui/functions/fnc_setElementVisibility.sqf b/addons/ui/functions/fnc_setElementVisibility.sqf index f6c4525828..89b8684af7 100644 --- a/addons/ui/functions/fnc_setElementVisibility.sqf +++ b/addons/ui/functions/fnc_setElementVisibility.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Setter for toggling advanced element visibility. diff --git a/addons/ui/functions/fnc_setElements.sqf b/addons/ui/functions/fnc_setElements.sqf index 8e7da0eb3d..1181957c38 100644 --- a/addons/ui/functions/fnc_setElements.sqf +++ b/addons/ui/functions/fnc_setElements.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Sets basic visible elements of the UI using showHUD setter. diff --git a/addons/ui/functions/script_component.hpp b/addons/ui/functions/script_component.hpp deleted file mode 100644 index 656228f742..0000000000 --- a/addons/ui/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\ui\script_component.hpp" diff --git a/addons/ui/initSettings.sqf b/addons/ui/initSettings.sqf index 55160a7888..dc701b91d5 100644 --- a/addons/ui/initSettings.sqf +++ b/addons/ui/initSettings.sqf @@ -294,7 +294,7 @@ if (productVersion select 4 == 'Development') then { QGVAR(enableSpeedIndicator), "CHECKBOX", [LSTRING(EnableSpeedIndicator), LSTRING(EnableSpeedIndicator_Description)], - "ACE " + LLSTRING(Category), + _category, true, true, { if (!_this) then { @@ -303,3 +303,16 @@ if (productVersion select 4 == 'Development') then { }; } ] call CBA_fnc_addSetting; + +[ + QGVAR(hideDefaultActionIcon), + "CHECKBOX", + [LSTRING(HideDefaultActionIcon), LSTRING(HideDefaultActionIcon_Description)], + _category, + false, + 2, { + profileNamespace setVariable [QGVAR(hideDefaultActionIcon), [nil, 0] select _this]; + saveProfileNamespace; + }, + true // needs restart +] call CBA_fnc_addSetting; diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml index f27926dc7a..b25d1fa1f4 100644 --- a/addons/ui/stringtable.xml +++ b/addons/ui/stringtable.xml @@ -12,7 +12,7 @@ Benutzeroberfläche 사용자 인터페이스 Interfaccia Utente - 使用者介面 + 用户界面 使用者介面 Interfaz de usuario Kullanıcı Arayüzü @@ -28,7 +28,7 @@ Benutzeroberfläche 사용자 인터페이스 Interfaccia Utente - 使用者介面 + 用户界面 使用者介面 Interfaz de usuario Kullanıcı Arayüzü @@ -41,9 +41,9 @@ モジュールではユーザ インタフェイスの一部表示を切り替えできます。 Moduł ten pozwala zmienić stan widoczności poszczególnych elementów UI. Dieses Modul erlaubt es, Teile der Benutzeroberfläche (UI) an- oder auszuschalten. - 이 모듈은 사용자 인터페이스의 부분을 토글하는것을 가능케 해줍니다. + 이 모듈은 사용자 인터페이스의 부분을 토글하는 것을 가능케 해줍니다. 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í. Este módulo permite activar la visibilidad de apartados de la interfaz @@ -53,13 +53,13 @@ Povolit selektivní UI Permitir IU Selecionável Autoriser la personnalisation de l'IU - Включить настраиваемый интерфейс + Вкл. настраиваемый интерфейс UI 選択性を許可 Zezwól na selektywne UI Erlaube selektives UI 선택적 사용자 인터페이스 허가 Permette l'UI Selettiva - 允许调整使用者介面 + 允许调整用户界面 允許調整使用者介面 Permitir IU selectiva @@ -72,9 +72,9 @@ クライアントがユーザ インタフェイスを編集できるようにします。 Zezwól klientowi na modyfikację UI. Erlaube Clients, ihr UI zu modifizieren. - 클라이언트가 선택적 사용자 인터페이스 사용하는것을 허가합니다 + 클라이언트가 자신의 사용자 인터페이스를 사용하는 것을 허가합니다 Permette al client di modificare la propria UI. - 允许客户端自行调整使用者介面 + 允许客户端自行调整用户界面 允許客戶端自行調整使用者介面 Permitir al cliente modificar su interfaz. @@ -83,13 +83,13 @@ Informace o Vojákovi/Vozidlu/Zbrani Informação de Soldado/Veículo/Armamento Information soldat/véhicule/arme - Информация о Солдате/Технике/Оружии + Информация о солдате/технике/оружии 兵士/車両/武器の情報 Informacje o żołnierzu/pojeździe/broni Soldat/Fahrzeug/Waffe Information 병사/차량/무기 정보 Informazioni Soldato/Veicolo/Arma - 士兵/载具/武器资讯栏 + 士兵/载具/武器信息栏 士兵/載具/武器資訊欄 Información de soldado / vehículo / arma @@ -120,7 +120,7 @@ Fahrzeugkompass 차량 나침반 Bussola Veicolo - 载具指北针 + 载具指南针 載具指北針 Brújula del vehículo Araç Pusulası @@ -136,7 +136,7 @@ Kommandomenü 지휘 메뉴 Menù di Comando - 指挥选单 + 指挥菜单 指揮選單 Menú de Comando Komut Menüsü @@ -164,6 +164,9 @@ Filigrane version de développement Znak wodny wersji deweloperskiej 開発版ウォーターマーク + Wasserzeichen für Entwicklungsversion + 开发建设水印 + 개발용 빌드 워터마크 Weapon Name @@ -312,13 +315,13 @@ Weapon Lower Info Background Informações na parte de baixo do fundo do Armamento Fond pour la barre d'informations inférieure de l'arme - Фон ниформации об оружии снизу + Фон информации об оружии снизу 武器名の背景表示 (下側) Tło dolnej części informacji o broni Hintergrund der unteren Waffen-Info-Leiste 무기 상세 정보 배경 Informazioni Sfondo Arma Bassa - 武器底部资讯栏背景 + 武器底部信息栏背景 武器底部資訊欄背景 Fondo de información inferior de arma Nižší pozadí panulu s informacemi o zbrani @@ -348,7 +351,7 @@ 体力バー Pasek staminy Ausdaueranzeige - 체력 막대 + 지구력 막대 Barra Stamina 体力栏 體力欄 @@ -469,7 +472,7 @@ Gunner Launchable Count Quantidade de Arremessável do fuzileiro Nombre d'objets lançables (tireur) - Количество снарядов пусковой установки наводчика + Кол-во снарядов ПУ наводчика 射手用のランチャー弾薬数 Ilość rakiet strzelca Richtschütze Raketenanzahl @@ -499,13 +502,13 @@ Gunner Weapon Lower Info Background Informações na parte de baixo do fundo do Armamento do fuzileiro Fond pour la barre d'informations inférieure (tireur) - Фон ниформации об орудии наводчика снизу + Фон информации об орудии наводчика снизу 射手用の武器名の背景表示 (下側) Tło dolnej części informacji o broni strzelca Hintergrund der unteren Waffen-Info-Leiste (Richtschütze) 사수 무기 상세 정보 배경 Informazioni Sfondo Arma Artigliere Bassa - 炮手武器底部资讯栏背景 + 炮手武器底部信息栏背景 砲手武器底部資訊欄背景 Nižší pozadí panelu s informacemi o zbrani vozidla Fondo de información inferior de armamento de artillero @@ -616,7 +619,7 @@ Fahrzeug Info Hintergrund 차량 정보 배경 Informazioni Sfondo Veicolo - 载具资讯栏背景 + 载具信息栏背景 載具資訊欄背景 Fondo de información del vehículo @@ -625,13 +628,13 @@ Vyžaduje informace o Vojákovi/Vozidlu/Zbrani Requer informações de Soldado/Veículo/Armamento Requiert l'option "Information soldat/véhicule/arme". - Требуется Информация о Солдате/Технике/Оружии. + Требуется информация о солдате/технике/оружии. 兵士/車両/武器の情報を必要とします。 Wymaga informacji o żołnierzu/pojeździe/broni. Benötigt Soldat/Fahrzeug/Waffe Information. 병사/차량/무기의 정보가 필요합니다. Richiede informazione Soldato/Veicolo/Arma. - 需要士兵/载具/武器的资讯. + 需要士兵/载具/武器的信息。 需要士兵/載具/武器的資訊. Requiere información de Soldado/Vehículo. @@ -644,9 +647,9 @@ ユーザ インタフェイスの変更は無効化されています。 Modyfikacja interfejsu użytkownika jest wyłączona. Die Modifizierung des UI ist deaktiviert. - 사용자 인터페이스 변경이 비활성화 되어있습니다. + 사용자 인터페이스 변경이 비활성화 되어 있습니다. La modifica dell'Interfaccia Utente è disabilitata. - 自定使用者介面功能已关闭 + 自定用户界面功能已关闭 自定使用者介面功能已關閉 La modificación de la interfaz de usuario está desactivada. @@ -660,7 +663,7 @@ Gesperrte UI-Elemente können nicht modifiziert werden. 강제 사용자 인터페이스는 변경하실 수 없습니다. Impossibile modificare un elemento forzato d' Interfaccia Utente. - 无法编辑已被锁定的使用者介面元件 + 无法编辑已被锁定的用户界面控件 無法編輯已被鎖定的使用者介面元件 Nelze upravit prvek vynuceného uživatelského rozhraní. No se puede modificar un elemento forzado de la Interfaz del Usuario @@ -669,11 +672,43 @@ Enable movement speed indicator Włącz wskaźnik prędkości poruszania 移動速度インジケータを有効化 + Indicateur de vitesse de déplacement + Вкл. индикатор скорости передвижения + Aktiviere Bewegungsgeschwindigkeits-Indikator + 启用移动速度指示器 + 이동 속도 표시기 활성화 + Habilitar indicador de velocidad de movimiento Enables movement speed indicator for player character. Włącza wskaźnik prędkości poruszania się dla postaci gracza. プレイヤー キャラの移動速度を表示します。 + Affiche un indicateur permettant de visualiser la vitesse de déplacement du personnage. + Включает индикатор скорости передвижения персонажа игрока. + Aktiviere den Bewegungsgeschwindigkeits-Indikator des Spielers. + 为玩家角色启用移动速度指示器。 + 플레이어 캐릭터를 위한 이동속도 표시기를 활성화합니다. + Habilita el indicador de velocidad de movimiento para el personaje del jugador. + + + Hide Default Action Icon + デフォルトのアクションアイコンを非表示 + Ukryj domyślną ikonę akcji + 기본 행동 아이콘 숨기기 + 隐藏默认动作标识 + Спрятать иконку действия по умолчанию + Ocultar el icono de acción por defecto + Standardaktionssymbol ausblenden + + + Hides the icon shown automatically when something is in front of the cursor. Requires a game restart.\nWarning: Does not remove the action itself! It is advisable to unbind 'Use default action' key to prevent unwanted interactions. + カーソルの前に何かがあるときに自動的に表示されるアイコンを非表示にします。 ゲームを再起動する必要があります。\n警告:アクション自体は削除されません! 誤って実行することを防ぐために、'標準アクション'キーのバインドを解除することをお勧めします。 + Ukrywa ikonę wyświetlaną automatycznie, gdy coś znajduje się przed kursorem. Wymaga ponownego uruchomienia gry.\nOstrzeżenie: Nie usuwa samej akcji! Zaleca się usunięcia przypisania klawisza „Użyj domyślnej akcji”, aby zapobiec niechcianym interakcjom. + 커서 앞에 무언가가 있을 때 자동으로 표시되는 아이콘을 숨깁니다. 게임을 재시작해야 합니다\n경고: 작업 자체를 제거하지 않습니다! 원하지 않는 상호작용을 방지하려면 '기본 행동' 키를 삭제하는 것이 좋습니다. + 隐藏屏幕面前有物体时自动显示的动作标识。需要重新启动游戏。\n警告:不会删除动作本身!建议同时取消对“使用默认动作”键的绑定,以防止不必要的互动。 + Прячет иконку, которая показывается автоматически когда что-то находиться перед курсором. Требует рестарта игры.\nВнимание: не убирает само действие! Рекомендуется убрать комбинацию клавиш с настройки "Выполнить действие по умолчанию" чтобы предостеречься от нежеланных действий. + Oculta el icono que se muestra automáticamente cuando algo se sitúa enfrente del cursor. Requiere reinicio del juego.\nAdvertencia: No elimina la propia acción! Es recomendable desactivar la tecla "Usar acción por defecto" para prevenir interacciones no deseadas. + Blendet das Symbol aus, das automatisch angezeigt wird, wenn sich etwas vor dem Cursor befindet. Erfordert einen Neustart des Spiels.\nWarnung: Die Aktion selbst wird nicht entfernt! Es empfiehlt sich, die Belegung der Taste 'Standardaktion verwenden' aufzuheben, um unerwünschte Interaktionen zu verhindern. diff --git a/addons/vector/CfgWeapons.hpp b/addons/vector/CfgWeapons.hpp index 5ffe99eea9..f1a8db5482 100644 --- a/addons/vector/CfgWeapons.hpp +++ b/addons/vector/CfgWeapons.hpp @@ -7,8 +7,8 @@ class CfgWeapons { model = QPATHTOF(ace_vector.p3d); picture = QPATHTOF(UI\ace_vector_x_ca.paa); visionMode[] = {"Normal","NVG"}; - opticsZoomMax = 0.25/7; - opticsZoomMin = 0.25/7; + opticsZoomMax = "0.25/7"; + opticsZoomMin = "0.25/7"; modelOptics = "\A3\Weapons_F\empty.p3d"; class CBA_ScriptedOptic { @@ -19,6 +19,7 @@ class CfgWeapons { reticleSafezoneSize = 1; hidePeripheralVision = 1; opticsPPEffects[] = {QGVAR(OpticsRadBlur1)}; + disableTilt = 1; }; weaponInfoType = "ACE_RscOptics_vector"; }; diff --git a/addons/vector/functions/fnc_adjustBrightness.sqf b/addons/vector/functions/fnc_adjustBrightness.sqf index 8fa17aae09..e8ece20637 100644 --- a/addons/vector/functions/fnc_adjustBrightness.sqf +++ b/addons/vector/functions/fnc_adjustBrightness.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_clearDisplay.sqf b/addons/vector/functions/fnc_clearDisplay.sqf index 1f723dd2f8..8b27b17ab6 100644 --- a/addons/vector/functions/fnc_clearDisplay.sqf +++ b/addons/vector/functions/fnc_clearDisplay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Clears the vectors control items. diff --git a/addons/vector/functions/fnc_convertToTexturesDegree.sqf b/addons/vector/functions/fnc_convertToTexturesDegree.sqf index 17754244f1..559c79d5bd 100644 --- a/addons/vector/functions/fnc_convertToTexturesDegree.sqf +++ b/addons/vector/functions/fnc_convertToTexturesDegree.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * converts azimuth into array of textures for the vectors scripted info control diff --git a/addons/vector/functions/fnc_convertToTexturesDistance.sqf b/addons/vector/functions/fnc_convertToTexturesDistance.sqf index cb2f1ba990..91bbcfd606 100644 --- a/addons/vector/functions/fnc_convertToTexturesDistance.sqf +++ b/addons/vector/functions/fnc_convertToTexturesDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * converts rangefinder distance into array of textures for the vectors scripted info control diff --git a/addons/vector/functions/fnc_convertToTexturesFOS.sqf b/addons/vector/functions/fnc_convertToTexturesFOS.sqf index eb9e6f840c..5b831f080e 100644 --- a/addons/vector/functions/fnc_convertToTexturesFOS.sqf +++ b/addons/vector/functions/fnc_convertToTexturesFOS.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * converts rangefinder distance into array of textures for the vectors scripted info control diff --git a/addons/vector/functions/fnc_dataTransfer.sqf b/addons/vector/functions/fnc_dataTransfer.sqf index b50a823be9..5dbdf5c2ff 100644 --- a/addons/vector/functions/fnc_dataTransfer.sqf +++ b/addons/vector/functions/fnc_dataTransfer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Data transfer over a connected cable. Based on page 14 of pdf. diff --git a/addons/vector/functions/fnc_getDirection.sqf b/addons/vector/functions/fnc_getDirection.sqf index 1103a55458..554b8954ba 100644 --- a/addons/vector/functions/fnc_getDirection.sqf +++ b/addons/vector/functions/fnc_getDirection.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_getDistance.sqf b/addons/vector/functions/fnc_getDistance.sqf index 8c38cc619f..dbe8f70818 100644 --- a/addons/vector/functions/fnc_getDistance.sqf +++ b/addons/vector/functions/fnc_getDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_getFallOfShot.sqf b/addons/vector/functions/fnc_getFallOfShot.sqf index 7fbaa6ad98..5de2db1ef4 100644 --- a/addons/vector/functions/fnc_getFallOfShot.sqf +++ b/addons/vector/functions/fnc_getFallOfShot.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_getHeightDistance.sqf b/addons/vector/functions/fnc_getHeightDistance.sqf index 00bd888cdf..89c7bc36ef 100644 --- a/addons/vector/functions/fnc_getHeightDistance.sqf +++ b/addons/vector/functions/fnc_getHeightDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_getRelativeAzimuthDistance.sqf b/addons/vector/functions/fnc_getRelativeAzimuthDistance.sqf index 33d9a07dc0..e572ad1056 100644 --- a/addons/vector/functions/fnc_getRelativeAzimuthDistance.sqf +++ b/addons/vector/functions/fnc_getRelativeAzimuthDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_getRelativeDistance.sqf b/addons/vector/functions/fnc_getRelativeDistance.sqf index bbe9ca1672..b5751bfd1f 100644 --- a/addons/vector/functions/fnc_getRelativeDistance.sqf +++ b/addons/vector/functions/fnc_getRelativeDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_getRelativeHeightLength.sqf b/addons/vector/functions/fnc_getRelativeHeightLength.sqf index 1049ba84b6..a9f7a2e363 100644 --- a/addons/vector/functions/fnc_getRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_getRelativeHeightLength.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_illuminate.sqf b/addons/vector/functions/fnc_illuminate.sqf index 0c91da0ac0..10811b3e79 100644 --- a/addons/vector/functions/fnc_illuminate.sqf +++ b/addons/vector/functions/fnc_illuminate.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_nextMode.sqf b/addons/vector/functions/fnc_nextMode.sqf index cd00b4977d..f55bbe765b 100644 --- a/addons/vector/functions/fnc_nextMode.sqf +++ b/addons/vector/functions/fnc_nextMode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_onKeyDown.sqf b/addons/vector/functions/fnc_onKeyDown.sqf index a9c6b90b2d..24a22a5782 100644 --- a/addons/vector/functions/fnc_onKeyDown.sqf +++ b/addons/vector/functions/fnc_onKeyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles pressing the special vector keys. diff --git a/addons/vector/functions/fnc_onKeyHold.sqf b/addons/vector/functions/fnc_onKeyHold.sqf index cefdc3236b..60a38ba96d 100644 --- a/addons/vector/functions/fnc_onKeyHold.sqf +++ b/addons/vector/functions/fnc_onKeyHold.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * PFH executed while holding a vector key down. diff --git a/addons/vector/functions/fnc_onKeyUp.sqf b/addons/vector/functions/fnc_onKeyUp.sqf index 2e315d7c0e..11310eb5cf 100644 --- a/addons/vector/functions/fnc_onKeyUp.sqf +++ b/addons/vector/functions/fnc_onKeyUp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Handles releasing the special vector keys. diff --git a/addons/vector/functions/fnc_showAzimuth.sqf b/addons/vector/functions/fnc_showAzimuth.sqf index e07f093b5d..4b84d5d1e4 100644 --- a/addons/vector/functions/fnc_showAzimuth.sqf +++ b/addons/vector/functions/fnc_showAzimuth.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showAzimuthInclination.sqf b/addons/vector/functions/fnc_showAzimuthInclination.sqf index e7769a3e7b..fdff0ef44a 100644 --- a/addons/vector/functions/fnc_showAzimuthInclination.sqf +++ b/addons/vector/functions/fnc_showAzimuthInclination.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showCenter.sqf b/addons/vector/functions/fnc_showCenter.sqf index d9e3542fac..78c7db3c5f 100644 --- a/addons/vector/functions/fnc_showCenter.sqf +++ b/addons/vector/functions/fnc_showCenter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Shows or hides the vectors center square thingy. diff --git a/addons/vector/functions/fnc_showDistance.sqf b/addons/vector/functions/fnc_showDistance.sqf index 3009d5ea5d..33fc583f46 100644 --- a/addons/vector/functions/fnc_showDistance.sqf +++ b/addons/vector/functions/fnc_showDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showFallOfShot.sqf b/addons/vector/functions/fnc_showFallOfShot.sqf index ac03fc6bbf..46963052f8 100644 --- a/addons/vector/functions/fnc_showFallOfShot.sqf +++ b/addons/vector/functions/fnc_showFallOfShot.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showHeightDistance.sqf b/addons/vector/functions/fnc_showHeightDistance.sqf index ce4e3011a9..0439a77ed0 100644 --- a/addons/vector/functions/fnc_showHeightDistance.sqf +++ b/addons/vector/functions/fnc_showHeightDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showP1.sqf b/addons/vector/functions/fnc_showP1.sqf index 4cb25adfaa..e592e02488 100644 --- a/addons/vector/functions/fnc_showP1.sqf +++ b/addons/vector/functions/fnc_showP1.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Shows or hides the 1-P text line. diff --git a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf index 74365cc6c7..adefac8d71 100644 --- a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showRelativeDistance.sqf b/addons/vector/functions/fnc_showRelativeDistance.sqf index b8ddd9f04f..02bca2e480 100644 --- a/addons/vector/functions/fnc_showRelativeDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showRelativeHeightLength.sqf b/addons/vector/functions/fnc_showRelativeHeightLength.sqf index 1fb9ddcb2f..95e9d4f6bb 100644 --- a/addons/vector/functions/fnc_showRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_showRelativeHeightLength.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/fnc_showReticle.sqf b/addons/vector/functions/fnc_showReticle.sqf index fabf3cad15..6f5bd4c551 100644 --- a/addons/vector/functions/fnc_showReticle.sqf +++ b/addons/vector/functions/fnc_showReticle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Shows or hides the electronic reticle. diff --git a/addons/vector/functions/fnc_showText.sqf b/addons/vector/functions/fnc_showText.sqf index 23f4481082..21c12e8475 100644 --- a/addons/vector/functions/fnc_showText.sqf +++ b/addons/vector/functions/fnc_showText.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * diff --git a/addons/vector/functions/script_component.hpp b/addons/vector/functions/script_component.hpp deleted file mode 100644 index d4007d8aa4..0000000000 --- a/addons/vector/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\vector\script_component.hpp" \ No newline at end of file diff --git a/addons/vector/stringtable.xml b/addons/vector/stringtable.xml index 765722f585..a3451971e7 100644 --- a/addons/vector/stringtable.xml +++ b/addons/vector/stringtable.xml @@ -13,7 +13,7 @@ Vector 21 Nite Vector 21 Nite ベクター 21 ナイト - Vector 21 Nite + 벡터 21 야간투시 Vector 21 Nite Vector 21 Nite Vector 21 Nite @@ -30,7 +30,7 @@ Vector 21 Vector 21 ベクター 21 - Vector 21 + 벡터 21 Vector 21 Vector 21 Vector 21 @@ -64,8 +64,8 @@ Vector - Irányszög gomb Vector – Азимут ベクター - 方位角キー - Vector - 방위각 키 - Vector - 方位按键 + 벡터 - 방위각 키 + Vector—方位按键 Vector - 方位按鍵 Vector - Azimuth Tuşu @@ -81,8 +81,8 @@ Vector - Távolság gomb Vector – Расстояние ベクター - 距離キー - Vector - 거리 키 - Vector - 距离按键 + 벡터 - 거리 키 + Vector—距离按键 Vector - 距離按鍵 Vector - Mesafe Tuşu diff --git a/addons/vehicle_damage/CfgAmmo.hpp b/addons/vehicle_damage/CfgAmmo.hpp index 195d059c2a..23f582a814 100644 --- a/addons/vehicle_damage/CfgAmmo.hpp +++ b/addons/vehicle_damage/CfgAmmo.hpp @@ -10,7 +10,7 @@ class CfgAmmo { class BombCore; class DirectionalBombCore; class PipeBombCore; - + class B_30mm_HE; class GrenadeHand; class R_PG32V_F; @@ -20,9 +20,9 @@ class CfgAmmo { class M_SPG9_HEAT; class R_MRAAWS_HEAT_F; class B_338_Ball; - + class ACE_G_40mm_HE; - + CREATE_INCENDIARY_AMMO(BulletBase, BulletCore, 0.1); CREATE_INCENDIARY_AMMO(ShellBase, ShellCore, 1.0); CREATE_INCENDIARY_AMMO(ammo_Penetrator_Base, ShellBase, 1.0); @@ -40,7 +40,7 @@ class CfgAmmo { CREATE_INCENDIARY_AMMO(ammo_Gun30mmAABase, BulletBase, 0.7); CREATE_INCENDIARY_AMMO(ammo_Gun35mmAABase, BulletBase, 0.7); CREATE_INCENDIARY_AMMO(ammo_Missile_CannonLaunchedBase, MissileBase, 1.0); - + CREATE_INCENDIARY_AMMO(B_127x99_Ball, BulletBase, 0.2); CREATE_INCENDIARY_AMMO(B_127x99_SLAP, B_127x99_Ball, 0.8); CREATE_INCENDIARY_AMMO(B_127x108_Ball, BulletBase, 0.3); @@ -62,50 +62,50 @@ class CfgAmmo { CREATE_INCENDIARY_AMMO(ammo_Penetrator_120mm, ammo_Penetrator_Base, 1.0); CREATE_INCENDIARY_AMMO(ammo_Penetrator_Rocket_03_AP, ammo_Penetrator_Base, 0.7); CREATE_INCENDIARY_AMMO(ammo_Penetrator_Rocket_04_AP, ammo_Penetrator_Base, 0.7); - + CREATE_INCENDIARY_AMMO(Sh_120mm_HE, ShellBase, 0.4); CREATE_INCENDIARY_AMMO(Sh_120mm_APFSDS, ShellBase, 0.1); CREATE_INCENDIARY_AMMO(Sh_120mm_HEAT_MP, ShellBase, 0.8); CREATE_INCENDIARY_AMMO(Sh_155mm_AMOS, ShellBase, 0.4); CREATE_INCENDIARY_AMMO(Sh_82mm_AMOS, Sh_155mm_AMOS, 0.1); - + CREATE_INCENDIARY_AMMO(Bo_Mk82, BombCore, 0.8); CREATE_INCENDIARY_AMMO(R_TBG32V_F, R_PG32V_F, 0.2); - + CREATE_INCENDIARY_AMMO(R_80mm_HE, RocketBase, 0.2); CREATE_INCENDIARY_AMMO(R_60mm_HE, R_80mm_HE, 0.1); - + CREATE_INCENDIARY_AMMO(R_230mm_HE, SubmunitionBase, 0.9); CREATE_INCENDIARY_AMMO(R_230mm_fly, ShellBase, 0.9); - + CREATE_INCENDIARY_AMMO(G_40mm_HE, GrenadeBase, 0.1); CREATE_INCENDIARY_AMMO(G_20mm_HE, G_40mm_HE, 0.3); CREATE_INCENDIARY_AMMO(G_40mm_HEDP, G_40mm_HE, 0.8); - + CREATE_INCENDIARY_AMMO(Mo_cluster_AP, ShellBase, 0.9); CREATE_INCENDIARY_AMMO(M_Titan_AT, MissileBase, 1.0); CREATE_INCENDIARY_AMMO(M_Titan_AP, M_Titan_AT, 0.3); - + CREATE_INCENDIARY_AMMO(Sh_125mm_APFSDS, Sh_120mm_APFSDS, 0.15); CREATE_INCENDIARY_AMMO(Sh_125mm_HEAT, Sh_125mm_HE, 1.0); - + CREATE_INCENDIARY_AMMO(Gatling_30mm_HE_Plane_CAS_01_F, BulletBase, 0.6); - + CREATE_INCENDIARY_AMMO(Missile_AGM_02_F, MissileBase, 1.0); CREATE_INCENDIARY_AMMO(M_Mo_82mm_AT, MissileBase, 1.0); CREATE_INCENDIARY_AMMO(Rocket_04_HE_F, MissileBase, 0.4); CREATE_INCENDIARY_AMMO(Rocket_04_AP_F, Rocket_04_HE_F, 0.1); - + CREATE_INCENDIARY_AMMO(Sh_105mm_HEAT_MP, Sh_125mm_HEAT, 0.8); - + CREATE_INCENDIARY_AMMO(APERSTripMine_Wire_Ammo, DirectionalBombBase, 0.0); - + CREATE_INCENDIARY_AMMO(B_127x54_Ball, BulletBase, 0.8); CREATE_INCENDIARY_AMMO(B_93x64_Ball, BulletBase, 0.5); - + CREATE_INCENDIARY_AMMO(M_Vorona_HE, M_Vorona_HEAT, 0.2); CREATE_INCENDIARY_AMMO(M_SPG9_HE, M_SPG9_HEAT, 0.2); CREATE_INCENDIARY_AMMO(R_MRAAWS_HE_F, R_MRAAWS_HEAT_F, 0.4); - + CREATE_INCENDIARY_AMMO(B_20mm_AP, BulletBase, 0.2); }; diff --git a/addons/vehicle_damage/CfgVehicles.hpp b/addons/vehicle_damage/CfgVehicles.hpp index b34f793e0f..9ea47711ea 100644 --- a/addons/vehicle_damage/CfgVehicles.hpp +++ b/addons/vehicle_damage/CfgVehicles.hpp @@ -16,7 +16,7 @@ class CfgVehicles { model = "\A3\Structures_F\Wrecks\Wreck_T72_turret_F.p3d"; icon = "\A3\armor_f_gamma\MBT_02\Data\UI\map_MBT_02_ca.paa"; }; - + class Tank; class Car_F; class Tank_F: Tank { @@ -148,13 +148,13 @@ class CfgVehicles { "HitERA_Top_Front", "HitERA_Top_Left", "HitERA_Top_Right" }; }; - + class O_MBT_02_base_F; class O_MBT_02_cannon_F: O_MBT_02_base_F { GVAR(turret)[] = { QGVAR(Turret_MBT_02), {0, -1, 0} }; GVAR(canHaveFireRing) = 1; }; - + class APC_Tracked_02_base_F: Tank_F { GVAR(hullDetonationProb) = 0; GVAR(turretDetonationProb) = 0; @@ -227,7 +227,7 @@ class CfgVehicles { GVAR(engineFireProb) = 0.7; GVAR(detonationDuringFireProb) = 0.9; GVAR(slatHitpoints)[] = { - "HitSLAT_Left_1", "HitSLAT_Left_2", "HitSLAT_Left_3", + "HitSLAT_Left_1", "HitSLAT_Left_2", "HitSLAT_Left_3", "HitSLAT_Right_1", "HitSLAT_Right_2", "HitSLAT_Right_3", "HitSLAT_back", "HitSLAT_front" @@ -267,7 +267,7 @@ class CfgVehicles { GVAR(engineFireProb) = 0.7; GVAR(detonationDuringFireProb) = 0.5; GVAR(slatHitpoints)[] = { - "HitSLAT_Left_1", "HitSLAT_Left_2", "HitSLAT_Left_3", + "HitSLAT_Left_1", "HitSLAT_Left_2", "HitSLAT_Left_3", "HitSLAT_Right_1", "HitSLAT_Right_2", "HitSLAT_Right_3", "HitSLAT_back", "HitSLAT_front" @@ -282,7 +282,7 @@ class CfgVehicles { GVAR(engineFireProb) = 0.5; GVAR(detonationDuringFireProb) = 0.7; GVAR(slatHitpoints)[] = { - "HitSLAT_Left", "HitSLAT_Right", "HitSLAT_back", + "HitSLAT_Left", "HitSLAT_Right", "HitSLAT_back", "HitSLAT_top_left", "HitSLAT_top_right", "HitSLAT_top_back" }; GVAR(canHaveFireRing) = 1; diff --git a/addons/vehicle_damage/XEH_postInit.sqf b/addons/vehicle_damage/XEH_postInit.sqf index 88b29928e0..ce563302e3 100644 --- a/addons/vehicle_damage/XEH_postInit.sqf +++ b/addons/vehicle_damage/XEH_postInit.sqf @@ -24,7 +24,7 @@ ["Tank", "init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler; ["Wheeled_APC_F", "init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler; - + if (GVAR(enableCarDamage)) then { ["Car", "init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler; }; @@ -45,10 +45,8 @@ params ["_vehicle", "_turret"]; { - if (_vehicle in curatorEditableObjects _x) then { - _x addCuratorEditableObjects [[_turret], false]; - }; - } forEach allCurators; + _x addCuratorEditableObjects [[_turret], false]; + } forEach (objectCurators _vehicle); }] call CBA_fnc_addEventHandler; }; }; diff --git a/addons/vehicle_damage/config.cpp b/addons/vehicle_damage/config.cpp index 4b1c790681..6b4f7cf685 100644 --- a/addons/vehicle_damage/config.cpp +++ b/addons/vehicle_damage/config.cpp @@ -9,7 +9,7 @@ class CfgPatches { // ammo/vehicle config defines touch all of these requiredAddons[] = { "ace_common", "ace_cookoff" }; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/vehicle_damage/functions/fnc_abandon.sqf b/addons/vehicle_damage/functions/fnc_abandon.sqf index 6740cf2476..6a9d4eeb29 100644 --- a/addons/vehicle_damage/functions/fnc_abandon.sqf +++ b/addons/vehicle_damage/functions/fnc_abandon.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Forces the AI currently in a vehicle to bail out. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_addDamage.sqf b/addons/vehicle_damage/functions/fnc_addDamage.sqf index 4cc6726953..83081309a2 100644 --- a/addons/vehicle_damage/functions/fnc_addDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_addDamage.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Sets vehicle damage based on HitIndex. Failing that it falls back to HitPoint name. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf index 39a101d3b8..ffd64cc77f 100644 --- a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf +++ b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Adds the event handler to a vehicle. * * Arguments: @@ -20,12 +20,12 @@ TRACE_2("addEventHandler",_vehicle,GVAR(enabled)); if !(GVAR(enabled)) exitWith { #ifdef DEBUG_MODE_FULL - [{ ["Warning: Vehicle Damage not enabled...", 2] call CBA_fnc_notify; }, [], 5] call CBA_fnc_waitAndExecute; + [{ ["Warning: Vehicle Damage not enabled...", 2] call CBA_fnc_notify; }, [], 5] call CBA_fnc_waitAndExecute; #endif }; private _hitpointHash = [[], nil] call CBA_fnc_hashCreate; -private _vehicleConfig = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _vehicleConfig = configOf _vehicle; private _hitpointsConfig = _vehicleConfig >> "HitPoints"; private _turretConfig = _vehicleConfig >> "Turrets"; private _eraHitpoints = [_vehicleConfig >> QGVAR(eraHitpoints), "ARRAY", []] call CBA_fnc_getConfigEntry; @@ -51,7 +51,7 @@ private _iterateThroughConfig = { private _isEra = _configName in _eraHitpoints; private _isSlat = _configName in _slatHitpoints; private _isMisc = false; - + // prevent incompatibilites with old mods if ((toLower _configName) isEqualTo "hitturret") then { _isTurret = true; @@ -59,7 +59,7 @@ private _iterateThroughConfig = { if ((toLower _configName) isEqualTo "hitgun") then { _isGun = true; }; - + private _hash = _vehicle getVariable QGVAR(hitpointHash); { _x params ["_hitType", "_hitPoints"]; @@ -68,7 +68,7 @@ private _iterateThroughConfig = { _isMisc = true; }; } forEach _hitpointAliases; - + if (_isGun || _isTurret || _isEra || _isSlat || _isMisc) then { TRACE_6("found gun/turret/era/slat/misc",_isGun,_isTurret,_isEra,_isSlat,_isMisc,_hash); if (_isGun) then { diff --git a/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf b/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf index 8e8a0548eb..a036f0045b 100644 --- a/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf +++ b/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Blow off turret effect. diff --git a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf index f8dd6f5b7b..813e97a766 100644 --- a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf +++ b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Calculates whether or not hit penetrated given armour or not. Only enabled with advanced penetration simulation turned on. * * Arguments: @@ -26,13 +26,13 @@ _projectileData params ["_projectileType", "_projectileConfig"]; Perforation Calculation of APFSDS: Tungsten/Depleted Uranium: Rods P/Lw = a * (1 / tanh(b0 + b1 * (Lw/D))) * cos^m (theta) * sqrt (Pp / Pt) * e^((-(c0 + c1 * BHNT) * BHNT) / (Pp * Vt^2)) - + Steel Rods P/Lw = a * (1 / tanh(b0 + b1 * (Lw/D))) * cos^m (theta) * sqrt (Pp / Pt) * e^((-c * BHNT^k * BHNP^n) / (Pp * Vt^2)) - + Penetration Calculation of Tungsten APFSDS (Used for all penetrators): P/Lw = a * (1 / tanh(b0 + b1 * (Lw/D))) sqrt (Pp / Pt) * e^((-(c0 + c1 * BHNT) * BHNT) / (Pp * Vt^2)) - + where: Penetrator: D = Diameter of penetrator rod (always 22mm) @@ -42,33 +42,33 @@ _projectileData params ["_projectileType", "_projectileConfig"]; theta = NATO Obliquity angle of Penetration Pp = Penetrator Density in kg/m^3 BHNP = Brinell hardness number of penetrator - + Target: Pt = target density in kg/m^3 (always 7840kg/m^3) d = plate thickness in millimeters BHNT = Brinell hardness number of target (always 350) - + Material Data: Tungsten: Pp = 19300 BHNP = N/A - + a = 0.994 c0 = 134.5 c1 = -0.148 - + Depleted Uranium: Pp = 18600 BHNP = N/A - + a = 0.825 c0 = 90.0 c1 = -0.0849 - + Steel: Pp = 7850 BHNP = 500 - + a = 1.104 c = 9874 k = 0.3598 diff --git a/addons/vehicle_damage/functions/fnc_detonate.sqf b/addons/vehicle_damage/functions/fnc_detonate.sqf index f615c4cdb5..67d64da442 100644 --- a/addons/vehicle_damage/functions/fnc_detonate.sqf +++ b/addons/vehicle_damage/functions/fnc_detonate.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Detonates vehicle ammo and heavily wounds all inside. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleBail.sqf b/addons/vehicle_damage/functions/fnc_handleBail.sqf index e81c4cd76f..97aad2cd32 100644 --- a/addons/vehicle_damage/functions/fnc_handleBail.sqf +++ b/addons/vehicle_damage/functions/fnc_handleBail.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Handles whether or not the crew should bail. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf index 277c0a916e..a6e7335542 100644 --- a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf +++ b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Checks hitpoint damage and determines if a vehicle should cookoff. * * Arguments: @@ -9,7 +9,8 @@ * 2: Intensity of cookoff * 3: Person who instigated cookoff (default: objNull) * 4: Part of vehicle which got hit (default: "") - * 5: Whether or not the vehicle can spawn ring-fire effect (default: false) + * 5: Whether or not the vehicle can spawn ring-fire effect (default: false) + * 6: Can Jet (default: true) * * Return Value: * If cooked off @@ -20,30 +21,36 @@ * Public: No */ -params ["_vehicle", "_chanceOfFire", "_intensity", ["_injurer", objNull], ["_hitPart", ""], ["_canRing", false]]; +params ["_vehicle", "_chanceOfFire", "_intensity", ["_injurer", objNull], ["_hitPart", ""], ["_canRing", false], ["_canJet", true]]; private _alreadyCookingOff = _vehicle getVariable [QGVAR(cookingOff), false]; if (!_alreadyCookingOff && { _chanceOfFire >= random 1 }) exitWith { - private _fireDetonateChance = [configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(detonationDuringFireProb), "number", 0] call CBA_fnc_getConfigEntry; + private _configOf = configOf _vehicle; + private _fireDetonateChance = [_configOf >> QGVAR(detonationDuringFireProb), "number", 0] call CBA_fnc_getConfigEntry; if (_canRing) then { - _canRing = 1 isEqualTo ([configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(canHaveFireRing), "number", 0] call CBA_fnc_getConfigEntry); + _canRing = ([_configOf >> QGVAR(canHaveFireRing), "number", 0] call CBA_fnc_getConfigEntry) == 1; + }; + + if (_canJet) then { + _canJet = ([_configOf >> QEGVAR(cookoff,canHaveFireJet), "number", 1] call CBA_fnc_getConfigEntry) == 1; }; private _delayWithSmoke = _chanceOfFire < random 1; private _detonateAfterCookoff = (_fireDetonateChance / 4) > random 1; - + private _source = ""; if (toLower _hitPart isEqualTo "engine") then { _source = ["hit_engine_point", "HitPoints"]; }; - [QEGVAR(cookOff,cookOff), [_vehicle, _intensity, _injurer, _delayWithSmoke, _fireDetonateChance, _detonateAfterCookoff, _source, _canRing]] call CBA_fnc_localEvent; + // sending nil for _maxIntensity (9th param) to use default value in ace_cookoff_fnc_cookOff + [QEGVAR(cookOff,cookOff), [_vehicle, _intensity, _injurer, _delayWithSmoke, _fireDetonateChance, _detonateAfterCookoff, _source, _canRing, nil, _canJet]] call CBA_fnc_localEvent; _vehicle setVariable [QGVAR(cookingOff), true]; LOG_4("Cooking-off [%1] with a chance-of-fire [%2] - Delayed Smoke | Detonate after cookoff [%3 | %4]",_vehicle,_chanceOfFire,_delayWithSmoke,_detonateAfterCookoff); [_vehicle] spawn FUNC(abandon); LOG_1("[%1] is on fire is bailing",_vehicle); - + // cant setVehicleAmmo 0 here because it removes FFV unit's ammo if (GVAR(removeAmmoDuringCookoff)) then { private _ammo = [_vehicle] call EFUNC(cookoff,getVehicleAmmo); diff --git a/addons/vehicle_damage/functions/fnc_handleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleDamage.sqf index dd33fd2705..51bf1be97d 100644 --- a/addons/vehicle_damage/functions/fnc_handleDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDamage.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Called by "HandleDamage" event handler. Sets up hit array for this frame's damage. * * Arguments: @@ -22,7 +22,15 @@ * Public: No */ -params ["_vehicle", "", "_damage", "", "_projectile", "_hitIndex", "", "_hitPoint"]; +params ["_vehicle", "_hitSelection", "_damage", "", "_projectile", "_hitIndex", "", "_hitPoint"]; +TRACE_6("HandleDamage event inputs",_vehicle,_hitSelection,_damage,_projectile,_hitIndex,_hitPoint); + +private _returnHit = if (_hitSelection isNotEqualTo "") then { + _vehicle getHitIndex _hitIndex +} else { + damage _vehicle +}; + if !(_projectile in ["ace_ammoExplosion", "ACE_ammoExplosionLarge"]) then { if (local _vehicle) then { // set up hit array so we can execute all damage next frame. Always in order of hit done. @@ -42,19 +50,26 @@ if !(_projectile in ["ace_ammoExplosion", "ACE_ammoExplosionLarge"]) then { private _frameHash = _vehicle getVariable [QGVAR(hitHash), nil]; private _hitArray = [_frameHash, _processingFrame] call CBA_fnc_hashGet; if (_hitArray isEqualTo []) exitWith {}; - + reverse _hitArray; TRACE_3("processing data from old frame",diag_frameNo,_processingFrame,_hitArray); { _x params ["_vehicle", "_selection", "_damage", "_injurer", "_projectile", "_hitIndex", "", "_hitPoint"]; - private _newDamage = _damage - (_vehicle getHitIndex _hitIndex); - if !([_vehicle, _hitPoint, _hitIndex, _injurer, _vehicle getHitIndex _hitIndex, _newDamage, _projectile, _selection] call FUNC(handleVehicleDamage)) exitWith { + + private _returnHit = if (_selection isNotEqualTo "") then { + _vehicle getHitIndex _hitIndex + } else { + damage _vehicle + }; + + private _newDamage = _damage - _returnHit; + if !([_vehicle, _hitPoint, _hitIndex, _injurer, _returnHit, _newDamage, _projectile, _selection] call FUNC(handleVehicleDamage)) exitWith { LOG_2("cancelling rest of vehicle damage queue ( [%1] items left out of [%2] )",(count (_hitArray#1)) - _forEachIndex,count (_hitArray#1)) }; } forEach _hitArray; - + [_frameHash, _processingFrame] call CBA_fnc_hashRem; - + }, [_vehicle, diag_frameNo]] call CBA_fnc_execNextFrame; }; _currentFrameArray pushBack _this; @@ -67,7 +82,6 @@ if !(_projectile in ["ace_ammoExplosion", "ACE_ammoExplosionLarge"]) then { // damage is never to be handled in-engine. Always handle out of engine with this event handler // don't return 0 or else old parts will be reset in damage -private _returnHit = _vehicle getHitIndex _hitIndex; private _criticalDamageIndex = (CRITICAL_HITPOINTS findIf { _x isEqualTo _hitPoint }) + 1; if (_criticalDamageIndex > 0) then { _returnHit = (_returnHit min (CRITICAL_HITPOINTS select _criticalDamageIndex)); diff --git a/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf b/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf index 05fa73415e..7655a0f628 100644 --- a/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Ejects crew from destroyed vehicle. diff --git a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf index 9735746a06..9556cea424 100644 --- a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Checks hitpoint damage and determines if a vehicle should cookoff. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf index b17535f514..92d8d03ff4 100644 --- a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Process vehicle hit. * * Arguments: @@ -69,7 +69,7 @@ if (isNil "_multHit") then { private _withinTime = (CBA_missionTime <= (_multHit select 0) + CONST_TIME) && { _injurer == (_multHit select 1) }; if (_hitPointInOldArray && _withinTime) then { _ignoreHit = true; - } else { + } else { // If the hitpoint isnt in the old array then that means that the time expired and a new array should be generated if !(_hitPointInOldArray) then { private _oldHitPoints = _multHit select 2; diff --git a/addons/vehicle_damage/functions/fnc_injureOccupants.sqf b/addons/vehicle_damage/functions/fnc_injureOccupants.sqf index be08f583c8..172d00e77a 100644 --- a/addons/vehicle_damage/functions/fnc_injureOccupants.sqf +++ b/addons/vehicle_damage/functions/fnc_injureOccupants.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Injures occupants in a vehicle based on percent chance of injury. * * Arguments: @@ -53,7 +53,7 @@ private _injuryCount = 0; _indexToInjure = _forEachIndex; }; } forEach _crewInjuryIndices; - + if (_indexToInjure >= 0) then { private _casualty = _vehicleCrew select (_crewInjuryIndices select _indexToInjure); if (alive _casualty) then { @@ -61,7 +61,7 @@ private _injuryCount = 0; private _indexCount = count _crewInjuryIndices; if (_indexCount >= 0) then { _crewInjuryIndices deleteAt _indexToInjure; - + // arbitrary percentages private _injuredBodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] selectRandomWeighted [0.3, 0.8, 0.5, 0.5, 0.3, 0.3]; private _currentUnitDamage = _casualty getHitpointDamage _injuredBodyPart; @@ -71,6 +71,6 @@ private _injuryCount = 0; }; }; }; - + if (_injuryCount >= _count) exitWith {}; } forEach _vehicleCrew; diff --git a/addons/vehicle_damage/functions/fnc_knockOut.sqf b/addons/vehicle_damage/functions/fnc_knockOut.sqf index 6e554d8edd..5c8d1697a6 100644 --- a/addons/vehicle_damage/functions/fnc_knockOut.sqf +++ b/addons/vehicle_damage/functions/fnc_knockOut.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Knock out vehicle from battle. Destroy all internal hitpoints. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_processHit.sqf b/addons/vehicle_damage/functions/fnc_processHit.sqf index 9f0c6560a7..3699fc1f5d 100644 --- a/addons/vehicle_damage/functions/fnc_processHit.sqf +++ b/addons/vehicle_damage/functions/fnc_processHit.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Process hit by projectile against vehicle and apply appropiate damage to part. * * Arguments: @@ -146,7 +146,7 @@ private _chanceOfDetonation = 0; private _explosiveAmmoCount = 0; private _nonExplosiveAmmoCount = 0; -if !(count (_currentVehicleAmmo select 0) isEqualTo 0) then { +if (count (_currentVehicleAmmo select 0) isNotEqualTo 0) then { private _magConfig = configFile >> "CfgMagazines"; private _ammoConfig = configFile >> "CfgAmmo"; private _countOfExplodableAmmo = 0; @@ -155,7 +155,7 @@ if !(count (_currentVehicleAmmo select 0) isEqualTo 0) then { private _initialAmmoCount = getNumber (_magConfig >> _magazineClassname >> "count"); _chanceOfDetonation = _chanceOfDetonation + (_currentAmmoCount / _initialAmmoCount); _countOfExplodableAmmo = _countOfExplodableAmmo + 1; - + private _ammoClassname = getText (_magConfig >> _magazineClassname >> "ammo"); private _explosive = getNumber (_ammoConfig >> _ammoClassname >> "explosive"); private _hit = getNumber (_ammoConfig >> _ammoClassname >> "hit"); @@ -177,21 +177,21 @@ switch (_hitArea) do { case "engine": { _chanceToDetonate = ([_vehicleConfig >> QGVAR(engineDetonationProb), "NUMBER", 0] call CBA_fnc_getConfigEntry) * _incendiary * _currentFuel * _penChance; _chanceOfFire = ([_vehicleConfig >> QGVAR(engineFireProb), "NUMBER", 0] call CBA_fnc_getConfigEntry) * _incendiary * _currentFuel * _penChance; - + private _cookoffIntensity = 4 * _currentFuel; TRACE_6("hit engine",_chanceToDetonate,_chanceOfFire,_incendiary,_chanceOfDetonation,_currentFuel,_cookoffIntensity); - + if (_isCar) then { _chanceOfFire = 0; // no cookoff for cars }; - + if ([_vehicle, _chanceToDetonate, _currentVehicleAmmo, _explosiveAmmoCount, _nonExplosiveAmmoCount, _injurer] call FUNC(handleDetonation)) exitWith { [_vehicle] call FUNC(knockOut); }; // cap damage at 0.9 to avoid hard coded blow up _nextPartDamage = (0.9 min _nextPartDamage); - + // fatal engine/drive system damage if (_nextPartDamage == 0.9 || { 0.8 * _ammoEffectiveness > random 1 }) then { [_vehicle, _hitIndex, _hitpointName, 0.9 * _penChance] call FUNC(addDamage); @@ -199,7 +199,7 @@ switch (_hitArea) do { } else { [_vehicle, _hitIndex, _hitpointName, _nextPartDamage * _penChance] call FUNC(addDamage); }; - + // slightly lower injury chance since this hit the engine block [_vehicle, _injuryChance, _injuryCount, _injurer, [0.2, 0.2, 0.2, 0.4]] call FUNC(injureOccupants); [_vehicle, _chanceOfFire, _cookoffIntensity, _injurer, _hitArea, false] call FUNC(handleCookoff); @@ -207,24 +207,24 @@ switch (_hitArea) do { case "hull": { _chanceToDetonate = ([_vehicleConfig >> QGVAR(hullDetonationProb), "NUMBER", 0] call CBA_fnc_getConfigEntry) * _incendiary * ((_chanceOfDetonation + _currentFuel) / 2) * _penChance; _chanceOfFire = ([_vehicleConfig >> QGVAR(hullFireProb), "NUMBER", 0] call CBA_fnc_getConfigEntry) * _incendiary * ((_chanceOfDetonation + _currentFuel) / 2) * _penChance; - + private _cookoffIntensity = 1.5 + (_explosiveAmmoCount * _chanceOfFire); TRACE_6("hit hull",_chanceToDetonate,_chanceOfFire,_incendiary,_chanceOfDetonation,_currentFuel,_cookoffIntensity); - + if (_isCar) then { _chanceOfFire = 0; // no cookoff for cars }; - + if ([_vehicle, _chanceToDetonate, _currentVehicleAmmo, _explosiveAmmoCount, _nonExplosiveAmmoCount, _injurer] call FUNC(handleDetonation)) exitWith { [_vehicle, _hitIndex, _hitpointName, 0.89 * _penChance] call FUNC(addDamage); [_vehicle] call FUNC(knockOut); }; - + [_vehicle, _injuryChance, _injuryCount, _injurer, [1, 0.4, 0.4, 1]] call FUNC(injureOccupants); - + private _hash = _vehicle getVariable [QGVAR(hitpointHash), []]; private _hashKeys = [_hash] call CBA_fnc_hashKeys; - + // 25% chance of jamming turret - 25% of mobility kill - 25% of both - 75% chance of critical hull damage private _rand = random 1; TRACE_2("rolling hull damage",_ammoEffectiveness,_rand); @@ -249,7 +249,7 @@ switch (_hitArea) do { if !(_vehicle isKindOf "Wheeled_APC_F") then { _partKill = _partKill + TRACK_HITPOINTS#0; }; - + _vehicle setVariable [QGVAR(canMove), false]; }; case (_rand < 0.75): { @@ -258,49 +258,49 @@ switch (_hitArea) do { if !(_vehicle isKindOf "Wheeled_APC_F") then { _partKill = _partKill + TRACK_HITPOINTS#0; }; - + // iterate through all keys and find appropriate turret [_hash, { if (_value#0 isEqualTo "turret") then { _partKill pushBack _key; }; }] call CBA_fnc_hashEachPair; - + _vehicle setVariable [QGVAR(canMove), false]; _vehicle setVariable [QGVAR(canShoot), false]; }; default{}; }; }; - + { TRACE_1("doing damage to hitpoint", _x); [_vehicle, -1, _x, 1 * _penChance] call FUNC(addDamage); } forEach _partKill; - + [_vehicle, _chanceOfFire, _cookoffIntensity, _injurer, "", true] call FUNC(handleCookoff); }; case "turret": { _chanceToDetonate = ([_vehicleConfig >> QGVAR(turretDetonationProb), "NUMBER", 0] call CBA_fnc_getConfigEntry) * _incendiary * _chanceOfDetonation * _penChance; _chanceOfFire = ([_vehicleConfig >> QGVAR(turretFireProb), "NUMBER", 0] call CBA_fnc_getConfigEntry) * _incendiary * _chanceOfDetonation * _penChance; - + private _cookoffIntensity = _explosiveAmmoCount * _chanceOfFire; TRACE_6("hit turret",_chanceToDetonate,_chanceOfFire,_incendiary,_chanceOfDetonation,_currentFuel,_cookoffIntensity); - + if (_isCar) then { _chanceOfFire = 0; // no cookoff for cars }; - + if ([_vehicle, _chanceToDetonate, _currentVehicleAmmo, _explosiveAmmoCount, _nonExplosiveAmmoCount, _injurer] call FUNC(handleDetonation)) exitWith { [_vehicle] call FUNC(knockOut); }; - + if (0.8 * _ammoEffectiveness > random 1) then { TRACE_1("damaged turret", _ammoEffectiveness * 0.8); [_vehicle, _hitIndex, _hitpointName, 1 * _penChance] call FUNC(addDamage); _vehicle setVariable [QGVAR(canShoot), false]; }; - + [_vehicle, _injuryChance, _injuryCount, _injurer, [0.5, 1.5, 1.5, 0.8]] call FUNC(injureOccupants); [_vehicle, _chanceOfFire, _cookoffIntensity, _injurer, "", true] call FUNC(handleCookoff); }; @@ -316,7 +316,7 @@ switch (_hitArea) do { private _damage = (0.1 max (0.1 * _newDamage / _minDamage)) min 1; [_vehicle, _hitIndex, _hitpointName, (_currentPartDamage + _damage) * _penChance] call FUNC(addDamage); TRACE_3("damaged track",_damage,_newDamage,_minDamage); - + if ((_vehicle getHitIndex _hitIndex) >= 1) then { _vehicle setVariable [QGVAR(canMove), false]; }; @@ -329,13 +329,13 @@ switch (_hitArea) do { _chanceOfFire = (_incendiary * _currentFuel * _penChance) / 2; private _cookoffIntensity = _currentFuel * 5; TRACE_2("damaged fuel",_chanceOfFire,_cookoffIntensity); - + if (_isCar) then { _chanceOfFire = 0; // no cookoff for cars }; - + [_vehicle, _chanceOfFire, _cookoffIntensity, _injurer, "", false] call FUNC(handleCookoff); - + private _damage = (0.1 max (0.1 * _newDamage / _minDamage)) min 1; [_vehicle, _hitIndex, _hitpointName, (_currentPartDamage + _damage) * _penChance] call FUNC(addDamage); }; @@ -345,13 +345,13 @@ switch (_hitArea) do { if (_warheadType isEqualTo WARHEAD_TYPE_HEAT || { _warheadType isEqualTo WARHEAD_TYPE_TANDEM } || { _warheadType isEqualTo WARHEAD_TYPE_HE } || { 0.01 > random 1 }) then { private _currentDamage = _vehicle getHitIndex _hitIndex; TRACE_3("damaged slat",_warheadType,_warheadTypeStr,_currentDamage); - + if (_warheadType isEqualTo WARHEAD_TYPE_HEAT || { _warheadType isEqualTo WARHEAD_TYPE_TANDEM }) then { [_vehicle, _hitIndex, _hitpointName, 1] call FUNC(addDamage); } else { [_vehicle, _hitIndex, _hitpointName, _currentDamage + (0.5 max random 1)] call FUNC(addDamage); }; - + if (_currentDamage < 1 && _warheadType isEqualTo WARHEAD_TYPE_HEAT) then { _return = false; }; @@ -363,7 +363,7 @@ switch (_hitArea) do { private _currentDamage = _vehicle getHitIndex _hitIndex; TRACE_3("damaged era",_warheadType,_warheadTypeStr,_currentDamage); [_vehicle, _hitIndex, _hitpointName, 1] call FUNC(addDamage); - + // dont process anymore damage if this is HEAT - shouldnt happen anyway but ARMA says it does so you know if (_currentDamage < 1 && _warheadType isEqualTo WARHEAD_TYPE_HEAT) then { _return = false; diff --git a/addons/vehicle_damage/functions/script_component.hpp b/addons/vehicle_damage/functions/script_component.hpp deleted file mode 100644 index f55cfa57e8..0000000000 --- a/addons/vehicle_damage/functions/script_component.hpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "\z\ace\addons\vehicle_damage\script_component.hpp" - diff --git a/addons/vehicle_damage/initSettings.sqf b/addons/vehicle_damage/initSettings.sqf index e0d02acfbb..ae322a6fd8 100644 --- a/addons/vehicle_damage/initSettings.sqf +++ b/addons/vehicle_damage/initSettings.sqf @@ -2,7 +2,7 @@ QGVAR(enabled), "CHECKBOX", [ELSTRING(common,Enabled), LSTRING(setting_description)], LSTRING(category_displayName), - true, // default value + false, // default value true, // isGlobal {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart diff --git a/addons/vehicle_damage/stringtable.xml b/addons/vehicle_damage/stringtable.xml index e93a0497b1..0aa4a3bee2 100644 --- a/addons/vehicle_damage/stringtable.xml +++ b/addons/vehicle_damage/stringtable.xml @@ -4,26 +4,68 @@ ACE Advanced Vehicle Damage ACE 拡張車両ダメージ + ACE Dégâts de véhicule avancés + ACE Erweiterter Fahrzeugsschaden + ACE Zaawansowany system uszkodzeń pojazdów + ACE 高级载具损坏 + ACE 고급 차량 피해 + ACE Продвинутое повреждение техники + ACE Daño avanzado de vehículos Enable/Disable advanced vehicle damage 拡張車両ダメージの使用を設定します。 + Active les dégâts de véhicule avancés. + Aktiviert/Deaktiviert den Erweiterten Fahrzeugsschaden + Włącz/Wyłącz zaawansowane uszkodzenia pojazdów + 启用/禁用高级载具损坏 + 고급 차량 피해 활성화/비활성화 + Включить/выключить продвинутое повреждение техники + Habilitar/Deshabilitar el daño avanzado de vehículos Enable/Disable advanced car damage (Experimental) 拡張車ダメージ (試験的) + Active les dégâts avancés sur les voitures (expérimental). + Aktiviert/Deaktiviert den Erweiterten Fahrzeugsschaden (Experimentell) + Włącz/Wyłącz zaawansowane uszkodzenia w samochodach (eksperymentalne) + 启用/禁用高级车辆损坏(实验性) + 고급 차량 피해(실험용) 활성화/비활성화 + Включить/выключить продвинутое повреждение машин (экспериментальное) + Habilita/Deshabilita el daño avanzado de coche (Experimental) Enable/Disable advanced Car Damage 拡張車ダメージの使用を設定します。 + Dégâts de voiture avancés + Aktiviert/Deaktiviert erweiterten Autoschaden + Włącz/Wyłącz zaawansowane uszkodzenia w samochodach + 启用/禁用高级车辆损坏 + 고급 차량 피해 활성화/비활성화 + Продвинутое повреждение машин + Habilitar/Deshabilitar daño avanzado de coche (Experimental) Removes all vehicle ammo after cook-off 誘爆後は車両から全ての弾薬を削除します。 + Retire toutes les munitions des véhicules après une auto-inflammation. + Entfernt die gesamte Munition nach dem Durchzünden der Munition eines Fahrzeuges. + Usuwa całą amunicję z pojazdu po samozapłonie + 殉爆后移除所有车辆弹药 + 쿡오프 현상 후 차량에서 모든 탄약을 제거합니다. + Удалять все боеприпасы из техники после их детонации + Elimina toda la munición del vehículo despues ser inducida a detonar por calor Enable/Disable Ammo Removal During Cook-Off 誘爆後の弾薬処理 + Retirer les munitions durant l'auto-inflammation + Aktiviert/Deaktiviert Entfernung der Munition beim Durchzünden + Włącz/Wyłącz usuwanie amunicji podczas samozapłonu + 启用/禁用殉爆过程中的弹药移除功能 + 쿡오프시 탄약 제거 활성화/비활성화 + Удалять боеприпасы из-за детонации + Habilita/Deshabilita ka eliminación de munición durante la detonación inducida por calor Wreck (Turret) @@ -38,7 +80,7 @@ 잔해(포탑) 残骸 (砲塔) 殘骸 (砲塔) - 残骸 (炮塔) + 残骸(炮塔) diff --git a/addons/vehiclelock/functions/fnc_addKeyForVehicle.sqf b/addons/vehiclelock/functions/fnc_addKeyForVehicle.sqf index e88105e398..d730589b36 100644 --- a/addons/vehiclelock/functions/fnc_addKeyForVehicle.sqf +++ b/addons/vehiclelock/functions/fnc_addKeyForVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Adds a key to a unit that will open a vehicle diff --git a/addons/vehiclelock/functions/fnc_getVehicleSideKey.sqf b/addons/vehiclelock/functions/fnc_getVehicleSideKey.sqf index 5e78e55edb..adf3b2f6ec 100644 --- a/addons/vehiclelock/functions/fnc_getVehicleSideKey.sqf +++ b/addons/vehiclelock/functions/fnc_getVehicleSideKey.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns the side specifc key for a vehicle diff --git a/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf b/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf index eb0ecb21a7..08cc150a3c 100644 --- a/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf +++ b/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * For every lockable vehicle, sets the starting lock state to a sane value. diff --git a/addons/vehiclelock/functions/fnc_hasKeyForVehicle.sqf b/addons/vehiclelock/functions/fnc_hasKeyForVehicle.sqf index bda8f67b65..c5f7e0e35a 100644 --- a/addons/vehiclelock/functions/fnc_hasKeyForVehicle.sqf +++ b/addons/vehiclelock/functions/fnc_hasKeyForVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Returns if user has a valid key for the vehicle diff --git a/addons/vehiclelock/functions/fnc_lockpick.sqf b/addons/vehiclelock/functions/fnc_lockpick.sqf index cdc2259b8b..4ef3289b45 100644 --- a/addons/vehiclelock/functions/fnc_lockpick.sqf +++ b/addons/vehiclelock/functions/fnc_lockpick.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles lockpick functionality. Three different functions: diff --git a/addons/vehiclelock/functions/fnc_moduleInit.sqf b/addons/vehiclelock/functions/fnc_moduleInit.sqf index 16e81e85ea..6a3448e89c 100644 --- a/addons/vehiclelock/functions/fnc_moduleInit.sqf +++ b/addons/vehiclelock/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Function for setup module. Sets default lockpick strength and default lock state. diff --git a/addons/vehiclelock/functions/fnc_moduleSync.sqf b/addons/vehiclelock/functions/fnc_moduleSync.sqf index 5aede3f620..c29c7a06d2 100644 --- a/addons/vehiclelock/functions/fnc_moduleSync.sqf +++ b/addons/vehiclelock/functions/fnc_moduleSync.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Function for sync module. Assigns keys for all synced vehicles to any players that are synced. diff --git a/addons/vehiclelock/functions/fnc_onOpenInventory.sqf b/addons/vehiclelock/functions/fnc_onOpenInventory.sqf index 92cbe0144d..03562a6180 100644 --- a/addons/vehiclelock/functions/fnc_onOpenInventory.sqf +++ b/addons/vehiclelock/functions/fnc_onOpenInventory.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the inventory opening. diff --git a/addons/vehiclelock/functions/fnc_serverSetupCustomKeyEH.sqf b/addons/vehiclelock/functions/fnc_serverSetupCustomKeyEH.sqf index 7018e67bcb..7b259adc0d 100644 --- a/addons/vehiclelock/functions/fnc_serverSetupCustomKeyEH.sqf +++ b/addons/vehiclelock/functions/fnc_serverSetupCustomKeyEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * On the server: Adds a key (magazineDetail name) to approved keys for a vehicle. diff --git a/addons/vehiclelock/functions/fnc_setVehicleLockEH.sqf b/addons/vehiclelock/functions/fnc_setVehicleLockEH.sqf index 8f38d48f37..c34dbb78e2 100644 --- a/addons/vehiclelock/functions/fnc_setVehicleLockEH.sqf +++ b/addons/vehiclelock/functions/fnc_setVehicleLockEH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Sets a vehicle lock state because of a "ace_vehiclelock_setVehicleLock" event diff --git a/addons/vehiclelock/functions/script_component.hpp b/addons/vehiclelock/functions/script_component.hpp deleted file mode 100644 index 0e05142c6e..0000000000 --- a/addons/vehiclelock/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\vehiclelock\script_component.hpp" \ No newline at end of file diff --git a/addons/vehiclelock/initSettings.sqf b/addons/vehiclelock/initSettings.sqf index 68a29ed749..9f68c77e7c 100644 --- a/addons/vehiclelock/initSettings.sqf +++ b/addons/vehiclelock/initSettings.sqf @@ -1,5 +1,3 @@ -// CBA Settings [ADDON: ace_vehicleLock]: - [ QGVAR(defaultLockpickStrength), "SLIDER", [LSTRING(DefaultLockpickStrength_DisplayName), LSTRING(DefaultLockpickStrength_Description)], diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 1b4d7de361..6097b9b3b9 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -29,7 +29,7 @@ Sblocca il Veicolo Destravar veículo 車両の鍵を開ける - 차량 잠금열기 + 차량 잠금해제 载具解锁 載具解鎖 Araç Kilidini Aç @@ -80,7 +80,7 @@ Scassino il veicolo... Usando Mixa... 鍵をこじ開けている・・・ - 문따는중... + 문따는 중... 正在开锁... 解鎖中... Maymuncuklanıyor... @@ -130,7 +130,7 @@ Um set de chave mixas que pode abrir a maioria dos veículos. ピッキング ツールでは多くの車両をこじ開けられます。 거의 모든 차량을 열 수 있게 해주는 해정도구 모음입니다. - 一组解锁钥匙 (可解锁大部份载具) + 一组解锁钥匙(可解锁大部份载具) 一組解鎖鑰匙 (可解鎖大部份載具) @@ -145,8 +145,8 @@ Una chiave che apre la maggior parte dei veicoli occidentali Uma chave que abre a maioria dos veículos ocidentais このキーは多くの同盟軍車両を開けられます。 - 거의 모든 서방진영 차량을 여는 열쇠입니다. - 一组解锁钥匙 (可解锁大部份蓝方载具) + 거의 모든 청군 진영 차량을 여는 열쇠입니다. + 一组解锁钥匙(可解锁大部份蓝方载具) 一組解鎖鑰匙 (可解鎖大部份藍方載具) @@ -161,8 +161,8 @@ Una chaive che apre la maggior parte dei veicoli orientali Uma chave que abre a maioria dos veículos orientais このキーは多くのOPFOR軍車両を開けられます。 - 거의 모든 동방진영 차량을 여는 열쇠입니다. - 一组解锁钥匙 (可解锁大部份红方载具) + 거의 모든 대항군 진영 차량을 여는 열쇠입니다. + 一组解锁钥匙(可解锁大部份红方载具) 一組解鎖鑰匙 (可解鎖大部份紅方載具) @@ -177,8 +177,8 @@ Una chaive che apre la maggior parte dei veicoli degli indipendenti Uma chave que abre a maioria dos veículos independentes このキーは多くの独立軍車両を開けられます。 - 거의 모든 중립진영 차량을 여는 열쇠입니다. - 一组解锁钥匙 (可解锁大部份独立方载具) + 거의 모든 무소속군 진영 차량을 여는 열쇠입니다. + 一组解锁钥匙(可解锁大部份独立方载具) 一組解鎖鑰匙 (可解鎖大部份獨立方載具) @@ -194,7 +194,7 @@ Uma chave que abre a maioria dos veículos civis. このキーは多くの市民車両を開けられます。 거의 모든 민간인 차량을 여는 열쇠입니다 - 一组解锁钥匙 (可解锁大部份平民载具) + 一组解锁钥匙(可解锁大部份平民载具) 一組解鎖鑰匙 (可解鎖大部份平民載具) @@ -241,7 +241,7 @@ Закрывать инвентарь транспорта, если транспорт закрыт Blocca l'inventario di un veicolo bloccato 施錠されている車両の開けないインベントリ - 잠긴 차량의 소지품을 뒤지지못하게 합니다. + 잠긴 차량의 소지품을 뒤지지 못하게 합니다. 上锁载具的车箱,使玩家不能拿取/查看载具内的装备 上鎖載具的車箱,使玩家不能拿取/查看載具內的裝備 @@ -257,7 +257,7 @@ Начальное состояние замков Stato Iniziale del Blocco per Veicoli 開始時における車両の鍵の状態 - 시작시 차량 잠금 상태 + 시작 시 차량 잠금 상태 载具初始上锁状态 載具初始上鎖狀態 @@ -273,8 +273,8 @@ Устанавливает начальное состояние замков всех транспортных средств (устраняет неоднозначные состояния) Imposta lo stato di blocco per tutti i veicoli (rimuove stati di blocco ambigui) 全車両へ鍵の状態を設定します。(あいまいな鍵の状態を削除) - 모든 차량의 잠금 상태를 정합니다. (애매한 잠금 상태는 모두 없앱니다.) - 设定所有载具的初始上锁状态 (移除不明确的锁定状态) + 모든 차량의 잠금 상태를 정합니다. (불분명한 잠금 상태는 모두 없앱니다.) + 设定所有载具的初始上锁状态(移除不明确的锁定状态) 設定所有載具的初始上鎖狀態 (移除不明確的鎖定狀態) @@ -284,6 +284,9 @@ Устранить неоднозначные состояния замков Usuń niejednoznaczny stan blokady あいまいな鍵の状態を削除 + Unklaren Sperrzustand entfernen + 移除不明确的上锁状态 + 불분명한 잠금상태 제거 As Is @@ -342,7 +345,7 @@ Durabilidade padrão da chave micha Difficulté par défaut du crochetage Alapértelmezett zártörő-erősség - Сила отмычки по-умолчанию + Сила отмычки по умолчанию Durabilità Default del Grimaldello ピッキング ツールの能力設定 기본 해정도구 설정 @@ -359,11 +362,11 @@ Tempo padrão para forçar a fechadura (em segundos). Padrão: 10 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 + Время для взлома замка отмычкой (в секундах). По умолчанию: 10 Tempo Default richiesto per forzare serrature (in secondi). Default: 10 ピッキング ツールを使った作業時間の標準設定。(秒) 標準: 10 해정을 위해 들이는 기본시간입니다(초 단위). 기본설정: 10 - 开锁时间(秒)。预设:10 + 开锁时间(秒)。预设:10 開鎖時間(秒)。預設:10 @@ -410,7 +413,7 @@ Синхронизируйте с транспортом и игроком. Это выдаст игроку ключи от всех синхронизированных транспортных средств. Работает только для объектов, присутствующих на старте миссии 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/CfgEventHandlers.hpp b/addons/vehicles/CfgEventHandlers.hpp index 062417fc1c..99633dc28d 100644 --- a/addons/vehicles/CfgEventHandlers.hpp +++ b/addons/vehicles/CfgEventHandlers.hpp @@ -18,7 +18,7 @@ class Extended_PostInit_EventHandlers { }; class Extended_Engine_EventHandlers { - class Car { + class AllVehicles { class ACE_EngineStartDelay { clientEngine = QUOTE(if (local driver (_this select 0)) then {_this call FUNC(startEngine)};); }; diff --git a/addons/vehicles/CfgVehicles.hpp b/addons/vehicles/CfgVehicles.hpp index 45d0e557e4..ec2ac69bd0 100644 --- a/addons/vehicles/CfgVehicles.hpp +++ b/addons/vehicles/CfgVehicles.hpp @@ -69,15 +69,15 @@ class CfgVehicles { }; class APC_Tracked_01_base_F: Tank_F { - fuelCapacity = 500 * FUEL_FACTOR; + fuelCapacity = QUOTE(500 * FUEL_FACTOR); }; class APC_Tracked_02_base_F: Tank_F { - fuelCapacity = 600 * FUEL_FACTOR; // NO FUCKING DATA + fuelCapacity = QUOTE(600 * FUEL_FACTOR); // NO FUCKING DATA }; class APC_Tracked_03_base_F: Tank_F { - fuelCapacity = 660 * FUEL_FACTOR; + fuelCapacity = QUOTE(660 * FUEL_FACTOR); class Turrets: Turrets { class MainTurret: MainTurret { weapons[] = {"autocannon_30mm","ACE_LMG_coax_L94A1_mem3"}; // Base 1.82: "autocannon_30mm","LMG_coax" @@ -86,7 +86,7 @@ class CfgVehicles { }; class MBT_03_base_F: Tank_F { - fuelCapacity = 550 * FUEL_FACTOR; + fuelCapacity = QUOTE(550 * FUEL_FACTOR); class Turrets: Turrets { class MainTurret: MainTurret { weapons[] = {"cannon_120mm_long","ACE_LMG_coax_MAG58_mem3"}; // Base 1.82: "cannon_120mm_long","LMG_coax" @@ -95,7 +95,7 @@ class CfgVehicles { }; class MBT_01_base_F: Tank_F { - fuelCapacity = 500 * FUEL_FACTOR; + fuelCapacity = QUOTE(500 * FUEL_FACTOR); class Turrets: Turrets { class MainTurret: MainTurret { weapons[] = {"cannon_120mm", "ACE_LMG_coax_MAG58_mem3"}; // Base 1.82: "cannon_120mm","LMG_coax" @@ -112,14 +112,14 @@ class CfgVehicles { }; }; }; - - - + + + class MBT_02_base_F: Tank_F { - fuelCapacity = 600 * FUEL_FACTOR; // again, couldn't find proper data + fuelCapacity = QUOTE(600 * FUEL_FACTOR); // again, couldn't find proper data }; - + // Change boat minigun ammo to 7.62 class Ship_F: Ship {}; @@ -148,15 +148,15 @@ class CfgVehicles { class Truck_F: Car_F {}; class MRAP_01_base_F: Car_F { - fuelCapacity = 510 * FUEL_FACTOR; + fuelCapacity = QUOTE(510 * FUEL_FACTOR); }; class MRAP_02_base_F: Car_F { - fuelCapacity = 500 * FUEL_FACTOR; // couldn't find any data for the punisher + fuelCapacity = QUOTE(500 * FUEL_FACTOR); // couldn't find any data for the punisher }; - + class MRAP_03_base_F: Car_F { - fuelCapacity = 860 * FUEL_FACTOR; + fuelCapacity = QUOTE(860 * FUEL_FACTOR); smokeLauncherGrenadeCount = 3; smokeLauncherAngle = 80; class Turrets: Turrets { @@ -187,19 +187,19 @@ class CfgVehicles { }; class Truck_01_base_F: Truck_F { - fuelCapacity = 644 * FUEL_FACTOR; + fuelCapacity = QUOTE(644 * FUEL_FACTOR); }; class Truck_02_base_F: Truck_F { - fuelCapacity = 1100 * FUEL_FACTOR; + fuelCapacity = QUOTE(1100 * FUEL_FACTOR); }; class Truck_03_base_F: Truck_F { - fuelCapacity = 900 * FUEL_FACTOR; // NO. FUCKING. DATA. + fuelCapacity = QUOTE(900 * FUEL_FACTOR); // NO. FUCKING. DATA. }; class APC_Wheeled_01_base_F: Wheeled_APC_F { - fuelCapacity = 800 * FUEL_FACTOR; + fuelCapacity = QUOTE(800 * FUEL_FACTOR); class Turrets: Turrets { class MainTurret: MainTurret {}; }; @@ -214,11 +214,11 @@ class CfgVehicles { }; class APC_Wheeled_02_base_F: Wheeled_APC_F { - fuelCapacity = 700 * FUEL_FACTOR; + fuelCapacity = QUOTE(700 * FUEL_FACTOR); }; class APC_Wheeled_03_base_F: Wheeled_APC_F { - fuelCapacity = 700 * FUEL_FACTOR; + fuelCapacity = QUOTE(700 * FUEL_FACTOR); class Turrets: Turrets { class MainTurret: MainTurret {}; }; diff --git a/addons/vehicles/XEH_PREP.hpp b/addons/vehicles/XEH_PREP.hpp index de72ce99f8..3b446300f7 100644 --- a/addons/vehicles/XEH_PREP.hpp +++ b/addons/vehicles/XEH_PREP.hpp @@ -1,4 +1,5 @@ PREP(autoThrottle); PREP(speedLimiter); PREP(startEngine); -PREP(setVehicleStartDelay); \ No newline at end of file +PREP(setVehicleStartDelay); +PREP(toggleSpeedControl); diff --git a/addons/vehicles/XEH_postInit.sqf b/addons/vehicles/XEH_postInit.sqf index 23b1a2b226..d89aff2b25 100644 --- a/addons/vehicles/XEH_postInit.sqf +++ b/addons/vehicles/XEH_postInit.sqf @@ -3,51 +3,36 @@ if (!hasInterface) exitWith {}; GVAR(isSpeedLimiter) = false; + // Add keybinds -["ACE3 Vehicles", QGVAR(speedLimiter), localize LSTRING(SpeedLimiter), -{ - private _connectedUAV = getConnectedUAV ACE_player; - private _uavControll = UAVControl _connectedUAV; - if ((_uavControll select 1) == "DRIVER") then { - if !(_connectedUAV isKindOf "UGV_01_base_F") exitWith {false}; - GVAR(isUAV) = true; - [_uavControll select 0, _connectedUAV] call FUNC(speedLimiter); - true - } else { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if !(ACE_player == driver vehicle ACE_player && - {vehicle ACE_player isKindOf 'Car' || - {vehicle ACE_player isKindOf 'Tank'} || - {vehicle ACE_player isKindOf 'Plane'}}) exitWith {false}; +["ACE3 Vehicles", QGVAR(speedLimiter), localize LSTRING(SpeedLimiter), { + false call FUNC(toggleSpeedControl) +}, {false}, [DIK_DELETE, [false, false, false]], false] call CBA_fnc_addKeybind; - GVAR(isUAV) = false; - // Statement - if (vehicle ACE_player isKindOf 'Plane') then { - [ACE_player, vehicle ACE_player] call FUNC(autoThrottle); - } else { - [ACE_player, vehicle ACE_player] call FUNC(speedLimiter); - }; - true - }; - -}, -{false}, -[211, [false, false, false]], false] call CBA_fnc_addKeybind; //DELETE Key +["ACE3 Vehicles", QGVAR(cruiseControl), localize LSTRING(CruiseControl), { + true call FUNC(toggleSpeedControl) +}, {false}, [DIK_INSERT, [false, false, false]], false] call CBA_fnc_addKeybind; ["ACE3 Vehicles", QGVAR(scrollUp), localize LSTRING(IncreaseSpeedLimit), { if (GVAR(isSpeedLimiter)) then { GVAR(speedLimit) = round (GVAR(speedLimit) + GVAR(speedLimiterStep)) max (5 max GVAR(speedLimiterStep)); + GVAR(speedLimit) = 5 max GVAR(speedLimiterStep) * floor (GVAR(speedLimit) / GVAR(speedLimiterStep)); [["%1: %2", LSTRING(SpeedLimit), GVAR(speedLimit)]] call EFUNC(common,displayTextStructured); true + } else { + !isNil QGVAR(speedLimit) + && {[GVAR(isCruiseControl), true] call FUNC(toggleSpeedControl)} // RESUME }; }, {false}, [MOUSE_SCROLL_UP, [false, true, false]], false] call CBA_fnc_addKeybind; // Ctrl + Mouse Wheel Scroll Up ["ACE3 Vehicles", QGVAR(scrollDown), localize LSTRING(DecreaseSpeedLimit), { if (GVAR(isSpeedLimiter)) then { GVAR(speedLimit) = round (GVAR(speedLimit) - GVAR(speedLimiterStep)) max (5 max GVAR(speedLimiterStep)); + GVAR(speedLimit) = 5 max GVAR(speedLimiterStep) * ceil (GVAR(speedLimit) / GVAR(speedLimiterStep)); [["%1: %2", LSTRING(SpeedLimit), GVAR(speedLimit)]] call EFUNC(common,displayTextStructured); true + } else { + !isNil QGVAR(isCruiseControl) + && {GVAR(isCruiseControl) call FUNC(toggleSpeedControl)} // SET }; }, {false}, [MOUSE_SCROLL_DOWN, [false, true, false]], false] call CBA_fnc_addKeybind; // Ctrl + Mouse Wheel Scroll Down diff --git a/addons/vehicles/functions/fnc_autoThrottle.sqf b/addons/vehicles/functions/fnc_autoThrottle.sqf index ee8996a5a8..63b4f53642 100644 --- a/addons/vehicles/functions/fnc_autoThrottle.sqf +++ b/addons/vehicles/functions/fnc_autoThrottle.sqf @@ -1,11 +1,12 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Toggle speed limiter for Driver in Plane. Uses a simple PID controller to manage thrust * * Arguments: * 0: Driver * 1: Vehicle + * 2: Preserve Speed Limit * * Return Value: * None @@ -20,7 +21,7 @@ #define PID_D 0 #define EPSILON 0.001 -params ["_driver", "_vehicle"]; +params ["_driver", "_vehicle", ["_preserveSpeedLimit", false]]; if (GVAR(isSpeedLimiter)) exitWith { [localize LSTRING(Off)] call EFUNC(common,displayTextStructured); @@ -31,9 +32,12 @@ if (GVAR(isSpeedLimiter)) exitWith { [localize LSTRING(On)] call EFUNC(common,displayTextStructured); playSound "ACE_Sound_Click"; GVAR(isSpeedLimiter) = true; +GVAR(isCruiseControl) = true; // enables SET/RESUME -// Convert forward speed to KM/H. `speed _vehicle` isnt accurate enough for this controller to work well, so its easier to use M/S. The system assumes it is KM/H so we need the conversion -GVAR(speedLimit) = (((velocityModelSpace _vehicle) select 1) * 3.6) max 5; +if (!_preserveSpeedLimit) then { + // Convert forward speed to KM/H. `speed _vehicle` isnt accurate enough for this controller to work well, so its easier to use M/S. The system assumes it is KM/H so we need the conversion + GVAR(speedLimit) = (((velocityModelSpace _vehicle) select 1) * 3.6) max 5; +}; [{ params ["_args", "_idPFH"]; @@ -43,8 +47,15 @@ GVAR(speedLimit) = (((velocityModelSpace _vehicle) select 1) * 3.6) max 5; // this will take into account game being pausesd private _deltaTime = CBA_missionTime - _lastTime; - if (_driver != driver _vehicle) then { - GVAR(isSpeedLimiter) = false; + private _role = _driver call EFUNC(common,getUavControlPosition); + if (GVAR(isUAV)) then { + if (_role != "DRIVER") then { + GVAR(isSpeedLimiter) = false; + }; + } else { + if (_driver != currentPilot _vehicle || {_role != ""}) then { + GVAR(isSpeedLimiter) = false; + }; }; if (_throttleLogValue == 0) then { @@ -60,6 +71,10 @@ GVAR(speedLimit) = (((velocityModelSpace _vehicle) select 1) * 3.6) max 5; GVAR(isSpeedLimiter) = false; }; + if (call CBA_fnc_getActiveFeatureCamera != "") then { + GVAR(isSpeedLimiter) = false; + }; + if (!GVAR(isSpeedLimiter)) exitWith { [_idPFH] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/vehicles/functions/fnc_setVehicleStartDelay.sqf b/addons/vehicles/functions/fnc_setVehicleStartDelay.sqf index 337a1d961b..6539eec7ef 100644 --- a/addons/vehicles/functions/fnc_setVehicleStartDelay.sqf +++ b/addons/vehicles/functions/fnc_setVehicleStartDelay.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: severgun * Set engine startup delay to specific vehicle. @@ -20,4 +20,4 @@ params [["_veh", objNull, [objNull]], ["_delay", 0, [99]]]; if (isNull _veh || {!(_veh isKindOf "AllVehicles")}) exitWith {}; -_veh setVariable [QGVAR(engineStartDelay), _delay max 0, true]; \ No newline at end of file +_veh setVariable [QGVAR(engineStartDelay), _delay max 0, true]; diff --git a/addons/vehicles/functions/fnc_speedLimiter.sqf b/addons/vehicles/functions/fnc_speedLimiter.sqf index 6d76293bff..a2ad474174 100644 --- a/addons/vehicles/functions/fnc_speedLimiter.sqf +++ b/addons/vehicles/functions/fnc_speedLimiter.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Toggle speed limiter for Driver in Vehicle. @@ -6,60 +6,100 @@ * Arguments: * 0: Driver * 1: Vehicle + * 2: Cruise Control + * 3: Preserve Speed Limit * * Return Value: * None * * Example: - * [player, car] call ace_vehicles_fnc_speedLimiter + * [player, car, true] call ace_vehicles_fnc_speedLimiter * * Public: No */ -params ["_driver", "_vehicle"]; +params ["_driver", "_vehicle", ["_cruiseControl", false], ["_preserveSpeedLimit", false]]; if (GVAR(isSpeedLimiter)) exitWith { - [localize LSTRING(Off)] call EFUNC(common,displayTextStructured); - playSound "ACE_Sound_Click"; - _vehicle setCruiseControl [0, false]; - GVAR(isSpeedLimiter) = false; + switch ([GVAR(isCruiseControl), _cruiseControl]) do { + case [true, true]: { + [localize LSTRING(OffCruise)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [0, false]; + GVAR(isSpeedLimiter) = false; + }; + case [true, false]: { + [localize LSTRING(On)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [GVAR(speedLimit), false]; + GVAR(isCruiseControl) = false; + }; + case [false, true]: { + [localize LSTRING(OnCruise)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [GVAR(speedLimit), true]; + GVAR(isCruiseControl) = true; + }; + case [false, false]: { + [localize LSTRING(Off)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [0, false]; + GVAR(isSpeedLimiter) = false; + }; + }; }; (getCruiseControl _vehicle) params ["_speedLimit"]; if (_speedLimit != 0) exitWith { TRACE_1("speed limit set by external source",_speedLimit); }; -[localize LSTRING(On)] call EFUNC(common,displayTextStructured); +[localize ( + [LSTRING(On), LSTRING(OnCruise)] select _cruiseControl +)] call EFUNC(common,displayTextStructured); playSound "ACE_Sound_Click"; GVAR(isSpeedLimiter) = true; +GVAR(isCruiseControl) = _cruiseControl; -GVAR(speedLimit) = speed _vehicle max 5; +if (!_preserveSpeedLimit) then { + GVAR(speedLimit) = round (speed _vehicle max 5); +}; +GVAR(speedLimitInit) = true; [{ params ["_args", "_idPFH"]; _args params ["_driver", "_vehicle"]; + private _role = _driver call EFUNC(common,getUavControlPosition); if (GVAR(isUAV)) then { - private _uavControll = UAVControl _vehicle; - if ((_uavControll select 0) != _driver || _uavControll select 1 != "DRIVER") then { + if (_role == "") then { GVAR(isSpeedLimiter) = false; - _vehicle setCruiseControl [0, false]; + TRACE_1("UAV controller changed, disabling speedlimit",_vehicle); }; } else { - if (_driver != driver _vehicle) then { + if (_driver != driver _vehicle || {_role != ""}) then { GVAR(isSpeedLimiter) = false; - _vehicle setCruiseControl [0, false]; + TRACE_3("Vehicle driver changed, disabling speedlimit",_driver,driver _vehicle,_vehicle); }; }; + if (call CBA_fnc_getActiveFeatureCamera != "") then { + GVAR(isSpeedLimiter) = false; + }; + if (!GVAR(isSpeedLimiter)) exitWith { _vehicle setCruiseControl [0, false]; [_idPFH] call CBA_fnc_removePerFrameHandler; }; - getCruiseControl _vehicle params ["_currentSpeedLimit"]; - if (_currentSpeedLimit != GVAR(speedLimit)) then { - _vehicle setCruiseControl [GVAR(speedLimit), false]; + getCruiseControl _vehicle params ["_currentSpeedLimit", "_cruiseControlActive"]; + if (GVAR(isCruiseControl) && {!GVAR(speedLimitInit) && {!_cruiseControlActive}}) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + GVAR(isSpeedLimiter) = false; + [localize LSTRING(OffCruise)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + }; + if (round _currentSpeedLimit != GVAR(speedLimit)) then { + TRACE_2("Updating speed limit",GVAR(speedLimit),_vehicle); + _vehicle setCruiseControl [GVAR(speedLimit), GVAR(isCruiseControl)]; + GVAR(speedLimitInit) = false; }; - - }, 0, [_driver, _vehicle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/vehicles/functions/fnc_startEngine.sqf b/addons/vehicles/functions/fnc_startEngine.sqf index 4a4633b080..8823ae4018 100644 --- a/addons/vehicles/functions/fnc_startEngine.sqf +++ b/addons/vehicles/functions/fnc_startEngine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Delays engine start of vehicle. diff --git a/addons/vehicles/functions/fnc_toggleSpeedControl.sqf b/addons/vehicles/functions/fnc_toggleSpeedControl.sqf new file mode 100644 index 0000000000..bbbaa08876 --- /dev/null +++ b/addons/vehicles/functions/fnc_toggleSpeedControl.sqf @@ -0,0 +1,59 @@ +#include "..\script_component.hpp" +/* + * Author: Dystopian + * Checks if player can toggle speed control and runs proper speed control mode. + * Should run as key handler. + * + * Arguments: + * 0: Cruise Control + * 1: Preserve Speed Limit + * + * Return Value: + * Key handled + * + * Example: + * true call ace_vehicles_fnc_toggleSpeedControl + * + * Public: No + */ + +params [["_cruiseControl", false], ["_preserveSpeedLimit", false]]; + +private _role = ACE_player call EFUNC(common,getUavControlPosition); + +private _vehicle = objNull; +private _continue = true; +if (_role != "") then { + GVAR(isUAV) = true; + _vehicle = getConnectedUAV ACE_player; + _continue = ( + !visibleMap + && {_role == "DRIVER" || {!(_vehicle isKindOf "Plane")}} + ); +} else { + GVAR(isUAV) = false; + _vehicle = vehicle ACE_player; + _continue = ( + ACE_player == currentPilot _vehicle + && {[ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)} + ); +}; +if ( + !_continue + || {!(isEngineOn _vehicle)} + || {!GVAR(isSpeedLimiter) && _cruiseControl && {speed _vehicle < 1}} // don't enable CC when stop or move backward +) exitWith {false}; + +private _allowedVehicleClasses = ["Car", "Tank", "Ship"]; +if (_cruiseControl) then { + _allowedVehicleClasses pushBack "Plane"; +}; +if (-1 == _allowedVehicleClasses findIf {_vehicle isKindOf _x}) exitWith {false}; + +if (_vehicle isKindOf "Plane") then { + [ACE_player, _vehicle, _preserveSpeedLimit] call FUNC(autoThrottle); +} else { + [ACE_player, _vehicle, _cruiseControl, _preserveSpeedLimit] call FUNC(speedLimiter); +}; + +true diff --git a/addons/vehicles/functions/script_component.hpp b/addons/vehicles/functions/script_component.hpp deleted file mode 100644 index f84b06d718..0000000000 --- a/addons/vehicles/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\vehicles\script_component.hpp" \ No newline at end of file diff --git a/addons/vehicles/initSettings.sqf b/addons/vehicles/initSettings.sqf index 500cd8d852..eb15ea346f 100644 --- a/addons/vehicles/initSettings.sqf +++ b/addons/vehicles/initSettings.sqf @@ -25,5 +25,5 @@ "SLIDER", LSTRING(SpeedLimiterStep), ELSTRING(common,ACEKeybindCategoryVehicles), - [1, 10, 5, 0] + [1, 10, 5, -1] // whole numbers only ] call CBA_fnc_addSetting; diff --git a/addons/vehicles/script_component.hpp b/addons/vehicles/script_component.hpp index ae4eec2fd0..a23967a4d5 100644 --- a/addons/vehicles/script_component.hpp +++ b/addons/vehicles/script_component.hpp @@ -6,6 +6,8 @@ // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + #ifdef DEBUG_ENABLED_VEHICLES #define DEBUG_MODE_FULL #endif @@ -19,4 +21,5 @@ #define MOUSE_SCROLL_UP 0xF8 #define MOUSE_SCROLL_DOWN 0xF9 -#define FUEL_FACTOR 0.165 // fuel capacity = range in km * FUEL_FACTOR +// fuel capacity = range in km * FUEL_FACTOR +#define FUEL_FACTOR 0.165 diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index bb6ca8d48a..84c094bc1a 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -18,6 +18,16 @@ 啟用速度限制 Hız Sabitleyeciı Açık + + Cruise control on + Tempomat an + 자동운전 켜짐 + Tempomat włączony + クルーズコントロールを有効化 + 开启巡航模式 + Круиз-контроль включён + Control de crucero encendido + Speed Limiter off Geschwindigkeitsbegrenzer aus @@ -35,19 +45,31 @@ 停用速度限制 Hız Sabitleyeci Kapalı + + Cruise control off + Tempomat aus + 자동운전 꺼짐 + Tempomat wyłączony + クルーズコントロールを無効化 + 关闭巡航模式 + Круиз-контроль выключен + Control de crucero apagado + 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 @@ -66,33 +88,47 @@ 速度限制器 Hız Sabitleyici + + Cruise Control + Tempomat + 자동운전 + Tempomat + クルーズコントロール + 巡航模式 + Круиз-контроль + Contro de crucero + 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 @@ -103,10 +139,12 @@ 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. @@ -117,10 +155,12 @@ 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 @@ -131,9 +171,11 @@ 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. @@ -144,19 +186,23 @@ 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 Шаг ограничителя скорости Salto de limitador de vehículo + 限速器步长 + 속도 제한기 단위 diff --git a/addons/viewdistance/functions/fnc_adaptViewDistance.sqf b/addons/viewdistance/functions/fnc_adaptViewDistance.sqf index d83b8ae746..9878d17336 100644 --- a/addons/viewdistance/functions/fnc_adaptViewDistance.sqf +++ b/addons/viewdistance/functions/fnc_adaptViewDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Winter * Sets the player's current view distance according to whether s/he is on foot, in a land vehicle or in an air vehicle. diff --git a/addons/viewdistance/functions/fnc_changeViewDistance.sqf b/addons/viewdistance/functions/fnc_changeViewDistance.sqf index 64e906b5c1..84ba31d285 100644 --- a/addons/viewdistance/functions/fnc_changeViewDistance.sqf +++ b/addons/viewdistance/functions/fnc_changeViewDistance.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Winter * Sets the player's current view distance according to allowed values. @@ -19,7 +19,7 @@ params ["_viewDistance", "_showPrompt"]; if (_viewDistance == 0) then { // Video Settings - _viewDistance = viewDistance; + _viewDistance = (getVideoOptions get "overallVisibility"); }; private _objectViewDistanceCoeff = [GVAR(objectViewDistanceCoeff)] call FUNC(returnObjectCoeff); // changes the setting index into a coefficient. diff --git a/addons/viewdistance/functions/fnc_initModule.sqf b/addons/viewdistance/functions/fnc_initModule.sqf index b33b6b532c..fe8781f035 100644 --- a/addons/viewdistance/functions/fnc_initModule.sqf +++ b/addons/viewdistance/functions/fnc_initModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Winter * Initializes the view distance limiter module. diff --git a/addons/viewdistance/functions/fnc_returnObjectCoeff.sqf b/addons/viewdistance/functions/fnc_returnObjectCoeff.sqf index 5cc17be8bb..54ce388f5c 100644 --- a/addons/viewdistance/functions/fnc_returnObjectCoeff.sqf +++ b/addons/viewdistance/functions/fnc_returnObjectCoeff.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Winter * Returns the object view distance coefficient according to the given index diff --git a/addons/viewdistance/functions/fnc_setFovBasedOvdPFH.sqf b/addons/viewdistance/functions/fnc_setFovBasedOvdPFH.sqf index e419687ac6..c08545ca7c 100644 --- a/addons/viewdistance/functions/fnc_setFovBasedOvdPFH.sqf +++ b/addons/viewdistance/functions/fnc_setFovBasedOvdPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Sets Object View Distance dynamically based on current Field of View, between Object View Distance (minimal value) and View Distance (maximum value) set before this PFH starts. diff --git a/addons/viewdistance/functions/script_component.hpp b/addons/viewdistance/functions/script_component.hpp deleted file mode 100644 index f6c83ec54d..0000000000 --- a/addons/viewdistance/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\viewdistance\script_component.hpp" diff --git a/addons/viewdistance/initSettings.sqf b/addons/viewdistance/initSettings.sqf index 9c474b5f1f..26f0f25017 100644 --- a/addons/viewdistance/initSettings.sqf +++ b/addons/viewdistance/initSettings.sqf @@ -10,7 +10,7 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)]; [ QGVAR(viewDistanceOnFoot), "SLIDER", - [LSTRING(onFoot_DisplayName), LSTRING(onFoot_Description)], + [LSTRING(onFoot_DisplayName), format ["%1\n%2", LLSTRING(onFoot_Description), LLSTRING(sliderExtraDescription)]], _category, [0, 10000, 0, -1], 0, @@ -19,7 +19,7 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)]; [ QGVAR(viewDistanceLandVehicle), "SLIDER", - [LSTRING(landVehicle_DisplayName), LSTRING(landVehicle_Description)], + [LSTRING(landVehicle_DisplayName), format ["%1\n%2", LLSTRING(landVehicle_Description), LLSTRING(sliderExtraDescription)]], _category, [0, 10000, 0, -1], 0, @@ -28,7 +28,7 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)]; [ QGVAR(viewDistanceAirVehicle), "SLIDER", - [LSTRING(airVehicle_DisplayName), LSTRING(airVehicle_Description)], + [LSTRING(airVehicle_DisplayName), format ["%1\n%2", LLSTRING(airVehicle_Description), LLSTRING(sliderExtraDescription)]], _category, [0, 10000, 0, -1], 0, diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index 664a9df668..2d6ae9bd96 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -14,7 +14,7 @@ Limitatore Distanza Visiva 視界距離の制限 시야 제한기 - 视野距离限制器 + 视距限制器 視野距離限制器 Görüş Uzaklığı Sınırlayıcısı @@ -47,7 +47,7 @@ Abilita distanza visiva ACE ACE 視界距離を有効化 ACE 시야 활성화 - 启用ACE视距 + 启用 ACE 视距 啟用ACE視距 ACE Görüş Uzaklığını Aktif Et @@ -63,8 +63,8 @@ Включает ограничитель дальности видимости ACE Abilita distanza visiva ACE ACE 視界距離を有効化 - ACE 시야 활성화 - 启用ACE视距 + ACE 시야를 활성화 합니다. + 启用 ACE 视距 啟用ACE視距 ACE Görüş Uzaklığını Aktif Et @@ -81,7 +81,7 @@ Limite Distanza Visiva 視界距離の制限 시야 제한기 - 视野距离限制 + 视距限制 視野距離限制 Görüş Uzaklığı Limiti @@ -98,7 +98,7 @@ Imposta il limite massimo a cui i client possono alzare la propria distanza visiva (massimo 10000) 各クライアントが最大まで設定できる視界距離を設定します。(最大 10000) 클라이언트가 최대 얼마나 멀리 볼 수 있는지 제한을 둡니다 (10000 까지 가능) - 设定客户端最高可显示的视野距离 (最高至10000) + 设定客户端最高可显示的视距(最高至10000) 設定客戶端最高可顯示的視野距離 (最高至10000) Kişilerin görüş mesafelerini ne kadar yükseltebileceğine ilişkin sınırı belirler (En Fazla 10000) @@ -114,10 +114,20 @@ Предел дальности видимости клиентов устанавливается здесь и может быть переопределен модулем Limite per la distanza visiva del client impostato qui e può essere scavalcato dal modulo クライアントへの視界距離の設定や、それをモジュールにより上書きできます - 클라이언트의 시야를 이 모듈로 치환할 수 있습니다. + 클라이언트의 시야를 이 모듈로 덮어씌울 수 있습니다. 玩家的视距限制可在此设定,也可透过模块改写 玩家的視距限制可在此設定,也可透過模塊改寫 + + Setting to 0 will use default video settings + 设置为0将使用默认的视频设置 + 0으로 설정시 기존 비디오 설정을 사용합니다. + Bei Einstellung auf 0 werden die Standard-Videoeinstellungen verwendet. + Ustawienie na 0, spowoduje użycie domyślnych ustawień wideo. + 0に設定すると、デフォルトのビデオ設定が使用されます + Значение 0 будет использовать настройки видео по умолчанию + Establecer a 0 utiliza las opciones de video por defecto + Client View Distance (On Foot) Zasięg widzenia (piechota) @@ -131,7 +141,7 @@ Distanza Visiva Client (a Piedi) クライアント側視界距離 (地上) 클라이언트 시야 (보병) - 客户端视野距离 (步行) + 客户端视距(步行) 客戶端視野距離 (步行) Kişilerin Görüş Uzaklığı Mesafesi (Yerde) @@ -148,7 +158,7 @@ Cambia la distanza visiva in gioco quando il giocatore è a piedi. プレイヤーが地上にいる時の視界距離を変更します。 플레이어가 보병일 경우의 시야를 바꿀 수 있습니다. - 改变玩家步行时的视野距离. + 改变玩家步行时的视距。 改變玩家步行時的視野距離. Oyuncular ayakta iken görebileceği uzaklığı değiştir. @@ -165,7 +175,7 @@ Distanza Visiva Client (Veicolo Terrestre) クライアント側視界距離 (車両) 클라이언트 시야 (차량) - 客户端视野距离 (地面载具) + 客户端视距(地面载具) 客戶端視野距離 (地面載具) Kişilerin Görüş Uzaklığı Mesafesi (Kara Araçların da) @@ -182,7 +192,7 @@ Cambia la distanza visiva in gioco quando il giocatore è in un veicolo terrestre. プレイヤーが車両の時の視界距離を変更します。 플레이어가 차량 내부일 경우의 시야를 바꿀 수 있습니다. - 改变玩家于地面载具内时的视野距离 + 改变玩家于地面载具内时的视距 改變玩家於地面載具內時的視野距離 Oyuncular kara araçlarında iken görebileceği uzaklığı değiştir. @@ -199,7 +209,7 @@ Distanza Visiva Client (Veicoli d'Aria) クライアント側視界距離 (航空機) 클라이언트 시야 (항공기) - 客户端视野距离 (空中载具) + 客户端视距(空中载具) 客戶端視野距離 (空中載具) Kişilerin Görüş Uzaklığı Mesafesi (Hava Araçların da) @@ -216,7 +226,7 @@ Cambia la distanza visiva in gioco quando il giocatore è in un mezzo aereo. プレイヤーが航空機に乗っている時の視界距離を変更します。 플레이어가 항공기 내부일 경우의 시야를 바꿀 수 있습니다. - 改变玩家于空中载具内时的视野距离 + 改变玩家于空中载具内时的视距 改變玩家於空中載具內時的視野距離 Oyuncular hava araçların da iken görebileceği uzaklığı değiştir. @@ -233,7 +243,7 @@ Distanza Visiva Oggetti Dinamica 動的なオブジェクトの描画距離 동적 물체 시야 - 动态物件的视野距离 + 动态物体的视距 動態物件的視野距離 @@ -248,8 +258,8 @@ Устанавливает дальность отрисовки объектов как коэффициент от общей дальности видимости. Imposta la distanza visiva degli oggetti come un coefficiente basato sulla distanza visiva oppure basato sul campo visivo. 視野角を元にするか、視界距離によるオブジェクト描画距離を決定します。視野角を元にするオプションを有効化した場合、視野角により最低と最高値が変動します。 - 설정된 시야 혹은 시계(FoV)에 계수를 적용해 물체 시야를 적용합니다. 시계를 바탕으로 하는 옵션을 활성화할 경우 시계에 의한 최저와 최고치가 변동됩니다. - 设定物件可被观察的距离,透过视野距离或是视野角度来决定。 + 설정된 시야 혹은 시야각(FoV)에 계수를 적용해 물체 시야를 적용합니다. 시야각를 바탕으로 하는 옵션을 활성화할 경우 시야각에 의한 최저와 최고치가 변동됩니다. + 设定物体可被观察的距离,透过视距或是视野角度来决定。 設定物件可被觀察的距離,透過視野距離或是視野角度來決定。 @@ -365,7 +375,7 @@ Basada en campo de visión Basée sur le champ de vision 視野角を元にする - 시계(FoV) + 시야각(FoV) 由视野角度决定 由視野角度決定 @@ -380,9 +390,9 @@ Látótávolság: Дальность видимости: Distanza Visiva: - 視界距離: + 視界距離: 시야: - 视野距离: + 视距: 視野距離: Görüş Uzaklığı: @@ -398,8 +408,8 @@ Дальность видимости объектов: Distanza Visiva Oggetti è オブジェクト描画距離は - 동적 물체 시야는 - 物件视野距离为 + 물체 시야는 + 物体视距为 物件視野距離為 @@ -413,9 +423,9 @@ Ez a beállítás érvénytelen! A maximum mennyiség Настройка не верна! Текущий предел Questa opzione è invalida! Il limite è - このオプションは無効です!制限は + このオプションは無効です! 制限は 이 옵션은 불가능합니다! 제한은 - 该选项是无效的! 限制是 + 该选项是无效的! 限制是 該選項是無效的! 限制是 Bu seçenek geçersiz! Limit diff --git a/addons/viewports/$PBOPREFIX$ b/addons/viewports/$PBOPREFIX$ new file mode 100644 index 0000000000..0ed652c6e7 --- /dev/null +++ b/addons/viewports/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\viewports diff --git a/addons/viewports/CfgEventHandlers.hpp b/addons/viewports/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a3f71f852 --- /dev/null +++ b/addons/viewports/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/viewports/CfgVehicles.hpp b/addons/viewports/CfgVehicles.hpp new file mode 100644 index 0000000000..9b6427ff2c --- /dev/null +++ b/addons/viewports/CfgVehicles.hpp @@ -0,0 +1,22 @@ +class CfgVehicles { + class B_MBT_01_base_F; + class B_MBT_01_cannon_F: B_MBT_01_base_F { // Merkava + class ace_viewports { + class SLD_backLeftUpper { + type = "screen"; + camLocation[] = {0,0,0.05}; + maxDistance = 5; + camAttach[] = {0,0}; + screenLocation[] = {-0.925,-3.43459,-1.07}; + roles[]={"cargo"}; + }; + }; + }; + class B_MBT_01_TUSK_F: B_MBT_01_cannon_F { // Merkava TUSK (slightly different model-space because different p3d model) + class ace_viewports: ace_viewports { + class SLD_backLeftUpper: SLD_backLeftUpper { + screenLocation[] = {-0.925,-4.65511,-1.07}; + }; + }; + }; +}; diff --git a/addons/viewports/README.md b/addons/viewports/README.md new file mode 100644 index 0000000000..c4faabaada --- /dev/null +++ b/addons/viewports/README.md @@ -0,0 +1,4 @@ +ace_viewports +========== + +Allows crew to look through periscopes diff --git a/addons/viewports/XEH_PREP.hpp b/addons/viewports/XEH_PREP.hpp new file mode 100644 index 0000000000..ddf32fb5d9 --- /dev/null +++ b/addons/viewports/XEH_PREP.hpp @@ -0,0 +1,8 @@ +LOG("prep"); + +PREP(eachFrame); +PREP(enterVehicle); +PREP(getSeatInfo); +PREP(getViewports); +PREP(viewCleanup); +PREP(viewCreate); diff --git a/addons/viewports/XEH_postInit.sqf b/addons/viewports/XEH_postInit.sqf new file mode 100644 index 0000000000..06984eabf0 --- /dev/null +++ b/addons/viewports/XEH_postInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +GVAR(pfeh) = -1; +["CBA_settingsInitialized", { + TRACE_1("CBA_settingsInitialized",GVAR(enabled)); + ["vehicle", LINKFUNC(enterVehicle), true] call CBA_fnc_addPlayerEventHandler; +}] call CBA_fnc_addEventHandler; diff --git a/addons/viewports/XEH_preInit.sqf b/addons/viewports/XEH_preInit.sqf new file mode 100644 index 0000000000..a8940fc7dd --- /dev/null +++ b/addons/viewports/XEH_preInit.sqf @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +#ifdef POINT_CONFIG_DEBUG +call compileScript [QPATHTOF(dev\debugPoints.sqf)]; +#endif + +ADDON = true; diff --git a/addons/viewports/XEH_preStart.sqf b/addons/viewports/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/viewports/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/viewports/config.cpp b/addons/viewports/config.cpp new file mode 100644 index 0000000000..7d303de1b7 --- /dev/null +++ b/addons/viewports/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "gui.hpp" diff --git a/addons/viewports/data/optic_window_ca.paa b/addons/viewports/data/optic_window_ca.paa new file mode 100644 index 0000000000..18e1aa9ea7 Binary files /dev/null and b/addons/viewports/data/optic_window_ca.paa differ diff --git a/addons/viewports/dev/debugPoints.sqf b/addons/viewports/dev/debugPoints.sqf new file mode 100644 index 0000000000..24b393d70f --- /dev/null +++ b/addons/viewports/dev/debugPoints.sqf @@ -0,0 +1,173 @@ +#include "..\script_component.hpp" +/* + [] call compileScript ["\z\ace\addons\viewports\dev\debugPoints.sqf"]; + + This is mostly just for placing the mem points in threeden + left-click to place and adjust current point + alt+left-click to place next point + alt+right-click to output + shift+right-click to reset + + // Tweak: + z = (vehicle player) getVariable "ace_viewports_viewports"; + p = z # 0 # 4; z # 0 set [4, p vectorAdd [0,0.1,0]]; + + // Place by view: + v = (positionCameraToWorld [0,0,0.4]); + m = (vehicle player) worldToModel v; + z = (vehicle player) getVariable "ace_viewports_viewports"; + z # 0 set [4, m]; +*/ + +#define IDD_3DEN 313 + +[] spawn { + INFO_2("Pre-Init [is3den %1][3den display: %2]", is3den, !isNull findDisplay IDD_3DEN); + if (!is3den) exitWith {}; + + GVAR(3denIndex) = 0; + GVAR(3denViewports) = []; + + disableSerialization; + private _3den = findDisplay IDD_3DEN; + if (_3den getVariable [QGVAR(setup), false]) exitWith {}; + _3den setVariable [QGVAR(setup), true]; + + _3den displayAddEventHandler ["MouseButtonDown", { + params ["", "_button", "_mouseX", "_mouseY", "_shift", "_ctrl", "_alt"]; + + if (_shift && _button == 1) exitWith { + systemChat "Reset/Reload"; + if ((supportInfo "u:diag_mergeConfigFile") isNotEqualTo []) then { + call compile 'diag_mergeConfigFile ["P:\z\ace\addons\viewports\config.cpp"]'; + }; + { _x setVariable [QGVAR(viewports), nil] } forEach vehicles; + GVAR(3denIndex) = 0; + GVAR(3denViewports) = []; + true + }; + + if (_alt) then { + if (count GVAR(3denViewports) > GVAR(3denIndex)) then { + systemChat "Advance to next index"; + GVAR(3denIndex) = GVAR(3denIndex) + 1; + }; + }; + if (_alt && _button == 1) exitWith { + private _vehicle = (get3DENSelected "object") param [0, objNull]; + private _config = configOf _vehicle; + private _model = getText (_config >> "model"); + while {true} do { + private _parent = inheritsFrom _config; + if ((getText (_parent >> "model")) != _model) exitWith {}; + _config = _parent; + }; + + private _out = []; + _out pushBack format [" class %1: %2 {", configName _config, configName inheritsFrom _config]; + _out pushBack format [" class ace_viewports {"]; + { + _x params ["_name", "", "_camLocation", "_camAttach"]; + _out pushBack format [' class %1 {', _name]; + _out pushBack format [' camLocation[] = {%1, %2, %3};', _camLocation # 0, _camLocation # 1, _camLocation # 2]; + _out pushBack format [' camAttach = %1;', _camAttach]; + // _out pushBack format [' type = "%1";', _type]; + // _out pushBack format [' screenLocation[] = {};']; + // _out pushBack format [' maxDistance = 99;']; + // _out pushBack format [' compartments[]={};']; + // _out pushBack format [' roles[]={};']; + _out pushBack format [' };']; + } forEach GVAR(3denViewports); + + _out pushBack format [' };']; + _out pushBack format [' };']; + + // Some inherited configs might use a different model which uses a different offset - yuck + private _inherited = '((configName _x) isKindOf (configName _config)) && {_model != getText (_x >> "model")}' configClasses (configFile >> "CfgVehicles"); + _out pushBack format ["// Watch out for %1", _inherited apply {configName _x}]; + + copyToClipboard (_out joinString endl); + systemChat format ["copied %1 lines", count _out]; + }; + if (_button == 0) exitWith { + private _vehicle = (get3DENSelected "object") param [0, objNull]; + if (isNull _vehicle) exitWith {}; + + private _start = AGLToASL positionCameraToWorld [0,0,0]; + private _end = AGLToASL screenToWorld [_mouseX, _mouseY]; + private _intersections = lineIntersectsSurfaces [_start, _end]; + private _pointASL = _intersections # 0 # 0; + if (isNil "_pointASL") exitWith {}; + _pointASL = _pointASL vectorAdd [0,0,0.09]; // Add a little bit up because it always sinks into the model + private _pointMS = _vehicle worldToModel ASLtoAGL _pointASL; + + private _name = format ["view_%1",GVAR(3denIndex)]; + // [_name, _type, _camLocation, _camAttach, _screenLocation, _maxDistance, _compartments, _roles] + GVAR(3denViewports) set [GVAR(3denIndex), [_name, "", _pointMS, 0, _pointMS, 99, [], []]]; + true + }; + }]; +}; + +// this runs in both threeden and in-game +addMissionEventHandler ["Draw3D", { + private _vehicle = vehicle player; + private _viewports = _vehicle getVariable [QGVAR(viewports), []]; + + if (is3den) then { + _vehicle = (get3DENSelected "object") param [0, objNull]; + if (isNull _vehicle) exitWith {}; + _viewports = [_vehicle] call FUNC(getViewports); + if (GVAR(3denViewports) isNotEqualTo []) then { + _viewports = GVAR(3denViewports); + }; + }; + if (isNull _vehicle) exitWith {}; + + + drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [1,1,0,1], _vehicle modelToWorldVisual [0,0,0], 0.1, 0.1, 0, "", 1, 0.02, "TahomaB"]; + if (alive player) then { // not using ace_player so this works in 3den + drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [0,1,0,1], aslToAGL eyepos player, 0.1, 0.1, 0, "eye", 1, 0.02, "TahomaB"]; + drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [0,1,0,1], player modelToWorldVisual (player selectionPosition "pilot"), 0.1, 0.1, 0, "pilot", 1, 0.02, "TahomaB"]; + }; + // { + // private _pos = _vehicle modelToWorldVisual (_vehicle selectionPosition [_x, "Memory"]); + // drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [0,0,1,0.2], _pos, 0.05, 0.05, 0, _x, 1, 0.02, "TahomaB"]; + // } forEach (_vehicle selectionNames "Memory"); + + + { + _x params ["_name", "_type", "_camLocation", "_camAttach", "_screenLocation", "_maxDistance", "_compartments", "_roles"]; + + if (_camLocation isEqualType "") then { + _camLocation = _vehicle selectionPosition [_camLocation, "Memory"]; + }; + + private _screenAGL = _vehicle modelToWorldVisual _screenLocation; + drawIcon3D ["#(argb,8,8,3)color(0,0,1,1)", [1,0.5,1,1], _screenAGL, 0.05, 0.05, 0, format ["%1:%2",_forEachIndex,_compartments], 1, 0.03, "TahomaB"]; + + private _camAGL = if (_camAttach isEqualType 0) then { + _vehicle modelToWorldVisual _camLocation + } else { + private _turretConfig = [_vehicle, _camAttach] call CBA_fnc_getTurret; + private _memoryPointGunnerOptics = getText(_turretConfig >> "memoryPointGunnerOptics"); + _vehicle modelToWorldVisual (_camLocation vectorAdd (_vehicle selectionPosition _memoryPointGunnerOptics)) + }; + drawIcon3D ["#(argb,8,8,3)color(1,0,0,1)", [0.5,1,1,1], _camAGL, 0.1, 0.1, 0, format ["%1:%2",_forEachIndex,_name], 1, 0.03, "TahomaB"]; + + if (_camAttach isEqualType 0) then { + private _camAGL = _vehicle modelToWorldVisual _camLocation; + drawIcon3D ["#(argb,8,8,3)color(1,0,0,1)", [1,1,1,1], _camAGL, 0.1, 0.1, 0, _name, 1, 0.05, "TahomaB"]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([1, _camAttach, 0] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [0,1,0,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([1, _camAttach, 1] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [0,1,0,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([1, _camAttach, -1] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [0,1,0,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([0.2, _camAttach+90, 0] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [1,0,1,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([0.2, _camAttach-90, 0] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [1,0,1.2,1]]; + }; + } forEach _viewports; +}]; diff --git a/addons/viewports/functions/fnc_eachFrame.sqf b/addons/viewports/functions/fnc_eachFrame.sqf new file mode 100644 index 0000000000..6bb452baad --- /dev/null +++ b/addons/viewports/functions/fnc_eachFrame.sqf @@ -0,0 +1,77 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Runs each frame while inside of a vehicle with viewports + * + * Arguments: + * 0: PFEH Args + * 0: Player + * 1: Vehicle + * 2: Viewport configuration + * 3: Viewport index shown (-1 for none) + * 4: Last visionmode + * + * Return Value: + * None + * + * Example: + * [] call ace_viewports_fnc_eachFrame + * + * Public: No + */ + +params ["_args", "_pfID"]; +_args params ["_player", "_vehicle", "_viewports", "_shownIndex", "_lastVisionMode"]; + +private _newIndex = -1; +if (cba_events_control) then { + if (cameraView != "INTERNAL") exitWith {}; + if (isTurnedOut _player) exitWith {}; + if (!([_player, _vehicle, []] call EFUNC(common,canInteractWith))) exitWith {}; + + BEGIN_COUNTER(newIndex); + if ((_shownIndex > -1) && {currentVisionMode _player != _lastVisionMode}) then { + // Vision Mode Changed - Force stop cam and restart + call FUNC(viewCleanup); + _shownIndex = -1; + }; + + ([_player] call FUNC(getSeatInfo)) params ["_role", "", "", "_comparment"]; + + private _newIndexAngle = 45; // Controls the max angle + private _eyesPosASL = AGLtoASL (positionCameraToWorld [0, 0, 0]); + private _eyesDir = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff _eyesPosASL; + { + _x params ["", "", "_camLocation", "", "_screenLocation", "_maxDistance", "_compartments", "_roles"]; + + private _viewASL = AGLtoASL (_vehicle modelToWorldVisual _screenLocation); + private _viewDiff = _viewASL vectorDiff _eyesPosASL; + private _viewAngle = acos (_viewDiff vectorCos _eyesDir); + #ifdef DEBUG_MODE_FULL + systemChat format ["%1: %2 @ %3",_forEachIndex,round _viewAngle, vectorMagnitude _viewDiff]; + #endif + if ( + (_viewAngle < _newIndexAngle) + && {(_compartments isEqualTo []) || {(toLower _comparment) in _compartments}} + && {(_roles isEqualTo []) || {(toLower _role) in _roles}} + && {(vectorMagnitude _viewDiff) < _maxDistance} + ) then { + _newIndex = _forEachIndex; + _newIndexAngle = _viewAngle; + }; + } forEach _viewports; + END_COUNTER(newIndex); +}; + +if (_shownIndex == _newIndex) exitWith {}; // No-change - fast exit + +if (_shownIndex > -1) then { + call FUNC(viewCleanup); +}; + +if (_newIndex > -1) then { + [_vehicle, _viewports # _newIndex, currentVisionMode _player] call FUNC(viewCreate); + _args set [4, currentVisionMode _player]; +}; + +_args set [3, _newIndex]; diff --git a/addons/viewports/functions/fnc_enterVehicle.sqf b/addons/viewports/functions/fnc_enterVehicle.sqf new file mode 100644 index 0000000000..ccec954060 --- /dev/null +++ b/addons/viewports/functions/fnc_enterVehicle.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Handle playerEH for new changing vehicle, check if it has any viewports and start PFEH + * + * Arguments: + * 0: player + * 1: vehicle + * + * Return Value: + * None + * + * Example: + * [player, vehicle player] call ace_viewports_fnc_enterVehicle + * + * Public: No + */ + +params ["_player", "_vehicle"]; +TRACE_2("enterVehicle",_player,_vehicle); + +if (GVAR(pfeh) != -1) then { + TRACE_1("cleaning up",GVAR(pfeh)); + [GVAR(pfeh)] call CBA_fnc_removePerFrameHandler; + GVAR(pfeh) = -1; + call FUNC(viewCleanup); +}; + +if (!GVAR(enabled)) exitWith {}; +if (_player == _vehicle) exitWith {}; + +private _viewports = [_vehicle] call FUNC(getViewports); +if (_viewports isEqualTo []) exitWith {}; + +GVAR(pfeh) = [LINKFUNC(eachFrame), 0, [_player, _vehicle, _viewports, -1, -1]] call CBA_fnc_addPerFrameHandler; +TRACE_3("start pfeh",GVAR(pfeh),typeOf _vehicle,count _viewports); diff --git a/addons/viewports/functions/fnc_getSeatInfo.sqf b/addons/viewports/functions/fnc_getSeatInfo.sqf new file mode 100644 index 0000000000..86dccebdd1 --- /dev/null +++ b/addons/viewports/functions/fnc_getSeatInfo.sqf @@ -0,0 +1,46 @@ +#include "..\script_component.hpp" +/* + * Author: Dystopian, PabstMirror + * Adapted from quickmount's addFreeSeatsActions + * + * Arguments: + * 0: Unit + * + * Return Value: + * ARRAY + * + * Example: + * [player] call ace_viewports_fnc_getSeatInfo + * + * Public: No + */ + +params ["_unit"]; + +private _vehicle = vehicle _unit; +if (_vehicle == _unit) exitWith { [] }; +private _vehicleConfig = configOf _vehicle; + +private _fullCrew = fullCrew [_vehicle, "", false]; +(_fullCrew select (_fullCrew findIf {_unit == _x select 0})) params ["", "_role", "_cargoIndex", "_turretPath"]; + +private _compartment = switch (_role) do { + case "driver": { + (_vehicleConfig >> "driverCompartments") call BIS_fnc_getCfgData + }; + case "cargo": { + // note: cargoNumber is different from the cargoIndex from fullCrew... + private _cargoNumber = fullCrew [_vehicle, "cargo", true] findIf {_unit == _x select 0}; + private _cargoCompartments = getArray (_vehicleConfig >> "cargoCompartments"); + private _cargoCompartmentsLast = count _cargoCompartments - 1; + _cargoCompartments select (_cargoNumber min _cargoCompartmentsLast) + }; + default { + private _turretConfig = [_vehicleConfig, _turretPath] call CBA_fnc_getTurret; + (_turretConfig >> "gunnerCompartments") call BIS_fnc_getCfgData + }; +}; + +if (!(_compartment isEqualType "")) then { _compartment = format ["Compartment%1",_compartment] }; + +[_role, _cargoIndex, _turretPath, _compartment] diff --git a/addons/viewports/functions/fnc_getViewports.sqf b/addons/viewports/functions/fnc_getViewports.sqf new file mode 100644 index 0000000000..32f97e18f6 --- /dev/null +++ b/addons/viewports/functions/fnc_getViewports.sqf @@ -0,0 +1,74 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Gets viewports for a vehicle from config. Caches results to a setVar on the vic. + * + * Arguments: + * 0: vehicle + * + * Return Value: + * ARRAY + * + * Example: + * [vehicle player] call ace_viewports_fnc_getViewports + * + * Public: No + */ + +params ["_vehicle"]; + +private _viewports = _vehicle getVariable [QGVAR(viewports), nil]; + +if (isNil "_viewports") then { + _viewports = (configProperties [(configOf _vehicle) >> "ace_viewports", "isClass _x", true]) apply { + // name [STRING] is just used for debug + private _name = configName _x; + // type [STRING] - Optional + private _type = getText (_x >> "type"); + // camLocation [ARRAY or STRING] - Required + private _camLocation = if (isArray (_x >> "camLocation")) then { + getArray (_x >> "camLocation") // modelOffset + } else { + getText (_x >> "camLocation") // memPoint + }; + // camAttach [ARRAY or NUMBER] - Required + private _camAttach = if (isArray (_x >> "camAttach")) then { + getArray (_x >> "camAttach") // turret + } else { + getNumber (_x >> "camAttach") // angle + }; + // screenLocation [ARRAY or STRING] - Optional (will be converted to ARRAY here!) + private _screenLocation = if (isArray (_x >> "screenLocation")) then { + getArray (_x >> "screenLocation") // modelOffset + } else { + getText (_x >> "screenLocation") // memPoint + }; + if (_screenLocation isEqualType "") then { + // screens should be on the hull (IE non-animated) so we can do all the mem-point calculations here + if (_screenLocation == "") exitWith { // use generic periscope drop height from cam + private _camLocArray = if (_camLocation isEqualType []) then { + _camLocation + } else { + _vehicle selectionPosition [_camLocation, "Memory"]; + }; + _screenLocation =_camLocArray vectorAdd [0,0,-0.175] + }; + _screenLocation = _vehicle selectionPosition [_screenLocation, "Memory"]; + }; + // maxDistance [NUMBER] - Optional + private _maxDistance = getNumber (_x >> "maxDistance"); + if (_maxDistance == 0) then { + _maxDistance = 0.8; + }; + // compartments [ARRAY] - Optional + private _compartments = (getArray (_x >> "compartments")) apply {toLower _x}; + // roles [ARRAY] - Optional + private _roles = (getArray (_x >> "roles")) apply {toLower _x}; + + [_name, _type, _camLocation, _camAttach, _screenLocation, _maxDistance, _compartments, _roles] + }; + TRACE_3("getViewports",_vehicle,typeOf _vehicle,count _viewports); + _vehicle setVariable [QGVAR(viewports), _viewports]; +}; + +_viewports diff --git a/addons/viewports/functions/fnc_viewCleanup.sqf b/addons/viewports/functions/fnc_viewCleanup.sqf new file mode 100644 index 0000000000..4759439a7e --- /dev/null +++ b/addons/viewports/functions/fnc_viewCleanup.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Cleans up existing viewport display and camera + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_viewports_fnc_viewCleanup + * + * Public: No + */ + +TRACE_1("camCleanup",_this); + +if (!isNull (missionNamespace getVariable [QGVAR(camera), objNull])) then { + GVAR(camera) cameraEffect ["terminate", "back", QGVAR(pip0)]; + camDestroy GVAR(camera); +}; + +private _display = uiNamespace getVariable [QGVAR(display), displayNull]; +if (!isNull _display) then { + QGVAR(display) cutText ["", "PLAIN"]; +}; diff --git a/addons/viewports/functions/fnc_viewCreate.sqf b/addons/viewports/functions/fnc_viewCreate.sqf new file mode 100644 index 0000000000..8b08da9575 --- /dev/null +++ b/addons/viewports/functions/fnc_viewCreate.sqf @@ -0,0 +1,129 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Creates a viewport display and camera + * + * Arguments: + * 0: Vehicle + * 1: Viewport + * 2: Player's vision mode + * + * Return Value: + * None + * + * Example: + * [...] call ace_viewports_fnc_viewCreate + * + * Public: No + */ + +params ["_vehicle", "_viewport", "_visionMode"]; +_viewport params ["_name", "_type", "_camLocation", "_camAttach"]; +TRACE_5("camCreate",_vehicle,_name,_type,_camLocation,_camAttach); + +private _usingGoggles = _visionMode > 0; + +if (_camLocation isEqualType "") then { + _camLocation = _vehicle selectionPosition [_camLocation, "Memory"]; + if (_camLocation isEqualTo [0,0,0]) then { WARNING_2("probably bad cam location %1:%2",typeOf _vehicle,_viewport); } +}; + +// Create Cam and attach it to vic +GVAR(camera) = "camera" camCreate getPos _vehicle; +if (_camAttach isEqualType 0) then { + // number - Static attach and set const direction + GVAR(camera) attachTo [_vehicle, _camLocation]; + GVAR(camera) setDir _camAttach; // could do pitch as well, but probably not needed +} else { + // array - Turret path, get gunner optic mem and bone-attach to it + private _turretConfig = [_vehicle, _camAttach] call CBA_fnc_getTurret; + private _memoryPointGunnerOptics = getText(_turretConfig >> "memoryPointGunnerOptics"); + GVAR(camera) attachTo [_vehicle, _camLocation, _memoryPointGunnerOptics, true]; +}; + +// Setup r2texture +GVAR(camera) cameraEffect ["INTERNAL", "BACK", QGVAR(pip0)]; +private _renderTexture = format ["#(argb,512,512,1)r2t(%1,1)", QGVAR(pip0)]; + +// Create blank display +QGVAR(display) cutRsc [QGVAR(display), "PLAIN", 0, false]; +private _display = uiNamespace getVariable [QGVAR(display), displayNull]; + + +// R2T aspect ratio parameter has no effect - it will match main video AR +// better to have ui elements squashed than to squash the R2T +private _screenAR = getResolution select 4; +private _camEffect = [0]; +private _camFov = 0.75; + + +switch (true) do { + case (_type == "screen"): { + // Generic "Squad Leader's Display" monitor showing turret cam + private _desiredAR = 1.25; + private _stretch = (_desiredAR / _screenAR) max 0.8 min 1.25; // define max stretch factor of pip texture (don't stretch more or less than this) + + private _viewHeight = 0.3 * safeZoneH; + private _viewWidth = _stretch * _viewHeight * _screenAR / 1.3333333333333; + + private _ctrlRender = _display ctrlCreate ["RscPicture", -1]; + _ctrlRender ctrlSetText _renderTexture; + _ctrlRender ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlRender ctrlCommit 0; + + private _ctrlOverlay = _display ctrlCreate ["RscPicture", -1]; + _ctrlOverlay ctrlSetText "\a3\weapons_f\reticle\data\optika_tv_ca.paa"; + _ctrlOverlay ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlOverlay ctrlCommit 0; + + if (_usingGoggles) then { + // Screen will be out of focus, too bright and not in IR; should be almost impossible to see anything useful + _camEffect = [3,1,1,0.1,0,[0,0,0,0],[1,1,1,0],[1,1,1,1]]; + + private _ctrlNVG = _display ctrlCreate ["RscPicture", -1]; + _ctrlNVG ctrlSetText "#(argb,8,8,3)color(1,1,0.6,0.9)"; + _ctrlNVG ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlNVG ctrlCommit 0; + } else { + _camEffect = [0]; // 2.08's currentVisionMode change could allow matching real turret's vision mode + }; + _camFov = 0.25; + }; + default { + // Generic periscope viewport + private _desiredAR = 3; + private _stretch = (_desiredAR / _screenAR) max 0.8 min 1.25; // define max stretch factor of pip texture + private _viewHeight = 0.3 * safeZoneH; + + if (_usingGoggles) then { + _camEffect = [_visionMode]; // pass-thru + // _camEffect = [3, true, 0.747773,0.791092,0,[0,0,0,0],[1.3,1.2,0,0.9],[6,1,1,0]]; + // Some periscope glass is IR Laser Safe (~1064nm) which is close to same wavelength as NVGs + // And cannot apply nvg and ace_nightvision effects to pip at same time, so just make it small and shitty... + _viewHeight = 0.45 * _viewHeight; + }; + private _viewWidth = _stretch * _viewHeight * _screenAR / 1.3333333333333; + + private _ctrlRender = _display ctrlCreate ["RscPicture", -1]; + _ctrlRender ctrlSetText _renderTexture; + _ctrlRender ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlRender ctrlCommit 0; + + if (_usingGoggles) then { + // Roughly try to color match ace_nvg, and make it semi-opaque + private _ctrlNVG = _display ctrlCreate ["RscPicture", -1]; + _ctrlNVG ctrlSetText "#(argb,8,8,3)color(0.25,0.2,0.05,0.75)"; + _ctrlNVG ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlNVG ctrlCommit 0; + }; + + private _ctrlOverlay = _display ctrlCreate ["RscPicture", -1]; + _ctrlOverlay ctrlSetText QPATHTOF(data\optic_window_ca.paa); + _ctrlOverlay ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlOverlay ctrlCommit 0; + }; +}; + +GVAR(camera) camSetFov _camFov; +QGVAR(pip0) setPiPEffect _camEffect; +GVAR(camera) camCommit 0; diff --git a/addons/viewports/gui.hpp b/addons/viewports/gui.hpp new file mode 100644 index 0000000000..50f036f0da --- /dev/null +++ b/addons/viewports/gui.hpp @@ -0,0 +1,11 @@ +class RscTitles { + class GVAR(display) { + idd = -1; + onLoad = QUOTE( with uiNameSpace do { GVAR(display) = _this select 0 }; ); + movingEnable = 0; + duration = 9999999; + fadeIn = 0; + fadeOut = 0; + class controls {}; + }; +}; diff --git a/addons/viewports/initSettings.sqf b/addons/viewports/initSettings.sqf new file mode 100644 index 0000000000..506d3c78a3 --- /dev/null +++ b/addons/viewports/initSettings.sqf @@ -0,0 +1,9 @@ +[ + QGVAR(enabled), "CHECKBOX", + [LELSTRING(common,Enabled), LLSTRING(setting_enabled_description)], + [ELSTRING(common,ACEKeybindCategoryVehicles), LSTRING(addon_displayname)], + true, + true, + {}, + false // Doesn't need full mission restart, but you have to exit and re-enter vic +] call CBA_fnc_addSetting; diff --git a/addons/viewports/script_component.hpp b/addons/viewports/script_component.hpp new file mode 100644 index 0000000000..587a3d3e4e --- /dev/null +++ b/addons/viewports/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT viewports +#define COMPONENT_BEAUTIFIED Viewports +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS +// #define POINT_CONFIG_DEBUG + +#ifdef DEBUG_ENABLED_VIEWPORTS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_VIEWPORTS + #define DEBUG_SETTINGS DEBUG_SETTINGS_VIEWPORTS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/viewports/stringtable.xml b/addons/viewports/stringtable.xml new file mode 100644 index 0000000000..c2f56ae4a8 --- /dev/null +++ b/addons/viewports/stringtable.xml @@ -0,0 +1,25 @@ + + + + + Viewports + ビューポート + 뷰포트 + 观察口 + Wizjery + Триплексы + Periscopios + Sichtfenster + + + Allows crew to look through periscopes + Pozwala załodze patrzeć przez peryskop + 乗組員がペリスコープを通して外を見ることができます + 승무원이 잠망경을 통해 볼 수 있도록 허용합니다 + 允许乘员通过观察口观察 + Разрешить экипажу смотреть сквозь перископ + Permite a la tripulación asomarse a través de los periscopios + Ermöglicht der Besatzung den Blick durch Periskope + + + diff --git a/addons/viewrestriction/CfgVehicles.hpp b/addons/viewrestriction/CfgVehicles.hpp index 24c0fa89bd..4b80829913 100644 --- a/addons/viewrestriction/CfgVehicles.hpp +++ b/addons/viewrestriction/CfgVehicles.hpp @@ -17,7 +17,7 @@ class CfgVehicles { class ACE_Module; class XGVAR(Module): ACE_Module { author = ECSTRING(common,ACETeam); - category = "ACEX"; + category = "ACE"; function = QFUNC(moduleInit); displayName = CSTRING(ModuleDisplayName); scope = 1; diff --git a/addons/viewrestriction/functions/fnc_canChangeCamera.sqf b/addons/viewrestriction/functions/fnc_canChangeCamera.sqf index 9114a23303..dc68825da7 100644 --- a/addons/viewrestriction/functions/fnc_canChangeCamera.sqf +++ b/addons/viewrestriction/functions/fnc_canChangeCamera.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Checks if camera can be changed. @@ -22,7 +22,7 @@ params ["_newCameraView", "_cameraOn", ["_checkGunnerView", true]]; // Remote control hates switchCamera (control returns to player, camera is left on remotely controlled object/unit), make sure remote controlled units are not impacted !(_newCameraView isEqualTo "GUNNER" && {_checkGunnerView}) && -{!(_newCameraView isEqualTo "GROUP")} && +{_newCameraView isNotEqualTo "GROUP"} && {!isNull ACE_player} && {player == ACE_player} && {alive ACE_player} && diff --git a/addons/viewrestriction/functions/fnc_changeCamera.sqf b/addons/viewrestriction/functions/fnc_changeCamera.sqf index c3f70d640a..6a1f7d03ff 100644 --- a/addons/viewrestriction/functions/fnc_changeCamera.sqf +++ b/addons/viewrestriction/functions/fnc_changeCamera.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Change camera based on setting. diff --git a/addons/viewrestriction/functions/fnc_moduleInit.sqf b/addons/viewrestriction/functions/fnc_moduleInit.sqf index 3859944761..12f7a36493 100644 --- a/addons/viewrestriction/functions/fnc_moduleInit.sqf +++ b/addons/viewrestriction/functions/fnc_moduleInit.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Initializes the View Restriction module. @@ -10,6 +10,8 @@ * * Return Value: * None + * + * Public: No */ params ["_logic", "_units", "_activated"]; diff --git a/addons/viewrestriction/functions/fnc_selectiveChangeCamera.sqf b/addons/viewrestriction/functions/fnc_selectiveChangeCamera.sqf index 916eda969e..ee26739ae4 100644 --- a/addons/viewrestriction/functions/fnc_selectiveChangeCamera.sqf +++ b/addons/viewrestriction/functions/fnc_selectiveChangeCamera.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Changes camera mode based on vehicle type the player is currently occupying. diff --git a/addons/viewrestriction/functions/fnc_switchPreserveView.sqf b/addons/viewrestriction/functions/fnc_switchPreserveView.sqf index 6de1b5b135..63cf8ba8b6 100644 --- a/addons/viewrestriction/functions/fnc_switchPreserveView.sqf +++ b/addons/viewrestriction/functions/fnc_switchPreserveView.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Controls View Preserving state. @@ -32,7 +32,7 @@ GVAR(preserveViewCameraViewEH) = ["cameraView", { private _vehicle = vehicle _player; private _vehicleClass = {if (_vehicle isKindOf _x) exitWith {_x}} forEach ["CAManBase", "LandVehicle", "Air", "Ship", "All"]; private _varName = QXGVAR(preserveView) + _vehicleClass; - if !(_cameraView isEqualTo (profileNamespace getVariable [_varName, ""])) then { + if (_cameraView isNotEqualTo (profileNamespace getVariable [_varName, ""])) then { profileNamespace setVariable [_varName, _cameraView]; }; }] call CBA_fnc_addPlayerEventHandler; @@ -44,7 +44,7 @@ GVAR(preserveViewVehicleEH) = ["vehicle", { private _vehicleClass = {if (_vehicle isKindOf _x) exitWith {_x}} forEach ["CAManBase", "LandVehicle", "Air", "Ship", "All"]; private _savedView = profileNamespace getVariable (QXGVAR(preserveView) + _vehicleClass); - if (!isNil "_savedView" && {!(_cameraView isEqualTo _savedView)}) then { + if (!isNil "_savedView" && {_cameraView isNotEqualTo _savedView}) then { _vehicle switchCamera _savedView; }; }, true] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/viewrestriction/functions/script_component.hpp b/addons/viewrestriction/functions/script_component.hpp deleted file mode 100644 index b3b0bcdf12..0000000000 --- a/addons/viewrestriction/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\viewrestriction\script_component.hpp" diff --git a/addons/viewrestriction/stringtable.xml b/addons/viewrestriction/stringtable.xml index 26785c662b..1f9a755eb8 100644 --- a/addons/viewrestriction/stringtable.xml +++ b/addons/viewrestriction/stringtable.xml @@ -9,11 +9,12 @@ 視点制限 시점 제한 Restriction Vue - 视野限制 + 人称限制 視野限制 Visualizza Restrizione Ограничение обзора Görüntüyü Kısıtla + Reestricción de Vista View restriction settings to limit the usage of 1st or 3rd person views globally or per vehicle type. @@ -22,11 +23,12 @@ 全体や車両ごとで使える視点を1人称か3人称視点のどちらかに制限します。 차량 유형별, 혹은 전체적으로 1,3인칭 시점 사용 제한 설정 La restriction de la vue limite l'usage de la vue à la 1ère/3ème personne globalement ou par type de véhicule. - 视野限制可以设定在全局或是局部状况下能用的视野模式。 + 人称限制可以设定在全局或是局部状况下能用的人称模式。 視野限制可以設定在全局或是局部狀況下能用的視野模式。 Visualizza le impostazioni di restrizione per limitare l'utilizzo di prima e terza persona a livello globale o per tipologia di veicolo. Настройки ограничения обзора при виде от 1-го или 3-го лица. Общие для всех, или Выборочные, в зависимости от техники. 1. veya 3. kişi görünümlerinin kullanımını genel olarak veya araç türüne göre sınırlamak için kısıtlama ayarlarını görüntüleyin. + Opciones de Reestricción de Vista para limitar el uso de 1º o 3º persona globalmente o según el tipo de vehículo. Mode @@ -41,6 +43,7 @@ Modalità Режим установок Mod + Modo Sets global mode. Default: Disabled @@ -50,11 +53,12 @@ グローバル モードの設定。(標準: 無効) 전체 모드를 사용합니다. 기본값: 사용 안 함 Mode global. Défaut: Désactivé - 设定全局的视野模式。预设:关闭 + 设定全局的人称模式。预设:关闭 設定全局的視野模式。預設:關閉 Imposta modalità globale. Default: Disabilitato Общие установки для всех. По умолчанию: Отключено. Global modu ayarlar. Varsayılan: Devre Dışı + Establece el modo global. Defecto: Deshabilitado (Selective) Foot @@ -64,11 +68,12 @@ (選択性) 地上 (선택) 보병 (Sélectif) A pied - (可选) 步行 + (可选)步行 (可選) 步行 (Selettiva) Piedi (Выборочные) Пешком (Seçilebilir) Ayakta + (Selectivo) Pie Selective mode on Foot. Default: Disabled (Requires Mode: Selective) @@ -78,11 +83,12 @@ 地上でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 보병 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif hors des véhicules. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在步行的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在步行的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在步行的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Piedi. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки без техники. По умолчанию: Отключено (требуется режим: Выборочные) Ayakta iken seçilen görüş modu. Varsayılan: Etkin Değil + Modo selectivo a pie. Defecto: Deshabilitado (Requiere Modo: Selectivo) (Selective) Land Vehicles @@ -92,11 +98,12 @@ (選択性) 地上車両 (선택) 지상 차량 (Sélectif) Véhicules terrestres - (可选) 陆上载具 + (可选)陆上载具 (可選) 陸上載具 (Selettiva) Veicoli Terrestri (Выборочные) Наземная техника (Seçilebilir) Kara Araçları + (Selectivo) Vehículos de tierra Selective mode in Land Vehicles. Default: Disabled (Requires Mode: Selective) @@ -106,11 +113,12 @@ 地上車両でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 차량 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les véhicules terrestres. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘陆上载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘陆上载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘陸上載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Veicoli Terrestri. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для наземной техники. По умолчанию: Отключено (требуется режим: Выборочные) Kara araçlarında iken seçilen görüş modu. Varsayılan: Etkin Değil + Modo selectivo en vehículos de tierra.Defecto: Deshabilitado (Requiere Modo: Selectivo) (Selective) Air Vehicles @@ -120,11 +128,12 @@ (選択性) 航空機 (선택) 항공기 (Sélectif) Véhicules aériens - (可选) 空中载具 + (可选)空中载具 (可選) 空中載具 (Selettiva) Veicolo Aerei (Выборочные) Авиатехника (Seçilebilir) Hava Araçları + (Selectivo) Vehículos aéreos Selective mode in Air Vehicles. Default: Disabled (Requires Mode: Selective) @@ -134,11 +143,12 @@ 航空機でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 항공기 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les véhicules aériens. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘空中载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘空中载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘空中載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Veicoli Aerei. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для авиатехники. По умолчанию: Отключено (требуется режим: Выборочные) Hava araçlarında iken seçilen görüş modu. Varsayılan: Etkin Değil + Modo selectivo en vehículos aéreos. Defecto: Deshabilitado (Requiere Modo: Selectivo) (Selective) Sea Vehicles @@ -148,11 +158,12 @@ (選択性) 船舶 (선택) 함선 (Sélectif) Véhicules marins - (可选) 水上载具 + (可选)水上载具 (可選) 水上載具 (Selettiva) Veicoli Marittimi (Выборочные) Водный транспорт (Seçilebilir) Deniz Araçları + (Selectivo) Vehículos marítimos Selective mode in Sea Vehicles. Default: Disabled (Requires Mode: Selective) @@ -162,11 +173,12 @@ 船舶でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 함선 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les véhicules marins. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘水上载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘水上载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘水上載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Veicoli Marittimi. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для водного транспорта. По умолчанию: Отключено (требуется режим: Выборочные) Deniz araçlarında iken seçilen görüş modu. Varsayılan: Etkin Değil + Modo selectivo en vehículos marítimos. Defecto: Deshabilitado (Requiere Modo: Selectivo) (Selective) UAVs @@ -176,11 +188,12 @@ (選択性) 無人機 (선택) 무인기 (Sélectif) Drones - (可选) 无人载具 + (可选)无人机 (可選) 無人載具 (Selettiva) UAV (Выборочные) Беспиплотники (Seçilebilir) IHA'lar + (Selectivo) VANTs Selective mode in UAVs. Default: Disabled (Requires Mode: Selective) @@ -190,11 +203,12 @@ 無人機でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 무인기 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les drones. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘无人载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘无人载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘無人載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su UAVi. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для беспилотников. По умолчанию: Отключено (требуется режим: Выборочные) IHA araçlarında iken seçilen görüş modu. Varsayılan: Etkin Değil + Modo selectivo en VANTs. Defecto: Deshabilitado (Requiere Modo: Selectivo) Disabled @@ -208,6 +222,7 @@ 關閉 Отключено Devre Dışı + Deshabilitado Forced 1st Person @@ -220,6 +235,7 @@ 強制使用第一人稱 От 1-го лица (принудительно) 1. Kişi Görüşüne Zorla + Forzada 1º persona Forced 3rd Person @@ -232,6 +248,7 @@ 強制使用第三人稱 От 3-го лица (принудительно) 3. Kişi Görüşüne Zorla + Forzada 3º persona Selective @@ -245,6 +262,7 @@ 使用可選設定 Выборочный Seçilebilinir + Selectivo Preserve view for vehicle types @@ -252,9 +270,11 @@ Запоминать вид для типов техники 車両の種類により視点を変更 保留載具的視野模式 - 保留载具的视野模式 + 保留载具的人称模式 Zachowaj ustawienie widoku dla pojazdów Araç türleri için görünümü koru + 차량 타입에 따른 시야 정보 저장 + Preservar vista para los tipos de vehículos Switch view on vehicle change to last used in this vehicle type (Requires Mode: Disabled) @@ -262,9 +282,11 @@ Переключать вид при смене техники на последний использованный в данном типе техники (требуется режим: Отключено) 車両の種類により最後に使用した視点へ切り替え (無効モードでのみ有効) 切換到載具時自動切換到上次最後使用的視野模式(需求模式:關閉) - 切换到载具时自动切换到上次最后使用的视野模式(需求模式:关闭) + 切换到载具时自动切换到上次最后使用的人称模式(需求模式:关闭) Zmień widok podczas zmiany pojazdu na ustawienie widoku z ostatniego używanego pojazdu tego typu (Wymaga Tryb: Wyłączony Araçlar için en son kullanılan bakış türünü kaydet. + 해당 차량 타입에서 마지막으로 사용했던 시야로 설정하여 봅니다 (모드 - 사용 안함 필요) + Cambiar vista en el cambio de vehículo hacia la última usada en ese tipo de vehículo (Requiere Modo: Deshabilitado) diff --git a/addons/volume/XEH_postInitClient.sqf b/addons/volume/XEH_postInitClient.sqf index 5f04a54400..2ce8f03a10 100644 --- a/addons/volume/XEH_postInitClient.sqf +++ b/addons/volume/XEH_postInitClient.sqf @@ -2,7 +2,7 @@ if (!hasInterface) exitWith {}; -["ACEX", QXGVAR(toggle), [LLSTRING(KeybindName), LLSTRING(KeybindDescription)], "", { +["ACE3 Common", QXGVAR(toggle), [LLSTRING(KeybindName), LLSTRING(KeybindDescription)], "", { if (!XGVAR(enabled)) exitWith { if (GVAR(isLowered)) then { call FUNC(restoreVolume); diff --git a/addons/volume/functions/fnc_lowerVolume.sqf b/addons/volume/functions/fnc_lowerVolume.sqf index 2248d87fb9..5e8658fb95 100644 --- a/addons/volume/functions/fnc_lowerVolume.sqf +++ b/addons/volume/functions/fnc_lowerVolume.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Lowers the game and music volume with values from ACE settings. diff --git a/addons/volume/functions/fnc_remind.sqf b/addons/volume/functions/fnc_remind.sqf index 29b546d791..ec9b26b064 100644 --- a/addons/volume/functions/fnc_remind.sqf +++ b/addons/volume/functions/fnc_remind.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Reminds about lowered volume. diff --git a/addons/volume/functions/fnc_restoreVolume.sqf b/addons/volume/functions/fnc_restoreVolume.sqf index bd38c0e017..6ebe2fc7db 100644 --- a/addons/volume/functions/fnc_restoreVolume.sqf +++ b/addons/volume/functions/fnc_restoreVolume.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Kingsley * Restores the game and music volume to what it was when the mission first started, diff --git a/addons/volume/functions/script_component.hpp b/addons/volume/functions/script_component.hpp deleted file mode 100644 index 46435ff93d..0000000000 --- a/addons/volume/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\volume\script_component.hpp" diff --git a/addons/volume/initSettings.sqf b/addons/volume/initSettings.sqf index 2f6782f5ab..8735f81527 100644 --- a/addons/volume/initSettings.sqf +++ b/addons/volume/initSettings.sqf @@ -14,7 +14,7 @@ "LIST", [LSTRING(Reduction), LSTRING(ReductionDescription)], format ["ACE %1", LLSTRING(Name)], - [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"], 0], + [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"], 5], false, {[QGVAR(reduction), _this] call EFUNC(common,cbaSettings_settingChanged)}, false @@ -25,7 +25,7 @@ "LIST", [LSTRING(FadeDelay), LSTRING(FadeDelayDescription)], format ["ACE %1", LLSTRING(Name)], - [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0s", "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s"], 0], + [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0s", "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s"], 1], false, {[QGVAR(fadeDelay), _this] call EFUNC(common,cbaSettings_settingChanged)}, false @@ -47,7 +47,7 @@ "CHECKBOX", [LSTRING(ShowNotification), LSTRING(ShowNotificationDescription)], format ["ACE %1", LLSTRING(Name)], - false, + true, false, {[QGVAR(showNotification), _this] call EFUNC(common,cbaSettings_settingChanged)}, false diff --git a/addons/volume/stringtable.xml b/addons/volume/stringtable.xml index 3c7a6cc65d..a7c75769c3 100644 --- a/addons/volume/stringtable.xml +++ b/addons/volume/stringtable.xml @@ -13,6 +13,7 @@ Громкость Głosność Ses + Volumen Toggle Volume @@ -26,6 +27,7 @@ Переключить громкость Przełącz Głosność Sesi Aç/Kapat + Activar control de volumen Toggle volume reduction. @@ -39,6 +41,7 @@ Переключает уменьшение громкости Przełącz redukcje głosności Ses azaltmayı aç / kapat. + Activar reducción de volumen. Lowered volume @@ -52,6 +55,7 @@ Громкость снижена Zmniejszona głosność Azaltılmış ses + Volumen reducido Restored volume @@ -59,11 +63,12 @@ 音量を戻しました Volume rétabli 음량 복구됨 - 回复音量 + 恢复音量 回復音量 Volume ripristinato Громкость восстановлена Przywrócona głosność + Volumen restaurado Reduction @@ -76,6 +81,7 @@ Riduzione Уменьшение Redukcja + Reducción Reduce volume by this percentage. @@ -88,6 +94,7 @@ Riduci il volume di questa percentuale. Уменьшает громкость Zmniejsz głosność o tyle procent + Reducir el volumen este porcentaje. Lower in vehicles @@ -101,19 +108,21 @@ Уменьшать в технике Zmniejsz w pojazdach Araçlarda Daha Düşük + Reducir en vehículos Automatically lower volume when inside vehicles. Verringere die Lautstärke innerhalb von Fahrzeugen automatisch. 車両内では自動的に音量を低減させます。 Réduit automatiquement le volume à l'intérieur des véhicules. - 자동으로 차량내에 있으면 음량을 감소 합니다. + 차량 내에 있으면 자동으로 음량을 감소시킵니다. 当搭乘载具时自动降低音量。 當搭乘載具時自動降低音量。 Riduce automaticamente il volume quando dentro i veicoli. Автоматически уменьшать громкость в технике Automatycznie zmniejsz głosność będąc w pojeździe Araçlara binince sesi azalt. + Reduce automáticamente el volumen dentro de vehículos. Show notification @@ -127,19 +136,21 @@ Показывать уведомление Pokaż powiadomienie Bildirim Göster + Mostrar notificación Show notification when lowering/restoring volume. Zeige Benachrichtigung, wenn Lautstärke verringert/wiederhergestellt wurde. 音量を低減、復元時に通知を表示します。 Affiche une notification lorsque le volume est réduit/rétabli. - 음량이 감소/복구될 때 메세지를 표시합니다. - 当正在降低/回复音量时显示提示。 + 음량이 감소/복구될 때 메시지를 표시합니다. + 当正在降低/恢复音量时显示提示。 當正在降低/回復音量時顯示提示。 Mostra notifiche mentre si abbassa/ripristina il volume. Показывать уведомление при уменьшении/восстановлении громкости Pokaż powiadomienie zmniejszając/odnawiając głosność Ses azaltıldığın da bildirim göster. + Mostrar notificación cuando se disminuye/restaura el volumen. Fade delay @@ -152,6 +163,7 @@ Latenza della dissolvenza Задержка затухания Opoznienie wyciszenia + Retardo en disminución gradual Time it takes (in seconds) for the sound to fade in/out. @@ -164,19 +176,21 @@ Il tempo che impiega (in secondi) il suono a dissolversi entrata/uscita. Время (сек.) для затухания/восстановления звука. Ilość czasu (w sekundach) ile zajmuje wyciszenie/zgłośnienie dźwięku + Tiempo que tarda (en segundos) para que se active o desactive la disminuación gradual del volumen Reminder if lowered Erinnere wenn verringert 低減時に通知 Rappel si réduit - 감소시 알림 + 감소 시 알림 降低音量时是否提醒 降低音量時是否提醒 Sollecita se diminuito Напоминать о снижении громкости Przypomnij o zmniejszonej głosności dźwięku Eğer Düşükse Hatırlat + Recordatorio s reducido Reminds you every minute if your volume is lowered. @@ -190,19 +204,21 @@ Ежеминутное напоминание о сниженной громкости Przypomina co minuten o zmniejszonej głosności dźwięku Eğer ses düşükse her dakika hatırlatır. + Te recuerda cada minuto si el volumen está siendo reducido. Volume still lowered Lautstärke noch immer verringert. 音量を低減中です Volume réduit - 음량 감소중 + 음량 감소 중 降低音量中 降低音量中 Il volume è ancora basso Громкость все еще снижена Dźwięk jest nadal zmniejszony Ses hala düşük + Volumen todavía reducido diff --git a/addons/weaponselect/XEH_postInit.sqf b/addons/weaponselect/XEH_postInit.sqf index 4706363271..4d2c6464b2 100644 --- a/addons/weaponselect/XEH_postInit.sqf +++ b/addons/weaponselect/XEH_postInit.sqf @@ -183,25 +183,25 @@ if (!hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call CBA_fnc_addKeybind; //Unbound (was 5 Key) -["ACE3 Vehicles", QGVAR(FireSmokeLauncher), localize LSTRING(FireSmokeLauncher), { - // Conditions: canInteract - if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if !(ACE_player != vehicle ACE_player && {ACE_player == commander vehicle ACE_player}) exitWith {false}; +// ["ACE3 Vehicles", QGVAR(FireSmokeLauncher), localize LSTRING(FireSmokeLauncher), { +// // Conditions: canInteract +// if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; +// // Conditions: specific +// if !(ACE_player != vehicle ACE_player && {ACE_player == commander vehicle ACE_player}) exitWith {false}; - // Statement - [vehicle ACE_player] call FUNC(fireSmokeLauncher); - true -}, -{false}, -[10, [false, false, false]], false] call CBA_fnc_addKeybind; //9 Key +// // Statement +// [vehicle ACE_player] call FUNC(fireSmokeLauncher); +// true +// }, +// {false}, +// [10, [false, false, false]], false] call CBA_fnc_addKeybind; //9 Key ["ACE3 Vehicles", QGVAR(CollisionLights), localize LSTRING(CollisionLights), { // Conditions: canInteract if (!([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith))) exitWith {false}; // Conditions: specific if ((ACE_player isEqualTo (vehicle ACE_player)) || {ACE_player != (driver (vehicle ACE_player))}) exitWith {false}; - + // Statement (vehicle ACE_player) setCollisionLight !(isCollisionLightOn (vehicle ACE_player)); true diff --git a/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf b/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf index c87047a787..f43a8f00da 100644 --- a/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf +++ b/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: esteldunedain, commy2 * Display a grenade type and quantity. diff --git a/addons/weaponselect/functions/fnc_fireSmokeLauncher.sqf b/addons/weaponselect/functions/fnc_fireSmokeLauncher.sqf index f1bd108926..16bac855cc 100644 --- a/addons/weaponselect/functions/fnc_fireSmokeLauncher.sqf +++ b/addons/weaponselect/functions/fnc_fireSmokeLauncher.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Fire Vehicle Smoke Launcher. diff --git a/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf b/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf index 8270ceb2d5..2be2d740ea 100644 --- a/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf +++ b/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Play weapon firemode change sound. diff --git a/addons/weaponselect/functions/fnc_putWeaponAway.sqf b/addons/weaponselect/functions/fnc_putWeaponAway.sqf index 0622d62ae0..6f3f2c51af 100644 --- a/addons/weaponselect/functions/fnc_putWeaponAway.sqf +++ b/addons/weaponselect/functions/fnc_putWeaponAway.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * The unit will put its current weapon away. diff --git a/addons/weaponselect/functions/fnc_selectNextGrenade.sqf b/addons/weaponselect/functions/fnc_selectNextGrenade.sqf index 21f07639f4..195bbc326b 100644 --- a/addons/weaponselect/functions/fnc_selectNextGrenade.sqf +++ b/addons/weaponselect/functions/fnc_selectNextGrenade.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Select the next grenade. diff --git a/addons/weaponselect/functions/fnc_selectWeaponMode.sqf b/addons/weaponselect/functions/fnc_selectWeaponMode.sqf index 8812a63525..f2810bb512 100644 --- a/addons/weaponselect/functions/fnc_selectWeaponMode.sqf +++ b/addons/weaponselect/functions/fnc_selectWeaponMode.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * The player will select the specified weapon or will change to the next firing mode if the weapon was already selected. diff --git a/addons/weaponselect/functions/fnc_selectWeaponMuzzle.sqf b/addons/weaponselect/functions/fnc_selectWeaponMuzzle.sqf index ff2d48baf4..9a27a515ad 100644 --- a/addons/weaponselect/functions/fnc_selectWeaponMuzzle.sqf +++ b/addons/weaponselect/functions/fnc_selectWeaponMuzzle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * The player will select the specified weapon and change to the first additional muzzle. E.g. the grenade launcher of a assault rifle. diff --git a/addons/weaponselect/functions/fnc_selectWeaponVehicle.sqf b/addons/weaponselect/functions/fnc_selectWeaponVehicle.sqf index b3fa528532..d332afdcdc 100644 --- a/addons/weaponselect/functions/fnc_selectWeaponVehicle.sqf +++ b/addons/weaponselect/functions/fnc_selectWeaponVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Select weapon for unit in vehicle. diff --git a/addons/weaponselect/functions/fnc_throwGrenade.sqf b/addons/weaponselect/functions/fnc_throwGrenade.sqf index 1214bdc84b..4856a7b738 100644 --- a/addons/weaponselect/functions/fnc_throwGrenade.sqf +++ b/addons/weaponselect/functions/fnc_throwGrenade.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: commy2 * Display Grenade information on grenade throw. Called from the unified fired EH only for the local player. diff --git a/addons/weaponselect/functions/script_component.hpp b/addons/weaponselect/functions/script_component.hpp deleted file mode 100644 index b7e33ed562..0000000000 --- a/addons/weaponselect/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\weaponselect\script_component.hpp" \ No newline at end of file diff --git a/addons/weaponselect/initSettings.sqf b/addons/weaponselect/initSettings.sqf index b39251d0b8..029c5201cb 100644 --- a/addons/weaponselect/initSettings.sqf +++ b/addons/weaponselect/initSettings.sqf @@ -1,8 +1,8 @@ -// CBA Settings [ADDON: ace_weaponselect]: - -[QGVAR(displayText), "CHECKBOX", -[LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], -localize ELSTRING(common,ACEKeybindCategoryWeapons), -true, // default value -false, // isGlobal -{[QGVAR(displayText), _this] call EFUNC(common,cbaSettings_settingChanged)}] call CBA_fnc_addSetting; +[ + QGVAR(displayText), "CHECKBOX", + [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], + ELSTRING(common,ACEKeybindCategoryWeapons), + true, // default value + false, // isGlobal + {[QGVAR(displayText), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 185cfdc948..37410f70a2 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -13,8 +13,8 @@ Mostra indicazioni nel lancio granate Mostrat texto ao lançar granada 手榴弾を投げるときに通知 - 수류탄 투척시 화면에 문자 표시 - 投掷手榴弹时显示提示讯息 + 수류탄 투척 시 화면에 문자 표시 + 投掷手榴弹时显示提示信息 投擲手榴彈時顯示提示訊息 @@ -29,8 +29,8 @@ Mostra una notifica quando si lanciano granate Mostra um hint ou texto ao lançar uma granada 手榴弾を投げるときに、ヒントか文で通知します。 - 수류탄 투척시 화면에 문자나 힌트를 표시합니다. - 投掷手榴弹时显示提示讯息。 + 수류탄 투척 시 화면에 문자나 힌트를 표시합니다. + 投掷手榴弹时显示提示信息。 投擲手榴彈時顯示提示訊息 @@ -397,7 +397,7 @@ 切换碰撞灯 衝突防止灯を切り替え Przełącz światła kolizyjne - Вкл/Выкл Бортовые огни + Переключить бортовые огни Alternar Luzes de Colisão Alternar luces de colisión Přepnout kolizní světla diff --git a/addons/weather/RscTitles.hpp b/addons/weather/RscTitles.hpp index d89c8d0671..4b338f87cc 100644 --- a/addons/weather/RscTitles.hpp +++ b/addons/weather/RscTitles.hpp @@ -17,7 +17,7 @@ class RscTitles { x="SafeZoneX + 0.001"; y="SafeZoneY + 0.001"; w=0.2; - h=0.2*4/3; + h="0.2*4/3"; size=0.034; sizeEx=0.027; text=""; diff --git a/addons/weather/functions/fnc_calculateAirDensity.sqf b/addons/weather/functions/fnc_calculateAirDensity.sqf index 43da78eab9..6bab73618f 100644 --- a/addons/weather/functions/fnc_calculateAirDensity.sqf +++ b/addons/weather/functions/fnc_calculateAirDensity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the air density diff --git a/addons/weather/functions/fnc_calculateBarometricPressure.sqf b/addons/weather/functions/fnc_calculateBarometricPressure.sqf index 70cdf370bf..abd9cc00bd 100644 --- a/addons/weather/functions/fnc_calculateBarometricPressure.sqf +++ b/addons/weather/functions/fnc_calculateBarometricPressure.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the barometric pressure based on altitude and weather diff --git a/addons/weather/functions/fnc_calculateDensityAltitude.sqf b/addons/weather/functions/fnc_calculateDensityAltitude.sqf index fdfe57877d..3a3d0dad10 100644 --- a/addons/weather/functions/fnc_calculateDensityAltitude.sqf +++ b/addons/weather/functions/fnc_calculateDensityAltitude.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates density altitude for a given air density diff --git a/addons/weather/functions/fnc_calculateDewPoint.sqf b/addons/weather/functions/fnc_calculateDewPoint.sqf index 5f020f47d1..441be06d32 100644 --- a/addons/weather/functions/fnc_calculateDewPoint.sqf +++ b/addons/weather/functions/fnc_calculateDewPoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates dew point based on temperature and relative humidity diff --git a/addons/weather/functions/fnc_calculateHeatIndex.sqf b/addons/weather/functions/fnc_calculateHeatIndex.sqf index de333d801f..3548326917 100644 --- a/addons/weather/functions/fnc_calculateHeatIndex.sqf +++ b/addons/weather/functions/fnc_calculateHeatIndex.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates heat index based on temperature and relative humidity diff --git a/addons/weather/functions/fnc_calculateRoughnessLength.sqf b/addons/weather/functions/fnc_calculateRoughnessLength.sqf index 57723355e8..252ed8a957 100644 --- a/addons/weather/functions/fnc_calculateRoughnessLength.sqf +++ b/addons/weather/functions/fnc_calculateRoughnessLength.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the terrain roughness length at a given world position @@ -19,18 +19,18 @@ #define ROUGHNESS_LENGTHS [0.0002, 0.0005, 0.0024, 0.03, 0.055, 0.1, 0.2, 0.4, 0.8, 1.6] private _windSource = _this vectorDiff ((vectorNormalized wind) vectorMultiply 25); -private _nearBuildings = { +private _nearBuildingCount = { // Filter lights - fixes high roughness on airports (#6602) str _x find "light" == -1 -} count (_windSource nearObjects ["Building", 50]); +} count (ASLToAGL _windSource nearObjects ["Building", 50]); private _isWater = surfaceIsWater _windSource; -if (_nearBuildings == 0 && _isWater) exitWith { +if (_nearBuildingCount == 0 && _isWater) exitWith { 0.0005 }; -if (_nearBuildings >= 10) exitWith { +if (_nearBuildingCount >= 10) exitWith { 1.6 }; -ROUGHNESS_LENGTHS select (2 + (_nearBuildings min 6)) +ROUGHNESS_LENGTHS select (2 + (_nearBuildingCount min 6)) diff --git a/addons/weather/functions/fnc_calculateSpeedOfSound.sqf b/addons/weather/functions/fnc_calculateSpeedOfSound.sqf index 90d524e560..755769d39a 100644 --- a/addons/weather/functions/fnc_calculateSpeedOfSound.sqf +++ b/addons/weather/functions/fnc_calculateSpeedOfSound.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the speed of sound for a given temperature diff --git a/addons/weather/functions/fnc_calculateTemperatureAtHeight.sqf b/addons/weather/functions/fnc_calculateTemperatureAtHeight.sqf index c392b15900..8e3b9b624e 100644 --- a/addons/weather/functions/fnc_calculateTemperatureAtHeight.sqf +++ b/addons/weather/functions/fnc_calculateTemperatureAtHeight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the temperature based on altitude and weather diff --git a/addons/weather/functions/fnc_calculateWetBulb.sqf b/addons/weather/functions/fnc_calculateWetBulb.sqf index 5ebb497a16..16527771f6 100644 --- a/addons/weather/functions/fnc_calculateWetBulb.sqf +++ b/addons/weather/functions/fnc_calculateWetBulb.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates wet bulb based on temperature and relative humidity diff --git a/addons/weather/functions/fnc_calculateWindChill.sqf b/addons/weather/functions/fnc_calculateWindChill.sqf index f657cba638..3145839c00 100644 --- a/addons/weather/functions/fnc_calculateWindChill.sqf +++ b/addons/weather/functions/fnc_calculateWindChill.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates wind chill based on temperature and wind speed @@ -23,5 +23,5 @@ params ["_t", "_v"]; if (_t > 10) exitWith { _t }; if (_v < 1.39) exitWith { _t }; -_v = _v * 3,6; // wind speed in km/h +_v = _v * 3.6; // wind speed in km/h (13.12 + 0.6215 * _t - 11.37 * _v ^ 0.16 + 0.3965 * _t * _v ^ 0.16) diff --git a/addons/weather/functions/fnc_calculateWindSpeed.sqf b/addons/weather/functions/fnc_calculateWindSpeed.sqf index f14d6dfbfc..2ae1d94eec 100644 --- a/addons/weather/functions/fnc_calculateWindSpeed.sqf +++ b/addons/weather/functions/fnc_calculateWindSpeed.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Calculates the true wind speed at a given world position diff --git a/addons/weather/functions/fnc_displayAirTemp.sqf b/addons/weather/functions/fnc_displayAirTemp.sqf index e32d60a159..4eb5bdf3ac 100644 --- a/addons/weather/functions/fnc_displayAirTemp.sqf +++ b/addons/weather/functions/fnc_displayAirTemp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: LorenLuke * Displays an abstracted depiction of air temperature to a unit. @@ -17,10 +17,10 @@ */ params ["_apparent_temperature", "_bias"]; -TRACE_2("params",_temperature, _bias); +TRACE_2("displayAirTemp",_apparent_temperature, _bias); -_temperature1 = floor(_temperature + (_bias select 0) - (random 2)); -_temperature2 = floor(_temperature + (_bias select 1) + (random 2)); +private _temperature1 = floor(_apparent_temperature + (_bias select 0) - (random 2)); +private _temperature2 = floor(_apparent_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 @@ -41,8 +41,6 @@ private _color2 = [ _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; diff --git a/addons/weather/functions/fnc_displayWindInfo.sqf b/addons/weather/functions/fnc_displayWindInfo.sqf index 35c840bf85..d7c45e595a 100644 --- a/addons/weather/functions/fnc_displayWindInfo.sqf +++ b/addons/weather/functions/fnc_displayWindInfo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Displays a wind info (colored arrow) in the top left corner of the screen diff --git a/addons/weather/functions/fnc_getApproximateAirTemp.sqf b/addons/weather/functions/fnc_getApproximateAirTemp.sqf index e9d00570df..33227907a3 100644 --- a/addons/weather/functions/fnc_getApproximateAirTemp.sqf +++ b/addons/weather/functions/fnc_getApproximateAirTemp.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: LorenLuke * Returns an approximate representation of temperature at a unit's location. diff --git a/addons/weather/functions/fnc_getMapData.sqf b/addons/weather/functions/fnc_getMapData.sqf index 20a8f1df70..d80573c286 100644 --- a/addons/weather/functions/fnc_getMapData.sqf +++ b/addons/weather/functions/fnc_getMapData.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg, esteldunedain * Get the weather data for the current map diff --git a/addons/weather/functions/fnc_initModuleSettings.sqf b/addons/weather/functions/fnc_initModuleSettings.sqf index 3b306398f9..cd00bd0e95 100644 --- a/addons/weather/functions/fnc_initModuleSettings.sqf +++ b/addons/weather/functions/fnc_initModuleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * Module for adjusting the wind deflection settings diff --git a/addons/weather/functions/fnc_initWind.sqf b/addons/weather/functions/fnc_initWind.sqf index 29e4e7dbe8..45d444912d 100644 --- a/addons/weather/functions/fnc_initWind.sqf +++ b/addons/weather/functions/fnc_initWind.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Inits the wind variables on the server (on mission start) diff --git a/addons/weather/functions/fnc_updateHumidity.sqf b/addons/weather/functions/fnc_updateHumidity.sqf index 2660076f9f..afbdb61d0c 100644 --- a/addons/weather/functions/fnc_updateHumidity.sqf +++ b/addons/weather/functions/fnc_updateHumidity.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE2 Team * Smoothly updates GVAR(currentHumidity) on the server (based on time of day and map data) diff --git a/addons/weather/functions/fnc_updateTemperature.sqf b/addons/weather/functions/fnc_updateTemperature.sqf index ea7a84a269..3036171145 100644 --- a/addons/weather/functions/fnc_updateTemperature.sqf +++ b/addons/weather/functions/fnc_updateTemperature.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE2 Team * Smoothly updates GVAR(currentTemperature) on the server (based on time of day and map data) diff --git a/addons/weather/functions/fnc_updateWeather.sqf b/addons/weather/functions/fnc_updateWeather.sqf index c573d190ce..b5495d67c5 100644 --- a/addons/weather/functions/fnc_updateWeather.sqf +++ b/addons/weather/functions/fnc_updateWeather.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE2 Team, esteldunedain, Ruthberg * Updates the weather evolution on the server. Broadcasts relevant weather information to the clients. diff --git a/addons/weather/functions/fnc_updateWind.sqf b/addons/weather/functions/fnc_updateWind.sqf index 569179dce8..0a821b19c0 100644 --- a/addons/weather/functions/fnc_updateWind.sqf +++ b/addons/weather/functions/fnc_updateWind.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: ACE2 Team, Ruthberg * Smoothly updates wind on the server (based on time of year and map data) diff --git a/addons/weather/functions/script_component.hpp b/addons/weather/functions/script_component.hpp deleted file mode 100644 index e1916225e8..0000000000 --- a/addons/weather/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\weather\script_component.hpp" \ No newline at end of file diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 82e0006843..f8f649fb48 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -14,7 +14,7 @@ Mostrar informação do vento 風速を表示 바람 정보 표시 - 显示风力资讯 + 显示风力信息 顯示風力資訊 Rüzgar Bilgilerini Göster @@ -31,7 +31,7 @@ Mostrar informação do vento (alternar) 風速を表示 (切り替え) 바람 정보 표시 (토글) - 显示风力资讯(切换) + 显示风力信息(切换) 顯示風力資訊(切換) Rüzgar Bilgilerini Göster (Değiştir) @@ -47,7 +47,7 @@ Погода Meteo 天候 - 기후 + 날씨 天气 天氣 Hava Durumu @@ -65,7 +65,7 @@ Modulo Sincronizzazione Meteo ACE Multiplayer ACE 天候モジュールではマルチプレイで同期します。 ACE 기후 모듈과 멀티플레이가 동기화됩니다. - 使用ACE天气模块来同步所有客户端的天气状态(多人游戏) + 使用 ACE 天气模块来同步所有客户端的天气状态(多人游戏) 使用ACE天氣模塊來同步所有客戶端的天氣狀態(多人遊戲) Çok oyunculu ACE @@ -81,7 +81,7 @@ Погода ACE Meteo ACE ACE 天候 - ACE 기후 + ACE 날씨 ACE 天气 ACE 天氣 ACE Hava Durumu @@ -131,8 +131,8 @@ Определяет интервал (в секундах) между обновлениями погоды Definisce l'intervallo(in secondi) tra aggiornamenti del meteo 天候を更新する間隔を定義します。(秒) - 기후를 갱신 하는 간격을 초 단위로 정합니다. - 设定天气更新的时间间隔(秒) + 기후를 갱신하는 간격을 초 단위로 정합니다. + 设定天气更新的时间间隔(秒) 設定天氣更新的時間間隔(秒) Hava durumu güncellemeleri arasındaki aralığı (saniye) tanımlar @@ -141,7 +141,7 @@ Wind Simulation (kartenbasiert) Simulazione del Vento (basato sulla mappa) 風力模擬(基於地圖) - 风力模拟(基于地图) + 风力模拟(基于地图) 風シミュレーション (マップを基に) 바람 시뮬레이션 (지도 기반) Symulacja Wiatru (bazowana na mapie) @@ -157,9 +157,9 @@ Aktiviert die kartenbasierte Windsimulation (überschreibt Vanilla Wind) Abilita la simulazione del vento basato sulla mappa (sovrascrive il vento vanilla) 啟用後將遵照地圖特色進行風力模擬(覆蓋掉官方原版的風力模擬) - 启用后将遵照地图特色进行风力模拟(覆盖掉官方原版的风力模拟) + 启用后将遵照地图特色进行风力模拟(覆盖掉官方原版的风力模拟) マップを基にした風シミュレーションを有効化 (標準の風を上書き) - 지도 기반의 바람 시뮬레이션을 활성화합니다 (바닐라 바람을 덮음) + 지도 기반의 바람 시뮬레이션을 활성화합니다. (바닐라 바람을 덮음) 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) @@ -172,6 +172,7 @@ Check Air Temperature Überprüfe Lufttemperatur 檢查氣溫 + 检查气温 Controllare la temperatura dell'aria Zkontrolovat teplotu vzduchu 気温を確認 @@ -181,11 +182,13 @@ Hava Sıcaklığını Kontrol Et Проверить температуру воздуха Comprobar temperatura de aire + 기온 측정하기 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 気温の確認動作を表示 @@ -195,6 +198,7 @@ Hava Sıcaklığını Kontrol Etme Eylemini Göster Показывать действие проверки температуры Mostrar acción de comprobar temperatura de aire + 상호작용에서 기온 측정하기 표시 diff --git a/addons/winddeflection/functions/fnc_handleFired.sqf b/addons/winddeflection/functions/fnc_handleFired.sqf index df1e1665df..e4b547c032 100644 --- a/addons/winddeflection/functions/fnc_handleFired.sqf +++ b/addons/winddeflection/functions/fnc_handleFired.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * Handles wind deflection for projectiles. Called from the unified fired EH only for players on foot and their vehicles if required by settings. diff --git a/addons/winddeflection/functions/fnc_initModuleSettings.sqf b/addons/winddeflection/functions/fnc_initModuleSettings.sqf index c980a05470..58fc1b2f17 100644 --- a/addons/winddeflection/functions/fnc_initModuleSettings.sqf +++ b/addons/winddeflection/functions/fnc_initModuleSettings.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * Module for adjusting the wind deflection settings diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index 9c5b752b24..4ebea1f507 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal, Ruthberg * Handles wind deflection for projectiles. diff --git a/addons/winddeflection/functions/script_component.hpp b/addons/winddeflection/functions/script_component.hpp deleted file mode 100644 index ea22ecb35c..0000000000 --- a/addons/winddeflection/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\winddeflection\script_component.hpp" diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index f9b0ca56e4..03acec7e34 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -14,7 +14,7 @@ Informação do vento 風の情報 바람 정보 - 风力资讯 + 风力信息 風力資訊 Rüzgar Bilgisi @@ -30,8 +30,8 @@ Direzione: %1° Direção: %1 風向: %1 - 방향: %1 - 风向: %1 + 풍향: %1 + 风向:%1 風向: %1 Yön: %1 @@ -48,7 +48,7 @@ Velocidade: %1 m/s 風速: %1 m/s 풍속: %1 m/s - 风速: %1 m/s + 风速:%1 m/s 風速: %1 m/s Hız: %1 m/s @@ -65,7 +65,7 @@ Informação Meteorológica 天候の情報 기상 정보 - 天气资讯 + 天气信息 天氣資訊 Hava Durumu Bilgisi @@ -82,7 +82,7 @@ Humidade: %1% 湿度: %1% 습도: %1% - 湿度: %1% + 湿度:%1% 濕度: %1% Nem Oranı: %1% @@ -99,7 +99,7 @@ Deviazione del Vento 風向の変化 풍향 변화 - 风偏 + 弹道风偏 風偏 Rüzgar Sapması @@ -116,7 +116,7 @@ Deviazione del Vento 風向の変化 풍향 변화 - 风偏 + 弹道风偏 風偏 Rüzgar Sapması @@ -133,7 +133,7 @@ Abilita deviazione del vento 風向の変化を有効化 풍향 변화를 적용합니다 - 开启风偏效果 + 开启弹道风偏效果 開啟風偏效果 Rüzgar sapmasını aktif et @@ -150,7 +150,7 @@ Abilita per Veicoli 車両へ有効化 차량 적용 - 启用风偏给载具 + 给载具启用弹道风偏 啟用風偏給載具 Araçlar da etkin @@ -167,7 +167,7 @@ Abilita deviazione del vento per artiglieri di statiche/veicoli 重火器や車両へ、風向の変化を有効化 차량이나 거치식 무기 사수에게 풍향 변화를 적용합니다 - 使风偏作用在固定式武器与载具炮手身上 + 使弹道风偏作用在固定式武器与载具炮手身上 使風偏作用在固定式武器與載具砲手身上 Araç nişancıları için rüzgar sapmasını etkinleştirir. diff --git a/addons/xm157/$PBOPREFIX$ b/addons/xm157/$PBOPREFIX$ new file mode 100644 index 0000000000..2bddd0ac4e --- /dev/null +++ b/addons/xm157/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\xm157 \ No newline at end of file diff --git a/addons/xm157/CfgEventHandlers.hpp b/addons/xm157/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a3f71f852 --- /dev/null +++ b/addons/xm157/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/xm157/CfgSounds.hpp b/addons/xm157/CfgSounds.hpp new file mode 100644 index 0000000000..6b9b81496b --- /dev/null +++ b/addons/xm157/CfgSounds.hpp @@ -0,0 +1,6 @@ +class CfgSounds { + class GVAR(click) { + sound[] = {QPATHTOF(sounds\click.wav), "db-30", 3}; + titles[] = {}; + }; +}; diff --git a/addons/xm157/CfgWeapons.hpp b/addons/xm157/CfgWeapons.hpp new file mode 100644 index 0000000000..cfa8197f48 --- /dev/null +++ b/addons/xm157/CfgWeapons.hpp @@ -0,0 +1,49 @@ +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class ace_xm157_prototype: ItemCore { + author = ECSTRING(common,ACETeam); + scope = 1; // hidden + displayName = "XM157 Prototype"; + descriptionShort = ""; + picture = "\a3\Weapons_F\acc\Data\UI\icon_optic_tws_ca.paa"; + model = "\A3\weapons_f\acc\acco_tws_F"; + inertia = 0.3; + ACE_ScopeHeightAboveRail = 5.52874; + + class CBA_ScriptedOptic { + bodyTexture = QPATHTOF(data\ace_vector_body_co.paa); + // bodyTextureNight = ".paa"; // optional + bodyTextureSize = 1; + hideMagnification = 1; // no point, and it flickers at 1x + disableTilt = 0; + }; + + weaponInfoType = QGVAR(info); + class ItemInfo: InventoryOpticsItem_Base_F { + mass = 14; + optics = 1; + modelOptics = "\x\cba\addons\optics\cba_optic_big_100.p3d"; + class OpticsModes { + class lpvo { + opticsID = 1; + useModelOptics = 1; + opticsPPEffects[] = { "OpticsCHAbera1", "OpticsBlur1" }; + opticsZoomMin = "8 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')"; + opticsZoomMax = "1 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')"; + opticsZoomInit = "1 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')"; + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + distanceZoomMin = 100; + distanceZoomMax = 100; + memoryPointCamera = "opticView"; + visionMode[] = {"Normal"}; + opticsFlare = 1; + opticsDisablePeripherialVision = 1; + cameraDir = ""; + }; + }; + }; + }; +}; diff --git a/addons/xm157/README.md b/addons/xm157/README.md new file mode 100644 index 0000000000..55a0696216 --- /dev/null +++ b/addons/xm157/README.md @@ -0,0 +1,2 @@ +ace_xm157 +========== diff --git a/addons/xm157/RscInGameUI.hpp b/addons/xm157/RscInGameUI.hpp new file mode 100644 index 0000000000..f08e79d451 --- /dev/null +++ b/addons/xm157/RscInGameUI.hpp @@ -0,0 +1,79 @@ +class RscObject; +class RscControlsGroupNoScrollbars; + +class RscText; +class GVAR(text): RscText { + font = "EtelkaMonospacePro"; + SizeEx = 0.04; + colorText[]={1,0.1,0.05,0.95}; + shadow = 0; +}; +class GVAR(textMenu): GVAR(text) { + SizeEx = 0.09; + style = "2+16"; +}; + +class RscInGameUI { + class CBA_ScriptedOptic_zooming; + class GVAR(info): CBA_ScriptedOptic_zooming { + onLoad = QUOTE(call FUNC(weaponInfo_onLoad)); + class objects { + class Optic: RscObject { // first focal plane + idc = IDC_SCOPE_OBJECT; + type = 82; + model = "\A3\Misc_F\Helpers\UserTexture1m.p3d"; + x = 0; + y = 0; + z = 0; + xBack = 0.9; + yBack = 0.9; + zBack = 0.3; + inBack = 0; + enableZoom = 1; + zoomDuration = 0.001; + class Areas { + class usertexture { + selection = "usertexture"; + class controls { + class test: RscControlsGroupNoScrollbars { + idc = IDC_SCOPE_GROUP; + x = 0; + y = 0; + w = 1; + h = "4/3"; + }; + }; + }; + }; + }; + class Screen: RscObject { + idc = IDC_SCREEN_OBJECT; + type = 82; + model = "\A3\Misc_F\Helpers\UserTexture1m.p3d"; + x = 0; + y = 0; + z = 0; + xBack = 0.9; + yBack = 0.9; + zBack = 0.3; + inBack = 1; + enableZoom = 1; + zoomDuration = 0.001; + class Areas { + class usertexture { + selection = "usertexture"; + class controls { + class test: RscControlsGroupNoScrollbars { + idc = IDC_SCREEN_GROUP; + x = 0; + y = 0; + w = 1; + h = "4/3"; + }; + }; + }; + }; + }; + }; + }; +}; diff --git a/addons/xm157/XEH_PREP.hpp b/addons/xm157/XEH_PREP.hpp new file mode 100644 index 0000000000..56613ffe34 --- /dev/null +++ b/addons/xm157/XEH_PREP.hpp @@ -0,0 +1,8 @@ +LOG("prep"); + +PREP(ballistics_calculator); +PREP(ballistics_getData); +PREP(keyPress); +PREP(weaponInfo_draw); +PREP(weaponInfo_drawMenu); +PREP(weaponInfo_onLoad); diff --git a/addons/xm157/XEH_postInit.sqf b/addons/xm157/XEH_postInit.sqf new file mode 100644 index 0000000000..8b77f466c8 --- /dev/null +++ b/addons/xm157/XEH_postInit.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +GVAR(shown) = false; +GVAR(data) = createHashMap; +GVAR(data) set ["latitude", EGVAR(common,mapLatitude)]; + + +// Add Keybinds +["ACE3 Equipment", QGVAR(range), [format ["XM157 - %1", localize "str_a3_rscdisplayarsenal_stat_range"]], { + ["range", true] call FUNC(keyPress); +}, { + ["range", false] call FUNC(keyPress); +}, [DIK_TAB, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(left), [format ["XM157 - %1", localize "str_a3_left"]], { + ["right", true] call FUNC(keyPress); +}, { + ["right", false] call FUNC(keyPress); +}, [DIK_END, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(right), [format ["XM157 - %1", localize "str_a3_right"]], { + ["left", true] call FUNC(keyPress); +}, { + ["left", false] call FUNC(keyPress); +}, [DIK_DELETE, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(up), [format ["XM157 - %1", localize "str_a3_rscattributetargetstate_up"]], { + ["up", true] call FUNC(keyPress); +}, { + ["up", false] call FUNC(keyPress); +}, [DIK_PGUP, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(down), [format ["XM157 - %1", localize "str_a3_rscattributetargetstate_down"]], { + ["down", true] call FUNC(keyPress); +}, { + ["down", false] call FUNC(keyPress); +}, [DIK_PGDN, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + + + +#ifdef ENABLE_QUICK_TESTING +player addPrimaryWeaponItem "ace_xm157_prototype"; +[player] call CBA_fnc_addUnitTrackProjectiles; +player addItem "ACE_ATragMX"; +player addItem "ace_rangecard"; + +["recompile", "recompile", "recompile", { + private _start = diag_tickTime; + [] call ACE_PREP_RECOMPILE; + [] call ace_common_fnc_dumpPerformanceCounters; + private _end = diag_tickTime; + systemChat format ["recompile took [%1 ms]", (1000 * (_end - _start)) toFixed 1]; + + if (productVersion #4 == "Diag") then { + call compile "diag_mergeConfigFile ['P:\z\ace\addons\xm157\config.cpp']"; + }; + + private _windSpd = vectorMagnitude wind; + private _windDir = (wind select 0) atan2 (wind select 1); + systemChat format ["Wind %1 @ %2", _windSpd, _windDir + 180]; + + false +}, {false}, [0x21, [false, false, false]], false] call CBA_fnc_addKeybind; // F Key +#endif diff --git a/addons/xm157/XEH_preInit.sqf b/addons/xm157/XEH_preInit.sqf new file mode 100644 index 0000000000..b47cf6628d --- /dev/null +++ b/addons/xm157/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/xm157/XEH_preStart.sqf b/addons/xm157/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/xm157/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/xm157/config.cpp b/addons/xm157/config.cpp new file mode 100644 index 0000000000..2689764b19 --- /dev/null +++ b/addons/xm157/config.cpp @@ -0,0 +1,27 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {"ace_xm157_prototype"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_advanced_ballistics", "ace_scopes"}; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgSounds.hpp" +#include "CfgWeapons.hpp" +#include "RscInGameUI.hpp" + +class asdg_OpticRail; +class asdg_OpticRail1913: asdg_OpticRail { + class compatibleItems { + ace_xm157_prototype = 1; + }; +}; diff --git a/addons/xm157/data/ace_vector_body_co.paa b/addons/xm157/data/ace_vector_body_co.paa new file mode 100644 index 0000000000..71e1984c6e Binary files /dev/null and b/addons/xm157/data/ace_vector_body_co.paa differ diff --git a/addons/xm157/data/mrad_10_ca.paa b/addons/xm157/data/mrad_10_ca.paa new file mode 100644 index 0000000000..293a29debe Binary files /dev/null and b/addons/xm157/data/mrad_10_ca.paa differ diff --git a/addons/xm157/data/mrad_20_ca.paa b/addons/xm157/data/mrad_20_ca.paa new file mode 100644 index 0000000000..99b724a861 Binary files /dev/null and b/addons/xm157/data/mrad_20_ca.paa differ diff --git a/addons/xm157/data/mrad_40_ca.paa b/addons/xm157/data/mrad_40_ca.paa new file mode 100644 index 0000000000..9e097adff1 Binary files /dev/null and b/addons/xm157/data/mrad_40_ca.paa differ diff --git a/addons/xm157/dev/generate_reticle.py b/addons/xm157/dev/generate_reticle.py new file mode 100644 index 0000000000..119b547ab4 --- /dev/null +++ b/addons/xm157/dev/generate_reticle.py @@ -0,0 +1,178 @@ +from PIL import Image, ImageDraw, ImageFont, ImageFilter +import math + +# based on vortex razor hd + +final_scale = 10 + +supersample = 4 +# supersampling helps make rounded circles, does slighly blur text and straight lines +pixels_per_mrad = supersample * final_scale +image_size = supersample * 4096 +image_center = image_size / 2 + +# create an image +out = Image.new("RGBA", (image_size, image_size), (255, 255, 255, 0)) +# get a drawing context +d = ImageDraw.Draw(out) + +line_thin = math.floor(0.07 * pixels_per_mrad) +line_thick = math.floor(0.15 * pixels_per_mrad) +font_size = math.floor(0.55 * pixels_per_mrad) +# source https://fonts.google.com/specimen/Electrolize (Open Font License) +fnt = ImageFont.truetype("Electrolize-Regular.ttf", font_size) + +# draw center dot +d.ellipse([ + (image_center - 0.1 * pixels_per_mrad, image_center - 0.1 * pixels_per_mrad), + (image_center + 0.1 * pixels_per_mrad, image_center + 0.1 * pixels_per_mrad) +], fill=(0, 0, 0)) + +# draw 3 main axis lines +d.line([ + (image_center - 8 * pixels_per_mrad, image_center), + (image_center - 0.5 * pixels_per_mrad, image_center) +], fill=(0, 0, 0), width=line_thin) +d.line([ + (0, image_center), + (image_center - 8.5 * pixels_per_mrad, image_center) +], fill=(0, 0, 0), width=line_thick) +d.line([ + (image_center + 0.5 * pixels_per_mrad, image_center), + (image_center + 8 * pixels_per_mrad, image_center) +], fill=(0, 0, 0), width=line_thin) +d.line([ + (image_center + 8.5 * pixels_per_mrad, image_center), + (image_size, image_center) +], fill=(0, 0, 0), width=line_thick) +d.line([ + (image_center, image_center + 0.5 * pixels_per_mrad), + (image_center, image_center + 11 * pixels_per_mrad) +], fill=(0, 0, 0), width=line_thin) +d.line([ + (image_center, image_center + 11.5 * pixels_per_mrad), + (image_center, image_size) +], fill=(0, 0, 0), width=line_thick) + +# draw big triangle bar things +if (image_center - 15 * pixels_per_mrad > 0): + d.polygon([ + (0, image_center + 2 * pixels_per_mrad), + (image_center - 20 * pixels_per_mrad, image_center + 2 * pixels_per_mrad), + (image_center - 15 * pixels_per_mrad, image_center), + (image_center - 20 * pixels_per_mrad, image_center - 2 * pixels_per_mrad), + (0, image_center - 2 * pixels_per_mrad), + ], fill=(0, 0, 0)) + d.polygon([ + (image_size, image_center + 2 * pixels_per_mrad), + (image_center + 20 * pixels_per_mrad, image_center + 2 * pixels_per_mrad), + (image_center + 15 * pixels_per_mrad, image_center), + (image_center + 20 * pixels_per_mrad, image_center - 2 * pixels_per_mrad), + (image_size, image_center - 2 * pixels_per_mrad), + ], fill=(0, 0, 0)) + d.polygon([ + (image_center - 2 * pixels_per_mrad, image_size), + (image_center - 2 * pixels_per_mrad, image_center + 20 * pixels_per_mrad), + (image_center, image_center + 15 * pixels_per_mrad), + (image_center + 2 * pixels_per_mrad, image_center + 20 * pixels_per_mrad), + (image_center + 2 * pixels_per_mrad, image_size), + ], fill=(0, 0, 0)) + + +# draw windage hash marks and text +for x in range(1, 9): + if (x % 2 == 0): + text = f"{abs(x)}" + # windage odd numbers + d.text((image_center + (x - 0.15) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), text, font=fnt, fill=(0, 0, 0)) + d.text((image_center - (x + 0.15) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), text, font=fnt, fill=(0, 0, 0)) + # windage mrad hashs + d.line([ + (image_center + x * pixels_per_mrad, image_center + line_thin / 2), + (image_center + x * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + d.line([ + (image_center - x * pixels_per_mrad, image_center + line_thin / 2), + (image_center - x * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + if (x % 2 == 0): + d.line([ + (image_center - x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center - x * pixels_per_mrad, image_center + 0.7 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + d.line([ + (image_center + x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center + x * pixels_per_mrad, image_center + 0.7 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + else: + d.line([ + (image_center - x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center - x * pixels_per_mrad, image_center + 0.55 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + d.line([ + (image_center + x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center + x * pixels_per_mrad, image_center + 0.55 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + + if (x < 8): + # windage half mrad marks + d.line([ + (image_center + (x + .5) * pixels_per_mrad, image_center), + (image_center + (x + .5) * pixels_per_mrad, image_center - 0.25 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + d.line([ + (image_center - (x + .5) * pixels_per_mrad, image_center), + (image_center - (x + .5) * pixels_per_mrad, image_center - 0.25 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + +# handle 10 mrad thick line +d.multiline_text((image_center + (10 - 0.4) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), "10", font=fnt, fill=(0, 0, 0)) +d.line([ + (image_center + 10 * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad), + (image_center + 10 * pixels_per_mrad, image_center + 0.5 * pixels_per_mrad) +], fill=(0, 0, 0), width=line_thick) +d.multiline_text((image_center + (-10 - 0.4) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), "10", font=fnt, fill=(0, 0, 0)) +d.line([ + (image_center - 10 * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad), + (image_center - 10 * pixels_per_mrad, image_center + 0.5 * pixels_per_mrad) +], fill=(0, 0, 0), width=line_thick) + +for y in range(1, 12): + line_y = image_center + y * pixels_per_mrad + # elev hash marks + d.line([ + (image_center - 0.5 * pixels_per_mrad, line_y), + (image_center + 0.5 * pixels_per_mrad, line_y) + ], fill=(0, 0, 0), width=line_thin) + if (y < 11): # half marks + d.line([ + (image_center - 0.1 * pixels_per_mrad, line_y + 0.5 * pixels_per_mrad), + (image_center + 0.1 * pixels_per_mrad, line_y + 0.5 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + + dot_count = 2 + if (y > 2): dot_count = 3 + if (y > 4): dot_count = 4 + if (y > 6): dot_count = 5 + for dot in range(1, dot_count + 1): + d.ellipse([ + (image_center + (dot - 0.1) * pixels_per_mrad, line_y - 0.1 * pixels_per_mrad), + (image_center + (dot + 0.1) * pixels_per_mrad, line_y + 0.1 * pixels_per_mrad) + ], fill=(0, 0, 0)) + d.ellipse([ + (image_center + (-dot - 0.1) * pixels_per_mrad, line_y - 0.1 * pixels_per_mrad), + (image_center + (-dot + 0.1) * pixels_per_mrad, line_y + 0.1 * pixels_per_mrad) + ], fill=(0, 0, 0)) + if (y % 2 == 0): + d.text((image_center + (dot_count + 0.85) * pixels_per_mrad, line_y - 0.3 * pixels_per_mrad), f"{y}", font=fnt, fill=(0, 0, 0)) + if (y >= 10): dot_count += 0.2 + d.text((image_center - (dot_count + 1.15) * pixels_per_mrad, line_y - 0.3 * pixels_per_mrad), f"{y}", font=fnt, fill=(0, 0, 0)) + +if (supersample > 1): + out = out.resize((4096, 4096)) + + +output_filename = f"mrad_{final_scale}_ca.png" +out.show() +out.save(output_filename) +print(f"written to {output_filename}") diff --git a/addons/xm157/functions/fnc_ballistics_calculator.sqf b/addons/xm157/functions/fnc_ballistics_calculator.sqf new file mode 100644 index 0000000000..a39b09a705 --- /dev/null +++ b/addons/xm157/functions/fnc_ballistics_calculator.sqf @@ -0,0 +1,101 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror, Ruthberg (Based on ace_atragmx_fnc_calculate_solution) + * Calculates elevation and windage + * + * Arguments: + * 0: Range + * 1: Direction of Fire (deg) - Yaw + * 2: Inlination (deg) - Pitch + * 3: Bank (deg) - Roll + * + * Return Value: + * Elevation and Windage in MRAD + * + * Example: + * [500, 90, 0, 0] call ace_xm157_fnc_ballistics_calculator + * + * Public: No + */ + +params ["_targetRange", "_directionOfFire", "_inclinationAngle", "_bank"]; + +private _weaponInfo = [] call FUNC(ballistics_getData); +if (_weaponInfo isEqualTo []) exitWith { [0,0] }; +_weaponInfo params ["_scopeBaseAngle","_boreHeight","_airFriction","_muzzleVelocity","_bc", + "_dragModel","_atmosphereModel","_barrelTwist","_twistDirection","_caliber","_bulletLength","_bulletMass"]; + +private _latitude = GVAR(data) getOrDefault ["latitude", 0]; + +// Get Wind +private _windSpeed = GVAR(data) getOrDefault ["wind_speed", 0]; +private _windDirection = 22.5 * (GVAR(data) getOrDefault ["wind_dir", 0]); +private _wind = [sin (_directionOfFire-_windDirection) * _windSpeed, -cos (_directionOfFire-_windDirection) * _windSpeed, 0]; + +// Get atmosphere +private _altitude = (getPosASL ace_player) select 2; +private _relativeHumidity = EGVAR(weather,currentHumidity); +private _temperature = _altitude call EFUNC(weather,calculateTemperatureAtHeight); +private _barometricPressure = _altitude call EFUNC(weather,calculateBarometricPressure); + + +private _bulletPos = [0,0,-(_boreHeight / 100)]; +private _lastBulletPos = +_bulletPos; +private _bulletVelocity = [0,Cos(_scopeBaseAngle) * _muzzleVelocity,Sin(_scopeBaseAngle) * _muzzleVelocity]; +private _gravity = [-sin (_bank) * cos(_scopeBaseAngle + _inclinationAngle) * -GRAVITY, + sin(_scopeBaseAngle + _inclinationAngle) * -GRAVITY, + cos (_bank) * cos(_scopeBaseAngle + _inclinationAngle) * -GRAVITY]; + +private _useAB = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; +if (_useAB) then { + _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); +}; + +private _deltaT = 1 / 60; +private _TOF = 0; // Limit TOF to 5 seconds! +while {(_TOF < 5) && {(_bulletPos # 1) < _targetRange}} do { + private _trueVelocity = _bulletVelocity vectorDiff _wind; + private _trueSpeed = vectorMagnitude _trueVelocity; + + private _bulletAccel = if (_useAB) then { + private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _trueSpeed, _temperature])); + (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); + } else { + _trueVelocity vectorMultiply (_trueSpeed * _airFriction); + }; + _bulletAccel = _bulletAccel vectorAdd _gravity; + _lastBulletPos = _bulletPos; + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + + _TOF = _TOF + _deltaT; +}; + +private _tx = (_lastBulletPos select 0) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); +private _tz = (_lastBulletPos select 2) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); +private _elevation = - atan(_tz / _targetRange); +private _windage = - atan(_tx / _targetRange); + + +if (_useAB && {(_bulletPos select 1) > 0}) then { + // Coriolis + private _horizontalDeflection = 0.0000729 * (_bulletPos select 1) * _TOF * sin(_latitude); + private _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); + _windage = _windage + _horizontalCoriolis; + // Eoetvoes + private _eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -GRAVITY) * cos(_latitude) * sin(_directionOfFire); + private _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; + private _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); + _elevation = _elevation + _verticalCoriolis; + // Spin drift + private _stabilityFactor = 1.5; + if (_caliber * _bulletLength * _bulletMass * _barrelTwist > 0) then { + _stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); + }; + private _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + private _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); + _windage = _windage + _spinDrift; +}; + +[17.453*_elevation, 17.453*_windage] // Convert to MRAD and return diff --git a/addons/xm157/functions/fnc_ballistics_getData.sqf b/addons/xm157/functions/fnc_ballistics_getData.sqf new file mode 100644 index 0000000000..928936c51e --- /dev/null +++ b/addons/xm157/functions/fnc_ballistics_getData.sqf @@ -0,0 +1,62 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror, Ruthberg (Based on ace_atragmx) + * Gets ballistic info for a weapon, mag and ammo + * + * Arguments: + * None + * + * Return Value: + * Weapon Info + * + * Example: + * [] call ace_xm157_fnc_ballistics_getData + * + * Public: No + */ + +private _unit = ace_player; +private _weaponClass = primaryWeapon _unit; +private _magazineClass = (primaryWeaponMagazine _unit) param [0, ""]; +private _ammoClass = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); + +private _key = format ["weaponInfoCache-%1-%2-%3",_weaponClass,_magazineClass,_ammoClass]; +private _weaponInfo = GVAR(data) getOrDefault [_key, []]; +if ((_weaponInfo isEqualTo []) && {_magazineClass != ""}) then { + TRACE_3("new weapon/mag",_weaponClass,_magazineClass,_ammoClass); + private _useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); + + private _zeroRange = 100; + private _boreHeight = [_unit, 0] call EFUNC(scopes,getBoreHeight); + + private _ammoConfig = _ammoClass call EFUNC(advanced_ballistics,readAmmoDataFromConfig); + _ammoConfig params ["_airFriction","_caliber","_bulletLength","_bulletMass","","_dragModel","_ballisticCoefficients","","_atmosphereModel","","_muzzleVelocityTable","_barrelLengthTable"]; + private _weaponConfig = _weaponClass call EFUNC(advanced_ballistics,readWeaponDataFromConfig); + _weaponConfig params ["_barrelTwist", "_twistDirection", "_barrelLength"]; + private _bc = if (_ballisticCoefficients isEqualTo []) then { 0 } else { _ballisticCoefficients # 0 }; + + // Get Muzzle Velocity + private _muzzleVelocity = if (_barrelLength > 0 && _useABConfig && {_bc != 0}) then { + [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift) + } else { + private _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "initSpeed"); + private _initSpeedCoef = getNumber (configFile >> "CfgWeapons" >> _weaponClass >> "initSpeed"); + if (_initSpeedCoef < 0) then { + _initSpeed = _initSpeed * -_initSpeedCoef; + }; + if (_initSpeedCoef > 0) then { + _initSpeed = _initSpeedCoef; + }; + _initSpeed + }; + + // Scope Base Angle + private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZero:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight]; + private _scopeBaseAngle = parseNumber _zeroAngle; + + _weaponInfo = [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,_bc,_dragModel,_atmosphereModel,_barrelTwist,_twistDirection,_caliber,_bulletLength,_bulletMass]; + GVAR(data) set [_key, _weaponInfo]; + TRACE_1("setting cache",_weaponInfo); +}; + +_weaponInfo diff --git a/addons/xm157/functions/fnc_keyPress.sqf b/addons/xm157/functions/fnc_keyPress.sqf new file mode 100644 index 0000000000..b55e6988aa --- /dev/null +++ b/addons/xm157/functions/fnc_keyPress.sqf @@ -0,0 +1,67 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Handles key presses + * + * Arguments: + * 0: Type + * 1: IsKeyDown + * + * Return Value: + * Handled + * + * Example: + * ["range", true] call ace_xm157_fnc_keyPress + * + * Public: No + */ + +params ["_func", "_keyDown"]; + +if (!GVAR(shown)) exitWith { false }; // fast exit if not shown +if (!([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith))) exitWith { false }; +if (!(ACE_player call CBA_fnc_canUseWeapon)) exitWith { false }; + +private _display = uinamespace getVariable [QGVAR(display), displayNull]; +if (isNull _display) exitWith { ERROR("keyPress-no display"); false }; + +if (_keyDown) then { playSound QGVAR(click); }; +GVAR(data) set ["lastInputTime", CBA_missionTime]; + +call { + if (_func == "range") exitWith { + if (_keyDown) then { + GVAR(data) set ["range_keyDownStart", CBA_missionTime]; + } else { + private _holdTime = CBA_missionTime - (GVAR(data) getOrDefault ["range_keyDownStart", 0]); + private _range = 0; + if (_holdTime < 0.5) then { + private _distance = round parseNumber ctrlText (_display displayCtrl 151); + if (_distance > 10 && {_distance < RANGEFINDER_MAX}) then { + _range = _distance; + } else { + _range = -1; // bad return + }; + }; + TRACE_1("Updating range",_range); + GVAR(data) set ["range", _range]; + }; + }; + if (!_keyDown) exitWith {}; + + GVAR(data) set ["menu_updated", true]; + private _index = GVAR(data) getOrDefault ["menu_index", 0]; + if (_func in ["left", "right"]) exitWith { + _index = (_index + ([-1, 1] select (_func == "right")) + count GVAR(menu)) % count GVAR(menu); + GVAR(data) set ["menu_index", _index]; + }; + (GVAR(menu) # _index) params ["", "_var", "_thing", ["_upAction", {}], ["_downAction", {}]]; + if (_func == "up") exitWith { + [_index, _var, _thing] call _upAction; + }; + if (_func == "down") exitWith { + [_index, _var, _thing] call _downAction; + }; +}; + +true diff --git a/addons/xm157/functions/fnc_weaponInfo_draw.sqf b/addons/xm157/functions/fnc_weaponInfo_draw.sqf new file mode 100644 index 0000000000..ef9fd1d528 --- /dev/null +++ b/addons/xm157/functions/fnc_weaponInfo_draw.sqf @@ -0,0 +1,144 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Draw3D event handler when scope is active + * + * Arguments: + * None (implicit vars from missionEventHandler) + * + * Return Value: + * None + * + * Example: + * [] call ace_xm157_fnc_weaponInfo_draw + * + * Public: No + */ + +//IGNORE_PRIVATE_WARNING ["_thisArgs", "_thisEventHandler"]; // from missionEventHandler +_thisArgs params ["_display"]; +if (isNull _display) exitWith { + TRACE_1("cleaning up display",_thisEventHandler); + GVAR(shown) = false; + removeMissionEventHandler ["Draw3D", _thisEventHandler]; +}; +private _ctrlScopeObject = _display displayCtrl IDC_SCOPE_OBJECT; +private _ctrlScreenObject = _display displayCtrl IDC_SCREEN_OBJECT; + + +// Hide everything when not in scope +private _isUsingOptic = ctrlShown (_display displayCtrl 154); +if (!_isUsingOptic) exitWith { + _ctrlScopeObject ctrlShow false; + _ctrlScreenObject ctrlShow false; +}; +_ctrlScopeObject ctrlShow true; +_ctrlScreenObject ctrlShow true; +BEGIN_COUNTER(draw); + +// Get common info +private _weaponVec = ace_player weaponDirection currentWeapon ace_player; +(_weaponVec call CBA_fnc_vect2Polar) params ["", "_weaponDir", "_weaponPitch"]; +private _weaponBank = call cba_optics_fnc_gunBank; +private _viewBank = _weaponBank; +if (isWeaponDeployed [player, true]) then { // prone deploy tilting is special (screen doesn't tilt, but player does) + _weaponBank = (((vectorUp ace_player) vectorCrossProduct _weaponVec) call CBA_fnc_vect2Polar) # 2; // I think this is right? +}; + +(0.25 call CBA_fnc_getFov) params ["_fov", "_zoom"]; +private _fovMRAD = 1000 * _fov; // Real MRAD (not mils) +private _nonMagnified = _zoom < 1.1; +private _range = GVAR(data) getOrDefault ["range", 0]; +private _needsUpdate = GVAR(data) getOrDefault ["menu_updated", true]; // Updated when a menu item changed +private _timeSinceLastInput = CBA_missionTime - (GVAR(data) getOrDefault ["lastInputTime", 0]); + + +// Bank-tilt display objects +_ctrlScopeObject ctrlSetModelDirAndUp [[0,1,0],[sin _viewBank,0,cos _viewBank]]; +_ctrlScreenObject ctrlSetModelDirAndUp [[0,1,0],[sin _viewBank,0,cos _viewBank]]; + + +// Scope - Handle etched reticle +private _retTex = QPATHTOF(data\mrad_10_ca.paa); +private _retScale = 4096/10; // texureResolution / (px/MRAD) +switch (true) do { + case (_fovMRAD < 4096/40): { + _retTex = QPATHTOF(data\mrad_40_ca.paa); + _retScale = 4096/40; + }; + case (_fovMRAD < 4096/20): { + _retTex = QPATHTOF(data\mrad_20_ca.paa); + _retScale = 4096/20; + }; +}; +private _scale = 1 / (getResolution # 5); +_scale = 2 * _scale * _retScale / _fovMRAD; +_ctrlScopeObject ctrlSetModelScale _scale; +private _ctrlScopeReticle = _display displayCtrl IDC_SCOPE_RETICLE; +if (_retTex != ctrlText _ctrlScopeReticle) then { _ctrlScopeReticle ctrlSetText _retTex; }; + + +// Screen - Draw menu +[_display, _needsUpdate] call FUNC(weaponInfo_drawMenu); + + +// Screen - Show range info +private _rangeInfo = _range call { + if (_range == 0) exitWith { "" }; + if (_range < 0) exitWith { // range error - blink if recent + if ((_timeSinceLastInput < 3) && {(floor (4*_timeSinceLastInput)) % 2 == 1}) then { "----" } else { "" }; + }; + format ["%1 m", _range toFixed 0] +}; +private _ctrl = _display displayCtrl IDC_SCREEN_TEXT_UPPER_RIGHT; +_ctrl ctrlSetText _rangeInfo; + + +// Screen - Show bearing info +private _bearingInfo = call { + private _bearingSetting = GVAR(data) getOrDefault ["bearing_show", 0]; + if ((_bearingSetting == 2) && {_timeSinceLastInput > 2}) exitWith { "" }; + if ((_bearingSetting == 1)) exitWith { format ["%1", floor (17.777777 * _weaponDir)]; }; // (6400 Mils, not MRAD) + format ["%1°", floor _weaponDir]; +}; +private _ctrl = _display displayCtrl IDC_SCREEN_TEXT_UPPER_LEFT; +_ctrl ctrlSetText _bearingInfo; + + +// Screen - update reticle type based on settings and zoom level +private _ctrl = _display displayCtrl IDC_SCREEN_RETICLE; +private _lastMagnified = GVAR(data) getOrDefault ["reticle_cache_lastMag", true]; +private _size = GVAR(data) getOrDefault ["reticle_cache_size", 1]; +if (_needsUpdate || {_nonMagnified isNotEqualTo _lastMagnified}) then { + private _tex = ""; + if (_nonMagnified) then { + switch (GVAR(data) getOrDefault ["reticle_cqb", 0]) do { + case (0): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 1; }; + case (1): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 2; }; + case (2): { _tex = "\a3\weapons_f\acc\data\collimdot_circle_red_ca.paa"; _size = 1; }; + case (3): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_green_ca.paa"; _size = 1; }; + case (4): { _size = 0; }; + }; + } else { + _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 1; + }; + _ctrl ctrlSetText _tex; + GVAR(data) set ["reticle_cache_lastMag", _nonMagnified]; + GVAR(data) set ["reticle_cache_size", _size]; +}; + + +// Screen - update reticle position based on ballistics computer +if (_range > 0 && {_size > 0}) then { + BEGIN_COUNTER(ballistics_calculator); + ([_range, _weaponDir, _weaponPitch, _weaponBank] call FUNC(ballistics_calculator)) params ["_elevMRAD", "_windMRAD"]; + END_COUNTER(ballistics_calculator); + _ctrl ctrlSetPosition [-_windMRAD / _fovMRAD + 0.5 - _size / 2, + 4/3 * (_elevMRAD / _fovMRAD + 0.5 - _size/2), _size, _size*4/3]; + _ctrl ctrlCommit 0; +} else { + _ctrl ctrlSetPosition [0.5 - _size / 2, + 4/3 * (0.5 - _size/2), _size, _size*4/3]; + _ctrl ctrlCommit 0; +}; + + +END_COUNTER(draw); diff --git a/addons/xm157/functions/fnc_weaponInfo_drawMenu.sqf b/addons/xm157/functions/fnc_weaponInfo_drawMenu.sqf new file mode 100644 index 0000000000..ca72adf807 --- /dev/null +++ b/addons/xm157/functions/fnc_weaponInfo_drawMenu.sqf @@ -0,0 +1,81 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Updates the menu display + * + * Arguments: + * 0: Display + * 1: Menu Item Needs Updating + * + * Return Value: + * None + * + * Example: + * [display, true] call ace_xm157_fnc_weaponInfo_drawMenu + * + * Public: No + */ + +params ["_display", "_needsUpdate"]; + +if (isNil QGVAR(menu)) then { + private _arrayUp = { + params ["", "_var", "_thing"]; + private _value = GVAR(data) getOrDefault [_var, 0]; + _value = (_value + 1 + count _thing) % count _thing; + GVAR(data) set [_var, _value]; + }; + private _arrayDown = { + params ["", "_var", "_thing"]; + private _value = GVAR(data) getOrDefault [_var, 0]; + _value = (_value - 1 + count _thing) % count _thing; + GVAR(data) set [_var, _value]; + }; + private _rangeUp = { + private _range = GVAR(data) getOrDefault ["range", -1]; + if (_range < 0) then { _range = 0; }; + _range = RANGEFINDER_MAX min (100 + 100 * floor (_range/100)); + GVAR(data) set ["range", _range]; + }; + private _rangeDown = { + private _range = GVAR(data) getOrDefault ["range", -1]; + if (_range < 0) then { _range = 0; }; + _range = 0 max (-100 + 100 * ceil (_range/100)); + GVAR(data) set ["range", _range]; + }; + private _atmosphereInfo = { + private _altitude = (getPosASL ace_player) select 2; + private _relativeHumidity = EGVAR(weather,currentHumidity); + private _temperature = _altitude call EFUNC(weather,calculateTemperatureAtHeight); + private _barometricPressure = _altitude call EFUNC(weather,calculateBarometricPressure); // hPA + format ["%1%2 %3%4 %5hPA", _temperature toFixed 1, "°C", _relativeHumidity toFixed 1, "%", _barometricPressure toFixed 0] + }; + GVAR(menu) = [ + ["", "", [""], _rangeUp, _rangeDown], + ["Wind Speed (m/s)", "wind_speed", ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"], _arrayUp, _arrayDown], + ["Wind Direction", "wind_dir", ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"], _arrayUp, _arrayDown], + // ["CQB Reticle", "reticle_cqb", ["2 MOA Red Dot", "4 MOA Red Dot", "Off"], _arrayUp, _arrayDown], + ["Bearing Display", "bearing_show", ["Degrees", "Mils", "Off"], _arrayUp, _arrayDown], + ["Atmosphere", "", _atmosphereInfo, {}, {}] + ]; +}; + + +private _index = GVAR(data) getOrDefault ["menu_index", 0]; +(GVAR(menu) # _index) params ["_title", "_var", "_thing"]; +if ((!_needsUpdate) && {_thing isEqualType []}) exitWith {}; + +private _ctrlMenuText = _display displayCtrl IDC_SCREEN_MENU_TEXT; +private _text = ""; +if (_index != 0) then { + if (_thing isEqualType []) then { + GVAR(data) set ["menu_updated", false]; + private _value = GVAR(data) getOrDefault [_var, 0]; + _text = _title + "\n" + "<" + (_thing param [_value, "#BadIndex"]) + ">"; + } else { + _text = _title + "\n" + ([_var] call _thing); + }; +}; +_ctrlMenuText ctrlSetText _text; + +GVAR(data) set ["menu_updated", false]; diff --git a/addons/xm157/functions/fnc_weaponInfo_onLoad.sqf b/addons/xm157/functions/fnc_weaponInfo_onLoad.sqf new file mode 100644 index 0000000000..dfefca30d4 --- /dev/null +++ b/addons/xm157/functions/fnc_weaponInfo_onLoad.sqf @@ -0,0 +1,83 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Creates UI + * + * Arguments: + * 0: Display + * + * Return Value: + * None + * + * Example: + * [display] call ace_xm157_fnc_weaponInfo_onLoad + * + * Public: No + */ + +params ["_display"]; +TRACE_1("weaponInfo_onLoad",_display); + +uinamespace setVariable [QGVAR(display), _display]; +[_display, true] call cba_optics_fnc_loadScriptedOptic; // pass thru to cba + + +// Setup the scope object +private _ctrlScopeObject = _display displayCtrl IDC_SCOPE_OBJECT; +private _scale = 1 / (getResolution # 5); // keep object the same size for any interface size +private _distance = 2.0 * 4/3; +if ((getResolution # 4) < (4/3)) then { _distance = _distance * (getResolution # 7); }; // eg 5x4 +private _base = ["3d", [0,0,_distance], _scale] call EFUNC(common,rscObjectHelper); +_ctrlScopeObject ctrlSetPosition _base; +_ctrlScopeObject ctrlSetModelScale _scale; +_ctrlScopeObject ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; +_ctrlScopeObject ctrlShow true; + +private _ctrlScopeGroup = _display displayCtrl IDC_SCOPE_GROUP; +// Add reticle +private _ctrlScopeReticle = _display ctrlCreate ["RscPicture", IDC_SCOPE_RETICLE, _ctrlScopeGroup]; +_ctrlScopeReticle ctrlSetPosition [0, 0, 1, 4/3]; +_ctrlScopeReticle ctrlCommit 0; + + +// Setup the screen object +private _ctrlScreenObject = _display displayCtrl IDC_SCREEN_OBJECT; +private _scale = 1 / (getResolution # 5); // keep object the same size for any interface size +private _distance = 4/3; +if ((getResolution # 4) < (4/3)) then { _distance = _distance * (getResolution # 7); }; // eg 5x4 +private _base = ["3d", [0,0,_distance], _scale] call EFUNC(common,rscObjectHelper); +_ctrlScreenObject ctrlSetPosition _base; +_ctrlScreenObject ctrlSetModelScale _scale; +_ctrlScreenObject ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; +_ctrlScreenObject ctrlShow true; + +private _ctrlScreenGroup = _display displayCtrl IDC_SCREEN_GROUP; +// Info display +private _ctrl = _display ctrlCreate [QGVAR(text), IDC_SCREEN_TEXT_UPPER_LEFT, _ctrlScreenGroup]; +_ctrl ctrlSetPosition [0.3, 0.2, 0.25, 0.25]; +_ctrl ctrlCommit 0; +private _ctrl = _display ctrlCreate [QGVAR(text), IDC_SCREEN_TEXT_UPPER_RIGHT, _ctrlScreenGroup]; +_ctrl ctrlSetPosition [0.7, 0.2, 0.25, 0.25]; +_ctrl ctrlCommit 0; +// Menu +private _ctrlMenuText = _display ctrlCreate [QGVAR(textMenu), IDC_SCREEN_MENU_TEXT, _ctrlScreenGroup]; +_ctrlMenuText ctrlSetPosition [0.1, 0.45, 0.8, 0.7]; +_ctrlMenuText ctrlCommit 0; + + +// Add screen reticle +private _ctrl = _display ctrlCreate ["RscPicture", IDC_SCREEN_RETICLE, _ctrlScreenGroup]; + + +// Add dummy idcs for dist/angle from engine +// 151=Dist, 156=Heading, 182=Pitch, +private _ctrl = _display ctrlCreate ["RscText", 151]; // IDC_IGUI_WEAPON_DISTANCE +_ctrl ctrlSetPosition [-1, -1, 0, 0]; +_ctrl ctrlCommit 0; +private _ctrl = _display displayCtrl 168; // hide ca_zeroing (from cba) +_ctrl ctrlShow false; + + +GVAR(shown) = true; +GVAR(data) set ["menu_updated", true]; +addMissionEventHandler ["Draw3D", LINKFUNC(weaponInfo_draw), [_display]]; diff --git a/addons/xm157/script_component.hpp b/addons/xm157/script_component.hpp new file mode 100644 index 0000000000..432fb05830 --- /dev/null +++ b/addons/xm157/script_component.hpp @@ -0,0 +1,24 @@ +#define COMPONENT xm157 +#define COMPONENT_BEAUTIFIED XM157 Fire Control Scope +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS +// #define ENABLE_QUICK_TESTING + +#include "\z\ace\addons\main\script_macros.hpp" + +#define RANGEFINDER_MAX 5000 + +#define IDC_SCOPE_OBJECT 7000 +#define IDC_SCOPE_GROUP 7001 +#define IDC_SCOPE_RETICLE 7201 + +#define IDC_SCREEN_OBJECT 8000 +#define IDC_SCREEN_GROUP 8001 +#define IDC_SCREEN_MENU_TEXT 8201 +#define IDC_SCREEN_TEXT_UPPER_LEFT 8202 +#define IDC_SCREEN_TEXT_UPPER_RIGHT 8203 +#define IDC_SCREEN_RETICLE 8204 + diff --git a/addons/xm157/sounds/click.wav b/addons/xm157/sounds/click.wav new file mode 100644 index 0000000000..efc08e62d1 Binary files /dev/null and b/addons/xm157/sounds/click.wav differ diff --git a/addons/xm157/stringtable.xml b/addons/xm157/stringtable.xml new file mode 100644 index 0000000000..761d11def9 --- /dev/null +++ b/addons/xm157/stringtable.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/addons/yardage450/CfgWeapons.hpp b/addons/yardage450/CfgWeapons.hpp index 382a6d09fc..9d9bcb4ecf 100644 --- a/addons/yardage450/CfgWeapons.hpp +++ b/addons/yardage450/CfgWeapons.hpp @@ -8,12 +8,12 @@ class CfgWeapons { model = QPATHTOF(data\ace_yardage_pro_450.p3d); modelOptics = QPATHTOF(data\bushnell_optic.p3d); picture = QPATHTOF(UI\w_bushnell_ca.paa); - opticsZoomMin = 0.33333/4; - opticsZoomMax = 0.33333/4; - opticsZoomInit = 0.33333/4; + opticsZoomMin = "0.33333/4"; + opticsZoomMax = "0.33333/4"; + opticsZoomInit = "0.33333/4"; distanceZoomMin = 400; distanceZoomMax = 400; - discretefov[] = {0.33333/4}; + discretefov[] = {"0.33333/4"}; discreteInitIndex = 0; visionMode[] = {"Normal"}; class WeaponSlotsInfo { diff --git a/addons/yardage450/functions/fnc_acquireTarget.sqf b/addons/yardage450/functions/fnc_acquireTarget.sqf index a6fb23f3f7..d5aea3a800 100644 --- a/addons/yardage450/functions/fnc_acquireTarget.sqf +++ b/addons/yardage450/functions/fnc_acquireTarget.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Fires the laser to acquire the target diff --git a/addons/yardage450/functions/fnc_turnOn.sqf b/addons/yardage450/functions/fnc_turnOn.sqf index 05ae3db398..e30798c523 100644 --- a/addons/yardage450/functions/fnc_turnOn.sqf +++ b/addons/yardage450/functions/fnc_turnOn.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Ruthberg * Shows the Yardage 450 screen elements diff --git a/addons/yardage450/functions/script_component.hpp b/addons/yardage450/functions/script_component.hpp deleted file mode 100644 index ed5cf1b7c7..0000000000 --- a/addons/yardage450/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\yardage450\script_component.hpp" \ No newline at end of file diff --git a/addons/yardage450/stringtable.xml b/addons/yardage450/stringtable.xml index 8e73904da7..cf955f8a74 100644 --- a/addons/yardage450/stringtable.xml +++ b/addons/yardage450/stringtable.xml @@ -13,7 +13,7 @@ Yardage 450 Yardage 450 ヤードエイジ 450 - Yardage 450 + 야드에이지 450 Yardage 450 Yardage 450 Yardage 450 @@ -31,7 +31,7 @@ Télémètre laser レーザー測距機 레이저 거리측정기 - 雷射测距仪 + 激光测距仪 雷射測距儀 Lazer Menzil Bulucu @@ -47,8 +47,8 @@ Yardage 450 - Bottone Accensione Yardage 450 - Bouton d'alimentation ヤードエイジ 450 - 起動ボタン - Yardage 450 - 전원 버튼 - Yardage 450 - 电源按钮 + 야드에이지 450 - 전원 버튼 + Yardage 450—电源按钮 Yardage 450 - 電源按鈕 Yardage 450 - Güç Tuşu diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 1d86d5fee3..737f2acc09 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -324,6 +324,13 @@ class CfgVehicles { class ModuleArsenal_F: Module_F { function=QFUNC(bi_moduleArsenal); }; + class GVAR(moduleBurn): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(Medical); + displayName = CSTRING(ModuleBurn_DisplayName); + function = QFUNC(moduleBurn); + icon = QPATHTOF(ui\Icon_Module_Zeus_Burn_ca.paa); + }; class Man; class CAManBase: Man { diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 2d218ddb8f..c92c98b211 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -13,6 +13,7 @@ PREP(moduleAddAceArsenal); PREP(moduleAddSpareTrack); PREP(moduleAddSpareWheel); PREP(moduleAddOrRemoveFRIES); +PREP(moduleBurn); PREP(moduleCaptive); PREP(moduleCargoParadrop); PREP(moduleConfigurePylons); diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 932d5e09c8..3856828230 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -32,7 +32,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_ai"}; author = ECSTRING(common,ACETeam); - authors[] = {"SilentSpike", "mharis001"}; + authors[] = {"kymckay", "mharis001"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -87,6 +87,11 @@ class CfgPatches { QGVAR(RemoveFullAceArsenal) }; }; + class GVAR(fire): ADDON { + units[] = { + QGVAR(moduleBurn) + }; + }; }; class ACE_Curator { @@ -98,6 +103,7 @@ class ACE_Curator { GVAR(fastroping) = "ace_fastroping"; GVAR(pylons) = "ace_pylons"; GVAR(arsenal) = "ace_arsenal"; + GVAR(fire) = "ace_fire"; }; #include "CfgFactionClasses.hpp" diff --git a/addons/zeus/functions/fnc_addObjectToCurator.sqf b/addons/zeus/functions/fnc_addObjectToCurator.sqf index 975da83f93..9651630ccc 100644 --- a/addons/zeus/functions/fnc_addObjectToCurator.sqf +++ b/addons/zeus/functions/fnc_addObjectToCurator.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Glowbal * Adds an object to curator upon spawn diff --git a/addons/zeus/functions/fnc_bi_moduleArsenal.sqf b/addons/zeus/functions/fnc_bi_moduleArsenal.sqf index 65c394a67e..f2be4a3838 100644 --- a/addons/zeus/functions/fnc_bi_moduleArsenal.sqf +++ b/addons/zeus/functions/fnc_bi_moduleArsenal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Bohemia Interactive * Module function to open a full arsenal on a unit diff --git a/addons/zeus/functions/fnc_bi_moduleCurator.sqf b/addons/zeus/functions/fnc_bi_moduleCurator.sqf index b74cc28781..47b67a8cf9 100644 --- a/addons/zeus/functions/fnc_bi_moduleCurator.sqf +++ b/addons/zeus/functions/fnc_bi_moduleCurator.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Bohemia Interactive * Module function for initalizing zeus diff --git a/addons/zeus/functions/fnc_bi_moduleMine.sqf b/addons/zeus/functions/fnc_bi_moduleMine.sqf index 94f4946c43..0bd8ba574f 100644 --- a/addons/zeus/functions/fnc_bi_moduleMine.sqf +++ b/addons/zeus/functions/fnc_bi_moduleMine.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Bohemia Interactive * Module function for spawning mines diff --git a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf index 05d66380ff..135ed538cd 100644 --- a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf +++ b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Bohemia Interactive * Module function for spawning projectiles diff --git a/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf b/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf index b35c8a508c..b2288be91c 100644 --- a/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf +++ b/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Bohemia Interactive * Module function for remote controlling units as zeus diff --git a/addons/zeus/functions/fnc_canCreateModule.sqf b/addons/zeus/functions/fnc_canCreateModule.sqf index 1981833625..b70e8afa50 100644 --- a/addons/zeus/functions/fnc_canCreateModule.sqf +++ b/addons/zeus/functions/fnc_canCreateModule.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Dystopian * Check whether local player is currently allowed to create a Zeus Module diff --git a/addons/zeus/functions/fnc_getModuleDestination.sqf b/addons/zeus/functions/fnc_getModuleDestination.sqf index 2066d5887e..bc939445dc 100644 --- a/addons/zeus/functions/fnc_getModuleDestination.sqf +++ b/addons/zeus/functions/fnc_getModuleDestination.sqf @@ -1,18 +1,17 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Allows zeus to click to indicate a 3d position. * * Arguments: * 0: The souce object - * 1: Code to run when position is ready - * - Code is passed - * 0: Successful - * 1: Object - * 2: Position ASL - * 3: State of Shift - * 4: State of Ctrl - * 5: State of Alt + * 1: Code to run when position is ready (will be passed the following array) + * - 0: Successful + * - 1: Object + * - 2: Position ASL + * - 3: State of Shift + * - 4: State of Ctrl + * - 5: State of Alt * 2: Text (default: "") * 3: Icon image file (default: "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa") * 4: Icon color (default: [1,0,0,1]) diff --git a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf index 05bf5fdfb3..935ce1e2e0 100644 --- a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf +++ b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Contextually removes addons (given in ACE_Curator) from zeus based on their required addon(s) * * ACE_Curator format: @@ -30,14 +30,14 @@ private _removeAddons = []; private _addon = _x; if (isArray _addon) then { { - if !(isClass (configFile >> "CfgPatches" >> _x)) exitWith { + if !([_x] call EFUNC(common,isModLoaded)) exitWith { _removeAddons pushBack (configName _addon); }; } forEach (getArray _addon); }; if (isText _addon) then { - if !(isClass (configFile >> "CfgPatches" >> getText _addon)) then { + if !([getText _addon] call EFUNC(common,isModLoaded)) then { _removeAddons pushBack (configName _addon); }; }; diff --git a/addons/zeus/functions/fnc_moduleAddAceArsenal.sqf b/addons/zeus/functions/fnc_moduleAddAceArsenal.sqf index 5bdb2803f9..8158e9090f 100644 --- a/addons/zeus/functions/fnc_moduleAddAceArsenal.sqf +++ b/addons/zeus/functions/fnc_moduleAddAceArsenal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Add a full ACE Arsenal to an object diff --git a/addons/zeus/functions/fnc_moduleAddArsenal.sqf b/addons/zeus/functions/fnc_moduleAddArsenal.sqf index d284b9bb08..6a3d811e66 100644 --- a/addons/zeus/functions/fnc_moduleAddArsenal.sqf +++ b/addons/zeus/functions/fnc_moduleAddArsenal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Add a full arsenal to an object diff --git a/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf b/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf index 532d340416..d3534cff25 100644 --- a/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf +++ b/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Add/Removes FRIES from a helicopter. diff --git a/addons/zeus/functions/fnc_moduleAddSpareTrack.sqf b/addons/zeus/functions/fnc_moduleAddSpareTrack.sqf index 580d691996..208e781319 100644 --- a/addons/zeus/functions/fnc_moduleAddSpareTrack.sqf +++ b/addons/zeus/functions/fnc_moduleAddSpareTrack.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds a Spare Track to the vehicle. diff --git a/addons/zeus/functions/fnc_moduleAddSpareWheel.sqf b/addons/zeus/functions/fnc_moduleAddSpareWheel.sqf index b08af3ed9d..1746b1045a 100644 --- a/addons/zeus/functions/fnc_moduleAddSpareWheel.sqf +++ b/addons/zeus/functions/fnc_moduleAddSpareWheel.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: Jonpas * Adds a Spare Wheel to the vehicle. diff --git a/addons/zeus/functions/fnc_moduleBurn.sqf b/addons/zeus/functions/fnc_moduleBurn.sqf new file mode 100644 index 0000000000..4cf2017b67 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleBurn.sqf @@ -0,0 +1,42 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut + * Inflames a unit. + * + * Arguments: + * 0: The module logic + * + * Return Value: + * None + * + * Example: + * [LOGIC] call ace_zeus_fnc_moduleBurn + * + * Public: No + */ + +params ["_logic"]; + +if !(local _logic) exitWith {}; + +private _unit = attachedTo _logic; +deleteVehicle _logic; + +switch (false) do { + case !(isNull _unit): { + [LSTRING(NothingSelected)] call FUNC(showMessage); + }; + case (_unit isKindOf "CAManBase"): { + [LSTRING(OnlyInfantry)] call FUNC(showMessage); + }; + case (alive _unit): { + [LSTRING(OnlyAlive)] call FUNC(showMessage); + }; + case (["ace_fire"] call EFUNC(common,isModLoaded)): { + [LSTRING(RequiresAddon)] call FUNC(showMessage); + }; + default { + [QEGVAR(fire,burn), [_unit, 5]] call CBA_fnc_globalEvent; + }; +}; + diff --git a/addons/zeus/functions/fnc_moduleCaptive.sqf b/addons/zeus/functions/fnc_moduleCaptive.sqf index 6420559a3f..ad359575e9 100644 --- a/addons/zeus/functions/fnc_moduleCaptive.sqf +++ b/addons/zeus/functions/fnc_moduleCaptive.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Flips the capture state of the unit the module is placed on. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleCargoParadrop.sqf b/addons/zeus/functions/fnc_moduleCargoParadrop.sqf index 948a54a7a9..69d90d310d 100644 --- a/addons/zeus/functions/fnc_moduleCargoParadrop.sqf +++ b/addons/zeus/functions/fnc_moduleCargoParadrop.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Commands the selected vehicle to paradrop all cargo at the specified location diff --git a/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf b/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf index 1b4e00960c..615a11d271 100644 --- a/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf +++ b/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Handles the paradrop cargo scripted waypoint (Scheduled Environment) diff --git a/addons/zeus/functions/fnc_moduleConfigurePylons.sqf b/addons/zeus/functions/fnc_moduleConfigurePylons.sqf index 6371183192..05cfcd0521 100644 --- a/addons/zeus/functions/fnc_moduleConfigurePylons.sqf +++ b/addons/zeus/functions/fnc_moduleConfigurePylons.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Opens the pylon configuration menu for the aircraft module is placed on. diff --git a/addons/zeus/functions/fnc_moduleGarrison.sqf b/addons/zeus/functions/fnc_moduleGarrison.sqf index ae0dd4292e..dcebd5f1fb 100644 --- a/addons/zeus/functions/fnc_moduleGarrison.sqf +++ b/addons/zeus/functions/fnc_moduleGarrison.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Module calling the garrison function. @@ -51,7 +51,7 @@ switch (false) do { private _units = units _unit; // Make sure all units are disembarked { - if (vehicle _x != _x) then { + if (vehicle _x != _x && {!isPlayer _x}) then { moveOut _x; }; } forEach _units; diff --git a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf index 4659fba2d5..3e359c6c69 100644 --- a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf +++ b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * PV event handler to update the AI skill on all machines when set by zeus module * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleGroupSide.sqf b/addons/zeus/functions/fnc_moduleGroupSide.sqf index 087838ed30..16f64aa665 100644 --- a/addons/zeus/functions/fnc_moduleGroupSide.sqf +++ b/addons/zeus/functions/fnc_moduleGroupSide.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, Brett + * Author: kymckay, Brett * Zeus module function to change side of a group on dialog confirmation * * Arguments: @@ -44,11 +44,19 @@ if (GETVAR(_unit,ACE_isUnconscious,false) && {GETMVAR(EGVAR(medical,moveUnitsFro _unit setVariable [QEGVAR(common,previousGroupSwitchTo), _previousGroupsList, true]; } else { + private _units = units _unit; + // Preserve assignedTeam for each unit - { + // Teams need to be gotten before removing units from group + private _teams = _units apply { private _team = assignedTeam _x; + [_team, "MAIN"] select (_team == "") + }; + + { [_x] joinSilent _newGroup; - _x assignTeam _team; - } forEach units _unit; + _x assignTeam (_teams select _forEachIndex); + } forEach _units; + deleteGroup _oldGroup; }; diff --git a/addons/zeus/functions/fnc_moduleHeal.sqf b/addons/zeus/functions/fnc_moduleHeal.sqf index 627c48ef36..9a49375003 100644 --- a/addons/zeus/functions/fnc_moduleHeal.sqf +++ b/addons/zeus/functions/fnc_moduleHeal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Full heal unit. diff --git a/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf b/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf index 9021e118f6..6ab7473f91 100644 --- a/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf +++ b/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Loads the object module is placed on into selected vehicle. diff --git a/addons/zeus/functions/fnc_moduleRemoveAceArsenal.sqf b/addons/zeus/functions/fnc_moduleRemoveAceArsenal.sqf index bc6ba69d87..d34e974868 100644 --- a/addons/zeus/functions/fnc_moduleRemoveAceArsenal.sqf +++ b/addons/zeus/functions/fnc_moduleRemoveAceArsenal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Remove ACE Arsenal from an object diff --git a/addons/zeus/functions/fnc_moduleRemoveArsenal.sqf b/addons/zeus/functions/fnc_moduleRemoveArsenal.sqf index ec203572e4..6c511bae07 100644 --- a/addons/zeus/functions/fnc_moduleRemoveArsenal.sqf +++ b/addons/zeus/functions/fnc_moduleRemoveArsenal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Remove arsenal from an object diff --git a/addons/zeus/functions/fnc_moduleSearchNearby.sqf b/addons/zeus/functions/fnc_moduleSearchNearby.sqf index 9515ab3fdc..46338b5e90 100644 --- a/addons/zeus/functions/fnc_moduleSearchNearby.sqf +++ b/addons/zeus/functions/fnc_moduleSearchNearby.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Commands the group the module is placed on to search the nearest building * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetEngineer.sqf b/addons/zeus/functions/fnc_moduleSetEngineer.sqf index 8280d75e65..372c56974b 100644 --- a/addons/zeus/functions/fnc_moduleSetEngineer.sqf +++ b/addons/zeus/functions/fnc_moduleSetEngineer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Zeus module function to set unit engineer skill. diff --git a/addons/zeus/functions/fnc_moduleSetMedic.sqf b/addons/zeus/functions/fnc_moduleSetMedic.sqf index 63b962d429..a05dc65d50 100644 --- a/addons/zeus/functions/fnc_moduleSetMedic.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedic.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, Glowbal + * Author: kymckay, Glowbal * Assigns a medic role from the medical module to a unit * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf b/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf index ec8106d9ff..8ff9b4a731 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, Glowbal + * Author: kymckay, Glowbal * Assigns a medic role from the medical module to a unit * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf index fa3ced078c..e3051f9824 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, Glowbal + * Author: kymckay, Glowbal * Assigns a medic role from the medical module to a unit * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetRepairFacility.sqf b/addons/zeus/functions/fnc_moduleSetRepairFacility.sqf index e8d5fa84a3..42c91acc5b 100644 --- a/addons/zeus/functions/fnc_moduleSetRepairFacility.sqf +++ b/addons/zeus/functions/fnc_moduleSetRepairFacility.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Assigns object as repair facility. diff --git a/addons/zeus/functions/fnc_moduleSetRepairVehicle.sqf b/addons/zeus/functions/fnc_moduleSetRepairVehicle.sqf index 79c89dfa88..b1b3427f33 100644 --- a/addons/zeus/functions/fnc_moduleSetRepairVehicle.sqf +++ b/addons/zeus/functions/fnc_moduleSetRepairVehicle.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Assigns object as repair vehicle. diff --git a/addons/zeus/functions/fnc_moduleSimulation.sqf b/addons/zeus/functions/fnc_moduleSimulation.sqf index 69d7abe36c..055088b6dd 100644 --- a/addons/zeus/functions/fnc_moduleSimulation.sqf +++ b/addons/zeus/functions/fnc_moduleSimulation.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Fisher, SilentSpike + * Author: Fisher, kymckay * Toggle Simulation on object. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf index 9e37b65389..8346eb4266 100644 --- a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf +++ b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Zeus module function to make unit a suicide bomber. diff --git a/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf b/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf index 3c5a67de75..2a013fa4c2 100644 --- a/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf +++ b/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux, PabstMirror * Commands the selected unit or group to start suppressive fire on the unit, group or location the module is placed on diff --git a/addons/zeus/functions/fnc_moduleSuppressiveFireLocal.sqf b/addons/zeus/functions/fnc_moduleSuppressiveFireLocal.sqf index 2512269865..f09211b034 100644 --- a/addons/zeus/functions/fnc_moduleSuppressiveFireLocal.sqf +++ b/addons/zeus/functions/fnc_moduleSuppressiveFireLocal.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: bux, PabstMirror * Commands the selected unit or group to start suppressive fire on the unit, group or location the module is placed on diff --git a/addons/zeus/functions/fnc_moduleSurrender.sqf b/addons/zeus/functions/fnc_moduleSurrender.sqf index 5fc0ae9e0c..07517d7e71 100644 --- a/addons/zeus/functions/fnc_moduleSurrender.sqf +++ b/addons/zeus/functions/fnc_moduleSurrender.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Flips the surrender state of the unit the module is placed on. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf b/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf index c120ee14f9..84df0d013a 100644 --- a/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf +++ b/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Zeus module function to teleport players on dialog confirmation * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf b/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf index 331c458a07..429f825abf 100644 --- a/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf +++ b/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe, mharis001 * Zeus module function to toggle flashlights. diff --git a/addons/zeus/functions/fnc_moduleToggleNvg.sqf b/addons/zeus/functions/fnc_moduleToggleNvg.sqf index 68fda8edb3..ca2b270a3d 100644 --- a/addons/zeus/functions/fnc_moduleToggleNvg.sqf +++ b/addons/zeus/functions/fnc_moduleToggleNvg.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe, mharis001 * Zeus module function to toggle NVGs. diff --git a/addons/zeus/functions/fnc_moduleUnGarrison.sqf b/addons/zeus/functions/fnc_moduleUnGarrison.sqf index 2d380d2cf2..8f69afdbbc 100644 --- a/addons/zeus/functions/fnc_moduleUnGarrison.sqf +++ b/addons/zeus/functions/fnc_moduleUnGarrison.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe * Un-garrison a garrisoned group. diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index 9bcec2cdcb..7eede3cdec 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Flips the unconscious state of the unit the module is placed on. * * Arguments: @@ -38,6 +38,11 @@ if (isNil QEFUNC(medical,setUnconscious)) then { [LSTRING(OnlyAlive)] call FUNC(showMessage); } else { private _unconscious = GETVAR(_unit,ACE_isUnconscious,false); + if (_unconscious) then { + _unit setVariable [QEGVAR(medical_statemachine,AIUnconsciousness), nil, true]; + } else { + _unit setVariable [QEGVAR(medical_statemachine,AIUnconsciousness), true, true]; + }; // Function handles locality for me [_unit, !_unconscious, 10e10] call EFUNC(medical,setUnconscious); }; diff --git a/addons/zeus/functions/fnc_moduleZeusSettings.sqf b/addons/zeus/functions/fnc_moduleZeusSettings.sqf index 6024126952..c1d3e4610e 100644 --- a/addons/zeus/functions/fnc_moduleZeusSettings.sqf +++ b/addons/zeus/functions/fnc_moduleZeusSettings.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Module for adjusting various aspects of zeus * * Arguments: diff --git a/addons/zeus/functions/fnc_showMessage.sqf b/addons/zeus/functions/fnc_showMessage.sqf index b38652eeba..8bbd7d510d 100644 --- a/addons/zeus/functions/fnc_showMessage.sqf +++ b/addons/zeus/functions/fnc_showMessage.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: 654wak654 * Shows a Zeus message through the BIS function, handles localization. diff --git a/addons/zeus/functions/fnc_ui_attributeCargo.sqf b/addons/zeus/functions/fnc_ui_attributeCargo.sqf index d2345e8a96..1b3626d5d9 100644 --- a/addons/zeus/functions/fnc_ui_attributeCargo.sqf +++ b/addons/zeus/functions/fnc_ui_attributeCargo.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror, mharis001 * Initializes the ace_cargo attribute of the zeus vehicle attributes display. diff --git a/addons/zeus/functions/fnc_ui_attributeRadius.sqf b/addons/zeus/functions/fnc_ui_attributeRadius.sqf index d8a0c46305..86f13eb71b 100644 --- a/addons/zeus/functions/fnc_ui_attributeRadius.sqf +++ b/addons/zeus/functions/fnc_ui_attributeRadius.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Radius" Zeus module attribute. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_defendArea.sqf b/addons/zeus/functions/fnc_ui_defendArea.sqf index aaa05adbbf..b8051ac1c1 100644 --- a/addons/zeus/functions/fnc_ui_defendArea.sqf +++ b/addons/zeus/functions/fnc_ui_defendArea.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Defend Area" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_editableObjects.sqf b/addons/zeus/functions/fnc_ui_editableObjects.sqf index b21b50ea26..8ecb86c2b4 100644 --- a/addons/zeus/functions/fnc_ui_editableObjects.sqf +++ b/addons/zeus/functions/fnc_ui_editableObjects.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: Fisher, SilentSpike, mharis001 + * Author: Fisher, kymckay, mharis001 * Initializes the "Editable Objects" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_garrison.sqf b/addons/zeus/functions/fnc_ui_garrison.sqf index a0843b5866..95e2948e5c 100644 --- a/addons/zeus/functions/fnc_ui_garrison.sqf +++ b/addons/zeus/functions/fnc_ui_garrison.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe, mharis001 * Initializes the "Garrison" Zeus module display. diff --git a/addons/zeus/functions/fnc_ui_globalSetSkill.sqf b/addons/zeus/functions/fnc_ui_globalSetSkill.sqf index 79e7ea077d..31f41d76c6 100644 --- a/addons/zeus/functions/fnc_ui_globalSetSkill.sqf +++ b/addons/zeus/functions/fnc_ui_globalSetSkill.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Initalises the `global skill` zeus module display diff --git a/addons/zeus/functions/fnc_ui_groupSide.sqf b/addons/zeus/functions/fnc_ui_groupSide.sqf index e74ab97c9e..4dff592f62 100644 --- a/addons/zeus/functions/fnc_ui_groupSide.sqf +++ b/addons/zeus/functions/fnc_ui_groupSide.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initalises the `group side` zeus module display * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_patrolArea.sqf b/addons/zeus/functions/fnc_ui_patrolArea.sqf index 93cae24aa5..03991ee5c7 100644 --- a/addons/zeus/functions/fnc_ui_patrolArea.sqf +++ b/addons/zeus/functions/fnc_ui_patrolArea.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Patrol Area" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_searchArea.sqf b/addons/zeus/functions/fnc_ui_searchArea.sqf index db2748e629..6268cd7d22 100644 --- a/addons/zeus/functions/fnc_ui_searchArea.sqf +++ b/addons/zeus/functions/fnc_ui_searchArea.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Search Area" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_setEngineer.sqf b/addons/zeus/functions/fnc_ui_setEngineer.sqf index 20e8113c7a..b2515c311d 100644 --- a/addons/zeus/functions/fnc_ui_setEngineer.sqf +++ b/addons/zeus/functions/fnc_ui_setEngineer.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Initalizes the "Set Engineer" Zeus module display. diff --git a/addons/zeus/functions/fnc_ui_suicideBomber.sqf b/addons/zeus/functions/fnc_ui_suicideBomber.sqf index 060618e536..2618451871 100644 --- a/addons/zeus/functions/fnc_ui_suicideBomber.sqf +++ b/addons/zeus/functions/fnc_ui_suicideBomber.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: mharis001 * Initializes the "Suicide Bomber" Zeus module display. diff --git a/addons/zeus/functions/fnc_ui_teleportPlayers.sqf b/addons/zeus/functions/fnc_ui_teleportPlayers.sqf index 0594554dc5..1becc04004 100644 --- a/addons/zeus/functions/fnc_ui_teleportPlayers.sqf +++ b/addons/zeus/functions/fnc_ui_teleportPlayers.sqf @@ -1,6 +1,6 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* - * Author: SilentSpike, mharis001 + * Author: kymckay, mharis001 * Initalizes the "Teleport Players" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf b/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf index 333da80ac3..9c34bc8f65 100644 --- a/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf +++ b/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe, mharis001 * Initializes the "Toggle Flashlights" Zeus module display. diff --git a/addons/zeus/functions/fnc_ui_toggleNvg.sqf b/addons/zeus/functions/fnc_ui_toggleNvg.sqf index e32ee9f715..1e60a777ea 100644 --- a/addons/zeus/functions/fnc_ui_toggleNvg.sqf +++ b/addons/zeus/functions/fnc_ui_toggleNvg.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: alganthe, mharis001 * Initializes the "Toggle NVGs" Zeus module display. diff --git a/addons/zeus/functions/fnc_zeusAttributes.sqf b/addons/zeus/functions/fnc_zeusAttributes.sqf index 4e2b3eb897..5c3fa8d08c 100644 --- a/addons/zeus/functions/fnc_zeusAttributes.sqf +++ b/addons/zeus/functions/fnc_zeusAttributes.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PabstMirror * Dummy function to include BIS script file. @@ -20,4 +20,4 @@ TRACE_1("params",_this); -#include "\a3\ui_f_curator\UI\Displays\RscDisplayAttributes.sqf" +#include "\a3\ui_f_curator\ui\displays\RscDisplayAttributes.sqf" diff --git a/addons/zeus/functions/script_component.hpp b/addons/zeus/functions/script_component.hpp deleted file mode 100644 index 35453cc4e8..0000000000 --- a/addons/zeus/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\zeus\script_component.hpp" \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 9d8d966239..4769f897ca 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -29,7 +29,7 @@ Настройки Зевса Impostazioni Zeus Zeus 設定 - Zeus 설정 + 제우스 설정 宙斯设定 宙斯設定 Zeus Ayarları @@ -46,7 +46,7 @@ Позволяет контролировать различные аспекты Зевса. Fornisce controllo su vari aspetti di Zeus. Zeus の操作性を様々な側面から強化します。 - Zeus에게 다양한 방면의 조작을 제공해줍니다 + 제우스에게 다양한 방면의 조작을 제공해줍니다 提供宙斯各个方面的控制权 提供宙斯各個方面的控制權 @@ -63,7 +63,7 @@ Messaggi di Ascesa 転生表示 재림 메세지 - 宙斯上任讯息 + 宙斯上任信息 宙斯上任訊息 @@ -78,8 +78,8 @@ Отображает глобальное всплывающее сообщение, когда один из игроков становится Зевсом. Mostra messaggi popup globali quando un giocatore viene assegnato come Zeus. プレイヤーが Zeus になる際、全体へポップアップ表示を行います。 - 플레이어가 Zeus 될 시 서버에 이를 알리는 팝업이 등장합니다. - 当一位玩家被指定为宙斯时显示全域讯息 + 플레이어가 제우스가 되면 서버에 알림 팝업이 등장합니다. + 当一位玩家被指定为宙斯时显示全局信息 當一位玩家被指定為宙斯時顯示全域訊息 @@ -94,7 +94,7 @@ Орел Зевса Aquila Zeus Zeus イーグル - Zeus 독수리 + 제우스 독수리 宙斯鹰眼模式 宙斯鷹眼模式 Zeus Kartalı @@ -111,7 +111,7 @@ Спавнит орла, который следует за камерой Зевса. Crea un'aquila che segue la camera Zeus. Zeus カメラを追うイーグルを出現します。 - Zeus의 카메라를 따라다니는 독수리를 생성합니다. + 제우스의 카메라를 따라다니는 독수리를 생성합니다. 生成一个老鹰跟着宙斯的摄影机 生成一個老鷹跟著宙斯的攝影機 @@ -144,7 +144,7 @@ Проигрывает звук ветра каждый раз, когда Зевс вселяется в юнита. Esegui rumori di vento quando Zeus controlla un'unità in remoto. ユニットが Zeus 遠隔操作になった際、風の音がします。 - Zeus가 유닛을 조작할 때 바람소리가 납니다. + 제우스가 유닛을 조작할 때 바람소리가 납니다. 当宙斯开始控制单位时利用风的声音提示 當宙斯開始控制單位時利用風的聲音提示 @@ -176,7 +176,7 @@ Проигрывает звук радио каждый раз, когда Зевс использует артиллерию. Riproduci un messaggio radio quando Zeus usa esplosivi. Zeus が砲撃を使う際に、無線で警告を流します。 - Zeus가 폭격시 경고 무전을 재생합니다. + 제우스가 폭격 시 경고 무전을 재생합니다. 当宙斯开始攻击时使用无线电警告 當宙斯開始攻擊時使用無線電警告 @@ -225,7 +225,7 @@ Rivela ad Alleati 友軍へ表示 모든 아군에게 표시 - 透露给盟军 + 透露给友军 透露給盟軍 @@ -241,7 +241,7 @@ Alleati + Marcatori Mappa 友軍と地図マーカー 아군 + 지도 마커 - 显示盟军+地图标记 + 显示友军+地图标记 顯示盟軍+地圖標記 @@ -285,7 +285,7 @@ 수정 가능한 물체 갱신 Màj les objets modifiables Aggiorna Oggetti Modificabili - 更新可编辑的物件 + 更新可编辑的物体 更新可編輯的物件 Обновить редактируемые объекты Atualizar objetos editáveis @@ -295,6 +295,7 @@ Editing Mode 編輯模式 + 编辑模式 Modalità per editare Bearbeitungsmodus 編集モード @@ -304,10 +305,12 @@ Režim úprav Mode d'édition Modo de edición + 편집 모드 Add or remove editable objects from Zeus 新增或移除可編輯物件給宙斯 + 添加或删除宙斯的可编辑物体 Aktiviere oder deaktiviere zu bearbeitende Objekte von Zeus Agguingi o rimuovi oggetti che Zeus può modificare Zeus から編集可能オブジェクトの追加と削除をする @@ -317,11 +320,13 @@ Přidej nebo odeber upravitelné objekty ze Zeusu Ajoute ou supprime les objets modifiables depuis Zeus. Añadir o eliminar objetos editables desde Zeus + 제우스가 편집 가능한 물체를 추가하거나 제거합니다 Add Objects Füge Objekte hinzu 新增物件 + 新增物体 Aggiungi Oggetti オブジェクト追加 Dodaj obiekty @@ -331,6 +336,7 @@ Ajouter des objets Obje Ekle Añadir objetos + 물체 추가 Remove Objects @@ -340,7 +346,7 @@ Usuń obiekty Enlever des objets Rimuovi Oggetti - 移除物件 + 移除物体 移除物件 Удалить объекты Remover Objetos @@ -356,7 +362,7 @@ Wszyscy kuratorzy Tous les curateurs Tutti i Moderatori - 所有编辑者 + 所有宙斯 所有編輯者 Все кураторы Todos os Curadores @@ -371,7 +377,7 @@ Zatwierdź zmiany dla wszystkich kuratorów Applique les changements à tous les curateurs. Applica i cambiamenti a tutti i moderatori - 确认变更给所有编辑者 + 确认变更给所有宙斯 確認變更給所有編輯者 Применить изменения ко всем кураторам Aplicar mudanças à todos os Curadores @@ -388,8 +394,10 @@ Objetos adicionais Další objekty 額外物件 + 额外物体 Objets supplémentaires Objetos adicionales + 추가 목표 Additional objects to include in the action regardless of Task Radius @@ -401,20 +409,22 @@ 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. Objetos adicionales para incluir en la acción al margen del Radio de Tarea + 목표 반경 상관없이 추가 목표를 추가합니다. Global AI Skill 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 技巧设定 AI技巧設定 Habilidade Global da IA Genel AI Yetenekleri @@ -446,7 +456,7 @@ Ändert: general, commanding, courage 변화: 전반적, 지휘, 사기 Cambia: generale, comando, - 改变: 战斗技巧,指挥技巧,勇气大小 + 改变:战斗技巧,指挥技巧,勇气大小 改變: 戰鬥技巧,指揮技巧,勇氣大小 Muda: general, commanding, courage Cambios: general, commanding, courage @@ -476,7 +486,7 @@ Ändert: aimingAccuracy 변화: 조준 명중률 Cambia: aimingAccuracy - 改变: 瞄准精确度 + 改变:瞄准精确度 改變: 瞄準精確度 Muda: aimingAccuracy Cambios: aimingAccuracy @@ -506,7 +516,7 @@ Ändert: aimingShake, aimingSpeed, reloadSpeed 변화: 조준시 흔들림, 조준 속도, 재장전 속도 Cambia: aimingShake, aimingSpeed, reloadSpeed - 改变: 手晃幅度,瞄准速度, 重新装填速度 + 改变:手晃幅度,瞄准速度, 重新装填速度 改變: 手晃幅度,瞄準速度, 重新裝填速度 Muda: aimingShake, aimingSpeed, reloadSpeed Cambios: aimingShake, aimingSpeed, reloadSpeed @@ -536,7 +546,7 @@ Ändert: spotDistance, spotTime 변화: 탐지 거리, 탐지까지의 시간 Cambia: spotDistance, spotTime - 改变: 搜索距离, 发现时间 + 改变:搜索距离,发现时间 改變: 搜索距離, 發現時間 Muda: spotDistance, spotTime Cambios: spotDistance, spotTime @@ -561,12 +571,12 @@ L'IA se met à couvert. Должны ли боты искать укрытия AI se bude snažit vyhledávat krytí - AI は遮蔽を取るようになります + AIは遮蔽を取るようになります Czy AI powinno szukać osłon Soll KI nach Deckung suchen 인공지능이 엄폐물을 찾아갑니다 Le AI dovrebbero cercare una copertura - 决定AI是否会寻找掩护 + 决定 AI 是否会寻找掩护 決定AI是否會尋找掩護 A IA dever buscar cobertura La IA debe buscar cobertura @@ -591,12 +601,12 @@ L'IA passe automatiquement en mode combat. Должны ли боты автоматически переходить в режим боя AI se automaticky přepne do bojového režimu - AI は自動的に戦闘状態へ切り替えます + AIは自動的に戦闘状態へ切り替えます Czy AI powinno automatycznie przechodzić w tryb walki Soll KI automatisch in Kampfmodus umschalten 인공지능이 자동적으로 교전 상태에 돌입합니다 Le AI dovrebbero passare in modalità di combattimento automaticamente - 决定AI是否会自动与敌人交战 + 决定 AI 是否会自动与敌人交战 決定AI是否會自動與敵人交戰 A IA deveria automaticamente mudar para modo de combate La IA debe automáticamente cambiar a modo de combate @@ -767,7 +777,7 @@ グループ内の全ユニットを移動させます Teleportuje wszystkie jednostki w grupie Teleportiert alle Einheiten der Gruppe - 그룹내에 모든 인원을 순간이동 시킵니다 + 그룹 내에 모든 인원을 순간이동 시킵니다 Teletrasporta tutte le unità del gruppo 传送全部小队成员 傳送全部小隊成員 @@ -877,7 +887,7 @@ Attivatore Simulazione 切换模拟 切換模擬 - Вкл/Выкл симуляцию + Переключить симуляцию Alternar Simulação Activar simulación Přepnout simulaci objektu @@ -927,8 +937,8 @@ Si può fare solo su persone vive Unidade deve estar viva ユニットを生存させます - 대상이 반드시 살아있어야 합니다 - 单位必须是活着 + 대상이 반드시 살아 있어야 합니다 + 单位必须是活的 單位必須是活著 Birliğin yaşaması gerekiyor @@ -959,7 +969,7 @@ Si può usare solo su strutture L'unité doit être une structure. ユニットを構造物とします - 대상이 반드시 건축물이어야만 합니다 + 대상이 반드시 건축물이어야 합니다 单位必须是建筑 單位必須是建築 @@ -974,7 +984,7 @@ Si può usare solo su veicoli L'unité doit être un véhicule. ユニットを車両とします - 대상이 반드시 차량이어야만 합니다 + 대상이 반드시 차량이어야 합니다 单位必须是载具 單位必須是載具 @@ -1004,7 +1014,7 @@ La unidad debe tener espacio de carga disponible L'unité doit avoir de l'espace de chargement disponible. ユニットへカーゴ スペースを与えます - 대상의 화물공간이 남아있어야합니다 + 대상의 화물공간이 남아 있어야 합니다 单位必须有剩余的载货空间 單位必須有剩餘的載貨空間 @@ -1032,7 +1042,7 @@ ユニットを適切な陣営にします Jednostka musi należeć do odpowiedniej strony Einheit muss einer passenden Seite angehören - 대상이 적절한 진영에 속해야만합니다 + 대상이 적절한 진영에 속해야 합니다 L'unità deve appartenere ad una fazione coerente 单位必须属于一个合适的一边 單位必須屬於一個合適的一邊 @@ -1047,7 +1057,7 @@ 近くに建物がありません。 Najbliższy budynek jest zbyt daleko Nächstgelegenes Gebäude ist zu weit entfernt - 가장가까운 건물이 너무 멈 + 가장 가까운 건물이 너무 멉니다 L'edificio più vicino è troppo lontano 最近的房子离太远了 最近的房子離太遠了 @@ -1097,9 +1107,11 @@ Nenhum Ninguno + Nikdo Aucun Hiçbiri + 없음 Players @@ -1111,23 +1123,27 @@ Jogadores Jugadores 玩家 + 玩家 Hráči Joueurs Oyuncular + 플레이어 Players and AI Spieler und KI's Giocati e AI Gracze i SI - プレイヤーと AI + プレイヤーとAI Игроки и ИИ Jogadores e IA Jugadores e IA 玩家與AI + 玩家与 AI Hráči a AI Joueurs et IA Oyuncular ve AI + 플레이어와 인공지능 Add Objects to Curator @@ -1141,7 +1157,7 @@ Fügt Objekte zum Kurator hinzu キュレーターにオブジェクトを追加 큐레이터에 물체 추가 - 增加物件给任务策划人 + 增加物体给任务宙斯 增加物件給任務策劃人 @@ -1156,7 +1172,7 @@ Fügt jedes gespawnte Objekt allen Kuratoren der Mission hinzu ミッション内で作成されたオブジェクトに全キュレーターを追加 미션 내 큐레이터에 모든 생성 물체 추가 - 在任务中生成物件给所有的任务策划人 + 在任务中生成物体给所有的任务宙斯 在任務中生成物件給所有的任務策劃人 @@ -1169,7 +1185,7 @@ Ladung: 화물: Cargo: - 货物: + 货物: 貨物: Carga: Kargo: @@ -1179,6 +1195,7 @@ Select cargo to unload Ladung zum ausladen auswählen 選擇要卸載的貨物 + 选择要卸载的货物 Scegli il carico da scaricare 選択したカーゴを降ろす Wybierz ładunek do wyładowania @@ -1188,6 +1205,7 @@ Sélectionner une cargaison à décharger Seçilen kargo boşaltıldı Seleccionar carga para descargar: + 내릴 화물을 선택하세요 Task Radius @@ -1255,7 +1273,7 @@ Ajouter un arsenal complet Aggiungi Arsenale Completo オブジェクトに完全なアーセナルを追加 - 增加完整的虚拟军火库到物件上 + 增加完整的虚拟军火库到物体上 增加完整的虛擬軍火庫到物件上 Dodaj Wirtualny Arsenał 아스날 놓기 @@ -1271,7 +1289,7 @@ Retirer un arsenal Rimuovi Arsenale オブジェクトからアーセナルを削除 - 移除物件上的虚拟军火库 + 移除物体上的虚拟军火库 移除物件上的虛擬軍火庫 Usuń Wirtualny Arsenał 아스날 제거 @@ -1303,10 +1321,10 @@ Attiva NVGs 暗視装置の切り替え 切換夜視鏡 - 切换夜视镜 + 切换夜视仪 야시경 토글 Przełącz NVG - Вкл/Выкл ПНВ + Переключить ПНВ Alternar Visão Noturna Přepnout noktovizory Alternar visión nocturna @@ -1318,7 +1336,7 @@ Attrezzatura NVG 暗視装置 夜視鏡裝備 - 夜视镜装备 + 夜视仪装备 야시경 장비 Ekwipunek NVG Приборы ночного видения @@ -1334,7 +1352,7 @@ Aggiunge o rimuove NVGs alle unità ユニットから暗視装置の追加と削除 增加或移除單位的夜視鏡 - 增加或移除单位的夜视镜 + 增加或移除单位的夜视仪 야시경 추가/제거 Dodaj lub usuń noktowizję z jednostek Добавить/Убрать ПНВ у юнитов @@ -1356,12 +1374,13 @@ 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 @@ -1370,6 +1389,7 @@ Jednotky ovlivněné přepnutím Unités affectées par le changement. Unidades afectadas por esta alternancia + 유닛은 토글에 영향받습니다 Selected Group @@ -1397,7 +1417,7 @@ 切换手电筒 손전등 토글 Przełącz latarki - Вкл/Выкл Фонари + Переключить фонари Alternar Lanternas Alternar linternas Přepnout svítilny @@ -1676,7 +1696,7 @@ Suicide Bomber 自殺式炸彈襲擊者 - 自杀式炸弹袭击者 + 自杀炸弹手 Samovražedný bombardér Kamikaze Selbstmordattentäter @@ -1700,7 +1720,7 @@ Aktiválási oldal Lato di attivazione 対象陣営 - 활성화면 + 활성화 진영 Strona aktywacji Explodir em: Сторона активации @@ -1727,7 +1747,7 @@ Explosion Size 爆炸尺寸 - 爆炸尺寸 + 爆炸大小 Velikost výbuchu Taille de l'explosion Explosionsgröße @@ -1744,7 +1764,7 @@ Auto Seek 自動尋求 - 自动寻求 + 自动寻的 Auto Seek Recherche automatique Automatische Suche @@ -1768,7 +1788,7 @@ 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. 対象陣営ユニットを見つけて移動しようと積極的に試みます。自動誘導の範囲は、ユニットの索敵能力に基づいており、最低100メートルです。 - 유닛은 액티브 측의 근접 유닛을 향해 적극적으로 찾아서 이동하려고 시도합니다. 자동 시크의 범위는 유닛의 스팟 거리 스킬을 기준으로 최소 100 미터입니다. + 유닛은 활성화 측의 근접 유닛을 향해 적극적으로 찾아서 이동하려고 시도합니다. 자동 탐색의 범위는 유닛의 색적 거리 스킬을 기준으로 최소 100미터입니다. Jednostka będzie aktywnie próbowała znaleźć i ruszyć w kierunku pobliskich jednostek strony aktywacji. Zasięg Auto Seek opiera się na umiejętności punktowej odległości jednostki z minimum 100 metrów. A unidade tentará ativamente encontrar e se mover para as unidades próximas do lado da ativação. O alcance da Auto Seek é baseado na habilidade de distância do ponto da unidade com um mínimo de 100 metros. Устройство будет активно пытаться найти и перейти к соседним единицам активации. Диапазон автоматического поиска основан на умении снимать расстояние на расстоянии не менее 100 метров. @@ -1784,7 +1804,7 @@ Az egység már öngyilkos bombázó L'unità è già un kamikaze 既に自爆ユニットです - 유닛은 이미 자살 폭탄 테러범이다. + 유닛은 이미 자살 폭탄 테러범입니다. Jednostka jest już zamachowcem-samobójcą A unidade já é um suicida Единица уже является террористом-смертником @@ -1795,7 +1815,7 @@ Add full ACE Arsenal Vollständiges ACE Arsenal hinzufügen ACE 武器庫を追加 - 添加ACE模式军火库 + 添加 ACE 军火库 增加完整的ACE軍火庫 Aggiungi l'arsenale ACE completo Dodaj pełny arsenał ACE @@ -1805,12 +1825,13 @@ Přidat plný ACE Arzenál Ajouter arsenal ACE complet ACE Arsenal ekle + 전체 ACE 아스널 추가 Remove ACE Arsenal ACE Arsenal entfernen ACE 武器庫を削除 - 删除ACE模式军火库 + 删除 ACE 军火库 移除ACE軍火庫 Rimuovi l'arsenale ACE Usuń arsenał ACE @@ -1820,6 +1841,7 @@ Odebrat plný ACE Arzenál Retirer un arsenal ACE ACE Arsenali sil + 전체 ACE 아스널 제거 Create Zeus @@ -1831,9 +1853,11 @@ Criar Zeus Crear Zeus 新增宙斯 + 创建宙斯 Vytvořit Zeuse Créer Zeus Zeus oluştur + 제우스 생성 Delete Zeus @@ -1845,9 +1869,11 @@ Apagar Zeus Eliminar Zeus 刪除宙斯 + 删除宙斯 Smazat Zeuse Supprimer Zeus Zeus sil + 제우스 제거 "%1" menu @@ -1858,10 +1884,12 @@ menu "%1" Menu "%1" 選單 %1 + 菜单"%1" "%1" menu Menu "%1" "%1" menü "%1" menu + "%1" 메뉴 Paradrop Cargo @@ -1871,11 +1899,13 @@ Десантировать груз Soltar carga de paraquedas 空投貨物 + 空投货物 Paradrop Cargo Výsadek nákladu Paralargage de cargaison Paraşüt Kargosu Carga mediante paracaidas + 화물 공수 No cargo loaded @@ -1886,10 +1916,22 @@ Nenhuma carga carregada No hay carga cargada 沒有貨物裝載 + 没有装载货物 Nessun carico caricato Žádný náklad není naložen Aucune cargaison chargée Kargo yüklenmedi + 화물이 실려있지 않습니다 + + + Burn Unit + Einheit anzünden + 焚烧单位 + 유닛 불로 태우기 + Podpal Jednostkę + ユニットを燃やす + Поджечь юнита + Quemar a unidad diff --git a/addons/zeus/ui/Icon_Module_Zeus_Burn_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_Burn_ca.paa new file mode 100644 index 0000000000..b76c33f1b5 Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_Burn_ca.paa differ diff --git a/addons/zeus/ui/RscAttributes.hpp b/addons/zeus/ui/RscAttributes.hpp index 1174267466..b72221d354 100644 --- a/addons/zeus/ui/RscAttributes.hpp +++ b/addons/zeus/ui/RscAttributes.hpp @@ -29,25 +29,25 @@ class GVAR(AttributeRadius): RscControlsGroupNoScrollbars { idc = 26466; x = 0; y = 0; - w = W_PART(26); - h = H_PART(1.1); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(1.1)); class controls { class Label: RscText { idc = -1; text = CSTRING(AttributeRadius); tooltip = CSTRING(AttributeRadius_Tooltip); x = 0; - y = H_PART(0.1); - w = W_PART(10); - h = H_PART(1); + y = QUOTE(H_PART(0.1)); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Radius: RscEdit { idc = 26467; - x = W_PART(10.1); - y = H_PART(0.1); - w = W_PART(15.9); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(0.1)); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); autocomplete = ""; }; }; @@ -85,8 +85,8 @@ class GVAR(RscEditableObjects): RscDisplayAttributes { idc = 19180; x = 0; y = 0; - w = W_PART(26); - h = H_PART(3.2); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(3.2)); class controls { class EditingModeLabel: RscText { idc = -1; @@ -94,16 +94,16 @@ class GVAR(RscEditableObjects): RscDisplayAttributes { tooltip = CSTRING(ModuleEditableObjects_EditingMode_Tooltip); x = 0; y = 0; - w = W_PART(10); - h = H_PART(1); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class EditingMode: ctrlToolbox { idc = 19181; - x = W_PART(10.1); + x = QUOTE(W_PART(10.1)); y = 0; - w = W_PART(15.9); - h = H_PART(1); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); rows = 1; columns = 2; strings[] = {CSTRING(ModuleEditableObjects_RemoveObjects), CSTRING(ModuleEditableObjects_AddObjects)}; @@ -111,21 +111,21 @@ class GVAR(RscEditableObjects): RscDisplayAttributes { class AllCuratorsLabel: EditingModeLabel { text = CSTRING(ModuleEditableObjects_AllCurators); tooltip = CSTRING(ModuleEditableObjects_AllCurators_Tooltip); - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class AllCurators: EditingMode { idc = 19182; - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); strings[] = {ECSTRING(common,No), ECSTRING(common,Yes)}; }; class AdditionalObjectsLabel: EditingModeLabel { text = CSTRING(ModuleEditableObjects_AdditionalObjects); tooltip = CSTRING(ModuleEditableObjects_AdditionalObjects_Tooltip); - y = H_PART(2.2); + y = QUOTE(H_PART(2.2)); }; class AdditionalObjects: EditingMode { idc = 19183; - y = H_PART(2.2); + y = QUOTE(H_PART(2.2)); columns = 3; strings[] = {CSTRING(None), CSTRING(Players), CSTRING(PlayersAndAI)}; }; @@ -151,8 +151,8 @@ class GVAR(RscGlobalSetSkill): RscDisplayAttributes { idc = 26422; x = 0; y = 0; - w = W_PART(26); - h = H_PART(6.5); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(6.5)); class controls { class Title1: RscText { idc = -1; @@ -160,69 +160,69 @@ class GVAR(RscGlobalSetSkill): RscDisplayAttributes { toolTip = CSTRING(ModuleGlobalSetSkill_general_desc); x = 0; y = 0; - w = W_PART(10); - h = H_PART(1); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0,0,0,0.5}; }; class General: RscXSliderH { idc = 16184; - x = W_PART(10.1); + x = QUOTE(W_PART(10.1)); y = 0; - w = W_PART(15.9); - h = H_PART(1); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); }; class Title2: Title1 { idc = -1; text = CSTRING(ModuleGlobalSetSkill_accuracy); toolTip = CSTRING(ModuleGlobalSetSkill_accuracy_desc); - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class Accuracy: General { idc = 16185; - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class Title3: Title1 { idc = -1; text = CSTRING(ModuleGlobalSetSkill_handling); toolTip = CSTRING(ModuleGlobalSetSkill_handling_desc); - y = H_PART(2.2); + y = QUOTE(H_PART(2.2)); }; class Handling: General { idc = 16186; - y = H_PART(2.2); + y = QUOTE(H_PART(2.2)); }; class Title4: Title1 { idc = -1; text = CSTRING(ModuleGlobalSetSkill_spotting); toolTip = CSTRING(ModuleGlobalSetSkill_spotting_desc); - y = H_PART(3.3); + y = QUOTE(H_PART(3.3)); }; class Spotting: General { idc = 16187; - y = H_PART(3.3); + y = QUOTE(H_PART(3.3)); }; class Title5: Title1 { idc = -1; text = CSTRING(ModuleGlobalSetSkill_cover); toolTip = CSTRING(ModuleGlobalSetSkill_cover_desc); - y = H_PART(4.4); + y = QUOTE(H_PART(4.4)); }; class Cover: RscCheckBox { idc = 16188; - x = W_PART(10.1); - y = H_PART(4.4); - w = W_PART(1); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(4.4)); + w = QUOTE(W_PART(1)); + h = QUOTE(H_PART(1)); }; class Title6: Title5 { idc = -1; text = CSTRING(ModuleGlobalSetSkill_combat); toolTip = CSTRING(ModuleGlobalSetSkill_combat_desc); - y = H_PART(5.5); + y = QUOTE(H_PART(5.5)); }; class Combat: Cover { idc = 16189; - y = H_PART(5.5); + y = QUOTE(H_PART(5.5)); }; }; }; @@ -246,60 +246,60 @@ class GVAR(RscGroupSide): RscDisplayAttributes { idc = 26422; x = 0; y = 0; - w = W_PART(26); - h = H_PART(2.5); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(2.5)); class controls { class Title: RscText { idc = 31002; text = "$STR_disp_arcunit_side"; x = 0; y = 0; - w = W_PART(10); - h = H_PART(2.5); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(2.5)); colorBackground[] = {0,0,0,0.5}; }; class Background: RscText { idc = 31000; - x = W_PART(10); + x = QUOTE(W_PART(10)); y = 0; - w = W_PART(16); - h = H_PART(2.5); + w = QUOTE(W_PART(16)); + h = QUOTE(H_PART(2.5)); colorBackground[] = {1,1,1,0.1}; }; class BLUFOR: RscActivePicture { idc = 31200; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_west_ca.paa"; - x = W_PART(12.5); - y = H_PART(0.25); - w = W_PART(2); - h = H_PART(2); + x = QUOTE(W_PART(12.5)); + y = QUOTE(H_PART(0.25)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(2)); tooltip = "$STR_WEST"; }; class OPFOR: BLUFOR { idc = 31201; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_east_ca.paa"; - x = W_PART(15.5); - y = H_PART(0.25); - w = W_PART(2); - h = H_PART(2); + x = QUOTE(W_PART(15.5)); + y = QUOTE(H_PART(0.25)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(2)); tooltip = "$STR_EAST"; }; class Independent: BLUFOR { idc = 31202; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_guer_ca.paa"; - x = W_PART(18.5); - y = H_PART(0.25); - w = W_PART(2); - h = H_PART(2); + x = QUOTE(W_PART(18.5)); + y = QUOTE(H_PART(0.25)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(2)); tooltip = "$STR_guerrila"; }; class Civilian: BLUFOR { idc = 31203; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_civ_ca.paa"; - x = W_PART(21.5); - y = H_PART(0.25); - w = W_PART(2); - h = H_PART(2); + x = QUOTE(W_PART(21.5)); + y = QUOTE(H_PART(0.25)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(2)); tooltip = "$STR_Civilian"; }; }; @@ -360,8 +360,8 @@ class GVAR(RscTeleportPlayers): RscDisplayAttributes { idc = 26422; x = 0; y = 0; - w = W_PART(26); - h = H_PART(8.1); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(8.1)); class controls { class Title: RscText { idc = -1; @@ -369,55 +369,55 @@ class GVAR(RscTeleportPlayers): RscDisplayAttributes { toolTip = CSTRING(ModuleTeleportPlayers_player_desc); x = 0; y = 0; - w = W_PART(26); - h = H_PART(1); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Unit: RscListbox { idc = 16189; x = 0; - y = H_PART(1.1); - w = W_PART(26); - h = H_PART(5.9); + y = QUOTE(H_PART(1.1)); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(5.9)); }; class SearchBackground: RscText { idc = -1; x = 0; - y = H_PART(7.1); - w = W_PART(1); - h = H_PART(1); + y = QUOTE(H_PART(7.1)); + w = QUOTE(W_PART(1)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class SearchPicture: RscPicture { idc = -1; text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa"; x = 0; - y = H_PART(7.1); - w = W_PART(1); - h = H_PART(1); + y = QUOTE(H_PART(7.1)); + w = QUOTE(W_PART(1)); + h = QUOTE(H_PART(1)); }; class Search: RscEdit { idc = 16190; - x = W_PART(1.2); - y = H_PART(7.1); - w = W_PART(14.5); - h = H_PART(1); + x = QUOTE(W_PART(1.2)); + y = QUOTE(H_PART(7.1)); + w = QUOTE(W_PART(14.5)); + h = QUOTE(H_PART(1)); autocomplete = ""; }; class LabelGroup: Title { idc = -1; text = CSTRING(ModuleTeleportPlayers_group); toolTip = CSTRING(ModuleTeleportPlayers_group_desc); - x = W_PART(15.9); - y = H_PART(7.1); - w = W_PART(9); + x = QUOTE(W_PART(15.9)); + y = QUOTE(H_PART(7.1)); + w = QUOTE(W_PART(9)); }; class UseGroup: RscCheckBox { idc = 16188; - x = W_PART(25); - y = H_PART(7.1); - w = W_PART(1); - h = H_PART(1); + x = QUOTE(W_PART(25)); + y = QUOTE(H_PART(7.1)); + w = QUOTE(W_PART(1)); + h = QUOTE(H_PART(1)); }; }; }; @@ -431,42 +431,42 @@ class GVAR(RscTeleportPlayers): RscDisplayAttributes { class GVAR(AttributeCargo): RscControlsGroupNoScrollbars { onSetFocus = QUOTE(_this call FUNC(ui_attributeCargo)); idc = -1; - x = X_PART(7); - y = Y_PART(10); - w = W_PART(26); - h = H_PART(3); + x = QUOTE(X_PART(7)); + y = QUOTE(Y_PART(10)); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(3)); class controls { class Title: RscText { idc = -1; text = CSTRING(AttributeCargo); x = 0; y = 0; - w = W_PART(10); - h = H_PART(2); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(2)); colorBackground[] = {0,0,0,0.5}; }; class Background: RscText { idc = -1; - x = W_PART(10); + x = QUOTE(W_PART(10)); y = 0; - w = W_PART(16); - h = H_PART(3); + w = QUOTE(W_PART(16)); + h = QUOTE(H_PART(3)); colorBackground[] = {1,1,1,0.1}; }; class Cargo: RscListBox { idc = 80086; - x = W_PART(10); + x = QUOTE(W_PART(10)); y = 0; - w = W_PART(16); - h = H_PART(3); + w = QUOTE(W_PART(16)); + h = QUOTE(H_PART(3)); }; class Unload: RscButton { idc = 80087; text = ECSTRING(cargo,unloadObject); x = 0; - y = H_PART(2); - w = W_PART(10); - h = H_PART(1); + y = QUOTE(H_PART(2)); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.7}; }; }; @@ -506,24 +506,24 @@ class GVAR(RscGarrison): RscDisplayAttributes { idc = 73060; x = 0; y = 0; - w = W_PART(26); - h = H_PART(6.2); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(6.2)); class controls { class TeleportLabel: RscText { idc = -1; text = CSTRING(ModuleGarrison_TeleportText); x = 0; y = 0; - w = W_PART(10); - h = H_PART(1); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Teleport: ctrlToolbox { idc = 73061; - x = W_PART(10.1); + x = QUOTE(W_PART(10.1)); y = 0; - w = W_PART(15.9); - h = H_PART(1); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); rows = 1; columns = 2; strings[] = {ECSTRING(common,No), ECSTRING(common,Yes)}; @@ -531,23 +531,23 @@ class GVAR(RscGarrison): RscDisplayAttributes { class TopDownLabel: TeleportLabel { text = CSTRING(ModuleGarrison_TopDownFillingText); tooltip = CSTRING(ModuleGarrison_TopDownFillingTooltip); - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class TopDown: Teleport { idc = 73062; - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class FillingModeLabel: TeleportLabel { text = CSTRING(ModuleGarrison_FillingModeText); - y = H_PART(2.2); - w = W_PART(26); + y = QUOTE(H_PART(2.2)); + w = QUOTE(W_PART(26)); }; class FillingMode: RscListbox { idc = 73063; x = 0; - y = H_PART(3.2); - w = W_PART(26); - h = H_PART(3); + y = QUOTE(H_PART(3.2)); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(3)); class Items { class Even { text = CSTRING(ModuleGarrison_FillingModeEven); @@ -583,8 +583,8 @@ class GVAR(RscToggleNvg): RscDisplayAttributes { idc = 92854; x = 0; y = 0; - w = W_PART(26); - h = H_PART(2.1); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(2.1)); class controls { class ToggleLabel: RscText { idc = -1; @@ -592,16 +592,16 @@ class GVAR(RscToggleNvg): RscDisplayAttributes { tooltip = CSTRING(ModuleToggleNVG_NvgEquipment_tooltip); x = 0; y = 0; - w = W_PART(10); - h = H_PART(1); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Toggle: ctrlToolbox { idc = 92855; - x = W_PART(10.1); + x = QUOTE(W_PART(10.1)); y = 0; - w = W_PART(15.9); - h = H_PART(1); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); rows = 1; columns = 2; strings[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled)}; @@ -609,14 +609,14 @@ class GVAR(RscToggleNvg): RscDisplayAttributes { class TargetLabel: ToggleLabel { text = CSTRING(ToggleTarget); tooltip = CSTRING(ToggleTarget_Tooltip); - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class Target: RscCombo { idc = 92856; - x = W_PART(10.1); - y = H_PART(1.1); - w = W_PART(15.9); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(1.1)); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.7}; class Items { class Group { @@ -664,48 +664,48 @@ class GVAR(RscToggleFlashlight): RscDisplayAttributes { idc = 56217; x = 0; y = 0; - w = W_PART(26); - h = H_PART(3.2); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(3.2)); class controls { class ToggleLabel: RscText { idc = -1; text = CSTRING(ModuleToggleFlashlight_Flashlights); x = 0; y = 0; - w = W_PART(10); - h = H_PART(1); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Toggle: ctrlToolbox { idc = 56218; - x = W_PART(10.1); + x = QUOTE(W_PART(10.1)); y = 0; - w = W_PART(15.9); - h = H_PART(1); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); rows = 1; columns = 2; strings[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled)}; }; class AddGearLabel: ToggleLabel { text = CSTRING(ModuleToggleFlashlight_AddGear); - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); }; class AddGear: Toggle { idc = 56219; - y = H_PART(1.1); + y = QUOTE(H_PART(1.1)); strings[] = {ECSTRING(common,No), ECSTRING(common,Yes)}; }; class TargetLabel: ToggleLabel { text = CSTRING(ToggleTarget); tooltip = CSTRING(ToggleTarget_Tooltip); - y = H_PART(2.2); + y = QUOTE(H_PART(2.2)); }; class Target: RscCombo { idc = 56220; - x = W_PART(10.1); - y = H_PART(2.2); - w = W_PART(15.9); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(2.2)); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.7}; class Items { class Group { @@ -753,25 +753,25 @@ class GVAR(RscSetEngineer): RscDisplayAttributes { idc = 86946; x = 0; y = 0; - w = W_PART(26); - h = H_PART(1.2); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(1.2)); class controls { class Label: RscText { idc = -1; text = CSTRING(ModuleSetEngineer_skill); toolTip = ECSTRING(repair,AssignEngineerRole_role_Description); x = 0; - y = H_PART(0.1); - w = W_PART(10); - h = H_PART(1); + y = QUOTE(H_PART(0.1)); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class Roles: ctrlToolbox { idc = 86947; - x = W_PART(10.1); - y = H_PART(0.1); - w = W_PART(15.9); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(0.1)); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); rows = 1; columns = 2; strings[] = {ECSTRING(repair,AssignEngineerRole_role_engineer), ECSTRING(repair,AssignEngineerRole_role_advanced)}; @@ -798,58 +798,58 @@ class GVAR(RscSuicideBomber): RscDisplayAttributes { idc = 83470; x = 0; y = 0; - w = W_PART(26); - h = H_PART(5.8); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(5.8)); class controls { class ActivationSide: RscControlsGroupNoScrollbars { idc = 83571; x = 0; y = 0; - w = W_PART(26); - h = H_PART(2.5); + w = QUOTE(W_PART(26)); + h = QUOTE(H_PART(2.5)); class controls { class Label: RscText { idc = -1; text = CSTRING(ModuleSuicideBomber_ActivationSide); x = 0; y = 0; - w = W_PART(10); - h = H_PART(2.5); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(2.5)); colorBackground[] = {0, 0, 0, 0.5}; }; class Background: RscText { idc = -1; - x = W_PART(10); + x = QUOTE(W_PART(10)); y = 0; - w = W_PART(16); - h = H_PART(2.5); + w = QUOTE(W_PART(16)); + h = QUOTE(H_PART(2.5)); colorBackground[] = {1, 1, 1, 0.1}; }; class BLUFOR: RscActivePicture { idc = 83581; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_west_ca.paa"; - x = W_PART(12.5); - y = H_PART(0.25); - w = W_PART(2); - h = H_PART(2); + x = QUOTE(W_PART(12.5)); + y = QUOTE(H_PART(0.25)); + w = QUOTE(W_PART(2)); + h = QUOTE(H_PART(2)); tooltip = "$STR_WEST"; }; class OPFOR: BLUFOR { idc = 83580; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_east_ca.paa"; - x = W_PART(15.5); + x = QUOTE(W_PART(15.5)); tooltip = "$STR_EAST"; }; class Independent: BLUFOR { idc = 83582; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_guer_ca.paa"; - x = W_PART(18.5); + x = QUOTE(W_PART(18.5)); tooltip = "$STR_guerrila"; }; class Civilian: BLUFOR { idc = 83583; text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_civ_ca.paa"; - x = W_PART(21.5); + x = QUOTE(W_PART(21.5)); tooltip = "$STR_Civilian"; }; }; @@ -858,24 +858,24 @@ class GVAR(RscSuicideBomber): RscDisplayAttributes { idc = -1; text = CSTRING(ModuleSuicideBomber_ActivationRadius); x = 0; - y = H_PART(2.6); - w = W_PART(10); - h = H_PART(1); + y = QUOTE(H_PART(2.6)); + w = QUOTE(W_PART(10)); + h = QUOTE(H_PART(1)); colorBackground[] = {0, 0, 0, 0.5}; }; class DistanceSlider: RscXSliderH { idc = 83572; - x = W_PART(10.1); - y = H_PART(2.6); - w = W_PART(13.9); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(2.6)); + w = QUOTE(W_PART(13.9)); + h = QUOTE(H_PART(1)); }; class DistanceEdit: RscEdit { idc = 83573; - x = W_PART(24.1); - y = H_PART(2.6); - w = W_PART(1.9); - h = H_PART(1); + x = QUOTE(W_PART(24.1)); + y = QUOTE(H_PART(2.6)); + w = QUOTE(W_PART(1.9)); + h = QUOTE(H_PART(1)); autocomplete = ""; maxChars = 3; canModify = 0; @@ -883,14 +883,14 @@ class GVAR(RscSuicideBomber): RscDisplayAttributes { class ExplosionLabel: DistanceLabel { idc = -1; text = CSTRING(ModuleSuicideBomber_ExplosionSize); - y = H_PART(3.7); + y = QUOTE(H_PART(3.7)); }; class Explosion: ctrlToolbox { idc = 83574; - x = W_PART(10.1); - y = H_PART(3.7); - w = W_PART(15.9); - h = H_PART(1); + x = QUOTE(W_PART(10.1)); + y = QUOTE(H_PART(3.7)); + w = QUOTE(W_PART(15.9)); + h = QUOTE(H_PART(1)); rows = 1; columns = 3; strings[] = {"$STR_small", "$STR_medium", "$STR_large"}; @@ -898,12 +898,12 @@ class GVAR(RscSuicideBomber): RscDisplayAttributes { class AutoSeekLabel: DistanceLabel { idc = -1; text = CSTRING(ModuleSuicideBomber_AutoSeek); - y = H_PART(4.8); + y = QUOTE(H_PART(4.8)); toolTip = CSTRING(ModuleSuicideBomber_AutoSeek_tooltip); }; class AutoSeek: Explosion { idc = 83575; - y = H_PART(4.8); + y = QUOTE(H_PART(4.8)); columns = 2; strings[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled)}; }; diff --git a/docs/.gitattributes b/docs/.gitattributes index de2616570b..b6b22eb5f6 100644 --- a/docs/.gitattributes +++ b/docs/.gitattributes @@ -1,5 +1,6 @@ * text=auto *.png binary *.jpg binary +*.webp binary *.paa binary *.sh eol=lf diff --git a/docs/.gitignore b/docs/.gitignore index 7836aaf3f3..c2ef6dec77 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -20,3 +20,8 @@ CNAME tools/temp Gemfile.lock + +# Generated +_includes/dependencies_list.md +wiki/functions/*.md +!wiki/functions/index.md diff --git a/docs/404.html b/docs/404.md similarity index 100% rename from docs/404.html rename to docs/404.md diff --git a/docs/CNAME b/docs/CNAME index 21637da470..bb4ad3ca6d 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -ace3mod.com \ No newline at end of file +ace3.acemod.org \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index ee47a3cdd9..599940594c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# Source of https://ace3mod.com/ +# Source of https://ace3.acemod.org/ ## Updating compiled JavaScript and CSS files diff --git a/docs/README.zh-TW.md b/docs/README.zh-TW.md index 933c2b50cb..4216d82dd7 100644 --- a/docs/README.zh-TW.md +++ b/docs/README.zh-TW.md @@ -18,8 +18,8 @@ ACE3 條款 - - 加入ACE3 Slack + + 加入ACE3 Discord ACE3 建構狀態 @@ -77,8 +77,8 @@ ## 新手起步 ACE3需要最新版本的武裝行動3以及最新版本的 CBA A3模組。以下的網頁可用於幫助以及提供安裝ACE3上的資訊。 -- [安裝指南-英文](https://ace3mod.com/wiki/user/installation-guide.html) -- [資訊中心-英文](https://ace3mod.com/wiki/user/information-center.html) +- [安裝指南-英文](https://ace3.acemod.org/wiki/user/installation-guide.html) +- [資訊中心-英文](https://ace3.acemod.org/wiki/user/information-center.html) ## 維護 @@ -91,21 +91,21 @@ ACE3需要最新版本的武裝行動3以及最新版本的 Slack -
+ + diff --git a/docs/README_DE.md b/docs/README_DE.md index 701939741a..fd7eaeef3f 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -3,7 +3,7 @@

- + ACE3 Version @@ -15,8 +15,8 @@ ACE3 Lizenz - - ACE3 Slack + + ACE3 Discord ACE3 Build Status @@ -70,14 +70,14 @@ Die Mod ist **modular aufgebaut**. Beinahe jede PBO kann entfernt werden, sodass #### Anleitungen Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? -- [Erste Schritte](https://ace3mod.com/wiki/user/getting-started.html). +- [Erste Schritte](https://ace3.acemod.org/wiki/user/getting-started.html). #### Mitwirken Wenn du bei der Entwicklung von ACE3 mithelfen möchtest, kannst du dies tun, indem du nach Fehlern Ausschau hältst oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" dieses Repository und erstelle deine "Pull-Requests", welche von anderen Entwicklern und Beiträgern überprüft werden. Bitte trage dich dabei in [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) mit deinem Nutzernamen und einer gültigen Email-Adresse ein. Um uns einen Fehler, Anregungen oder neue Funktionalitäten mitzuteilen: Nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). Besuche auch: -- [Wie kann ich ein Problem melden](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [Wie kann ich ein Wunsch zu einer neuen Funktion mitteilen?](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Wie kann ich ein Problem melden](https://ace3.acemod.org/wiki/user/how-to-report-an-issue.html) +- [Wie kann ich ein Wunsch zu einer neuen Funktion mitteilen?](https://ace3.acemod.org/wiki/user/how-to-make-a-feature-request.html) #### Testen & Mod erstellen Wenn du die neusten Entwicklungen erleben und uns dabei helfen möchtest bestehende Fehler zu entdecken, lade dir die "Master Branch" herunter. Entweder nutzt du [Git](https://help.github.com/articles/fetching-a-remote/) - wenn die Schritte bekannt sind - oder du lädst es dir direkt über [diesen Link](https://github.com/acemod/ACE3/archive/master.zip) herunter. diff --git a/docs/README_PL.md b/docs/README_PL.md index b99b96ca95..893261dc54 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -2,7 +2,7 @@

- + ACE3 Wersja @@ -14,8 +14,8 @@ ACE3 Licencja - - ACE3 Slack + + ACE3 Discord ACE3 Build Status @@ -65,15 +65,15 @@ Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczo ### Poradniki i instrukcje Jeżeli zainstalowałeś ACE3 lecz masz problem ze zrozumieniem jak to wszystko działa, lub gdzie zacząć, zacznij od przeczytania tego: -- [Wprowadzenie](https://ace3mod.com/wiki/user/getting-started.html) +- [Wprowadzenie](https://ace3.acemod.org/wiki/user/getting-started.html) #### Współpraca Możesz pomóc w rozwoju addonu szukając potencjalnych bugów w naszym kodzie, lub zgłaszając nowe funkcje. Aby wnieść swój wkład do ACE3, po prostu zforkuj to repozytorium na swoje konto GitHub i zgłoś swoje pull requesty do przeglądu przez innych współpracowników. Pamiętaj, aby dodać siebie do listy autorów każdego PBO jakie edytujesz oraz do pliku ['AUTHORS.txt'](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) dodając także swój adres e-mail. Używaj naszego [Issue Tracker-a](https://github.com/acemod/ACE3/issues) aby zgłaszać bugi, proponować nowe funkcje lub sugerować zmiany do aktualnie istniejących. Zobacz także: -- [Jak zgłosić bug-a](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [Jak zgłosić feature request-a](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Jak zgłosić bug-a](https://ace3.acemod.org/wiki/user/how-to-report-an-issue.html) +- [Jak zgłosić feature request-a](https://ace3.acemod.org/wiki/user/how-to-make-a-feature-request.html) #### Testowanie i budowanie Aby pomóc nam w testowaniu najnowszych zmian rozwojowych, pobierz nasz master branch ([bezpośrednio](https://github.com/acemod/ACE3/archive/master.zip), lub [korzystając z git](https://help.github.com/articles/fetching-a-remote/)), a następnie złóż testowego build-a: -- [Konfiguracja środowiska do testów](https://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. +- [Konfiguracja środowiska do testów](https://ace3.acemod.org/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. diff --git a/docs/_config.yml b/docs/_config.yml index 2072a7255a..1ac4f3a7a5 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,24 +1,16 @@ -name: ACE3 +title: ACE3 description: ACE3 is a joint effort by the teams behind ACE 2, AGM and CSE to improve the realism and authenticity of Arma 3. keywords: Advanced Combat Enhancement 3, ACE, ACE3, Arma, Arma 3, Mod, Modification, Realism, AGM, CSE, Bohemia, Interactive -productionUrl: https://ace3mod.com +productionUrl: https://ace3.acemod.org ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 13 - patch: 6 - build: 60 - -acex: - githubUrl: https://github.com/acemod/ACEX - version: - major: 3 - minor: 5 - patch: 4 - build: 23 + minor: 15 + patch: 2 + build: 69 markdown: kramdown @@ -34,7 +26,7 @@ highlighter: rouge safe: true lsi: false -exclude: [src, .editorconfig, .gitignore, CNAME, Gemfile, Gemfile.lock, README.md] +exclude: [src, .editorconfig, .gitignore, CNAME, Gemfile, Gemfile.lock, README*.md, Dockerfile, docker-compose.yml, entrypoint.sh, package-lock.json, acebot.json] plugins: - jekyll-redirect-from diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index 4eefeb933b..4a05c7f94e 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -1,4 +1,4 @@ -name: ACE3 +title: ACE3 description: ACE3 is a joint effort by the teams behind ACE 2, AGM and CSE to improve the realism and authenticity of Arma 3. keywords: Advanced Combat Enhancement 3, ACE, ACE3, Arma, Arma 3, Mod, Modification, Realism, AGM, CSE, Bohemia, Interactive @@ -12,14 +12,6 @@ ace: patch: 2 build: 49 -acex: - githubUrl: https://github.com/acemod/ACEX - version: - major: 3 - minor: 5 - patch: 2 - build: 19 - markdown: kramdown kramdown: @@ -34,7 +26,7 @@ highlighter: rouge safe: true lsi: false -exclude: [src, .editorconfig, .gitignore, CNAME, Gemfile, Gemfile.lock, README.md] +exclude: [src, .editorconfig, .gitignore, CNAME, Gemfile, Gemfile.lock, README*.md, Dockerfile, docker-compose.yml, entrypoint.sh, package-lock.json, acebot.json] plugins: - jekyll-redirect-from diff --git a/docs/_includes/_footer.html b/docs/_includes/_footer.html index 8763b6c35a..2797f35cd9 100644 --- a/docs/_includes/_footer.html +++ b/docs/_includes/_footer.html @@ -3,41 +3,31 @@

ACE3

ACE3 is a joint effort by the teams behind ACE2, AGM and CSE to improve the realism and authenticity of Arma 3.

-

If you want to contribute something to ACE3, simply fork the GitHub repository and submit your pull requests for review.

+

If you want to contribute something to ACE3, simply fork the GitHub repository and submit your pull requests for review.

Issues / Feedback

-

Issues, feature requests and feedback are welcome at the ACE3 GitHub issue tracker.

+

Issues, feature requests and feedback are welcome at the ACE3 GitHub issue tracker.

Before reporting an issue, please read the wiki entry "How to report an issue".

-

We have created a single issue for feature requests.

+

We have created a single issue for feature requests.

Social Media

-
- - diff --git a/docs/_includes/_header.html b/docs/_includes/_header.html index 84bcab8d2e..3fd9147794 100644 --- a/docs/_includes/_header.html +++ b/docs/_includes/_header.html @@ -8,7 +8,6 @@ - @@ -17,15 +16,17 @@ - + - + - + + + diff --git a/docs/_includes/_navigation.html b/docs/_includes/_navigation.html index f0e2703ffd..82b0508518 100644 --- a/docs/_includes/_navigation.html +++ b/docs/_includes/_navigation.html @@ -1,7 +1,7 @@
SlackWe have a public Slack team that anyone can join. This is where all our developers and contributors hang out and where we make announcementsDiscordWe have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements
我們有著公共的Slack團隊供大家加入,而該模組所有開發者以及維護者也會在此出現並公告Discord我們有著公共的Discord團隊供大家加入,而該模組所有開發者以及維護者也會在此出現並公告
","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return this;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("